为了响应1847的号召,今天分享一个我们在PLC编程中一定会遇到的点,定时器。
在S5/S7-300/400/1500中,PLC内部包括了硬件定时器,也就是S5定时器。这些定时器的数量有限。CPU的性能越高,S5定时器的数量越多。为什么称为S5定时器呢?因为这些定时器都是继承自S5 PLC。虽然时间过去了40年,但是当前1500的S5定时器的特性与40年前S5 PLC定时器的特性完全相同。所以本篇不讨论S5定时器。本篇主要讨论IEC 定时器。
众所周知,IEC定时器是一个软定时器,定时器的数量是可以自己定义的。方便之处在于当编辑一个对象(FB)时,可以在FB内部随意定义定时器数量。这一特性在S7 所有系列的PLC中是相同的。但是本文主要阐述X00系列与1X00系列PLC关于IEC定时器的不同。这一点对于从S7-300/400移植到S71500的项目特别重要。下面具体分析。
图1是300CPU的一个间隔4秒钟就对count进行+1的程序。+1的程序在定时器前或者后都可以。

图 1
将以上程序移植到1500PLC,为了更容易说明问题,对程序进行了简化。可以观察到图2中COUNTER1与COUNTER2的结果并不相等,而在300中运行,2个计数器数值永远相等。在1500中程序执行的效果与在300中执行效果为什么不同?1500中执行的COUNTER2的值为什么远远小于COUNTER1的值?

图 2
出现结果迥异是因为,在1X00CPU中的IEC定时器的刷新机制与300/400不同。在300/400中,当程序执行到调用IEC定时器时,对定时器进行刷新,也就是说整个程序只刷新一次定时器。但1X00CPU程序中有4次刷新。第一次是在程序块第一行当读取timer1.Q的状态时进行IEC定时器刷新,第二、三次刷新在第二行。读取timer1.Q的状态时和调用定时器时进行刷新。第四次刷新是最后一行读取timer1.Q的状态时进行刷新。
这样就完全可以解释图2中的程序。
我们具体分析一下1500中的程序。在图2的第一行中,进行第一次刷新,如果此时定时到时,timer1.Q刷新后状态是1,那么会执行Counter1计数器+1的动作。当运行到第二行,由于定时器的En是0,那么定时器复位,当第二行运行结束时刻,timer1.Q状态是0。到了第三行自然不会对Counter2进行+1的操作。这种情况造成的结果就是第一行的计数器+1,而最后一行的计数器不会+1。
还有一种情况,当程序执行第一行时,timer1计时没有到100ms,而当执行第二行过程中,计时器恰好超过100ms,此时timer1.Q状态是1,所以counter2计数。由于这种情况的概率非常低,所以Counter2的计数比较低。
在1X00的梯形图中,为了避免上述情况,可以在定时器Q后赋值给一个bool变量,因为变量只在程序运行到调用定时器时才刷新。在程序的其他部分用这个bool变量替代timer.Q,这样就与300/400的特性保持一致了。
总结一下X00与1X00关于IEC定时器的不同:在X00中,只有在调用定时器时才会刷新定时器。在1X00中,只要访问了定时器对象中的任意变量,都会刷新定时器。这一点很类似面向对象编程中类的属性。当然在调用定时器时也会刷新定时器。
作为一个编程人员,对于IEC定时器的内容,了解到这里已经足够了。本文的标题是讨论2个时代的PLC关于IEC的异同,所以本文可以到此结束。但是如果本文到此真的结束了,那么会感觉缺点什么,意犹未尽。缺什么呢?
SIEMENS的PLC开发人员为什么在设计1X00PLC时不把X00的IEC定时器的特性直接搬过来?为什么要搞出不同的特性?为什么多此一举?这个疑问一直萦绕着我。
直到去年我开发SECS/gem系统软件时,我得到了答案。开发这个软件用的是SCL语言。开发完这个软件,我粗略的统计了一下,历时近1年的时间我写了几万行的SCL程序。所以我对SCL语言的有些体会。其中一个体会就是关于IEC定时器的。
我体会到:用文本编写代码一个重要的特征就是文本中的一些代码不一定每个扫描周期都运行。这一点与梯形图是不同的。所以在文本代码中,不能保证每次都能刷新到调用IEC定时器的代码。为此SIEMENS开发1x00的人员采用了文本编程语言中通用的做法:只要访问定时器对象中任何成员变量,那么在PLC的后台就会自动刷新定时器。
小总结:2个时代的IEC定时器表现不同的原因:在新时代用新型PLC,提倡用文本(SCL)方式给PLC编程。为了适应文本编程的特点,SIEMENS开发人员给IEC定时器赋予了新特性。
以上是一个合理的推测,所以本篇到此可以结束了。对本篇做个大总结。
本篇中讲解了大家容易忽视的在X00与1X00PLC中IEC定时器特性的差异。这是知其然。本篇还推测了X00与1X00有关IEC定时器差异的原因。这是知其所以然。对于我们搞技术的,既知其然也知所以然,心里就踏实了。
如果各位同仁觉得本篇对你有帮助,请帮忙点击“有帮助”。如果你希望本人还分享哪些内容,也可以告知我。如果问题比较典型,我会有动力继续与大家分享。