F116_FIFR

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.

Parámetros

Entrada

d1_Start (WORD, INT, UINT)

área de inicio de 16-bit de la pila FIFO

Salida

d2 (WORD, INT, UINT)

área de 16 bits para almacenar los datos que se leen desde la pila FIFO

Observaciones

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

    1.  (1) Tamaño de la memoria n de la pila FIFO
    2.  (2) Número de elementos de datos almacenados (palabras), escritos y no leídos
    3.  (3) Lectura del puntero en el byte de mayor peso
    4.  (4) Puntero de lectura
    5.  (5) Área de almacenamiento de datos (n palabras)
  • (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.

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

Banderas de error

sys_bIsOperationErrorHold (pasa a TRUE y permanece TRUE)
  • 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.

sys_bIsOperationErrorNonHold (pasa a TRUE para un ciclo de scan)
  • 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.

Ejemplo

DUT

Este ejemplo muestra el uso de la pila FIFO junto con las funciones F115_FIFT, F116_FIFR y F117_FIFW.

Cabecera de la POU

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

Cuerpo de la POU

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

Cuerpo 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

Cuerpo en 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;

Modificado el: 2021-09-27Comentarios sobre esta páginaLínea directa de Panasonic