前面自己学习了在西门子TIA使用SCL编程,施耐德Unity中使用ST编程做分钟均值和小时均值的方法,今晚在家练习了在ABB Freelance中自定义功能块使用ST语言做分钟均值和小时均值。
新建项目、插入硬件、仿真器、操作站等不做介绍。新建一个用户功能块池,下面建一个功能块类。
功能块类定义下面的变量:
ST脚本如下:
FUNCTION_BLOCK PFBClass_ST
VAR_INPUT
Min : INT;
Sec : INT;
PV : REAL;
END_VAR
VAR_OUTPUT
Min_Avg : REAL;
Hour_Avg : REAL;
END_VAR
(*
PARA_VIS
ClassName : TEXT;
TagName : TEXT;
ShortText : TEXT;
LongText : TEXT;
SelState : BOOL;
END_VAR
*)
var
minute_Pv: array[0..59] of real;
hour_Pv: array[0..59,0..59] of real;
sum:real;
i:int;
j:int;
end_var
minute_Pv[Sec]:=PV;
hour_Pv[Min,Sec]:=PV;
sum:=0.0;
for i:=0 to 59 do
sum:=sum+minute_Pv[i];
end_for;
Min_Avg:=sum/60.0;
sum:=0.0;
for i:=0 to 59 do
for j:=0 to 59 do
sum:=sum+hour_Pv[i,j];
end_for;
end_for;
Hour_Avg:=sum/3600.0;
END_FUNCTION_BLOCK
要注意ST脚本要卸载FUNCTION_BLOCK ***和END_FUNCTION_BLOCK之间,而且不能有program *** 和end_program。
完成后保存,编译一下。会有提示,大概就是说有些变量开始几个字母都一样,可能网关无法访问之类的,先不管他。
在任务列表下建立FBD,使用DT解包功能块,把系统分钟和秒从系统日期时间变量分解出来。
在人物列表的FBD程序中调用刚才新建的用户自定义功能块。
由于没有实际的控制系统和仪表,这里使用一个常数表示测量值,内部计算得到分钟均值和小时均值。刚开始内部的数组没有全部赋值,得到的平均值不够准确,积累一定时间后,就可以得到最近一分钟和最近一小时的均值了。