F116_FIFR

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.

Parametri

Ingresso

d1_Start (WORD, INT, UINT)

area a 16 bit iniziale del buffer FIFO

Uscita

d2 (WORD, INT, UINT)

area a 16 bit per memorizzare i dati letti dal buffer FIFO

Note

  • 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.

    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 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.

Nota
  • 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.

Flag di errore

sys_bIsOperationErrorHold (passa a TRUE e resta TRUE)
  • 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.

sys_bIsOperationErrorNonHold (passa a TRUE per una scansione)
  • 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.

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: 2021-06-22Feedback su questa paginaPanasonic hotline