Этот пример показывает вам, как найти серверы Объединенной автоматизации (UA) OPC, соединиться с ними и просмотреть их пространство имен, чтобы найти узлы интересным.
Структура серверов UA OPC доступные данные через одно или несколько пространств имен, состоя из нескольких связанных Узлов. OPC Toolbox представляет два типа Узлов UA OPC: Объектные узлы, которые помогают организовать данные и Узлы переменной, которые хранят данные в их свойстве Value. Узлы переменных могут содержать другие Узлы переменной как дочерние элементы. Каждое пространство имен имеет Индекс, однозначно определяющий то пространство имен.
Все Серверы OPC должны опубликовать узел Сервера, содержа информацию о сервере UA OPC включая возможности того сервера, доступную функциональность сервера и другой диагностической информации. Узел Сервера должен существовать как индекс 0 пространства имен, названный 'Сервером'. Этот пример исследует узел ServerCapabilities, содержавшийся в узле Сервера примера сервер UA OPC.
ПРЕДПОСЫЛКИ:
Все серверы UA OPC указывают с Локальным Сервисом Открытия на свой хост. Локальный сервис открытия (LDS) публикует все доступные серверы, а также их уникальный "адрес" (или URL) для соединения с тем сервером.
Можно обнаружить серверы UA OPC, доступные на хосте с помощью opcuaserverinfo. Этот пример использует локальный хост.
serverList = opcuaserverinfo('localhost')
serverList =
1×2 OPC UA ServerInfo array:
index Description Hostname Port
----- ----------------------------------- -------------- -----
1 UA Sample Server TMOPTI02WIN764 51210
2 Quickstart Historical Access Server TMOPTI02WIN764 62550
Список серверов показывает 3 доступных сервера UA OPC и номер порта, на котором можно соединиться с сервером. Можно найти определенный сервер путем поиска Описания серверов. Найдите сервер, содержащий слово "Sample".
sampleServerInfo = findDescription(serverList, 'Sample')
sampleServerInfo =
OPC UA ServerInfo 'UA Sample Server':
Connection Information
Hostname: 'TMOPTI02WIN764'
Port: 51210
В порядке просмотреть пространство имен сервера, необходимо создать Клиент UA OPC и подключение что клиент к серверу. Можно создать клиент непосредственно из результатов opcuaserverinfo.
uaClient = opcua(sampleServerInfo);
Первоначально клиент отключается от сервера и показывает краткий обзор клиентских свойств.
disp(uaClient)
OPC UA Client UA Sample Server:
Hostname: TMOPTI02WIN764
Port: 51210
Timeout: 10
Status: Disconnected
Вы знаете, что клиент отключается путем запроса свойства Status или вызывания функции isConnected.
disp(uaClient.Status) isConnected(uaClient)
Disconnected ans = 0
Если вы соединяете клиент с сервером, дополнительные свойства с сервера отображены.
connect(uaClient) disp(uaClient)
OPC UA Client UA Sample Server:
Hostname: TMOPTI02WIN764
Port: 51210
Timeout: 10
Status: Connected
ServerState: Running
MinSampleRate: 0 sec
MaxHistoryReadNodes: 0
MaxHistoryValuesPerNode: 0
MaxReadNodes: 0
MaxWriteNodes: 0
Отображение показывает, что клиентское Состояние теперь 'Соединяется', сервер находится в 'Рабочем' состоянии, и клиент хранит информацию относительно пределов сервера. В этом случае все пределы обнуляются, указывая, что нет никакого предела всего сервера для частот дискретизации, максимальных узлов или значений для операций чтения на Демонстрационном Сервере.
Пространство имен сервера инкрементно получено непосредственно в Клиентскую переменную UA OPC в MATLAB. Вы получаете доступ к верхнему уровню пространства имен сервера с помощью свойства Namespace. Это свойство хранит Узлы UA OPC. Каждый узел может содержать один или несколько Дочерних элементов, которые являются самостоятельно узлами.
topNodes = uaClient.Namespace
topNodes =
1x4 OPC UA Node array:
index Name NsInd Identifier NodeType Children
----- ------------- ----- ---------- -------- --------
1 Server 0 2253 Object 10
2 Data 2 10157 Object 3
3 Boilers 4 1240 Object 2
4 MemoryBuffers 7 1025 Object 2
Узел под названием 'Server' содержит 10 дочерних элементов.
Можно искать индексацию использующего пространства имен в Дочернее свойство доступных узлов. Например, чтобы найти узел ServerCapabilities, можно запросить Дочерние элементы узла Сервера.
serverChildren = topNodes(1).Children
serverChildren =
1x10 OPC UA Node array:
index Name NsInd Identifier NodeType Children
----- ------------------ ----- ---------- -------- --------
1 ServerArray 0 2254 Variable 0
2 NamespaceArray 0 2255 Variable 0
3 ServerStatus 0 2256 Variable 6
4 ServiceLevel 0 2267 Variable 0
5 Auditing 0 2994 Variable 0
6 ServerCapabilities 0 2268 Object 14
7 ServerDiagnostics 0 2274 Object 4
8 VendorServerInfo 0 2295 Object 0
9 ServerRedundancy 0 2296 Object 4
10 Namespaces 0 11715 Object 0
Узел ServerCapabilities является шестым узлом в списке.
serverCapabilities = serverChildren(6)
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 =
1x13 OPC UA Node array:
index Name NsInd Identifier NodeType Children
----- ----------- ----- ---------- -------- --------
1 Double 8 Double Object 101
2 DoubleValue 2 10226 Variable 0
3 DoubleValue 2 10310 Variable 0
4 DoubleValue 2 10394 Variable 0
5 DoubleValue 2 10473 Variable 0
6 DoubleValue 2 10596 Variable 1
7 DoubleValue 2 10731 Variable 1
8 DoubleValue 2 10854 Variable 0
9 DoubleValue 2 10938 Variable 0
10 DoubleValue 2 11022 Variable 0
11 DoubleValue 2 11101 Variable 0
12 DoubleValue 2 11224 Variable 1
13 DoubleValue 2 11359 Variable 1
Узлы имеют NodeType, который описывает, является ли тот узел просто организационным модулем (Объект NodeType) или содержит данные (Переменная NodeType). Переменный NodeTypes может содержать Дочерние элементы - NodeType Переменной не гарантирует, что узел не содержит Дочерних элементов. В этом примере doubleNodes содержит один Объектный узел и 12 Узлов переменной.
allNodeTypes = {doubleNodes.NodeType}
allNodeTypes =
Columns 1 through 5
'Object' 'Variable' 'Variable' 'Variable' 'Variable'
Columns 6 through 10
'Variable' 'Variable' 'Variable' 'Variable' 'Variable'
Columns 11 through 13
'Variable' 'Variable' 'Variable'
Узел переменной имеет дополнительные свойства, описывающие данные, хранимые в Узле переменной. Чтобы просмотреть эти свойства, отобразите Узел переменной.
doubleNodes(2)
ans =
OPC UA Node object:
Name: DoubleValue
Description:
NamespaceIndex: 2
Identifier: 10226
NodeType: Variable
Parent: Scalar
Children: 0 nodes.
ServerDataType: Double
AccessLevelCurrent: read/write
AccessLevelHistory: none
Historizing: 0
Этот узел имеет ServerDataType 'Double', и позволяет читать и писать Текущего значения (свойство AccessLevelCurrent), но не поддерживает исторических данных, читая (AccessLevelHistory). Сервер не Гистоповышается этот узел, как свидетельствуется свойством Historizing.
Некоторые свойства, такие как ServerValueRank и ServerArrayDimensions не показывают в отображении узла, но можно запросить через соответствующее свойство. Смотрите справку на этих свойствах для получения дополнительной информации.
Узлы заданы исключительно их NamespaceIndex и их Идентификатором. Можно создать известный узел, не просматривая свойство Namespace с помощью функции opcuanode. Например, чтобы создать узел ServerCapabilities непосредственно можно использовать NamespaceIndex 0, и Идентификатор 2268 (все серверы UA OPC должны опубликовать узел ServerCapabilities с этим NamespaceIndex и Идентификатором).
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.
Однако их Дочерние элементы автоматически получены, если узел сопоставлен со связанным Клиентом UA OPC.
capabilitiesNode.Children
ans =
1x14 OPC UA Node array:
index Name NsInd Identifier NodeType Children
----- ---------------------------- ----- ---------- -------- --------
1 ServerProfileArray 0 2269 Variable 0
2 LocaleIdArray 0 2271 Variable 0
3 MinSupportedSampleRate 0 2272 Variable 0
4 MaxBrowseContinuationPoints 0 2735 Variable 0
5 MaxQueryContinuationPoints 0 2736 Variable 0
6 MaxHistoryContinuationPoints 0 2737 Variable 0
7 SoftwareCertificates 0 3704 Variable 0
8 MaxArrayLength 0 11702 Variable 0
9 MaxStringLength 0 11703 Variable 0
10 OperationLimits 0 11704 Object 12
11 ModellingRules 0 2996 Object 0
12 AggregateFunctions 0 2997 Object 37
13 HistoryServerCapabilities 0 11192 Object 15
14 HistoryServerCapabilities 6 15820059 Object 15
Когда вы закончили связываться с сервером, необходимо отключить клиент от сервера. Это также автоматически выполняется, когда клиентская переменная выходит из осциллографа в MATLAB.
disconnect(uaClient);