Этот пример показывает вам, как найти серверы Унифицированной архитектуры (UA) OPC, соединиться с ними и просмотреть их пространство имен, чтобы найти узлы интересным. Чтобы запустить этот пример в вашем сеансе работы с MATLAB, необходимо будет установить и запустить Сервер Симуляции UA Prosys OPC. Считайте раздел Getting Started документации OPC Toolbox для получения дополнительной информации.
Структура серверов UA OPC доступные данные через одно или несколько пространств имен, состоя из нескольких связанных Узлов. Каждое пространство имен имеет индекс, однозначно определяющий то пространство имен. OPC Toolbox отсоединяет два типа Узлов UA OPC: Объектные узлы, которые помогают организовать данные и Узлы переменной, которые хранят данные в их свойстве Value. Узлы переменных могут содержать другие Узлы переменной как дочерние элементы.
Все серверы UA OPC должны опубликовать узел Сервера, содержа информацию о сервере UA OPC включая возможности того сервера, доступную функциональность сервера и другой диагностической информации. Узел Сервера должен существовать как индекс 0 пространства имен, названный 'Сервером'. Этот пример исследует узел ServerCapabilities, содержавшийся в узле Сервера примера сервер UA OPC.
ПРИМЕЧАНИЕ: Этот раздел этого примера требует, чтобы вы установили Локальный Сервис Открытия и сконфигурировали Сервер Симуляции UA Prosys OPC, чтобы указать с LDS. Инструкции для того, как сделать это, включены в раздел Getting Started документации OPC Toolbox.
Серверы UA OPC могут указать с Локальным Сервисом Открытия на свой хост. Локальный сервис открытия (LDS) публикует все доступные серверы, а также их уникальный "адрес" (или URL) для соединения с тем сервером.
Можно обнаружить серверы UA OPC, доступные на хосте с помощью 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
Список серверов показывает доступные серверы UA OPC, и имя узла и номер порта, на котором можно связать с сервером. Можно найти определенный сервер путем поиска Описания серверов. Найдите сервер, содержащий слово "Simulation".
sampleServerInfo = findDescription(serverList, 'Simulation')
sampleServerInfo = OPC UA ServerInfo 'SimulationServer': Connection Information Hostname: 'tmopti01win1064.dhcp.mathworks.com' Port: 53530
Для того, чтобы просмотреть пространство имен сервера, необходимо создать Клиент UA OPC и подключение что клиент к серверу. Если вы знаете имя узла и порт сервера UA OPC, вы могли бы просто создать Клиент UA OPC, использующий имя узла и аргументы 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
Отображение показывает, что клиентское Состояние теперь 'Соединяется', сервер находится в 'Рабочем' состоянии, и клиент хранит информацию относительно пределов сервера. В этом случае все пределы обнуляются, указывая, что нет никакого предела всего сервера для частот дискретизации, максимальных узлов или значений для операций чтения на Демонстрационном Сервере.
Пространство имен сервера инкрементно получено непосредственно в Клиентскую переменную UA OPC в MATLAB. Вы получаете доступ к верхнему уровню пространства имен сервера с помощью Namespace
свойство. Это свойство хранит Узлы UA OPC. Каждый узел может содержать один или несколько Дочерних элементов, которые являются самостоятельно узлами.
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, можно запросить Дочерние элементы узла Сервера.
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). Примером Объектного узла является узел tha ServerCapabilities, показанный выше. Вы не можете считать данные из Объектного узла. В этом примере, 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 может содержать Дочерние элементы - NodeType Переменной не гарантирует, что узел не содержит Дочерних элементов. Второй перечисленный узел является узлом переменной (и таким образом, его банка Значения может быть считана), но также и имеет дочерние элементы (который может быть считан индивидуально). Для получения информации о чтении значений от узла смотрите 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
свойство.
Некоторые свойства, такие как ServerValueRank
, и ServerArrayDimensions
не показаны в отображении узла, но может быть запрошен через соответствующее свойство. Смотрите справку на этих свойствах для получения дополнительной информации.
doubleNodes(2).ServerArrayDimensions
ans = uint32 0
Узлы заданы исключительно их 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 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);