就是仪表说明书,方便个人查阅的.
L-mag电磁流量计转换器
通讯协议
版本号:LMAGmodRTUv77
2012-10-12
目录
一、概述 - 2 -
二、L-mag网络结构及接线 - 2 -
三、Modbus协议RTU帧格式 - 2 -
四、Modbus协议命令编码定义 - 4 -
五、L-mag电磁流量计MODBUS寄存器定义 - 5 -
1. L-mag电磁流量计MODBUS寄存器地址定义 - 5 -
2.PLC地址设置说明 - 5 -
3.组态王地址设置说明 - 6 -
4.数据含义说明 - 6 -
六、通讯数据解析 - 7 -
1读瞬时流量 - 7 -
2.读瞬时流速: - 8 -
3读累积流量 - 8 -
5.读总量流量单位 - 10 -
6.读报警状态 - 10 -
七、应用举例 - 11 -
1.C语言MODBUS 示例程序 - 11 -
2.modbus调试软件 modbus poll通讯实例 - 13 -
3.modbus调试软件modscan32通讯实例 - 15 -
4.组态王6.53通讯实例 - 17 -
5.力控6.1通讯实例 - 21 -
6.MCGS通讯实例 - 24 -
注:本协议应用举例中例程只提供参考,例程中部分参数与MODBUS寄存器地址定义不符,请以MODBUS寄存器地址定义为准。
一、概述
L-mag电磁流量计具有标准的MODBUS通讯接口,支持波特率1200,2400,4800,9600,19200。通过MODBUS通讯网络,主站可以采集瞬时流量,瞬时流速,累积流量等参数。
L-mag电磁流量计采用的串口参数:1位起始位 8位数据位 1位停止位,无校验。
L-mag电磁流量计的MODBUS通讯接口在物理结构上采用电气隔离方式,隔离电压1500伏,并具有ESD保护,能够克服工业现场的各种干扰,保证通讯网络的可靠运行。
二、L-mag网络结构及接线
L-mag电磁流量计标准MODBUS 通讯网络是总线型网络结构,支持1到99个电磁流量计组网,在网络最远的电磁流量计通常要在通讯线两端并联一个120欧姆的终端匹配电阻,标准通讯连接介质为屏蔽双绞线。
图-1 电磁流量计网络结构
L-mag电磁流量计通讯接线详见电磁流量计使用说明书。
三、Modbus协议RTU帧格式
MODBUS协议是主从通讯方式,每次通讯由主站发起,从站响应主站命令回传数据。
L-mag电磁流量计采用MODBUS RTU格式(十六进制格式),其帧结构如图-2所示。
1.主站命令帧结构
帧起始 | 设备地址 | 功能代码 | 寄存器地址 | 寄存器长度 | CRC校验 | 帧结束 |
---|---|---|---|---|---|---|
T1-T2-T3-T4 | 8Bit | 8Bit | 16Bit | 16Bit | 16Bit | T1-T2-T3-T4 |
图-2 主站 RTU消息帧
2.从站响应帧结构
帧起始 | 设备地址 | 功能代码 | 数据 | CRC校验 | 帧结束 |
---|---|---|---|---|---|
T1-T2-T3-T4 | 8Bit | 8Bit | n个8Bit | 16Bit | T1-T2-T3-T4 |
图3 从站RTU消息帧
说明:
(1)T1-T2-T3-T4为帧起始或帧结束,MODBUS 协议规定帧起始或帧结束是在帧与帧间延时3.5 char字符的时间实现的,如图-4所示。
图-4 MODBUS 帧间隔
(2)设备地址:电磁流量计的通讯地址,在一个网络中不能有两个相同的地址。
(3)功能码:MODBUS 协议规定的功能码,L-mag电磁流量计采用功能码4读输入寄存器来实现采集数据的。
(4)寄存器地址和寄存器数
主站命令中的参数是从寄存器地址开始的寄存,读寄存器长度的N个寄存器。
(5)从站响应数据
从站响应数据是:字节数和N个数字节数据。
详见MODBUS 协议。
四、Modbus协议命令编码定义
MODBUS功能码定义如表-1所示,L-mag-电磁流量计仅采用04功能码。
表 -1
功能码 | 名称 | 作用 |
---|---|---|
01 | 读取线圈状态 | 保留 |
02 | 读取输入状态 | 保留 |
03 | 读取保持寄存器 | 保留 |
04 | 读取输入寄存器 | 读电磁流量计实时信息 |
05 | 强置单线圈 | 保留 |
06 | 预置单寄存器 | 保留 |
07 | 读取异常状态 | 保留 |
08 | 回送诊断校验 | 保留 |
09 | 编程(只用于484) | 保留 |
10 | 控询(只用于484) | 保留 |
11 | 读取事件计数 | 保留 |
12 | 读取通信事件记录 | 保留 |
13 | 编程(184/384 484 584) | 保留 |
14 | 探询(184/384 484 584) | 保留 |
15 | 强置多线圈 | 保留 |
五、L-mag电磁流量计MODBUS寄存器定义
Protocol Addresses(Decimal) | Protocol Addresses(HEX) | 数据格式 | 寄存器定义 |
---|---|---|---|
4112 | 0x1010 | Float Inverse | 瞬时流量浮点表示 |
4114 | 0x1012 | Float Inverse | 瞬时流速浮点表示 |
4116 | 0x1014 | Float Inverse | 流量百分比浮点表示(电池供电表保留) |
4118 | 0x1016 | Float Inverse | 流体电导比浮点表示 |
4120 | 0x1018 | Long Inverse | 正向累积数值整数部分 |
4122 | 0x101A | Float Inverse | 正向累积数值小数部分 |
4124 | 0x101C | Long Inverse | 反向累积数值整数部分 |
4126 | 0x101E | Float Inverse | 反向累积数值小数部分 |
4128 | 0x1020 | Unsigned short | 瞬时流量单位(表3) |
4129 | 0x1021 | Unsigned short | 累积总量单位(表4/表5) |
4130 | 0x1022 | Unsigned short | 上限报警 |
4131 | 0x1023 | Unsigned short | 下限报警 |
4132 | 0x1024 | Unsigned short | 空管报警 |
4133 | 0x1025 | Unsigned short | 系统报警 |
PLC设置时如果没有功能码设置项时,使用功能04应在寄存器地址前面加3。另PLC寄存器地址的基址是从1开始,所以PLC设置寄存器地址时应在原地址上加1.
例:
L-mag电磁流量计MODBUS寄存器地址为4112(0x1010),MODBUS功能码为4时,PLC寄存器地址为34113。
详细设置见应用举例章节2.
组态王设置时没有功能码设置项,不同的驱动设置方法不同。
以PLC-莫迪康-modbus(RTU)驱动为例,使用功能04应在寄存器地址前面加8。另组态王寄存器地址的基址是从1开始,所以组态王设置寄存器地址时应在原地址上加1.
L-mag电磁流量计MODBUS寄存器地址为4112(0x1010),MODBUS功能码为4时,组态王寄存器地址为84113。
详细设置见应用举例章节4.
(1)浮点格式:
L-mag电磁流量计 MODBUS 采用 IEEE754 32位浮点数格式,其结构如下:(以瞬时流量为例)
0X1010(34113) | 0x1011(34114) | ||
---|---|---|---|
BYTE1 | BYTE2 | BYTE3 | BYTE4 |
S EEEEEEE | E MMMMMMM | MMMMMMMM | MMMMMMMM |
S-尾数的符号;1=负数,0 = 正数;
E-指数;与十进制数127的差值表示。
M-尾数;低23位,小数部分。
当E不全”0”时,且不全”1时浮点数与十进制数转换公式:
(2)瞬时流量单位
表 3
代码 | 瞬时单位 | 代码 | 瞬时单位 | 代码 | 瞬时单位 | 代码 | 瞬时单位 |
---|---|---|---|---|---|---|---|
0 | L/S | 3 | M3/S | 6 | T/S | 9 | GPS |
1 | L/M | 4 | M3/M | 7 | T/M | 10 | GPM |
2 | L/H | 5 | M3/H | 8 | T/H | 11 | GPH |
(3)累积总量单位
表 4(适用于B型及511型电磁流量计转换器)
代码 | 0 | 1 | 2 | 3 |
---|---|---|---|---|
累积单位 | L | M3 | T | USG |
表 5(适用于C型电磁流量计转换器)
代码 | 0 | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|---|
累积单位 | L | L | L | M3 | M3 | M3 |
代码 | 6 | 7 | 8 | 9 | 10 | 11 |
累积单位 | T | T | T | USG | USG | USG |
(4)报警
上限报警,下限报警,空管报警,系统报警表示:
0-----不报警;1----报警
六、通讯数据解析
瞬时流量,瞬时流速,流量百分比,流体电导比,正反向累积量小数部分以浮点数的格式传输。正反向累积量的整数部分以长整型数传输。
主站发送命令(十六进制)
01 | 04 | 10 | 10 | 00 | 02 | 74 | CE |
---|---|---|---|---|---|---|---|
设备地址 | 功能码 | 寄存器地址高位 | 寄存器地址高位 | 寄存器长度高位 | 寄存器长度低位 | CRC高位 | CRC低位 |
主站接收到数据:
01 | 04 | 04 | C4 | 1C | 60 | 00 | 2F | 72 |
---|---|---|---|---|---|---|---|---|
设备地址 | 功能码 | 数据长度 | 4个字节浮点数(瞬时流量) | CRC高位 | CRC低位 |
浮点数 C4 1C 60 00
1100 0100 0001 1100 0110 0000 0000 0000
浮点数字节1 浮点数字节2 浮点数字节3 浮点数字节4
S=1: 尾数符号为1表示是负数。
E = 10001000: 指数为 136
M= 001 1100 0110 0000 0000 0000,尾数为
= -625.5
主站发送命令:
01 | 04 | 10 | 12 | 00 | 02 | D5 | 0E |
---|---|---|---|---|---|---|---|
设备地址 | 功能码 | 寄存器地址高位 | 寄存器地址高位 | 寄存器长度高位 | 寄存器长度低位 | CRC高位 | CRC低位 |
主站接收数据:
01 | 04 | 04 | C1 | B0 | 80 | 00 | A6 | 5F |
---|---|---|---|---|---|---|---|---|
设备地址 | 功能码 | 数据长度 | 4个字节浮点数(瞬时流速) | CRC高位 | CRC低位 |
浮点数为: C1 B0 80 00
1100 0001 1011 0000 1111 1000 0000 0000
S = 1
E = 10000011
M = 011 0000 1111 1000 0000 0000
= - 22.0625
为了能够完全表达电磁流量计的9位累积值,所以把累积流量的整数和小数部分分别表达。整数部分用长整型变量,小数部分使用浮点数。
累积流量为1587m3
主站发送采集累积流量整数值命令:
01 | 04 | 10 | 18 | 00 | 02 | F5 | 0C |
---|---|---|---|---|---|---|---|
设备地址 | 功能码 | 寄存器地址高位 | 寄存器地址高位 | 寄存器长度高位 | 寄存器长度低位 | CRC高位 | CRC低位 |
主站接收到数据:
01 | 04 | 04 | 00 | 00 | 70 | 71 | 1E | 60 |
---|---|---|---|---|---|---|---|---|
设备地址 | 功能码 | 数据长度 | 4个字节长整形(累积量整数部分) | CRC高位 | CRC低位 |
累积流量的整数部分为 = 28785
主站发送采集累积流量小数值命令
01 | 04 | 10 | 1A | 00 | 02 | 54 | CC |
---|---|---|---|---|---|---|---|
设备地址 | 功能码 | 寄存器地址高位 | 寄存器地址高位 | 寄存器长度高位 | 寄存器长度低位 | CRC高位 | CRC低位 |
主站接收到数据:
01 | 04 | 04 | 3F | 00 | 00 | 00 | 3B | 90 |
---|---|---|---|---|---|---|---|---|
设备地址 | 功能码 | 数据长度 | 4个字节浮点数(累积量小数部分) | CRC高位 | CRC低位 |
浮点数为: 3F 00 00 00
0011 1111 0000 0000 0000 0000 0000 0000
S = 0
E = 0111111 126
M = 000 0000 0000 0000 0000 0000
= 0.5
4读瞬时流量单位
主站发送读瞬时流量单位8个字节命令:
01 | 04 | 10 | 20 | 00 | 01 | 34 | C0 |
---|---|---|---|---|---|---|---|
设备地址 | 功能码 | 寄存器地址高位 | 寄存器地址高位 | 寄存器长度高位 | 寄存器长度低位 | CRC高位 | CRC低位 |
主站接收到从站回传7个字节数据:
01 | 04 | 02 | 00 | 05 | 79 | 33 |
---|---|---|---|---|---|---|
设备地址 | 功能码 | 数据长度 | 2个字节整型(瞬时流量单位) | CRC高位 | CRC低位 |
根据表3查得:流量单位为M3/H
主站发送读瞬时流量单位8个字节命令:
01 | 04 | 10 | 21 | 00 | 01 | 65 | 00 |
---|---|---|---|---|---|---|---|
设备地址 | 功能码 | 寄存器地址高位 | 寄存器地址高位 | 寄存器长度高位 | 寄存器长度低位 | CRC高位 | CRC低位 |
主站接收到从站回传7个字节数据:
01 | 04 | 02 | 00 | 01 | 78 | F0 |
---|---|---|---|---|---|---|
设备地址 | 功能码 | 数据长度 | 2个字节整型(累积量单位) | CRC高位 | CRC低位 |
B型及511型根据表4查得:流量单位为M3
C型 根据表5查得:流量单位为L
主站发送读报警8个字节命令:
01 | 04 | 10 | 24 | 00 | 01 | 75 | 01 |
---|---|---|---|---|---|---|---|
设备地址 | 功能码 | 寄存器地址高位 | 寄存器地址高位 | 寄存器长度高位 | 寄存器长度低位 | CRC高位 | CRC低位 |
主站接收到从站回传7个字节数据:
01 | 04 | 02 | 00 | 01 | 78 | F0 |
---|---|---|---|---|---|---|
设备地址 | 功能码 | 数据长度 | 2个字节整型(报警) | CRC高位 | CRC低位 |
状态为1 表示空管是报警状态。
其他报警依次类推。
七、应用举例
(1).CRC16算法:
INT16U CRC16(INT8U *puchMsg, INT16U usDataLen)
{
INT8U uchCRCHi = 0xFF; /* 高CRC字节初始化 */
INT8U uchCRCLo = 0xFF; /* 低CRC 字节初始化 */
INT8U uIndex; /* CRC循环中的索引 */
while (usDataLen--) /* 传输消息缓冲区 */
{
uIndex = uchCRCHi ^ *puchMsg++; /* 计算CRC */
uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex];
uchCRCLo = auchCRCLo[uIndex];
}
return (uchCRCHi << 8 | uchCRCLo);
}
(2)发送命令程序
本例程以Mag64为核心CPU
void Read_InPut(INT8U Addr,INT16U Start,INT16U Len)
{
INT16U CRC;
SendBuffer_485[0]=Addr; //设备地址
SendBuffer_485[1]=0x04; //modbus功能码
SendBuffer_485[2]=Start/256; //Start为寄存器地址
SendBuffer_485[3]=Start%256;
SendBuffer_485[4]=Len/256; //Len为读取寄存器长度
SendBuffer_485[5]=Len%256;
CRC=CRC16(SendBuffer_485,6);
SendBuffer_485[6]=CRC/256; //CRC校验高位
SendBuffer_485[7]=CRC%256; //CRC校验低位
R485_OUT; //使能RS485发送
SendLen_485=8;
SendNum_485=0;
CloseINT0(); //关闭串口接受中断
UCSR0B |= BIT(UDRIE0); //打开串口发送中断
}
(3)返回数据解析(只以瞬时流量为例)
数据接收使用串口中断,ReceivedBuffer_485为接收数据组,ReceivedNum_485为接收到数据长度,ReceivedFlag_485接收到数据标志。函数float Datasum(INT8U BYTE1, INT8U BYTE2, INT8U BYTE3, INT8U BYTE4)把浮点数的4个字节转换为1个浮点数。
float Datasum(INT8U FloatByte1, INT8U FloatByte2, INT8U FloatByte3, INT8U FloatByte4)
{
float aa;
union IntTOFP
{
FP32 F32;
INT8U T8[4];
};
union IntTOFP aa;
aa.T8[0] = FloatByte1;
aa.T8[1] = FloatByte2;
aa.T8[2] = FloatByte3;
aa.T8[3] = FloatByte4;
return aa;
}
void Read_Lmag(INT8U Ad)
{
INT8U i,j;
INT8U Num1[10],BIT;
INT16U CRC1,CRC2;
FP32 Flow; //aaa为瞬时流量数值
ReceivedFlag_485=1;
Open_Time1_Ms5(20);
Read_InPut(Ad,0x1010,2); //发送设备地址、寄存器地址、寄存器长度
while(ReceivedFlag_485); //等待接收结束
if((ReceivedNum_485==9)&&(ReceivedBuffer_485[0]==Ad)) // 判断数据是否正确
{
CRC1=CRC16(ReceivedBuffer_485,7);
CRC2=ReceivedBuffer_485[7]*256+ReceivedBuffer_485[8];
if(CRC1==CRC2)
{// 转换数据为浮点数
Flow = Datasum(ReceivedBuffer_485[6], ReceivedBuffer_485[5], ReceivedBuffer_485[4] ,ReceivedBuffer_485[3]);
}
}
}
以从站地址为1,波特率9600,读取所有实时数据为例设置方法如下:
按照表2所示:起始寄存器地址4113 寄存器个数为22
1. 设置采集命令包括设备地址(1)、MODBUS功能码(04)、寄存器地址(4113)、寄存器长度(2)、采集间隔(1000)。
2.设置串口数据
根据L-mag电磁流量计串口格式(1位起始位 8位数据位 1位停止位,无校验)设置如下图:
3.设置数据显示格式
4.通讯成功界面
3.modbus调试软件modscan32通讯实例
以从站地址为1,波特率9600,读取所有实时数据为例设置方法如下:
按照表2所示:起始寄存器地址4113 寄存器个数为22
1. 设置采集命令包括设备地址(1)、MODBUS功能码(04)、寄存器地址(4113)、寄存器长度(2)、采集间隔(1000)。
2.设置串口数据
根据L-mag电磁流量计串口格式(1位起始位 8位数据位 1位停止位,无校验)设置如下图:
3.设置数据显示方式
4.通讯成功界面
4.组态王6.53通讯实例
第一步:
创建组态王工程,点击新建弹出如下界面,输入工程路径及工程名称。
第二步:打开新建的工程,选择设备栏在COM口下新建标准modbus设备。
组态王设备列表中找到-PLC-莫迪康-modbus(RTU)(L-mag电磁流量计借助莫迪康PLCmodbus(RTU)驱动)。
按照电磁流量计中的地址设置设备地址。下图以地址1为例:
第三步:双击设备中的COM设置串口参数
L-mag电磁流量计串口参数:波特率与电磁流量计中设置相同、1位起始位、 8位数据位、 1位停止位、无校验。下图以波特率9600为例:
第四步:点击数据词典添加L-mag数据变量
根据组态王驱动说明莫迪康-modbus(RTU)变量名称、寄存器地址和数据格式见下表:
变量名 | 寄存器值 | 数据格式 | 采用频率 | 读写属性 |
---|---|---|---|---|
瞬时流量 | 34113 | Float | 500 | 只读 |
瞬时流速 | 34115 | Float | 500 | 只读 |
流量百分比 | 34117 | Float | 500 | 只读 |
流体电导比 | 34119 | Float | 500 | 只读 |
正向累积值整数部分 | 34121 | Long | 500 | 只读 |
正向累积值小数部分 | 34123 | Float | 500 | 只读 |
反向累积值整数部分 | 34125 | Long | 500 | 只读 |
反向累积值小数部分 | 34127 | Float | 500 | 只读 |
数据转换寄存器 | SwapL0 | Byte | 0 | 只写 |
注意:因电磁流量计数据存储格式的原因,在组态王添加变量时必须添加数据转换寄存器,否则通讯数据显示不正常。
第五步:创建窗口界面并建立数据链接。
第六步:保存工程并运行工程
5.力控6.1通讯实例
说明使用方法
第一步:
创建一个工程输入工程名称及工程路径。
第二步:添加设备
IO口设备组态选择IO设备-modbus-标准modbus-modbus(RTU串口)
点击高级选项选择串口并设置串口参数(9600,8为数据位、1位停止位、无校验)
设置数据显示格式
第三步:数据库组态
设置数据格式及地址偏移
数据举例
第四步:
创建窗口并连接变量
第五步:
运行工程
说明使用方法
第一步:
创建一个工程,出现如下界面,选择设备窗口,双击。
选择设备工具箱,点击设备管理,把通用串口父设备和标准MODBUSRTU设备添加到工程。
选择通用串口父设备0属性和设备0属性,进行如下设置。
设备地址为1,32位浮点数解码顺序0-1234,校验方式0-LH[低字节,高字节]。选择设置内部属性。
点击添加通道,出现如下界面。
寄存器地址 | 数据类型 | 通道数量 | 寄存器定义 |
---|---|---|---|
4113 | 32位浮点数 | 1 | 瞬时流量 |
4115 | 32位浮点数 | 1 | 瞬时流速 |
4117 | 32位浮点数 | 1 | 流量百分比 |
4119 | 32位浮点数 | 1 | 流量电导比 |
4121 | 32位无符号二进制 | 1 | 正向累积整数 |
4123 | 32位浮点数 | 1 | 正向累积小数 |
4125 | 32位无符号二进制 | 1 | 反向累积整数 |
4127 | 32位浮点数 | 1 | 反向累积小数 |
选择通道连接
选择设备调试