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

基于C# 和 NModbus 库的 Modbus TCP 通信示例源码

基于 C# 和 NModbus 库Modbus TCP 通信示例源码,包含 客户端(Master)服务器端(Slave) 的实现,支持读写寄存器、线圈等操作。


一、环境准备

  1. NuGet 依赖安装

    在项目中安装 NModbus库(支持 .NET Framework 和 .NET Core):

    Install-Package NModbus
    
  2. 网络配置 Modbus TCP 默认端口为 502,需确保防火墙开放该端口。 从站地址(Unit ID)范围:1~247(默认 1)。


二、Modbus TCP 客户端(Master)示例

1. 同步读写操作

using System;
using System.Net.Sockets;
using Modbus.Device;class ModbusTcpClientDemo
{static void Main(){string ipAddress = "192.168.1.100"; // 从站 IPint port = 502;                     // Modbus TCP 端口ushort unitId = 1;                // 从站地址using (TcpClient client = new TcpClient(ipAddress, port)){ModbusTcpMaster master = ModbusTcpMaster.CreateIp(client);try{// 读取保持寄存器(地址0,长度10)ushort startAddr = 0;ushort numRegs = 10;ushort[] registers = master.ReadHoldingRegisters(unitId, startAddr, numRegs);Console.WriteLine("读取保持寄存器结果:");for (int i = 0; i < registers.Length; i++){Console.WriteLine($"地址 {startAddr + i}: {registers[i]}");}// 写入单个寄存器(地址0,值1234)ushort writeAddr = 0;ushort writeValue = 1234;master.WriteSingleRegister(unitId, writeAddr, writeValue);Console.WriteLine($"写入寄存器 {writeAddr} 成功,值为 {writeValue}");}catch (Exception ex){Console.WriteLine($"通信错误:{ex.Message}");}}}
}

2. 异步读写操作

using System;
using System.Net.Sockets;
using Modbus.Device;
using System.Threading.Tasks;class ModbusTcpAsyncDemo
{static async Task Main(){string ipAddress = "192.168.1.100";int port = 502;ushort unitId = 1;using (TcpClient client = new TcpClient()){await client.ConnectAsync(ipAddress, port);ModbusTcpMaster master = ModbusTcpMaster.CreateIp(client);try{// 异步读取保持寄存器ushort startAddr = 0;ushort numRegs = 10;ushort[] registers = await master.ReadHoldingRegistersAsync(unitId, startAddr, numRegs);Console.WriteLine("异步读取结果:");foreach (var reg in registers){Console.Write(reg + " ");}// 异步写入多个线圈ushort startCoil = 0;bool[] coilValues = { true, false, true };await master.WriteCoilsAsync(unitId, startCoil, coilValues);}catch (Exception ex){Console.WriteLine($"异步通信错误:{ex.Message}");}finally{client.Close();}}}
}

三、Modbus TCP 服务器端(Slave)示例

1. 基础服务器实现

using System;
using System.Net;
using System.Net.Sockets;
using Modbus.Device;
using Modbus.Utility;class ModbusTcpSlaveDemo
{static void Main(){ushort slaveId = 1;        // 从站 IDint port = 502;            // 监听端口using (TcpListener listener = new TcpListener(IPAddress.Any, port)){listener.Start();Console.WriteLine($"Modbus TCP 从站已启动,监听端口 {port}...");ModbusSlave slave = ModbusTcpSlave.CreateTcp(slaveId, listener);slave.DataStore = DataStoreFactory.CreateDefaultDataStore(); // 初始化数据存储// 模拟数据更新(例如传感器数据)System.Timers.Timer timer = new System.Timers.Timer(1000);timer.Elapsed += (s, e) =>{ushort[] holdingRegs = slave.DataStore.HoldingRegisters;for (int i = 0; i < holdingRegs.Length; i++){holdingRegs[i] = (ushort)(i + (int)(DateTime.Now.Second * 0.5)); // 动态数据}};timer.Start();slave.Listen(); // 开始监听请求Console.WriteLine("按任意键退出...");Console.ReadKey();slave.Stop();}}
}

2. 自定义数据处理(事件驱动)

using System;
using Modbus.Device;
using Modbus.Utility;class CustomModbusSlave
{public static void Main(){ushort slaveId = 1;int port = 502;using (TcpListener listener = new TcpListener(IPAddress.Any, port)){listener.Start();ModbusSlave slave = ModbusTcpSlave.CreateTcp(slaveId, listener);slave.DataStore = DataStoreFactory.CreateDefaultDataStore();// 注册事件处理slave.ModbusSlaveRequestReceived += (sender, e) =>{Console.WriteLine($"收到请求:功能码 {e.Message.FunctionCode},地址 {e.Message.StartAddress},长度 {e.Message.Quantity}");};slave.Listen();Console.WriteLine("自定义从站运行中,按任意键退出...");Console.ReadKey();slave.Stop();}}
}

参考代码 modbus tcp通讯 示例源码 www.youwenfan.com/contentcnn/93804.html

四、关键功能说明

  1. 数据存储区 保持寄存器(Holding Registers):地址从 0 开始,用于存储可读写的 16 位数据(如传感器值)。 输入寄存器(Input Registers):地址从 0 开始,仅支持读取(如设备状态)。 线圈(Coils):布尔值(0/1),地址从 0 开始离散输入(Discrete Inputs):只读布尔值。
  2. 异常处理 捕获 ModbusSlaveException处理协议错误(如非法地址)。 设置超时时间:master.Transport.ReadTimeout = 3000;(单位:毫秒)。
  3. 性能优化 批量读写:使用 ReadMultipleRegistersWriteMultipleRegisters减少网络开销。 多线程处理:服务器端使用异步监听(async/await)提升并发能力。

五、测试工具推荐

  1. Modbus Poll(Windows) 功能:模拟主站,发送读写请求,验证从站响应。 下载地址:Modbus Poll /www.modbusdriver.com/software/modbus-poll.html)
  2. Modbus Slave(Windows) 功能:模拟从站,提供数据存储和响应。
http://www.zskr.cn/news/116283.html

相关文章:

  • 2025年国内靠谱淘宝天猫代运营公司盘点:全域增长时代的优选指南 - 深度智识库
  • 天天爱打卡
  • 数论基础
  • 科技赋能精准种植 水肥一体化激活粮食产能新引擎
  • 2025智能垃圾分类数据集深度解析与实战应用
  • 贪吃蛇
  • Hooks-Admin终极指南:快速搭建现代化后台管理系统
  • VSCode集成Jupyter量子计算实战指南(量子模拟内核全解密)
  • 2026数字经济定调:数据要素成核心引擎,可信数据空间建设引行业升级
  • 如何在30分钟内完成量子电路的高精度VSCode可视化渲染?
  • 被低估的前置语音技术——为什么你的语音 AI 总「听不清」?一篇文章讲清楚 3A、VAD 和声纹识别丨社区来稿
  • 2025年高口碑十大NMN抗衰产品评测,NMN哪个牌子最靠谱?深度解析NMN牌子 - 资讯焦点
  • 2025年喷雾型聚合氯化铝厂商权威推荐榜单:工业级聚合氯化铝/聚合氯化铝絮凝剂/聚合氯化铝源头厂商精选 - 品牌推荐官
  • PLC通讯编程系列之一,为什么复位发送请求信号要在发送块的前面?
  • 长沙GEO优公司,ai搜索推广,让企业节省80%的广告费 - 舆通Geo
  • 一键部署EmotiVoice:Docker镜像使用指南
  • 2025恒温恒湿试验箱年终大盘点:国货崛起,如何选择最适合你的品牌? - 品牌推荐大师1
  • 可信数据空间能给企业和个人带来什么?2026政策下的新机遇
  • 2025年山东软件项目验收测试报告服务商权威推荐榜单:山东安全渗透性测试/山东系统验收报告/山东第三方软件测试资质机构精选 - 品牌推荐官
  • 176. 第二高的薪水
  • 如何从零开始打造你的第一台四足机器人:Mini Pupper完全实战手册
  • Windows Terminal:一站式多设备远程管理终极解决方案
  • 从“监控”到“可观测”:2025年主流IT监控系统架构演进与选型建议
  • Element Plus自动化部署终极指南:从零到一的完整指南
  • Feishin音乐播放器:为什么它是最佳的自托管音乐解决方案?
  • 智能内容本地化革命:打造永久收藏的数字宝库
  • 量子计算结果不稳定?你必须知道的VSCode+Jupyter 7个调试秘籍
  • 三分钟带你掌握Function Calling
  • 【linux期末大作业】在Ubuntu22.04上通过XQUME安装RISC-V架构的linux系统并写hello world进行测试
  • 你还在手动调试量子代码?VSCode自动化性能分析实战详解