楼主最近还看过
可以参考我发的贴子,里面有先入先出功能块的scl文件,导入就可以使用,也可以按照下面代码编写
FUNCTION_BLOCK "先入先出FB"
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
VAR_INPUT
Write : Bool;
ReserBuffer : Bool;
NewVaule : Real;
END_VAR
VAR_IN_OUT
Buffer : Array[*] of Real;
END_VAR
VAR
StartInitialized : Bool;
StartElementReset : DInt;
StartLowerLimit : DInt;
StartUpperLimit : DInt;
StartNumElements : UDInt;
StartEdgeWrite : Bool;
END_VAR
VAR_TEMP
TempEetVal : Int;
END_VAR
BEGIN
//设计一个块,开辟一个数组缓冲区,将新数据存入缓冲区,旧数据在缓冲区内自动前移。缓冲区可以复位
//
//初始化
IF (NOT #StartInitialized) THEN
#StartLowerLimit := LOWER_BOUND(ARR := #Buffer, DIM := 1); //缓冲区数组下标
#StartUpperLimit := UPPER_BOUND(ARR := #Buffer, DIM := 1); //缓冲区数字上标
#StartNumElements := DINT_TO_UDINT(#StartUpperLimit - #StartLowerLimit + 1); //缓冲区数组元素数量
#StartInitialized := TRUE;
END_IF;
//写上升沿触发推入新数据元素
IF (#Write) AND (NOT #StartEdgeWrite) AND (NOT #ReserBuffer) THEN
//除最后一个元素外,将所有元素向上移动
#TempEetVal := MOVE_BLK_VARIANT(SRC := #Buffer,
COUNT := #StartNumElements - 1,
SRC_INDEX := 0,
DEST_INDEX := 1,
DEST => #Buffer);
//将新值存储到第一个元素
#Buffer[#StartLowerLimit] := #NewVaule;
// //除最后一个元素外,将所有元素向上移动
// #TempEetVal := MOVE_BLK_VARIANT(SRC:=#Buffer,
// COUNT:=#StartNumElements-1 ,
// SRC_INDEX:=1,
// DEST_INDEX:=0,
// DEST=>#Buffer)
// //将新值存储到第一个元素
// #Buffer[#StartLowerLimit] := #NewVaule;
;
END_IF;
//复位缓冲区
IF (#ReserBuffer) THEN
// 复位缓冲区数据为“0”
FOR #StartElementReset := #StartLowerLimit TO #StartUpperLimit DO
#Buffer[#StartElementReset] := 0;
END_FOR;
;
END_IF;
//写上升沿
#StartEdgeWrite := #Write;
END_FUNCTION_BLOCK