FIFOバッファからの読み出し
F116_FIFRはd1で指定されたエリアを先頭とするFIFO (ファーストイン/ファーストアウト)バッファから、データを読み出し、d2で指定したエリアに格納します。
入力
FIFOバッファ(16ビットエリア)の先頭アドレス
出力
FIFOバッファから読み出したデータを格納する16ビットエリア
F命令を使用する代わりに、対応するFP7命令を使用することをおすすめします。FP_FIFO_READ, FP_LIFO_READ
データの読み出しは、命令実行時に読み出しポインタが指定しているアドレスから行われます。
上図の[0]、[n-2]、[n-1]は、データ格納領域に付けられたアドレスです。
nは、F115_FIFT命令で指定した値です。
読み出しポインタは、FIFOバッファエリアの3ワード目の上位8ビットに格納されます。実際のアドレスは、"d1で指定されたFIFOバッファエリアの先頭アドレス"+"3"+"読み出しポインタの値(上位バイトのみを10進数にした値)"になります。
読み出しを実行すると、格納データ数が"-1"され、読み出しポインタは"+1"されます。また、読み出しポインタが終端アドレスを示していた場合は"0"にリセットされます。
格納データ数が"0"のとき、または読み出しポインタが書き込みポインタと同じ値のときに実行すると、エラーになります。
読み出しポインタと書き込みポインタが等しくないときのみ、読み出しは実行されます。
読み出しポインタが、FIFOバッファの終端アドレス(FIFO命令で定義したn-1)を示しているとき、この命令を実行すると読み出しポインタは0になります。
d1で指定されたFIFOのサイズn = 0またはn > 256のとき
FIFOの格納データ数 = 0のとき
FIFOの格納データ数 > FIFOサイズ(n)のとき
FIFOサイズ(n)によるFIFOの終端アドレスがエリアを超えたとき
FIFO読み出しポインタ > FIFOサイズ(n)のとき
データを読み出した後、FIFO読み出しポインタが256 (16#100)以上になるとき
d1で指定されたFIFOのサイズn = 0またはn > 256のとき
FIFOの格納データ数 = 0のとき
FIFOの格納データ数 > FIFOサイズ(n)のとき
FIFOサイズ(n)によるFIFOの終端アドレスがエリアを超えたとき
FIFO読み出しポインタ > FIFOサイズ(n)のとき
データを読み出した後、FIFO読み出しポインタが256 (16#100)以上になるとき
POUヘッダには、このプログラムで使用するすべての入力変数と出力変数を宣言します。 POUヘッダは全プログラム言語で使用できます。
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
以下の例は、bFIFO_Writeが2度、bFIFO_Readが1度ONになった後のバッファの状態を示します。bFIFO_Writeが最初にONになったとき、FIFO.awData[0]に"1"が書き込まれます。bFIFO_ReadがONになると、iRead_Dataがこの値を読み出します。bFIFO_Writeが2度目にONになったとき、書き込みポインタが2増加し、FIFO.awData[1]に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;