【VB开源代码栏目提醒】:以下是网学会员为您推荐的VB开源代码-用Delphi实现A_D转换的方法 - 技术总结,希望本篇文章对您学习有所帮助。
用Delphi实现A/D转换的方法赵 敏 崔 海 王敬东 李明齐南京航空航天大学测试工程系 南京210016摘要 Delphi是一种优秀的面向对象的编程工具但Delphi不能直接实现诸如硬件中断等底层操作硬件中断可采用VxD技术。
采用VxD编程是在WIN95下实现实时数据采集的关键技术。
本文提出了用Delphi结合DLL和VxD技术通过中断实现A/D转换的
方案文中阐述了VxD和DLL的设计过程Delphi和DLL的连接方法。
为了保证数据采集的高速有效文章介绍了一种双缓冲模块交替工作的程序。
利用这种方法可以提高数据采集的精度和速度满足实时性的要求。
关键词:虚拟设备驱动中断动态链接库实时性中图分类号:TP391.7TP217.1HighSpeedA/DConversionwithDelphiZhaoMing CuiHai WangJingdong LiMingqiDepartmentofMeasurementTestingEngineeringNanjingUniversityofAeronauticsAstronautics Nanjing210016Abstract Delphiisanexcellentprogramtoolsthatsupportsobject-orientedde-sign.Butitcannotoperateinlowlayersuchashardinterrupt.HardinterruptcanberealizedbyVxDtechnologywhichisakeymethodtorealizerealtimedatasam-pleinWindows95.AnewmethoduseDLLandVxDbyDelphitosampledatawithhardinterruptisdescribedinthispaper.ThedesigntechniqueandthelinkmethodofVxDandDLLarepresented.ForhighspeedA/DconversionwithDelphiadoubleexchangebuffersisdesignedtostoresampledata.ItcanimprovethespeedofA/DconversioninWindows95andmakesystemworksinrealtime.Key
words:virtualdevicedriverinterruptiondynamiclinklibraryreal-time 收稿日期:1999-11-05修改稿收到日期:2000-04-14 自从面向对象编程思想出现以后人们的编程思维模式得到了根本的改变。
为了提高应用程序的统一性、一致性和编程效率程序员应尽量避免重复性的工作因此
VB、VC等可视化应用程序开发工具应运而生。
Inprise公司原Borland公司开发的Delphi也是其中的佼佼者。
Delphi的基础语言是ObjectPascal由于Ob-jectPascal是一种强类型语言与其他语言相比它提供了一种快速的编译器它的优化编译模式对
代码质量有很大提高所以它一直受到Windows软件开发人员的青睐。
Delphi
常用来开发纯
软件应用系统因为Delphi本身并不具备对硬件地址进行操作的函数不过可以通过嵌入汇编语言的方式直接访问硬件设备。
在工控领域实时数据采集是一个重要的环节如何提高数据采集的速度是工控人员最关心的
问题本文将介绍在Win95/9832位操作系统第15卷第4期2000年12月数据采集与处理JournalofDataAcquisitionProcessingVol.15No.4Dec.2000下通过中断在
Delphi下实现高速A/D转换的方法。
1 A/D转换中断的实现方法实现高速数据采集的最佳方式是采用中断。
虽然Delphi本身并不具备对硬件地址进行操作的函数不能对硬件设备进行诸如中断之类的直接控制但Delphi支持DLL技术它可以通过调用其他语言编写的DLL来扩充自身功能进行硬件I/O地址的控制。
不过DLL处于Windows操作系统的ring3层应用层而中断的处理属于系统的底层操作必须深入到Windows操作系统的最底层即ring0层。
在ring0层编写的对硬件操作等方面的程序称为VxDVirtualDeviceDriver虚拟设备驱动程序。
Windows下中断信号的处理必须采用VxD来实现。
用Delphi编写或直接调用VxD比较困难为此本文采用了如下的方法:先用由C语言编写的DLL调用VxD再用Delphi调用DLL从而实现了中断方式的数据采集。
1.1 硬件中断VxDVxD是虚拟设备驱动程序当多个程序使用特定的硬件设备时Windows可以为每个程序虚拟一个设备。
虚拟设备通过VxD实现对硬件的控制。
VxD以DLL形式链入Windows的核心层ring0实际上VxD就是运行在处理器ring0上的DLL。
由于VxD运行在最高优先级上所以它可以完成各种任务然而VxD非常难写并且不像常规的ring3中的DLL那样容易调用。
VxD的编写一般可用以下几种方法:直接用Intel汇编语言编写这种方法比较复杂要求对汇编语言非常熟悉使用专门的VxD开发工具如美国VieroSoftware公司推出的VToolsDforWin95开发工具包、Microsoft公司的MSDDKDeviceDe-riverKit、KRFTech公司的WinDriver等。
这其中VtoolsD开发工具包提供了对VxD编程的全线C类库支持可以方便地进行VxD的编程。
故本文采用了VToolsD进行中断VxD编程。
VxD程序模块的基本组成如下:1VxD初始化2中断响应及处理3VxD与应用程序之间的通讯4卸载VxD。
为了能进行高速数据采集本文使用VToolsD对A/D卡编写了VxD程序利用A/D卡上产生的中断信号通过VxD对采集到的数据进行处理并将VxD的数据实时传送给应用程序。
在用VxD对硬中断处理时一般可
设计成一次采集一串数据每次中断取得A/D转换的数据并作必要的处理后立即退出中断服务程序。
为了既能高速采集数据同时又可以对数据进行处理可在VxD中断处理程序中开辟两个数据缓冲区用于暂存A/D转换的数据。
当中断信号到达时程序从A/D板上读一个数据放入缓冲区缓冲区填满后数据移入公共缓冲区同时设置缓冲区满的标志。
为了避免函数重入造成系统崩溃在中断处理程序中去掉一切与系统调用有关的部分这样中断处理
程序的工作就是读数据将数据送入一个缓冲区设置数据满采集标志等。
其流程如图1。
图1 VxD硬件A/D中断流程根据以上要求在用VToolsD编VxD程序时在VxD的控制消息栏Windows95ControlMes-sage下选择了如下几个消息:SYS-DYNAMIC-DEVICE-INITVxD初始化SYS-DYNAMIC-DEVICE-EXIT卸载VxDW32-DEVICEIOCONTROL中断响应及处理等。
控制消息选定了以后就可以用VToolsD输出VxD的相应类成员函数:OnSysDynamicDeviceInitOnSysDynamicDeviceExitOnW32DeviceIoControl521第4期赵 敏等:用Delphi实现A/D转换的方法另外增加一个实现硬件的中断类函数:onVHard-wareInt等。
OnSysDynamicDeviceInit函数实现对中断的初始化操作、设置中断号等操作。
OnW32DeviceIoControl函数得到从ring3应用层传来的参数并将VxD的返回数据地址传回ring3应用层。
A/D转换器的中断响应、数据读取、启动A/D等操作主要放在类成员函数onVHardwareInt中实现。
源程序
代码写好后就可以用VC或BC进行编译。
得到的VxD程序应复制到Windows9X的
系统System目录下。
1.2 DLL与VxD的接口DLL是另一种形式的可执行文件在直接调用WindowsAPI函数时其实就是在访问DLL。
使用DLL有以下一些优点:不同的应用程序使用相同的DLL只要将DLL在内存装载一次这样节省系统内存可以提供新的DLL来代替老版本的DLL如果DLL子例程有相同的参数可以用新的DLL运行程序而不需重新编译适用于复杂的应用程序DLL独立于编程语言而存在。
为了对VxD中采集到的数据进行处理采用VC编写了调用VxD的DLL接口函数。
DLL中定义的函数如下:1初始化函数extern“C”-declspecdllexportintAD-InitintBaseAddrintad-ch-nointcountintfarad-buffer……通过对AD-Init的调用实现对VxD的初始化设置A/D卡的地址数据采集的通道号数据采集的点数数据存放的缓冲区等初始化程序中比较重要的函数是CreateFile和DeviceIoControl等。
其中设备输入输出控制DeviceIoControlAPI来支持对ring3至ring0的调用其定义如下:BOOLDeviceIoControlHandlehDeviceDWorddwIoControlCodeLPVoidlpvInBufferDWordcbInBufferLPVoidlpvOutBufferDWordcbOutBufferLPDWordlpcbBytesReturnedLPOverlappedlpOverlapped其中:hDevice为用CreateFileAPI函数打开VxD设备句柄dwIoControlCod为ring3程序向VxD传递的命令码lpvInBuffer为ring3程序向VxD传递的数据缓冲地址cbInBuffer为ring3程序向VxD传递的数据缓冲字节数lpvOutBuffer为VxD的返回数据所存放的缓冲地址cbOutBuffer为VxD的返回数据所存放的缓冲字节数lpcb-BytesReturned为VxD的返回数据实际字节数lpOverlapped为一个Overlapped的结构地址常设为NULL。
当使用DeviceIoControl调用VxD时首先用调用CreateFileAPI打开VxD其定义如下:HANDLECreateFileLPctstrlprsNameDWordfdwAccessDWordfdwShareModeLPSe-curity-AttributeslpsaDWordfdwCreateDWordfdwAttrsAndFlagsHandlehTemplateFile其中:lprsName为想打开的文件名fdwAccess为访问文件的方式fdwShareMode为文件的共享权限lpsa为文件打开的安全级别fdwCreate为用于仔细调节CreateFile的行为fdwAttrsAndFlags为文件的属性和标志信息hTemplateFile为为待打开文件指定一个临时文件句柄常置为0。
在VxD中利用消息处理函数on-Win32DeviceIOControl响应应用程序的Devi-ceIOControl调用。
初始化成功后DLL就可以方便的与VxD进行通讯和数据交换。
2启动A/D转换并设定通道号函数extern“C”-declspecdllexportvoidAD-Startintad-ch-no3A/D状态检测及数据读入函数extern“C”-declspecdllexportBOOLAD-State用来检测A/D转换是否结束缓冲区满标志被设置是否被设置。
在缓冲区满标志被设置后将A/D转换的结果读出并将缓冲区满标志复位4结束A/D转换并退出VxD函数extern“C”-declspecdllexportvoidAD-END1.3 Delphi对DLL的调用Delphi调用C编写的DLL时首先要提供相应的函数定义。
对于一般的DLL可以执行Windows95安装的文件查看器如QuickView来查看DLL可以使用的一些低级技术信息。
在ExportTable部分可以看到DLL的可用函数
列表。
对于自编的522数据采集与处理第15卷DLL则可以直接从源程序查看函数定义。
然后在Delphi程序中进行DLL函数调用的声明如下例所示:Delphi中的函数声明functionADConvertAddrNodount:IntegerP:Pointer:Integercdeclexternalexdll01.dllnameAD-StartfunctionAD-State:Booleancdeclexternalexdll01.dll为了在VxD将A/D转换的一串数据采集完成时能将它们及时的取出进行处理可采用线程来实现。
Delphi中封装了TThread类用TThread可以很方便的设计多线程控制程序。
以A/D转换为例可定义一个TADCThread线程当系统启动VxD进行A/D转换时同时启动该线程它的作用是用AD-State函数及时用检查A/D转换缓冲区数据是否满一旦数据缓冲区数据满则将其读出并进行处理procedureTADCThread.Executebegin ifAD-Statethenbegin //将数据读出 //对数据进行必要的处理 endend一旦数据采集的工作结束可调用AD-END函数结束VxD的
工作同时结束TADCThread线程的工作。
通过以上的方法就可以实现用Delphi在Win-dows环境下进行中断方式的数据采集并可对采集到的数据进行及时的处理。
2 实际应用采用本文所介绍的方法作者进行了数据采集的试验某型A/D数据采集卡的数据通过率为20K卡上无缓冲区。
用作者编写的程序在PII266的
计算机和Windows98操作系统中采样速率达到了16K。
另一种A/D数据采集卡的数据通过率为60K卡上带有FIFO缓冲区采用定时工作方式采样速率可以达到近60K。
作者还用此方法对工作在Windows98操作系统下的全自动汽车检测线的数据采集方式进行了改造该系统采用了多任务的实时测控方式以实现对多个工位同时进行控制和数据采集。
原来系统中数据采集采用的是在线程中的
查询方式速度不够快定时也不方便。
例如对制动力的数据采集尽管静态标定时测试数据能达到精度要求但当刹车较急时采集到的制动力数据比实际值要有5以上的误差所得到的制动过程曲线也不够精确不能满足测量精度和实时性的要求。
采用中断的方式后在不影响其他工位操作的情况下将数据采集的速度提高到10K左右采样的速度和测量精度均达到了检测线的标准并通过了验收说明这种方法完全可以满足实时的数据采集和处理的要求。
参考文献1 TothV.Windows98/NT编程大全.李昭智等译.北京.电子工业出版社1996.1111152 杨 强李堂秋.Win9x虚拟设备驱动程序编程指南.北京.清华大学出版社1999.23303 CantuM.Delphi3从入门到精通.王 辉等译.北京.电子工业出版社1998.6376474 姚志峰等.基于Windows95的高速数据采集.测控技术19994:1012第一作者简介 赵 敏 男副教授1959年7月生。
发表过“传感器实时自校准/自补偿技术的研究”《数据采集与处理》1999年第1期等
论文。
523第4期赵 敏等:用Delphi实现A/D转换的方法