Modbus协议属于软件层协议,等于数据传输的规则。而现在STM32霸道板子上的RS485接口则相应是属于硬件层协议,等于如何传输数据的方式。
Modbus是一种单主站的主/从通信模式,作为主机发送读写等请求,从机在协议中则负责响应主机。在一个系统中只能有一个主机,但可以有多个从机,每个从机都有其唯一的地址。
在老师说完学习modbus协议以后,我们花费了好多时间,来理解modbus协议的游戏规则,Modbus具有两种串行传输模式,ASCII 和 RTU,主要学习了RTU传输模式。我们在经过汇总讨论以后对于其流程有了如下总结:
1.接收状态:从机初始化后进入接收状态,从机以接受数据停止时间到达 3.5 字符以上,认为主机的寻址帧完成,进入下一步CRC校验。
2.CRC校验:计算crc,计算过程如下:
(1).预置16位寄存器为FFFFH。称此寄存器为CRC寄存器;
(2).把第一个8位数据与CRC寄存器的低位相异或,把结果放于CRC寄存器;
(3).把寄存器的内容右移一位(朝低位),用0填补最高位,检查最低位;
(4).如果最低位为0:重复第3步(再次移位)如果最低位为1:CRC寄存器与多项式A001(1010 0000 0000 0001)进行异或;
(5).重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理;
(6).重复步骤2到步骤5,进行下一个8位数据的处理;
(7).最后得到的CRC寄存器即为CRC码。(CRC码 = CRC_L +CRC_H)
在计算出crc后与主机发送的crc对比是否一致。一致则进入下一步地址检测。
3.地址检测:主机发送的地址是本机地址还是广播地址,若为广播地址则不处理,若为本机地址则进入下一步检测功能码,否则不做反应。
4.功能码:不同功能码有不同功能可参见:
功能码 | 名称 | 作用 |
1 | 读取线圈状态 | 取得一组逻辑线圈的当前状态(ON/OFF) |
2 | 读取输入状态 | 取得一组开关输入的当前状态(ON/OFF) |
3 | 读取保持寄存器 | 在一个或多个保持寄存器中取得当前的二进 制值 |
4 | 读取输入寄存器 | 在一个或多个输入寄存器中取得当前的二进制值 |
5 | 强置单线圈 | 强置一个逻辑线圈的通断状态 |
6 | 预置单寄存器 | 把具体二进值装入一个保持寄存器 |
7 | 读取异常状态 | 取得8个内部线圈的通断状态,这8个线圈的地址由控制器决定 |
一典型的消息帧如图所示
起始位 | 设备地址 | 功能代码 | 数据 | CRC效验 | 结束符 |
3.5T | 8bit | 8bit | n个8bit | 16bit | 3.5T |
在以上流程中可总结出,应用部分包括:
1. 串口功能
2. rs485接口
3. 定时器
4. 中断功能
5. ......
需要额外指出,在作为从机的霸道开发板上有485硬件接口但作为主机发送仅有USB口 所以还需要一个USB转485的转换器。
实验现象:
首先使用USB转串口将两块32单片机按照图所示的方式连接起来(A对A,B对B),将程序下载到两块单片机中,在通过“modbus调试精灵”向两块32单片机中写入数据,之后观察实验现象
首先使用上位机向1号机写入数据“a”,将1号机LGB灯点亮,现象如图所示:
再使用上位机向8号机写入数据“a”,同时将8号机LGB等点亮,现象如图所示:
最后再向8号机写入数据“b”,将8号机点亮的LGB熄灭,现象如图所示: