End Sub
运行画面,按下按钮执行 r1.Read,r1变量包含定义的触发周期被注册,驱动将按周期读取r1变量(发送报文03 00 00 00 01),并更新数据库r2变量值及质量代码等实时数据,方法会等待并返回r2变量的值。然后执行 r2.Read,r2变量包含定义的触发周期被注册,驱动将按周期读取r2变量(发送报文03 00 01 00 01),并更新数据库r2变量值及质量代码等实时数据,方法会等待并返回r2变量的值。再执行 r3.Read,r3变量包含定义的触发周期被注册,驱动将按周期读取r3变量(发送报文03 00 02 00 01),并更新数据库r3变量值及质量代码等实时数据,方法会等待并返回r3变量的值。
但接下来,驱动并未重复发送一开始的三个报文,而是优化组合成了从起始地址3x400001(r1变量地址)请求3个连续寄存器的报文03 00 00 00 03。
接下来,修改下modbus slave,只配置400001与400002两个寄存器。
关闭画面(这时此画面注册的变量读取将被注销),再运行画面,执行上面的脚本。r1变量包含定义的触发周期被注册,驱动将按周期读取r1变量(发送报文03 00 00 00 01),并更新数据库r2变量值及质量代码等实时数据,方法会等待并返回r2变量的值。然后执行 r2.Read,r2变量包含定义的触发周期被注册,驱动将按周期读取r2变量(发送报文03 00 01 00 01),并更新数据库r2变量值及质量代码等实时数据,方法会等待并返回r2变量的值。
再执行 r3.Read,r3变量包含定义的触发周期被注册,驱动将按周期读取r3变量(发送报文03 00 02 00 01),由于读取的寄存器不存在,从站返回报文03 FF 83 02。驱动收到此报文后再次发送了报文03 00 02 00 01,同样从站返回报文03 FF 83 02。无法更新数据库r2变量当前值,质量代码更新为0x04 - bad - configuration error (value not accepted),方法会等待并返回r2变量的值。
接下来,驱动发送从起始地址3x400001(r1变量地址)请求3个连续寄存器的报文03 00 00 00 03。由于其中读取的寄存器3x400003不存在,从站返回报文03 FF 83 02。驱动收到此报文后再次发送了报文03 00 00 00 03,同样从站返回报文03 FF 83 02。无法更新数据库r2变量当前值。然后驱动会重复此过程,周期发送报文03 00 00 00 01、03 00 01 00 01、03 00 02 00 01、03 00 00 00 03,包含了很多无用的报文。
大家知道,对于每一个通讯驱动它的带宽是有限的,为了提高系统性能,优化项目中通讯是必须的。不然会造成如数据刷新慢,下发数据不成功等问题。所以,至少有一点要避免:访问AS中不存在的变量地址。
3.SetTagXXX/SetTagXXXWait
SetTagXXX/SetTagXXXWait的使用相对比较简单,选择哪一种主要根据具体应用来。
使用SetTagXXX函数(Asynchronous writing 异步写入),待写入的值会传送到变量管理,然后立即返回,并继续执行脚本。 至于这个值什么时候实际写入AS并不关心。
对于周期触发的写入,建议使用SetTagXXX。
但如果必须确保实际写入AS之后,才能继续执行脚本,那么就使用SetTagXXXWait(Synchronous writing同步写入)。如果没这些要求,一般都使用SetTagXXX,系统能得到更快的响应速度。
在C脚本中批量写入可使用SetTagMultiWait,但并没有对应的SetTagMulti。
就写到这,如果有什么问题可留言。