工控网首页
>

应用设计

>

Widows平台实时测控系统数据采集的实现

Widows平台实时测控系统数据采集的实现

2006/7/19 9:08:00
[摘 要] 介绍了利用HY-6220计数器板产生定时中断,利用该中断在实时测控系统中进行数据采集的方法,并且给出了虚拟设备驱动程序(VxD)的实现代码。 在当今的工业控制中数据采集是一个很重要的任务,数据采集的准不准,快不快,直接影响到测控系统的控制品质,而决定数据采集准确性的一个很重要的因素是测控系统的定时中断的精确性,以及测控系统软件对该定时中断的响应速度。本文介绍如何利用HY-6220板上的计数器实现高精度的定时中断,并通过接管IRQ5来实现高精度的定时方法。 1 HY-6220板简介 HY-6220板是一个带光隔离的多功能定时/计数、I/O板(ISA),板上有3片8253,1片8255,1片8259,通过软件设定8253定时方式为方式2或方式3,当定时到达时,由该计数器产生中断申请信号,再由板上的8259的中断管理器将该中断申请信号经由ISA总线传至工业控制计算机的中断控制器,申请中断。该定时中断的精度较高,可以满足一般工业控制的实时测控的实时性要求。该板向计算机系统申请中断号为IRQ2-IRQ7,可以通过跳线选择,笔者选择了IRQ5。 2 Windows环境下实时数据采集 由于Windows操作系统是抢先多任务的操作系统,只有位于Ring0层(核心层)的任务优先级最高,而一般的应用软件的任务都位于Ring3层(应用层),在该层的任务很有可能被阻塞,这对于数据采集这种关键性任务是不能容忍的,故我们将编写接管IRQ5的虚拟设备驱动程序(VxD),在Vxd的中断服务中进行关键数据的采集工作。 开发虚拟设备驱动程序(VxD)的方法,主要有DDK(De-vice Developer Kit)、VtoolsD、WinDriver等方法,笔者使用大家都较熟悉的VtoolsD,由VtoolsD编写的接管IRQ5的VxD, 程序的主要部分如下: #include #include #define DEVICE_CLASS HY6220Device #define HY6220_DevicelD UNDEFINED_DEVICE_ID #define HY6220_lnit_Order UNDEFINED_INIT_ORDER #define HY6220_Major 1 #define HY6220_Minor 0 #define MY_IRQ 5 #defineW32IF_PASS_EVENT CTL_CODE(FILE_DEVICE_UN-KNOWN,1,METHOD_NEITHER,FILE_ANY_ACCESS) Class MyHWlnt:public VHardwarelnt { public: MyHwlnt():VHardwarelnt(MY_IRQ,0,0,0){} Virtual VOID OnHardwareInt(VMHANDLE); }; class HY6220Device:public VDevice { public: virtual BOOL OnSysDynamicDevicelnit(); virtual BOOL OnSysDynamicDeviceExit(); virtual DWORD OnW32DeviceloControl (PlOCTLPARAMSpDIOCParams); virus VOID VOID V86_API_Entry (VMHANOLE hVM,CLIENT_STRUCT*pRegs); MyHwInt*pMylRQ; }; Class HY6220VM:public VVirtualMachine { publi c: HY6220VM(VMHANDLE hVM); }; class HY6220Thread:public VThread { public: HY6220Thread(THREADHANDLE hThread); }; #define DEVICE_MAIN #include"HY6220.h" Declare_Virtual_Device(HY6220) #define WM_USER_POSTVXD OX1000 #undef DEVICE_MAIN DWORD *PostMsghWnd; HANDLE hWnd; HY6220VM::HY6220VM(VMHANDLE hVM) : VVirtualMachine(hVM) {} HY6220Thread::HY6220Thread (THREADHANDLE hThread) VThread(hThread){} BOOL HY6220Device::OnSysDynamicDevicelnit() { pMyIRQ=new MyHwlnt(); *pVala=0; lnit_Adapt(); //初始化HY-6220板 if(pMyIRQ&&pMyIRQ->hook()) { pMyIRQ->physicaIUnmask();return TRUE; } else return FALSE; } BOOL HY6220Device::OnSysDynamicDeviceExit() { delete pMyIRQ; return TRUE; } DWORD HY6220Device::OnW32DevicelOControl(PlOCTLPARAMS pDIOCParams) { int i; int j; int ib=0; static int temset[4] swith(pDIOCParams->dioc_lOCtlCode) { case DIOC_OPEN:hWnd=0; retern 0; case W32IF_PASS_EVENT: postMsghWnd=(DWORD*)pDIOC_ params->dioc_InBuf; hWnd=(HANDLE)*PostMsghWnd; return 0; default: return-1; } return 0; } VOID HY6220Device::V86_API_Entry (VMHANDLE hVM, CUENT_STRUCT*pRegs) { ///////////////////中 断 函 数 中 的 数 据 采 集/////////////////// void MyHwInt::OnHardwarelnt(VMHANOLE hVM) { static int channal; { ……… } //用M/T法采转速 ///////////////////////////////////// for(Channa=0;Channal<32;Channal++) //32路A/ D采样 AD(channal); {……… } //通过_outp,_inp实现DI/DO Test_Control(); //数字PID运算并输出 //////////////////结 束 中 断//////////////// sendPhysicaIEOI(); _outp(base6220十5,0); _outp(base6220十1,Ox20); _outp(Ox20,Ox20); } Void lnit_Adapt() { lnit_HY6220(); lnitTimer_HY6220(base6220,-1,2,2);//将Hy-6220板上的时钟 2分频为1M . . lnitTimer_HY6220(base6220,3,3,10000); //将计数器3初始化为方式3并赋初值10000,即1M/10000=lOms一中断 . . . } 在应用层的应用程序应调用CreatFile()函数动态加载VxD。 该程序的主要部分如下: void CTestctrView::InstallVxd() { HANDLE hWnd=m_hWnd; PVOID,In[1]; DWORD Ret[2]; DWORD nCnt; CString err; const PCHAR VxDName="\\\\.\\aud.vxd"; unsigned char tt; hDevice =CreateFile (VxDName,0,0,0,CREATE_NEW,FILE_FLAG_DELETE_ON_CLOSE,0); if(hDevice==INVALID_HANDLE_VALUE) { err.Format("Error:%081x",GetLastError()); MessageBox(err); exit(1); } else Vxdlnstalled=1; IN[0]=hWnd; if(Vxdlnstalled) { if (!DeviceloControl(hDevice,W32IF_PASS_EVENT,In,sizeof(PVOID),(LPVOID)Ret,sizeof(Ret),&nCnt,NULL)) { err.Format("Error Deviceio:%081x",GetLastError()); MessageBox(err); CloseHandle(hDevice); exit(1); } } } 在应用层可用通讯的方法与Ring0层的VxD进行通讯,既用DeviceloControl()函数,将VxD定时中断服务中采集的数据 传至Ring3层应用层软件以供显示,计算及控制用。 3 结束语 本文结合笔者在开发基于工业控制计算机的发动机数控试验台测控系统,就上述技术作了实例分析,其开发的数控试验台已投人生产,系统运行可靠,获得了满意的效果。
投诉建议

提交

查看更多评论
其他资讯

查看更多

智光节能内蒙古阿拉善左旗瀛海建材余热发电机组首次启动成功

智光电气台州电厂给水泵系统节能改造项目成功投运

智光节能荣登2014年度全国节能服务公司百强榜第五位

索引程序编程凸轮表

奥越信300系列PLC手册