Lire à partir du tampon FIFO
F116_FIFR lit les données d1 du tampon FIFO (First-In-First-Out) et sauvegarde les données dans la zone spécifiée par d2.
Entrée
Zone de départ de 16 bits du tampon FIFO
Sortie
Zone de 16 bits de sauvegarde des données lues à partir du tampon FIFO
Au lieu d’utiliser cette instruction F, nous recommandons d’utiliser l’instruction FP7 correspondante : FP_FIFO_READ, FP_LIFO_READ
Les données sont lues à partir de l’adresse indiquée par le pointeur de lecture lorsque l’instruction est exécutée.
(0), (n–2) et (n–1) sont les adresses affectées à la zone de sauvegarde des données.
n est la valeur indiquée par l’instruction F115_FIFT.
Le pointeur de lecture est sauvegardé dans les huit bits de poids fort du troisième mot de la zone tampon FIFO. L’adresse réelle est la valeur de l’adresse de tête dans la zone tampon FIFO indiquée par d1 plus 3, plus la valeur du pointeur de lecture (la valeur duquel seul le premier octet est une valeur décimale).
Lorsque la lecture est exécutée, 1 est soustrait du nombre de données sauvegardées et le pointeur de lecture est incrémenté de 1 ou réinitialisé à zéro, lorsqu’il est pointé sur l’élément final.
Une erreur apparaît si l’instruction est exécutée lorsque le nombre de données sauvegardées est 0 ou lorsque le pointeur de lecture est égal au pointeur d’écriture.
La lecture est exécutée uniquement lorsque le pointeur de lecture est différent du pointeur d’écriture.
Si la lecture est exécutée lorsque le pointeur de lecture indique l’adresse finale du tampon FIFO (n défini par l’instruction FIFO moins 1), le pointeur de lecture est défini sur 0
Si la taille (n) du tampon FIFO indiqué par d1 est n = 0 ou lorsque n > 256.
Si le nombre de données du tampon FIFO sauvegardées = 0.
Si le nombre de données du tampon FIFO sauvegardées > taille FIFO (n).
Si l’adresse finale du tampon FIFO basée sur la taille du tampon FIFO (n) est en dehors de la zone.
Si le pointeur de lecture du tampon FIFO > taille du tampon FIFO (n).
Si le pointeur de lecture du tampon FIFO indique 256 (16#100) ou une valeur supérieure après lecture des données.
Si la taille (n) du tampon FIFO indiqué par d1 est n = 0 ou lorsque n > 256.
Si le nombre de données du tampon FIFO sauvegardées = 0.
Si le nombre de données du tampon FIFO sauvegardées > taille FIFO (n).
Si l’adresse finale du tampon FIFO basée sur la taille du tampon FIFO (n) est en dehors de la zone.
Si le pointeur de lecture du tampon FIFO > taille du tampon FIFO (n).
Si le pointeur de lecture du tampon FIFO indique 256 (16#100) ou une valeur supérieure après lecture des données.
Toutes les variables d’entrée et de sortie utilisées pour programmer cette fonction ont été déclarées dans l’en-tête du POU. Le même en-tête de POU est utilisé pour tous les langages de programmation.
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’exemple ci-dessous montre l’état du tampon lorsque que bFIFO_Write a été activée deux fois et bFIFO_Read une fois. Après une première activation de la fonction bFIFO_Write, la valeur 1 est écrite dans FIFO.awData[0]. Lorsque bFIFO_Read est activée, iRead_Data lit cette valeur. Après une seconde activation de bFIFO_Write, le pointeur d’écriture est incrémenté de 1 et la valeur 2 est écrite dans FIFO.awData[1]. Voir Saisie des données du monitoring 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;