能用上modbus的,都不会是光用一条MSG指令的。用modbus图啥?当然是希望很少的硬件资源控制很多下位了。
这样的话一个程序里面就不止一两个MSG了。
比如说一个程序写5个变频器的给定。使用了5条MSG指令。每条指令都按规矩组织好了轮训。暂且避开一些错误或容错纠错不谈。只谈下面的一种现象。
通常这种结构的通讯,写好了轮训,基本就不用干预通讯的事情了。程序执行pid什么的算出了变频器的给定,就可以一下子给到msg的参数,然后msg该干啥干啥。程序pid算出什么变频器就做出什么反应。一切都相当的美好。
然而,有人按照这种架构布置在另一个程序里面,而这个程序也是给定几个变频器。但是有一点变化,就是数据的来源不是pid,而是触摸屏。触摸屏修改了一次频率然后就传送一次到plc,plc就下发到变频器。这次也成功通讯。
再后来,由于变频器数量多了,而且一个变频器读写的量也多了。几十条的msg指令只能分时轮询写入变频器而不采取全部轮询,采取变化就写,不变就不写。
然而却发现有时候触摸屏明明修改了频率,但是变频器就是没有发生变化。好比44改到50,变频器仍然是44运行。但是屏幕上确实50啊。无奈把50修改,但是就算不从新输入只是确认一下,变频器有时也可以成功变到50运行。久而久,看看程序发现在按确认的时候msg产生了6的报警。由于已经输入了50不变化,此msg指令也停留在报警的状态没有消除。才发现。
最后只能怀疑这个怀疑那个,不再使用“变化才写入”这个策略。
然而,有一种情况一般很难发现。
假设现在只有一个msg指令,并且遵守触发原则。但是,在触发了,并且Done位没有on的这段期间,修改了数据这个管脚的间接寻址的目的位置的值。也就是变频器的给定频率这个参数。会造成报警6。
由于屏幕修改的参数只有在变化的时候才向plc提交一次通讯更新请求,请求过之后就不再变化,不再请求了。然而,这次的请求却正好发生在上一个通讯的进行阶段。(可能上一个通讯是本变频器运行指令的写入。)所以msg没有发送这次的信息了。
但是最令你意想不到的事情是,msg报警号是6 。
为何前面的都可以?我一直都是这样用的,都没事。这句话大家都用过,大家都听过。
原因是前面的是不间断地写入。后来的是变化才写入。其实前面的pid可能写很多次都是报警6,但是总会有那么一次碰巧不报警了,成功了。但是因为通讯的速度很快,电脑监视和人眼根本不察觉已经报过很多次6。中期,虽然是屏只写一次刷新,但是也属于不间断的通讯,总可以写入期望的值。而到了后期,是间断写入,每一次写入都必须成功的。此时就发现了很多不成功的事实了。但是苦于报警指向不准确,很多人无法排除这样的错误。有条件轮训这种策略就只能止步在这里了。