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

怎么用 Modbus 让两个设备互相通信**,包含硬件接线、协议原理、读写步骤,以及 C# 实操示例。

怎么用 Modbus 让两个设备互相通信*,包含硬件接线、协议原理、读写步骤,以及 C# 实操示例。

一、先搞懂:Modbus 通信的基本结构

Modbus 是主从模式(Master-Slave)

  • 主站(Master):电脑 / PLC / 网关 → 主动发指令
  • 从站(Slave):仪表 / 传感器 / 继电器 → 只回复,不主动发
  • 通信方式:
    • Modbus RTU:串口 RS485(最常用)
    • Modbus TCP:以太网(网线,IP 通信)

二、硬件怎么接?(以最常见的 Modbus RTU 为例)

  1. 电脑端

    • USB 转 485 转换器(CH340 / FT232 等)
  2. 设备端

    • 一般 3 根线:A / B / GND
  3. 接线规则

    • A 接 A
    • B 接 B
    • GND 接 GND
    • 千万不能接反,否则通信失败
  4. 串口参数(必须一致)
    设备默认通常是:

    • 波特率:9600
    • 数据位:8
    • 校验位:无
    • 停止位:1
    • 流控:无

三、Modbus 核心:4 种数据区(必须记住)

设备里的数据存在 4 个区域,用功能码区分:

功能码名称含义常用叫法
01Read Coils读开关量输出DO / 线圈
02Read Discrete Inputs读开关量输入DI
03Read Holding Registers读保持寄存器最常用,读温度、电压、参数
04Read Input Registers读输入寄存器只读传感器数据

写数据:

  • 05:写单个线圈
  • 06:写单个寄存器
  • 15:写多个线圈
  • 16:写多个寄存器

四、一次完整通信流程(以读温度为例)

  1. 主站发送报文(格式):
    从站地址 + 功能码 + 起始地址 + 寄存器个数 + CRC校验

  2. 从站回复:
    从站地址 + 功能码 + 数据长度 + 数据 + CRC

举个例子(读 1 号从站,地址 0 开始的 2 个寄存器):

发送:01 03 00 00 00 02 C4 0B
回复:01 03 04 01 23 45 67 …

五、C# 实操:最简单的 Modbus 读写(用 NModbus)

这是你最常用的场景,直接复制可用。

1. 安装 NuGet 包

NModbus4 // 或 NModbus

2. Modbus RTU 读保持寄存器(功能码 03)

usingSystem.IO.Ports;usingModbus.Device;// 1. 打开串口SerialPortport=newSerialPort("COM3",// 你的串口号9600,// 波特率Parity.None,8,StopBits.One);port.Open();// 2. 创建 Modbus 主站varmaster=ModbusSerialMaster.CreateRtu(port);// 3. 读从站 1,起始地址 0,读 2 个寄存器ushort[]values=master.ReadHoldingRegisters(slaveId:1,startAddress:0,numberOfRegisters:2);// 输出结果Console.WriteLine($"寄存器0:{values[0]}");Console.WriteLine($"寄存器1:{values[1]}");

3. 写保持寄存器(功能码 06)

// 写 1 个值到从站1,地址 10master.WriteSingleRegister(slaveId:1,registerAddress:10,value:1234);

4. Modbus TCP 版本(网线通信)

vartcpClient=newTcpClient("192.168.1.100",502);varmaster=ModbusIpMaster.CreateIp(tcpClient);ushort[]values=master.ReadHoldingRegisters(1,0,2);

六、调试必用工具(非常重要)

  • Modbus Poll:主站调试工具
  • Modbus Slave:模拟从站
  • 用这两个可以先测试通信是否正常,再写代码

七、常见问题

  1. 读不到数据
    • 串口号错 / 波特率不对
    • A B 接反
    • 从站地址不对
  2. 数据乱码
    • 校验位/停止位不匹配
    • 没有共地(GND)
  3. CRC 错误
    • 接线干扰、距离太长、没加终端电阻

http://www.jsqmd.com/news/525408/

相关文章:

  • 避坑指南:X-AnyLabeling多边形转掩码时常见的5个JSON格式错误及解决方法
  • AgentCPM深度研报助手:利用GitHub Actions实现自动化测试与部署
  • 亚洲美女-造相Z-Turbo可部署方案:单卡3090/4090即可运行的轻量文生图服务
  • 社交媒体自动化营销趋势分析:未来3年怎么玩(2026-2029)
  • 效率系列(九) macOS 前端开发环境优化与个性化配置指南
  • 用Substance Painter制作写实金属锈蚀效果:从智能材质到粒子笔刷的完整流程
  • 从PyInstaller到NSIS:一个全栈项目打包避坑指南当Vue遇上FastAPI,如何优雅地打包成Windows安装程序
  • Cogito-V1-Preview-Llama-3B智能体(Agent)框架开发:自主任务规划与执行
  • HFSS与CST天线仿真设计
  • 超声波测距进阶:如何优化HC-SR04的精度与稳定性(附Arduino代码)
  • 探索高效自动化测试新工具:FlaUI
  • SenseVoice-Small低延迟语音识别效果:实时会议字幕生成案例
  • 富文本编辑器:协同编辑与操作转换算法解析
  • PyTorch版本选不对,GPU再强也白费!手把手教你根据CUDA 12.x选对Torch版本
  • Wireshark实战:如何从流量包中揪出黑客的蛛丝马迹(附真实案例解析)
  • 推荐系统工程师必看:如何高效追踪RecSys/KDD/SIGIR顶会论文中的工业落地技术?
  • 保姆级教程:PX4飞控启动脚本rcS完全解读与自定义配置(附避坑指南)
  • Z-Image-Turbo-辉夜巫女实战教程:为原创音乐专辑设计封面+内页插画统一视觉体系
  • SmolVLA与Node.js全栈开发:构建AI赋能的后台管理系统
  • 【首发实测】RTX 4060 成功捕获 Karpathy 的“自动科研助手”!5分钟跑完 3500 万 Token,进化开始!
  • Java Map遍历方式
  • RexUniNLU效果展示:多模态文档理解能力测评
  • Isaac Sim远程开发避坑指南:从TurboVNC配置到普通用户权限切换
  • OpenClaw硬件适配:Qwen3.5-9B在M1/M2芯片的优化运行方案
  • Node.js后端服务调用Nanbeige 4.1-3B AI能力:完整集成示例
  • LeetCode Hot 100 | 哈希表专题(C++ 题解)
  • 从零到一:小兔鲜电商项目全栈开发实战与架构演进
  • 快速上手Python GUI开发:PyCharm与Anaconda3集成PyQt5的完整配置流程
  • 软件测试自动化:Gemma-3-270m生成测试用例
  • Python离线环境终极方案:用虚拟机打包完整开发环境(附RHEL7.6/Python3.7实战)