Эта тема показывает основные шаги, чтобы создать приложение Унифицированной архитектуры (UA) OPC путем получения текущих и исторических данных с Сервера Симуляции, работающего локальной машине.
Примечание
Чтобы запустить пример кода в следующих шагах, вам нужен Сервер Симуляции UA Prosys OPC, работающий на вашей локальной машине. Можно также опционально установить Локальный Сервис Открытия и указать сервер Prosys с LDS. Для получения дополнительной информации установки смотрите Установку Сервер Симуляции UA OPC для Примеров UA OPC. Код требует только, чтобы незначительные изменения работали с другими серверами.
На этом шаге вы получаете информацию, что тулбокс должен однозначно определить сервер UA OPC, с которым вы хотите соединиться. Вы используете эту информацию при создании объекта клиента UA OPC, описанного на Шаге 2: Создайте Объект клиента UA OPC.
Первые данные являются именем хоста сервера. Имя хоста (описательное имя как "HistorianServer" или IP-адрес такой как 192.168.16.32) квалифицирует тот компьютер в сети и используется протоколами OPC, чтобы определить доступные Серверы OPC на том компьютере. В любом приложении OPC Toolbox™ необходимо знать имя хоста Сервера OPC, так, чтобы связь с тем хостом могла быть установлена. Ваш администратор сети может предоставить список имен хоста, которые обеспечивают Серверы OPC в вашей сети. В этом примере вы будете использовать 'localhost'
как имя хоста, потому что вы соединитесь с Сервером OPC на той же машине как клиент.
Серверы UA OPC однозначно определяются Универсальными Местоположениями Ресурса. Подобно веб-адресам URL для сервера UA OPC запускается с opc.tcp://
, и затем обеспечивает адрес сервера как имя узла, порт и адрес в стандартном тексте ASCII. Например, URL для Сервера Симуляции UA Prosys OPC является opc.tcp://localhost:53530/OPCUA/SimulationServer
.
URL Сервера UA OPC рекламируются посредством Локального сервиса открытия (LDS) UA OPC, доступного на каждой хост-машине сервера UA OPC. Ваш системный администратор может предоставить список URL сервера для конкретного хоста, или можно запросить хост ко всем доступным серверам UA OPC.
Если вы установили LDS и указали сервер UA OPC с LDS, можно использовать opcuaserverinfo
функционируйте, чтобы запросить хосты из командной строки. Если вы не установили LDS, пропустите к Шагу 2.
serverList = opcuaserverinfo('localhost')
serverList = 1x2 OPC UA ServerInfo array: index Description Hostname Port ----- ----------------------------- ------------ ----- 1 SimulationServer myhost.local 53530 2 Quickstart Data Access Server myhost.local 62547
Найдите сервер интереса при помощи findDescription
функционируйте, чтобы искать определенный вектор символов в описании сервера.
hsInfo = findDescription(serverList,'Simulation')
hsInfo = OPC UA ServerInfo 'SimulationServer': Connection Information Hostname: 'myhost.local' Port: 53530
От этого процесса открытия можно идентифицировать порт (53530), на котором сервер UA OPC прислушивается к связям. Процесс открытия также облегчает создавать и связывать с необходимым сервером UA OPC.
После определения местоположения вашего сервера UA OPC вы создаете Клиент UA OPC, чтобы справиться со связью с сервером, получить характеристики сервера ключей, и читать и записать данные с сервера. Можно использовать opcuaserverinfo
закончитесь, чтобы создать клиент UA OPC непосредственно.
uaClient = opcua(hsInfo)
Или вы могли создать клиент, использующий имя узла и порт непосредственно.
uaClient = opcua('localhost',53530)
uaClient = OPC UA Client: Server Information: Name: 'SimulationServer@localhost' Hostname: 'localhost' Port: 53530 EndpointUrl: 'opc.tcp://localhost:53530/OPCUA/SimulationServer' Connection Information: Timeout: 10 Status: 'Disconnected' ServerState: '<Not connected>' Security Information: MessageSecurityMode: SignAndEncrypt ChannelSecurityPolicy: Aes256_Sha256_RsaPss Endpoints: [1×11 opc.ua.EndpointDescription]
Клиент первоначально отключается от сервера, как показано Status
свойство. После того, как вы свяжете с сервером, дополнительные свойства показывают в дисплее клиента.
connect(uaClient)
uaClient OPC UA Client: Server Information: Name: 'SimulationServer@localhost' Hostname: 'localhost' Port: 53530 EndpointUrl: 'opc.tcp://localhost:53530/OPCUA/SimulationServer' Connection Information: Timeout: 10 Status: 'Connected' ServerState: 'Running' Security Information: MessageSecurityMode: SignAndEncrypt ChannelSecurityPolicy: Aes256_Sha256_RsaPss Endpoints: [1×11 opc.ua.EndpointDescription] Server Limits: MinSampleRate: 0 sec MaxReadNodes: 0 MaxWriteNodes: 0 MaxHistoryReadNodes: 0 MaxHistoryValuesPerNode: 0
Дополнительные свойства описывают возможности сервера, особенно пределы для различных операций чтения и операций записи. Предельное значение 0 указывает, что сервер не накладывает прямое ограничение на ту возможность.
Серверы UA OPC предоставляют единое пространство имен вам, чтобы считать и записать и текущие данные и исторические данные. Пространство имен организовано как иерархия узлов. Каждый узел имеет атрибуты, которые описывают тот узел. Узел однозначно определяется двумя элементами: индекс пространства имен (числовое целое число) и идентификатор узла (числовое целое число, вектор символов, или Глобально уникальный идентификатор или ГУИД). Чтобы исключительно описать узел, необходимо обеспечить и namespaceindex и идентификатор; вы не можете обеспечить только идентификатор, потому что та сила быть повторенной для различного пространства имен индексирует.
OPC Toolbox отсоединяет иерархию узлов через свойство пространства имен клиента UA OPC. Каждым элементом свойства пространства имен является узел на самом верхнем уровне сервера. Каждый узел в пространстве имен имеет Children
свойство, которое отсоединяет подузлы, содержавшиеся в том узле. Можно просмотреть пространство имен графически с помощью browseNamespace
функция. Получившееся диалоговое окно позволяет вам выбирать узлы из иерархии и возвращать их в выходе от функции.
serverNodes = browseNamespace(uaClient)
Когда вы нажимаете OK, выбранные пункты возвращены в командном окне выход.
serverNodes = 1x2 OPC UA Node array: index Name NsInd Identifier NodeType Children ----- ---------------------- ----- ---------- -------- -------- 1 MinSupportedSampleRate 0 2272 Variable 0 2 MaxArrayLength 0 11702 Variable 0
Узлам можно было сопоставить значения данных с ними или могут просто быть контейнерами для других узлов. NodeType
свойство узла идентифицирует узел как объектный узел (контейнер) или узел переменной (данные). Для получения дополнительной информации о том, как программно искать пространство имен сервера, смотрите Обзор Пространство имен Сервера UA OPC.
Серверы UA OPC обеспечивают доступ и к текущим значениям и к историческим ценностям их Variable
узлы. С OPC Toolbox вы используете массивы Узлов, чтобы считать текущие значения из сервера. Текущие данные включают значение, метка времени, что сервер получил значение данных от датчика и качество, описывающее точность и источник значения данных.
[val,ts,qual] = readValue(uaClient,serverNodes)
val = 2×1 cell array {[0 sec]} {[65535]} ts = 2×1 datetime array 10-Apr-2019 09:46:43 10-Apr-2019 09:46:43 qual = OPC UA Quality ID: 'Good' 'Good'
Для получения дополнительной информации о чтении и записи текущих значений, смотрите Рида и Запись Текущие Серверные данные UA OPC.
Исторические данные хранятся для выбранных узлов на сервере UA OPC. Узлы сервера, полученные на предыдущем шаге, не будут заархивированы сервером, потому что значения обычно не изменяются. Можно запросить Historizing
свойство Узла определить, архивирует ли сервер в настоящее время данные для того узла.
Поскольку список serverNode является массивом, необходимо собрать выходные параметры с помощью конкатенации.
[serverNodes.Historizing]
ans = 0 0
Ни один из узлов сервера в настоящее время не historized. Кроме того, сервер не предоставляет исторический доступ к этим узлам, как свидетельствуется AccessLevelHistory
свойство узлов.
{serverNodes.AccessLevelHistory}
ans = 'none' 'none'
Чтобы определить местоположение узлов с историей, запросите сервер для Двойных и узлов Int32 в Simulation
родительский узел.
simNode = findNodeByName(uaClient.Namespace,'Simulation')
simNode = OPC UA Node: Node Information: Name: 'Simulation' Description: 'The type for objects that organize other nodes.' NamespaceIndex: 5 Identifier: '85/0:Simulation' NodeType: 'Object' Hierarchy Information: Parent: Server Children: 14
Simulation
узлом является Object
узел, таким образом, это не имеет никакого Value
. Однако это имеет 7 Дочерних элементов. Найдите Sinusoid
и Random
дочерние узлы. '-partial'
отметьте находит узлы, начинающиеся с аргумента обеспеченный.
sineNode = findNodeByName(simNode,'Sinusoid', '-partial'); randNode = findNodeByName(simNode,'Random', '-partial')
randNode = OPC UA Node: Node Information: Name: 'Random1' Description: '' NamespaceIndex: 5 Identifier: 'Random1' NodeType: 'Variable' Hierarchy Information: Parent: 'Simulation' Children: 0 ServerDataType: Double AccessLevelCurrent: read/write AccessLevelHistory: read Historizing: 0
Несмотря на то, что Sinusoid1
и Random1
узлы в настоящее время не архивируются (Historizing
является ложным), можно считать данные об истории из узлов (история регистрировалась при запуске, и затем выключалась). Чтобы Считывать все данные сохраненные на сервере в области значений требуемого времени, используйте readHistory
функция, передавая узлы, чтобы читать и время передвигается, по которому можно считать данные.
histData = readHistory(uaClient,[sineNode,randNode],datetime('now')-seconds(10),datetime('now'))
histData = 1-by-2 OPC UA Data object array: Timestamp Sinusoid1 Random1 ----------------------- -------------------------- -------------------------- 2019-04-10 09:58:31.000 0.415823 [Good (Raw)] 0.131428 [Good (Raw)] 2019-04-10 09:58:32.000 0.813473 [Good (Raw)] 0.038980 [Good (Raw)] 2019-04-10 09:58:33.000 1.175570 [Good (Raw)] 0.316324 [Good (Raw)] 2019-04-10 09:58:34.000 1.486290 [Good (Raw)] 0.229609 [Good (Raw)] 2019-04-10 09:58:35.000 1.732051 [Good (Raw)] 0.208826 [Good (Raw)] 2019-04-10 09:58:36.000 1.902113 [Good (Raw)] 0.483303 [Good (Raw)] 2019-04-10 09:58:37.000 1.989044 [Good (Raw)] 0.393722 [Good (Raw)] 2019-04-10 09:58:38.000 1.989044 [Good (Raw)] 0.206232 [Good (Raw)] 2019-04-10 09:58:39.000 1.902113 [Good (Raw)] 0.116650 [Good (Raw)] 2019-04-10 09:58:40.000 1.732051 [Good (Raw)] 0.391128 [Good (Raw)]
Получите сводные данные полученных данных.
summary(histData)
1-by-2 OPC UA Data object: Name Value Start Timestamp End Timestamp Quality --------- ---------------- ----------------------- ----------------------- ----------------------------- Sinusoid1 10 double values 2019-04-10 09:58:31.000 2019-04-10 09:58:40.000 1 unique quality [Good (Raw)] Random1 10 double values 2019-04-10 09:58:31.000 2019-04-10 09:58:40.000 1 unique quality [Good (Raw)]
Можно отобразить данные на графике непосредственно из получившегося opc.ua.Data
объект.
plot(histData)
legend show
Можно также преобразовать данные в MATLAB® собственные типы данных для последующей обработки. Для получения информации об обработке данных смотрите, Визуализируют и Предварительно обрабатывают Данные о UA OPC.
Когда вы закончили обмениваться данными с Сервером OPC, необходимо отключиться от сервера.
disconnect(uaClient)
Можно затем очистить переменные OPC UA из памяти MATLAB. Если вы очищаете клиент UA OPC из памяти, связь с сервером автоматически закрывается.