c#Modbus tcp slave读保持寄存器
时间: 2025-05-14 18:25:37 浏览: 15
### C# Modbus TCP Slave 读取保持寄存器
为了实现C#中的Modbus TCP Slave并读取保持寄存器,可以采用NModbus4库来简化开发过程。此库提供了丰富的API接口支持多种操作模式下的通信需求。
下面是一个简单的例子说明如何配置一个基本的Modbus TCP Server,并处理来自Master请求时返回特定地址范围内的保持寄存器值:
```csharp
using System;
using System.Net.Sockets;
using NModbus;
class Program {
static void Main(string[] args) {
// 创建TCP监听对象
var listener = new TcpListener(System.Net.IPAddress.Any, 502);
listener.Start();
Console.WriteLine("Listening...");
while (true){
try{
using(var client = await listener.AcceptTcpClientAsync()){
using(var factory = new ModbusFactory()){
// 设置slave实例
IModbusSlaveNetwork slave = factory.CreateTcpSlave(client.GetStream());
// 注册回调函数以响应读取保持寄存器命令
slave.Listen((message) => HandleReadHoldingRegistersRequest(message));
}
}
}catch(Exception ex){
Console.WriteLine($"Error occurred: {ex.Message}");
}
}
listener.Stop();
}
private static ModbusMessage HandleReadHoldingRegistersRequest(IModbusMessage request){
if(request.FunctionCode == ModbusFunctionCodes.ReadHoldingRegisters){
ushort startAddress = ((IReadInputRegistersRequest)request).StartAddress;
ushort numberOfPoints = ((IReadInputRegistersRequest)request).NumberOfPoints;
// 假设有一个预先定义好的数组存储着模拟的数据点
ushort[] dataPoints = GetDataFromSomewhere(startAddress, numberOfPoints);
// 构建应答消息体
ReadHoldingRegistersResponse response = new ReadHoldingRegistersResponse(dataPoints);
return response;
}
throw new NotImplementedException();
}
/// <summary>
/// 获取指定起始位置和数量的真实数据点(此处仅为示意)
/// </summary>
private static ushort[] GetDataFromSomewhere(ushort startIndex, ushort count){
Random rand = new Random();
ushort[] result = new ushort[count];
for(int i=0;i<count;++i){
result[i]=(ushort)(rand.NextDouble()*UInt16.MaxValue);
}
return result;
}
}
```
上述代码展示了怎样通过继承`IModbusSlaveNetwork`接口以及重载其虚方法`Listen()`来捕获到针对不同功能码的消息帧;当接收到读取保持寄存器(`FC3`)指令时,则调用自定义逻辑去准备相应的回复内容[^1]。
需要注意的是,在实际项目里应当根据具体应用场景调整错误处理机制和服务端运行方式等细节部分。此外,对于生产环境而言还需要考虑诸如安全性验证等问题[^2]。
阅读全文
相关推荐


















