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