Подписки и уведомления OPC UA

У меня проблемы с подписками и уведомлениями OPC UA в стеке ANSI C. OPC UA Часть 4, Сервис говорит:

5.13.1 Модель подписки 5.13.1.1 Описание c) Сообщения NotificationMessages отправляются Клиенту в ответ на запросы публикации.

Отправлено как? Я действительно ожидаю какого-то обратного вызова, но, похоже, его нет. Он действительно говорит, что это ответ на запрос «Опубликовать», но вызов службы публикации подтверждает получение уведомления, а не запрашивает его. Кроме того, это будет опрос, и весь смысл подписок и мониторинга состоит в том, чтобы не проводить опрос.

Может ли кто-нибудь привести пример, показывающий мониторинг значения данных в ANSI C?


person PhotoKevin    schedule 08.04.2015    source источник


Ответы (2)


Запросы PublishRequests помещаются в очередь на сервере, и ответы возвращаются только тогда, когда уведомления готовы или необходимо отправить подтверждение активности (или множество других вещей, проверьте описание конечного автомата в части 4).

Они также включают подтверждения ранее полученных уведомлений, но идея заключается в том, что ответ не ожидается немедленно и что клиент, как правило, будет продолжать перекачивать запросы PublishRequests, чтобы у сервера была их очередь, готовая возвращать уведомления всякий раз, когда требуется подписка. к.

Да, это опрос. Немного обидно, что это не совсем нежелательный запрос, но так оно и работает.

__

редактировать:

Это не совсем опрос. Это пакетный отчет по исключениям с гарантией QoS и механизмом обратного давления, предоставляемым последующими PublishRequests.

person Kevin Herron    schedule 09.04.2015
comment
OK. Что помогает. Я переключился на вызов OpcUa_ClientApi_BeginPublish и получаю одно событие изменения данных как Последовательность 1, и с этого момента я получаю пустые ответы как Последовательность 2. По-видимому, это сообщения Keep Alive. Теперь, если бы я мог просто понять, почему я не получаю другие события изменения данных. В любом случае это прогресс, спасибо. - person PhotoKevin; 10.04.2015
comment
Вы уже создали какие-либо MonitoredItems? и если да, то настроены ли они, чтобы сообщать только об изменении значения (параметр фильтра мониторинга)? - person Kevin Herron; 11.04.2015
comment
Также похоже, что вы просто используете стек; Когда дело доходит до продуктов для разработчиков для UA, кажется, существует разрыв между стеком и SDK. То, что вы пытаетесь сделать самостоятельно, обычно делает за вас SDK. Если вы можете приобрести или найти SDK с открытым исходным кодом, который может немного ускорить ваш прогресс. - person Kevin Herron; 11.04.2015
comment
Теперь я отслеживал, что элементы работают правильно. Моим последним камнем преткновения было понимание критериев фильтрации и правильная настройка объекта расширения. Элементы правильно обновляются и запускают события изменения данных. - person PhotoKevin; 14.04.2015
comment
Да, я использую только стек, кроме нескольких вещей, которые мне кажутся, это все, что мне нужно. Я также проделал всю свою собственную работу с COM со старыми интерфейсами OPC. Просто парень низкого уровня. - person PhotoKevin; 14.04.2015
comment
@KevinHerron Как реализовать очередь сообщений с помощью Opc Ua? - person Reza Ebrahimi; 11.07.2017

Это код C #. Надеюсь, это вам поможет.

private NotificationMessageReceivedEventHandler
    m_NotificationMessageReceived;

// ...

m_NotificationMessageReceived = 
    new NotificationMessageReceivedEventHandler
       (Subscription_NotificationMessageReceived);
m_subscription.NotificationMessageReceived +=
    Subscription_NotificationMessageReceived;

// ...

private void Subscription_NotificationMessageReceived
    (Subscription subscription,
     NotificationMessageReceivedEventArgs e)
{
    if (e.NotificationMessage.NotificationData == null ||
        e.NotificationMessage.NotificationData.Count == 0)
    {
        LogMessage("{0:HH:mm:ss.fff}: KeepAlive",
                   e.NotificationMessage.PublishTime.ToLocalTime());
    }
}
person Song Young Bin    schedule 23.06.2015