L-mag电磁流量计转换器通讯协议
主站接收到从站回传7个字节数据: 01 设备 地址 04 功能码 02 数据 长度 00 05 79 CRC 高位 33 CRC 低位 2个字节整型 (瞬时流量单位) 根据表3查得:流量单位为M3/H 5.读总量流量单位
主站发送读瞬时流量单位8个字节命令: 01 设备 地址 04 功能码 10 寄存器 地址高位 21 寄存器 地址高位 00 寄存器 长度高位 01 寄存器 长度低位 65 CRC 高位 00 CRC 低位 主站接收到从站回传7个字节数据: 01 设备 地址 04 功能码 02 数据 长度 00 01 78 CRC 高位 F0 CRC 低位 2个字节整型 (累积量单位) B型及511型根据表4查得:流量单位为M3 C型 根据表5查得:流量单位为L 6.读报警状态
主站发送读报警8个字节命令: 01 设备 地址 04 功能码 10 寄存器 地址高位 24 寄存器 地址高位 00 寄存器 长度高位 01 寄存器 长度低位 75 CRC 高位 01 CRC 低位 主站接收到从站回传7个字节数据: 01 设备 地址
04 功能码 02 数据 长度 00 01 78 CRC 高位 F0 CRC 低位 2个字节整型 (报警) 状态为1 表示空管是报警状态。 其他报警依次类推。
- 10 -
L-mag电磁流量计转换器通讯协议
七、应用举例
1.C语言MODBUS 示例程序
(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%6;
SendBuffer_485[4]=Len/256; //Len为读取寄存器长度 SendBuffer_485[5]=Len%6; CRC=CRC16(SendBuffer_485,6);
SendBuffer_485[6]=CRC/256; //CRC校验高位 SendBuffer_485[7]=CRC%6; //CRC校验低位 R485_OUT; //使能RS485发送 SendLen_485=8; SendNum_485=0;
CloseINT0(); //关闭串口接受中断 UCSR0B |= BIT(UDRIE0); //打开串口发送中断 }
- 11 -
L-mag电磁流量计转换器通讯协议
(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]);
}
}
}
- 12 -
L-mag电磁流量计转换器通讯协议
2.modbus调试软件 modbus poll通讯实例
以从站地址为1,波特率9600,读取所有实时数据为例设置方法如下: 按照表2所示:起始寄存器地址4113 寄存器个数为22 1. 设置采集命令包括设备地址(1)、MODBUS功能码(04)、寄存器地址(4113)、寄存器长度(2)、采集间隔(1000)。
2.设置串口数据
根据L-mag电磁流量计串口格式(1位起始位 8位数据位 1位停止位,无校验)设置如下图:
3.设置数据显示格式
- 13 -
L-mag电磁流量计转换器通讯协议
4.通讯成功界面
- 14 -