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

本文簡單介紹OPC AE規(guī)范的接口IOPCEventServer2的相關(guān)知識,更多通信資源請登錄網(wǎng)信智匯(wangxinzhihui.com)。OPC AE規(guī)范描述了OPC事件服務(wù)器應(yīng)該實(shí)現(xiàn)的對象和接口,實(shí)現(xiàn)在多個(gè)OPC客戶端間共享事件和警報(bào)條件。
IOPCEventServer2是一個(gè)可選接口,用于在區(qū)域或源的基礎(chǔ)上管理?xiàng)l件的啟用狀態(tài)。它擴(kuò)展了在IOPCEventServer上定義的相應(yīng)方法。方法定義允許客戶端查詢區(qū)域或源列表的當(dāng)前啟用狀態(tài)。
為了進(jìn)一步說明啟用狀態(tài)方法的用法,下面的示例區(qū)域模型作為啟動條件。禁用的對象顯示為高亮顯示。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
1)客戶端為A11調(diào)用GetEnableStateByArea,對于當(dāng)前狀態(tài),服務(wù)器均返回FALSE(pbEnabled)和有效狀態(tài)(pbEffectivelyEnabled)。
2)客戶端調(diào)用A11的EnableConditionByArea2,服務(wù)器返回S_OK??蛻舳藶镾1、S2和S3調(diào)用EnableConditionBySource2,區(qū)域模型將更新,如下圖所示。
3)客戶端為A11調(diào)用GetEnableStateByArea,對于當(dāng)前狀態(tài),服務(wù)器均返回TRUE(pbEnabled)和有效狀態(tài)(pbEffectivelyEnabled)。
4)客戶端調(diào)用S1的DisableConditionBySource2,服務(wù)器返回S_OK。
5)客戶端為A11調(diào)用GetEnableStateByArea,對于當(dāng)前狀態(tài),服務(wù)器均返回TRUE(pbEnabled)和有效狀態(tài)(pbEffectivelyEnabled)。
?
【接口說明】
1)HRESULT EnableConditionByArea2(
????????[in] DWORD dwNumAreas,
????????[in, string, size_is(dwNumAreas)] LPWSTR* pszAreas,
????????[out, size_is(,dwNumAreas)] HRESULT **ppErrors
);
將指定的過程區(qū)域置于啟用狀態(tài)。服務(wù)器生成源本身已啟用且其層次結(jié)構(gòu)中的包含區(qū)域沒有被禁用的條件相關(guān)事件。
此方法的效果在事件服務(wù)器的范圍內(nèi)是全局的。如果服務(wù)器支持多個(gè)客戶端,為所有客戶端啟用條件,所有客戶端將開始接收條件相關(guān)事件。
由于此方法的全局影響,一些事件服務(wù)器實(shí)現(xiàn)者可能會選擇不實(shí)現(xiàn)它。在這種情況下,如果客戶端通過QueryInterface請求IOPCEventServer2,服務(wù)器應(yīng)該返回E_NOINTERFACE 。
一個(gè)條件可能與多個(gè)來源相關(guān)。這些來源可能是分布于多個(gè)區(qū)域。啟用一個(gè)區(qū)域的條件不會改變其他區(qū)域中關(guān)聯(lián)源的同名條件的啟用/禁用狀態(tài)區(qū)域。例如,可以為“區(qū)域1”中的源啟用“LevelAlarm”條件,而在“區(qū)域2”中的源禁用“LevelAlarm”條件。
如果源的條件狀態(tài)設(shè)置為已啟用,并且包含區(qū)域的層次結(jié)構(gòu)中的所有區(qū)域都已啟,則源啟用。
如果HRESULT為S_OK,則可以忽略ppErrors(其中的所有結(jié)果都保證為S_OK)。
如果HRESULT是FAILED代碼,則服務(wù)器應(yīng)返回NULL的OUT指針參數(shù)及ppErrors。
調(diào)用方必須釋放返回的ppErrors數(shù)組。
?
2)HRESULT EnableConditionBySource2(
????????[in] DWORD dwNumSources,
????????[in, string, size_is(dwNumSources)] LPWSTR* pszSources,
????????[out, size_is(,dwNumSources)] HRESULT **ppErrors
?);
將指定事件源的所有條件置于啟用狀態(tài)。服務(wù)器將為這些源生成與條件相關(guān)的事件。
此方法的效果在事件服務(wù)器的范圍內(nèi)是全局的。如果服務(wù)器支持多個(gè)客戶端,為所有客戶端啟用條件,所有客戶端將開始接收條件相關(guān)事件。
由于此方法的全局影響,一些事件服務(wù)器實(shí)現(xiàn)者可能會選擇不實(shí)現(xiàn)它。在這種情況下,如果客戶端通過QueryInterface請求IOPCEventServer2,服務(wù)器應(yīng)該返回E_NOINTERFACE。
一個(gè)條件可能與多個(gè)源相關(guān)聯(lián)。啟用一個(gè)源的相關(guān)條件不會更改其他源關(guān)聯(lián)的相同名稱的條件的啟用/禁用狀態(tài)。例如,可以為“A100”啟用“LevelAlarm”條件,為“FIC101”禁用“LevelAlarm”條件。
如果源的條件狀態(tài)設(shè)置為已啟用,并且包含區(qū)域的層次結(jié)構(gòu)中的所有區(qū)域都已啟,則源啟用。
如果HRESULT為S_OK,則可以忽略ppErrors(其中的所有結(jié)果都保證為S_OK)。
如果HRESULT是FAILED代碼,則服務(wù)器應(yīng)返回NULL的OUT指針參數(shù)及ppErrors。
調(diào)用方必須釋放返回的ppErrors數(shù)組。
?
3)HRESULT DisableConditionByArea(
????????[in] DWORD dwNumAreas,
????????[in, string, size_is(dwNumAreas)] LPWSTR* pszAreas,
????????[out, size_is(,dwNumAreas)] HRESULT **ppErrors
?);
將指定的過程區(qū)域置于禁用狀態(tài)。服務(wù)器將停止為這些條件生成與條件相關(guān)的事件。
此方法的效果在事件服務(wù)器的范圍內(nèi)是全局的。如果服務(wù)器支持多個(gè)客戶端,所有客戶端的條件都被禁用,所有客戶端將停止接收條件相關(guān)事件。
由于此方法的全局影響,一些事件服務(wù)器實(shí)現(xiàn)者可能會選擇不實(shí)現(xiàn)它。在這種情況下,如果客戶端通過QueryInterface請求IOPCEventServer2,服務(wù)器應(yīng)該返回E_NOINTERFACE。
一個(gè)條件可能與多個(gè)來源相關(guān)。這些來源可能是分布于多個(gè)區(qū)域。禁用一個(gè)區(qū)域中的條件不會改變與其他區(qū)域中關(guān)聯(lián)源的同名條件的啟用/禁用狀態(tài)。例如,可以為“區(qū)域1”中的源啟用“LevelAlarm”條件,而在“區(qū)域2”中的源禁用“LevelAlarm”條件。
如果源的條件狀態(tài)設(shè)置為禁用或包含區(qū)域的層次結(jié)構(gòu)中的任何區(qū)域被禁用,則該源將被禁用。
如果HRESULT為S_OK,則可以忽略ppErrors(其中的所有結(jié)果都保證為S_OK)。
如果HRESULT是FAILED代碼,則服務(wù)器應(yīng)返回NULL的OUT指針參數(shù)及ppErrors。
調(diào)用方必須釋放返回的ppErrors數(shù)組。
?
4)HRESULT DisableConditionBySource2(
????????[in] DWORD dwNumSources,
????????[in, string, size_is(dwNumSources)] LPWSTR* pszSources,
????????[out, size_is(,dwNumSources)] HRESULT **ppErrors
?);
將指定事件源的所有條件置于禁用狀態(tài)。服務(wù)器將不再為這些源生成與條件相關(guān)的事件。
此方法的效果在事件服務(wù)器的范圍內(nèi)是全局的。如果服務(wù)器支持多個(gè)客戶端,所有客戶端的條件都被禁用,所有客戶端將停止接收條件相關(guān)事件。
由于此方法的全局影響,一些事件服務(wù)器實(shí)現(xiàn)者可能會選擇不實(shí)現(xiàn)它。在這種情況下,如果客戶端通過QueryInterface請求IOPCEventServer2,服務(wù)器應(yīng)該返回E_NOINTERFAC。
一個(gè)條件可能與多個(gè)源相關(guān)聯(lián)。禁用一個(gè)源相關(guān)聯(lián)的條件不會改變其它源相關(guān)聯(lián)的相同名稱的條件的啟用/禁用狀態(tài)。例如,在“A100”啟用“LevelAlarm”條件,在“FIC101”禁用“LevelAlarm”條件。
如果源的條件狀態(tài)設(shè)置為禁用或包含區(qū)域的層次結(jié)構(gòu)中的任何區(qū)域被禁用,則該源將被禁用。
如果HRESULT為S_OK,則可以忽略ppErrors(其中的所有結(jié)果都保證為S_OK)。
如果HRESULT是FAILED代碼,則服務(wù)器應(yīng)返回NULL的OUT指針參數(shù)及ppErrors。
調(diào)用方必須釋放返回的ppErrors數(shù)組。
?
5)HRESULT GetEnableStateByArea(
????????[in] DWORD dwNumAreas,
????????[in, string, size_is(dwNumAreas)] LPWSTR* pszAreas,
????????[out, size_is(,dwNumAreas)] BOOL **pbEnabled,
????????[out, size_is(,dwNumAreas)] BOOL **pbEffectivelyEnabled, [out, size_is(,dwNumAreas)] HRESULT **ppErrors
?);
返回pszAreas中指定的每個(gè)區(qū)域的當(dāng)前啟用狀態(tài)和有效啟用狀態(tài)。
如果HRESULT為S_OK,則可以忽略ppErrors(其中的所有結(jié)果都保證為S_OK)。
如果HRESULT是FAILED代碼,則服務(wù)器應(yīng)返回NULL的OUT指針參數(shù)及ppErrors。
調(diào)用方必須釋放返回的ppErrors數(shù)組。
?
6)HRESULT GetEnableStateBySource(
????????[in] DWORD dwNumSources,
????????[in, string, size_is(dwNumSources)] LPWSTR* pszSources,
????????[out, size_is(,dwNumSources)] BOOL **pbEnabled,
????????[out, size_is(,dwNumSources)] BOOL **pbEffectivelyEnabled, [out, size_is(,dwNumSources)] HRESULT **ppErrors
);
返回pszSources中指定的每個(gè)源的當(dāng)前啟用狀態(tài)和有效啟用狀態(tài)。
如果HRESULT為S_OK,則可以忽略ppErrors(其中的所有結(jié)果都保證為S_OK)。
如果HRESULT是FAILED代碼,則服務(wù)器應(yīng)返回NULL的OUT指針參數(shù)及ppErrors。
調(diào)用方必須釋放返回的ppErrors數(shù)組。
更多通信資源請登錄網(wǎng)信智匯(wangxinzhihui.com)。