用 C 实现自己的定时器:靠扫描周期累加,比梯形图定时器更灵活,也能写出梯形图难写的时序。
说到定时器,梯形图上一个 TMR 就够了。可这节课我们偏要用 C 重写一遍——把黑箱拆开,看看定时器内部到底在数什么。数清楚了,C 里那几行才不神秘。
先复习内存约定。C 功能块靠一块内存跟 PLC 对话:W 开头的数组对应 HD 寄存器,B 开头的对应 HM 位。入口固定叫 plc_main,每个扫描周期被调用一次,就这么简单。
一个定时器就仨要素:使能 IN、预设 PRE、已经计了多久 ET。在 C 里就是仨寄存器:HD0 放使能,HD1 放预设,HD2 拿来记当前计到多少。每拍给 ET 加一,这是心跳。
计到预设就报警:ET 一到数就置输出 Q。这里有个细节——Q 得一直保持为 1,所以比较得用大于等于,不是大于。用大于的话,ET 正好等于 PRE 那一刻反倒会漏一拍。
合到一块其实没几行:使能通就每拍加一,加到预设置 Q,使能断就清零。C 好处是每一步都摊在明面上,逻辑一改就改,不像黑箱只能干看着。
最后是复位。使能一断,当前计时清零、输出落下,下次通使能从头再计——这是定时器该有的样子。梯形图 TMR 也这样,断开 IN 计数归零。写 C 一样,别把状态忘了重置。