# [NUCLEO-C031C6]Modbus从站协议实现
Modbus协议,一种应用层通信协议,广泛应用于工业自动化领域。它定义了主设备(如PLC或PC)与从设备(如传感器、执行器等)之间的通信规则——请求应答方式,使得不同厂商生产的设备能够相互兼容和交换信息。Modbus协议简单、可靠且易于实现,因此在工业自动化领域得到了广泛应用。
Modbus协议支持多种数据传输方式,如RTU(串行通信)、TCP/IP(以太网通信)等。其中,RTU模式采用串行通信方式,一般使用RS485总线,适用于长距离、低速率的数据传输。通过Modbus协议,用户可以实现对工业设备的远程监控、控制和数据采集等功能,提高工业自动化水平和生产效率。
在了解Modbus协议的特点与优势后,本次实验我们计划在STM32C031芯片上部署。我们使用Usart1串口外设,通过驱动RS485芯片,借助RS485总线,将Modbus-RTU应用层协议在C031芯片上实现,支持功能码0x03读取C031上采集数据与配置参数;支持功能码0x10写入C031配置参数,支持功能码0x05开关量,实现对C031的控制。
## RS485功能实现
对于STM32C031T6芯片来说,我们使用Usart1外设。查询数据手册,Usart1外设支持多种特性,比如适配RS485半双工特性的芯片收发使能引脚的自动控制。再比如支持Modbus-RTU的帧尾检测功能。本次实验,我们将通过示波器观察RS485芯片收发使能引脚的自动控制功能。
上面两张图为RS485驱动引脚释放后延时的对比图,一张图是延迟0次采样时间后释放;一张图是延迟16次采样时间后释放。
## Modbus-RTU实现
由于STM32C031芯片的Usart1外设对Modbus通讯的硬件支持,我们软件应用层实现并不再需要如此“精妙”的状态机流转——直接信号量等待即可。先上一张软件流程图:
现在的状态流转图是不是比刚刚的Modbus-RTU要清晰多了。“科技改变生活,硬件改变软件。”
## 测试实验
我们使用ModbusPoll的模拟主站软件来实现对C031的数据发送与接收功能。
由上图可以看到,ModbusPoll模拟的主站已经正常从C031模块通过Modbus-RTU协议获取到了寄存器的数据。