#opc-ua #opc #milo
Вопрос:
Я пытаюсь получать события только от определенных типов событий. Идея состоит в том, чтобы затем создать пользовательский фильтр событий для каждого доступного типа событий на сервере, позволяющий получать только определенные свойства типа событий. Но как только я реализую фильтр содержимого (предложение where), события больше не поступают.
В этом примере я хотел бы отфильтровать все события, кроме базовых событий. Кто-нибудь знает, как написать правильный фильтр содержимого для этого? Заранее спасибо.
EventFilter eventFilter = new EventFilter(
new SimpleAttributeOperand[]{
new SimpleAttributeOperand(
Identifiers.BaseEventType,
new QualifiedName[]{new QualifiedName(0, "EventId")},
AttributeId.Value.uid(),
null)
},
new ContentFilter(new ContentFilterElement[]{
new ContentFilterElement(
FilterOperator.Equals,
new ExtensionObject[]{
ExtensionObject.encode(client.getSerializationContext(),
new SimpleAttributeOperand(
Identifiers.BaseEventType,
new QualifiedName[]{new QualifiedName(0, "BaseEventType")},
AttributeId.Value.uid(),
null))
}
)
})
);
Ответ №1:
Я не знаю, все ли это неправильно, но, во-первых, имя браузера переменной, содержащей тип события, — «EventType», а не «BaseEventType», поэтому вы SimpleAttributeOperand
нацелены не на то свойство.
Во-вторых, оператор Equals будет ожидать 2 операнда (с чем он сравнивает значение «Тип события»?). Поэтому вам нужен другой операнд, который является просто идентификатором узла типа BaseEventType (поэтому, вероятно, a LiteralOperand
, содержащий a Variant
, который содержит Identifiers.BaseEventType
).
Так что, возможно, что-то вроде этого:
ContentFilter contentFilter = new ContentFilter(new ContentFilterElement[]{
new ContentFilterElement(
FilterOperator.Equals,
new ExtensionObject[]{
ExtensionObject.encode(
client.getStaticSerializationContext(),
new SimpleAttributeOperand(
Identifiers.BaseEventType,
new QualifiedName[]{new QualifiedName(0, "EventType")},
AttributeId.Value.uid(),
null
)
),
ExtensionObject.encode(
client.getStaticSerializationContext(),
new LiteralOperand(new Variant(Identifiers.BaseEventType))
)
}
)
});
Комментарии:
1. Да, это работает сейчас!! К сожалению, не могу ответить на ваш комментарий, потому что мой аккаунт новый. Я уже прочитал так много полезных комментариев от вас. Искренне ценю вашу работу. Спасибо!