恭喜,你发布的帖子
发布于 2023-02-23 11:46:20
49楼
我做个小结,省得误导大家。
1、标题是开始遇到问题的时候命名的,PLC定时中断没有问题。开始遇到的问题原因是浮点数累积误差造成的,已经解决了。
2、现在的问题是程序中使用了10msTON定时器T34和100msTON定时器T250和T251,比对的结果是T34和定时中断累积时间一致,而100ms定时器T250和T251会出现幺蛾子。
我在程序中用200ms定时中断触发了一个子程序,这个子程序模拟运行中的长时间计算,用两个嵌套循环执行一个mov指令来模拟,并在主程序中调用,不在中断中调用。也就是说这个子程序其实并不是200ms执行一次。
分几种情况,以下是我的估计:
a/ 如果子程序执行时间比较短,远小于100ms,也就是子程序每200ms可以固定执行一次。那么T250这些100ms定时器工作正常。
b/ 如果子程序执行时间比较长,在200ms左右,定时中断可能会在一个扫描周期内触发两次,这样下次执行这个子程序可能不是在200ms以后,而是在下个扫描就执行。因为上个扫描已经触发了执行条件,而这个条件在上个扫描执行子程序前就复位了,有条件再次触发执行。这样就造成程序扫描周期不定时变长。可能会越来越接近每个扫描都是固定的200ms.
c/ 如果子程序执行时间比较长,超过200ms,和b/类似,但每个扫描很大机率被拉长成200ms.
如果模拟负荷的子程序触发条件改为在调用之后才复位,比如在最后才复位,让调用不能再两个扫描内都执行,这个还没有做测试。
但无论如何,我得到的现象是如果在运行过程中调整子程序的循环次数来模拟改变执行时间,才低到高和从高到低,T250和T251到有可能出现变快和变慢的情况。
T250和T251的复位我避免使用本身位信号来做复位,这也帮助手册中提到的注意事项。整体只使用了一次位信号来判断定时时间是否到达。复位逻辑使用了两种,一种是定时器位信号来驱动V位,由这个中间位来使定时器IN为false。另一种是由定时器位信号来清零定时器整型值,也就是复位定时器累积值。
100ms定时器T250和T251只在执行定时器指令时才更新,如果扫描中没有执行和多次执行都会造成定时器多计或少计。这个多计好理解,这个少计如何理解呢?
10ms定时器T34只在扫描开始时才更新,整个扫描中保持不变,是否意味着如果扫描中多次执行同一个定时器也不会有影响?
100ms定时器特别费解,背后机制时什么?按理说即使这次扫描中没有执行定时器,下个扫描执行了,不也可以把中间跨周期的定时值加上嘛。
请填写推广理由:
分享
只看
楼主