基于ModBus协议的STM32单片机与MCGS通信设计
作者: 钱宗斌
关键词:ModBus;MCGS组态;农业大棚;STM32
中图分类号:TP277 文献标识码:A
文章编号:1009-3044(2023)22-0088-03
0 引言
现代农业需实时掌握农作物的环境信息[1]。研究以农业大棚环境数据采集项目为背景,传感器采集到大棚内环境数据后发送至上位机,上位机由MCGS组态技术实现,数据采集处理平台则由STM32单片机和ZigBee协调器组成,负责从ZigBee网络中读取不同位置的传感器数据。
MCGS和STM32单片机可以通过串口进行数据传输,但是存在两个问题,一是MCGS通信接口电平信号与单片机的串口模块的电平信号不同,不能直接通信,因此需要进行信号转化。二是MCGS触摸屏常用于工业现场的总线通信,内置了很多通信协议,包括和各种型号的PLC[2],采集板卡等通信的驱动,但是没有集成与51单片机和STM32单片机的串行通信协议,因此需要在单片机系统中开发与上位机匹配的通信协议。本文首先对MCGS与STM32单片机的通信接口进行了设计,并基于在工业现场广泛使用的ModBus 总线协议,设计了二者的通信协议和消息帧,实现MCGS 触摸屏和单片机模块的通信。
1 通信接口设计
系统选用的TPC7062TX型号MCGS触摸屏作为上位机,其提供通信接口是485接口[3]。与STM32 单片机的通信接口不同,二者工作电平不一致,STM32 串口电平为TTL电平,电压范围是0-3.3V,而组态屏串口电压为-6V至+6V,因此需要采用转接芯片进行转化才可进行通信。目前常用的转接芯片市场上有多种,本系统采用Sipex的SP30722EEN芯片作为转化芯片,其共有8个接口,该模块应用电路设计如图1所示。
在图1中,芯片左侧的引脚与单片机模块连接,其中RO接口是芯片数据发送引脚,上拉4.7kΩ的电阻后接入单片机串口模块的接收引脚。芯片的DI接口是数据接收引脚,直接与单片机的串口发送端连接,在通信之前,需要将芯片的发送引脚( ------ RE ) 和接收引脚(DE)使能,因发送和接收需要同时使用,因此本系统将两个引脚连接在一起,直接接入单片机的使能端口,用一个引脚来控制两个端口的使能,可以节约端口资源。芯片右侧A、B引脚与MCGS触摸屏的485接口连接,通过两个引脚的电压差来表示逻辑1或0,其中电阻R2是B引脚的下拉电阻,电阻R3是A引脚的上拉电阻,这样的设计可以保证在不通信时,信号能维持在1状态,电阻R3是终端电阻,吸收干扰信号。
2 ModBus 消息帧的设计
ModBus协议最早是专门为可编程控制器通信而开发的一种通信协议,目前已经成为主流的工业现场总线协议[3]。在该协议下,MCGS监控平台作为指令发送方,主动发起通信,STM32单片机作为从机,根据指令类型做出不同的响应,从机不能主动给主机发送指令。ModBus协议消息帧的格式有ACSII和RTU两种类型[4],ACSII格式基于字符进行传送,传送时间长,效率较低。RTU格式基于字符流传送数据,传输速度快。本文采用此种方式进行设计,其消息帧结构见图2。ModBus协议支持多达255个功能码,本系统采用的MCGS组态软件支持01、02、03、04等4种功能码。每个功能码执行不同的操作。
通过对系统功能进行分析可知,一方面,组态屏需要定期采集单片机系统中存储的温湿度数据、光照数据、二氧化碳浓度数据等环境信息;另一方面,也需要根据收集的信息对单片机发送指令,执行一些操作或者修改工作参数等。二者交互的数据主要有以下几类:
1) 数据读取:读取各个位置传感器采集的数据。
2) 发送指令:发送系统操作指令,比如系统启动、停止、报警等命令。
3) 修改系统工作参数:包括采集周期设定、报警触发条件设定、数据存储参数修改等。
根据上述数据种类可知,MCGS提供的4个功能码已经能够满足系统的设计需求,接下来结合功能码对通信数据的消息帧进行设计。
ModBus通信协议的功能码字段指定系统要执行何种操作,地址字段用来寻找设备。本系统中只有STM32一个下位机,其地址设置可为0x01。对于不同的环境数据信息,则分别设计不同的寄存器地址,对于温湿度数据,寄存器地址配置以0x10开头,最多可存放16个温湿度传感器数值,光照强度寄存器地址设置以0x20开头,可存放16个传感器,二氧化碳浓度寄存器地址设置以0x30开头,可存放16个传感器,系统操作指令以0x40开头,修改系统工作参数的命令以0x50开头。具体设置见表1。
以上列举了部分操作对应的寄存器地址,该地址是16位,一个功能码下可满足最多65535个操作,可根据系统要求进行功能拓展或者修改。
下面以读取节点1的温湿度数据采集为例,列举出对应的RTU消息帧格式。设备地址为0x01,寄存器地址设置为0x0010。MCGS触摸屏读取温湿度的信息时,其请求通信帧格式见表2。
3 ModBus 协议控制流程
上位机的协议由组态屏内置的驱动根据操作指令自动生成,ModBus协议设计的重点是在单片机模块编写响应代码。首先设置STM32单片机的串口与上位机的串口,接下来设置数据的采集周期。本系统在STM32单片机中选择定时器2,并且通过定时器中断的方式来接收数据。
当组态端程序发送ModBus请求帧后,经过电平转换模块,送到单片机的串口缓存中,并产生中断。此时STM32通过读取函数读取缓存区的数值,进行CRC校验无误后,将请求帧不同字段的数据解析后存放在缓存数组中,单片机根据接收的功能码和操作地址执行不同的响应。系统工作流程见图3。
解析ModBus协议分以下几个步骤:首先,通过STM32的串口接收数据,获得数据长度并存放到数组buffer[]中,然后判断buffer[0]为地址,判断其是否为0x10,若是,则表明是STM32模块,若不是,则返回错误值。其次,进行CRC校验,若校验正确,则对buffer[1]字段进行判断,该字段存放的是协议的地址,根据地址来决定进行何种操作,地址码与操作的关系前文已经有表述。否则返回错误。接下来对数组其他部分内容进行读取,主要包括主机要求读取的寄存器数量值。最后,若上述操作完整,则开始执行数据采集或者动作执行等功能,并发送响应帧。在解析了Mod⁃Bus 协议请求帧的数据之后,根据功能码和地址从STM32的存储区中查找对应节点的数据信息,并填充到发送数组中,通过串口发送给上位机。
4 MCGS软件设计
打开MCGS软件,在设备管理器中添加“通用串口父设备”,然后再添加具体的子设备,一个父设备可以挂载多个子设备,MCGS软件内部集成了市场上主流的硬件设备,因此在软件的设备工具箱中,找到对应设备的型号,添加进去即可。接下来再对每一个设备的参数进行设置,确保能够建立通信连接。首先添加通用串口父设备,然后在工具箱中找到“标准Mod⁃Bus RTU设备”并添加到组态窗口中。如图4所示。
对于父设备要进行工作参数的设置,主要是对采集周期、端口号、波特率、数据长度、校验方式等进行设置。见图5。
接下来再进行ModBusRTU子设备的参数设置,设置采集周期是1000ms,设备地址为1,通讯等待时间200ms,校验方式选择0,见图5(a) 。然后进入内部参数设置,根据前文内容,分别设置设备的通道和地址,建立数据的绑定关系,见图5(b) 。
将触摸屏和单片机端口线接好,在触摸屏内部配置好ModBus通信协议的参数。启动设备,进入监控主界面,可以看到画面中已经读取出环境数据,以温湿度数据为例,如图6所示。
5 结论
文章首先对硬件电路进行设计,将MCGS上位机和STM32单片机的接口电平进行转化,为硬件间串口通信奠定基础。再基于ModBus协议,设计针对农业大棚环境数据采集的消息帧和响应帧,上位机的指令发送给STM32单片机,通过解析协议帧,获取指令,再按照响应帧格式将环境数据上传至上位机平台,实现二者通信。结果表明,该设计可以有效解决二者之间通信不匹配的问题,较好地实现农业数据的采集和控制,同时为其他嵌入式模块与上位机通信提供思路。