Repo auto make wiki page - ☆Wiki Sandbox - НТЦ 'Комплексные Системы'

CS-OpcuaClient

Клиент OPC UA для системы Дельта.
Используется для чтения данных из серверов OPC UA и записи их в систему Дельта, либо для записи данных параметров системы Дельта в сервер OPC UA.
Для работы необходим .NET Framework 4.6.1 или .NET Core 2.0.

Аргументы командной строки

cs_opcuaclient [#moduleInstance] -r | -u | -run
  • #moduleInstance
    Опциональное наименование экземпляра службы.
  • -regserver (-r, -service)
    Регистрация службы.
  • -unregserver (-u)
    Отмена регистрации службы.
  • -run
    Запуск в режиме приложения (а не в режиме службы Windows NT или демона Unix).

Формат конфигурационного файла

Конфигурационная службы загружается из папки установки службы из xml-файла cs_opcuaclient.moduleInstance.config, где moduleInstance - наименование экземпляра службы.
Если используется экземпляр службы по умолчанию, то имя конфигурационного файла - cs_opcuaclient.config.

<?xml version="1.0" encoding="utf-8"?>
<configuration
    traceFileSizeLimit="int, bytes"    [ 3145728 ]
    logFileSizeLimit="int, bytes"    [ 1048576 ]
    appCertificate="file_path" 
    > 

  <instances file="configlist_path" >
    <instance
        name="string" 
        traceLevel="trace_level"    [ Off ]
        type="inst_type"    [ D8RegularInstance ]
        clientllConstr="clientll_constr" 
        paramDbConstr="paramdb_constr" 
        metaDbConstr="metadb_constr"    [ paramDbConstr ]
        archiveConstr="archive_constr" 
        />
    <instance />
    ...
  </instances>

  <objects>
    <object
        name="string" 
        traceLevel="trace_level"    [ Off ]
        />
    <opcServer
        name="string" 
        traceLevel="trace_level"    [ Off ]
        channelTraceLevel="trace_level"    [ Off ]
        url="url_string" 
        reserveUrl="url_string"    [ not set ]
        ignoreDiscovery="true|false"    [ false ]
        securityMode="None|Sign|SignAndEncrypt|Invalid"    [ None ]
        userTokenType="Anonymous|UserName|Certificate|IssuedToken|Kerberos"    [ Anonymous ]
        userName="string" 
        userPassword="string"    [ empty ]
        userCertificate="file_path"    [ <configuration>.appCertificate ]
        dataWatchdog="time_span" 
        debugSimDisconnect="true|false" 
        />
    ...
  </objects>

  <threads>
    <thread
        name="string" 
        traceLevel="trace_level"    [ Off ]
        watchdogPeriod="time_span"    [ 10m ]
        instance="instance_name" 
        object="object_name" 
        >
      <objectives>
        <objective
            name="string" 
            traceLevel="trace_level"    [ <thread>.traceLevel ]
            instance="instance_name"    [ <thread>.instance ]
            object="object_name"    [ <thread>.object ]
            function="string" 

          ( Настройки расписания )
            enabled="true|false"    [ true ]
            updateRate="time_span"    [ 0s ]
            schedule="schedule_string"    [ not set ]
            retryDelay="time_span"    [ 0s ]
            minRetryDelay="time_span"    [ 0s ]
            maxRetryDelay="time_span"    [ 0s ]
            retry="int"    [ -1 ]
            itemRetry="int"    [ -1 ] ( не используется )
            immediate="true|false"    [ false ]

          ( Настройки цикла запросов )
            cycleStartPosition="First|Same|Next"    [ Next ]
            cycleErrorAction="Abort|Skip"    [ Skip ]
            cycleRestartRetryCount="int"    [ 0 ]

            >
          <tasks>
            <task
                name="string" 
                traceLevel="trace_level"    [ <objective>.traceLevel ]
                instance="instance_name"    [ <objective>.instance ]
                object="object_name"    [ <objective>.object ]
                function="string" 
                type="string" 

              ( Настройки расписания )
                enabled="true|false"    [ true ]
                updateRate="time_span"    [ 10s ]
                schedule="schedule_string"    [ not set ]
                retryDelay="time_span"    [ 0s ]
                minRetryDelay="time_span"    [ 30s ]
                maxRetryDelay="time_span"    [ 0s ]
                retry="int"    [ -1 ]
                itemRetry="int"    [ -1 ] ( не используется )
                immediate="true|false"    [ false ]

                subscriptionUpdateRate="time_span"    [ updateRate ]

                enablePartialRun="true|false"    [ true ]
                d8IdBase="string"    [ not set ]
                objIdBase="string"    [ not set ]
                srcIdBase="string"    [ not set ] ( альтернатива для objIdBase или d8IdBase )
                dstIdBase="string"    [ not set ] ( альтернатива для objIdBase или d8IdBase )
                >
              <items>
                <item
                    objId="node_id|node_path" 
                    d8Id="local_id|local_sid" 
                    d8Type="A|D|V|R"    [ A ]
                    d8MetaType="type_shortname"    [ not set ]
                    srcId="param_id"    ( альтернатива для objId или d8Id )
                    dstId="param_id"    ( альтернатива для objId или d8Id )

                    objEncoding="encoding" 
                    d8Encoding="encoding" 
                    srcEncoding="encoding"    ( альтернатива для objEncoding или d8Encoding )
                    dstEncoding="encoding"    ( альтернатива для objEncoding или d8Encoding )

                    nativeType="RuntimeType"    [ Null ]
                    paramType="A|D|V|Null"    [ Null ]
                    bindingFlags="ParamValueBindingFlags"    [ WriteAnyValue ]
                    writeParts="Value|SourceTimestamp|ServerTimestamp|StatusCode|State|Quality|XState"    [ Value ]

                    coef="double"    [ 1.0 ]
                    coefB="double"    [ 0.0 ]
                    shift="int"    [ 0 ]
                    mask="uint"    [ 0xffffffff ]
                    />
                <item ... />
                ...
              </items>
            </task>
            <task ... />
            ...
          </tasks>
        </objective>
        <objective ... />
        ...
      </objectives>
    </thread>
    <thread ... />
    ...
  </threads>

</configuration>

Элемент configuration

Атрибуты корневого элемента конфигурации:

  • appCertificate
    Путь к файлу, который содержит сертификат приложения (этого экземпляра службы).
    Сертификат должен быть сертификатом X509 с закрытым ключом в формате .pfx.
    По умолчанию используется сертификат, загружаемый из ресурсов службы.
    Если указано значение appCertificate="null", то сертификат не используется.
  • traceFileSizeLimit
    Размер в байтах, до которого ограничивается файл журнала трассировки.
  • logFileSizeLimit
    Размер в байтах, до которого ограничивается файл журнала работы службы. Используется только, если журнал работы ведется в текстовом файле.

Элементы instances

Этот элемент либо содержит путь на внешний файл с описанием подсистем, либо содержит само описание в элементах <instance>.
Из этих подсистем будут загружены и инициализированы только те, на которые ссылаются цели службы, задачи службы и их элементы (<objective>, <task> и <item>).

Чтобы подсистемы загружались из внешнего файла, должен быть указан атрибут:

  • file
    Путь до файла configlist, содержащего описания подсистем.

Элементы instance

Каждый xml-элемент <instance> означает подключение к подсистеме Дельта. Атрибуты xml-элемента:

  • type
    Тип реализации.
  • name
    Имя объекта. Используется как идентификатор внутри службы.
  • traceLevel="trace_level"
    Уровень трассировки. Определяет то, насколько подробным будет вывод в файл трассировки применительно к событиям этой подсистемы (точнее, подключения к этой подсистеме).
    Возможные значения: Off, Critical, Error, Warning, Information, Verbose, Verbose2, Verbose3, Verbose4, All.
  • clientllConstr
    Строка подключения по протоколу ClientLL.
  • paramDbConstr
    Строка подключения к БД НСИ.
  • metaDbConstr
    Строка подключения к БД мета-информации. По умолчанию считается равной paramDbConstr.
  • archiveConstr
    Строка подключения к архивной БД.

Элемент может содержать другие атрибуты и вложенные элементы в зависимости от того, какой тип реализации используется.

Элементы objects

Внутри элемента <objects> содержится описание "объектов службы". Каждый объект - это сущность, представляющая определенный ресурс, используемый службой.
Разновидность ресурса определяется именем xml-элемента, который описывает объект, представляющий этот ресурс. Для описания подключения к OPCUA-серверу используется элемент @<opcServer>.

Элементы opcServer

Каждый элемент <opcServer> описывает один сервер OPC UA, обрабатываемый службой. Его атрибуты:

  • name
    Логическое имя OPC-сервера. Используется для логирования.
  • traceLevel
    Уровень трассировки событий, связанных с обработкой этого OPC-сервер.
  • channelTraceLevel
    Уровень трассировки событий, связанных с обработкой канала связи с этим OPC-сервером.
  • url
    Строка URL OPC-сервера. Содержит адрес, порт и протокол, используемые для подключения к OPC-серверу. На данный момент реализован только протокол OPC TCP, поэтому строка URL должна начинаться с
    opc.tcp://

    Нпример:
    url="opc.tcp://127.0.0.1:51210"
  • reserveUrl
    URL резервного OPC-сервера. Если указан reserveUrl, то служба будет поочередно менять URL с основного (url) на резервный при каждой ошибке подключения.
  • ignoreDiscovery
    Если включено, то информация о точках подключения (эндпоинтах), получаемая от сервера, имеет меньший приоритет, чем настройки из конфигурационного файла.
  • securityMode
    Режим безопасности соединения, который нужно использовать для подключения к серверу.
  • userTokenType
    Тип аутентификации на сервере.
  • userName
    Для userTokenType="UserName".
    Имя пользователя.
  • userPassword
    Для userTokenType="UserName".
    Пароль пользователя.
     
  • userCertificate
    Для userTokenType="Certificate".
    Путь к файлу, который содержит сертификат пользователя для аутентификации на сервере.
    Сертификат должен быть сертификатом X509 с закрытым ключом в формате .pfx.
    По умолчанию используется сертификат приложения, пути которого задается в <configuration>.appCertificate.
  • dataWatchdog
    Период сторожевого таймера на приём данных. Если за указанный период времени не будет получено полезной информации, то соединение с OPC-сервером будет полностью переинициализировано.
    По умолчанию не используется.
  • debugSimDisconnect
    Если "true", то соединение с этим OPC-сервером будет принудительно разрываться. Используется для отладки процессов восстановления связи.

Элементы thread

Элемент <thread> описывает один поток выполнения службы, внутри которого обрабатываются цели и задачи службы. Все такие потоки работают параллельно друг другу.
Атрибуты:

  • name
    Логическое имя потока. Используется для логирования.
  • traceLevel
    Уровень трассировки событий, связанных с обработкой этого потока. Также используется как значение по умолчанию для уровня трассировки обрабатываемых внутри этого потока целей.
  • watchdogPeriod
    Период сторожевого таймера потока. Если процедуры, вызываемые для обработки целей задач внтури этого потока, будут выполняться дольше указанного времени, то поток будет принудительно перезапущен.
  • instance
    Имя подсистемы (из <instances>), которое будет использовано по умолчанию целями, обрабатывыемыми этим потоком.
  • object
    Имя объекта службы (из <objects>), которое будет использовано по умолчанию целями, обрабатывыемыми этим потоком.

Цели, обрабатываемые внутри потока, указываются в элементах <objectives>.<objective>. Поток в цикле выполняет обработку всех целей последовательно, делает паузу в 500 мс и начинает цикл занова.
При этом обработка цели может состоять только из проверки её внутринних расписаний обработки, если время обработки цели еще не настало.

Элементы objective

Элемент <objective> описывает цель службы, в рамках которой выполняется набор задач.
Обработка цели службы состоит в выполнении набора задач. За одну итерацию обработки цикла задач выполняется попытка выполнения каждой задачи последовательно по одному разу.
При этом отдельно задаются временные настройки для запуска цикла обработки задач и отдельно для каждой из задач.
Если время выполнения задачи еще не наступило, то её обработка на этом завершается и цикл обработки переходит к следующей задаче.
Все временные настройки, указанные в атрибутах элемента <objective> относятся только к настройкам для запуска цикла обработки задач.

Атрибуты <objective>:

  • name
    Логическое имя потока. Используется для логирования.
  • traceLevel
    Уровень трассировки событий, связанных с обработкой этой цели. Также используется как значение по умолчанию для уровня трассировки обрабатываемых внутри этого потока задач.
  • instance
    Имя подсистемы (из <instances>), которое будет использовано по умолчанию задачами, обрабатывыемыми в рамках этой цели.
  • object
    Имя объекта службы (из <objects>), которое будет использовано по умолчанию задачами, обрабатывыемыми в рамках этой цели.
  • function
    Функция цели. Не используется.
  • enabled
    Определяет то, разрешено ли выполнение цикла задач.
  • updateRate
    Периодичность запуска цикла задач. Если указано расписание, то цикла задач обрабатывается не чаще, чем с периодом updateRate.
  • minRetryDelay
    Минимальное время до повторной попытки выполнения цикла задач, после неудачного завершения предыдущей попытки. Время отчситывается от времени начала предыдущей итерации.
    Если ноль, то ограничение не используется, а следующая попытка произойдет по обчному расписанию.
  • maxRetryDelay
    Максимальное время до повторной попытки выполнения цикла задач, после неудачного завершения предыдущей попытки. Время отчситывается от времени начала предыдущей итерации.
    Если ноль, то ограничение не используется, а следующая попытка произойдет по обчному расписанию.
  • retryDelay
    Еисл указано, то задает одновременно и minRetryDelay, и maxRetryDelay.
  • retry
    Максимальное число неудачных попыток выполнения цикла задач, после которых счетчик повторов сбрасывается, а момент следующей итерации вычисляется по обычному расписанию (так, как если бы последняя попытка завершилась удачно).
    Значение -1 означает, что количество попыток не ограничено.
  • immediate
    Если true, то цикл задач будет принудительно выполнен немедленно на старте потока, после чего флаг принудительного выполнения будет сброшен в случае успешного выполнения операции.
  • cycleStartPosition
    Определяет то, с какой задачи начинается выполнение цикла задач.
    • First - цикл всегда начинается с первой задачи;
    • Same - цикл начинается с той же задачи, на которой цикл был прерван в прошлый раз;
    • Next - цикл начинается с задачи, следующей за той, на которой цикл был прерван в прошлый раз (с переходом к началу цикла).
  • cycleErrorAction
    Определяет политику обработки ошибок при выполнении задач:
    • Abort - обработка цикла задач завершается с ошибкой, если при выполнении задачи происходит ошибка;
    • Skip - если при выполнении задачи происходит ошибка, то цикл переходит к следующей задаче.
  • cycleRestartRetryCount
    Если cycleStartPosition="Same", то определяет максимальное количество неудачных попыток выполнения цикла задач, после которого цилк задач будет начат с первой задачи.

Элементы task

Элемент <task> описывает задачу, выполняемую в рамках обработки цели службы.

Атрибуты <task>:

  • name
    Логическое имя задачи. Используется для логирования.
  • traceLevel
    Уровень трассировки событий, связанных с обработкой этой задачи.
  • instance
    Имя подсистемы (из <instances>), котороя будет использована для выполнения задачи. В зависимости от типа задачи, указанная подсистема используется либо в качестве источника данных, либо в качестве приемника данных.
  • object
    Имя объекта службы (из <objects>), которояйбудет использована для выполнения задачи. В зависимости от типа задачи, указанный объект используется либо в качестве источника данных, либо в качестве приемника данных.
  • task
    Тип задачи.
    Для задач, связанных с OPCUA, определены следующие типы:
  • ReadCurrent - чтение (синхронное) из OPCUA, который считается объектом-источником и запись в подсистему Дельта (которая считается объектом-получателем);
  • WriteCurrent - получение данных из подсистемы Дельта (которая считается объектом-источником) и запись в OPCUA (который считается объектом-получателем);
  • SubscribeCurrent - подписка на изменения данных в OPCUA (который считается объектом-источником) и запись в подсистему Дельта (которая считается объектом-получателем);
  • TestConnect - тест соединения.
  • function
    Функция задачи.
    Для задачи типа TestConnect для OPCUA определена функция Dump - создание дампа пространства узлов сервера OPCUA. При успешном выполнении задачи, дамп сохраняется в файл, в выполнение задачи запрещается.
  • enabled
    Определяет то, разрешено ли выполнение задачи.
  • updateRate
    Периодичность выполнения задачи. Если указано расписание, то задача выполняется не чаще, чем с периодом updateRate.
  • minRetryDelay
    Минимальное время до повторной попытки выполнения задачи, после неудачного завершения предыдущей попытки. Время отчситывается от времени начала предыдущей итерации.
    Если ноль, то ограничение не используется, а следующая попытка произойдет по обчному расписанию.
  • maxRetryDelay
    Максимальное время до повторной попытки выполнения задачи, после неудачного завершения предыдущей попытки. Время отчситывается от времени начала предыдущей итерации.
    Если ноль, то ограничение не используется, а следующая попытка произойдет по обчному расписанию.
  • retryDelay
    Еисл указано, то задает одновременно и minRetryDelay, и maxRetryDelay.
  • retry
    Максимальное число неудачных попыток выполнения задачи, после которых счетчик повторов сбрасывается, а момент следующей итерации вычисляется по обычному расписанию (так, как если бы последняя попытка завершилась удачно).
    Значение -1 означает, что количество попыток не ограничено.
  • immediate
    Если true, то задача будет принудительно выполнена немедленно на старте потока, после чего флаг принудительного выполнения будет сброшен в случае успешного выполнения операции.
  • subscriptionUpdateRate
    Период обновления данных для подписки. Используется только для задач, использующих подписку на данные в объекте-источнике.
  • enablePartialRun
    Определяет, разрешено ли выполнять задачу, если не все элементы задачи готовы (все элементы найдены в объекте-источнике, или у всех элементов задачи имеются достоверные значения и пр.).
  • srcIdBase
    Строка, задающая базу для относительных идентификаторов параметров объекта-источника. Будет использована совместно с относительными идентификаторами, указанными в элементах задачи (<item>.srcId).
  • dstIdBase
    Строка, задающая базу для относительных идентификаторов параметров объекта-приемника. Будет использована совместно с относительными идентификаторами, указанными в элементах задачи (<item>.dstId).
  • d8IdBase
    Может быть использовано вместо srcIdBase, если подсистема instance - это источник данных.
    Может быть использовано вместо dstIdBase, если подсистема instance - это получатель данных.
    Задает число, которое будет прибавлено к LocalId параметров Дельта, указанных в <item>.d8Id>.
  • objIdBase
    Может быть использовано вместо srcIdBase, если объект object - это источник данных.
    Может быть использовано вместо dstIdBase, если объект object - это получатель данных.
    Строка, задающая базу для относительных идентификаторов параметров объекта. Будет использована совместно с относительными идентификаторами, указанными в <item>.objId.
    Для сервера OPCUA (объектов opcServer) полный идентификатор параметра получается простой конкатенацией <task>.objIdBase с <item>.objId.

Элементы item

XML-элемент <item> описывыет элемент задачи, задавая то, какой параметр объекта-источника использовать, как интерпретировать данные параметра объекта-источника, как их обрабатывать и в какой параметр объекта-получателя нужно данные сохранять.

Атрибуты <item>:

  • srcId
    Идентификатор параметра в объекте-источнике.
    Формат зависит от типа объекта.
    Может означать относительный идентификатор, если в задаче задано базовое значение - <task>.srcIdBase.
    Если объект-источник - это подсистема Дельта, то вместо srcId можно указывать атрибуты d8Id, d8Type, d8MetaType.
    Если объект-получатель - это подсистема Дельта, то вместо srcId можно указать атрибут objId.
  • dstId
    Идентификатор параметра в объекте-получателе.
    Формат зависит от типа объекта.
    Может означать относительный идентификатор, если в задаче задано базовое значение - <task>.dstIdBase.
    Если объект-получатель - это подсистема Дельта, то вместо dstId можно указывать атрибуты d8Id, d8Type, d8MetaType.
    Если объект-источник - это подсистема Дельта, то вместо dstId можно указать атрибут objId.
  • objId
    Идентификатор параметра целевого объекта.
    Если целевой объект - это сервер OPCUA, то objId - это либо NodeId узла, либо путь узла, относительно стандартного (для OPCUA) корневого узла.
    Строка для NodeId узла имеет следующий формат:
      NodeIdString ::= <NamespaceDef> ";" <LocalNodeId>
      NamespaceDef ::= "ns=" <NamespaceIndex>
      LocalNodeId ::= ("i=" <IntId>) | ("s=" <StringId>) | ("g=" <GuidId>) | ("b=" <ByteId>) | ("b64=" <ByteIdBase64>)
      

    Наример:
      ns=1;i=102
      ns=2;s=Folder.Subfolder.Tag01
      ns=3;g=879a204b-32c2-42aa-a753-2b747029e50c
      ns=4;b=6173646667686AD3E1
      ns=4;b64=MTJ3c2RlNDM=
      

    Если objId не начинается с ns=, то считается что указан путь узла. Путь отсчитывает от узла SystemNodeIds.Object_RootFolder (это стандартный корневой узел для дерева узлов OPC-сервера).
    Например:
      Objects/Server/Tank1/Pressure/Chan-A
      

    Здесь символ / используется как разделитель (обозначает связь к следующему узлу в пути). Его можно экранировать символом &.
  • d8Id
    Целочисленный идентификатор LocalId параметра Дельта.
  • d8Type
    Тип параметра Дельта:
    • A - аналоговый
    • D - дискретный
    • V - векторный
    • R - структурный
  • d8MetaType
    Краткое название метатипа параметра Дельта.
  • d8Encoding
    Строка определения кодировки значения параметра подсистемы Дельта. Определяется автоматически, если указан d8Type. См. [ Описание кодирования значения ]
  • nativeType="RuntimeType" [ Null ]
    Тип данных (из перечисления RuntimeType), который считается нативным для этого элемента. Это такой тип данных, который наиболее удобен/оптимален для работы с этим элементом задачи.
    Возможные варианты:
    • Boolean
    • SByte
    • Byte
    • Int16
    • Int32
    • Int64
    • UInt16
    • UInt32
    • UInt64
    • Float
    • Double
    • String
    • и другие
  • paramType
    Тип параметра задачи. Определяет, то как будут обрабатываться данные, поступающие из объекта-источника и записываемые в объект-получатель.
    Это не то же самое, что атрибут d8Type, который является частью идентификатора параметра Дельта наряду с d8Id и d8MetaType. Однако, если paramType не задан, а d8Type определен, то в качестве значения paramType будет использовано значение d8Type.
    Варианиты:
    • A - аналоговый
    • D - дискретный
    • V - векторный
    • Null - тип не задан
  • bindingFlags="ParamValueBindingFlags" [ WriteAnyValue ]
    Настройки передачи значения из объекта-источника в объект-получатель. Может быть комбинацией следующих значений:
    • WriteOnValueChange - Выполнять запись при изменении значения.
    • WriteOnTimestampChange - Выполнять запись при изменении метки времени.
    • WriteOnStateChange - Выполнять запись при изменении состояния.
    • WriteOnXStateChange - Выполнять запись при изменении расширенного состояния.
    • WriteInitialValue - Выполнять запись для исходного значения.
    • WriteOnAnyChange - Выполнять запись при любом изменении.
    • WriteAnyValue - Выполнять запись любого значения (исходного и каждого, из принимаемых далее).
    • WritePeriodic - Выполнять запись периодически (а не по изменению).
  • writeParts="Value|SourceTimestamp|ServerTimestamp|StatusCode|State|Quality|XState" [ Value ]
    Определяет, какая информация записывается в OPC-узел. Это может быть комбинация значений через вертикальную черту:
    • Value - значение (числовое значение параметра Дельта)
    • StatusCode - код статуса (получается конвертированием из статуса параметра Дельта)
    • SourceTimestamp - исходная метка времени (приравнивается метке времени параметра Дельта)
    • ServerTimestamp - серверная метка времени (приравнивается метке времени параметра Дельта)
    • State - статус параметра Дельта
    • Quality - качесто параметра
    • XState - расширенное состояние параметра
  • coef
    Коэффициент, на который умножается значение при трансформации.
  • coefB
    Коэффициент, который прибавляется к значению при трансформации.
     
  • shift
    Количество битов, на которое сдвигается значение при трансформации. Положительные значения означают сдвиг вправо, отрицательные - влево.
  • mask
    Битовая маска, но которую побитово умножается значение при трансформации. Можно задавать в шестнадцатиричной форме.

Поток данных внутри элемента задачи

В общем случае обработка элемента задачи выполняется так:
  • значение принимается от параметра объекта-источника с идентификатором srcId;
  • значение декодируется, исходя из того, что объект-источник отправил его в кодировке srcEncoding;
  • тип значения преобразуется к типу данных nativeType с использованием paramType;
  • значение сохраняется в памяти как новое текущее значение элемента задачи;
  • выполняется трансформация значения с учетом coef, coefB, shift, mask;
  • тип значения преобразуется к типу, указанному в dstEncoding;
  • значение кодируется кодировкой dstEncoding;
  • значение записывается в параметр объекта-получателя с идентификатором dstId.

Некоторые этапы могут отстутствовать в зависимости от настроек.
Если определена трансформация значения, то всегда выполняется прямое преобразование, кроме случае, когда тип задачи установлен как <task>.type="WriteCurrent".

Трансформация значений

При получении значения x от OPC-сервера, значение трансформируется в y перед тем, как оно будет отправлено в Дельта. Применяется следующее преобразование x -> y (прямое):

  при shift >= 0:
    y = ( (x * coef + coefB) >> shift ) & mask
  при shift < 0:
    y = ( (x * coef + coefB) << (-shift) ) & mask

При получении значения y от Дельта, значение трансформируется в x перед тем, как оно будет записано в OPC. Выполняется обратное преобразование y -> x (обратное):

  при shift >= 0:
    x = ( ( (y & mask) << shift ) - coefB ) / coef
  при shift < 0:
    x = ( ( (y & mask) >> (-shift) ) - coefB ) / coef

Задачи для OPCUA

ReadCurrent

<task type="ReadCurrent">

Выполняется периодическое чтение значений OPC-узлов с помощью OPC-сервиса Read.
Прочитанные данные отправляются в Дельта в качестве новых текущих значений параметров Дельта, сопоставленных с OPC-узлами.
Если статус полученного значения OPC-узла не является достоверным (Good), то такое значение не записывается в Дельта.

SubscribeCurrent

<task type="SubscribeCurrent">

Создается подписка OPCUA. Для каждой такой задачи создается своя подписка OPCUA, но все они создаются в одной сессии OPCUA.
Атрибут subscriptionUpdateRate задает запрашиваемый период публикации данных. Если он не задан, то используется значение updateRate.
OPCUA-сервер может пересмотреть это значение.
Получаемые по подписке значения отправляются в Дельта в качестве новых текущих значений параметров Дельта, сопоставленных с OPC-узлами.
Если статус полученного значения OPC-узла не является достоверным (Good), то такое значение не записывается в Дельта.

WriteCurrent

<task type="WriteCurrent">

Выполняется периодическая запись значений OPC-узлов с помощью OPC-сервиса Write.

 УСТАРЕЛО
     Запись выполняется по следующему алгоритму. Служба подписывается на изменения значений параметров Дельта, сопоставленных с OPC-узлами в этой группе.
     Периодически служба проверяет, можно ли в настоящий момент выполнить запись данных.
     Если для каждого параметра в группе службе известно (уже получено) достоверное значение параметра Дельта (такое, что статус параметра не содержит битов из маски @ErrorMask@), то только тогда служба выполняет попытку записи всех значений в OPC-сервер одним запросом.
     Вне зависимости от результата выполнения операции записи, служба отмечает имеющиеся значения как обработанные.
     Следующая попытка записи будет выполнена только когда служба снова получит достоверное значение для каждого из параметров в группе. 

TestConnect - Diag

<task type="TestConnect" function="Diag" >
  <items>
    <item srcId="FailoverIndex" d8Id="..." d8Type="..." />
  </items>
</task>
Используется для передачи в Дельта диагностической информации. Такой запрос должен содержать только специальные диагностические параметры, для которых определены специальные идентификаторы srcId:
  • FailoverIndex
    Значение этого параметра равно 0, если связи нет; 1 - если на связи основной OPC-сервер; 2 - если на связи резервный OPC-сервер.
    Метка времени этого параметра приравнивается текущему времени.

TestConnect - Dump

<task type="TestConnect" function="Dump" />

Используется для отладки.
Выполнение задачи заключается в том, что служба пытается получить полное дерево всех узлов сервера OPCUA.
Используемый сервер - это объект-источник задачи, объект-получатель не используется.
Полученная информация сохраняется в текстовый файл в папке выполнения службы.
После удачного выполнения задача деактивируется и больше не повторяется.

Логирование

Журнал работы службы может сохраняться в двух местах:
  • Системный журанл Windows с названием "DeltaLog - D8 OpcuaClient". В этом случае в качестве имени источника событий используется наименование экземпляра службы moduleInstance, указанное при регистрации службы. Если экземпляр службы не был указан, то используется имя источника событий cs_opcuaclient.
  • Текстовый файл в папке установки службы. В этом случае в качестве имени log-файла используется cs_opcuaclient.moduleInstance.log, или cs_opcuaclient.log.

Кроме журнала работы служба ведет трассировку менее важных событий, сохраняя их в текстовый файл в папке установки службы. В качестве имени файла трассировки используется cs_opcuaclient.moduleInstance.trace, или cs_opcuaclient.trace.

То, насколько подробной будет трассировка, задается в конфигурации службы. Возможные уровни трассировки trace_levels, используемые в конфигурационном файле:
  • Off - трассировка выключена
  • Critical - трассировка только критических ошибок
  • Error - трассировка всех ошибок
  • Warning - трассировка ошибок и предупреждений
  • Information - трассировка информационных событий, предупреждений и ошибок
  • Verbose - подробная трассировка
  • Verbose2 - отладочная трассировка, уровень 2
  • Verbose3 - отладочная трассировка, уровень 3
  • Verbose4 - отладочная трассировка, уровень 4
  • All - полная трассировка

Некоторые многострочные сообщения, выводимые в журнал трассировки, ограничиваются по количеству выводимых строк в зависимости от уровня трассировки.
Когда такое ограничение применяется, к сообщению обязательно добавляется строка с многоточием. Чтобы в журнал трассировки записывалось больше строк, нужно увеличить traceLevel.
Минимальное значения для такого ограничения - это 25 строк. На следующем (более подробном) уровне трассировки будет выводиться в 5 раз больше строк, и так далее.
При traceLevel="All" огрничение не используется.

История версий

  • 0.2.21.0420
    • Изменения в ядре OPC.
  • 0.2.21.0406
    • Добавлено логирование значений, записываемых в OPCUA.
    • Исправлено значение по умолчанию для writeParts. Теперь это "Value", а было пустое значение.
    • Добавлен полный синтаксис для относительных путей узлов.
    • Исправлена ошибка в обработке записи, которая могла приводить к тому, что записывались не все значения, а только те, что выводились в трэйс.
    • Изменена логика подробной трассировки.
  • 0.2.21.0324
    • Добавлена обработка dataWatchdog во время установки соединения (канала и сессии).
    • Улучшена обработка watchdogPeriod для потоков.
  • 0.2.21.0319
    • Исправлена ошибка, из-за которой значение reserveUrl могло не использоваться.
  • 0.2.21.0303
    • Изменения в ядре OPC.
  • 0.2.21.0218
    • Улучшена трассировка значений узлов при чтении и подписке. Теперь выводятся идентификаторы узлов как они указаны в конфигурационном файле (раньше выводились служебные дескрипторы).
  • 0.2.21.0209
    • Добавлена поддержка указания URL резервного OPC-сервера.
    • Добавлен диагностический параметр состояния связи с OPC-сервером.
  • 0.2.20.1222
    • Добавлена поддержка относительных идентификаторов Дельта (атрибут d8IdBase).
    • Добавлена возможность загрузки инстансов из внешнего файла configlist.
    • Добавлена поддержка экранирования разделителя в путях узлов OPC UA (символ /) с помощью символа &.
  • 0.2.20.1217
    • Добавлена задача TestConnect и функция Dump - создание дампа дерева узлов сервера OPCUA.
    • Добавлена функция запроса NodeId узлов у сервера по их путям.
    • Добавлено кэширование данных, используемых для запросов чтения из OPCUA.
  • 0.2.20.1202
    • Служба переведена на стандартную базу для сервисов.
    • Изменен формат конфигурационного файла.
    • Добавлены различные режимы записи значений параметров.
  • 0.1.20.1111
    • Добавлена настройка уровня трассировки для каналов связи OPC.
    • Добавлен сторожевой таймер для приема данных.
    • Добавлен сторожевой таймер для рабочего потока службы.
  • 0.1.20.1109
    • Улучшена реализация восстановления сессии после разрыва связи.
    • Базовая поддержка чтения по подписке.
  • 0.1.20.1105
    • Добавлено преобразование из типа OPC UA DateTime в значение аналогвого параметра в виде OADate.
    • Добавлено преобразование из типа OPC UA String в значение векторного параметра.
    • Улучшена обработка исключений в ядре.
  • 0.1.20.1026
    • Добавлен вывод кодов ошибок StatusCode в виде текста.
    • Исправлена ошибка с удалением очереди сообщений в канале OpcTcp.
  • 0.1.20.1020
    • Добавлена поддержка шифрования соединения OPC UA.
    • Добавлена поддержка аутентификации парой имя пользователя/пароль и сертификатом X509.
    • Добавлена поддержка коэффициентов coef и coefB для линейной трансформации значеий параметров.
    • Добавлена поддержка настроек shift и maskB для побитовой трансформации значеий параметров.
  • 0.0.20.0322
    Бета-версия.

Ссылки

[1]   Формат строки расписания

[2]   Описание кодирования значения