C# Modbus 數據讀取 使用NModBus4庫
ModBus通訊協議
方法名 |
作用 |
所需參數 |
返回值 |
對應功能碼 |
ReadCoils |
讀取DO的狀態 |
從站地址(8位) byte slaveAddress 起始地址(16位)
ushort startAddress 讀取數量(16位) ushort numberOfPoints |
bool[] |
01 |
ReadInputs |
讀取DI的狀態 |
從站地址(8位) byte slaveAddress 起始地址(16位)
ushort startAddress 讀取數量(16位) ushort numberOfPoints |
bool[] |
02 |
ReadHoldingRegisters |
讀取AO的值 |
從站地址(8位) byte slaveAddress 起始地址(16位) ushort startAddress 讀取數量(16位) ushort numberOfPoints |
ushort[] |
03 |
ReadInputRegisters |
讀取AI的值 |
從站地址(8 位) byte slaveAddress 起始地址(16位)
ushort startAddress 讀取數量(16位) ushort numberOfPoints |
ushort[] |
04 |
WriteSingleCoil |
寫入值到DO |
從站地址(8位) byte slaveAddress 線圈地址(16位) ushort coilAddress 寫入值(布爾型) bool value |
無返回值 |
05 |
WriteSingleRegister |
寫入值到AO |
從站地址(8位) byte slaveAddress 寄存器地址(16位) ushort registerAddress 寫入值(16位) ushort value |
無返回值 |
06 |
WriteMultipleCoils |
寫多線圈寄存器 |
從站地址(8位) byte slaveAddress 起始地址(16位) ushort startAddress 寫入值(布爾型數組) bool[] data |
無返回值 |
15 |
WriteMultipleRegisters |
寫多個保持寄存器 |
從站地址(8位) byte slaveAddress
起始地址(16位) ushort startAddress, 寄存器值(16位整型數組) ushort[] data |
無返回值 |
16 |
ReadWriteMultipleRegisters |
讀寫多個保持寄存器 |
從站地址(8位) byte slaveAddress 讀起始地址(16位) ushort startReadAddress
讀取數量(16位) ushort numberOfPointsToRead, 寫入起始地址(16位) ushort startWriteAddress, 寫入值(16位整型數組) ushort[] writeData |
ushort[] |
23 |
Modbus Slave
這個是安裝包ModbusSlaveSetup64Bit 註冊碼:5455415451475662
modbus通訊協議NET庫
這樣的開源庫很多,我這邊用的庫是github的開源實現類庫:NModBus4,github地址:https://github.com/NModbus4/NModbus4
我用Modbus Slave模擬一個從機
設置數據
NModbus4的讀取從機代碼示例
1 IPAddress address = new IPAddress(new byte[] { 127, 0, 0, 1 }); 2 using (TcpClient client = new TcpClient(address.ToString(), 502)) 3 { 4 client.SendTimeout = 1; 5 //client.op 6 ModbusIpMaster master = ModbusIpMaster.CreateIp(client); 7 //master.op 8 // read five input values 9 ushort startAddress = 0; 10 ushort numInputs = 10; 11 bool[] inputs = master.ReadCoils(1, startAddress, numInputs); 12 13 for (int i = 0; i < numInputs; i++) 14 { 15 Console.WriteLine($"Input {(startAddress + i)}={(inputs[i] ? 1 : 0)}"); 16 } 17 18 }
這邊值得註意的是主機Read的方法第一個參數是slaveId 如果不加就startAddress And numInputs NModbus就會默認 slaveId是0 一直異常( d(╯﹏╰)b 痛苦經歷~~)
以上數據是 剛才設置的DO 狀態
在演示一個讀取AI的值
代碼沒差多少就是方法ReadInputRegisters不一樣 . 以下是示例代碼
1 IPAddress address = new IPAddress(new byte[] { 127, 0, 0, 1 }); 2 using (TcpClient client = new TcpClient(address.ToString(), 502)) 3 { 4 client.SendTimeout = 1; 5 //client.op 6 ModbusIpMaster master = ModbusIpMaster.CreateIp(client); 7 //master.op 8 // read five input values 9 ushort startAddress = 0; 10 ushort numInputs = 10; 11 ushort[] inputs = master.ReadInputRegisters(2, startAddress, numInputs); 12 13 for (int i = 0; i < numInputs; i++) 14 { 15 Console.WriteLine($"Register {(startAddress + i)}={(inputs[i])}"); 16 } 17 18 }
C# Modbus 數據讀取 使用NModBus4庫