Lettura dal buffer FIFO
F116_FIFR legge il dato d1 dal buffer FIFO (First-In-First-Out) e memorizza il dato nell'area specificata da d2.
Ingresso
area a 16 bit iniziale del buffer FIFO
Uscita
area a 16 bit per memorizzare i dati letti dal buffer FIFO
Anziché utilizzare questa istruzione F, si consiglia di utilizzare l'istruzione FP7 corrispondente: FP_FIFO_READ, FP_LIFO_READ
La lettura dei dati avviene a partire dall'indirizzo specificato dal puntatore di lettura quando l'istruzione viene eseguita.
(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 lettura è memorizzato negli otto bit superiori della terza word dell'area del buffer FIFO. L'indirizzo attuale è il valore dell'indirizzo iniziale nell'area del buffer FIFO specificato da d1 più 3, più il valore del puntatore di lettura (il valore di cui solo il primo byte è un valore decimale).
Quando viene eseguita la lettura, viene sottratto 1 dal numero di elementi di dati memorizzati, mentre il puntatore di lettura viene incrementato di 1 o resettato a zero nel caso in cui il puntatore indicasse l'elemento finale.
L'esecuzione dell'istruzione quando il numero di elementi di dati memorizzati è 0, o quando il puntatore di lettura è uguale al puntatore di scrittura, genera un errore.
La lettura viene eseguita solo quando il puntatore di lettura non è uguale al puntatore di scrittura.
In caso di esecuzione quando il puntatore di lettura indica l'indirizzo finale del buffer FIFO (n definita dall'istruzione FIFO meno 1), il puntatore di lettura viene impostato su 0.
se la dimensione (n) del buffer FIFO specificato da d1 è 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 lettura del buffer FIFO > dimensione del buffer FIFO (n).
se il puntatore di lettura del buffer FIFO è 256 (16#100) o superiore dopo la lettura dei dati.
se la dimensione (n) del buffer FIFO specificato da d1 è 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 lettura del buffer FIFO > dimensione del buffer FIFO (n).
se il puntatore di lettura del buffer FIFO è 256 (16#100) o superiore dopo la lettura dei dati.
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
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
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
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;