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系统、能源监控等场景。 🚀

相关推荐
Ten peaches20 分钟前
Selenium-Java版(环境安装)
java·前端·selenium·自动化
斯文by累34 分钟前
解锁DeepSeek潜能:Docker+Ollama打造本地大模型部署新范式
运维·docker·容器
不许哈哈哈1 小时前
自动化点击工具
运维·python·自动化
无敌小胜2 小时前
使用教程:8x16模拟开关阵列可级联XY脚双向导通自动化接线
运维·自动化
努力学习的小廉2 小时前
深入了解linux系统—— 基础IO(上)
android·linux·运维
末央&2 小时前
【Linux】进程的基本概念
linux·运维·服务器
微刻时光3 小时前
影刀处理 Excel:智能工具带来的高效变革
人工智能·python·低代码·自动化·excel·rpa·影刀rpa
chao_7895 小时前
电商平台自动化
测试工具·自动化
小羊Linux客栈6 小时前
自动化:批量文件重命名
运维·人工智能·python·自动化·游戏程序