exponenta event banner

Обзор пространства имен сервера OPC UA

В этом примере показано, как найти серверы OPC Unified Architecture (UA), подключиться к ним и просмотреть их пространство имен, чтобы найти интересующие узлы. Чтобы запустить этот пример в сессии MATLAB, необходимо установить и запустить Prosys OPC UA Simulation Server. Дополнительную информацию см. в разделе Начало работы в документации OPC Toolbox.

Серверы OPC UA структурируют доступные данные через одно или несколько пространств имен, состоящих из нескольких подключенных узлов. Каждое пространство имен имеет индекс, однозначно идентифицирующий это пространство имен. Панель инструментов OPC предоставляет два типа узлов OPC UA: узлы объектов, которые помогают организовать данные, и переменные узлы, которые хранят данные в свойстве Value. Узлы переменных могут содержать другие узлы переменных в качестве дочерних узлов.

Все серверы OPC UA должны публиковать узел Server, содержащий информацию о сервере OPC UA, включая возможности этого сервера, доступные функциональные возможности сервера и другую диагностическую информацию. Узел Server должен существовать как индекс пространства имен 0 с именем Server. В этом примере рассматривается узел ServerCapabilities, содержащийся в узле Server примера сервера OPC UA.

Обзор доступных серверов OPC UA на хосте

ПРИМЕЧАНИЕ: В этом разделе этого примера требуется установить службу локального обнаружения и настроить сервер моделирования OPC UA Prosys для регистрации в LDS. Инструкции по выполнению этих действий содержатся в разделе «Начало работы» документации OPC Toolbox.

Серверы OPC UA могут регистрироваться в локальной службе обнаружения на своем хосте. Локальная служба обнаружения (LDS) публикует все доступные серверы, а также их уникальный «адрес» (или URL) для подключения к этому серверу.

Можно обнаружить серверы OPC UA, доступные на хосте, с помощью opcuaserverinfo. В этом примере используется локальный хост.

serverList = opcuaserverinfo('localhost')
serverList = 

1×3 OPC UA ServerInfo array:
    index              Description                           Hostname               Port 
    -----  -----------------------------------  ----------------------------------  -----
      1    SimulationServer                     tmopti01win1064.dhcp.mathworks.com  53530
      2    UA Sample Server                     tmopti01win1064                     51210
      3    Quickstart Historical Access Server  tmopti01win1064                     62550

Список серверов показывает доступные серверы OPC UA, а также имя хоста и номер порта, на которых можно подключиться к серверу. Можно найти определенный сервер, выполнив поиск в разделе Описание серверов. Найдите сервер, содержащий слово «Simulation».

sampleServerInfo = findDescription(serverList, 'Simulation')
sampleServerInfo = 

OPC UA ServerInfo 'SimulationServer':

   Connection Information
    Hostname: 'tmopti01win1064.dhcp.mathworks.com'
        Port: 53530

Создание клиента OPC UA и подключение к серверу

Для просмотра пространства имен сервера необходимо создать клиент OPC UA и подключить его к серверу. Если известно имя узла и порт сервера OPC UA, можно просто создать клиент OPC UA с использованием имени узла и аргументов порта.

uaClient = opcua('localhost', 53530);

Если вы ранее обнаружили сервер с помощью opcuaserverinfo , можно создать клиент непосредственно из opcuaserverinfo результаты.

uaClient = opcua(sampleServerInfo)
uaClient = 

OPC UA Client SimulationServer:
                     Hostname: tmopti01win1064.dhcp.mathworks.com
                         Port: 53530
                      Timeout: 10

                       Status: Disconnected

Первоначально клиент отключен от сервера и содержит краткое описание свойств клиента. Вы знаете, что клиент отключен путем запроса свойства Status или вызова isConnected функция.

status = uaClient.Status

isConnected(uaClient)
status =

    'Disconnected'


ans =

  logical

   0

После подключения клиента к серверу отображаются дополнительные свойства сервера.

connect(uaClient)
uaClient
uaClient = 

OPC UA Client SimulationServer:
                     Hostname: tmopti01win1064.dhcp.mathworks.com
                         Port: 53530
                      Timeout: 10

                       Status: Connected

                  ServerState: Running

                MinSampleRate: 0 sec
          MaxHistoryReadNodes: 0
      MaxHistoryValuesPerNode: 0
                 MaxReadNodes: 0
                MaxWriteNodes: 0

На дисплее отображается состояние клиента «Connected» (Подключено), сервер находится в состоянии «Running» (Выполняется), и клиент хранит информацию об ограничениях сервера. В этом случае все предельные значения устанавливаются равными нулю, что указывает на то, что на сервере-образце не существует предельного значения частоты дискретизации, максимальных узлов или значений для операций чтения.

Просмотр пространства имен сервера

Пространство имен сервера постепенно извлекается непосредственно в переменную клиента OPC UA в MATLAB. Доступ к верхнему уровню пространства имен сервера осуществляется с помощью Namespace собственность. Это свойство хранит узлы OPC UA. Каждый узел может содержать один или несколько дочерних узлов, которые сами являются узлами.

topNodes = uaClient.Namespace
topNodes = 

1x6 OPC UA Node array:
    index           Name            NsInd        Identifier         NodeType  Children
    -----  -----------------------  -----  -----------------------  --------  --------
      1    Server                   0      2253                     Object    12
      2    MyObjects                2      MyObjectsFolder          Object    1
      3    StaticData               3      StaticData               Object    9
      4    NonUaNodeComplianceTest  4      NonUaNodeComplianceTest  Object    33
      5    Simulation               5      85/0:Simulation          Object    7
      6    MyBigNodeManager         6      MyBigNodeManager         Object    1000

Узел с именем 'Server' содержит 12 нижестоящих элементов.

Можно выполнить поиск в пространстве имен с помощью индексирования в свойство Children доступных узлов. Например, чтобы найти узел ServerCapabilities, можно запросить дочерние узлы узла Server.

serverChildren = topNodes(1).Children
serverChildren = 

1x12 OPC UA Node array:
    index         Name          NsInd  Identifier  NodeType  Children
    -----  -------------------  -----  ----------  --------  --------
      1    ServerStatus         0      2256        Variable  6
      2    ServerCapabilities   0      2268        Object    14
      3    ServerDiagnostics    0      2274        Object    4
      4    VendorServerInfo     0      2295        Object    0
      5    ServerRedundancy     0      2296        Object    5
      6    Namespaces           0      11715       Object    1
      7    ServerConfiguration  0      12637       Object    5
      8    NamespaceArray       0      2255        Variable  0
      9    Auditing             0      2994        Variable  0
     10    ServerArray          0      2254        Variable  0
     11    EstimatedReturnTime  0      12885       Variable  0
     12    ServiceLevel         0      2267        Variable  0

Узел ServerCapabilities является вторым узлом в списке.

serverCapabilities = serverChildren(2)
serverCapabilities = 

OPC UA Node object:
                      Name: ServerCapabilities
               Description: Describes capabilities supported by the server.
            NamespaceIndex: 0
                Identifier: 2268
                  NodeType: Object

                    Parent: Server
                  Children: 14 nodes.

Поиск узлов в пространстве имен

Можно искать узлы непосредственно из переменной Node или из свойства Namespace. Поиск узла ServerCapabilities без индексирования в Namespace свойство, использование findNodeByName. Чтобы избежать поиска всех экземпляров узлов, содержащих слово «ServerCapabilities», используйте '-once' параметр.

serverCapabilities = findNodeByName(topNodes, 'ServerCapabilities', '-once')
serverCapabilities = 

OPC UA Node object:
                      Name: ServerCapabilities
               Description: Describes capabilities supported by the server.
            NamespaceIndex: 0
                Identifier: 2268
                  NodeType: Object

                    Parent: Server
                  Children: 14 nodes.

Чтобы найти все узлы, содержащие слово «Double» в имени, запросите все topNodes с помощью '-partial' параметр. Обратите внимание, что этот поиск загрузит все пространство имен в MATLAB, поэтому используйте этот метод поиска с осторожностью.

doubleNodes = findNodeByName(topNodes, 'Double', '-partial')
doubleNodes = 

1x6 OPC UA Node array:
    index          Name           NsInd       Identifier        NodeType  Children
    -----  ---------------------  -----  ---------------------  --------  --------
      1    Double                 4      Double                 Variable  0
      2    DoubleAnalogItemArray  3      DoubleAnalogItemArray  Variable  3
      3    DoubleAnalogItem       3      DoubleAnalogItem       Variable  3
      4    DoubleDataItem         3      DoubleDataItem         Variable  1
      5    DoubleArray            3      DoubleArray            Variable  0
      6    Double                 3      Double                 Variable  0

Общие сведения о типе узла

Узлы имеют тип узла, который описывает, является ли этот узел просто организационной единицей (объектный тип узла) или содержит данные, которые могут быть считаны или записаны (переменный тип узла). Примером узла Object является узел ServerCapabilities, показанный выше. Невозможно считать данные из узла Object. В этом примере: doubleNodes не содержит узлов Object и 6 переменных узлов.

allNodeTypes = {doubleNodes.NodeType}
allNodeTypes =

  1×6 cell array

  Columns 1 through 4

    {'Variable'}    {'Variable'}    {'Variable'}    {'Variable'}

  Columns 5 through 6

    {'Variable'}    {'Variable'}

Переменные типы узлов могут содержать Children - Тип узлов переменных не гарантирует, что узел не содержит нижестоящих элементов. Второй узел в списке является переменным узлом (и поэтому его значение может быть прочитано), но также имеет дочерние узлы (которые могут быть прочитаны по отдельности). Сведения о считывании значений из узла см. в разделе readValue.

Общие сведения о свойствах Variable NaseType

Узел Variable имеет дополнительные свойства, описывающие данные, хранящиеся в узле Variable, включая тип данных сервера и разрешения доступа для этого узла. Для просмотра этих свойств необходимо отобразить узел Variable.

doubleNodes(2)
ans = 

OPC UA Node object:
                      Name: DoubleAnalogItemArray
               Description: 
            NamespaceIndex: 3
                Identifier: DoubleAnalogItemArray
                  NodeType: Variable

                    Parent: AnalogItemArrays
                  Children: 3 nodes.

            ServerDataType: Double
        AccessLevelCurrent: read/write
        AccessLevelHistory: none
               Historizing: 0

Этот узел имеет ServerDataType Double и позволяет считывать и записывать текущее значение (AccessLevelCurrent свойство), но не поддерживает чтение исторических данных (AccessLevelHistory). Сервер не выполняет историзацию этого узла, о чем свидетельствует Historizing собственность.

Некоторые свойства, такие как ServerValueRank, и ServerArrayDimensions не отображаются на экране узла, но могут быть запрошены через соответствующее свойство. Дополнительные сведения см. в справке по этим свойствам.

doubleNodes(2).ServerArrayDimensions
ans =

  uint32

   0

Непосредственное построение узлов

Узлы определяются уникально по их индексу имен и идентификатору. Можно создать известный узел без просмотра Namespace с использованием свойства opcuanode функция. Например, для непосредственного построения узла ServerCapabilities можно использовать NamespureIndex 0 и Identifier 2268 (все серверы OPC UA должны публиковать узел ServerCapabilities с этими NamespureIndex и Identifier).

capabilitiesNode = opcuanode(0, 2268, uaClient)
capabilitiesNode = 

OPC UA Node object:
                      Name: ServerCapabilities
               Description: Describes capabilities supported by the server.
            NamespaceIndex: 0
                Identifier: 2268
                  NodeType: Object

                  Children: 14 nodes.

Обратите внимание, что узлы создаются с помощью opcuanode не имеют свойства Parent.

capabilitiesNode.Parent
ans = 

Empty OPC UA Node object.

Однако их дочерние объекты автоматически извлекаются, если узел связан с подключенным клиентом OPC UA.

capabilitiesNode.Children
ans = 

1x14 OPC UA Node array:
    index              Name              NsInd  Identifier  NodeType  Children
    -----  ----------------------------  -----  ----------  --------  --------
      1    ModellingRules                0      2996        Object    6
      2    AggregateFunctions            0      2997        Object    14
      3    HistoryServerCapabilities     0      11192       Object    15
      4    OperationLimits               0      11704       Object    12
      5    LocaleIdArray                 0      2271        Variable  0
      6    MinSupportedSampleRate        0      2272        Variable  0
      7    MaxQueryContinuationPoints    0      2736        Variable  0
      8    MaxByteStringLength           0      12911       Variable  0
      9    ServerProfileArray            0      2269        Variable  0
     10    MaxHistoryContinuationPoints  0      2737        Variable  0
     11    SoftwareCertificates          0      3704        Variable  0
     12    MaxStringLength               0      11703       Variable  0
     13    MaxBrowseContinuationPoints   0      2735        Variable  0
     14    MaxArrayLength                0      11702       Variable  0

Отключить от сервера

После завершения связи с сервером необходимо отключить клиент от сервера. Это также выполняется автоматически, когда клиентская переменная выходит за пределы области действия в MATLAB.

disconnect(uaClient);