本文继续介绍OPC AE规范的IOPCEventSubscriptionMgt接口的相关知识,更多通信资源请登录网信智汇(wangxinzhihui.com)。OPC AE规范描述了OPC事件服务器应该实现的对象和接口,实现在多个OPC客户端间共享事件和警报条件。
上文已经介绍了IOPCEventSubscriptionMgt的三个方法,其他方法如下:
1)HRESULT GetReturnedAttributes(
[in] DWORD dwEventCategory,
[out] DWORD * pdwCount,
[out, size_is(,pdwCount)] DWORD* pdwAttributeIDs
);
对于每个事件类别,GetReturnedAttributes检索当前指定要在IOPCEventSink::OnEvent回调中随事件通知返回的属性。所有检索到的属性都已由以前对SelectReturnedAttributes的调用指定。
2)HRESULT Refresh(
[in] DWORD dwConnection
);
强制刷新事件通知与事件订阅的筛选器匹配的所有活动条件和非活动、未确认的条件。
客户端通常需要从服务器获取当前状况信息,尤其是在客户端启动时,例如当前警报摘要。OPC事件服务器通过重新发送最新的事件通知来支持这一要求,这些事件通知满足事件订阅中的过滤器,并且与活动和/或未确认的条件有关。然后,客户端可以从“刷新”的事件通知中导出当前条件状态。
当客户端需要刷新的活动条件列表时,它将向服务器请求“刷新”。服务器将向该特定客户端发送事件通知,指示它们正在“刷新”“原始”事件通知的数量。由于客户端只需要获取的当前状态信息条件,则只刷新条件事件。注意:“刷新”不是一般的“重播”功能,因为服务器不需要维护事件历史记录。刷新仅用于更新客户端的活动或未确认条件的状态信息。
除了刷新指示符之外,原始事件通知和刷新事件通知之间还可能存在其他差异。具体地,由于在原始事件通知时可用的一些属性信息在刷新时可能不可用,因此刷新中的一些属性可能为空。
刷新事件通知和原始事件通知不会混合在事件回调的同一调用中,尽管刷新和原始事件回调调用可能是交错的。因此,客户端有责任检查事件通知上的时间戳,并将其按正确的顺序排列,以确保获得正确的条件状态。
根据IOPCEventServer::CreateEventSubscription方法中的规范,客户端每次回调将接收最大数量的事件通知。发送刷新事件通知时,服务器将指示是否还有更多刷新事件通知要发送。
此方法仅适用于与条件相关的事件。简单事件和跟踪事件的通知不会返回,即使它们满足事件订阅的过滤器。
此方法在订阅处于活动状态和非活动状态时都适用。
3)HRESULT CancelRefresh(
[in] DWORD dwConnection
);
取消正在进行的事件订阅刷新。
如果正在进行刷新,服务器应该发送一个最后的回调,其中设置了最后一个刷新标志,并且事件数等于零。
4)HRESULT GetState(
[out] BOOL * pbActive,
[out] DWORD * pdwBufferTime,
[out] DWORD * pdwMaxSize,
[out] OPCHANDLE * phClientSubscription,
);
获取订阅的当前状态。客户端将指针传递到要保存信息的位置。
在调用SetState之前,通常会调用此函数以获取此信息的当前值。这些信息都是在创建订阅时由客户端提供的。此函数对于调试也很有用。
5)HRESULT GetState(
[out] BOOL * pbActive,
[out] DWORD * pdwBufferTime,
[out] DWORD * pdwMaxSize,
[out] OPCHANDLE * phClientSubscription,
);
获取订阅的当前状态。客户端将指针传递到要保存信息的位置。
在调用SetState之前,通常会调用此函数以获取此信息的当前值。这些信息都是在创建订阅时由客户端提供的。此函数对于调试也很有用。
6)HRESULT SetState(
[unique, in] BOOL * pbActive,
[unique, in] DWORD * pdwBufferTime,
[unique, in] DWORD * pdwMaxSize,
[in] OPCHANDLE hClientSubscription
[out] DWORD * pdwRevisedBufferTime,
[out] DWORD * pdwRevisedMaxSize
);
客户端可以设置事件订阅的各种属性。使用指向项的指针,这样客户端就可以通过传递空指针来省略他不想更改的属性。
请注意,将事件订阅设置为“活动”并不意味着服务器应该对客户端进行隐式刷新。发送“刷新”事件的唯一时间是直接响应客户端对refresh()的显式调用。这与OPC数据访问接口不同,在OPC数据访问界面中,使项目处于活动状态会导致服务器进行隐式刷新。
更多通信资源请登录网信智汇(wangxinzhihui.com)。