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))
 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);
13                 for (int i = 0; i < numInputs; i++)
14                 {
15                     Console.WriteLine($"Input {(startAddress + i)}={(inputs[i] ? 1 : 0)}");
16                 }

   这边值得注意的是主机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))
 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);
13                 for (int i = 0; i < numInputs; i++)
14                 {
15                     Console.WriteLine($"Register {(startAddress + i)}={(inputs[i])}");
16                 }