Lectura de datos de una pila FIFO
F116_FIFR lee el dato almacenado en d1 de la pila FIFO (First-In-First-Out) y guarda en d2 el dato leído.
Entrada
área de inicio de 16-bit de la pila FIFO
Salida
área de 16 bits para almacenar los datos que se leen desde la pila FIFO
En lugar de utilizar esta instrucción F, se recomienda utilizar la instrucción FP7 correspondiente: FP_FIFO_READ, FP_LIFO_READ
La lectura de datos se realiza desde la dirección inicial especificada por el puntero de lectura cuando se ejecuta la instrucción.
(0), (n-2) y (n-1) son las direcciones asignadas al área de almacenamiento.
n es el valor especificado por la instrucción F115_FIFT.
El puntero de lectura se almacena en los ocho bits superiores de la tercera palabra de la pila FIFO. La dirección actual desde la que se leen los datos de la pila FIFO está especificada por d1 más el offset 3, más el valor del puntero de lectura (byte más significativo de la palabra d1+2).
Cuando se ejecuta la lectura, se disminuye en 1 el número de elementos almacenados, y el puntero de lectura se incrementa en 1, o se pone a cero si estaba apuntando al último elemento de la pila.
Si se ejecuta la instrucción cuando no existen elementos almacenados en la pila o cuando el puntero de lectura es igual al puntero de escritura, se produce un error.
Solo se puede realizar la lectura cuando el puntero de lectura no es igual al puntero de escritura.
Si se ejecuta cuando el puntero de escritura indica la dirección final en la pila FIFO (el valor de n definido por la instrucción FIFT menos 1), el puntero de lectura se pondrá a 0.
si el tamaño (n) de la FIFO especificado por d1 es n = 0, o si n > 256.
si el número de elementos almacenados en la FIFO = 0.
si el número de elementos almacenados de la FIFO es > tamaño (n).
si la última dirección de la FIFO según el tamaño (n) supera el área.
si el puntero de lectura es > tamaño (n) de la pila.
si el puntero de lectura es 256 (16#100) o mayor después de leer los datos.
si el tamaño (n) de la FIFO especificado por d1 es n = 0, o si n > 256.
si el número de elementos almacenados en la FIFO = 0.
si el número de elementos almacenados de la FIFO es > tamaño (n).
si la última dirección de la FIFO según el tamaño (n) supera el área.
si el puntero de lectura es > tamaño (n) de la pila.
si el puntero de lectura es 256 (16#100) o mayor después de leer los datos.
Todas las variables de entrada y de salida utilizadas para la programación de esta función han sido declaradas en la Cabecera de la POU. Se utiliza la misma cabecera de la POU para todos los lenguajes de programación.
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
El ejemplo de abajo muestra el estado de la pila después de haber habilitado dos veces bFIFO_Write y una vez bFIFO_Read. Después de activar bFIFO_Write la primera vez, se escribe un 1 en FIFO.awData[0]. Cuando se activa bFIFO_Read , iRead_Data lee este valor. Cuando se activa bFIFO_Write la segunda vez, el puntero de escritura se incremente en uno y se escribe 2 en en FIFO.awData[1]. Ver Entry Data Monitor 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;