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 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?