C#编程之C# Modbus 数据读取 使用NModBus4库
http://m.zhizuobiao.com/net/net-18091700173/
2018-09-17 来自 03142
摘要:本文主要向大家介绍了C#编程之C# Modbus 数据读取 使用NModBus4库,通过具体的内容向大家展示,希望对大家学习C#编程有所帮助。
本文主要向大家介绍了C#编程之C# Modbus 数据读取 使用NModBus4库,通过具体的内容向大家展示,希望对大家学习C#编程有所帮助。
方法名 作用 所需参数 返回值 对应功能码
ReadCoils 读取DO的状态 从站地址(8位) bool[] 1
byte slaveAddress
起始地址(16位)
ushort startAddress
读取数量(16位)
ushort numberOfPoints
ReadInputs 读取DI的状态 从站地址(8位) bool[] 2
byte slaveAddress
起始地址(16位)
ushort startAddress
读取数量(16位)
ushort numberOfPoints
ReadHoldingRegisters 读取AO的值 从站地址(8位) ushort[] 3
byte slaveAddress
起始地址(16位)
ushort startAddress
读取数量(16位)
ushort numberOfPoints
ReadInputRegisters 读取AI的值 从站地址(8 位) ushort[] 4
byte slaveAddress
起始地址(16位)
ushort startAddress
读取数量(16位)
ushort numberOfPoints
WriteSingleCoil 写入值到DO 从站地址(8位) 无返回值 5
byte slaveAddress
线圈地址(16位)
ushort coilAddress
写入值(布尔型)
bool value
WriteSingleRegister 写入值到AO 从站地址(8位) 无返回值 6
byte slaveAddress
寄存器地址(16位)
ushort registerAddress
写入值(16位)
ushort value
WriteMultipleCoils 写多线圈寄存器 从站地址(8位) 无返回值 15
byte slaveAddress
起始地址(16位)
ushort startAddress
写入值(布尔型数组)
bool[] data
WriteMultipleRegisters 写多个保持寄存器 从站地址(8位) 无返回值 16
byte slaveAddress
起始地址(16位)
ushort startAddress,
寄存器值(16位整型数组)
ushort[] data
ReadWriteMultipleRegisters 读写多个保持寄存器 从站地址(8位) ushort[] 23
byte slaveAddress
读起始地址(16位)
ushort startReadAddress
读取数量(16位)
ushort numberOfPointsToRead,
写入起始地址(16位)
ushort startWriteAddress,
写入值(16位整型数组)
ushort[] writeData
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 }