Escritura de datos de una pila FIFO
F/P117 escribe el dato s en la pila especificada por d1.
Entrada
Área de 16 bits o constante equivalente para almacenar los datos que se van a escribir en la pila FIFO
Salida
área de inicio de 16-bit de la pila FIFO
En lugar de utilizar esta instrucción F, se recomienda utilizar la instrucción FP7 correspondiente: FP_FIFO_WRITE, FP_LIFO_WRITE
Cuando se ejecuta la instrucción, los datos especificados se escriben en la dirección indicada por el puntero de escritura.
(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 escritura se almacena en los ocho bits menos significativos de la tercera palabra de la pila FIFO, y se indica como una posición relativa en el área de almacenamiento. La dirección actual en la que se escriben los datos está especificada por d1 más el offset 3 más el valor del puntero de escritura (byte menos significativo de la palabra d1+2).
Cuando se ejecuta la escritura, se aumenta en 1 el número de elementos almacenados, y el puntero se incrementa en 1, o se pone a cero si estaba apuntando al último elemento de la pila.
Las variables s y d1_Start tienen que ser del mismo tipo de datos.
Se produce un error si se ejecuta cuando la pila FIFO está llena (el número de elementos almacenados = el tamaño n de la FIFO se define con la instrucción FIFT). La escritura está deshabilitada.
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), el puntero de escritura se pondrá a 0.
si el tamaño (n) de la FIFO especificado por d1_Start 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 escritura es > tamaño (n).
si el puntero de escritura es 256 (16#100) o mayor después de escribir los datos.
si el tamaño (n) de la FIFO especificado por d1_Start 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 escritura es > tamaño (n).
si el puntero de escritura es 256 (16#100) o mayor después de escribir 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;