恭喜,你发布的帖子
发布于 2025-07-14 18:02:21
9楼
这是由于定时器的更新机制和一个扫描周期内要求的状态保持不协调造成的,调用定时器指令或使用定时器DB结构中的Q/ET时,定时器会更新,上面程序中直接使用了定时器的Q,这就造成定时器在一个扫描周期内会更新多次,CTU之所以不计数,是因为Q的沿跳变没有被扫描到。
系统手册中建议使用Q/ET管脚连接的变量来代替TimerIDB.Q/ET,这也是为了规避定时器在一个扫描周期内的多次更新,从而可以保证被使用的Q管脚连接的变量的状态保持一致。
而定时器的Q/ET管脚连接的变量,也就是Z版说的标志位,可以被看作是“中间层”,目的就是为了保证同一扫描周期内状态保持,从而与扫描周期琴瑟和谐。
计数器指令前置法,目的也就是解决了同一扫描周期内TimerIDB.Q状态不一致的问题,所以程序可以符合预期的执行,哪怕是你直接使用了TimerIDB.Q;当然,还是要适应使用标志位的“中规中矩”的用法,毕竟,计数器前置法不规范,空间前置只能是打补丁救急的,治标不治本;这就像面前有一条三四米宽的深沟,你可以选择直接手脚齐用助跑跳过去,也可以选择悠闲地走沟上的小桥通过;这也是Z版在上面不建议我说的内容的根本原因。
S7-1200系统手册中也列出了一些定时器的使用注意事项和禁忌,对它们有时可以反弹琵琶,逆向使用,但是注意不要被割到手。
这和FB中变量需要状态跨周期保持的情况下,需要使用static静态变量替换temp变量有些类似。
本质还是同一扫描周期内,状态值的“变”与“不变”的转换和使用。
请填写推广理由:
分享
只看
楼主