CCD光电在线测径仪数据处理软件系统中两个关键问题的解决-如何打开mdb文件

摘要:本文详细介绍了编写CCD光电在线测径仪数据处理软件系统中两个关键问题的解决方案。一是如何利用多线程技术实现串口通信,以便能够实时、准确地将现场数据接收过来,而不影响数据处理的执行;另一个是如何将大量的测量数据实时的存放到数据库中,以便为后面数据处理提供方便。

关键词:串口通信 存储 数据库

1、引言

在现代的钢铁企业中,传统的成品尺寸检验是定期地对轧制中的盘钢进行人工抽样检验,这无疑不能满足生产快节奏的现代企业要求。在生产过程中,人们希望在生产线上动态无损地随时监控线径的微小变化,以便利用计算机进行直接调整,光电在线测径仪能够适应高温、高速热轧直径的在线测量。然而,如何能够将大量的测量数据进行实时准确地处理,并将测量数据保存起来,已备进一步进行数据处理时使用,将对整个测量系统起着至关重要的作用。工业中一般采用串口通信进行现场数据传输,采用数据库将数据保存下来,因此,在编写数据处理软件系统时,这两个问题将是整个软件编写的关键所在。

2、出口通信的实现

2.1、串口通信的概述

与以往DOS下串行通信程序不同的是,Windows不提倡应用程序直接控制硬件,而是通过Windows操作系统提供的设备驱动程序来进行数据传输。串口在Win32中是作为文件来进行处理的,而不是直接对端口进行操作,对于串行通信,Win32提供了相应的文件I/O函数与通信函数,通过了解这些函数的使用,可以编制出不符合不同需要的通信程序。

串口通信的实现通常由三种方法:使用VC++提供的串行通信控件MSComm、在单线程中实现自定义的串口通信类、多线不大的情况下可以很方便的使用,但在某些情况下,如数据处理很复杂时,当数据处理还未结束,就有新的数据传入,这种情况下会造成数据的错误捕捉及数据的丢失,这就需要使用第三种方法,在自定义的串行通信类中创建端口监视线程,以便在指定的事件发生时向相关的窗口发送通知消息。

2.2、多线程下串口通信的实现

下面将结合程序详细介绍如何利用Windows多线程技术实现串口通信,对于涉及到的有关多线程的基本知识可以参考其他VC++书或MSDN帮助文件。

2.2.1、串口的打开及配置

在介绍串口打开及配置之前,先介绍一下两个句柄:m _hS-hutdownEvent,m _hPostEvent。m _hShutdownEvent是用来检测线程是否关闭。m _hPostEvent是用来检测消息映射处理是否已进行完毕,也即是用来检测数据处理是否已经进行完毕。这两句柄的创建函数为:

m _hShutdownEvent=CreateEvent(NULL,TRUE,FALSE,NULL);//初始化为无信号

m _hPostEvent=CreateEvent(NULL,TRUE,TRUE,NULL);//初始化为有信号

使用CreateFile()函数打开串口。实现方法如下:

m _hComm=CreateFile(szPort,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTLNG,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,0);m _hComm为串口句柄,szPort为串口名,FILE_FLAG_OVERLAPPED 参数指明为I/O异步方式。对于串口,共享模式必须选择独占方式,创建方式参数必须为OPEN_ EXISTING。如果该函数返回值不是INVALID_ _HANDLE_ VALUE,就可以利用SetCommTimeouts()、SetCommMask()、SetCommState()等函数对串口进行超时配置、通信事件配置和通信参数配置等。在本系统 中通信事件为EV_ RXCHAR(串口收到一个字符),用WaitCom-mEvent()函数来监控这一事件,一旦有EV_ RXCHAR事件发生, WaitCommEvent()函数就会成功返回,以便程序进行下一步操作。

2.2.2、用于监控串口的工作者线程的创建

在VC++6.0下,MFC应用程序的线程由CWinThread对象表 示。VC++把线程分为两种:用户界面线程和工作者线程。用户界面线程能够提供界面和用户交互,通常用于处理用户输入并响应各种事件和消息;而工作者线程主要用来处理程序的后台任务。下面就创建了—个用于监控串口的工作者线程。以下的CreateThread()函数执行完后就创建了一个线程,其中WatchThread为侦测线程函数体,该线程—旦创建就立即执行。若不想立即执行可以将第二个参数设置为CREATE_ SUSPENDED-ED,然后再调用 ResumeThread()。

m_hWatchThread=CreateThread(NULL,0,WatchThread,this,0,&dwThreadID);

下面将给出WatchThread()函数体:

CCD光电在线测径仪数据处理软件系统中两个关键问题的解决

SingleObject —直返回WAIT _ TIME0UT,该侦测函数一直执行。我们在退山程序中加入SetEvent(m _ hShutdownEvent)语句可使该函数结束。当该函数探测到有EV_RXCHAR事件发生时先将数据接收下来,等上次消息处理完后,再发送该次消息,以便处理该次收到的数据。我们在消息处理函数返回前应增加 SetEvent(m_MSComm,m_hPostEvent)语句,以便程序能够再次发送消息。

3、数据的数据库存放

我们采用ODBC编写与数据库连接的程序。ODBC是一种使用SQL的程序设计接口。使用ODBC让应用程序的编写者避 免了与数据源相联的复杂性。

3.1、ODBC数据源的加载

ODBC数据源的创建常用的一种方法是手动设置数据源,过程可以参考其它资料。这里我将介绍一种高级的动态加载 ODBC数据源的方法。就是利用动态连接库Odbcint. dll中的 SQLConfigDataSource()函数来加载数据源。该函数原型说明如下:

BOOL SQLConfigDalaSource(HWnd hwndParent,//父级窗口,若为NULL 不会出现提示对话框

WORD fRequeset,LPCSTR lpszDriver,//该参数说明数据库引擎名称

LPCSTR lpszAttributes);//该参数的关键字- 值对间用“ \ 0”隔开

关于fRequest参数的说明可以参考MSDN帮助文件。下面给出了其使用实例。

CCD光电在线测径仪数据处理软件系统中两个关键问题的解决

3.2、利用数据库保存测量数据的实现

假设我们将测最数据存放在CheckData[ ]数组中,下面将介绍如何将该数组存放到数据库文件RollHis.mdb中。首先,用Access打开数据库,将存放CheckData数组的字段所对应的数据类型设置为OLE对象。然后,在VC++环境下,在纪录集类中引入一个变量m_ Data与该字段相对应,这个过程可以通过Class Wizard来实现,将该变量的数据类型设置为ClongBinary类型。当成功打开记录集对象后就可以实现对测量数据的保存。程序代码如下:

CCD光电在线测径仪数据处理软件系统中两个关键问题的解决
CCD光电在线测径仪数据处理软件系统中两个关键问题的解决对于从数据库读取的过程与之类似。

4、结束语

串口通信和大量测量数据的存放是编写数据处理系统的关 键问题,这两个问题的解决关系到整个软件的编写质量及软件运行的可靠性和稳定性。对于串口通信编程采用多线程编程具有通用性,但有些主程序运算最不大,采用单线程技术还是比较方便的。Visual C++中的ODBC类库可以帮助程序员完成绝大多数的数据库操作。利用ODBC技术使得程序员从具体的DBMS中解脱出来,从而可以减少软件开发的工作量,缩短开发周期,并提高效率和软件的可靠性。限于篇幅,本文只给出部分关键代码。

整个软件已经在Windows 2000环境下编译通过,并且运行稳定、良好。

参考文献:

[1] 李现勇,串口通倍技术与工程实践[M],此京:人民邮电出版社, 2002.7。

[2] David J. Kruglinsk 等,Visual C++6.0技术内幕(第五版)[M],北京:希望电子出版社,2000.2。

[3] John Carter,数据库设计与编程实例详解[M],北京:电子工业山版社,2001.2。

[4] 樊重理等,“CCD器件在非接触式测径仪中的应用[J]”,《现代科学仪器》,1994:42~44。

[5] 张文阁等,“CCD线材直径自动监测系统[J]”,《检测技术学报》,1998:47~48。

本文引用 第22卷第4期 计算机应用与软件 Vol.22,No.4

保定市蓝鹏测控科技有限公司编写

推荐阅读