一、什么是ModBus通讯协议 Modbus协议是应用于电子控制器上的一种通用语言,此协议支持传统的RS-232、RS-422、RS-485和以太网设备。 ModBus功能码
二、ModBus通讯协议的.Net实现
读写方法: 方法名 | | | | | | | 从站地址(8位) byte slaveAddress 起始地址(16位)
ushort startAddress 读取数量(16位) ushort numberOfPoints | | | | | 从站地址(8位) byte slaveAddress 起始地址(16位)
ushort startAddress 读取数量(16位) ushort numberOfPoints | | | | | 从站地址(8位) byte slaveAddress 起始地址(16位) ushort startAddress 读取数量(16位) ushort numberOfPoints | | | | | 从站地址(8 位) byte slaveAddress 起始地址(16位)
ushort startAddress 读取数量(16位) ushort numberOfPoints | | | | | 从站地址(8位) byte slaveAddress 线圈地址(16位) ushort coilAddress 写入值(布尔型) bool value | | | | | 从站地址(8位) byte slaveAddress 寄存器地址(16位) ushort registerAddress 写入值(16位) ushort value | | | | | 从站地址(8位) byte slaveAddress 起始地址(16位) ushort startAddress 写入值(布尔型数组) bool[] data | | | | | 从站地址(8位) byte slaveAddress
起始地址(16位) ushort startAddress, 寄存器值(16位整型数组) ushort[] data | | | ReadWriteMultipleRegisters | | 从站地址(8位) byte slaveAddress 读起始地址(16位) ushort startReadAddress
读取数量(16位) ushort numberOfPointsToRead, 写入起始地址(16位) ushort startWriteAddress, 写入值(16位整型数组) ushort[] writeData | | |
每个方法都有各自的异步方法实现。
这里以RTU展示其使用方法: 1 /// <summary> 2 /// 创建 ModBus RTU 连接 3 /// </summary> 4 /// <paramname="portName">端口号</param> 5 /// <paramname="baudRate">波特率</param> 6 /// <paramname="parity">奇偶校验位</param> 7 /// <paramname="dataBits">数据位</param> 8 /// <paramname="stopBits">停止位</param> 9 /// <returns></returns> 10 public IModbusSerialMaster CreateModBusRtuConnection(string portName,int baudRate,Parity parity,int dataBits,StopBits stopBits) 11 { 12 return CreateModBusRtuConnect(new SerialPort(portName,baudRate, parity, dataBits, stopBits)); 13 } 14 15 public IModbusSerialMaster CreateModBusRtuConnection(SerialPort serialPort) 16 { 17 IModbusSerialMaster master = null; 18 if (!serialPort.IsOpen) 19 { 20 try 21 { 22 serialPort.Open(); 23 } 24 catch (Exception e) 25 { 26 throw e; 27 } 28 } 29 try 30 { 31 master =ModbusSerialMaster.CreateRtu(serialPort); 32 ///同时也可以配置master的一些参数 33 master.Transport.ReadTimeout = 100;//读取数据超时100ms 34 master.Transport.WriteTimeout = 100;//写入数据超时100ms 35 master.Transport.Retries = 3;//重试次数 36 master.Transport.WaitToRetryMilliseconds = 10;//重试间隔 37 38 } 39 catch(Exception e) 40 { throw e; 41 } 42 return master; 43 } 44 }
|