F117_FIFW

Scrittura nel buffer FIFO

F/P117 scrive il dato specificato da s nel buffer FIFO specificato da d1.

Parametri

Ingresso

s (WORD, INT, UINT)

area a 16 bit o costante equivalente per memorizzare i dati da scrivere nel buffer FIFO

Uscita

d1_Start (WORD, INT, UINT)

area a 16 bit iniziale del buffer FIFO

Note

  • Anziché utilizzare questa istruzione F, si consiglia di utilizzare l'istruzione FP7 corrispondente: FP_FIFO_WRITE, FP_LIFO_WRITE

  • Il dato specificato viene scritto nell'indirizzo indicato dal puntatore di scrittura quando l'istruzione viene eseguita.

    1.  (1) Capacità memoria del buffer FIFO (n)
    2.  (2) Numero di elementi di dati (word) memorizzati, scritti e non letti
    3.  (3) Puntatore di lettura nel byte superiore
    4.  (4) Puntatore di lettura
    5.  (5) Area di memorizzazione dei dati (n word)
  • (0), (n–2) e (n–1) sono indirizzi allocati all'area di memorizzazione dei dati.

  • n è il valore specificato dall'istruzione F115_FIFT.

  • Il puntatore di scrittura è memorizzato negli otto bit inferiori della terza word dell'area del buffer FIFO ed è indicato da una posizione relativa nell'area di memorizzazione dei dati. L'indirizzo attuale in cui viene scritto il dato è specificato da d1 più l'offset 3 più il valore del puntatore di scrittura (il valore di cui solo il byte meno significativo è un valore decimale).

  • Quando viene eseguita la scrittura, viene sommato 1 al numero di elementi di dati memorizzati, mentre il puntatore di scrittura viene incrementato di 1 o resettato a zero nel caso in cui il puntatore indicasse l'elemento finale.

  • Le variabili s e d1_Start devono presentare lo stesso tipo di dato.

Nota
  • Se l'istruzione viene eseguita quando il buffer FIFO è pieno (il numero di elementi di dati memorizzati è = alla dimensione n del buffer FIFO definita dall'istruzione FIFT), si verifica un errore. La scrittura non è consentita.

  • Se l'istruzione viene eseguita quando il puntatore di scrittura indica l'indirizzo finale del buffer FIFO (il valore "n" definito dall'istruzione FIFT), il puntatore di scrittura verrà impostato su 0.

Flag di errore

sys_bIsOperationErrorHold (passa a TRUE e resta TRUE)
  • se la dimensione (n) del buffer FIFO specificato da d1_Start è n = 0, oppure quando n > 256.

  • se il numero di elementi di dati memorizzati del buffer FIFO = 0.

  • se il numero di elementi di dati memorizzati del buffer FIFO > dimensione del buffer FIFO (n).

  • se l'indirizzo finale del buffer FIFO in base alla dimensione del buffer FIFO (n) eccede l'area.

  • se il puntatore di scrittura del buffer FIFO > dimensione del buffer FIFO (n).

  • se il puntatore di scrittura del buffer FIFO è 256 (16#100) o superiore dopo la scrittura dei dati.

sys_bIsOperationErrorNonHold (passa a TRUE per una scansione)
  • se la dimensione (n) del buffer FIFO specificato da d1_Start è n = 0, oppure quando n > 256.

  • se il numero di elementi di dati memorizzati del buffer FIFO = 0.

  • se il numero di elementi di dati memorizzati del buffer FIFO > dimensione del buffer FIFO (n).

  • se l'indirizzo finale del buffer FIFO in base alla dimensione del buffer FIFO (n) eccede l'area.

  • se il puntatore di scrittura del buffer FIFO > dimensione del buffer FIFO (n).

  • se il puntatore di scrittura del buffer FIFO è 256 (16#100) o superiore dopo la scrittura dei dati.

Esempio

DUT

Questo esempio illustra il buffer FIFO incorporando le funzioni F115_FIFT, F116_FIFR e F117_FIFW.

Intestazione del POU

Tutte le variabili di ingresso e uscita utilizzate per programmare questa funzione sono state dichiarate nell'intestazione del POU.La stessa intestazione del POU è utilizzata per tutti i linguaggi di programmazione.

VAR
		FIFO: FIFO_n_WORD;
		iRead_Data: INT:=0;
		iWrite_Data: INT:=1;
		bFIFO_Initialize: BOOL:=FALSE;
		bFIFO_Write: BOOL:=FALSE;
		bFIFO_Read: BOOL:=FALSE;
		bChange_Value: BOOL:=FALSE;
	END_VAR

Corpo del POU

L'esempio che segue illustra lo stato del buffer dopo che bFIFO_Write è stato abilitato due volte e bFIFO_Read una volta. Quando bFIFO_Write è stato attivato la prima volta, il valore 1 è stato scritto in FIFO.awData[0]. Quando bFIFO_Read è stato abilitato, iRead_Data ha letto questo valore. Quando bFIFO_Write è stato abilitato la seconda volta, il puntatore di scrittura è stato incrementato di uno e il valore 2 è stato scritto in FIFO.awData[1]. Vedere Monitor dati 1

Corpo LD

BODY
    WORKSPACE
        NETWORK_LIST_TYPE := NWTYPELD ;
    END_WORKSPACE
    NET_WORK
        NETWORK_TYPE := NWTYPELD ;
        NETWORK_LABEL :=  ;
        NETWORK_TITLE :=  ;
        NETWORK_HEIGHT := 7 ;
        NETWORK_BODY
B(B_CONTACT,,bFIFO_Initialize,6,1,8,3,R);
B(B_F,F115_FIFT,,24,0,33,5,,?DEN?Dn?Dd1?AENO);
B(B_VARIN,,FIFO.awData,11,3,13,5,);
B(B_F,Size_Of_Var,,13,2,23,5,,?D@'Var'?CSize);
B(B_VARIN,,FIFO.iSize,11,5,13,7,);
L(1,0,1,7);
L(1,2,6,2);
L(8,2,24,2);
L(23,3,24,3);
L(23,3,23,4);
L(24,4,24,6);
L(13,6,24,6);
        END_NETWORK_BODY
    END_NET_WORK
    NET_WORK
        NETWORK_TYPE := NWTYPELD ;
        NETWORK_LABEL :=  ;
        NETWORK_TITLE :=  ;
        NETWORK_HEIGHT := 9 ;
        NETWORK_BODY
B(B_COMMENT,,The LT (Lower Than) operator prevents a writing error from occurring.,3,1,33,2,);
B(B_VARIN,,FIFO.iNumber,8,4,10,6,);
B(B_F,@LT-2,,10,3,15,7,,?D?D?C);
B(B_CONTACT,,bFIFO_Write,17,4,19,6,R);
B(B_VARIN,,FIFO.iSize,8,5,10,7,);
B(B_F,F117_FIFW,,24,4,33,8,,?DEN?D@'s'?AENO?Cd1);
B(B_VARIN,,iWrite_Data,22,6,24,8,);
B(B_VAROUT,,FIFO.iSize,33,6,35,8,);
L(1,0,1,9);
L(15,5,17,5);
L(19,5,19,6);
L(19,6,24,6);
        END_NETWORK_BODY
    END_NET_WORK
    NET_WORK
        NETWORK_TYPE := NWTYPELD ;
        NETWORK_LABEL :=  ;
        NETWORK_TITLE :=  ;
        NETWORK_HEIGHT := 9 ;
        NETWORK_BODY
B(B_COMMENT,,The GT (Greater Than) operator prevents a reading error from occurring.,3,1,34,2,);
B(B_VARIN,,FIFO.iNumber,7,4,9,6,);
B(B_F,@GT-2,,9,3,14,7,,?D?D?C);
B(B_CONTACT,,bFIFO_Read,16,4,18,6,R);
B(B_VARIN,,0,7,5,9,7,);
B(B_F,F116_FIFR,,24,4,33,8,,?DEN?Dd1?AENO?Cd2);
B(B_VARIN,,FIFO.iSize,22,6,24,8,);
B(B_VAROUT,,iRead_Data,33,6,35,8,);
L(1,0,1,9);
L(14,5,16,5);
L(18,5,18,6);
L(18,6,24,6);
        END_NETWORK_BODY
    END_NET_WORK
    NET_WORK
        NETWORK_TYPE := NWTYPELD ;
        NETWORK_LABEL :=  ;
        NETWORK_TITLE :=  ;
        NETWORK_HEIGHT := 9 ;
        NETWORK_BODY
B(B_COMMENT,,The E_ADD function is for cosmetic purposes only. It increments the value for the variable iWrite_Data~ which you can more easily differentiate when it is written into the Array of the FIFO buffer.,3,1,34,4,);
B(B_CONTACT,,bChange_Value,9,5,11,7,R);
B(B_F,E_ADD-2,,22,4,28,9,,?DEN?Da_NumN?Da_NumN?AENO?C);
B(B_VARIN,,iWrite_Data,20,6,22,8,);
B(B_VAROUT,,iWrite_Data,28,6,30,8,);
B(B_VARIN,,1,20,7,22,9,);
L(1,0,1,9);
L(1,6,9,6);
L(11,6,22,6);
        END_NETWORK_BODY
    END_NET_WORK
END_BODY

Corpo ST

IF DF(bFIFO_Initialize) THEN
	(* Create the FIFO buffer *)
	F115_FIFT(n_Number := Size_Of_Var(FIFO.awData), d1_Start :=  FIFO.iSize);
	REPEAT
		(* Initialize FIFO buffer with values *)
		iWrite_Data:=iWrite_Data+1;
		F117_FIFW(s := iWrite_Data, d1_Start => FIFO.iSize);
	UNTIL(FIFO.iNumber>=FIFO.iSize)
	END_REPEAT;
END_IF;

IF DF( bFIFO_Write) THEN
	(* Write value of Write_Data to FIFO buffer *)
	(* at leading edge of FIFO_Write *)
	F117_FIFW(s := iWrite_Data, d1_Start => FIFO.iSize);
END_IF;

IF DF(bFIFO_Read) THEN
	(* Read value from FIFO buffer *)
	(* at leading edge of FIFO_Read *)
	F116_FIFR(d1_Start := FIFO.iSize, d2 => iRead_Data);
END_IF;

L'ultima revisione: 2023-07-11Feedback su questa paginaPanasonic hotline