浅谈激励式仿真机实时数据OPC异步通讯的研究(2)

来源:南粤论文中心 作者:王秀霞1 李帅华1 彭 发表于:2010-01-18 09:56  点击:
【关健词】激励式仿真机;OPC;组件对象模型;异步通信;内存映射文件
图2 可连接对象基本结构 (浅谈激励式仿真机实时数据OPC异步通讯的研究) 最后,具体实现异步读取数据时,DCS服务器主动和仿真机模型通信。此时,服务器提供出接口(Outgoing Interface),这些出接口是由仿真机模型
图2  可连接对象基本结构


 

    (浅谈激励式仿真机实时数据OPC异步通讯的研究)最后,具体实现异步读取数据时,DCS服务器主动和仿真机模型通信。此时,服务器提供出接口(Outgoing Interface),这些出接口是由仿真机模型实现,并将接口指针告诉DCS服务器对象,然后服务器对象就利用此接口指针与仿真机模型进行通信。而仿真机模型侧则通过接收器sink(其接收器应该至少实现 IUnknown 和 IOPCDataCallBack 接口)来实现这些接口的对象。这样对仿真机模型侧来说,可以通过常规方式调用服务器的接口,也可以通过接收器接受DCS服务器发送的通知或事件,对DCS服务器来说,它的入接口和出接口分别承担了这两个通信过程,这样就实现了C/S的双向通信。异步通信的实现由定义接口开始,主要代码如下:
    IConnectionPointerContainer* pCPC;
    IOPCAsyncIO2* pASIO2;
    IOPCDataCallBack* pDCB;
    IConnectionPoint* pCP;
    Punk->QueryInterface(IID_IConnection, PointContainer, &pCPC);
    PCPC->FindConnectionPoint(IID_IOPC, DataCallBack, &pCP);
    通过查询,如果支持接收器对象,则在DCS服务器与仿真机模型之间建立连接,并返回连接点对象生成的唯一标志此连接的32位整数m_dwcookie:
    pCP->Advise(&pDCB,&m_dwcookie);
    设置刷新速率IOPCGroupStateMgt* pGSP;
    PGRP->SetState(&RequestedRate,&Rate, &Active, 0, 0,0,0);
    异步读数据, 传递事务ID给OnReadComplete函数。    
    pASIO2->Read(1000,&m_phserver, m_dwtranscationID, &m_pdwcancelID, &hr);
    异步写数据,传递事务ID给OnWriteComplete函数。
pASIO2->Write(1000, &m_phserver, &m_pitemvalues,m_dwtransactionID, m_pdwcancelID, &hr);
    在仿真机模型侧调用异步读写操作或者组对象项成员的数据发生变化时,组对象对仿真机模型侧发出如下事件OnDataChange函数,只需在该函数中添加一些读写共享内存的语句。
    STDMETHODIMP OnDataChange(DWORD dwTransid,OPCHANDLE hGroup, HRESULT hrMasterquality, HRESULT hrMastererror, DWORD dwCount, OPCHANDLE __RPC_FAR *phClientItems, VARIANT __RPC_FAR *pvValues, WORD __RPC_FAR *pwQualities, FILETIME __RPC_FAR *pftTimeStamps, HRESULT __RPC_FAR *pErrors);
    dwTransid:由仿真机模型侧发送的事务标识符。
    dwCount:要读取的数据或品质发生变化的Item数目。
    phClientItems:OPC ITEM的客户句柄数组。
    pvValues:返回的数值数组。
    pwQualities:返回的质量戳数组。
    pftTimeStamps:返回的时间戳数组。
    当仿真机模型侧需要取消与DCS服务器的连接时,调用带有同样连接标识的Unadvise来取消连接。并且删除Item,释放异步接口,释放Item管理接口,删除Group对象,释放OPC服务器,关闭COM库等,以释放占有资源。异步通信结构如图3所示。


 

 
图3  OPC异步通信结构示意图


 

3.2    内存映射文件实现(浅谈激励式仿真机实时数据OPC异步通讯的研究)

    由于实时仿真数据库被多个进程共享,必然涉及到仿真机支撑系统与OPC客户端程序之间的实时数据通信。解决的有效方法就是利用内存映射文件方式创建一个足够大的共享内存空间,由于32位Windows操作系统具有多达2GB的用户可用的线性内存空间,可以处理上百万的变量,这样完全满足火电厂全激励式仿真系统支撑平台的要求,通过编制一系列的接口函数对建立的共享内存中的数据进行操作。
    此外,由于该共享内存中的数据可为多个进程共享,因此各个接口函数都提供了同步机制,使用互斥量的同步对象CMutex实现。这些接口函数都封装在动态链接库中,通过这些接口函数,既能实现多个进程间数据的共享,又保证了实时的响应要求。实现关键代码如下:(责任编辑:南粤论文中心)转贴于南粤论文中心: http://www.nylw.net(南粤论文中心__代写代发论文_毕业论文带写_广州职称论文代发_广州论文网)
顶一下
(0)
0%
踩一下
(0)
0%
  • 上一篇:没有了
  • 下一篇:银行内审档案查看子系统设计


  • 版权声明:因本文均来自于网络,如果有版权方面侵犯,请及时联系本站删除.