通訊協(xié)議026——全網(wǎng)獨有的OPC AE知識四之接口(十)

本文繼續(xù)介紹OPC AE規(guī)范的IOPCEventSubscriptionMgt接口的相關(guān)知識,更多通信資源請登錄網(wǎng)信智匯(wangxinzhihui.com)。OPC AE規(guī)范描述了OPC事件服務(wù)器應(yīng)該實現(xiàn)的對象和接口,實現(xiàn)在多個OPC客戶端間共享事件和警報條件。
上文已經(jīng)介紹了IOPCEventSubscriptionMgt的三個方法,其他方法如下:
1)HRESULT GetReturnedAttributes(
[in] DWORD dwEventCategory,
[out] DWORD * pdwCount,
[out, size_is(,pdwCount)] DWORD* pdwAttributeIDs
?);
??? 對于每個事件類別,GetReturnedAttributes檢索當(dāng)前指定要在IOPCEventSink::OnEvent回調(diào)中隨事件通知返回的屬性。所有檢索到的屬性都已由以前對SelectReturnedAttributes的調(diào)用指定。
?
2)HRESULT Refresh(
[in] DWORD dwConnection
?);
強制刷新事件通知與事件訂閱的篩選器匹配的所有活動條件和非活動、未確認(rèn)的條件。
客戶端通常需要從服務(wù)器獲取當(dāng)前狀況信息,尤其是在客戶端啟動時,例如當(dāng)前警報摘要。OPC事件服務(wù)器通過重新發(fā)送最新的事件通知來支持這一要求,這些事件通知滿足事件訂閱中的過濾器,并且與活動和/或未確認(rèn)的條件有關(guān)。然后,客戶端可以從“刷新”的事件通知中導(dǎo)出當(dāng)前條件狀態(tài)。
當(dāng)客戶端需要刷新的活動條件列表時,它將向服務(wù)器請求“刷新”。服務(wù)器將向該特定客戶端發(fā)送事件通知,指示它們正在“刷新”“原始”事件通知的數(shù)量。由于客戶端只需要獲取的當(dāng)前狀態(tài)信息條件,則只刷新條件事件。注意:“刷新”不是一般的“重播”功能,因為服務(wù)器不需要維護事件歷史記錄。刷新僅用于更新客戶端的活動或未確認(rèn)條件的狀態(tài)信息。
除了刷新指示符之外,原始事件通知和刷新事件通知之間還可能存在其他差異。具體地,由于在原始事件通知時可用的一些屬性信息在刷新時可能不可用,因此刷新中的一些屬性可能為空。
刷新事件通知和原始事件通知不會混合在事件回調(diào)的同一調(diào)用中,盡管刷新和原始事件回調(diào)調(diào)用可能是交錯的。因此,客戶端有責(zé)任檢查事件通知上的時間戳,并將其按正確的順序排列,以確保獲得正確的條件狀態(tài)。
根據(jù)IOPCEventServer::CreateEventSubscription方法中的規(guī)范,客戶端每次回調(diào)將接收最大數(shù)量的事件通知。發(fā)送刷新事件通知時,服務(wù)器將指示是否還有更多刷新事件通知要發(fā)送。
此方法僅適用于與條件相關(guān)的事件。簡單事件和跟蹤事件的通知不會返回,即使它們滿足事件訂閱的過濾器。
此方法在訂閱處于活動狀態(tài)和非活動狀態(tài)時都適用。
?
3)HRESULT CancelRefresh(
[in] DWORD dwConnection
?);
取消正在進行的事件訂閱刷新。
如果正在進行刷新,服務(wù)器應(yīng)該發(fā)送一個最后的回調(diào),其中設(shè)置了最后一個刷新標(biāo)志,并且事件數(shù)等于零。
?
4)HRESULT GetState(
[out] BOOL * pbActive,
[out] DWORD * pdwBufferTime,
[out] DWORD * pdwMaxSize,
[out] OPCHANDLE * phClientSubscription,
);
獲取訂閱的當(dāng)前狀態(tài)??蛻舳藢⒅羔槀鬟f到要保存信息的位置。
在調(diào)用SetState之前,通常會調(diào)用此函數(shù)以獲取此信息的當(dāng)前值。這些信息都是在創(chuàng)建訂閱時由客戶端提供的。此函數(shù)對于調(diào)試也很有用。
?
5)HRESULT GetState(
[out] BOOL * pbActive,
[out] DWORD * pdwBufferTime,
[out] DWORD * pdwMaxSize,
[out] OPCHANDLE * phClientSubscription,
);
??? 獲取訂閱的當(dāng)前狀態(tài)??蛻舳藢⒅羔槀鬟f到要保存信息的位置。
??? 在調(diào)用SetState之前,通常會調(diào)用此函數(shù)以獲取此信息的當(dāng)前值。這些信息都是在創(chuàng)建訂閱時由客戶端提供的。此函數(shù)對于調(diào)試也很有用。
?
6)HRESULT SetState(
[unique, in] BOOL * pbActive,
[unique, in] DWORD * pdwBufferTime,
[unique, in] DWORD * pdwMaxSize,
[in] OPCHANDLE hClientSubscription
[out] DWORD * pdwRevisedBufferTime,
[out] DWORD * pdwRevisedMaxSize
?);
客戶端可以設(shè)置事件訂閱的各種屬性。使用指向項的指針,這樣客戶端就可以通過傳遞空指針來省略他不想更改的屬性。
??? 請注意,將事件訂閱設(shè)置為“活動”并不意味著服務(wù)器應(yīng)該對客戶端進行隱式刷新。發(fā)送“刷新”事件的唯一時間是直接響應(yīng)客戶端對refresh()的顯式調(diào)用。這與OPC數(shù)據(jù)訪問接口不同,在OPC數(shù)據(jù)訪問界面中,使項目處于活動狀態(tài)會導(dǎo)致服務(wù)器進行隱式刷新。
?
更多通信資源請登錄網(wǎng)信智匯(wangxinzhihui.com)。