刘继志,白晓亮
(1.河北申科电力股份有限公司产品研发中心,保定 071000:2.河北大学,保定 071002)
MODBUS协议是Modicon公司(现在的施耐德电气)于1979年发明的一种串行通信协议,最初是为解决可编程逻辑控制器(PLC)之间通信而制定的,现在在常用的控制器上都可以实现。MODBUS协议采用主从问答方式进行工作,允许一个主机与一个或者多个从机通讯,通过此协议,控制器相互之间、控制器经由网络(如以太网)和其他设备之间可以通信。不同厂商生产的控制设备通过MODBUS协议可以连成工业网络,进行集中监控。
MODBUS协议有两种传输方式:ASCII和RTU。对于ASCII模式,一个字节的数据,需要把高低4位分别转换为ASCII码传输;而RTU模式,是按16进制字符传输的。通过比较可以看出,相对于ASCII模式,RTU模式表达同样的信息需要的位数较少,在同样的传输速率下能获取更多的信息,可以提高通讯的效率。本文采用RTU传输模式,RTU模式的消息帧结构如表1所示。
表1 MODBUS帧结构
本设计采用了意法半导体的STM32系列微控制器,该控制器内核采用超低功率的ARMCortex-M3核心,具有高性能、低成本、低功耗的特点,同时集成了丰富出众的外设系统,具有集成度高和开发便捷的优势。系统硬件结构图如图1所示。
图1 系统硬件结构图
系统硬件包括stm32f103微控制器、485通信电路、时钟电路、复位电路和电源电路等。stm32f103微控制器完成串口数据收发、数据帧的组包与解包、数据处理等,485通信电路部分采用了MAX483芯片,完成USART串口到485总线的转换,通过高速光耦隔离芯片TLP2362和stm32f103微控制器的USART串口连接。
主程序首先完成外设的初始化,初始化完成后就等待串口中断,MODBUS数据接收和发送都在串口中断中调用相应的函数完成。初始化程序首先完成串口的初始化,包括打开串口时钟、配置GPIO复用功能、波特率、数据位数、奇偶校验和中断配置等。然后进行定时器初始化,定时器的作用是完成帧结束的判断,MODBUS规定,MODBUS每帧之间需要间隔3.5字符,串口发送的每个字节数据都包含1位起始位,8位数据位、1位奇偶校验位、1位停止位,共11位。以波特率9600为例,就需要4毫秒多,在此用定时器定时4.5ms。最后配置MODBUS的从站号、初始化接收和发送缓冲区。
MODBUS发送数据程序响应主机的请求,通过串口中断完成数据发送缓冲区数据的发送。MODBUS发送数据程序流程图见图2所示。
图2 MODBUS发送数据程序流程图
当串口接收数据后会触发中断,在中断函数中判断如果是接收到数据则调用MODBUS接收数据函数。MODBUS接收数据程序流程图见图3所示。
首先从串口缓冲区读取接收到的字符,判断当前是否处于消息处理中,如果处于消息处理中则直接退出,等待消息处理完成,如果没有处于消息处理中,通过判断和上个字符之间的间隔是否超4.5ms,确定是否为新一帧,如果是新的一帧且该字符等于本从站号,则初始化接收计数器,并把字符存放在接收缓冲区中,如果不是新的一帧,说明当前正在进行一帧的接收,则把字符直接放在接收缓冲区中。
图3 MODBUS接收数据程序流程图
从机在接收到主机发来的数据后,重新计算数据的CRC校验,并和数据中的CRC进行比较,如果相等说明数据无误,则读取功能码,根据不同功能码调用相应的处理函数;如果不相等说明数据有误,调用误差处理程序。
从机通过U转485线和计算机相连,上位机通信测试软件采用了MODBUSPoll,设置好串口参数即可。测试了02功能码(输入状态寄存器)、04功能码(输入型寄存器)、05功能码(控制寄存器)、06和16功能码(配置参数寄存器),均能正常通信。
MODBUS广泛应用于自动化控制行业中,已经成为工业领域通信协议的业界标准,并且现在是工业电子设备之间常用的连接方式。本文在STM32F103微控制器上实现了MODBUS的数据通信,并将其应用在低压监测设备中,并进行了实际测试和使用。