本文简单介绍OPC AE规范的OPCEventSubscription对象的相关知识,更多通信资源请登录网信智汇(wangxinzhihui.com)。OPC AE规范描述了OPC事件服务器应该实现的对象和接口,实现在多个OPC客户端间共享事件和警报条件。
OPCEventSubscription对象是OPC事件服务器为管理单个事件订阅而提供的对象。它是通过调用IOPCEventServer::CreateEventSubscription创建的。此对象提供以下接口:
• IUnknown
• IOPCEventSubscriptionMgt
• IConnectionPointContainer
此外,OPCEventSubscription包含一个IID_IOPCEventSink对象,该对象支持IConnectionPoint接口。
客户端和服务器之间的每个订阅都只有一个筛选器,尽管该筛选器可以包括多个条件。客户端可以使用多个订阅实现多个筛选器,每个订阅都有自己的筛选器。建立订阅后,将创建一个默认过滤器,该过滤器相当于“无过滤”,即发送所有事件通知。
定义筛选器范围的标准是消除客户端没有感兴趣的大多数事件,而不必详尽无遗。过滤器的主要原因是减少不必要的通信开销并提高性能。客户端可以对接收到的事件通知进行额外的筛选,进一步精确地自定义显示或存储事件通知。
这些接口中的每一个提供的功能都在本节中进行了定义。
IOPCEventSubscriptionMgt接口指定如何管理对OPC事件信息的特定订阅。它用于指定选择感兴趣事件的标准,指定要在事件通知中返回的供应商特定信息,以及请求刷新所选条件。
IOPCEventSubscriptionMgt接口说明如下。
1)HRESULT SetFilter(
[in] DWORD dwEventType,
[in] DWORD dwNumCategories,
[in, size_is(dwNumCategories)] DWORD* pdwEventCategories, [in] DWORD dwLowSeverity,
[in] DWORD dwHighSeverity,
[in] DWORD dwNumAreas,
[in, size_is(dwNumAreas)] LPWSTR* pszAreaList,
[in] DWORD dwNumSources,
[in, size_is(dwNumSources] LPWSTR* pszSourceList
);
设置要用于事件订阅的筛选条件。
可以使用以下标准选择事件:
•事件类型,即简单、条件或跟踪。
•事件类别
•最低严重性,即严重性大于或等于指定严重性的所有事件。
•最高严重性,即严重性小于或等于指定严重性的所有事件。
•过程区域
•事件源
单个标准的值列表在逻辑上被“或”运算在一起(例如,如果两个事件类别指定,将接收两个类别的事件通知)。如果指定了多个标准,它们将被逻辑地“与”在一起,即仅那些满足所有标准的事件将被选择。例如,指定最低严重性和最高严重性将导致选择事件严重性介于两个值之间。
OPCEventSubscription对象只有一个筛选器。
服务器负责将其内部严重性级别映射为均匀分布在1..1000范围内。希望接收所有严重性事件的客户端应设置dwLowSeverity=1和dwHighSeverity=1000。
服务器可能不支持所有各种筛选条件。给定服务器支持的特定筛选条件可以通过IOPCEventServer::QueryAvailableFilters方法确定。如果指定了服务器不支持的筛选条件,它将忽略该筛选条件并返回S_FALSE。
注意,对于给定条件,如果与确认或恢复正常相对应的事件通知具有与该条件变为活动的事件通知不同的严重性级别,则由于按严重性进行过滤,客户端可能会接收一组通知,但不会接收其他通知。
2)HRESULT GetFilter(
[out] DWORD* pdwEventType,
[out] DWORD* pdwNumCategories,
[out, size_is(,*pdwNumCategories)] DWORD** ppdwEventCategories,
[out] DWORD* pdwLowSeverity,
[out] DWORD* pdwHighSeverity,
[out] DWORD* pdwNumAreas,
[out, size_is(,*pdwNumAreas)] LPWSTR** ppszAreaList
[out] DWORD* pdwNumSources,
[out, size_is(,*pdwNumSources)] LPWSTR** ppszSourceList
);
返回当前用于事件订阅的筛选器。
如果服务器不支持SetFilter中请求的一个或多个筛选条件,它将为列表返回空数组,并返回指示未对非列表项进行筛选的值。在这些情况下,它不会返回SetFilter中可能已请求但已被忽略的任何筛选器。
3)HRESULT SelectReturnedAttributes(
[in] DWORD dwEventCategory,
[in] DWORD dwCount,
[in, size_is(dwCount)] DWORD* dwAttributeIDs,
);
对于每个事件类别,SelectReturnedAttributes设置要随IOPCEventSink::OnEvent回调中的通知事件一起返回的属性。
可以多次调用此方法,以便为每个唯一值指定要返回的属性事件类型和事件类别对。对于给定的事件类型和事件类别对,属性可以通过将dwCount参数设置为零来“清除”返回的值。如果多次调用相同的事件类型和事件类别对,则最新的调用将生效。
更多通信资源请登录网信智汇(wangxinzhihui.com)。