《COM组件技术在现场总线控制系统组态软件中的应用.docx》由会员分享,可在线阅读,更多相关《COM组件技术在现场总线控制系统组态软件中的应用.docx(12页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、COM组件技术在现场总线控制系统组态软件中的应用COMComponentObjectModel组件技术是构造二进制兼容软件的标准,通过它可以建立可以互相传输数据的组件,其效劳器-客户机构造非常合适工控软件应用程序的开发。由于工控软件不仅包括PC机上的HMI人-机界面程序,还包括与各种基于ISA或者PCI总线的数据收集卡进展数据交换的程序,这局部程序对开人员的硬件程度要求较高,而且开发难度较大,与HMI程序是互相独立的,所以可以把工控软件分成两局部,即把HMI程序作为客户机端程序,把与硬件进展数据交换的程序作为效劳器端程序。基于这种思想,本文将效劳器-客户机构造应用到现场总线控制系统的组态软件中
2、,着重介绍客户机和效劳器的功能及实现。首先介绍现场总线控制系统的组成。1系统组成现场总线控制系统主要由PC机、ISA或者PCI总线智能适配器、智能测控模块、组态软件、HMI软件、COM效劳器、用户软件等构成。现场总线系统中所有信息的传递都是双向的,COM效劳器介于智能适配器和上位机软件之间,负责完成数据的传输。上位机软件相当于客户机端应用软件,它使用COM效劳器提供的接口来操纵适配器,对适配器进展初始化及向特定单元写入和读出数据。由于在Windows保护形式下不能直接访问存储器,所以需要编写VxD驱动程序,将物理地址转换成线性地址,然后COM就可以象使用DLL一样调用VxD的函数,完成对ISA
3、或者PCI总线智能适配器的操纵。从测控模块到上位机软件自下而下的数据传输完成了用户对测控模块的监测;而上层软件通过COM将数据送往适配器,再由适配器送往测控模块,实现了用户对测控模块工作参数的设置及工作状态的治理。图1给出了系统软件构造框图。2组态软件的功能现场总线控制系统组态软件是一套基于Windows98和Windows2000平台或者更高版本、用于快速构造和生成上位机监控系统的组成软件,它提供了从数据收集到数据处理、远程控制、报警处理、报表输出等实际工程问题的完好解决方案。它使用COM效劳器提供的接口与适配器进展数据交换,是COM客户机端的程序。3COM组件技术组件是完成一定功能的软件块
4、,可以被其它程序使用,而且轻易交换。为了使每个人编写的组件具有可移植性,必须建立一个标准,保证其兼容性和可互换性。COM正是这样一种标准,遵循COM规那么就可以建立可以互相交换数据的组件。在现场总线控制系统中,COM组件效劳器负责组态软件等上位机软件与智能适配器之间的数据传输,由于适配器通过CAN现场总线与测控模块连接,所以对适配器的操纵就是对模块的监测与控制。COM效劳器提供的接口中有适配器初始化、模块检查、向模块发送数据及读取模块数据等函数。下面着重介绍数据发送接收形式及怎样编写这4个有代表性的函数。3.1适配器初始化函数只有适配器初始化成功后,才能进展其它操纵。由于在Windows保护形
5、式下不能直接访问适配器,COM程序需要调用VxD程序将存储对应的物理地址转换成线性地址指针lpBaseAddress,这样对适配器的操纵就转换成对以该指针为首地址的数组的操纵。向这个数组的0x3F0、0x3F1和0x3F8单元分别写入上闰机节点号和适配器与模块间的通讯波特率和适配器程序规定的命令字0xC6表示适配器初始化,等待几十ms后,假如适配器接收到上面的数据并做出适当的反响,它会将0x3F8单元清零,这就表示初始化适配器成功;假如该单元不为零,那么初始化失败。3.2数据传输格式适配器初始化成功后,就可以同它交换数据了。下而简单讲明一下发送数据和接收数据的格式。适配器初始化得到的线性地址指
6、针lpBaseAddress的15单元分别存放上位机节点号、模块节点号、保存字、发送或者接收字节长度及模块操纵的命令字。lpBaseAddress6lpBaseAddress256存放所要发送的数据;从lpBaseAddress0x106单元开场存放接收到的数据,lpBaseAddress0x3F8存放操纵适配器的命令字,适配器根据这个单元内容进展处理,假如是0xC6,那么初始化适配器和模块上的CAN控制器;假如是0xC7,那么将数组里的数送给模块上的E2PROM,模块收到数据后根据lpBaseAddress5的命令字进展相应处理;假如是0xB0,那么按照接收到的数据配置模块工作状态;假如是0
7、xA5,那么将此时的测量值送到适配器上,由COM程序读出。3.3模块检查函数适配器初始化成功后,还要检查适配器与下面的测控模块是否连接好,或是否存在组态软件要组态的模块,也就是要进展模块检查操纵。模块检查的命令字是0xAD,向数组的15单元分别写入上位机节点号、模块节点号、保存字、发送数据长度和模块检查命令字0xAD,向0x3F8单元写入0xC7表示向适配器写入数据,等待几十ms后,假如0x3F8单元清零而且0x100单元被置为0xAA,表示该模块存在而且可以通讯;否那么,说明该模块不存在或硬件上有问题。3.4写适配器数据函数在确定了网络中存在哪些可通讯的模块之后,就可以向它们发送数据并进展配
8、置。为了实现向适配器发送数据,总共编写了4个函数、SendDatainBYTESendBuf256、SendFinishinBOOLbFinish、FinishQueryoutBOOLbFinish和ReceiveResultoutBOOLbSendFinish。SendData负责把一个模块所需要发送的数据以数组的形式放到效劳器的一个二维数组Room64256里,每个模块的数据作为一行。由于向适配器发送数据后,要等待一段时间判定模块是否接收获功,所以SendFinish中开启辅助线程来发送数据并等待结果,这相可不占用COM主程序的时间,使客户调用接口函数后能立即返回,执行其它操纵。Finis
9、hQuery查询数据发送是否完毕。ReceiveResult弹出一个非形式对话框,显示哪些模块接收到数据,哪些没有。3.5读适配器数据函数除了向适配器发送数据,还可以从适配器上读取模块传上来的数据。读取数据的命令字是0xA5。实现该任务的函数是GetPVinBYTEbDesNode,outfloatvalue8,第一个参数是模块节点号,第二个参数是返回的测量值数组。这里,COM是用ATL编写的本地效劳器,COM对象的线程是套间线程。接口定义了6个函数,COM程序流程图如图2所示。COM对象接口的函数声明和适配器初始化的程序如下:COM接口定义:interfaceINCardWork:IDisp
10、atchid1,helpstring适配器初始化函数,返回值为是否成功HRESULTNcardInitinBYTEbSrcNode,inBYTEbIntrAdd,inBYTEbRate,inlongbSegmantAdd,outBOOLflag;id2,helpstring将客户端传送的数组赋值给RoomHRESULTSendDatainBYTESendBuf256;id3,helpstring启动多线程HRESULTSendFinishinBOOLbFinish;id4,helpstring此函数返回值表示数据是否已向下位机发送完毕,同时可显示哪些模块未被配置,通常在此函数前先用Finish
11、QueryoutBOOLbFinish查询发送是否完毕HRESULTReceiveResultoutBOOLbSendFinish;id5,helpstring此函数返回值表示数据是否已向下位机发送完毕,“真表示发送完毕HRESULTFinishQueryoutBOOLbFinish;id6,helpstring网络检查,用来在发送数据前检测是否有该节点存在HRESULTNetCheckinBYTEsour,inBYTEdes,inBYTEtype,outBOOLflag;id7,helpstring读取模块的测量值HRESULTGetPVivBYTEbDesNode,outfloatvalu
12、e256;适配器初始化函数:#include#includewinioctl.h/包含其它头文件STDMETHODIMPCNCardWork:NcardInitBYTEbSrcNode,BYTEbIntrAdd,BYTEbRate,longbSegmentAdd,BOOLflagNcardCtrlcardctrl;/NcardCtrl类的函数调用VxD函数exbSrcNode=bSrcNode;/给上位机节点赋值exbRate=bRate;/下位机与适配器的通讯波特率BOOLtransfersign;/初始化是否成功标志DWORDdwSegmentaddress=bSegmentAdd;/适配
13、器段地址HANDLEhDevice=NULL;/指向线性指针对句柄LpBaseAddress=PBYTEcardctrl.MapLinearAddressdwSegmentaddress,0x400,hDevice;/调用VxD函数,获得指向ISA总线物理地址的线性地址指针cardctrl,UnMapLinearAddresslpBaseAddress,hDevice;/关闭VxD/调用适配器初始化函数_outp0x310,0x01;/翻开邮箱锁lpBaseAddress0x3F0=bSrcNodeNumber;/上位机节点号lpBaseAddress0x3F1=bRate;/波特率lpBas
14、eAddress0x3F8=0xC6;/适配器初始化命令字DrvDelay20,false;/延时20ms/初始化后其它操纵_outp0x310,00;/关闭邮箱锁returnS_OK;4虚拟设备驱动程序VxD是虚拟设备驱动程序VirtualDeviceDriver的缩写,中间的x表示某一设备。它可以无限制地访问所有硬件设备、自由地检测操纵系统的数据构造如描绘符和页表和访问任何内存位置。本文中,VxD将ISA总线对应的物理地址转换成段线性地址,供给用程序使用。VxD的开发工具是VtoolsD,转换时用的函数为MapPhysToLinear。以下是局部程序代码:/定义构造体typedefstru
15、ct_MapDevRequestPVOIDmdr_PhysicalAddress;DWORDmdr_SizeInBytes;PVOIDmdr_LinearAddress;WORDmdr_Status;MAPDEVREQUEST,PMAPDEVREQUEST;#include/包含其它头文件PARAMSpDIOCParamsPMAPDEVREQUESTpRea;/自己定义的构造体switchpDIOCParams-dioc_IOCtlCodecaseDIOC_OPEN:caseDIOC_CLOSEHANDLE:break;caseMDR_SERVICE_MAP:pReq=PMAPDEVREQUE
16、STpDIOCParams-dioc_InBuf;pReq-mdr_LinearAddress=MapPhysToLinearpReq-mdr_PhysicalAddress,pReq-mdr_SizeInBytes,0;ifpReq-mdr_LinearAddress=NULLpReq-mdr_Status=MDR_STATUS_ERROR;pReq-mdr_Status=MDR_STATUS_SUCCESS;break;caseMDR_SERVICE_UNMAP:break;default:returnERROR_INVALID_FUNCTION;returnDEVIOCTL_NOERROR;在现场总线控制系统中使用COM组件技术,不仅可以使数据传输局部的功能独立于客户端程序,减小开发难度,而且使其可以被任何支持二进制代码的程序如Excel电子表格等直接调用。当系统中采用效劳器和客户端方式时,代码更加易于维护。即使要晋级效劳器端程序,只要接口不变,其客户端程序也完全不需要修改,大量后续工作被减轻。象效劳器端一样,客店端也只需关心效劳器的接口,而不必考虑其怎样实现数据交换。也就是讲,COM效劳器或者客户机中的一端功能发生改变,只要其接口保持不变,另一端不需修改就可以工作。本文所介绍的技术已在成功油田某注水站等实际工程工程中得到成功的应用。0