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