F117_FIFW

Schreiben in FIFO-Puffer

Mit F/P117 werden die mit s festgelegten Daten in den mit d1 definierten FIFO-Puffer geschrieben.

Parameter

Eingang

s (WORD, INT, UINT)

16-Bit-Speicherbereich oder äquivalente Kostante um im FIFO-Puffer zu schreiben

Ausgang

d1_Start (WORD, INT, UINT)

Anfangsadresse des FIFO-Puffers

Anmerkungen

  • Wir empfehlen, anstelle von diesem F-Befehl den entsprechenden FP7-Befehl zu verwenden: FP_FIFO_WRITE, FP_LIFO_WRITE

  • Wenn dieser Befehl ausgeführt wird, werden die Daten in den vom Schreibzeiger bezeichneten Datenspeicher geschrieben.

    1.  (1) Speichergröße des FIFO-Puffers (n)
    2.  (2) Anzahl der gespeicherten Datenelemente (Worte), geschrieben und nicht gelesen
    3.  (3) Lesezeiger im höherwertigen Byte
    4.  (4) Lesezeiger
    5.  (5) Datenspeicherbereich (n Worte)
  • (0), (n-2) und (n-1) sind dem Datenspeicherbereich zugewiesene Adressen.

  • n ist der mit dem Befehl F115_FIFT zugewiesene Wert.

  • Der Schreibzeiger wird in den niederwertigen acht Bits des dritten Wortes im FIFO-Puffer gespeichert. Die tatsächliche Adresse, aus der gelesen wird, ergibt sich aus d1 plus dem Offset 3 plus dem Wert des Schreibzeigers.

  • Beim Schreiben wird die Anzahl der gespeicherten Datenelemente um 1 heraufgesetzt, und der Schreibzeiger wird um eine Position weitergeschoben (der Wert wird um 1 erhöht) oder auf Null gesetzt, wenn der Zeiger auf dem letzten Element stand.

  • Die Variablen s und d1_Start müssen vom gleichen Datentyp sein.

Anmerkung
  • Wenn der Befehl F/P117_FIFW ausgeführt und der FIFO-Puffer voll ist (Anzahl der gespeicherten Datenelemente = Speichergröße n des Puffers), geht die Steuerung in den Fehlerzustand. Schreiben ist dann nicht möglich.

  • Wenn der Befehl ausgeführt wird und der Schreibzeiger auf der Endadresse des FIFO-Puffers steht, wird der Schreibzeiger auf 0 gesetzt.

Fehleralarmmerker

sys_bIsOperationErrorHold (wird auf TRUE gesetzt und bleibt TRUE)
  • wenn die mit d1_Start definierte Größe (n) des FIFO-Puffers n = 0 ist oder wenn n > 256 ist.

  • wenn die Anzahl der gespeicherten Datenelemente im FIFO-Puffer = 0 ist.

  • wenn die Anzahl der gespeicherten Datenelemente im FIFO-Puffer > n ist.

  • wenn die auf der Speichergröße n basierende Endadresse des FIFO-Puffers größer ist als der zulässige Bereich

  • wenn der Wert des Schreibzeigers > Speichergröße des FIFO-Puffers (n) ist.

  • wenn der Wert des Schreibzeigers nach dem Schreiben = 256 (16#100) oder > 256 ist.

sys_bIsOperationErrorNonHold (wird für einen Zyklus auf TRUE gesetzt)
  • wenn die mit d1_Start definierte Größe (n) des FIFO-Puffers n = 0 ist oder wenn n > 256 ist.

  • wenn die Anzahl der gespeicherten Datenelemente im FIFO-Puffer = 0 ist.

  • wenn die Anzahl der gespeicherten Datenelemente im FIFO-Puffer > n ist.

  • wenn die auf der Speichergröße n basierende Endadresse des FIFO-Puffers größer ist als der zulässige Bereich

  • wenn der Wert des Schreibzeigers > Speichergröße des FIFO-Puffers (n) ist.

  • wenn der Wert des Schreibzeigers nach dem Schreiben = 256 (16#100) oder > 256 ist.

Beispiel

SDT

Hier wird der FIFO-Puffer veranschaulicht, indem die Funktionen F115_FIFT, F116_FIFR und F117_FIFW verwendet werden.

POE-Kopf

Im POE-Kopf werden alle Ein- und Ausgangsvariablen deklariert, die für die Programmierung dieser Funktion verwendet werden.Für alle Programmiersprachen wird der gleiche POE-Kopf verwendet.

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

POE-Rumpf

Das folgende Beispiel zeigt den Zustand des Puffers, nachdem bFIFO_Write zweimal ausgeführt wurde und bFIFO_Read einmal. Wird bFIFO_Write das erste Mal ausgeführt, dann wird der Wert 1 in FIFO.awData[0] geschrieben. Wird bFIFO_Read ausgeführt, dann liest iRead_Data diesen Wert. Wird bFIFO_Write zum zweiten Mal ausgeführt, dann erhöht sich der Schreibzeiger um den Wert 1 und der Wert 2 wird in FIFO.awData[1] geschrieben. siehe Anwendermonitor 1

KOP-Rumpf

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

ST-Rumpf

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;

Letzte Änderung am: 2023-07-11Feedback zu dieser SeitePanasonic Hotline