LIFOバッファからの読み出し
このFP命令は、s_Startで指定したLIFO (後入れ先出し)バッファの先頭データエリアからデータを読み出し、データをdで指定したエリアに格納します。
入力
バッファの先頭データエリア
出力
LIFOバッファから読み出したデータを格納するデータエリア
変数s_Startとdは同じデータ型を使用してください。
格納データ数が0のとき、この命令を実行するとエラーが発生します。
読み出しポインタが書き込みポインタと等しいときにこの命令を実行すると、エラーが発生し、読み取りは実行されません。
読み出しポインタがLIFOバッファの終端アドレス(n_Words (FP_LIFO_DEFINEで定義)-1)を示しているときに、この命令を実行すると読み出しポインタは0になります。
で指定されたバッファのサイズ(n_Words)が、n_Words = 0またはn_Words > 4096のとき。
バッファの格納データ数 = 0のとき。
バッファの格納データ数 > バッファサイズ(n_Words)のとき。
読み出しポインタ > バッファサイズ(n_Words)のとき。
データを読み出した後、読み出しポインタが4096 (16#1000)以上になるとき。
で指定されたバッファのサイズ(n_Words)が、n_Words = 0またはn_Words > 4096のとき。
バッファの格納データ数 = 0のとき。
バッファの格納データ数 > バッファサイズ(n_Words)のとき。
読み出しポインタ > バッファサイズ(n_Words)のとき。
データを読み出した後、読み出しポインタが4096 (16#1000)以上になるとき。
POUヘッダには、このプログラムで使用するすべての入力変数と出力変数を宣言します。POUヘッダは全プログラム言語で使用できます。
VAR
bDefineBuffer: BOOL:=FALSE;
bReadFromBuffer: BOOL:=FALSE;
iWords: INT:=8;
arrLifo: ARRAY [0..11] OF INT:=[12(0)];
arrResultReadLifo: ARRAY [0..7] OF WORD:=[8(0)];
END_VAR
変数bDefineBufferがTRUEにセットされると、このファンクションが実行されます。
BODY
WORKSPACE
NETWORK_LIST_TYPE := NWTYPELD ;
ACTIVE_NETWORK := 0 ;
END_WORKSPACE
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 5 ;
NETWORK_BODY
B(B_F,FP_FIFO_DEFINE!,,13,1,22,5,,?DEN?Dn_Words?AENO?Cd_Start);
B(B_VARIN,,iWords,11,3,13,5,);
B(B_VAROUT,,arrLifo[0],22,3,24,5,);
B(B_CONTACT,,bDefineBuffer,5,2,7,4,);
L(7,3,13,3);
L(1,3,5,3);
L(1,0,1,5);
END_NETWORK_BODY
END_NET_WORK
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 5 ;
NETWORK_BODY
B(B_F,FP_FIFO_READ!,,13,1,21,5,,?DEN?Ds_Start?AENO?Cd);
B(B_VARIN,,arrLifo[0],11,3,13,5,);
B(B_VAROUT,,arrResultReadLifo[0],21,3,23,5,);
B(B_CONTACT,,bReadFromBuffer,5,2,7,4,);
L(7,3,13,3);
L(1,3,5,3);
L(1,0,1,5);
END_NETWORK_BODY
END_NET_WORK
END_BODY
if (bReadFromBuffer) then
FP_LIFO_READ(s_Start := arrLifo[0],
d => arrResultReadLifo[0]);
end_if;