基于Delphi的车载数据显示界面的设计
引言
在自动控制、仪表智能化、工业测控点实时监控等领域中,人们经常用计算机对生产过程实行实时监控,以对下位机采集来的数据进行实时数据处理,同时产生和传输控制信号,在这种特定环境下,计算机要与过程控制的实时信号相联系,为此,使用笔者使用delphi开发了一个车载数据采集显示系统的界面,从而在基于windows操作系统中实现了下位机与上位机的数据通信。
设计思想和软件架构
delphi是一种功能强大的高级编程语言,它具有可视化,面向对象的特性,特别适于在windows环境下进行图形界面和用户程序的编制[1],该显示系统的下位机以dsp为核心,可实现对重要参数的检测、控制,并将采集的数据以一定的方式向上位机发送,从而实现与上位机的数据通信,在数据传输的过程中仍然采用串行通信的方式,该软件的总体设计任务是:
(1)通过该软件对串口参数进行配置,以与下位机形成统一的通讯协议。
(2)通过该软件实时显示下位机的数据采集值,同时调用和察看存盘的数据记录。
基于以上任务,该界面的软件架构模型如图1所示,该程序由串口通信模块、数据处理模块、数据显示模块和数据保存模块四部分组成。

软件设计
串口通信模块的设计
在delphi环境下的串口通信实现方法主要有4种,即使用控件(如mscomm)、使用api函数,使用行间汇编asm或在程序中调用其他串口通程序[2],利用api函数或行间汇编编写串口通信程序较为复杂,但优点是可以实现功能更强大,应用更广泛、更复杂的低层次通信程序,mscomm通信控件可以用来提供简单的串行端口通讯功能,也可以用来创建功能完备、事件驱动的高级通讯工具,该控件提供了一系列标准通讯命令的使用界面,使用它可以建立与串行端口的连接,并通过串行端口连接到其他通讯设备(例如调制解调器),以发出命令、交换数据和监视及响应串行连接中发生的事件和错误,因为mscomm控件的属性较多,应用起来比较方便,所以用该控件编写串行通信程序相对来说比较简单,下面介绍本文在程序设计中用到该控件的几个属性:
comm port:设置并返回通信口号。
comm event:返回通信事件或错误。
input:返回并删除接收缓冲区中的数据,在设计时,该功能无效,而在运行时为只读。
inputlen:确定被input属性读取的字符数。
inputmode:设置并返回被input属性读取的数据类型,其中cominputmodetext以文本形式返回,而cominputmodetext以本文形式返回,而cominputmodebinary则以二进制形式返回。
output:向输出缓冲区中写入数据,在设计时无效,运行时为只读。
portopen:设置并返回通信端口开或关的状态,运行时有效。
rthreshold:在mscomm控件中设置commevent属性为commevreceive,并在产生oncomm事件之前,设置并返回要接收的字符数。
settings:设置并返回初始化参数,即波特率、奇偶校验、数据位和停止位。
oncomm事件:当commevent属性的值变化时产生次事件,以标志发生了一个通信事件或错误。
mscomm控件有两种处理通信的方式,即事件驱动和查询方式[3],事件驱动方式是处理端口通信的一种有效方法,它可以利用oncomm事件捕获并处理通信中发生的事件或错误,实时性较强,而查询方式是在程序通过查询commevent属性的值来判断通信的过程中的事件或错误,这种方式适合于应用程序较小、实时性要求不是很高的系统中,本文采取的是事件驱动方式,用户可以在oncomm事件中编写程序代码。串口通信的主要步骤有:
(1)设置通信对象、通信端口以及其他属性;
(2)设定通信协议;
(3)打开通信端口,进行数据的传送;
(4)关闭通信端口。
下位机主要用于将采集上来的数据通过pc机上的rs-232接口发送到上位机,其程序流程如图2所示。

数据处理模块的设计
数据处理模块的主要任务是将从下位机上接收到的数据进行分类,并对数据进行分割和转化,以得到需要的数据,在下位机和上位机的通信过程中数据是按照一定的通信协议进行封装和传输的,下位机把数据以16进制的数组形式向上发送,其数据帧的封装格式如图3所示,一帧数据包括10个字节,其中id号占2个字节,每个data占一个字节,id号代表了数据的类型含义,data则代表具体的数据值,图4是具体传输的数值模式。

因此,在程序设计中,必须将id号和数据进行分离,以分别读出它们各自的数值,然后根据id的数值对相应的数据进行分类和转化,以变成所需要的数据,并附值给相应的变量,从而在后面的显示模块设计中合理地使用这些变量来达到正确显示数据的功能,其程序流程图如图5所示。

数据显示模块的设计
在数据显示模块的设计当中,笔者使用了timer(定时器)这一控件来进行软件的开发。因为在软件设计过程中,定时器所起到的作用是非常大的。timer控件具有enabled(定时器使能属性)、interval(定时时间间隔)等属性。使用timer时,首先要将enable置1,然后设定时间间隔,最后在ontimer()事件中添加程序代码。
由于车辆状态的各种参数的实时性相当重要,它是驾驶员作出正确操作的根本依据,因此,数据的显示要求是动态实时地反应车辆的行驶状况,采用定时器可以每隔一段时间对显示的数据进行一次刷新,从而很好地满足这一需要[4]。显示程序的代码可以全部写在定时器里面,数据显示的界面分为欢迎界面、整车参数显示界面、燃料电池参数显示界面、镍氢电池参数显示界面和状态信息显示界面,每一个界面都能实时的反应正确的参数信息,并回馈给驾驶员每个部分的工作状态,其中整车参数显示界面如图6所示,燃料电池参数显示界面图如图7所示。


数据保存模块的设计
在该界面的设计过程中,还有一个数据保存模块。该模块的功能是将车上重要的行驶参数和状态参数保存到计算机的硬盘里,也可以通过usb接口用移动硬盘将数据从计算机里读出,以方便工作人员和研究人员对数据的察看和分析,从而对汽车的性能和控制作进一步的改善,因为汽车在行驶过程中下位机与上位机的通信数据量非常大,如果每接收到一组数据,就将数据往文件里写一次,那么对资源的开销太大,而且会降低软件的运行效率,所以,本文采用定时方式,即每隔一段时间存储一次数据,即对数据的存储过程是在定时器里完成的,这样,每次汽车启动时,就可在系统里建立一个文本文件,并设置文件的存储路径,然后每隔一段时间向这个本文文件里写一次数据,数据的保存格式遵循通信协议里数据帧的格式,在程序的设计过程中,调用api函数即可实现数据的存储,其程序流程图如图8所示。

结束语
本文给出了基于delphi的车载数据显示系统界面的设计框架和软件体系结构,本系统通过串行通信技术来实现下位机和上位机的实时通信,并通过对实时数据的处理,显示和存储,来达到对汽车行驶状态的监控,实践证明:用delphi开发该系统,其人机界面友好,便于操作,移植性强,并具有很好的扩充性。可以相信随着工业信息化和自动化的发展,这项技术将会应用在更多的领域。
评论