当前位置: 首页 > news >正文

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 0x010x00 0x000x00 0x060x010x03起始地址+数量

代码实现

// 构建读寄存器请求帧 (功能码 0x03)
byte[] BuildReadRequest(ushort startAddr, ushort count)
{byte[] frame = new byte[12];// MBAP 头frame[0] = 0x00; frame[1] = 0x01;  // 事务IDframe[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/contentcsj/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

http://www.dtcms.com/a/520118.html

相关文章:

  • 《Git:从入门到精通(七)——Git分支管理与协作开发实战》
  • 超越传统工具:利用Reddit发现关键词的独特视角与前沿方法
  • 数据结构——二叉搜索树深度解析
  • macOS 无法在根目录创建目录的原因与解决方案
  • 11.23 鸿蒙HTTP数据请求
  • 郑州网站建设最低价网址导航的意思
  • LOESS回归
  • 跨平台开发中的图形渲染:Canvas与View+CSS的性能分析与决策路径
  • 能源经济选题推荐:可再生能源转型政策如何提高能源韧性?基于双重机器学习的因果推断
  • 《R for Data Science (2e)》免费中文翻译 (第11章) --- Communication(1)
  • 生成式对抗网络 GAN:从零理解生成对抗网络的原理与魅力
  • 李宏毅机器学习笔记30
  • 做塑胶材料的网站深圳网站设计平台
  • 【设计模式】装饰器模式(Decorator)
  • 设计模式之:享元模式
  • android 图像显示框架二——流程分析
  • CentOS 10 系统安装
  • MySQL试验部署
  • 【文献笔记】ICLR 2018 | Graph Attention Networks
  • Day69 SQLite3动态库移植 + BMP图像解析显示 + 进度条控件设计与动态文本管理
  • 通过自构建的时间服务器主机给客户端主机同步时间
  • [特殊字符] 软考架构师 vs. 考研408:全方位对比
  • C语言进阶:(一)深度剖析函数栈帧:从创建到销毁
  • 零基础从头教学Linux(Day 55)
  • 哪里有学做ppt的网站资阳的网站建设
  • Apple 开源FastVLM:AI看图说话更快更准
  • 交互式UTM坐标查询工具:让地理坐标转换变得简单
  • 初学者小白复盘15之指针(4)
  • 轻量级且简单的 macOS 应用 Forklift for mac
  • 和平板电脑厂商定制智慧养老平板有那种合作模式?