Фильтрация типов событий

#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. Да, это работает сейчас!! К сожалению, не могу ответить на ваш комментарий, потому что мой аккаунт новый. Я уже прочитал так много полезных комментариев от вас. Искренне ценю вашу работу. Спасибо!