博途工程组态平台推出已经超过10年,10年也让大家都熟悉并喜欢上了它的软件风格,同时也累积了大量的标准功能块,既有官方提供下载的,也有大家自己写的。下面以自己工作中常使用的几个功能块为例,从出处和使用心得角度与大家一起分享互勉,不对之处请大家指点下正好改正。
1.时间定时器功能块
时间和定时功能是编写应用程序中经常使用到的,比如计算设备运行时间,时间以日时分秒形式显示等。官网也提供的相关时间定时器使用功能块,常用下面几个:
(1)计算设备运行时间
如果需要精确计算设备的运行时间,官网提供了"Timedifferent"功能块,用SCL语言编辑,原理其实就是利用两个扩展指令"RD_SYS_T" (读取时间) 和 "T_DIFF" (时间差),计算设备启动前后所读取的系统时间数据之间的差值,也就是设备的运行时间。这个方法计算的时间还是比较精确的,具体说明和下载可到全球技术资源搜索条目号52258130的文档。
图1:计算设备运行时间功能块
(2)将毫秒转为需要的日、小时、分钟、秒
定时器时基无论预设还是实时都是毫秒,有时需要将实时毫秒转化为日、小时、分钟、秒到HMI上显示,这样更直观。官网提供了三个功能块:分别是用于S7-1200的“ChangeMilliSec_S7-1200”(FB65)、用于S7-1500的“ChangeMilliSec_S7-1500”(FB60)、用于S7-300的“ChangeMilliSec_S7-300”(FB61)。功能块是用FBD编辑的,原理其实就是将当前毫秒值与86400000(天)、3600000(小时)、60000(分钟)逐一相减,相减值超过各时基标准值该时基值自加一,否则转下一时基判断。该资源条目号:42637538。
图2:毫秒转为日小时分钟秒
(3)日、小时、分钟、秒转为毫秒
有了上面的转换,反过来我们需要在HMI上以日、小时、分钟、秒的形式进行时间设定。跟上面一样,官网提供了三个FC (S7-1200/1500/300)比如"Time-in-MS_S7-1200"供大家使用。也是用FBD编辑的,资源条目号:43184859
图3:日小时分钟秒转毫秒
(4)定时器循环执行
利用定时器循环执行可以很方便的扩展定时器的计时范围,因为单个定时器的计时时间是有限的(DINT数据类型的范围限制)。官网也提供了一个基于S5定时器的实例,用SCL编辑的,有STEP7V5.5和博途两个版本,大家可以自行修改基于IEC定时器来使用,该资源条目号:77870587
图4:定时器循环执行
2.模拟量输入输出及滤波
博途提供的标准化(NORM_X)和缩放(SCALE_X)指令让模拟量输出的处理变得更简单方便,但我们也可以自己用SCL写模拟量输入输出以及滤波功能(就不上图了)。
(1)模拟量输入FC
CASE #index OF
1:
#K1 := 0;
#K2 := 27648;
2:
#K1 := -27648;
#K2 := 27648;
3:
#K1 := 5530;
#K2 := 27648;
ELSE;
END_CASE;
IF #IN < #K1
THEN
#Temp1 := #K1;
#overflow := 1;
ELSIF #IN > #K2
THEN
#Temp1 := #K2;
#overflow := 1;
ELSE
#Temp1 := #IN;
#overflow := 0;
END_IF;
#Value := (#HI_LIM - #LO_LIM) * ((#Temp1 - #K1) / (#K2 - #K1)) + #LO_LIM;
(2)模拟量输出FC
CASE #index OF
1:
#K1 := 0;
#K2 := 27648;
2:
#K1 := -27648;
#K2 := 27648;
3:
#K1 := 5530;
#K2 := 27648;
ELSE;
END_CASE;
IF #IN < #LO_LIM
THEN
#Temp1 := #LO_LIM;
#overflow := 1;
ELSIF #IN > #HI_LIM
THEN
#Temp1 := #HI_LIM;
#overflow := 1;
ELSE
#Temp1 := #IN;
#overflow := 0;
END_IF;
#Temp2 := ((#Temp1 - #LO_LIM) * (#K2 - #K1)) / (#HI_LIM - #LO_LIM) + #K1;
#Value := REAL_TO_INT(#Temp2);
(3)模拟量滤波
采集10个值数据,去掉最大最小值求平均值,可以放到循环中断OB里执行。
#MAX := #AR[0];//初始化
#MIN := #AR[0];
#TOTAL := 0.0;
#TOTAL_FILTERD := 0.0;
FOR #INDEX := 0 TO 8 BY 1 DO//FIFO堆栈
#AR[#INDEX] := #AR[#INDEX + 1];
END_FOR;
#AR[9] := #IND;//加入新检测值
FOR #INDEX := 0 TO 9 BY 1 DO
//查找最大值
IF #MAX < #AR[#INDEX] THEN
#MAX := #AR[#INDEX] ;
END_IF;
//查找最小值
IF #MIN > #AR[#INDEX] THEN
#MIN := #AR[#INDEX];
END_IF;
//计算累加和
#TOTAL := #TOTAL + #AR[#INDEX];
END_FOR;
//计算滤波后累加和
#TOTAL_FILTERD := #TOTAL - #MIN - #MAX;
#D_FILTERD := #TOTAL_FILTERD / 8.0;
3.流量累积/定积分/微分
(1)在测量流量和线速度时有时需要对瞬时流量和速度进行累积,推荐官方例程“Totalizer”,资源条目号:48799854,其实就是循环时间内的数值累加。
图8:流量累积
(2)定积分和微分
积分是对给定函数曲线的面积进行数学计算。但是实际曲线往往没有明确的数学关系,而是随时间变化的模拟量。积分计算就是把所有由两个过程值与时间所围成的梯形区域面积相加,梯形面积等于两个过程值的平均值乘以时间间隔,像用编码器测量旋转角度可以使用到,资源条目号:42469594。
图9:定积分
微分与之相反,原理就不多说了,可用于计算速度和加速度之类。直接上链接资源条目号:48816209
图10:微分
写在最后:西门子提供了大量的基本功能块给大家,最终博途应用编程向“傻瓜”式编程进阶,也许再过几年行业标准库都给大家提供了,所谓编程变成熟悉工艺+调用功能块这个套路了。