工控网首页
>

应用设计

>

Delphi7.0开发环境下的实时数据采集程序设计

Delphi7.0开发环境下的实时数据采集程序设计

2007/8/21 17:37:00
摘要:本文介绍了利用Delphi开发平台开发数据采集程序的两种方法,并结合某项目给出了一个编程的具体例子。 关键词:Delphi;MsComm控件;数据采集 ABSTRACT:This paper introduces two methods of implementation about collecting data with Delphi and gives a example of some project. KEY WORDS:Delphi7.0;Mscomm Control;Data Collection 1.概述 Delphi是Windows平台下高效的可视化集成开发环境(IDE),其具有所见即所得的可视化界面设计风格和面向对象的程序设计等特点,已广泛应用于各个领域,成为首选开发工具之一。Delphi提供了良好的界面设计能力,在PC机的串口通信方面也有很强的功能。 数据采集过程实质上是信息的采集、传递和处理以及对数据采集器控制的过程。由于串行通信具有所用的传输线少,成本低,传输距离近等特点,现实中通常采用以PC机为主机,通过线缆连接,以RS232/485串行接口为通信通道,对数据采集器进行控制,并接收采集到的数据和采集器的状态信息。 2.串行通信方法简介 目前PC机普遍采用Microsoft 32位Windows操作系统。Windows下的串行通信不提倡应用程序直接控制硬件,而是通过操作系统提供的设备驱动程序来进行数据传递,或者说是通过系统提供的数据结构与系统进行信息交换,进而完成数据的发送和接收。串行口在Win 32中是作为文件方式来处理的,Win32提供了相应的文件I/O函数与通信函数。读写串口的操作一般可以通过4种形式加以实现:查询、同步I/O、异步I/O、事件驱动I/O。查询方式简单直接,但占用了大量的CPU时间;同步方式直到读取到指定字节数或超时时才返回,应用程序在程序结束前始终控制程序流,通信故障等因素可能会导致应用程序的无限等待,从而长时间阻塞线程;异步方式则在后台读写数据,而在前台执行其它任务;事件驱动是在指定的串口事件发生时自动调用相关的处理程序的机制。前两种方法效率低、浪费资源,因此一般使用异步I/O和事件驱动I/O。 3.Delphi环境下串口通信实现方法 Delphi下编制串行通信程序,可利用Windows 标准API串行通信函数,也可利用为简化Windows下串行通信编程的ActiveX控件,如Microsoft Communications Control(MSComm)或者Delphi的第三方控件如Spcom来实现。前者程序设计相对复杂,不易掌握,但可以实现功能强大、应用广泛、复杂的低层次通信程序。而后者则相对简单,上手快,开发工作量少。Delphi第三方控件是Object Pascal类,它遵循一定的规则,并通过面向对象的概念得以继承和扩充,为Delphi的应用开发提供了丰富的资源。 Delphi开放式的控件支持环境,使得成千上万的Delphi用户能够为Delphi编写大量的第三方控件,并通过Internet发布,形成巨大的共享资源。下面分别介绍利用API和第三方控件实现Delphi下串行通信的方法。 3.1.使用API实现串口通信 一般的程序设计思路就是使用Windows系统提供的应用程序接口函数实现串行通信的,这些函数经过Delphi的封装后为:CreateFile(打开串口)、CloseHandle(关闭串口)、GetCommState(用指定通信设备的当前控制设置填充设备控制块< Device Control Block ,DCB>)、SetCommState(用相应的设备控制块配置通信设备)、GetCommMask(此函数调用后返回指定通信设备的事件掩码值)、SetCommMask(指定一系列事件监视通信设备)、ReadFile(读串口)、WriteFile(写串口)。利用API进行串行通信的主要步骤如下: 1).打开串口 通信程序从CreateFile处指定串口设备及相关的操作属性,并返回一个句柄,该句柄将被用于后续的通信操作。 var hCommFile:THandle; …… hCommFile:=CreateFile(COM2,GENERIC_READ or GENERIC_WRITE,0, nil,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL or FILE_FLAG_OVERLAPPED,0); if hCommFile = INVALID_HANDLE_VALUE then raise ECommsError.Create( 打开串口错误); 2)初始化串口 打开通信设备句柄后,通常要对串口进行初始化工作(即配置波特率、数据位数、停止位数、奇偶校验以及握手、流控协议等参数),配置串口通过改变数据结构--设备控制块DCB来实现。DCB结构有近30个数据成员,对于采用3线方式的串行通信,只需设置好波特率、数据位、停止位、校验位等关键参数即可。 设置串口波特串为9600,数据位长度为8,1个停止位,不进行奇偶校验的程序设计如下: var dcb: Tdcb; …… GetCommState(hCommFile,dcb); dcb. BaudRate:=9600; //波特率9600 dcb.ByteSize:=8; //数据位长度为8 dcb. Parity:=NOPARITY5; //不进行奇偶较验 dcb.StopBits:=ONESTOPBIT; //l位停止位 SetCommState(hCommFile,dcb); 3)读写串口 Delphi封装后的串口读写API函数为: //写串口函数 function WriteFile(hFile: THandle; const Buffer; nNumberOfBytesToWrite: DWORD;var lpNumberOfBytesWritten: DWORD; lpOverlapped: POverlapped): BOOL; stdcall; //读串口函数 function ReadFile(hFile: THandle; var Buffer; nNumberOfBytesToRead: DWORD; var lpNumberOfBytesRead: DWORD; lpOverlapped: POverlapped): BOOL; stdcall; 4)关闭串口 串口是独占非共享性资源,打开串口后,一定要关闭串口。关闭串口的API函数为: function CloseHandle(hObject: THandle): BOOL; stdcall; 3.2.使用控件MSComm实现串口通讯 MSComm控件具有丰富的与串口通信密切相关的属性,提供了对串口进行的多种操作,进而使串行通信变得十分简便。MSComm的控件属性较多,常用的属性如下: 1).CommPort:设置或返回串行端口号,缺省为1。 2).Setting:设置或返回串口通信参数,格式为“波特率,奇偶校验位,数据位,停止位”。例如:MSComm1.Setting:=9600,n,8,1 3).PortOpen:打开或关闭串行端口,格式为:MSComm1.PortOpen:={True|False} 4).InBufferSize:设置或返回接收缓冲区的大小,缺省值为1024字节。 5).InBufferCount:返回接收缓冲区内等待读取的字节数,可通过设置该属性为0来清空接收缓冲区。 6).RThreshold:该属性为一阈值,它确定当接收缓冲区内的字节个数达到或超过该值后就产生代码为ComEvReceive的OnComm事件。 7).SThreshold:该属性为一阈值,它确定当发送缓冲区内的字节个数少于该值后就产生代码为ComEvSend的OnComm事件。 8).InputLen:设置或返回接收缓冲区内用Input读入的字节数,设置该属性为0表示Input读取整个缓冲区的内容。 9).Input:从接收缓冲区读取一串字符。 10).OutBufferSize:设置或返回发送缓冲区的大小,缺省值为512字节。 11).OutBufferCount:返回发送缓冲区内等待发送的字节数,可通过设置该属性为0来清空缓冲区。   12).OutPut:向发送缓冲区传送一串字符。 在通信过程中发生的错误或事件会引发OnComm事件,并由CommEvent属性值反映错误类型,程序根据该属性值来执行不同的操作。CommEvent属性值及其含义如下: 1).ComEvSend:值为1,发送缓冲区的内容少于SThreshold指定的值。 2).ComEvReceive:值为2,接收缓冲区内字符数达到RThreshold指定的值。 3).ComEvFrame:值为1004,硬件检测到帧错误。 4).ComEvRxOver:值为1008,接收缓冲区溢出。 5).ComEvTxFull:值为1010,发送缓冲区溢出。 6).ComEvRxParity:值为1009,奇偶校验错误。 7).ComEvEOF:值为7,接收数据中出现文件尾(ASCII码为26)字符。 4.应用实例 下面通过一个实例介绍Delphi利用MSComm通信控件,开发PC机通过串口对某试验厂路面荷载进行实时数据采集的编程技术。给出的程序代码具有通用性,并有详细的注释,可以直接或稍加改动就可用于其它数据采集或者实时控制程序中。 该项目上位机采用Delphi编写,数据采集仪采用研华ADAM5510作为下位机采集实时压力数据,采用AscII方式传送数据,数据传输速率为9600bps,1位开始位,8位数据位,1位停止位,无奇偶校验位。数据通信的具体格式为:。 程序用到的全局变量为: ReceiveStr :String; //接受Ascii码字符数据字符串 F1,F2,F3,F4,Fz,Fa:Double; //四路压力值数据,总压力值,平均压力值 程序中绘制的压力曲线采用TChart组件,变量定义为: FChart: TChart; 1).串口初始化 with MSComm do begin CommPort:=1; //使用Com1 Settings:=9600,n,8,1; //设置通信口参数 InputLen:=1; //设置Input一次从接受缓冲区读取字节数为1 InBufferCount:=0; //清除接受缓冲区 OutBufferCount:=0; //清除发送缓冲区 InBufferSize:=50; //设置接受缓冲区为50字节 OutBufferSize:=2; //设置发送缓冲区为2字节 RThreshold:=1; //设置接受一个字节产生OnComm事件 InputMode:=ComInputModeText; // 设置接受数据模式为二进制方式 If (not PortOpen )then //判断通信口是否打开 PortOpen:=True else ShowMessage(串口已经打开!); end; 2).数据接收与处理 为了达到实时数据采集的目的,实时数据采集处理程序采用MSComm的事件驱动方式。 procedure TForm1.MSCommComm(Sender: TObject); var buffer :Olevariant; sTemp:string; cNow :Char; tmpX:Double; begin if MSComm.CommEvent = comEvReceive then //接受事件 begin buffer:=MSComm.Input; //读取接受到的数据 sTemp:=buffer;
投诉建议

提交

查看更多评论
其他资讯

查看更多

基于Delphi7.0环境下的OPC客户端程序的开发