正在查看旧版本。 查看 当前版本.

与当前比较 查看页面历史记录

版本 1 当前 »

本文为实现modbus协议转换提供技术上的总体思路,具体实现需根据实际情况来确定。

需求说明

FSU对南向设备进行数据采集、控制,进行协议转换,对上层平台提供modbus协议来读写南向设备,屏蔽底层南向设备的交互细节,实现上层平台与底层南向设备协议间的解耦。

  1. 协议生成:

    平台层使用的是一份由GatewayServer自动化生成的modbus协议文档
  2. 协议配置:

    GatewayServer支持web配置modbus协议
  3. 协议实现:

    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子模块。

  • 无标签