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