WPF上位机硬件通讯之Modbus 服务器
520快乐!

Let me share my code with you
主界面

英文主界面

Modbus服务器联合ModbusPoll调试实战

马思克的第一性原理之背诵知识点
适用:PLC / 仪表 / 变频器 / 上位机开发 / 现场调试
包含:功能码、地址分区、数据类型、字符串、大小端、异常码、通讯原理、踩坑大全
一、Modbus 核心功能码(FC1~FC7 + 常用扩展)
一、Modbus 核心功能码(FC1~FC7 + 常用扩展)
1. 基础七大功能码(必背)
| 功能码 | 名称 | 读写 | 对应区域 | 场景 |
|---|---|---|---|---|
| FC01 | 读线圈 | 读 | 0xxxx | 读取开关输出状态、继电器状态 |
| FC02 | 读离散输入 | 读 | 1xxxx | 读取外部传感器开关输入 |
| FC03 | 读保持寄存器 | 读 | 4xxxx | 最常用读参数、温度、压力、频率 |
| FC04 | 读输入寄存器 | 读 | 3xxxx | 只读实时采集数据 |
| FC05 | 写单个线圈 | 写 | 0xxxx | 单点启停、开关控制 |
| FC06 | 写单个寄存器 | 写 | 4xxxx | 调试最常用写参数、阈值、设定值 |
| FC07 | 读异常状态 | 读 | 设备状态 | 极少用,简易故障诊断 |
2. 工程高频扩展功能码
-
FC08:通讯诊断、线路测试
-
FC15:批量写线圈
-
FC16:批量写保持寄存器(项目刚需)
-
FC17:读取从站设备信息
二、Modbus 四大地址分区(核心中的核心)
-
0区 线圈 00001~09999:位数据、可读写、开关量,FC01/05/15
-
1区 离散输入 10001~19999:位数据、只读、外部输入,FC02
-
3区 输入寄存器 30001~39999:字数据、只读、仪表采集值,FC04
-
4区 保持寄存器 40001~49999:字数据、可读写、设备参数,FC03/06/16
备注:程序内偏移地址通常从0开始 ,图纸地址从1开始,调试最容易踩坑。
三、Modbus 完整数据类型(含字符串)
基础规则:1寄存器 = 16位 = 2字节
| 数据类型 | 占用寄存器 | 取值范围 | 用途 |
|---|---|---|---|
| Bool 位 | 1bit | 0 / 1 | 开关、报警、状态 |
| UInt16 | 1 | 0 ~ 65535 | 频率、转速、电压整数 |
| Int16 | 1 | -32768 ~ 32767 | 温差、偏移量、正负值 |
| UInt32 | 2 | 0 ~ 4294967295 | 累计电量、累计流量 |
| Int32 | 2 | -2147483648 ~ 2147483647 | 大额正负计量值 |
| Float 单精度浮点 | 2 | ±3.4E38 | 温度、压力、液位、模拟量 |
| Double 双精度 | 4 | 极大 | 高精度设备(极少用) |
| BCD码 | 1 | 0~9999 | 时间、日期、设备编号 |
| ASCII 字符串 | 按需 | 可见字符 | 设备名、序列号、地址 |
字符串存储规则(重点)
-
1寄存器 = 2个ASCII字符
-
高字节在前、低字节在后
-
末尾 0x00 为空终止符,读取后需截断
-
字符数奇数时,最后寄存器低位补0
四、Modbus 四大大小端字节序(ABCD 完整版)
假设有32位数据原始4字节顺序:A(最高) B C D(最低)
| 排序格式 | 字节顺序 | 名称 | 说明 | 场景 |
|---|---|---|---|---|
| 标准大端 | AB CD | 字大端+字节大端 | 协议默认,无需转换 | 绝大多数标准PLC/仪表 |
| 字反转 | CD AB | 字序反转 | 两个寄存器整体颠倒 | 大量国产非标设备 |
| 字节反转 | BA DC | 字节序反转 | 单个寄存器内部倒序 | 上位机乱码高发 |
| 全小端 | DC BA | 全反转 | 字+字节全部颠倒 | 部分单片机设备 |
口诀:先试ABCD,数据不对立刻换CDAB(90%情况解决)
五、数据缩放换算(工程固定公式)
-
温度、湿度:原值 ÷ 10
-
电压、电流:原值 ÷100
-
百分比:原值 ÷ 10
-
累计量:原值 × 倍率
六、通讯参数硬性规则
1. 设备类型
固定:一主多从,一个主站轮询多个从站
从站地址:1~247,0为广播地址
1.1 设备组合
Modbus+网络=ModbusTCP
Modbus+串口=ModbusRtu
2. RTU串口参数(必须全部一致)
- 波特率:9600 / 19200 / 38400 / 115200。。。
- 数据位:8
- 停止位:1 / 2
- 校验位:无校验、奇校验、偶校验
2.1TCP参数
IP/端口号
3. 读写数量限制(高频报错点)
-
单次读线圈最大:2000点
-
单次读寄存器最大:125个
-
超出必须分包轮询
七、异常码排查大全(调试神器)
-
01:非法功能码(设备不支持该指令)
-
02:非法地址(寄存器地址不存在)
-
03:非法数据值(参数超出设备范围)
-
04:从站设备故障(设备内部报错)
-
05:应答确认
-
06:从站忙(重试即可)
八、RTU / TCP 报文核心区别
-
Modbus-RTU :从站ID + 功能码 + 数据 + CRC16校验
-
Modbus-TCP :事务头 + 长度 + 从站ID + 功能码 + 数据(无CRC)
九、现场90%故障速查
-
不通讯:AB线接反、波特率/校验位不一致、从站地址错
-
数据乱码:大小端顺序不对
-
只能读不能写:寄存器只读、设备锁定、权限未开
-
偶尔丢包:485无终端电阻、线路干扰、波特率过高
-
浮点数值离谱:高低字颠倒
十、极简工程口诀
- 读数值用03,写参数用06
- 采传感器用04,控开关用01/05
- 浮点不对先换CDAB
- 所有32位数据必须连续寄存器
- 串口看参数,网口看IP和端口
漂亮饭,安排!

*****************Y*******X******G***K******