UniSet 2.32.1
(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] - Включение режима записи по всем каналам. По умолчанию датчики пишутся только в активном канале обмена.

См. так же 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.