BACRouter内置了一个强大的Modbus主站模块,但是基于现场的复杂性,它仍然不能很好的应对某些场景,比如:
- 点的值从寄存器3X0001读取,但是写时需要写到寄存器4X0001
- Modbus值1读入时,映射到BACnet值1, 但是写BACnet值1时,需要写10到Modbus。(Modbus主站模块的Lua脚本可以处理非对称的自定义类型的模拟对象的换算)
- 模拟对象或多状态对象映射到线圈或离散输入点的多个位。
- 只写的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设备,除了几个常规点,还有:
- 模拟输出对象”lamp1″与”lamp2″从寄存器4X00032的位0与位1读取开关值,对应位为1值代表开,0值代表关。但是输出开关值,必须写到寄存器4X00031中,且对应位的1值代表关,0值代表开。
- 离散输入1X00008开始的8个位映射成模拟输入对象“temperature3″
- 4X00100是一个只写寄存器,读将无响应或报错。该寄存器的低字节映射为模拟输出对象”load1“,寄存器的高字节映射为模拟输出对象”load2″
首先我们配置一个Modbus主站模块的Modbus设置,配置文件: ExampleModbusDevice, 用“编组读取”测试验证
使用上述的 fcmbconv.py将其转为自由协议的总线配置文件: FCModbus
将其导入到BACRouter的自由协议模块:
如 lamp1:
修改完毕后,使用Yabe 进行验证。假如脚本运行失败,请检查日志。
修改完毕的自由协议总线配置文件见:FCModbusFinal