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

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

Серверы OPC UA структурируют доступные данные через одно или несколько пространств имен, состоящих из нескольких связанных узлов. Каждое пространство имен имеет индекс, однозначно идентифицирующий это пространство имен. OPC Toolbox предоставляет два типа узлов OPC UA: узлы Object, которые помогают организовывать данные, и узлы Переменные, которые хранят данные в своем свойстве 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 Client и подключить его к серверу. Если вы знаете имя хоста и порт сервера OPC UA, можно просто создать клиент OPC UA с помощью аргументов hostname и port.

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', а клиент хранит информацию об пределах сервера. В этом случае все пределы устанавливаются равными нулю, что указывает на отсутствие общесерверного предела для частот дискретизации, максимальных узлов или значений для операций чтения на сервере Sample.

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

Пространство имен сервера постепенно извлекается непосредственно в переменную OPC UA Client в 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 детей.

Вы можете искать пространство имен с помощью индексации в дочернее свойство доступных узлов. Для примера, чтобы найти узел 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

Общие сведения о NodeType

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

allNodeTypes = {doubleNodes.NodeType}
allNodeTypes =

  1×6 cell array

  Columns 1 through 4

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

  Columns 5 through 6

    {'Variable'}    {'Variable'}

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

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

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

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 этот узел, о чем свидетельствует Historizing свойство.

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

doubleNodes(2).ServerArrayDimensions
ans =

  uint32

   0

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

Узлы определяются однозначно их NamespaceIndex и их Identifier. Можно создать известный узел, не просматривая Namespace свойство с использованием opcuanode функция. Например, чтобы создать узел ServerCapabilities непосредственно, можно использовать NamespaceIndex 0 и Identifier 2268 (все серверы OPC UA должны опубликовать узел ServerCapabilities с этим NamespaceIndex и 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);