前言
这篇文章是我从零认识MODBUS过程中的一点笔记,主要讲解了我学习和使用MODBUS的思路。代码可能帮不到你,但是如果你是和我一样的初学者,建议你认真阅读。毕竟学习是一个思考练习的过程,如果只会Ctrl+C,那么就没什么意义了。作者水平有限,有错误敬请指出,互相学习,共同进步。
1.ModBus协议简介
MODBUS协议是一种串行通信协议,由Modicon公司(施耐德公司前身)发表,由于其公开发表且无版权要求,易于部署和维护,在工业界广泛应用。MODBUS采用主从通信(Master/Slave),MODBUS有三种报文格式:ASCII、RTU、TCP,本文主要讨论RTU。
如下图所示,串行通信上的MODBUS协议主要由地址,功能码,数据,CRC校验四部分数据帧构成。主机和从机的串行通信设备要求一致,参数要求一致,即假设使用串口,主从机波特率,奇偶校验等参数需一致。

主机端状态图(标准流程)

从机端状态图(标准流程)

RTU报文数据格式:
从机地址:1 byte 功能码:1byte 数据:0-252byte(s) CRC校验:2 byte 低位在前,高位在后

2.MODBUS_RTU在STM32上的实现
撸代码之前,我们先来看看MODBUS的数据模型,见下图。因为MODBUS通常用在PLC上,所以他的数据模型与PLC息息相关。这里我们不用管。直接看我给出的表格,便于理解,离散量输入即只读的位类型变量,与开关量一样。比如从机接了一个行程开关(按钮),我要读取开关的状态(只有0和1),而我们是无法直接操作开关的。再看"线圈",我的从机接了一个LED灯,我可以直接操作IO口控制灯的亮灭,也可以查询IO口电平知道灯的亮灭,所以他是可以读写的数据。"输入寄存器"理解为从机设备上有个温度传感器,传感器的数值是外界的温度,我们只能读取这个温度,所以是只读变量。"保持寄存器"理解为类似于从机ID一类信息,既可以被读取,也可以被改写。

本文详细介绍了在STM32上实现MODBUS_RTU协议的过程,包括功能码0x01的读线圈状态请求与响应的代码实现,以及CRC校验算法的运用。通过实际案例,展示了MODBUS协议在工业自动化网络中的应用。

1219

被折叠的 条评论
为什么被折叠?



