开发OPC客户程序必读!!!!!!!!! Step.1 如果程序要调用COM 库的某一个函数必须先登录COM 函数CoInitialize()可 以完成此功能从函数CoGetMalloc()可以得到一个指向COM 内存管理接口的指 针 HRESULT rl; rl=CoInitialize(NULL); rl=CoGetMalloc(MEMCTX_TASK,&g_pIMalloc); Step.2 每个COM 服务器有一个ProgID 通过它可以得到一个全球唯一的CLSID 用 CLSIDFromProgID()函数可以实现这个变换ProgID 用变量szName 进行参数传 递在示例程序中它的值是L”OPC.SimaticNET” m_Popc rl=CLSIDFromProgID(szName,&clsid); Step.3 CoCreateInstance()函数创建一个类实例其CLSID 值设定如下: r2=CocreateInstance(clsid,NULL,CLSCTX_LOCAL_SERVER,IID_IUnkown, (void**)&Punk); 这段程序的结果是一个指向服务器对象IUnknown 接口的指针变量pUNK Step.4 从IUnkown 接口通过QueryInterface()方法可以得到其它接口的指针 HRESULT r3; r3=pUNK->QueryInterface(IID_IOPCServer,(void **)&m_Popc); 这段程序的结果是得到一个指向服务器对象IOPCServer 接口的指针(变量m_Popc) Step.5 IOPCServer 接口的AddGroup()方法可以创建OPC 组 m_pItemMgt) HRESULT r1; r1=m_Popc->AddGroup(szName,TRUE,500,1,&TimeBias, &PercDeadband,dwLCID,&m_GrpServerHandle, &RevUpRate,IID_IOPCItemMgt, (LPUNKNOWN*)&m_pItemMgt); 这段程序的执行结果是创建一个有指定名称和属性的组在返回的参数中有一 个指向所需要的进程组对象接口的指针在这里是IOPCItemMgt(变量 Step.6 IOPCItemMgt 接口有AddItem()方法可以创建OPC 项 HRESULT r1; r1=m_pItemMgt->AddItems(NumItems,pItems,&m_pItResult,&pErrors); 这段程序的结果是创建有特殊属性的指定数量的项除此之外事件结构变量 m_pItResult 服务器句柄目标系统上的项数据类型等也被赋值 用于执行所需操作的指针需要通过现有的指向IOPCItemMgt 接口的指针得到如 如果用户要进行异步通信就需要指向IOPCAsyncIO 接口的指针 HRESULT rl; r1=m_pItemMgt->Queryface(IID_IOPCAsyncIO,(void * *) & pAsyncIO); 通过该接口的Read() 和Write()两个方法可以读写项的数值 r2=pAsyncIO->Read(m_dwConnection,OPC_DS_CACHE,dwNumItems,phServer,&m_TransactionID,&pErrors); 这段程序的执行结果是OPC 项的数据被送到客户程序的IAdviseSink 接口 Step.7 在程序停止运行之前必须删除已创建的OPC 对象并释放内存到目前为止用到 的各种接口都有相应的函数 5.4 r1=m_pItemMgt->RemoveItems(dwNumItems,&pErrors); r1=m_Popc->RemoveGroup(m_GrpServerHandle,TRUE); m_pItemMgt->Release(); m_pOPC->Release(); |
|
以下是对《VB,VC开发OPC客户程序必读!》的回复:
|
SZTAOYANBIN: |
2003-12-30 13:47:00
|
可叹!!!!!!! VB DEMO!!!!! STEP_1:Init Server!! Set Svr=CreateObject(ProgID$) STEP_2:AddGroup!! Set Group=Svr.AddGroup "szTaoYanBinGRP" false RateRequested,GroupClientHdl,PercentDeadband,dwLangId_ENGLISH,GroupServerHdl,RateRevised Set PtrItemMgt =Group STEP_3:AddItems!!! ItemsActive(0)= True: ItemsActive(1)= True PtrItemMgt.AddItems NbrItems,ItemsIDs,ItemsActivity,ItemsClientHdls,ItemsSvrHdls,ItemsErrors,ItemsObjects,accessPath STEP_4:Read&Write Items!!!! Set ptrSyncIO = group WHILE (true) PtrSyncIO.OPCRead OPC_DS_DEVICE,NbrItems,pValues,pQualities,pTimeStamps,ItemsErrors WEND STEP_5: Free Group&Items!!!!!! Svr.RemoveGroup GroupServerHdl,False Set Group = Nothing Set Svr = NothingS OK!!!!!! 如果你认为本贴有价值,请推荐为精华!!!!!! THANKS!!!!!!!!!!!!!!!!!!!! |
|
SZTAOYANBIN: |
2003-12-30 15:02:00
|
OPC HTML DEMO szTaoyanbin注,把OPC SEVER作为JAVA小程序的插件,加入HEML中,OBJECT的标记名称定义为GRP1则可!!!!! <Script Language="VBScript"><!-- Dim Item1 Dim Server Dim fValue Dim ItemValue Sub Window_OnLoad() Server = "szTaoYanBin_Group" GRP1.Init Server,"" GRP1.AddItem "",Item1 GRP1.Read fValue = GRP1.GetValue(Item1) GRP1.Start 500 End Sub Sub Window_OnUnload() GRP1.Stop End Sub Sub GRP1_OnGroupChange() fValue = GRP1.GetValue(Item1) End Sub --></Script> 如果有一天,你用网页作为组态软件,而是由本人启迪的话,别望了说声THANKS!!! szTaoyanbin@163.com |
|