MODBUS RTU通信协议详解与调试指南

一、MODBUS RTU简介

MODBUS RTU(Remote Terminal Unit)是一种基于串行通信(RS-485/RS-232)的工业标准协议,采用二进制数据格式,具有高效、可靠的特点,广泛应用于PLC、传感器、变频器等工业设备。

1. 主要特点

  • 通信方式:主从模式(Master/Slave)

  • 传输介质:RS-485(推荐)/ RS-232

  • 数据格式:二进制(HEX)

  • 校验方式:CRC-16(循环冗余校验)

  • 默认波特率:9600、19200、38400、115200等

  • 最大从站地址:247(地址范围1~247,0为广播地址)


二、MODBUS RTU数据帧格式

1. 基本帧结构

字段 说明 长度(字节)
从站地址 设备地址(1~247) 1
功能码 操作类型(读/写等) 1
数据域 寄存器地址、数据等 N
CRC校验 循环冗余校验(低字节在前) 2

2. 常用功能码

功能码 名称 操作
01 读取线圈状态 读取单个/多个DO(0x/1x)
02 读取输入状态 读取DI(1x)
03 读取保持寄存器 读取多个AO(4x)
04 读取输入寄存器 读取AI(3x)
05 写单个线圈 控制单个DO(0x)
06 写单个寄存器 写入单个AO(4x)
10(0x10) 写多个寄存器 写入多个AO(4x)

三、MODBUS RTU通信示例

1. 读取保持寄存器(功能码03)

请求帧(Master → Slave)

复制代码
[从站地址][功能码][起始地址高8位][起始地址低8位][寄存器数量高8位][寄存器数量低8位][CRC低8位][CRC高8位]

示例:读取从站地址1的保持寄存器40001(0x0000),读取1个寄存器

复制代码
01 03 00 00 00 01 84 0A

解析

  • 01:从站地址1

  • 03:功能码03(读保持寄存器)

  • 00 00:寄存器地址0x0000(对应40001)

  • 00 01:读取1个寄存器

  • 84 0A:CRC校验

响应帧(Slave → Master)

复制代码
[从站地址][功能码][字节数][数据1高8位][数据1低8位][CRC低8位][CRC高8位]

示例:返回数据1234(0x04D2)

复制代码
01 03 02 04 D2 B8 5F

解析

  • 01:从站地址1

  • 03:功能码03

  • 02:返回2字节数据

  • 04 D2:数据0x04D2(十进制1234)

  • B8 5F:CRC校验


四、MODBUS RTU调试方法

1. 使用串口调试助手

  1. 连接设备

    • 使用USB转485转换器连接PC和设备

    • 确保A/B线正确连接(A-A,B-B)

    • 终端电阻(120Ω)在长距离通信时需启用

  2. 参数设置

    • 波特率:9600(默认)

    • 数据位:8

    • 停止位:1

    • 校验位:无

  3. 发送MODBUS RTU指令

    • 输入16进制格式指令,如 01 03 00 00 00 01 84 0A

    • 点击发送,观察返回数据

  4. 解析响应

    • 检查返回的CRC是否正确

    • 解析数据域(如 04 D2 表示1234)

2. 使用MODBUS Poll(专业调试工具)

  • 可自动计算CRC

  • 支持多种功能码测试

  • 提供数据解析和图表显示


五、CRC-16校验计算

MODBUS RTU采用CRC-16校验,计算步骤如下(C语言示例):

c

复制代码
#include <stdint.h>

uint16_t crc16(uint8_t *data, uint16_t length) {
    uint16_t crc = 0xFFFF;
    for (uint16_t i = 0; i < length; i++) {
        crc ^= data[i];
        for (uint8_t j = 0; j < 8; j++) {
            if (crc & 0x0001) {
                crc >>= 1;
                crc ^= 0xA001;
            } else {
                crc >>= 1;
            }
        }
    }
    return crc;
}

示例

计算 01 03 00 00 00 01 的CRC:

c

复制代码
uint8_t data[] = {0x01, 0x03, 0x00, 0x00, 0x00, 0x01};
uint16_t crc = crc16(data, 6);  // 返回 0x840A(低字节在前:0A 84)

六、常见问题与解决方案

问题 可能原因 解决方案
无响应 1. 接线错误(A/B反接) 2. 波特率不匹配 3. 从站地址错误 检查接线、波特率、地址
CRC校验错误 1. 数据损坏 2. 校验算法错误 检查通信线路,重新计算CRC
返回异常码(错误响应) 1. 功能码不支持 2. 寄存器不存在 检查设备文档,确认功能码和寄存器范围

七、总结

  • MODBUS RTU是工业自动化中最常用的串行通信协议之一。

  • 数据帧包含 地址+功能码+数据+CRC ,采用 16进制(HEX) 传输。

  • 调试时需确保 波特率、数据位、停止位、校验位 一致。

  • CRC校验 是确保数据完整性的关键。

掌握MODBUS RTU协议,可以高效调试PLC、传感器、变频器等设备,适用于工业自动化、SCADA系统、能源监控等场景。 🚀

相关推荐
苏州向日葵2 小时前
virtualBox安装ubuntu,常用知识点
linux·运维·ubuntu
夜光小兔纸2 小时前
SQL Server 修改数据库名及物理数据文件名
运维·数据库·sql server
yangzx的网工日常3 小时前
网络的那些事——初级——OSPF(1)
运维·服务器·网络
layman05285 小时前
openEuler 虚拟机中 Shell 脚本实现自动化备份与清理实践
数据库·oracle·自动化
代码写到35岁10 小时前
Jenkins自动发布C# EXE执行程序
运维·c#·jenkins
钢琴上的汽车软件12 小时前
ARXML可视化转换工具使用说明
自动化·二次开发·可视化·转换·arxml
苹果醋314 小时前
AI大模型竞赛升温:百度发布文心大模型4.5和X1
java·运维·spring boot·mysql·nginx
程序员的世界你不懂14 小时前
Appium+python自动化(二十一)- Monkey指令操作手机
python·appium·自动化
liulilittle15 小时前
OpenSSL 的 AES-NI 支持机制
linux·运维·服务器·算法·加密·openssl·解密
风清再凯16 小时前
docker镜像的构建image
运维·docker·容器