本篇是PTP系列的第五篇。前四篇是本篇的基础。这一篇探讨一下容错。
为什么有些通讯程序可以长时间运行,而有些通讯程序在运行过一段时间后状态就变化了,不受控制了。原因就在本篇中。本篇探讨3个非常重要的问题:容错问题、等待时间、发送频率。这3个问题都可以归结为通信中的容错。
容错问题
我们知道,只要是通讯,就必然存在偶然性。什么是偶然性?比如:
线路受到干扰
通讯模块热插拔
编程可能存在未察觉的bug
在受到这些偶然外界干扰的情况下,我们的程序是否可以抵抗这些偶然性?是否仍能健康运行?这是一个挑战。
如何解决这个挑战?
我的答案是首先检测偶然性。比如某个信号本来应该只持续1个或者几个循环周期,但是该信号持续了数秒。说明什么?说明程序的状态已经在你编程的预料之外了,你的程序肯定无法应对当前这个局面了。这可以作为检测偶然性的标志。
比如一个轮询号码通常只会持续不会超过1秒种。但是如果某个轮询号码超过这个时间,说明通讯卡在了这个轮询对话上了。再比如发送的IDLE信号也应该不超过几百毫秒。还有很多信号都是这样的规律。我们在我们的程序中找到一个这样的信号作为检测出错的信号即可。
当程序检测出偶然性,说明当前的通讯已经出现了问题了。这时需要RESET。都RESET哪些内容呢?我的经验是:能RESET的都RESET,包括:模块的配置,发送配置,接收配置,接收缓冲区,轮询号码。总之能复位的都要复位,让程序回到上电后的状态。这样做,你的通讯程序就有了容错机制。有了容错机制的程序在碰到意外时可以重新运行。你的程序就解决了偶然性出错,程序就可以永恒的运行下去了。
容错程序何时投入?
有容错程序的通讯代码一般都是较复杂的通讯代码。那么容错程序在最开始调试时先不要投入使用,否则,自己容易乱阵脚,由从从容容转变为匆匆忙忙。当整个通讯代码都已经调试完毕了,最后投入容错程序,然后进行出错仿真,测试容错代码。
这里给1个检测容错性的方法:当通讯正常时,拔出通讯模块,然后再插入。如果程序能继续运行,那么程序通过了容错的测试。
等待时间
需要设置一个合适的等待时间。
等待时间是指本机ask后开始计时,在等待时间内通讯对方应该answer。如果在此时间内没有收到响应,那么认为超时。
等待时间应该是最长回复时间或者是正常回复时间的2-3倍。等待时间设置如果过短,那么可能漏掉对方的回复。如果设置过长,那么当有一个通讯对方失联时,整个通讯程序的轮询时间会变长。
发送频率
我们的PLC程序在通讯中大多数是主动方,也就是主站。如果通讯对方只有1个。在实践中,发现有些通讯对方回复的时间很不确定,从几十毫秒到一百多毫秒都有可能。这时要小心。因为有可能PLC主动向通讯对方发送的频率过高,导致通讯对方疲于应付。这时,就要减少发送频率。所以在我们的程序中要有能调节发送频率的机制,并且设置一个合理的发送频率。
本系列帖的结束语:
这个系列的帖子把通讯中要注意的问题都探讨的比较全了。全了的意思是未来给通讯编程时需要注意的问题不会超过这个系列帖子所探讨的范畴。当然一些低级错误我们不探讨,比如一个背景数据块用了2次。有缘浏览到帖子的伙计们以后遇到通讯的问题,都可以回来翻阅本系列帖,对照一下,看看可能是哪里的问题。这是本系列贴的意义之一。
本系列帖另外的一个意义是从系列帖中我们可以得到有益的启发。什么启发?编写PLC代码的启发。给通讯编写代码算是在PLC编程中比较难的。难的都了然于胸了,那么简单的还在话下吗?我们有这个自信。
好,就写到这里吧。也祝愿伙计们在日后给PLC编写代码时,能得心应手。
谢谢