如何使Modbus轮询速度提高?

分享到:
1495
下一篇 >

  菜鸟案例:

  我现在读和写,用的是1S脉冲,加上计数器,当计数值等于1,的时候,读参数值。当计数值等于2的时候,写参数值。但是这样速度慢,想问下,大家有没有快一点的读写轮询方法,用时间控制的方法效率不是很高,如果要读写多台设备的话,整个周期会延长很多时间

  大虾:

  你是不是用modbus库?

  上面有Done位可以通知你任务已经完成了。你可以用*快速度去提交下一轮的通讯请求。

  通讯只需要用常规的生活经验就可以理解了。

  程序是一个角色。通讯口是一个角色。下位通讯设备是一个角色。

  程序是如何演绎,全凭你的剧本。

  通讯口已经通讯完了,并且已经给足反应你了举起手了。你程序不去看不去管,偏偏就是要等下一秒。那就是你的事情了。

  菜鸟:

  你好,这个我有试过,但是不知道怎么回事,我也是用Done的触发下一个信息读取,但是等下Modbus就会报错,错误代码是6,而且好像要初始化,把Done复位掉吧,我自己编写的时候,没调试成功,所以想麻烦问下,有没有例子,或是我在自己编写的方法不对,能请教下?

  大虾:

  出错后不用管的。只要下一轮通讯正常的话那个错误标志会自己变0的。

  我说的那个贴我自己找不到了。

  这个库我说说几个要点。我只用过主机程序,从机的没有用过。

  ctrl指令两个触点长期接通就可以了。参数的话看着调吧。

  MSG指令的EN位问题比较麻烦。长期接通不是办法,除非只有**的一个信息向外发送。多于一个信息的话就要切换开关状态,让出通讯。

  要在什么时候断开呢?

  当done位由0变1的时候,下一个周期就不要再执行这个MSG了。要把EN断开。是切换的时候了。当然不切换也不会错的,只是一直发送多余的相同的内容罢了。(如果你是从机,你烦不烦啊?一直在唠叨同一个事情)

  这个0变1可能伴随着出错编号的产生,你要马上记下出错编号。因为下一个MSG可能使用到相同的出错编号地址。出错不影响你的切换。

  first触点。无论如何请只给一个周期的信号就好了。多了只会坏事。如果信息内容变更了,就要把这个触点断开一个周期然后重新接通。还有一个要点。在EN位断开之前的一个周期,first位一定要先断开,这样才会在下次调用MSG子程序的时候可以产生上升缘。否则,又有机会说错了。

  几个MSG参数不个别说了。手册都有。我说手册没有的。在first发出了信号之后Done位会在本个周期变0 。表示正在工作。这个0的期间不要更改任何参数,包括*后一个间接寻址里面的值。因为通讯过程中一直要读这些地址内容。一变了的话就会这个错那个错的了。很多人用通讯去修改变频器的速度给定,随时想改就改,未有理会Done位。结果在不该改的时候改了。结果就产生了通讯错。很莫名其妙的错。然而,这个错可能没有检测程序跟踪就溜走了。轮到了下一轮通讯的时候恰好又通讯正常了。结果就掩盖了刚才的错误,表面上看变频器一直都在工作,谁又会怀疑刚才已经发生了错误。*好是在EN位OFF的时候更改。

  这个游戏是比较难玩。稍稍一错,就完了。也不知道哪里错。手册也没多说。只能面对着设备沉浸一段时间,否则一出错就打消了使用的念头了。

  菜鸟:

  你能有例子看下就好了,做了几次试验,发现不行,比如图说我模拟通信线断线,然后又重新接上去,也有做一个按钮复位,效果不太好,还是需要复位,我也有在程序加入判断故障的比较指令,就是当出现错误代码时,自动复位相关位,但是没有达到效果,是不是该用定时中断,还是有别的办法。

  大虾:

  我这几天都是站在设备面前在自己摸索通讯。没有人教的。外面有个我的热贴看了没有?通讯的。

  问到有人回答就好,没有人回答就自己想办法。通讯调度的事情只能谈到方案为止。再深入的话就是程序了。程序的话只能对着设备问设备。谈程序的话没法谈的。你以为是单键启停这么简单的程序啊。有个人问按钮自锁程序为什么不自锁啊?其实他自锁的触点用了别的线圈的触点,当然不自锁啦。

  高手:

  对以Modbus通讯,一般情况下主机都是读取数据的。写数据的情况只有需要写的时候才写,否则只是读。如果每周期都读/写操作,程序逻辑写起来会很麻烦的。而且效率非常非常的低。

  一般情况下,有写操作就先写操作一次,写完后不管成功与否都重置为读操作。

  用完成标识、超时/错误标识、定时器重置通讯标识来触发下一条通讯指令。

  每个从机分配多一个存储单元来存储错误恢复通讯次数,当次数为0自动再次发送指令,否则跳过继续判断下一台从机。

  做到上面这写,你就可以在多从机环境下**化通讯了。

  比如有16台从机,那么其中有15台同时通讯中断只有一台通讯正常时,基本能保证不会每个周期都循环16台从机浪费时间,使得单独一台都能有很好的通讯操作响应。

  我做的多从机环境下,基本上是通讯中断的从机会强加30~60秒后再从试,不让它每个周期都判断,节省通讯周期。

  菜鸟:

  额,我知道用时间写是很慢,用Done试过了,但是就像你说的,万一有一台出现故障,那就会无法正常读取和通信了,所以想问下,你的写入时靠什么去出发的,能说详细点,我刚开始用有很多不明白的地方,麻烦了。

  高手:

  写入靠三个条件(1 Done/2通讯错误/3自定义定时器时间到达)任一满足来触发的。

  所有设备都正常时,Done可以*快速触发下一条通讯命令;

  通讯质量不高时,通讯错误可以*快剔除不安分的从机减少所有设备扫描周期;

  自定义定时器超时可以保证通信响应延时或者数据帧比较长时/或者在上面两种情况都无效时重新启动通讯。

  一般来说吧,定义一个连续的存储区域来保存通讯数据,*后一个Word就用来保存通讯状态字。

  在通讯初始化时把所有从机的通讯状态字都清零;

  在读/写设备时有通讯错误就把数值30写入状态字(只要通讯有错误就把从机推迟到30个周期后再检测是再次通讯上);

  每秒钟或者每个通讯扫描周期都去判断余下从机的状态字。如果状态字小于等于0则把当前从机通讯指令写入通讯发送缓存;如果状态字大于0则状态字-1。

  这种做法,可以保证16台从机在有15台同时通讯中断的情况下,在29个周期内**通讯正常的从机都能得到*短的单机扫描周期响应时间。

  比如错误重试定义为30秒,超时定义为250ms,那么*糟糕的1:15的情况下每4秒钟都有连续1.5秒的可连续操作时间而不用每次操作都要等待4秒才能响应操作。在1.5秒内任意读写操作都可以立刻得到响应。

  如果15台从机不是同时通讯中断而是间隔2个扫描周期的话,那么每400ms左右都可以得到响应。

  这种做法是我在PLC多从机通讯应用中能做到的比较折中的方案了。。。

  至于中断方式就没必要了,因为没做过运动控制系统。

你可能感兴趣: 工控菜鸟园 变频器 PLC 自动化系统 SIMATIC S7-200
无觅相关文章插件,快速提升流量