本文为实现modbus协议转换提供技术上的总体思路,具体实现需根据实际情况来确定。
需求说明
FSU对南向设备进行数据采集、控制,进行协议转换,对上层平台提供modbus协议来读写南向设备,屏蔽底层南向设备的交互细节,实现上层平台与底层南向设备协议间的解耦。
协议生成:
平台层使用的是一份由GatewayServer自动化生成的modbus协议文档协议配置:
GatewayServer支持web配置modbus协议协议实现:
modbus要同时支持tcp和rtu
需求拆分
协议生成
数据定义
uint32_t regAddr; //寄存器地址 uint16_t regNum; //单个meter包含的寄存器数量 int regSize; //寄存器总个数(这一轮里面,-1时表示无效) CData deviceID; //设备id bool meterBit = false; //meter是否是一个bit对应一个量(如果是的话,regNum和regSize都必须为1) int meterBitSize; //meterBit为true时才有效(有效时指定有效的bit位个数) CData type; //解析的数据类型 double factor; //当前的数值需要乘以多少 CData access; //读写权限 bool def = false; //是否有默认值(默认值为false) double defVal; //如果有,默认值为多少 bool range = false; //数据是否有数据范围(默认为false) double rangeMin; //如果有范围,此范围的最小值 double rangeMax; //如果有范围,此范围的最大值 //下面这两个只有主meter才会有此字段 bool distance = false; //是否有距离间隔 int distanceVal; //如果有,每组meterList之间间隔的寄存器值是多少 int step = 1000; //量id之间的变化基数(默认为1000) int highLowPos = -1; //解析方式是否按高16位和低16位解析(小于0表示不按照高低位解析,0表示低16位,1表示高16位)
协议格式
<?xml version="1.0" encoding="UTF-8" ?> <version>1.00</version> <devices> <!-- 系统状态r --> <device deviceId="5000001" name="系统状态"> <meter regAddr="0" regNum="1" regSize="1" meterID="312005001" meterBit="false" meterBitSize="0" type="u16" factor="1" access="r" default="true" defaultVal="1" range="false" rangeMin="0.1" rangeMax="10.0" distance="false" distanceVal="0"/> <meterList> <meter regAddr="1" regNum="1" regSize="1" meterID="312006001" meterBit="false" meterBitSize="0" type="u16" factor="1" access="r" default="false" defaultVal="0" range="false" rangeMin="0.1" rangeMax="10.0" step="1"/> </meterList> </device> </devices>
协议配置
页面原型
在配置管理增加Modbus配置入口
协议实现
GatewayServer解析xml配置文件,将xml配置文件包含的量存放到缓存中,采取定时获取meter值和订阅meter值变更时间的方式更新数据。根据web页面是否开启tcp、rtu服务,来启动tcp、rtu子模块。