C# 实现 Modbus TCP 通信

简介: C# 实现 Modbus TCP 通信

C# 实现 Modbus TCP 通信 结合主流开源库与底层协议实现

一、核心实现方案

1. 使用 NModbus 库(推荐)

安装依赖

Install-Package NModbus  # NuGet 安装

客户端代码示例

using System.Net.Sockets;
using Modbus.Device;

public class ModbusTcpClient
{
   
    public static void Main()
    {
   
        using TcpClient client = new TcpClient("192.168.0.100", 502); // 连接设备
        var master = ModbusTcpMaster.CreateIp(client);  // 创建 Modbus 主机实例

        // 读取保持寄存器(地址0开始的10个寄存器)
        ushort[] registers = master.ReadHoldingRegisters(0, 10);  
        foreach (var reg in registers)
        {
   
            Console.WriteLine($"寄存器值: {reg}");
        }
        client.Close();  // 关闭连接
    }
}

关键点

  • ReadHoldingRegisters():读取保持寄存器(功能码 0x03)
  • WriteSingleRegister():写入单个寄存器(功能码 0x06)
  • 自动处理 MBAP 报文头(事务ID、协议ID等)

2. 手动实现协议帧(理解底层)

请求帧结构

字段 事务ID (2B) 协议ID (2B) 长度 (2B) 单元ID (1B) 功能码 (1B) 数据 (N B)
示例 0x00 0x01 0x00 0x00 0x00 0x06 0x01 0x03 起始地址+数量

代码实现

// 构建读寄存器请求帧 (功能码 0x03)
byte[] BuildReadRequest(ushort startAddr, ushort count)
{
   
    byte[] frame = new byte[12];
    // MBAP 头
    frame[0] = 0x00; frame[1] = 0x01;  // 事务ID
    frame[4] = 0x00; frame[5] = 0x06;  // 长度 = 6字节
    frame[6] = 0x01;                   // 单元ID
    // PDU 部分
    frame[7] = 0x03;                   // 功能码
    frame[8] = (byte)(startAddr >> 8); // 起始地址高字节
    frame[9] = (byte)startAddr;        // 起始地址低字节
    frame[10] = (byte)(count >> 8);    // 寄存器数量高字节
    frame[11] = (byte)count;           // 寄存器数量低字节
    return frame;
}

// 发送请求并解析响应
TcpClient client = new TcpClient("127.0.0.1", 502);
NetworkStream stream = client.GetStream();
stream.Write(requestFrame, 0, requestFrame.Length);

byte[] response = new byte[256];
int bytesRead = stream.Read(response, 0, response.Length);
// 解析响应数据(略)

优势:深入理解协议细节,适合定制化场景。


二、进阶功能

1. 服务端实现(模拟设备)

using NModbus;
using NModbus.Tcp;

var listener = new TcpListener(IPAddress.Any, 502);
listener.Start();
while (true)
{
   
    TcpClient client = listener.AcceptTcpClient();
    var factory = new ModbusFactory();
    var slave = factory.CreateSlave(1); // 从站地址=1

    // 绑定寄存器数据存储区
    slave.DataStore = new ModbusDataStore(); 
    slave.DataStore.HoldingRegisters[0] = 1234; // 初始化寄存器值

    Task.Run(() => slave.Listen(client.GetStream())); // 异步处理请求
}

应用场景:设备仿真、测试上位机逻辑。

2. 错误处理与重连

try
{
   
    master.WriteSingleRegister(0, 100); // 写入寄存器
}
catch (SocketException ex)
{
   
    Console.WriteLine($"网络错误: {ex.Message}");
    Reconnect(client); // 重连逻辑
}
catch (ModbusException ex)
{
   
    Console.WriteLine($"Modbus错误码: {ex.ErrorCode}");
}

3. 批量操作优化

// 一次读取多个寄存器(减少请求次数)
ushort[] batchData = master.ReadHoldingRegisters(0, 50);

// 批量写入寄存器
master.WriteMultipleRegisters(0, new ushort[]{
   10, 20, 30});

四、扩展应用

  1. 多设备管理

    使用 Dictionary<string, TcpClient>管理多个设备连接。

  2. 安全通信

    通过 VPN 或 TLS 加密隧道(需设备支持)。

  3. 与工业系统集成

    • 读取 PLC 数据(如西门子 S7-1200)
    • 连接 SCADA 系统(如 Ignition、WinCC)。

🔗 五、资源推荐

  1. 源码推荐
    • TCP Modbus通讯 采用TCP/IP通讯 www.youwenfan.com/contentalg/112098.html
  2. 调试工具
    • Modbus Poll(测试客户端)
    • Wireshark(抓包分析协议帧)

完整示例代码:NModbus 官方示例 github.com/NModbus/NModbus/tree/master/src/Samples

协议文档:Modbus TCP 规范 modbus.org/docs/Modbus_Messaging_Implementation_Guide_V1_0b.pdf

相关文章
|
6月前
|
缓存 安全 测试技术
基于C#实现Modbus RTU通信
基于C#实现Modbus RTU通信
|
7月前
|
机器学习/深度学习 边缘计算 安全
C#实现OPC客户端
C#实现OPC客户端,结合OPC DA与OPC UA两种协议
|
6月前
|
存储 监控 网络协议
基于C#和RS485串口通信的温湿度上位机实现方案
基于C#和RS485串口通信的温湿度上位机实现方案,整合了Modbus RTU协议通信、实时数据显示、数据存储及报警功能,代码可直接运行于.NET Framework 4.8环境
484 2
|
11月前
|
网络协议 网络安全 API
C# 与三菱FX5U PLC通讯交互指南
C# 与三菱FX5U PLC通讯交互指南
3362 121
|
监控 物联网 API
【.NET+MQTT】.NET6 环境下实现MQTT通信,以及服务端、客户端的双边消息订阅与发布的代码演示
MQTT广泛应用于工业物联网、智能家居、各类智能制造或各类自动化场景等。MQTT是一个基于客户端-服务器的消息发布/订阅传输协议,在很多受限的环境下,比如说机器与机器通信、机器与物联网通信等。好了,科普的废话不多说,下面直接通过.NET环境来实现一套MQTT通信demo,实现服务端与客户端的双边消息发布与订阅的功能和演示。
2538 0
【.NET+MQTT】.NET6 环境下实现MQTT通信,以及服务端、客户端的双边消息订阅与发布的代码演示
|
12月前
|
存储 网络协议 C#
C#实现与西门子S7-1200/1500 PLC通信
C#实现与西门子S7-1200/1500 PLC通信
|
7月前
|
监控 数据可视化 测试技术
C#与倍福PLC(通过ADS协议)通信上位机源程序实现
C#与倍福PLC(通过ADS协议)通信上位机源程序实现
|
存储 消息中间件 NoSQL
Redis 入门 - C#.NET Core客户端库六种选择
Redis 入门 - C#.NET Core客户端库六种选择
1305 8
|
物联网 C# Windows
看看如何使用 C# 代码让 MQTT 进行完美通信
看看如何使用 C# 代码让 MQTT 进行完美通信
2649 0
|
设计模式 开发框架 前端开发
循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(1)
循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(1)

热门文章

最新文章