F116_FIFR

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.

Paramètres

Entrée

d1_Start (WORD, INT, UINT)

Zone de départ de 16 bits du tampon FIFO

Sortie

d2 (WORD, INT, UINT)

Zone de 16 bits de sauvegarde des données lues à partir du tampon FIFO

Remarques

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

    1.  (1) Taille de la mémoire tampon FIFO (n)
    2.  (2) Nombre de données sauvegardées (mots), écrites et non lues
    3.  (3) Pointeur de lecture dans l’octet de poids fort
    4.  (4) Pointeur de lecture
    5.  (5) Zone de sauvegarde des données (n mots)
  • (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.

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

Drapeaux d’erreur

sys_bIsOperationErrorHold (passe à TRUE et reste TRUE)
  • 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.

sys_bIsOperationErrorNonHold (passe à TRUE pendant un cycle)
  • 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.

Exemple

DUT

Cet exemple illustre le tampon FIFO avec les fonctions F115_FIFT, F116_FIFR et F117_FIFW.

En-tête du POU

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

Corps du POU

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

Corps en 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

Corps 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;

Modifié le : 2022-10-12Commentaires sur cette pageAssistance téléphonique