Modbus协议概述
Modbus协议由Modicon公司于1979年开发,最初用于PLC(可编程逻辑控制器)之间的通信,是目前工业自动化领域应用最广泛的串行通信协议之一。Modbus协议标准开放、公开发表且无版权要求,支持多种电气接口(RS-232、RS-422、RS-485以及TCP/IP网络),使其成为连接不同厂商工业设备的事实标准。
Modbus采用主从(Master/Slave)架构:总线上只有一个主站设备(如PLC或上位机)发起通信请求,其余从站设备(如传感器、执行器、变频器等)响应主站的请求。从站不会主动发送数据,从站之间也不直接通信。每个从站设备拥有唯一的地址(1–247),主站通过地址区分和寻址目标设备。同一总线上不支持多个主站同时轮询。
Modbus协议在OSI模型中属于应用层(第7层),其物理层独立于协议本身——可以使用RS-232短距离点对点连接,也可以使用RS-485长距离多站总线,或者通过TCP/IP以太网传输。这种物理层无关性使Modbus可以灵活适配各种工控现场条件。
Modbus数据传输模式
Modbus串行通信定义了两种传输模式:RTU模式(Remote Terminal Unit)和ASCII模式(American Standard Code for Information Interchange)。
RTU模式
RTU模式是Modbus串行通信最常用的模式,采用二进制数据传输,每个8位字节直接发送,具有较高的传输效率和稳定性。RTU模式使用16位CRC(循环冗余校验)进行差错检测。
RTU帧结构
RTU帧 = 从站地址(1字节) + 功能码(1字节) + 数据(N字节) + CRC校验(2字节)
| 字段 | 长度 | 说明 |
|---|---|---|
| 从站地址 | 1字节 | 单播地址1~247,地址0为广播地址(从站不返回响应) |
| 功能码 | 1字节 | 指定读取或写入的操作类型(如03读保持寄存器、06写单个寄存器) |
| 数据 | N字节 | 请求中可包含起始地址和数量,响应中包含字节数与寄存器值;最大252字节 |
| CRC | 2字节 | 对从站地址到数据末尾的全部字节计算CRC-16/Modbus,低字节先发送 |
RTU帧总长度最大为256字节。帧与帧之间至少需要3.5个字符时间的静默间隔用于帧同步;帧内相邻字节之间的间隔不得超过1.5个字符时间,否则接收设备会认为帧不完整并丢弃。当波特率高于19200时,推荐使用固定的1.75ms帧间隔。
CRC-16校验算法
Modbus RTU的CRC校验使用初始值0xFFFF,多项式为0x8005(反向形式为0xA001)。计算范围覆盖从站地址和功能码至数据末尾的全体字节(不包括CRC本身)。计算得到的16位CRC值先发送低字节,再发送高字节。CRC校验能够检测传输过程中的位错误,但不能验证寄存器地址、数据类型或倍率是否正确。
ASCII模式
ASCII模式将每个8位数据字节编码为两个ASCII字符发送,报文以冒号(":",0x3A)开头,以回车换行符(CRLF,0x0D 0x0A)结束。ASCII模式使用LRC(纵向冗余校验)进行差错检测。
ASCII帧结构
ASCII帧 = 起始":" + 从站地址(2 ASCII字符) + 功能码(2 ASCII字符) + 数据(2N ASCII字符) + LRC(2 ASCII字符) + 结束CRLF
ASCII模式的帧内容完全以可读的十六进制字符形式呈现:例如发送字节0xAB,在ASCII模式下会编码为字符'A'(0x41)和字符'B'(0x42)。这种编码方式使报文具有较好的人眼可读性,便于调试,但传输效率约比RTU模式低一倍。
LRC校验计算
LRC(Longitudinal Redundancy Check)的计算方式为:将从站地址到数据末尾的全体字节相加,取结果补码(256 - sum & 0xFF)。LRC为一个字节,编码为两个ASCII字符附加在数据末尾。ASCII模式允许两个字符之间最长1秒的间隔而不引发通信故障,这使得ASCII模式在低速或干扰较大的链路上更加容错。
| 对比项 | RTU模式 | ASCII模式 |
|---|---|---|
| 数据编码 | 二进制(每个字节直接发送) | ASCII字符(每个字节拆为2个字符) |
| 校验方式 | CRC-16(2字节) | LRC(1字节) |
| 传输效率 | 高 | 约为RTU的一半 |
| 帧定界 | 3.5字符时间静默间隔 | 起始":" + 结束CRLF |
| 字符间隔容限 | 不超过1.5字符时间 | 最长1秒 |
| 可读性 | 不可直接阅读 | 人眼可读,便于调试 |
| 应用广泛性 | 最常用、工业标准 | 较少使用 |
Modbus数据模型
Modbus协议定义了四种基本数据类型,按读写属性和数据宽度划分:
| 对象类型 | 数据宽度 | 读写属性 | 对应功能码 |
|---|---|---|---|
| 线圈(Coils) | 1位 | 读写 | 01(读)、05(写单个)、0F(写多个) |
| 离散输入(Discrete Inputs) | 1位 | 只读 | 02(读) |
| 输入寄存器(Input Registers) | 16位 | 只读 | 04(读) |
| 保持寄存器(Holding Registers) | 16位 | 读写 | 03(读)、06(写单个)、10(写多个) |
每个数据区有独立的地址空间。保持寄存器通常存放可读写的配置参数和状态值(如PLC的模拟量输出、变频器的频率设定值),输入寄存器存放只读的测量值(如温度传感器读数)。线圈对应数字量输出控制,离散输入对应数字量输入状态。
常用功能码详解
Modbus协议定义了二十多种功能码,实际工程中最常用的有以下几种:
01(0x01)——读取线圈状态
读取从站一组线圈(数字量输出)的ON/OFF状态。请求中指定起始地址和读取数量;响应中以打包的位数据返回每个线圈的状态。读取数量不可超过2000个(约250字节)。
02(0x02)——读取离散输入状态
读取从站一组离散输入(数字量输入)的状态。帧结构与功能码01类似。
03(0x03)——读取保持寄存器
最常用的功能码之一。读取从站一个或多个保持寄存器的16位数值。请求中指定起始寄存器地址和读取数量(最大125个寄存器);响应中返回字节计数和寄存器值。每个寄存器的高字节先传输(大端序)。
04(0x04)——读取输入寄存器
读取从站输入寄存器的数值,常用于获取传感器测量值(温度、压力、流量等)。
05(0x05)——写单个线圈
控制单个线圈的ON/OFF状态。写入值0xFF00表示ON,0x0000表示OFF。
06(0x06)——写单个保持寄存器
写入单个保持寄存器的16位数值。请求和响应帧结构相同,写入成功时从站回显请求报文以确认。
0F(0x0F)——写多个线圈
写入一组连续的线圈状态。请求中指定起始地址、线圈数量和打包的位数据。
10(0x10)——写多个保持寄存器
写入一组连续的保持寄存器值。请求中指定起始地址、寄存器数量和要写入的字节数据,最大一次写入123个寄存器。
物理层与工控组网选择
Modbus串行通信的物理层通常使用RS-232或RS-485接口:
RS-232接口
适用于短距离(15米以内)点对点连接。使用3线(TxD、RxD、GND)即可实现全双工通信。常用于连接本地编程设备或单台仪表。
RS-485接口
工业Modbus组网最常用的物理层。支持多点总线拓扑,一条总线上最多可挂接32个标准负载节点(使用1/8负载芯片时可扩展至256个)。通信距离可达1200米(在较低波特率下),抗共模干扰能力强。工作在半双工模式下,使用双绞线(A、B线)传输差分信号。
实际组网时,波特率常见配置为9600 bps或19200 bps,数据位8位,停止位1位,无校验或偶校验。所有设备的串口参数必须一致。
异常响应与错误码
当从站无法处理主站的请求时,会返回异常响应帧。异常响应的功能码为原请求功能码的最高位(bit 7)置1(如请求03返回83),数据字段为异常码。常见的异常码包括:
| 异常码 | 名称 | 含义 |
|---|---|---|
| 01 | 非法功能 | 从站不支持该功能码 |
| 02 | 非法数据地址 | 指定的寄存器地址或数量超出范围 |
| 03 | 非法数据值 | 请求中的数值超出允许范围 |
| 04 | 从站设备故障 | 从站内部处理错误 |
Modbus RTU请求/响应示例
以下示例展示读取从站保持寄存器的完整报文过程:
主站请求:读取从站地址为01的设备,从寄存器地址100(0x0064)开始,连续读取3个保持寄存器。
01 03 00 64 00 03 44 14
报文解析:01=从站地址,03=功能码(读保持寄存器),00 64=起始地址(100),00 03=读取3个寄存器,44 14=CRC校验码。
从站正常响应:
01 03 06 00 0A 01 2B 00 0C C8 85
报文解析:01=从站地址,03=功能码,06=后续数据字节数(3个寄存器×2字节),00 0A=寄存器100的值(10),01 2B=寄存器101的值(299),00 0C=寄存器102的值(12),C8 85=CRC校验码。
从站异常响应(非法数据地址):
01 83 02 C0 F1
其中83为功能码03的最高位置1,02为异常码(非法数据地址),C0 F1为CRC。
工控应用实践指南
在工业现场部署Modbus通信系统时,以下实践要点有助于提高通信可靠性:
1. 总线终端匹配:使用RS-485总线时,应在总线两端各并联一个120Ω终端电阻,以消除信号反射。对于短距离低速链路(<50米、19200bps以下),可省略终端电阻。
2. 接地与屏蔽:RS-485的屏蔽层应单端接地(通常在主机侧),避免形成地环路。信号地(GND)线应在所有节点间贯通。
3. 地址分配:每个从站地址在总线上必须唯一。地址0为广播地址,从站接收到广播指令时不返回响应。
4. 超时处理:主站应为每个请求设置超时时间(通常在100ms–1000ms之间),以检测从站无响应或通信中断的情况。
5. 波特率选择:9600 bps和19200 bps是工控Modbus最常用的波特率。较高的波特率(115200 bps以上)仅适用于短距离高质量线路。
6. 寄存器地址映射:设备手册中的地址编号(如40001)与报文中的实际地址通常存在偏移(40001对应报文地址0)。务必确认设备手册的地址编码规则,不可统一减一处理。
总结
Modbus RTU作为工业自动化领域使用最广泛的串行通信协议,以其开放、简单、可靠的特点成为连接PLC、传感器、变频器和执行器的首选方案。配合RS-485物理层,Modbus可以在长达1200米的距离上连接数十台设备,满足大多数工业现场的需求。理解Modbus的帧结构、功能码和数据模型,对于工控设备的选型、调试和维护具有重要意义。对于使用PCIe多串口卡、USB转串口适配器等工控通信产品的用户来说,掌握Modbus协议的基础知识是现场调试配网的重要技能。