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             }

 

 

 

 

posted @ 2018-08-25 00:59  摇光Summer  阅读(41559)  评论(11编辑  收藏  举报