基于ModbusRTU通过以太网串口转换模块的通讯(五)
背景:
在最近项目中有几台只支持串口ModbusRTU协议的设备需要接入我们集成系统以太网中,根据需求我们采用了串口转换模块从设备->串口转换模块->汇聚交换机->服务器;通过设备读取/写入寄存器进行数据交换。
1.连接
通过厂家给的模块工具进行连接配置,注意转化协议选择
2.通讯协议
以下为整理后的关键通讯协议
寄存器读取:
寄存器写入:
3.代码实现
以下为通讯模块关键代码,其他数据发送及接收采用Socket通讯参考前几章内容这里不再复述;
读取指令
1 private byte[] GetReadCommand(int startIndex, int len) 2 { 3 byte[] command = new byte[12]; 4 5 //校验信息 6 command[0] = 0x00; 7 command[1] = 0x01; 8 //协议标识符 9 command[2] = 0x00; 10 command[3] = 0x00; 11 //数据长度 12 command[4] = 0x00; 13 command[5] = 0x06; 14 //设备地址 15 command[6] = Const.设备编号; 16 //功能码 17 command[7] = Const.读取功能码; 18 //寄存器起始地址 19 command[8] = (byte)(startIndex >> 8); 20 command[9] = (byte)(startIndex & 0xFF); 21 // 寄存器读取个数 22 23 if (len % 2 > 0) len += 1;//补1 24 25 command[10] = (byte)((len / 2) >> 8); 26 command[11] = (byte)((len / 2) & 0xFF); 27 28 return command; 29 }
写入指令
1 private byte[] GetWriteCommand(int startIndex,byte[] bytes) 2 { 3 byte[] command = new byte[10]; 4 //校验信息 5 command[0] = 0x00; 6 command[1] = 0x01; 7 //协议标识符 8 command[2] = 0x00; 9 command[3] = 0x00; 10 //数据长度 11 command[4] = 0x00; 12 command[5] = 0x06; 13 //设备地址 14 command[6] = Const.设备编号; 15 //功能码 16 command[7] = Const.写入功能码; 17 //寄存器起始地址 18 command[8] = (byte)(startIndex >> 8); 19 command[9] = (byte)(startIndex & 0xFF); 20 21 command = command.Concat(bytes).ToArray(); 22 23 return command; 24 }
4.测试
通过采集数据值经过公式换算最终得出需要的值
本文来自博客园,作者:豆腐柠檬,转载请注明原文链接:https://www.cnblogs.com/ToufuLemon/p/16415785.html