APP下载

STM32与上位机Modbus协议的通信方法

2015-04-25刘禹辰张仁杰

电子科技 2015年10期
关键词:下位主站寄存器

刘禹辰,张仁杰,刘 虎,刘 振

(上海理工大学 光电信息与计算机工程学院,上海200093)

步进电机广泛应用于医疗器械、汽车、工业机械手等领域。在步进电机的控制系统中,上位机提供人机交互的界面,设置、查询步进电机运动的相关参数,发送控制命令、数据等给电机控制器。为保证数据的正确传输,本文设计了上位机与下位机的通信方法,其中STM32微控制器作为下位机,其是电机控制器的控制核心,通信协议采用Modbus协议,此协议具有标准性和开放性的特点以及紧凑的帧格式,使通信更安全可靠。通信电路采用RS-485,简单高效,保证了数据传输的可靠性,整个系统达到了设计的预期效果和要求。

1 设计内容简介

1.1 smt32芯片简介

下位机用STM32F103ZET6微控制器,其内核是具有高性能、低功耗,可实时应用的Cortex-M3内核,该微控制器的工作频率为72 MHz,其具有灵活的可配置的静态存储器控制器FSMC,支持对PC/FC卡、SRAM、PSRAM以及NAND和NOR类型Flash的数据读写,时序可编程。其还具有功能强大的外设,提供了最多可达两个I2C接口,3个SPI接口和5个USART接口,还带有两个12位的ADC,一个12位有两个通道的DAC,11个计时器(16位)等[1]。

1.2 RS-485通信电路

RS-485协议的全称是TIA/EIA-485串行通讯标准,主要的技术上的进步是采用差分传输方式,采用2线制的接线方式,差分信号采用负逻辑,即2~6 V表示逻辑“0”;-6~-2 V表示“1”;若是两线上的差分电压,则检测信号时就无需找某个参照点来检测,这两线之间的电位差就是系统需要检测的。这样的信号差分传输大幅增加了信号误差容限,增强了抗干扰能力[2]。所以在传输速度、传输距离以及误差率方面优于RS-232。

上位机和STM32微控制器之间采用RS-485通信接口连接,RS-485通信接口电路图如图1所示。

图1 RS-485通信接口电路图

2 系统通信结构

系统通信连接方式如图2所示。

图2 系统通信结构图

2.1 Modbus协议介绍

Modbus协议包括主站和从站。在时间相同的情况下,总线上只可连接一个主站,相同的串行总线上可连接一个或多个从站(最大数量为247)。Modbus通信总是由主站发起。从站若未收到主站发出的请求,则从站不会有数据发出到主站。从站之间不能相互通信[3]。关于Modbus的事务处理主站同一时间只能开始处理一个。

Modbus中有两种串行传输模式:RTU模式和ASCII模式。用ASCII模式传输时,1 Byte需发送两个字符。而在RTU模式中,有两个4位的16进制字符包含在报文的每个8位字节中。所以RTU模式的效率比ASCII模式的效率高[4]。本文使用RTU传输模式。

2.2 Modbus协议报文

Modbus协议的报文如表1所示。

表1 Modbus协议的报文

地址码:地址码表明设置的从站的地址,每个从站都必须有唯一的地址码,从站接收主站发送的数据前和主站接收从站响应回复的数据前,只有地址码符合才能接收,否则丢弃。

功能码:当报文由主站向从站发送时。从站执行的操作根据功能码来判断。主站在收到从站的响应报文时,若主站接收到的功能码与从站之前接收的功能码相同,表明从站已响应主站请求并进行操作。若不同且响应报文中不是异常功能码,表示传输出错[5]。若从站出现与所请求的Modbus功能有关的差错,则从站的响应报文中的功能码变成异常功能码,数据区则是异常码。异常功能码=功能码+0x80;异常码根据不同的异常,返回16进制的01-0B中的某个值。本文使用Modbus协议的功能码如表2所示。

表2 Modbus协议的功能码

数据区:数据区的内容跟据功能码的不一样而不同。数据区可能包含起始地址、寄存器地址、寄存器值和寄存器数量、字节数。例如功能码为03时,主站发送请求的数据含起始地址,寄存器数量,从站回复响应含字节数和寄存器值。

CRC校验码:CRC校验码包含两个8位字节组成的16位值[6]。在报文的最后字段附上CRC字段,在最后字段中附加的顺序是从字段中的低字节到高字节。报文发送中的最后字节是CRC的高位字节。发送设备计算CRC值并将其附加到报文CRC字段上,发送报文。在报文的接收中,接收设备要再计算CRC值,并将所得结果与接收到的CRC字段中的CRC值作比较。若两个值不相同,则就有错误。否则为正确[7]。

3 Stm32中软件设计

3.1 软件开发环境

程序设计是在STM32常用的开发工具Keil MDK中完成的,keil提供了一个完整的开发方案,其中包含了一个有着强大功能的仿真调试器和C编译器、库管理、链接器、宏汇编。这些功能组合在一个集成开发环境中(uVision)[8]。

3.2 部分程序设计

通信开始前要进行初始化,RS485要默认为接收状态,在初始化中要对串口进行参数设置,波特率设置为9 600 bit·s-1,8个数据位和1位停止位,奇偶校验位设置成无奇偶校验位。串口参数设置程序如下:USART_InitStructure.USART_BaudRate=9600;//9600波特率USART_InitStructure.USART_WordLength=USART_WordLength_8b;//8位数据长USART_Init-Structure.USART_StopBits=USART_StopBits_1;//1个停止位USART_InitStructure.USART_Parity=USART_Parity_No;//无校验USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;//允许接收和发送USART_Init(USART1,&USART_InitStructure);//参数设定

当STM32接收到来自上位机的帧数据时,要对这一帧数据进行分析和判断,首先要判断这一帧数据是否为所需的报文,若设备地址正确,且接收报文过程中重新计算的CRC值和已接收的CRC值相等,之后则进行报文处理。

报文处理中,先要判断功能码是否为0x03、0x06、0x10,和功能码所对应的寄存器地址、寄存器数量或数值是否正确。若正确,根据功能码功能,进行任务处理之后生成返回给上位机的响应报文。否则进行异常处理,根据功能码,寄存器地址,寄存器数量或数值的不同错误,生成相应的异常码。经处理生成异常响应报文,返回给上位机。STM32中的程序流程图如图3所示。

图3 STM32中的程序流程图

4 上位机设计

4.1 上位机控制环境

上位机是采用Visual Studio 2010程序开发工具,在C#语言环境下开发的。C#提供的串行通信SerialPort类为上位机与STM32下位机之间的通信提供了基础。上位机提供了人机交互界面,在串口设置中可设置通信端口、波特率、数据位、停止位、校验位和设备地址。在参数设置中可设置参数,也可通过查询按钮查询数据。运动控制中各个按钮可向下位机发出对电机控制的指令,通信结束后,会有提示。将参数设置完,点击发送按钮,完成操作后上位机实际运行界面如图4所示。

图4 上位机实际运行界面

4.2 上位机软件设计

上位机中的程序运行如图5所示。数据的发送和接收通过SerialPort类中的BytesToWrite和BytesTo-Read两个属性完成。程序如下:sp.Write(message,0,messageLength);//数据发送ResponseAll[ResponseCount]=(byte)(sp.ReadByte());//数据接受

发送完数据后,下位机若在规定的时间内返回数据,则进行数据处理。数据处理和下位机对报文的处理有部分相似。也要进行CRC校验码判断和其他的相应判断,在判断中,多了对异常功能码和异常码的判断。处理结束后要生成相应的提示,若返回数据中有异常码,则会生成错误提示。

图5 上位机程序流程图

5 通信测试

通信过程是PC向STM32下位机发送数据,STM32下位机再向上位机返回数据。为了验证整个通信的可靠性,将Saleae16逻辑分析仪连接在STM32上的数据接收端和发送端,在Saleae16逻辑分析仪上可观察传输的Modbus协议的报文。

在连接好Saleae16逻辑分析仪后,要设置采样深度和采样频率,通信的波特率、数据位、停止位、校验位等。

通信测试以16(0x10)写多个寄存器为例。上位机界面位移脉冲输入500 000,点击发送按钮,发送数据,完成通信。上位机发送的一帧数据如图6所示。下位机返回的一帧数据如图7所示。

图6 上位机发送的一帧数据

图7 下位机返回的一帧数据

通过图6和图7中逻辑分析仪的显示,得出写多个寄存器操作成功。在逻辑分析仪上可以看到传输的波形,及相应的16进制代码。从中可分析Modbus协议报文中的地址码、功能码、数据区和CRC校验码。经过多次测试,证明此通信方法稳定可靠。

6 结束语

本文论述的STM32下位机与上位机Modbus协议的通信方法,为步进电机的控制系统提供了通信基础。根据Modbus协议的标准性和开放性,可以在需要的情况下,对程序进行一定的改变。整个系统满足步进电机控制器与PC上位机之间进行数据交换的要求,为满足Modbus协议的上位机与下位机通信提供了参考。

[1] 王永虹,徐炜,郝立平.STM32系列ARM Cortex-M3微控制器原理与实践[M].北京:北京航空航天大学出版社,2008.

[2] 李晓丽.单片机与上位机串行通信系统设计[J].仪表技术,2010(7):45-47.

[3] 华镕.从Modbus到透明就绪-施耐德电气工业网络的协议、设计、安装和应用[M].北京:机械工业出版社,2009.

[4] 周军,陈伟峰.基于ARM9和μC/OS-Ⅱ的Modbus通信协议的实现[J].自动化仪表,2009(2):24-26.

[5]张桂,金国强,李辉.基于ARM平台ModbusRTU协议的研究与实现[J].电力科学与工程,2011,27(1):23-27.

[6] 吕国华,程广河,房立镇.基于ARM7微处理器的Modbus通信的实现[J].信息技术与信息化,2010(5):45-47.

[7] 朱小襄.ModBus通信协议及编程[J].电子工程师,2005,31(7):42-55.

[8] 刘火良,杨森.STM32库开发实战指南[M].北京:机械工业出版社,2013.

猜你喜欢

下位主站寄存器
STM32和51单片机寄存器映射原理异同分析
Lite寄存器模型的设计与实现
基于S7-1200 PLC的DP总线通信技术在马里古伊那水电站泄洪冲沙孔门机上的应用
发射机房监控系统之下位机
变电站综合自动化系统调试新方法研究
EtherCAT主站与主站通信协议的研究与实现*
多表远程集抄主站系统
景洪电厂监控系统下位机数据传输网络改造
围观党“下位”,吐槽帝“登基”
CAN总线并发通信时下位机应用软件设计