功能块变量声明
代码块
FUNCTION_BLOCK FIFO
VAR_INPUT
Enable :BOOL;
Autounload :BOOL; //满栈自动移除队列尾部数据,队列头部数据区写入新数据选择开关
Load : BOOL; //入栈
Unload : BOOL; //出栈
Destroy : BOOL; //销毁队列
ElementSize :INT;
Length :DINT; //列队数组长度
LoadValue: POINTER TO DWORD; //入栈数据地址(使用ADR获取该数据地址)
UnloadValue: POINTER TO DWORD; //出栈数据地址(使用ADR获取该数据地址)
FirstElement: POINTER TO DWORD; //列队数据首地址(使用ADR获取该数据地址)
END_VAR
VAR_INPUT
Done:BOOL; //完成信号
Full:BOOL; //满栈
Empty :BOOL; //空栈
END_VAR
VAR
i,j: DINT;
Size: UDINT; //列队数据首地址字节长度
Position:INT;
DestPointer: POINTER TO DWORD; //目标指针
SourcePointer: POINTER TO DWORD;//源数据指针
R_TRIG_Load : Standard.R_TRIG;
R_TRIG_Unload : Standard.R_TRIG;
END_VAR
复制成功
功能块程序
代码块
R_TRIG_Load(CLK:=Load,);
R_TRIG_Unload (CLK:=Unload,);
ElementSize:= Position;
Size := SIZEOF(FirstElement^);
//如果Autounload为TRUE,当满栈时自动将队列尾部数据写入出栈数据区,同时新待入栈数据将写入队列头部数据区
IF Full AND Autounload AND R_TRIG_Load.Q THEN
SourcePointer := FirstElement + ((Position - 1) * Size);
UnloadValue^ := SourcePointer^;
Position := Position - 1;
END_IF;
//入列
IF R_TRIG_Load.Q AND (Position < Length) THEN
Done := FALSE;
FOR i := (Position) TO 1 BY -1 DO
DestPointer := FirstElement + (i * Size);
SourcePointer := FirstElement + ((i-1) * Size);
DestPointer^ := SourcePointer^;
END_FOR;
FirstElement^ := LoadValue^;
Position := Position + 1;
Done := TRUE;
END_IF;
//出列
IF R_TRIG_Unload.Q AND (Position > 0) THEN
Done := FALSE;
SourcePointer := FirstElement + ((Position - 1) * Size);
UnloadValue^ := SourcePointer^;
SourcePointer^ := 0;
Position := Position - 1;
Done := TRUE;
END_IF;
//空列队
IF Position = 0 THEN
Empty := TRUE;
ELSE
Empty := FALSE;
END_IF;
//列队满
IF Position < Length THEN
Full := FALSE;
ELSE
Full := TRUE;
END_IF;
//销毁队列
IF Destroy AND Position>0 THEN
Done := FALSE;
FOR j := 0 TO Length BY 1 DO
DestPointer := FirstElement + (j * Size);
SourcePointer := FirstElement + ((j-1) * Size);
DestPointer^ :=0;
END_FOR;
Position:=0;
END_IF
复制成功
CODESYS PLC_PRG 变量声明
代码块
PROGRAM PLC_PRG
VAR
AddElement: BOOL; //添加元素
RemoveElement: BOOL; //移出元素
Autounload :BOOL; //自动卸载
Autounload_HMI :BOOL; //自动卸载
Reset_HMI:BOOL; //销毁队列
FIFO: FIFO; //实例化FIFO功能块
Value: DINT; //入列数据
Buffer: ARRAY[0..15] OF DINT; //列队数组
Unload: DINT; //出栈数据
FIFO_REAL: FIFO_REAL; //实例化FIFO_REAL功能块
Value_REAL: REAL; //入列数据
Buffer_REAL: ARRAY[0..15] OF REAL ; //列队数组
Unload_REAL: REAL; //出栈数据
END_VAR
复制成功
CODESYS PLC_PRG 程序中FIFO功能块调用
代码块
FIFO(
Enable:= TRUE,
Autounload:= Autounload AND Autounload_HMI ,
Load:= AddElement OR GVL.Push,
Unload:=RemoveElement OR GVL.Pop ,
Destroy :=GVL.Reset OR Reset_HMI,
Length:= 16,
LoadValue:=ADR(Value) , //取待入列数据地址,以便传给功能块内部对应需求指针
UnloadValue:= ADR(Unload) ,
FirstElement:=ADR(Buffer[0]),
Done:= ,
Full:= ,
Empty:= );
复制成功

免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删