L-mag电磁流量计转换器通讯协议
L-MAG电磁流量计转换器通讯协议
版本号:LMAGMODRTUV77
2012-10-12
0 L-mag电磁流量计转换器通讯协议 注:本协议应用举例中例程只提供参考,例程中部分参数与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电磁流量计通讯接线详见电磁流量计使用说明书。
-1- L-mag电磁流量计转换器通讯协议
三、Modbus协议RTU帧格式 MODBUS协议是主从通讯方式,每次通讯由主站发起,从站响应主站命令回传数据。
L-mag电磁流量计采用MODBUSRTU格式(十六进制格式),其帧结构如图-2所示。
1.主站命令帧结构 帧起始 设备地址功能代码寄存器地址寄存器长度CRC校验帧结束 T1-T2-T3-T48Bit 8Bit 16Bit 16Bit 16Bit T1-T2-T3-T4 图-2主站RTU消息帧
2.从站响应帧结构 帧起始 设备地址 T1-T2-T3-T48Bit 功能代码8Bit 数据n个8Bit CRC校验16Bit 帧结束T1-T2-T3-T4 图3从站RTU消息帧 说明:
(1)T1-T2-T3-T4为帧起始或帧结束,MODBUS协议规定帧起始或帧结束是在帧与帧间延时3.5char字符的时间实现的,如图-4所示。
图-4MODBUS帧间隔
(2)设备地址:电磁流量计的通讯地址,在一个网络中不能有两个相同的地址。
(3)功能码:MODBUS协议规定的功能码,L-mag电磁流量计采用功能码4读输入寄存器来实现采集数据的。
(4)寄存器地址和寄存器数 -2- L-mag电磁流量计转换器通讯协议 主站命令中的参数是从寄存器地址开始的寄存,读寄存器长度的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/384484584) 保留 14探询(184/384484584) 保留 15强置多线圈 保留 -3- L-mag电磁流量计转换器通讯协议
五、L-mag电磁流量计MODBUS寄存器定义
1.L-mag电磁流量计MODBUS寄存器地址定义表-
2 ProtocolAddresses(Decimal) 41124114411641184120412241244126412841294130 ProtocolAddresses(HEX) 0x10100x10120x10140x10160x10180x101A0x101C0x101E0x10200x10210x1022 数据格式 寄存器定义 FloatInverseFloatInverseFloatInverseFloatInverse LongInverseFloatInverse LongInverseFloatInverseUnsignedshortUnsignedshortUnsignedshort 瞬时流量浮点表示瞬时流速浮点表示流量百分比浮点表示(电池供电表保留)流体电导比浮点表示正向累积数值整数部分正向累积数值小数部分反向累积数值整数部分反向累积数值小数部分瞬时流量单位(表3)累积总量单位(表4/表5) 上限报警 -4- 413141324133 L-mag电磁流量计转换器通讯协议 0x10230x10240x1025 Unsignedshort Unsignedshort Unsignedshort 下限报警空管报警系统报警
2.PLC地址设置说明 PLC设置时如果没有功能码设置项时,使用功能04应在寄存器地址前面加
3。
另PLC寄存器地址的基址是从1开始,所以PLC设置寄存器地址时应在原地址上加
1.例: L-mag电磁流量计MODBUS寄存器地址为4112(0x1010),MODBUS功能码为4时,PLC寄存器地址为34113。
详细设置见应用举例章节
2.
3.组态王地址设置说明 组态王设置时没有功能码设置项,不同的驱动设置方法不同。
以PLC-莫迪康-modbus(RTU)驱动为例,使用功能04应在寄存器地址前面加
8。
另组态王寄存器地址的基址是从1开始,所以组态王设置寄存器地址时应在原地址上加
1.L-mag电磁流量计MODBUS寄存器地址为4112(0x1010),MODBUS功能码为4时,组态王寄存器地址为84113。
详细设置见应用举例章节
4. 4.数据含义说明
(1)浮点格式:L-mag电磁流量计MODBUS采用IEEE75432位浮点数格式,其结构如 下:(以瞬时流量为例) 0X1010(34113) 0x1011(34114) BYTE1 BYTE2 BYTE3 BYTE4 SEEEEEEE EMMMMMMM MMMMMMMM S-尾数的符号;1=负数,0=正数;E-指数;与十进制数127的差值表示。
M-尾数;低23位,小数部分。
-5- MMMMMMMM L-mag电磁流量计转换器通讯协议 当E不全”0”时,且不全”1时浮点数与十进制数转换公式:
(2)瞬时流量单位 代码012 瞬时单位 L/SL/ML/H 代码345 瞬时单位 M3/SM3/MM3/H 代码678 表
3 瞬时单位 T/ST/MT/H 代码91011 瞬时单位 GPSGPMGPH
(3)累积总量单位 表4(适用于B型及511型电磁流量计转换器) 代码
0 1
2 累积单位
L M3
T 表5(适用于C型电磁流量计转换器) 代码
0 1
2 3
4 累积单位
L L
L M3 M3 代码
6 7
8 9 10 累积单位
T T
T USG USG
(4)报警 上限报警,下限报警,空管报警,系统报警表示: 3
USG 5M311USG 0-----不报警;1----报警
六、通讯数据解析 瞬时流量,瞬时流速,流量百分比,流体电导比,正反向累积量小数部分以浮点数的格式传输。
正反向累积量的整数部分以长整型数传输。
1读瞬时流量 主站发送命令(十六进制) 01 04 10 10 00 02 设备 功能码 寄存器 寄存器 寄存器 寄存器 地址 地址高位地址高位长度高位长度低位 主站接收到数据: 01 04 04 C4 1C 60 00 设备 功能码 数据 4个字节浮点数-6- 74 CRC高位 2F CRC CE CRC低位 72 CRC L-mag电磁流量计转换器通讯协议 地址 长度 (瞬时流量) 高位 低位 浮点数 C411000100 1C00011100 6001100000 0000000000 浮点数字节1浮点数字节
2 浮点数字节3浮点数字节
4 S=1:尾数符号为1表示是负数。
E=10001000:指数为136M=00111000110000000000000,尾数为 =-625.5
2.读瞬时流速: 主站发送命令: 01 04 10 12 00 02 设备 功能码 寄存器 寄存器 寄存器 寄存器 地址 地址高位地址高位长度高位长度低位 主站接收数据: 01 04 04 C1 B0 80 00 设备 功能码 数据 4个字节浮点数 地址 长度 (瞬时流速) 浮点数为:C1 B0 80 00 11000001101100001111100000000000 S=
1 E=10000011 M=01100001111100000000000 D5 CRC高位 A6 CRC高位 0E CRC低位 5F CRC低位 =-22.0625 -7- 3读累积流量 L-mag电磁流量计转换器通讯协议 为了能够完全表达电磁流量计的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 00111111000000000000000000000000 S=
0 E=0111111 126 M=00000000000000000000000 =0.5 -8- L-mag电磁流量计转换器通讯协议 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
5.读总量流量单位 主站发送读瞬时流量单位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 6.读报警状态 主站发送读报警8个字节命令: 01 04 10 24 00 01 75 01 设备 功能码 寄存器 寄存器 寄存器 寄存器 CRC 地址 地址高位地址高位长度高位长度低位 高位 CRC低位 主站接收到从站回传7个字节数据: 01 04 02 00 01 78 F0 -9- L-mag电磁流量计转换器通讯协议 设备 功能码 数据 地址 长度 2个字节整型(报警) CRC高位 CRC低位 状态为1表示空管是报警状态。
其他报警依次类推。
七、应用举例
1.C语言MODBUS示例程序
(1).CRC16算法: INT16UCRC16(INT8U*puchMsg,INT16UusDataLen) { INT8UuchCRCHi=0xFF; /*高CRC字节初始化*/ INT8UuchCRCLo=0xFF; /*低CRC字节初始化*/ INT8UuIndex; /*CRC循环中的索引*/ while(usDataLen--) /*传输消息缓冲区*/ { uIndex=uchCRCHi^*puchMsg++;/*计算CRC*/ uchCRCHi=uchCRCLo^auchCRCHi[uIndex]; uchCRCLo=auchCRCLo[uIndex]; } return(uchCRCHi<<8|uchCRCLo); }
(2)发送命令程序 本例程以Mag64为核心CPU voidRead_InPut(INT8UAddr,INT16UStart,INT16ULen) { INT16UCRC; 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; -
10- L-mag电磁流量计转换器通讯协议 CRC=CRC16(SendBuffer_485,6);SendBuffer_485[6]=CRC/256;SendBuffer_485[7]=CRC%256;R485_OUT;SendLen_485=8;SendNum_485=0;CloseINT0();UCSR0B|=BIT(UDRIE0);} //CRC校验高位//CRC校验低位//使能RS485发送 //关闭串口接受中断//打开串口发送中断
(3)返回数据解析(只以瞬时流量为例) 数据接收使用串口中断,ReceivedBuffer_485为接收数据组,ReceivedNum_485为接收到数据 长度,ReceivedFlag_485接收到数据标志。
函数float
Datasum(INT8UBYTE1,INT8UBYTE2,INT8U BYTE3,INT8UBYTE4)把浮点数的4个字节转换为1个浮点数。
floatDatasum(INT8UFloatByte1,INT8UFloatByte2,INT8UFloatByte3,INT8UFloatByte4) { floataa; unionIntTOFP { FP32 F32; INT8U T8[4]; }; unionIntTOFPaa; aa.T8[0]=FloatByte1; aa.T8[1]=FloatByte2; aa.T8[2]=FloatByte3; aa.T8[3]=FloatByte4; returnaa; } voidRead_Lmag(INT8UAd) { INT8Ui,j; INT8UNum1[10],BIT; INT16UCRC1,CRC2; FP32Flow; //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) -
11- L-mag电磁流量计转换器通讯协议{//转换数据为浮点数 Flow=Datasum(ReceivedBuffer_485[6],ReceivedBuffer_485[5],ReceivedBuffer_485[4],ReceivedBuffer_485[3]); }}} -12-
0 L-mag电磁流量计转换器通讯协议 注:本协议应用举例中例程只提供参考,例程中部分参数与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电磁流量计通讯接线详见电磁流量计使用说明书。
-1- L-mag电磁流量计转换器通讯协议
三、Modbus协议RTU帧格式 MODBUS协议是主从通讯方式,每次通讯由主站发起,从站响应主站命令回传数据。
L-mag电磁流量计采用MODBUSRTU格式(十六进制格式),其帧结构如图-2所示。
1.主站命令帧结构 帧起始 设备地址功能代码寄存器地址寄存器长度CRC校验帧结束 T1-T2-T3-T48Bit 8Bit 16Bit 16Bit 16Bit T1-T2-T3-T4 图-2主站RTU消息帧
2.从站响应帧结构 帧起始 设备地址 T1-T2-T3-T48Bit 功能代码8Bit 数据n个8Bit CRC校验16Bit 帧结束T1-T2-T3-T4 图3从站RTU消息帧 说明:
(1)T1-T2-T3-T4为帧起始或帧结束,MODBUS协议规定帧起始或帧结束是在帧与帧间延时3.5char字符的时间实现的,如图-4所示。
图-4MODBUS帧间隔
(2)设备地址:电磁流量计的通讯地址,在一个网络中不能有两个相同的地址。
(3)功能码:MODBUS协议规定的功能码,L-mag电磁流量计采用功能码4读输入寄存器来实现采集数据的。
(4)寄存器地址和寄存器数 -2- L-mag电磁流量计转换器通讯协议 主站命令中的参数是从寄存器地址开始的寄存,读寄存器长度的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/384484584) 保留 14探询(184/384484584) 保留 15强置多线圈 保留 -3- L-mag电磁流量计转换器通讯协议
五、L-mag电磁流量计MODBUS寄存器定义
1.L-mag电磁流量计MODBUS寄存器地址定义表-
2 ProtocolAddresses(Decimal) 41124114411641184120412241244126412841294130 ProtocolAddresses(HEX) 0x10100x10120x10140x10160x10180x101A0x101C0x101E0x10200x10210x1022 数据格式 寄存器定义 FloatInverseFloatInverseFloatInverseFloatInverse LongInverseFloatInverse LongInverseFloatInverseUnsignedshortUnsignedshortUnsignedshort 瞬时流量浮点表示瞬时流速浮点表示流量百分比浮点表示(电池供电表保留)流体电导比浮点表示正向累积数值整数部分正向累积数值小数部分反向累积数值整数部分反向累积数值小数部分瞬时流量单位(表3)累积总量单位(表4/表5) 上限报警 -4- 413141324133 L-mag电磁流量计转换器通讯协议 0x10230x10240x1025 Unsignedshort Unsignedshort Unsignedshort 下限报警空管报警系统报警
2.PLC地址设置说明 PLC设置时如果没有功能码设置项时,使用功能04应在寄存器地址前面加
3。
另PLC寄存器地址的基址是从1开始,所以PLC设置寄存器地址时应在原地址上加
1.例: L-mag电磁流量计MODBUS寄存器地址为4112(0x1010),MODBUS功能码为4时,PLC寄存器地址为34113。
详细设置见应用举例章节
2.
3.组态王地址设置说明 组态王设置时没有功能码设置项,不同的驱动设置方法不同。
以PLC-莫迪康-modbus(RTU)驱动为例,使用功能04应在寄存器地址前面加
8。
另组态王寄存器地址的基址是从1开始,所以组态王设置寄存器地址时应在原地址上加
1.L-mag电磁流量计MODBUS寄存器地址为4112(0x1010),MODBUS功能码为4时,组态王寄存器地址为84113。
详细设置见应用举例章节
4. 4.数据含义说明
(1)浮点格式:L-mag电磁流量计MODBUS采用IEEE75432位浮点数格式,其结构如 下:(以瞬时流量为例) 0X1010(34113) 0x1011(34114) BYTE1 BYTE2 BYTE3 BYTE4 SEEEEEEE EMMMMMMM MMMMMMMM S-尾数的符号;1=负数,0=正数;E-指数;与十进制数127的差值表示。
M-尾数;低23位,小数部分。
-5- MMMMMMMM L-mag电磁流量计转换器通讯协议 当E不全”0”时,且不全”1时浮点数与十进制数转换公式:
(2)瞬时流量单位 代码012 瞬时单位 L/SL/ML/H 代码345 瞬时单位 M3/SM3/MM3/H 代码678 表
3 瞬时单位 T/ST/MT/H 代码91011 瞬时单位 GPSGPMGPH
(3)累积总量单位 表4(适用于B型及511型电磁流量计转换器) 代码
0 1
2 累积单位
L M3
T 表5(适用于C型电磁流量计转换器) 代码
0 1
2 3
4 累积单位
L L
L M3 M3 代码
6 7
8 9 10 累积单位
T T
T USG USG
(4)报警 上限报警,下限报警,空管报警,系统报警表示: 3
USG 5M311USG 0-----不报警;1----报警
六、通讯数据解析 瞬时流量,瞬时流速,流量百分比,流体电导比,正反向累积量小数部分以浮点数的格式传输。
正反向累积量的整数部分以长整型数传输。
1读瞬时流量 主站发送命令(十六进制) 01 04 10 10 00 02 设备 功能码 寄存器 寄存器 寄存器 寄存器 地址 地址高位地址高位长度高位长度低位 主站接收到数据: 01 04 04 C4 1C 60 00 设备 功能码 数据 4个字节浮点数-6- 74 CRC高位 2F CRC CE CRC低位 72 CRC L-mag电磁流量计转换器通讯协议 地址 长度 (瞬时流量) 高位 低位 浮点数 C411000100 1C00011100 6001100000 0000000000 浮点数字节1浮点数字节
2 浮点数字节3浮点数字节
4 S=1:尾数符号为1表示是负数。
E=10001000:指数为136M=00111000110000000000000,尾数为 =-625.5
2.读瞬时流速: 主站发送命令: 01 04 10 12 00 02 设备 功能码 寄存器 寄存器 寄存器 寄存器 地址 地址高位地址高位长度高位长度低位 主站接收数据: 01 04 04 C1 B0 80 00 设备 功能码 数据 4个字节浮点数 地址 长度 (瞬时流速) 浮点数为:C1 B0 80 00 11000001101100001111100000000000 S=
1 E=10000011 M=01100001111100000000000 D5 CRC高位 A6 CRC高位 0E CRC低位 5F CRC低位 =-22.0625 -7- 3读累积流量 L-mag电磁流量计转换器通讯协议 为了能够完全表达电磁流量计的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 00111111000000000000000000000000 S=
0 E=0111111 126 M=00000000000000000000000 =0.5 -8- L-mag电磁流量计转换器通讯协议 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
5.读总量流量单位 主站发送读瞬时流量单位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 6.读报警状态 主站发送读报警8个字节命令: 01 04 10 24 00 01 75 01 设备 功能码 寄存器 寄存器 寄存器 寄存器 CRC 地址 地址高位地址高位长度高位长度低位 高位 CRC低位 主站接收到从站回传7个字节数据: 01 04 02 00 01 78 F0 -9- L-mag电磁流量计转换器通讯协议 设备 功能码 数据 地址 长度 2个字节整型(报警) CRC高位 CRC低位 状态为1表示空管是报警状态。
其他报警依次类推。
七、应用举例
1.C语言MODBUS示例程序
(1).CRC16算法: INT16UCRC16(INT8U*puchMsg,INT16UusDataLen) { INT8UuchCRCHi=0xFF; /*高CRC字节初始化*/ INT8UuchCRCLo=0xFF; /*低CRC字节初始化*/ INT8UuIndex; /*CRC循环中的索引*/ while(usDataLen--) /*传输消息缓冲区*/ { uIndex=uchCRCHi^*puchMsg++;/*计算CRC*/ uchCRCHi=uchCRCLo^auchCRCHi[uIndex]; uchCRCLo=auchCRCLo[uIndex]; } return(uchCRCHi<<8|uchCRCLo); }
(2)发送命令程序 本例程以Mag64为核心CPU voidRead_InPut(INT8UAddr,INT16UStart,INT16ULen) { INT16UCRC; 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; -
10- L-mag电磁流量计转换器通讯协议 CRC=CRC16(SendBuffer_485,6);SendBuffer_485[6]=CRC/256;SendBuffer_485[7]=CRC%256;R485_OUT;SendLen_485=8;SendNum_485=0;CloseINT0();UCSR0B|=BIT(UDRIE0);} //CRC校验高位//CRC校验低位//使能RS485发送 //关闭串口接受中断//打开串口发送中断
(3)返回数据解析(只以瞬时流量为例) 数据接收使用串口中断,ReceivedBuffer_485为接收数据组,ReceivedNum_485为接收到数据 长度,ReceivedFlag_485接收到数据标志。
函数float
Datasum(INT8UBYTE1,INT8UBYTE2,INT8U BYTE3,INT8UBYTE4)把浮点数的4个字节转换为1个浮点数。
floatDatasum(INT8UFloatByte1,INT8UFloatByte2,INT8UFloatByte3,INT8UFloatByte4) { floataa; unionIntTOFP { FP32 F32; INT8U T8[4]; }; unionIntTOFPaa; aa.T8[0]=FloatByte1; aa.T8[1]=FloatByte2; aa.T8[2]=FloatByte3; aa.T8[3]=FloatByte4; returnaa; } voidRead_Lmag(INT8UAd) { INT8Ui,j; INT8UNum1[10],BIT; INT16UCRC1,CRC2; FP32Flow; //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) -
11- L-mag电磁流量计转换器通讯协议{//转换数据为浮点数 Flow=Datasum(ReceivedBuffer_485[6],ReceivedBuffer_485[5],ReceivedBuffer_485[4],ReceivedBuffer_485[3]); }}} -12-
声明:
该资讯来自于互联网网友发布,如有侵犯您的权益请联系我们。