OPC UA - Клиент - Майло - Передовой опыт - Подписка на изменение данных

Я начал проект OPC UA, используя проект Milo для создания клиента OPC UA. Я все еще новичок в OPC UA. Прямо сейчас я застрял в поисках лучшей практики для чтения значений с нескольких узлов после изменения данных одного конкретного узла.

Информационная модель выглядит так: RfidSensorType

На моем сервере у меня будет несколько объектов этого RfidSensorType. Клиент создает подписку на узле CurrentAtTag для прослушивания изменений данных.

Мой вопрос: при изменении значения CurrentAtTag в моем клиенте будет вызвана функция обратного вызова, которая содержит UaMonitoredItem и DataValue CurrentAtTag. В моем приложении мне нужно обработать (одновременно) также значения Station, IOLPort и CurrentValue, которые также меняются в этот момент. Как я могу получить доступ к этим значениям в обратном вызове от CurrentAtTag?

Мое единственное решение: использование синхронного запроса на чтение в этом обратном вызове -> Это законный подход?

Мои исследования: 1) TriggeringService Я видел, что существует TriggerigService, который отслеживает элементы, отправляет отчеты только в том случае, если один конкретный узел меняет свои значения. Проблема: это вызовет несколько обратных вызовов, а noz - только один ... мне нужна вся информация одновременно для их дальнейшей обработки ..

2) Мониторинг событий В мониторинге событий можно выбрать «Поля событий», которые будут возвращаться для каждого уведомления о событии. Я не уверен, что могу выбрать CurrentAtTag, Station, IOLPort и CurrentValue ...


person Niko    schedule 10.10.2016    source источник
comment
Например, сильно ли различается время обновления между CurrentAtTag и IOLPort? Как то первое - медленное, а второе - быстро меняющееся? В противном случае я бы просто подписался на них всех и посмотрел, в порядке ли производительность.   -  person astrowalker    schedule 11.10.2016
comment
Привет @astrowalker, нет, они почти одновременно. Я уже считал подписку на все узлы. Проблема в том, что мне нужно вызвать другой метод в моем приложении, которому нужны все значения. Я не уверен, как я могу это сделать, если я получаю значения в разных обратных вызовах ... Вы понимаете, о чем я? Возможно, эту проблему легко решить, но пока понятия не имею.   -  person Niko    schedule 13.10.2016
comment
Похоже, вы неправильно рассматриваете свою архитектуру. Если несколько полей данных изменяются вместе, то они действительно принадлежат одному комбинированному блоку, а не разным полям.   -  person Stephen Chung    schedule 17.11.2016


Ответы (1)


Так же, как вы можете подписаться на ServerStatus сервера (nodeid "i = 2256"), вы должны иметь возможность подписаться на nodeid, соответствующий 'RfidSensor_Station1'. Сервер отправит PublishResponse с данными типа RfidSensorType, закодированными как ExtensionObject. Хитрость заключается в декодировании ExtensionObject.

Как поправил Кевин, поскольку «RfidSensor_Station1» не является классом узла «Переменная», то у него нет атрибута значения, и вы не можете отслеживать изменения данных на узле. Если вы используете ПЛК, я мог бы объединить все свойства датчика в строку или массив байтов. Затем я отслеживаю новую переменную и анализирую строку в клиенте.

Или вы можете сделать ReadRequest, как вы описываете. Это будет работать нормально.

person Andrew Cullen    schedule 13.10.2016
comment
Подписка на саму станцию ​​в этом случае не сработает, потому что станция моделируется как ObjectType / ObjectNode. Если бы вместо этого он был смоделирован как переменная, он мог бы иметь сложный DataType, который представлял бы совокупность всех данных станции, и он мог бы подписаться на него. Выполнение этого как запроса на чтение, вероятно, лучший / единственный способ пойти сюда. - person Kevin Herron; 30.10.2016