Modbus协议在单片机通信中的应用研究

2014-03-24 03:00王晓宁黄传伟李斯伟鲁茗莉
医疗卫生装备 2014年1期
关键词:通信协议字节触摸屏

王晓宁,黄传伟,郭 剑,王 洁,李斯伟,鲁茗莉

Modbus协议在单片机通信中的应用研究

王晓宁,黄传伟,郭 剑,王 洁,李斯伟,鲁茗莉

目的:研制一套单片机控制系统,用于单片机与外部设备触摸屏之间的数据通信,实现人机交互操作。方法:对基于标准Modbus协议的触摸屏和单片机STC89C58RD+之间的串行通信方法进行研究,硬件接口采用标准RS232协议,触摸屏作主机,STC作从机。结果:经实际测试,实现了通过触摸屏对整个系统进行显示和操作等功能。结论:该方法稳定可靠,可实现人机交互控制,且软硬件设计、制作简便,易于实现,达到了设计要求。

Modbus协议;触摸屏;单片机;串行通信

0 引言

单片机(设备)之间的相互通信以及单片机与个人计算机(PC)之间的通信[1-2],最常用到的就是RS232(recommended standard,RS代表推荐标准,232是标志号)通信接口以及其通信协议[3]。它是由美国电子工业协会(Electronic Industries Association,EIA)所制定的异步传输标准接口。该接口标准具有使用方便、安装简单、在短距离内通信可靠性强、全双工工作、价格低廉等优点,在微型计算机、工业现场和实验室设备等通信过程中得到广泛应用。

随着通用串行总线(universal serial bus,USB)接口标准的推出和普及[4],RS232接口标准的应用受到非常大的冲击,一度出现被取代的趋势。但随着RS232-USB、RS232-TCP/IP、RS232-RS485和RS232 -RS422等接口标准自动转换模块的出现,RS232接口标准又恢复了勃勃生机,依靠其无可比拟的简单、易用、低成本等特点,继续得到广大研发工程师的喜爱与认可。目前,RS232接口标准依然是工业控制和通信领域使用最多的接口标准,而Modbus通信协议是在RS232接口通信中最常用到的一种工业级现场总线协议[5]。

1 Modbus通信协议简介

Modbus是由Modicon(现为施耐德电气公司的一个品牌)在1979年发明的,是全球第一个真正用于工业现场的总线协议[6]。在中国,Modbus已经成为国家标准(《GB/T 19582—2008》)。Modbus协议是应用于电子控制器上的一种通用语言,通过此协议,控制器相互之间、控制器经由网络和其他设备之间可以通信。此协议定义了一个控制器能认识、使用的消息结构,而不管它们是经过何种网络进行通信的。它描述了一个控制器请求访问其他设备的过程、如何回应来自其他设备的请求以及怎样侦测错误并记录。Modbus制定了消息域格局和内容的公共格式。

Modicon控制器上的标准Modbus端口是使用一个RS232兼容的串行接口,它定义了连接口的针脚、电缆、信号位、传输波特率、奇偶校验。控制器通信使用主-从技术,即仅一个设备(主设备)能初始化传输(查询),其他设备(从设备)根据主设备查询提供的数据做出相应反应。主设备可单独和从设备通信,也可以广播方式和所有从设备通信。控制器可以设置为2种传输模式——ASCII(美国标准信息交换代码)或RTU(远程终端单元)中的任何一种在标准的Modbus网络中通信。RTU模式通信时,消息中的每8 bit包含2个4 bit的十六进制字符。这种方式的主要优点是在同样的波特率下,可比ASCII方式传送更多的数据。本文采用RTU模式。

RTU模式中每个字节的格式如下所示:

(1)编码系统:采用二进制方式进行编码。(2)初始时间间隔:每次消息发送至少要以3.5个字符时间的停顿间隔开始。(3)数据位:1个起始位;8个数据位,最小的有效位先发送;奇偶校验时1位,无校验时0位;带校验时1位停止位,无校验时2位停止位。(4)错误检测域:CRC(循环冗余校验码)校验。

Modbus具有以下几个显著特点:

(1)标准、开放,用户可以免费、放心地使用Modbus协议,不需要交纳许可证费,也不会侵犯知识产权;(2)Modbus可以支持多种电气接口,如RS232、RS485等,还可以在各种介质上(如双绞线、光纤、无线等)传送;(3)Modbus的帧格式简单、紧凑、通俗易懂,用户容易使用,开发简便。

2 软件系统的设计

在本文中采用深圳市宏晶科技设计生产的单片机STC89C58RD+作为系统的MCU(微控制单元)[7],采用标准Modbus协议通过RS232硬件接口与深圳市显控自动化技术有限公司出品的SK系列彩色触摸屏SK-043AE(下面简称“触屏”)进行人机交互(HMI)控制操作[8]。系统通信连接如图1所示。

图1 系统通信连接示意图

2.1 Modbus主从机的通信帧格式

以触屏作为Modbus通信主机,MCU作为从机[9],这样做的最大好处是当屏上的内容或参数进行修改时,能够第一时间主动通知MCU进行相应的动作调整。另外,大大地减少了MCU的资源开销,只需响应命令动作即可。

在本文应用的触屏主机通信中[10],主要涉及到的Modbus协议功能码为0×01、0×02、0×03、0×04、0× 05、0×06、0×010,其对应的可操作寄存器及其地址范围见表1。

下面以功能码0×01为例来介绍Modbus主从机通信的数据帧格式。

功能码0×01的目的是读取从机中的相应线圈,也就是从机离散量输出口的开关状态。请求帧格式为:从机地址+0×01+线圈起始地址+线圈数量+CRC检验。其具体帧格式见表2。

响应帧格式为:从机地址+0×01+字节数+线圈状态+CRC检验。其具体帧格式见表3。

在从机响应程序编写时,还有针对发生错误响应时的错误响应帧格式,这里不再细述。

表1 触屏对应可操作寄存器及其地址范围

表2 功能码0x01请求帧格式

表3 功能码0x01响应帧格式

2.2 MCU程序的工作流程设计

在作为Modbus从机通信的MCU主程序设计中,主要考虑在主流程中对相应参数进行通信前的准备和接收后的响应,以及串口中断接收主机触屏发来的数据和定时器中断对接收数据的解析及响应回传处理[11]。MCU程序的工作流程如图2所示。

2.3 MCU软件的编程设计(部分代码)

这里着重介绍从机单片机的软件开发中与通信相关的程序设计编写,并给出部分源代码。采用标准C语言在Keil uVision 3开发环境下进行源代码开发设计,编译调试正常。

//一些用到的全局变量

unsigned char rece_index=0; //实际接收数组长度计数

unsigned char idata sendBuf[75];//定 义 发 送 数组,最大允许发送32个字,64个字节

unsigned char idata receBuf[75];//定 义 接 收 数组,最大允许接收32个字,64个字节unsigned char*ps=sendBuf; //发送数据指针unsigned char*pr=receBuf; //接收数据指针unsigned int xdata WordBuf[128]; //定义字寻址区,32个short型,有符号型

unsigned int xdata BitBuf[32]; //定 义 位 寻 址

区,10~31内部位,0~9输出口

图2 MCU程序的设计流程图

unsigned char xdata inputBit[32];//输入位状态

unsigned int*pw=WordBuf; //字指针

unsigned int*pb=BitBuf; //位指针

unsignedintsendlength; //发送数据长度

//主流程

void main()

{

init(); //执行初始化程序,T0设定为1 ms定时器,//串口 mode1,N-8-1-1,9 600 bps

while(1) //执行运行程序

{…… //进行相关数据分析处理与收发准备

}

}

//串口中断服务程序

void ser()interrupt 4 //串口中断的序号是4

{

RI=0; //产生串口中断时RI被硬件置1,需要用软件清0;

comm_END=4; //9 600 bps下,等待3.5个字节需要约4 ms的时间

Reciver_bit=1; //产生一次中断置一次位

Reciver_Buf=SBUF; //将接收到的数据赋给一个变量;

receBuf[rece_index++]=Reciver_Buf;

//将接收到的数据存入接收数组

}

//T0中断服务程序

//1 ms定时中断,用于判断通信帧结束

void comm_stop()interrupt 1

{

if(Reciver_bit&&comm_END!=0)

comm_END--; //等待4 ms延时if(comm_END==0) {

Reciver_bit=0; //帧接收,对标志位清零

//判断是否为本站地址或者是广播地址,有效报文的字节数量最少是8个字节

if((*(pr+0)==0x01||*(pr+0)==0x00)&&rece_index>=8)

{ AnalyzeRecieve(); //分析并生成响应报文if(*(pr+0)==0x01) send_comm(); //发送响应报文,广播模式下不用返回

}

comm_END=4; //重新赋延

时初值

rece_index=0; //数组长度

清零

for(i=0;i<75;i++)receBuf[i]=0; //清空接收数组

Reciver_Buf=0;

}

}

//分析并生成响应报文

void AnalyzeRecieve()

{

…… //计算校验CRC,得到a1 CRC低字节,a2 CRC高字节

if(a1==*(pr+(rece_index-2))&&a2==*(pr+ rece_index-1))//校验正确

{

switch(*(pr+1))

{ case 0×01:Recirve_01();break;

//读位状态case 0x02:Recirve_02();break;

//读输入位状态case 0x03:Recirve_03();break;

//读寄存器case 0x04:Recirve_04();break;

//读输入寄存器

case 0x05:Recirve_05();break;

//写单个位状态case 0x06:Recirve_06();break;

//写单个寄存器case 0x10:Recirve_10();break;

//写多个寄存器default:errorsend(*(pr+1),0×04); break;//不支持的功能码

}

}

else //返回校验错误代码

{

…… //进行错误代码响应处理

}

}

//分析01功能码报文,产生响应报文 读位状态void Recirve_01()

{

…… //相关局部变量设置

startaddH=*(pr+2);

startaddL=*(pr+3);

bit_numH=*(pr+4);

bit_numL=*(pr+5);

startadd=(startaddH<<8)+startaddL; //要返回的起始地址

bit_num=(bit_numH<<8)+bit_numL; //要读的字节数量,单位是位

if((startadd+bit_num)>=32) //最多允许32位,从第4位开始读

{

errorsend(0x01,0x02); //响 应 寄存器

数量超出范围

}

else //准备发送回传的位状态数据包

{

*(ps+0)=0x01; //站号

*(ps+1)=0x01; //功能码

if((bit_num%8)==0)*(ps+2)=(bit_num)/8; //要返回的字节数

else*(ps+2)=((bit_num)/8)+1; //不能 整除8的时候要多返回一个字节

for(i=0;i<*(ps+2);i++)

{ *(ps+3+i)=0; //先清零复位

for(j=0;j<8;j++) //每8个

位状态组成一个字节返回

{ //低位在前,高位在后;此处位指针*ps指向即为需要向触屏提供的位状态参数

*(ps+3+i)=(u8)((*(pb+startadd+i*8+j)&0× 01)<<j)+*(ps+3+i);

}

}

…… //CRC校验,低位在前,高位在后

sendlength=*(ps+2)+5; //设置响应报文长度

}

}

3 结语

目前,虽然各种通信协议发展得都很迅速,特别是USB通信接口的应用已经成为个人电子娱乐消费产品中最常用到的接口形式,但是在工业领域应用最多的还是Modbus通信协议。该协议可应用在RS232、RS422、RS485、TCPIP等多种系统接口网络中,熟悉和掌握Modbus通信方法是电子工程师设计、研发工业类和实验室类设备通信或组网所应具备的一项专业技能。本文较为系统地介绍了运用Modbus通信协议通过RS232硬件接口实现单片机与彩色触摸屏的通信和控制,希望能为同行提供一些借鉴和参考。

[1]马忠梅,籍顺心.单片机的C语言应用程序设计[M].北京:北京航空航天大学出版社,1999.

[2]陈龙三,张琦.8051单片机C语言控制与应用[M].北京:清华大学出版社,1999.

[3]何立民.MCS-51系列单片机应用系统设计系统配置与接口技术[M].北京:北京航空航天大学出版社,2001.

[4] 王晓宁.基于C8051F340单片机的USB数据采集系统[J].医疗卫生装备,2009,30(7):111-113.

[5]线岩团,许江淳,鄢大鹏.基于单片机的MODBUS的协议实现[J].云南大学学报,2009,31(S2):120-124.

[6]吕国芳,唐海龙,李进.基于Modbus RTU的串口调试软件的实现[J].计算机技术与发展,2009,19(9):236-238.

[7]罗湘,余臻.基于Modbus协议的单片机数据采集[J].工业控制计算机,2009,22(6):75-76.

[8] 深圳市显控自动化技术有限公司.MODBUS通讯详细说明[EB/ OL].[2012-06-20].http://www.zhongsou.net/显控自动化/channel/ MODBUS通讯详细说明.pdf.

[9]孟华,王鹏达,李明伟.基于Modbus协议的触摸屏与PIC单片机的通信实现[J].仪表技术与传感器,2009(10):58-60.

[10]袁臣虎,王臻,李秀艳,等.基于MODBUS协议的触摸屏与TMS32 0F2812串行通信研究[J].天津工业大学学报,2010,29(2):63-67.

[11]张桓,赵树忠.基于Modbus协议的单片机与触摸屏通讯系统设计[J].河北理工大学学报,2010,32(4):82-87.

(收稿:2013-06-17 修回:2013-08-20)

Application of Modbus Protocol to MCU Communication

WANG Xiao-ning,HUANG Chuan-wei,GUO Jian,WANG Jie,LI Si-wei,LU Ming-li
(Plant of Experimental Instrument,Academy of Military Medical Sciences,Beijing 100850,China)

ObjectiveTo develop a set of MCU control system for the data communication between MCU and the touch screen to achieve human-machine interaction.MethodsThe serial communication method between the touch screen and MCU STC89C58RD+based on Modbus protocol was studied.The hardware interface used standard RS232 protocol,with the touch screen as the host device and STC as the slave one.ResultsTrails proved that the touch screen could realize the functions of display,manipulation and etc.ConclusionThe control system,being stable and reliable,can realize humanmachine interaction,and the design of the hardware and software is convenient,so that the design requirements are met.

Modbus protocol;touch screen;MCU;serial communication

R318;TN914

A

1003-8868(2014)01-0023-04

10.7687/J.ISSN1003-8868.2014.01.023

王晓宁(1974—),男,工程师,主要从事电子控制系统的设计研制与医学信号的测量与处理,E-mail:wxnamms@sina.com。

100850北京,军事医学科学院实验仪器厂(王晓宁,黄传伟,郭剑,王 洁,李斯伟,鲁茗莉)

[Chinese Medical Equipment Journal,2014,35(1):23-26]

猜你喜欢
通信协议字节触摸屏
No.8 字节跳动将推出独立出口电商APP
基于Wireshark的列控中心以太网通信协议解析器的研究与实现
PLC和触摸屏在卫生间控制系统的应用
No.10 “字节跳动手机”要来了?
浅析投射式多点触控电容触摸屏
基于MSP430的四旋翼飞行器的S-BUS通信协议的设计与实现
皮肤“长”出触摸屏
关于电力物联网信息模型及通信协议的设计要点分析
基于风险分析的安全通信协议简化研究
RSSP-I、RSSP-Ⅱ及SAHARA三种安全通信协议实现技术简介