C# Modbus 數據讀取 使用NModBus4庫

ModBus通信協議

 

    

方法名git

做用github

所需參數數組

返回值spa

對應功能碼3d

ReadCoilscode

讀取DO的狀態blog

從站地址(8位)ip

byte slaveAddressci

起始地址(16位)get

 

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             }
相關文章
相關標籤/搜索