【嵌入式基础知识梳理#11】Modbus-RTU工业总线协议
一、协议的层级划分
1. 硬件层协议,通常聚焦于解决电气和电平问题,用于解决0/1的可靠传输,通常有:
(1)RS232
(2)RS485总线 (串行差分、异步、半双工、主从由软件层决定)
(3)CAN总线(串行差分、异步位同步、半双工、多主多从)
(4)I2C总线(串行、同步、半双工、一主多从)
(5)SPI总线(串行、同步、全双工、一主多从居多/具有多主多从模式)
2. 软件层协议,解决实际应用场合的传输目的问题:
(1)Modbus
(2)CANopen
(3)TCP/IP
ModBus于1979年由莫迪康电气研发,后来被施耐德电气收购。Modbus提供脚本语言用于设备通讯。目前为止,Modbus就像汽车行业的CANopen,属于工业行业应用最广的协议。
具体的七层协议上讲,Modbus属于应用层协议,定义了控制器能够认知和使用的消息结构,无论他们经过何种硬件网络通信。
二、Modbus的通信过程
(1)主从模式:无论何种硬件层协议,进入Modbus后强制一主多从
(2)忙机制判断:Modbus没有忙机制判断,需要进行其他软件仲裁
(3)从机存储
ModBus的从机存储区分为只读只写两种。
存储的数据类型分为:布尔值/16为寄存器
Modbus协议规定四个从机存储区,称为0 1 3 4区,03只读,14可读可写
区号 | 名称 | 读写 | 地址范围 |
---|---|---|---|
0区 | 输出线圈 | 可读可写布尔量 | 00001-09999 |
1区 | 输入触点 | 只读布尔量 | 10001-19999 |
3区 | 输入寄存器 | 只读寄存器 | 30001-39999 |
4区 | 保持寄存器 | 可读可写寄存器 | 40001-49999 |
1. 输出线圈:通常以布尔值形式出现,用于电磁阀、灯光、继电器等的开关控制和回调
2. 输入触点:通常以布尔值形式反馈,用于反馈外部设备的开关状态
3. 输入寄存器:以16位形式出现,表示以数字反馈某些状态
4. 保持寄存器:以16位形式出现,用数字形式实现控制和回调
读写的方式为,数据起始地址+多少字节数据(+写入内容)
三、Modbus-RTU协议
Modbus-RTU是一种紧凑的,十六进制表示数据的方式。
比如我们要发送66给从机,则总线上传输的数据为0x42
在Modbus中,报文等价于数据帧。
(1)Modbus报文
Modbus的一个数据帧,也就是一个报文以以下形式出现。
从机地址 | 功能码 | 数据 | CRC/LRC |
---|---|---|---|
1 byte | 1 byte | N bytes | 2 bytes |
1. 从机地址:每个从机都有一个字节的从机地址,只有1-247能被识别,255意味广播
2. 功能码:指示报文的具体功能
3. 数据:由器件规定,比如要读取风压计的数据,则填入数据地址(子地址)和字节数
4. 校验:CRC校验位
(2)Modbus功能码
功能码 | 功能说明 |
---|---|
01H | 读取输出线圈 |
02H | 读取输入触点 |
03H | 读取保持寄存器 |
04H | 读取输入寄存器 |
05H | 写入单线圈 |
06H | 写入单保持寄存器 |
0FH | 写入多线圈 |
10H | 写入多保持寄存器 |
其中,读取功能适用于线圈、触点、状态寄存器、保持寄存器
而写入功能只适用于线圈和保持寄存器。
三、Modbus-RTU常用格式举例
(1)主机读从机内容
主机发送报文:
从机地址 | 功能码 | 起始(高) | 起始(低) | 数量(高) | 数量(低) | 校验 |
---|---|---|---|---|---|---|
0x01 | 0x03 | 0x00 | 0x01 | 0x00 | 0x01 | 0xD5 0xCA |
从机地址为0x01,功能吗0x03(查询寄存器信息),起始地址0x0001,数量读一个,还有CRC校验位,这个根据校验位之前的内容用工具算出来。
从机发送报文:
从站地址 | 功能码 | 返回字节数 | 寄存器内容(高) | 寄存器内容(低) | 校验 | |
---|---|---|---|---|---|---|
0x01 | 0x03 | 0x02 | 0x00 | 0x17 | 0xF8 0x4A |
从机功能码与主机保持一致,检验位由自动化设备负责。
(2)主机写从机内容
主机发送报文:
从站地址 | 功能码 | 数据地址(高) | 数据地址(低) | 数据(高) | 数据(低) | 校验 |
---|---|---|---|---|---|---|
0x01 | 0x06 | 0x00 | 0x01 | 0x00 | 0x17 | 0x98 0x04 |
功能吗0x06写入数据进寄存器,数据地址0x0001,写入数据高低位,校验码
从机回复报文:
从站地址 | 功能码 | 数据地址(高) | 数据地址(低) | 数据(高) | 数据(低) | 校验 |
---|---|---|---|---|---|---|
0x01 | 0x06 | 0x00 | 0x01 | 0x00 | 0x17 | 0x98 0x04 |
主机写从机时,回复报文内容必须与发送内容一致,表示我接收到了。
总结
本章向大家分享了工控、运动控制领域常用的Modbus-RTU协议,如果想要实际上手在单片机上练习,建议买一些工控自动化设备与单片机进行通讯。