c# NModBus 使用

最近在做一个项目,串口通讯,接口是RS232,通讯协议是ModBus,一开始真的是一头雾水,如果不管协议,直接用C#自带的SerialPort类,直接发送指令,获取返回信息,解析相对应的结果,得出需要使用的字段,这样可以不管是什么协议,只要知道指令解析方式即可。

如果指令较多,还非得按照ModBus协议解析,可以用NModBus4,百度有很多解释,包括需要理解下ModBus的相关协议,及其定义的字段意思,整理下NModBus4开发好的方法名及对应的功能号(功能号很重要,慎重!)

ModBus功能码
功能码 意义
1 READ COIL STATUS
2 READ INPUT STATUS
3 READ HOLDING REGISTER
4 READ INPUT REGISTER
5 WRITE SINGLE COIL
6 WRITE SINGLE REGISTER
15 WRITE MULTIPLE COIL
16 WRITE MULTIPLE REGISTER
方法名 作用 所需参数 返回值 对应功能码 
ReadCoils 读取DO的状态 从站地址(8)
byte slaveAddress   


起始地址(16)
 ushort startAddress   


读取数量(16)
ushort numberOfPoints   
bool[] 1
ReadInputs 读取DI的状态 从站地址(8)
byte slaveAddress   


起始地址(16)
ushort startAddress   


读取数量(16)
ushort numberOfPoints 
bool[] 2
ReadHoldingRegisters 读取AO的值 从站地址(8)
byte slaveAddress   


起始地址(16)
ushort startAddress   


读取数量(16)
ushort numberOfPoints
ushort[] 3
ReadInputRegisters 读取AI的值 从站地址(8 )
byte slaveAddress


起始地址(16)
ushort startAddress 


读取数量(16)
ushort numberOfPoints
ushort[] 4
WriteSingleCoil 写入值到DO 从站地址(8)
byte slaveAddress


线圈地址(16)
ushort coilAddress


写入值(布尔型)
bool value    
无返回值 5
WriteSingleRegister 写入值到AO 从站地址(8)
byte slaveAddress


寄存器地址(16)
ushort registerAddress


写入值(16)
ushort value 
无返回值 6
WriteMultipleCoils 写多线圈寄存器 从站地址(8)
byte slaveAddress


起始地址(16)
ushort startAddress


写入值(布尔型数组)
bool[] data
无返回值 15
WriteMultipleRegisters 写多个保持寄存器 从站地址(8)
byte slaveAddress


起始地址(16)   0200
ushort startAddress


寄存器值(16位整型数组)  0/1
ushort[] data
无返回值 16
ReadWriteMultipleRegisters 读写多个保持寄存器 从站地址(8)
byte slaveAddress


读起始地址(16)
ushort startReadAddress


读取数量(16)
ushort numberOfPointsToRead


写入起始地址(16)
ushort startWriteAddress


写入值(16位整型数组)
ushort[] writeData
ushort[] 23
SerialPort serialPort1 = new SerialPort(portName);//声明串口
IModbusSerialMaster master = ModbusSerialMaster.CreateRtu(serialPort1);
serialPort1.BaudRate = ;//波特率
serialPort1.DataBits = ;//数据位
serialPort1.Parity = Parity.Even;
serialPort1.StopBits = StopBits.One;
serialPort1.Open();

byte slaveId = 1;
//这边的值都是ushort 10 进制的数,一般仪器接收的都是16进制的,所以得自己换算
ushort startAddress = (ushort)Convert.ToInt32("200", 16);
ushort[] data = { (ushort)Convert.ToInt32("0100", 16) };
            
master.WriteMultipleRegisters(slaveId, startAddress, data);
serialPort1.Close();

用VS直接Nuget包管理器下载NModBus4,可以不需要计算CRC校验,自己备注留着以后查看!

你可能感兴趣的:(c#)