F117_FIFW

Écrire dans le tampon FIFO

F/P117 écrit les données désignées par s dans le tampon FIFO indiqué par d1.

Paramètres

Entrée

s (WORD, INT, UINT)

Zone de 16 bits ou constante équivalente de sauvegarde des données à écrire dans le tampon FIFO

Sortie

d1_Start (WORD, INT, UINT)

Zone de départ de 16 bits du tampon FIFO

Remarques

  • Au lieu d’utiliser cette instruction F, nous recommandons d’utiliser l’instruction FP7 correspondante : FP_FIFO_WRITE, FP_LIFO_WRITE

  • Les données spécifiées sont écrites vers l’adresse indiquée par le pointeur d’écriture 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 d’écriture est sauvegardé dans les huit bits de poids faible du troisième mot de la zone tampon FIFO. Il est indiqué par une position relative dans la zone de sauvegarde des données. L’adresse réelle vers laquelle les données sont écrites est indiquée par d1 plus l’offset 3 plus la valeur du pointeur d’écriture (valeur duquel seul l’octet de poids faible est une valeur décimale).

  • Lorsque l’écriture est exécutée, 1 est ajouté au nombre de données sauvegardées et le pointeur d’écriture est incrémenté de 1 ou réinitialisé à zéro, lorsqu’il est pointé sur l’élément final.

  • Les variables s et d1_Start doivent être du même type de données.

NOTA
  • Une erreur apparaît si l’instruction est exécutée lorsque le tampon FIFO est plein (le nombre de données sauvegardées = la taille n du tampon FIFO définie par l’instruction FIFT). L’écriture n’est pas autorisée.

  • Si l’écriture est exécutée lorsque le pointeur d’écriture indique l’adresse finale du tampon FIFO (n défini par l’instruction FIFT), le pointeur d’écriture 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_Start 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 d’écriture du tampon FIFO > taille du tampon FIFO (n).

  • Si le pointeur d’écriture du tampon FIFO est 256 (16#100) ou supérieur après écriture des données.

sys_bIsOperationErrorNonHold (passe à TRUE pendant un cycle)
  • Si la taille (n) du tampon FIFO indiqué par d1_Start 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 d’écriture du tampon FIFO > taille du tampon FIFO (n).

  • Si le pointeur d’écriture du tampon FIFO est 256 (16#100) ou supérieur après écriture 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 : 2023-07-11Commentaires sur cette pageAssistance téléphonique