在对多个从站、多条数据进行modbus通讯时,如果全部以轮询的方式来对数据进行读写,可能会导致通讯周期的大幅延长。 在实际应用中,轮询读数据是有必要的。但写数据时,一般不需要轮询写。 那么我们可以考虑将写这一操作独立出来,在需要的时候再进行写操作,不需要的时候则直接跳过写这一过程。 如图,主站分别读写两个从站的数据。分别读1条,写1条数据。 初始化,将vw100赋值为1,vw102赋值为1 设置modbus通讯参数 1、读1号从站数据 2、读2号从站数据 3、写1号从站数据 4、写2号从站数据 vw100是能流控制,用来确定本条modbus指令是否执行。 vw102是跳转长度,用来确定下一个执行哪条modbus指令。 可以看到,用这种方式,在读取数据的时候,如果不触发v50.0写标志,那么程序会一直轮询读取从站1和2的数据,而不会执行写操作。 而当我们想要向从站写数据时,只需要触发v50.0写标志,这时程序会在本条数据读完成之后,立即停止读操作,转而去写从站1和从站2的数据。当写完成之后,又会自动跳转回到读操作中来,继续轮询读操作。 如果通讯的从站数量太多时,还可以以站号为单位,通过条件来控制读写跳转,做到一次只写一个从站的数据。 还是以两个从站为例,主站分别读每个从站一条数据,写每个从站一条数据。 1、读从站1数据 2、读从站2数据 3、写从站1数据 4、写从站2数据
这里规定 写从站号 = 0时,写全部数据;为1时,只写从站1的数据;为2时写从站2的数据。 可以看出,当写从站号为0时,触发v50.0写标志。那么程序会按照跳转长度一步一步执行写操作,直到写完最后一个数据,回到读操作。 当写从站号为1时,触发v50.0写标志。那么程序会在写完从站1的数据之后,马上回到读操作中去。而不会继续写从站2数据。 当写从站号为2时,触发v50.0写标志。那么程序会在写完从站2的数据之后,马上回到读操作中去。而不会去写从站1数据。 利用这种方法,能做到及时去写一些必要的参数,而不去写一些不相关的数据,这样可以有效地减少modbus通讯的读写周期。 另外像如下图这种按条件跳转的指令,当从站太多时,会变得非常复杂。 那么我们可以考虑利用数学公式来计算每一个从站的起始位置,这样可以减少程序的复杂程度。例如像上面的示例程序,按从站号跳转指令就可以写成这样: 要使用数学公式这种方法的话,只要在安排每个从站读写的能流控制位vw100时,遵循一定的数学规律即可。
|