Общее описание 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.