基于STM32的FreeModbus从站协议移植

2018-01-02 10:31胡双喜
科学与财富 2018年31期

胡双喜

摘 要:FreeModbus是一种Modbus协议的实现方式,能够方便的移植到嵌入式系统中。本文阐述了FreeModbus的移植方式,并将其与STM32F446RE控制器相结合。经验证表明,其能够完成基于Modbus RTU传输方式的通讯任务,具有稳定可靠的特点,可以应用于工业场合。

关键词:Modbus;STM32;实时通信

一、引言

随着工业IT技术的飞速发展以及工业控制系统复杂程度的提高,工业通讯网络的应用日益受到重视,通讯协议的标准化对工业控制系统的稳定性产生了极大的影响。Modbus是一种广泛应用的工业控制网络,其具有稳定性高、易于部署和维护等优点,适合中小规模的数据传输。FreeModbus是一种针对嵌入式系统的Modbus协议栈,支持RTU、ASCII以及TCP传输模式,并遵守BSD许可,允许用户将其应用于商业环境。

STM32是目前广泛应用的32位嵌入式微处理器之一,具有体积小、功耗低、性能高等特点,非常适合于系统的实时控制。其中STM32F4系列是意法半导体推出的以Cortex-M4为内核的高性能控制器,能够进行复杂的计算与控制。

本文以STM32F446RE为平台,研究了FreeModbus协议的移植方法,使STM32F446RE能够作为从站实现Modbus的通信,并支持Modbus RTU及ASCII传输模式,为未来工业控制的网络化和信息化奠定了基础。

二、FreeModbus简介

Modbus是一种广泛应用于工业控制中的串行通讯协议,其实现了一个单主站的主从网络结构。Modbus支持的数据类型包括浮点数、32为整型等多种数据类型。目前,西门子S7 200系列等多个系列的PLC、威纶通等不同厂家、型号的触摸屏以及组态王等软件都支持Modbus协议。

FreeModbus是专门针对嵌入式系统设计的开源协议栈,其实现了Modbus 1.1a版的应用层协议,支持RTU与ASCII两种传输模式,在FreeModbus 0.7版后,又添加了Modbus TCP传输模式的支持。FreeModbus与IOS/OSI通讯模型的关系如表1所示:

目前,FreeModbus支持大部分Modbus的指令,包括读输入寄存器(0x04)、读保持寄存器(0x03)、写单个寄存器(0x06)、写多个寄存器(0x10)、读写多个寄存器(0x17)、读线圈(0x01)、写单个线圈(0x05)、写多个线圈(0x0f)等多条指令。

三、FreeModbus协议的移植

在进行移植前,需要将FreeModbus的协议栈代码导入到当前工程中,相应的协议栈源码可以在FreeModbus官網上下载。

1、定时器计时功能的移植

当Modbus RTU传输的波特率高于19200 bps时,根据FreeModbus协议栈的要求,其超时时间应设定为1750微秒。STM32F446RE有不同类型的定时器十余个,可以选择其中任意定时器,设定其定时时基为50微秒,该定时器的中断时间为35倍时基,即1750微秒。

此外,还需在协议栈的porttimer.c文件中修改相应的函数,包括:

(1)时钟初始化函数xMBPortTimersInit:通常,时钟初始化会放到主函数中进行,因此xMBPortTimersInit函数仅修改返回值为True即可;

(2)定时器启动函数vMBPortTimersEnable:此处需要编写定时器启动函数,例如当使用意法半导体提供的HAL库时,vMBPortTimersEnable函数需编写以下代码:

HAL_TIM_Base_Stop_IT(&Modbus;_TimHandle);

__HAL_TIM_SET_COUNTER(&Modbus;_TimHandle, 0x0000);

HAL_TIM_Base_Start_IT(&Modbus;_TimHandle);

上述代码首先停止定时器,并初始化定时器的计数单元以保证计时准确,完成上述步骤后启动定时器开始定时;

(3)定时器停止函数vMBPortTimersDisable:此函数需要编写定时器停止函数,如使用HAL库,则在函数中填写如下代码即可:

HAL_TIM_Base_Stop_IT(&Modbus;_TimHandle);

2、定时器中断的移植

FreeModbus定时器中断调用函数为prvvTIMERExpiredISR( )。通常使用意法半导体提供的STM32Cube MX进行系统构建时,其会自动将全部中断函数的实现放在stm32f4xx_it.c文件中,因此对FreeModbus定时器中断的调用函数需要添加在stm32f4xx_it.c文件中相应位置即可。

3、串口驱动的移植

FreeModbus RTU的物理层是基于EIA/TiA-485、EIA/TIA-232规范的,因此其需要调用STM32F446RE的串口以完成数据的传输。

FreeModbus串口驱动的移植需修改协议栈portserial.c文件中的函数:

(1)串口初始化函数xMBPortSerialInit:通常串口的初始化会在主函数中完成,此处只要将返回值修改为True即可;

(2)串口使能函数vMBPortSerialEnable:此函数用于实现FreeModbus RTU串口通讯的使能,包括接收使能与发送使能。若使用意法半导体提供的HAL库,则串口的接收使能与发送使能指令为:

__HAL_UART_ENABLE_IT(&Modbus;_UartHandle, UART_IT_RXNE);

__HAL_UART_ENABLE_IT(&Modbus;_UartHandle, UART_IT_TXE);

此外,在设置接收使能后,还需要调用FreeModbus协议栈的prvvUARTTxReadyISR函数对接收到的数据进行处理;

4、串口中断的移植

与定时器中断相似,在使用STM32CubeMX工具的时候,相应中断的实现统一存放在stm32f4xx_it.c文件中,因此仅需要将FreeModbus协议栈的接收中断处理函数prvvUARTRxISR以及发送完成中断处理函数prvvUART TxReadyISR复制到相应由系统生成的串口中断处理函数中即可。

5、指令处理函数的编写

上述步骤完成了FreeModubs协议的移植,在主函数中可以编写相应的指令处理函数,例如读线圈指令、写寄存器指令的处理函数,即可实现Modubs RTU协议。

四、系统测试

完成FreeModbus协议栈的移植后,可以选择Modbus Poll软件进行协议栈的测试。Modbus Poll软件是Modbus协议栈的主站仿真软件,能够同时监视多个从站设备的数据,其支持Modbus RTU、ASCII以及TCP/IP传输模式。

在使用Modbus RTU进行传输时,需要首先设定系统的串口,如图1所示:

完成设置后点击OK,并进行从站连接,Modbus Poll即可显示STM32F446RE中各寄存器的数据。

五、结论

Modbus协议是一种广泛用于工业中的通讯协议。本文研究了一种基于STM32F446RE系统的Modbus协议实现方式,可以很好地應用于工业中,且有较短的开发周期,由较为广阔的应用前景。

参考文献:

[1]赵艳明、曾培峰. 一种基于STM32的Modbus-RS485通信方法. 智能计算机与应用,2018,8(03):50-53+56

[2]张永伟、康兴无. 基于STM32和Modbus的串口服务器系统. 电子设计工程,2017,25(16):108-111+116

[3]刘禹辰、张仁杰、刘虎等. STM32与上位机Modbus协议的通信方法. 电子科技,2015,28(10):27-30

[4]陈科、蒋军. 基于STM32的MODBUS协议的实现与应用. 视听,2013,4:9-10

[5]贺洪江、程琳. 基于STM32和Modbus的电参数采集系统. 自动化与仪表,2014,29(06):26-29