UniSet 2.35.2
(OPCUAExchange) Обмен с OPC UA серверами

Общее описание OPCUAExchange

Данная реализация построена на использовании проекта https://github.com/open62541/open62541

Процесс обмена выступает в качестве клиента для OPC UA серверов. Поддерживает обмен по нескольким каналам (адресам) с переключением между ними в случае пропадания связи. Процесс может работать напрямую с SM через указатель или как отдельно запускаемый процесс работающий с SM через uniset RPC (remote call procedure).

В текущей версии на запись поддерживается только два типа переменных Boolean и Int32. При этом чтение поддерживаются и другие базовые знаковые и беззнаковые типы (int64,int32,int16, int8), но все они преобразуются к int32.

Настройка OPCUAExchange

При старте, в конфигурационном файле ищется секция с названием объекта, в которой указываются настроечные параметры по умолчанию. Пример:

<OPCUAExchange name="OPCUAExchange"
addr1="opc.tcp://localhost:4840"
addr2="opc.tcp://localhost:4841"
timeout="1000"
/>

К основным параметрам относятся

  • addr1, addr2 - адреса OPC серверов. Если addr2 не будет задан, обмен будет происходить только по одному каналу.
  • timeout - Таймаут на определение отсутствия связи и переключения на другой канал обмена (если задан)
  • sidRespond - датчик связи для данного канала

Если подключение к серверу защищено паролем, до задаются поля

  • user1, pass1 - Имя пользователя и пароль для канала N1
  • user2, pass2 - Имя пользователя и пароль для канала N2

Помимо этого в конфигурационной секции поддерживаются следующие настройки

  • polltime - msec, Период цикла обмена
  • updatetime - msec, Период цикла обновления данных в SM
  • reconnectPause - msec, Пауза между попытками переподключения к серверу, в случае отсутсвия связи
  • writeToAllChannels [0,1] - Включение режима записи по всем каналам. По умолчанию датчики пишутся только в активном канале обмена.
  • enableSubscription [0,1] - Включение опроса сервера по подписке.
  • maxNodesPerRead N - Максимальное количество элементов в одном запросе на чтение. Если не задано, то читается все одним запросом.
  • maxNodesPerWrite N - Максимальное количество элементов в одном запросе на запись. Если не задано, то пишется все одним запросом.
  • publishingInterval N(миллисекунды) - Циклический интервал в миллисекундах, когда подписка запрашивается для возврата уведомлений.
  • samplingInterval N(миллисекунды) - Интервал выборки, с которой сервер должен выполнять выборку из своего базового источника на предмет изменения данных. Отрицательное значение означает использовать значение по-умолчанию заданное общим параметром подписки "publishingInterval". "0" используется при подписке на события(не используется сейчас). По-умолчанию значение "-1".
  • timeoutIterate N(миллисекунды) - Время в течении которого прослушивается сеть в ожидании сообщения.

См. так же help uniset2-opcua-exchange -h

Конфигурирование переменных участвующих в обмене с OPC UA

Конфигурационные параметры задаются в секции <sensors> конфигурационного файла. Список обрабатываемых регистров задаётся при помощи двух параметров командной строки

  • --xxx-filter-field - задаёт фильтрующее поле для датчиков
  • --xxx-filter-value - задаёт значение фильтрующего поля. Необязательный параметр.

Пример конфигурационных параметров для запуска с параметрами --opcua-s-filter-field opcua --opcua-s-filter-value 1

<sensors name="Sensors">
...
<item name="MySensor_S" textname="my sesnsor" iotype="DI" opcua="1" opcua_nodeid="AttrName1"/>
<item name="OPCUA_Command_C" textname="opc ua command" iotype="DI" opcua="1" opcua_nodeid="ns=1;s=AttrName2" opcua_tick="2"/>
...
</sensors>
  • opcua_nodeid - Адрес переменной на OPCUA сервере
  • opcua_tick - Как часто опрашивать датчик. Не обязательный параметр, по умолчанию - опрос на каждом цикле. Если задать "2" - то опрос будет производиться на каждом втором цикле и т.п. Циклы завязаны на polltime.
  • opcua_mask - "битовая маска"(uint32_t). Позволяет задать маску для значения. Действует как на значения читаемые, так и записываемые. При этом разрешается привязывать разные датчики к одной и той же переменной указывая разные маски.
  • opcua_type - типа переменной в ПЛК. Поддерживаются следующие типы: bool, byte, int16, uint16, int32, uint32, int64, uint64, float, double(as float) При этом происходит преобразование значения int32_t к указанному типу (с игнорированием переполнения!). Для float,double при преобразовании учитывается поле precision.

Пример поддерживаемого формата для opcua_nodeid:

  • "AttrName" (aka "s=AttrName")
  • "i=13" (integer)
  • "ns=10;i=1" (integer)
  • "ns=10;s=AttrName2" (string)
  • "g=09087e75-8e5e-499b-954f-f2a9603db28a" (uuid)
  • "ns=1;b=b3BlbjYyNTQxIQ==" (base64)

"ns" - namespace index

Управление режимом работы OPCUAExchange

В OPCUAExchange заложена возможность управлять режимом работы процесса. Поддерживаются следующие режимы:

  • emNone - нормальная работа (по умолчанию)
  • emWriteOnly - "только посылка данных" (работают только write-функции)
  • emReadOnly - "только чтение" (работают только read-функции)
  • emSkipSaveToSM - "не записывать данные в SM", это особый режим, похожий на emWriteOnly, но отличие в том, что при этом режиме ведётся полноценый обмен (и read и write), только реально данные не записываются в SharedMemory(SM).
  • emSkipExchnage - отключить обмен (при этом данные "из SM" обновляются).

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

  • --prefix-exchange-mode-id либо в конф. файле параметром exchangeModeID="". Константы определяющие режимы объявлены в MBTCPMaster::ExchangeMode.

Обновление датчиков в режиме подписки(происходит не опрос всех датчиков обмена, а работа по подписке)

  • --prefix-enable-subscription включение опроса сервера по подписке. Параметры для работы с подпиской:
  • --prefix-publishing-interval N(миллисекунды) - циклический интервал в миллисекундах, когда подписка запрашивается для возврата уведомлений.
  • --prefix-sampling-interval N(миллисекунды) - интервал выборки.
  • --prefix-timeout-iterate N(миллисекунды) - время в течении которого прослушивается сеть в ожидании сообщения..

Задание ограничения для клиента на количество элементов в одном запросе чтения/записи. Сам параметр находится на сервере и нужно его заранее узнать. Пока это делается не автоматически, а в ручную через параметры.

  • --prefix-maxNodesPerRead максимальное количество элементов в одном запросе на чтение.
  • --prefix-maxNodesPerWrite максимальное количество элементов в одном запросе на запись.

Поведение процесса при ошибке в OPCUA при работе по подписке!

  • --prefix-stop-on-error N - где N[0,1,2], При возникновении исключения(ошибки) при запросе к серверу в момент инициализации подписки на элементы(в общем или какого-то одного элемента) можно выбрать как действовать процессу в этой ситуации, задав определенное значение параметру. Эти значения: 0 - по-умолчанию, ничего не делать процесс продолжит работать как есть. Если в запросе были элементы с неправильным идентификатором, то на них клиент просто не подпишется. 1 - завершение работы только в момент первичной инициализации т.е. когда первый раз запускаемся, то ожидаем что все элементы правильно указаны. 2 - завершение работы при любой ошибке т.е. если в первый раз подписка прошла успешно и происходит переподключение к серверу с ошибками, то завершаем работу. либо параметром в настроечной секции.
  • stopOnError N - где N[0,1,2]