標籤:整型 holding 傳回值 dad modbus 參數 gis 注意 val
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庫