之前跟一个乙方电气工程师探讨他们的程序,发现一个很不错的另类的计时应用技巧,适合一些对于计时精度不高的场合,现分享给各位共同探讨学习。
一般的计时器都是使用系统自带的TON,TOF等,这种方式需要生成背景数据块,使用量较大的时候就会对cpu的性能、运算效率和内存有影响,而这种方法不会单独生成背景数据块,具体思路如下
1.OB1主程序运行每个扫描周期会有个扫描时间,这个时间可以通过取消OB1优化块访问,在接口区TEM区获得一个“PREV_CYCLE”的变量,是上一次OB1的扫描时间,在OB1中将这个变量赋值给一个int类型的全局变量“Last_Cycle”供调用
2.在程序中需要用到计时的区域新建一个int类型的变量,用于存储累加计时时间此处用的是"Timer",当触发条件为true时,开始执行计时累加,每过一个扫描周期,Timer就把上个周期的扫描时间累加起来,当累加时间达到设定的触发值时,则输出计时结果,同时把触发信号置FALSE,防止一直计时,超时INT最大值后会溢出从负值开始循环累加
以下为示例,设置为3S,因为精度是ms,所以下面的设定值是3000
IF "Trigger" THEN
"Timer" += "Last_Cycle";
IF "Timer" > 3000 THEN
"Trigger" := FALSE;
"Err" := TRUE;
END_IF;
ELSE
"Timer" := 0;
END_IF;
3.此方式的优缺点
优点:相比TON不占用系统内存,不用单独的db块存储计时器,提高系统效率(这个没有有效证据证明,自我感觉)
缺点:计时精度较差,受OB扫描周期影响,无法胜任高精度场合
欢迎各位一期探讨,同时对于TON计时器,我还有个疑问,如果TON不是在中断OB里调用的话,实际的计时结束后是不是要等到下一个扫描周期才会有输出?好比触发计时1s结束时,实际有输出已经是触发条件后1S+一个扫描周期的时间,请各位指教。