| 作者 | 主题 |
|---|---|
|
洵少爷 游民
经验值:143 发帖数:12 精华帖:0 |
楼主
主题:CTU计数器不计数 我写程序时发现一个问题,定时器可以正常动作,但是计数器不计数,改成起保停电路后,就可以计数,不知道原因,还请各位指点一下。 这是不计数的程序 这是计数的程序
为何不计数呀?按照时序来分析,T1动作后,应该马上就会计数才对啊 |
|
'Razor 至圣 经验值:24443 发帖数:3206 精华帖:41 |
9楼
主题:回复:CTU计数器不计数这是由于定时器的更新机制和一个扫描周期内要求的状态保持不协调造成的,调用定时器指令或使用定时器DB结构中的Q/ET时,定时器会更新,上面程序中直接使用了定时器的Q,这就造成定时器在一个扫描周期内会更新多次,CTU之所以不计数,是因为Q的沿跳变没有被扫描到。 系统手册中建议使用Q/ET管脚连接的变量来代替TimerIDB.Q/ET,这也是为了规避定时器在一个扫描周期内的多次更新,从而可以保证被使用的Q管脚连接的变量的状态保持一致。 而定时器的Q/ET管脚连接的变量,也就是Z版说的标志位,可以被看作是“中间层”,目的就是为了保证同一扫描周期内状态保持,从而与扫描周期琴瑟和谐。 计数器指令前置法,目的也就是解决了同一扫描周期内TimerIDB.Q状态不一致的问题,所以程序可以符合预期的执行,哪怕是你直接使用了TimerIDB.Q;当然,还是要适应使用标志位的“中规中矩”的用法,毕竟,计数器前置法不规范,空间前置只能是打补丁救急的,治标不治本;这就像面前有一条三四米宽的深沟,你可以选择直接手脚齐用助跑跳过去,也可以选择悠闲地走沟上的小桥通过;这也是Z版在上面不建议我说的内容的根本原因。
这和FB中变量需要状态跨周期保持的情况下,需要使用static静态变量替换temp变量有些类似。 本质还是同一扫描周期内,状态值的“变”与“不变”的转换和使用。
少即是多
|
|
'Razor 至圣 经验值:24443 发帖数:3206 精华帖:41 |
10楼
主题:回复:CTU计数器不计数可以再引申一下,PLC编程本质即是在严格的时间约束下管理对立要素的辩证关系。 对立要素如ON/OFF、保持性\易失性、局部变量\全局变量、有返回值\无返回值、旧值(上一扫描周期值)\新值(当前扫描周期值)、正跳变\负跳变、同步执行\异步执行、数据操作的破坏性\非破坏性、线性扫描\事件驱动、持续状态(电平)\瞬时状态(边沿)、恒值\变值等等,这些东西往往又漫散分布于手册的边边角角。 天有日月,地有山河;一边误传,一边误学。
少即是多
|