基于VC++的Modbus协议串口通信设计与实现

2017-12-07 12:43廉永乐王明
数字技术与应用 2017年9期

廉永乐+王明

摘要:串口通讯是工业设备组网的主要通讯接口,ModBus协议作为一种全球通用的工业标准,是不同设备组成工业网络的总线协议。本文采用VC++开发平台,设计开发基于ModBus协议的串口通讯软件,以实现不同设备的组网和远程监视控制。

关键词:串口传输;Modbus协议;MSComm控件;ModSim32软件

中图分类号:TP273 文献标识码:A 文章编号:1007-9416(2017)09-0158-03

串行通讯的距离从几米到几千米,传输线最少时只需一根即可实现通信,比较适合远距离通讯传输,在工业控制、测量设备以及远程监控中串行通讯广泛使用。Microsoft Visual C++作为微软公司面向对象程序的开发平台,具有集成的开发环境,支持C、C++等编程语言。ModBus协议在OSI七层参考模型中作为应用层协议,是全球最早应用于工业现场的总线协议。目前,ModBus协议已经成为一种通用工业标准,不同设备通过ModBus协议可以组成工业网络,实现集中监控。本设计针对VC++开发平台设计并实现了基于ModBus协议的串口通讯软件。

1 串口通信原理

1.1 串行通信的特点

串口通信的特点是数据流在通讯传输线上逐位按顺序分时进行传输,每次通信雙方传输一个数据位,也就是一个二进制数0或1,以最小单位二进制数0或1逐位进行传输。串口通信分为三种传输模式,分别是全双工、半双工和单工,具体划分是按照数据流的方向划分,数据通常是在通信双方的二个站点之间点对点进行传输[1]。

1.2 串行通信的接口标准

一个完整的的串行通信系统如图1所示,该系统包括数据终端设备(Data Terminal Equipment ,DTE)和数据通信设备(Data Communication Equipment,DCE)。

串行接口标准定义了DTE的串行接口电路与DCE之间的连接标准,包括连接电缆、接口几何尺寸、引脚功能和电平定义等,在计算机网络中,构成网络的物理层协议。

1.3 串行传输协议

通讯协议是一种对通讯双方之间进行通讯交流规则的约定。协议中规定了双方进行通讯的数据格式、传送速度、控制字符、同步方式、检错方式及传送步骤。通讯协议属于OSI七层参考模型中的数据链路层[2]。串口通讯按照同步方法的不同分为异步传输和同步传输。

1.4 Modbus通信协议

按照OSI七层参考模型,Modbus通讯协议属于应用层协议,是一种全球通用的工业标准。标准Modbus通讯,具有两种通信模式分别是Modbus RTU和Modbus ASCII模式。无论是RTU模式还是ASCII模式,Modbus信息以帧的方式传输,每帧有确定的起始点和结束点,使接收设备在信息的起点开始读地址,并确定要寻址的设备 (广播时对全部设备),以及信息传输的结束时间[3]。

2 通信软件设计与实现

本文基于VC++软件开发设计串口通信传输的上位机软件,归纳了实现串口通信传输的三大模块,分别是通信串口初始化、通信参数初始化以及串口数据接收处理流程,并概括总结了实现串口通讯编程的步骤和流程。

2.1 串口初始化

上位机与从机终端监控采集仪表通过串口实现通讯,首先通讯软件需要对上位机串口进行初始化,串口初始化内容包括设置实施通讯传输的上位机端口号,设置通讯参数如数据位、波特率、停止位和校验位,收发数据类型,串口打开等操作。执行串口初始化的流程图如图2所示。

2.2 基于特定通讯协议通讯参数初始化

不同设备实现通讯,双方需要遵循一定的通信准则,要实现不同设备之间的串口通讯传输就必须规定通讯双方使用相同的通讯协议。上位机软件若要实现主从设备之间的串口通讯需要对双方所采用的通讯参数进行初始化操作,本设计以Modbus RTU协议为例介绍如何通过编程实现串口通讯协议的初始化操作,流程图如图3所示。

2.3 基于串口事件的接收数据处理

上位机软件采用控件编程实现串口通讯时,如何从串口接收缓冲区准确接收从机发送来的数据是串口通讯软件的核心部分。采用控件从串口接收数据是通过触发事件执行函数读缓冲区数据,完成串口数据的接收。事件触发的条件是属性的值变化,无论何时属性值发生变化就会触发事件。串口通讯传输过程中当接收缓冲区接收到数据时,属性的值被置为2,并触发事件。

上位机软件采用控件通讯,处理输入缓冲区和输出缓冲区的数据是软件编程的一个难点。串口通讯过程中读取输入缓冲区数据和软件写入输出缓冲区的数据都是类型,上位机软件通讯使用的数据包括多种类型有二进制数值、文本型字符串,正确处理类型数据与二进制数据、字符串数据转换是上位机软件能否实现正常串口通讯的关键(图4)。

以上位机软件采用控件接收二进制数据为事例,读取含有二进制数据的接收缓冲区数据的程序代码如下:

VARIANT variant_var;

Longn,lens=0;

COleSafeArray safearray_var;//构造一个任何类型的空数组.

BYTE rxdata[1024];

variant_inp=m_port.GetInput(); //读取接收缓冲区 数据

safearray_var=variant_var;//将VARIANT类型变量转换为ColeSafeArray类型变量

lens=safearray_var.GetOneDimSize(); //获取接收到的字符数

for (n=0;n

{

safearray_var.GetElement(&n,rxdata+n);//将COleSafeArray数组中第n个元素赋予BYTE数组中第n个元素

BYTE bt=*(char *)(rxdata+n);//字节数组元素转换字符型

}

以上详细介绍了基于VC++开发平台实现协议串口通讯编程的主要功能模块和编程流程。

3 软件调试及数据分析

本文采用虚拟软件模拟测试和硬件调试两种方法,对串口通信软件进行功能调试和数据分析。

3.1 虚拟软件模拟测试

虚拟软件模拟测试分为三部分,分别是终端智能监控仪表、通信传输端口和上位机软件;其中,终端采集监控仪表采用软件模拟实现,通信端口采用软件虛拟,上位机软件基于VC++开发平台编程实现。

搭建虚拟软件测试平台,第一步,打开上位机上的虚拟串口软件,虚拟两个串口、,将两个虚拟串口模拟连接。第二步,启动从机模拟软件,初始化从机设备属性,包括从机设备地址、串口通信参数、寄存器功能代码、寄存器地址和添加从机各寄存器储存数据,并打开串口。第三步,运行上位机通信软件,保持上位机串口通讯参数初始化与模拟软件一致。

在上位机软件与从机模拟软件通讯传输中,通过虚拟串口可以实时监测和端口收发数据流量。

3.2 硬件搭建调试

硬件联调测试首先需要搭建硬件环境,由于监控终端采集仪表端口为RS485串口,上位机含有RJ45网口和RS232串口,没有RS485串口。本设计通过USR-N540串口服务器将RS485串口信号转换为网口信号,经过交换机接入以太网。上位机通过RJ45网口接入以太网访问串口服务器IP地址实现与串口服务器通讯,以实现上位机与终端采集仪表通信。

3.3 软件调试中存在的问题及解决方案

上位机软件调试中出现部分采集数据为乱码,通过对软件的逐条测试发现,由于上位机软件串口通信采用基于事件驱动,并且程序中控件的属性值设置为1,所以通信端口接收缓冲区数据多于或等于1个字符时便引发一个接收数据事件。实际串口通讯传输时采集终端发送的数据较多,每次传输并未完全传输结束就触发了接收数据事件,使得上位机软件采集到的数据出现乱码。

本文通过在上位机软件的接收程序前加入延时函数,触发事件后延时100ms再读取接收缓冲数据,保证所有数据传输完毕,延时函数的加入解决了上位机软件通信中出现的乱码问题。

4 结语

本文在设计实现基于VC++开发平台的串口通信传输软件的基础上,对编程开发串口通讯软件归纳凝练了三大模块,分别是串口初始化模块、基于通讯协议的通讯参数初始化模块和基于串口事件的接收数据处理模块,并介绍了串口通讯编程的流程和步骤。采用ModSim32软件模拟从机设备搭建虚拟软件测试平台既节约了软件开发成本,又提高了软件开发效率和软件代码质量,减少了软件运行中的bug。硬件连接调试进一步优化了上位机软件在实际运行环境中存在的干扰等问题。

参考文献

[1]王秀彪.浅谈基于半双工通信系统的通信控制协议设计[J].民营科技,2010,(09):36-37.

[2]许永康.RS-232转RS-485网络的通信[J].微计算机信息,2007,23(10):228-229.

[3]阚能琪.VC++串口通信中多线程技术的应用研究[J].西华大学学报(自然科学版), 2005,24(04):84-85.endprint