powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / ОРС технология : IOPCDataCallback
3 сообщений из 3, страница 1 из 1
ОРС технология : IOPCDataCallback
    #34898263
eppopov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не уверен, что правильно написал программы. Я пытаюсь создать подключение к ОРС серверу и получать обновлённые данные через реализацию IOPCDataCallback:OnDataChange.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
#if !defined(OPC_CALLBACK_HEADER)
#define OPC_CALLBACK_HEADER

#include "stdafx.h"

class COPCCallback : public IOPCDataCallback 
{ 
public: 

   COPCCallback() 
   { 
      m_ulRefs =  1 ; 
   } 
    
   //========================================================================== 
    // IUnknown 

   // QueryInterface 
   STDMETHODIMP QueryInterface(REFIID iid, LPVOID* ppInterface) 
   { 
      if (ppInterface == NULL) 
      { 
         return E_INVALIDARG; 
      } 

      if (iid == IID_IUnknown) 
      { 
         *ppInterface = dynamic_cast<IUnknown*>(this); 
         AddRef(); 
         return S_OK; 
      } 

      if (iid == IID_IOPCDataCallback) 
      { 
         *ppInterface = dynamic_cast<IOPCDataCallback*>(this); 
         AddRef(); 
         return S_OK; 
      } 

      return E_NOINTERFACE; 
   } 

   // AddRef 
   STDMETHODIMP_(ULONG) AddRef() 
   { 
        return InterlockedIncrement((LONG*)&m_ulRefs); 
   } 

   // Release 
   STDMETHODIMP_(ULONG) Release() 
   { 
        ULONG ulRefs = InterlockedDecrement((LONG*)&m_ulRefs); 

        if (ulRefs ==  0 ) 
        { 
            delete this; 
            return  0 ; 
        } 

        return ulRefs; 
   } 

   //========================================================================== 
    // IOPCDataCallback 

    // OnDataChange 
    STDMETHODIMP OnDataChange( 
        DWORD       dwTransid, 
        OPCHANDLE   hGroup, 
        HRESULT     hrMasterquality, 
        HRESULT     hrMastererror, 
        DWORD       dwCount, 
        OPCHANDLE * phClientItems, 
        VARIANT   * pvValues, 
        WORD      * pwQualities, 
        FILETIME  * pftTimeStamps, 
        HRESULT   * pErrors) 
   { 
      USES_CONVERSION; 

      for (DWORD ii =  0 ; ii < dwCount; ii++) 
      { 
         VARIANT vValue; 
         VariantInit(&vValue); 

         if (SUCCEEDED(VariantChangeType(&vValue, &(pvValues[ii]), NULL, VT_BSTR))) 
         { 
            _tprintf(_T("Handle = '%d', Value = '%s'\r\n"), phClientItems[ii], OLE2T(vValue.bstrVal)); 
            VariantClear(&vValue); 
         } 
      } 

      return S_OK; 
   } 

    // OnReadComplete 
    STDMETHODIMP OnReadComplete( 
        DWORD       dwTransid, 
        OPCHANDLE   hGroup, 
        HRESULT     hrMasterquality, 
        HRESULT     hrMastererror, 
        DWORD       dwCount, 
        OPCHANDLE * phClientItems, 
        VARIANT   * pvValues, 
        WORD      * pwQualities, 
        FILETIME  * pftTimeStamps, 
        HRESULT   * pErrors) 
   { 
      return S_OK; 
   } 

    // OnWriteComplete 
    STDMETHODIMP OnWriteComplete( 
        DWORD       dwTransid, 
        OPCHANDLE   hGroup, 
        HRESULT     hrMastererr, 
        DWORD       dwCount, 
        OPCHANDLE * pClienthandles, 
        HRESULT   * pErrors) 
   { 
      return S_OK; 
   } 


    // OnCancelComplete 
    STDMETHODIMP OnCancelComplete( 
        DWORD       dwTransid, 
        OPCHANDLE   hGroup) 
   { 
      return S_OK; 
   } 

private: 

   ULONG m_ulRefs; 
};

#endif

и участок кода, где я создаю подключение через интерфейс IOPCDataCallback :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
IConnectionPointContainer * ipCPC = NULL; 

   hr = pIOPCServer->QueryInterface(IID_IConnectionPointContainer, (LPVOID*)&ipCPC); 
   if (hr != S_OK) 
   { 
      return false; 
   } 

   IConnectionPoint *ipCP;
   hr = ipCPC->FindConnectionPoint(IID_IOPCDataCallback, &ipCP); 
   if (hr != S_OK) 
   { 
      return false; 
   } 
    
   ipCPC->Release(); 

   IUnknown *pUnknown;
   hr = m_callback.QueryInterface(IID_IUnknown, (LPVOID*)&pUnknown); 
   if (hr != S_OK) 
   { 
      return false; 
   } 

   unsigned long dwAdvise =  0 ; 

   hr = ipCP->Advise(pUnknown, &dwAdvise);    
   if (hr != S_OK)          
   {                   
      return false;       
   }

Вызов метода ipCP->Advise даёт ошибку интерфейс не поддерживается. Я точно знаю, что работать с этим сервером можно через подобные асинхронные вызовы. Правильно ли я накодил(не совсем я, сорцы не мои) и вообще как можно сделать, чтобы данные из ОРС сервера передавались только после их изменения?
...
Рейтинг: 0 / 0
ОРС технология : IOPCDataCallback
    #34902547
eppopov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Лог ОРС сервера выдал, что у метода Advise() проблемы: "No parentGroup!". Что это может означать?
...
Рейтинг: 0 / 0
ОРС технология : IOPCDataCallback
    #34905308
eppopov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вопрос решён. Моя ошибка:

Сперва создаём ОРС группу, только затем полученный указатель на IOPCItemMgt используем для получения Connection Point и далее кодим чего нам надо. Выглядит примерно так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
for(USHORT nGroup =  0 ; nGroup < nGroupsCount; nGroup++)
{
AddTheGroup(pIOPCServer, pIOPCItemMgt, hServerGroup, szName,
	       g_OPCConnectionOptions.OPCGROUPSVEC[nGroup].dwRefreshRate);
			
AssignOPCTagsToGroups(nGroup, pIOPCItemProperties, pIOPCItemMgt, hServerItem, ValVec);			
IConnectionPointContainer * ipCPC = NULL; 
HRESULT hr = pIOPCItemMgt->QueryInterface(IID_IConnectionPointContainer, (LPVOID*)&ipCPC); 
if (hr != S_OK) 
{  
       return false; 
}  
IConnectionPoint *ipCP;
hr = ipCPC->FindConnectionPoint(IID_IOPCDataCallback, &ipCP); 
if (hr != S_OK) 
{  
	return false; 
}  
    
ipCPC->Release(); 

COPCCallback m_callback;
m_callback.AddRef();
IUnknown *pUnknown;
hr = m_callback.QueryInterface(IID_IUnknown, (LPVOID*)&pUnknown); 
if (hr != S_OK) 
{ 
      return false; 
}  
   
DWORD dwAdvise =  0 ; 

hr = ipCP->Advise(pUnknown, &dwAdvise);    
if (hr != S_OK)          
{                    
	return false;       
} 
}  
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / ОРС технология : IOPCDataCallback
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]