PLC中使用定时器是基本功能,大家在使用过程中也发现其实PLC提供的定时器并不好用,主要是定时器编号有限定,而且编号和定时器的时基是相关的,这些都需要记忆,给本来就机械记忆不足的我带了困难。实践中我们一般是用系统时钟对应的M来做自定义时钟的,这解决了上述问题,一直也比较好用。
最近加入了一个微信群,群主是个资深业内人士,带领大家讨论一些无聊的问题,当然也提供一些技术分享。其中有个定时器的设计比较有新意,打开来学习了下,我谈谈我的看法。(这个微信群不能深入讨论技术问题,群主也拒绝讨论)
基本原理很简单,就是把启动定时器时的系统时间(DTL型)存储在一个变量中,扫描时比较当前时间和启动时间的差值,看是否达到或超过预定时间。
奇妙的是设计的数据结构比较好玩,设计了500个关于编号和DTL变量的结构数组,也就是可以使用500个定时器,一个单元对应一个定时器,这个也比较普通。但是定时器接口并没有关于编号的接口,那怎么来知道使用的哪个单元的定时器呢?
这个就是设计者的技巧所在了,程序开始让编号为0(有一个当前编号的变量来指向定时器数组),第一个使用定时器的自动分配第0个单元,其后是第2个、第3个......。也就是扫描继续,编号顺次加1。
我谈谈体会,巧妙是巧妙,不过存在一些问题:首先是系统时钟DTL可能存在问题,我做的一个系统就需要PLC同步外部时钟,这个是用户手动同步的。这样就存在同步时定时错误带来的灾难。其次是设计者的小技巧带了的问题,也就是编号随扫描自动分配的问题。如果是普通的顺次执行的程序还好些,如果有根据不同要求随机选择执行次序的程序就不可能和使用时的定时器编号一一对应了,比如中断。虽然中断里面尽量不用定时器,当也并不是不可以。
再有一点小问题是设计者并不对500这个编号做越限判断,这个作为一个程序是有bug的。
限于群主的观点,我不提供原程序下载,希望我的描述是全面的了。