Professional OPC
Development Tools

logos

Online Forums

Technical support is provided through Support Forums below. Anybody can view them; you need to Register/Login to our site (see links in upper right corner) in order to Post questions. You do not have to be a licensed user of our product.

Please read Rules for forum posts before reporting your issue or asking a question. OPC Labs team is actively monitoring the forums, and replies as soon as possible. Various technical information can also be found in our Knowledge Base. For your convenience, we have also assembled a Frequently Asked Questions page.

Do not use the Contact page for technical issues.

SubscribeMultipleItems in VC++

More
11 Mar 2014 14:34 #1766 by support
The example project for SubscribeMultipleItems and ItemChanged in Visual C++ (2012) is in the attachment:


File Attachment:

File Name: SubscribeM...tems.zip
File Size:7 KB



Here are the most relevant parts of it:

Code:
// $Header: $ // Copyright (c) CODE Consulting and Development, s.r.o., Plzen. All rights reserved. // This example shows how to subscribe to changes of multiple items and display the value of the item with each change. // SubscribeMultipleItems.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <atlcom.h> #include <atlsafe.h> #include <comutil.h> #import "libid:FAB7A1E3-3B79-4292-9C3A-DF39A6F65EC1" version(5.2) // EasyOpcLib using namespace EasyOpcLib; #define DISPID_EASYDACLIENTEVENTS_ITEMCHANGED 1002 // class CSubscribeMultipleItemsModule : public ATL::CAtlModuleT< CSubscribeMultipleItemsModule > { }; CSubscribeMultipleItemsModule _AtlModule; // CCoEasyDAClientEvents class CCoEasyDAClientEvents : public CComObjectRoot, public IDispEventImpl<1, CCoEasyDAClientEvents, &__uuidof(DEasyDAClientEvents), &__uuidof(__EasyOpcLib), 5, 2> { BEGIN_COM_MAP(CCoEasyDAClientEvents) COM_INTERFACE_ENTRY_IID(__uuidof(IDispatch), CCoEasyDAClientEvents) COM_INTERFACE_ENTRY_IID(__uuidof(DEasyDAClientEvents), CCoEasyDAClientEvents) END_COM_MAP() BEGIN_SINK_MAP(CCoEasyDAClientEvents) // Event handlers must have the __stdcall calling convention SINK_ENTRY_EX(1, __uuidof(DEasyDAClientEvents), DISPID_EASYDACLIENTEVENTS_ITEMCHANGED, &CCoEasyDAClientEvents::ItemChanged) END_SINK_MAP() public: // The handler for EasyDAClient.ItemChanged event STDMETHOD(ItemChanged)(VARIANT varSender, VARIANT varEventArgs) { // Obtain the event arguments IEasyDAItemChangedEventArgsPtr EasyDAItemChangedEventArgsPtr(varEventArgs); IDAItemDescriptorPtr DAItemDescriptorPtr(EasyDAItemChangedEventArgsPtr->ItemDescriptor); IDAVtqPtr VtqPtr(EasyDAItemChangedEventArgsPtr->Vtq); // Not shown in this example: You should test the VtqPtr against NULL. _tprintf(_T("%s: %s\n"), COLE2CT(_bstr_t(DAItemDescriptorPtr->ItemId)), COLE2CT(_bstr_t(VtqPtr->ToString()))); return S_OK; } }; // int _tmain(int argc, _TCHAR* argv[]) { // Initialize the COM library CoInitializeEx(NULL, COINIT_MULTITHREADED); // Instatiate the EasyOPC-DA client object IEasyDAClientPtr EasyDAClientPtr(__uuidof(EasyDAClient)); // Hook the event handler IConnectionPointContainerPtr ConnectionPointContainerPtr(EasyDAClientPtr); IConnectionPointPtr ConnectionPointPtr; ConnectionPointContainerPtr->FindConnectionPoint(__uuidof(DEasyDAClientEvents), &ConnectionPointPtr); CComObject<CCoEasyDAClientEvents>* pCoEasyDAClientEvents = NULL; CComObject<CCoEasyDAClientEvents>::CreateInstance(&pCoEasyDAClientEvents); DEasyDAClientEventsPtr EasyDAClientEventsPtr(pCoEasyDAClientEvents); DWORD Cookie; ConnectionPointPtr->Advise(EasyDAClientEventsPtr, &Cookie); // Create array of OPC item IDs CComSafeArray<BSTR> ItemIdArray(4); ItemIdArray[0] = _T("Simulation.Random"); ItemIdArray[1] = _T("Trends.Ramp (1 min)"); ItemIdArray[2] = _T("Trends.Sine (1 min)"); ItemIdArray[3] = _T("Simulation.Register_I4"); CComVariant vResults(EasyDAClientPtr->SubscribeMultipleItems( /*varMachineNames:*/ _T(""), /*varServerClasses:*/ _T("OPCLabs.KitServer.2"), /*varItemIds:*/ CComVariant(ItemIdArray.Detach()), /*varRequestedUpdateRates:*/ 1000)); CComSafeArray<VARIANT> ResultArray(vResults.parray); for (int i = ResultArray.GetLowerBound(0); i <= ResultArray.GetUpperBound(0); i++) { IHandleResultPtr HandleResultPtr(ResultArray[i]); // Not shown in this example: Obtain the handle of the subscribed item from HandleResultPtr. // The handle is needed if you later wish to unsubscribe from certain items individually. } _tprintf(_T("Processing item changed events for 1 minute...")); Sleep(60*1000); // Unsubscribe from changes to all OPC items EasyDAClientPtr->UnsubscribeAllItems(); // Release all interface pointers BEFORE calling CoUninitialize() ResultArray.Destroy(); vResults.Clear(); EasyDAClientEventsPtr = NULL; ConnectionPointPtr = NULL; ConnectionPointContainerPtr = NULL; EasyDAClientPtr = NULL; CoUninitialize(); return 0; }
Attachments:

Please Log in or Create an account to join the conversation.

More
05 Mar 2014 13:42 #1759 by Bego
Hi,
Could anyone share a bit of sample code (including declarations/references) to illustrate the use of “SubscribeMultipleItems” and ItemChanged event in VC++?
thank you very much

Please Log in or Create an account to join the conversation.

Moderators: supportvaclav.zaloudek
Time to create page: 0.131 seconds