Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / ОРС технология : IOPCDataCallback / 3 сообщений из 3, страница 1 из 1
26.10.2007, 17:11:19
    #34898263
eppopov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ОРС технология : IOPCDataCallback
Не уверен, что правильно написал программы. Я пытаюсь создать подключение к ОРС серверу и получать обновлённые данные через реализацию 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
29.10.2007, 17:25:34
    #34902547
eppopov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ОРС технология : IOPCDataCallback
Лог ОРС сервера выдал, что у метода Advise() проблемы: "No parentGroup!". Что это может означать?
...
Рейтинг: 0 / 0
30.10.2007, 16:50:45
    #34905308
eppopov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ОРС технология : IOPCDataCallback
Вопрос решён. Моя ошибка:

Сперва создаём ОРС группу, только затем полученный указатель на 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
Форумы / C++ [игнор отключен] [закрыт для гостей] / ОРС технология : IOPCDataCallback / 3 сообщений из 3, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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