最灵活的Modbus网关

BACRouter内置了一个强大的Modbus主站模块,但是基于现场的复杂性,它仍然不能很好的应对某些场景,比如:

  1. 点的值从寄存器3X0001读取,但是写时需要写到寄存器4X0001
  2. Modbus值1读入时,映射到BACnet值1,  但是写BACnet值1时,需要写10到Modbus。(Modbus主站模块的Lua脚本可以处理非对称的自定义类型的模拟对象的换算)
  3. 模拟对象或多状态对象映射到线圈或离散输入点的多个位。
  4. 只写的Modbus数据地址,读取时报错或无响应。

幸运的是,从固件版本v5.00起,我们引入了自由协议模块,可以用Lua脚本实现一个非常灵活的Modbus网关, 我们把modbus.lua 脚本托管于 github.com

modbus.lua定义的总线上所有设备采用相同的波特率/校验/超时参数。而对于Modbus主站模块,每个设备可以采用不同的设定。

用户应该首选尝试Modbus主站模块,因为Modbus主站模块内置的测试功能,可以方便用户在编辑映射时快速地验证。

当所有的常规点编辑完毕,可能留下几个古怪的点无法处理,但是请先对读操作进行验证。

接下来,请验证“编组读取”。

然后将Modbus设备的配置导出。

在github仓库中有一个 fcmbconv.py python程序, 请先安装 python 再运行它。它将提示你选择modbus.lua文件,再选择导出的Modbus设备配置文件,它会将其转换为自由协议总线配置文件。

然后在BACRouter的自由协议模块下导入上述配置文件。

最后编辑配置,处理那些古怪的点。

示例:

我们假设有一个这样的Modbus设备,除了几个常规点,还有:

  1. 模拟输出对象”lamp1″与”lamp2″从寄存器4X00032的位0与位1读取开关值,对应位为1值代表开,0值代表关。但是输出开关值,必须写到寄存器4X00031中,且对应位的1值代表关,0值代表开。
  2. 离散输入1X00008开始的8个位映射成模拟输入对象“temperature3″
  3. 4X00100是一个只写寄存器,读将无响应或报错。该寄存器的低字节映射为模拟输出对象”load1“,寄存器的高字节映射为模拟输出对象”load2″

首先我们配置一个Modbus主站模块的Modbus设置,配置文件: ExampleModbusDevice,  用“编组读取”测试验证
使用上述的 fcmbconv.py将其转为自由协议的总线配置文件:  FCModbus

将其导入到BACRouter的自由协议模块:

修改那些古怪的点配置。

如 lamp1:

如 temperature3:

如 load1 与 load2:

修改完毕后,使用Yabe 进行验证。假如脚本运行失败,请检查日志。

修改完毕的自由协议总线配置文件见:FCModbusFinal