工业现场很多数据集合与时间有关。比如某压力传感器在一段时间内的数值会形成一个压力值集合。这种集合,是以观测值发生的时间作为标记的,称为“时间序列”。如果某算子运算是从时间序列中取出前一时间单位的值(并存储当前值),则称此算子为延迟算子(backshift operator)。工业现场用于计算压力传感器或流量计的波动值(判断是否有泄漏或流速静止),都可以基于延迟算子运算。今天这篇文章,我们用SCL语言来写一个延迟算子的函数块。
在博途环境下新建项目,创建函数块,命名为“backshift_operator”。双击打开该函数块,在变量声明区声明如下变量:
其中:
B:是一个单位时间,即某时间周期的倍数。比如,假设该函数被调用的时间周期为0.1秒(100ms),B取值15,则表示要获取15x0.1秒=1.5秒之前的值;
status:函数块运行的状态,具体描述见下面的代码;
value:要存储的值(比如压力传感器的数值)。该参数为IN/OUT(写/读)类型,要读取的值(算子运算的结果)也来自这里;
buffer:存储区,用来存储值,必须是数组;
stat_p_read:读指针(静态变量);
stat_p_write:写指针(静态变量);
编写代码如下图所示:
使用随机函数进行测试,如下图所示:
说明:
为了便于观察,我将调用函数的时间周期设置成1秒。形参B的值为15,则意味着返回15秒之前的数值。实际应用中应根据情况修改(比如0.1秒);
随机数函数请参考:西门子SCL编程实例——产生随机数的算法
好了,关于延迟算子运算就先介绍到这里。
下面是西门子SCL编程的文章归档链接:
我的书《西门子S7-1200/1500 PLC SCL语言编程 ——从入门到精通》从硬件到软件,比较详细的介绍了SCL语言的编程,感兴趣的话可以扫描下面的二维码查看:
发表评论