1. 程式人生 > >C# Modbus 數據讀取 使用NModBus4庫

C# Modbus 數據讀取 使用NModBus4庫

ddr reat 協議 nbsp clas dad 開源 code NPU

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庫