В этом разделе показаны основные шаги для создания приложения унифицированной архитектуры OPC (UA) путем извлечения текущих и исторических данных с сервера симуляции, работающего на локальном компьютере.
Примечание
Чтобы запустить пример кода в следующих шагах, вам нужен Prosys OPC UA Simulation Server, работающий на вашем локальном компьютере. Можно также установить службу локального обнаружения и зарегистрировать сервер Prosys в LDS. Для получения дополнительной информации об установке см. раздел Установка сервера симуляцию OPC UA для примеров OPC UA. Код требует лишь незначительных изменений для работы с другими серверами.
На этом шаге вы получаете информацию, которую тулбокс должен уникально идентифицировать сервер OPC UA, к которому вы хотите подключиться. Эта информация используется при создании объекта клиента OPC UA, описанного в шаге 2: Создание объекта клиента OPC UA.
Первой информацией является имя хоста серверного компьютера. Имя узла (такое описательное имя, как «HistorianServer» или IP-адрес, например 192.168.16.32) определяет компьютер в сети и используется протоколами OPC для определения доступных серверов OPC на этом компьютере. В любом приложении OPC Toolbox™ необходимо знать имя узла Сервера OPC, чтобы можно было установить соединение с этим узлом. Сетевой администратор может предоставить список имен узлов, предоставляющих серверы OPC в сети. В этом примере вы будете использовать 'localhost'
как имя узла, поскольку вы будете подключаться к серверу OPC на том же компьютере, что и клиент.
Серверы OPC UA однозначно идентифицируются универсальными местоположениями ресурсов. Как и веб-адреса, URL-адрес для сервера OPC UA начинается с opc.tcp://
, а затем предоставляет адрес сервера в виде имени хоста, порта и адреса в стандартном тексте ASCII. Для примера URL-адрес сервера Симуляции OPC opc.tcp://localhost:53530/OPCUA/SimulationServer
.
URL-адреса OPC UA Server рекламируются через службу локального обнаружения OPC UA (LDS), доступную на каждой хост-машине сервера OPC UA. Системный администратор может предоставить список URL-адресов сервера для определенного узла или запросить хост для всех доступных серверов OPC UA.
Если вы установили LDS и зарегистрировали сервер OPC UA в 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), на котором сервер OPC UA прослушивает соединения. Процесс обнаружения также облегчает построение и подключение к необходимому серверу OPC UA.
После определения местоположения сервера OPC UA создается клиент OPC UA Client для управления подключением к серверу, получения ключевых характеристик сервера и чтения и записи данных с сервера. Вы можете использовать opcuaserverinfo
результат - создание клиента OPC UA непосредственно.
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 указывает, что сервер не налагает прямого предела на эту возможность.
Серверы OPC UA обеспечивают одно пространство имен для чтения и записи как текущих данных, так и исторических данных. Пространство имен организовано как иерархия узлов. Каждый узел имеет атрибуты, которые описывают этот узел. Узел однозначно идентифицируется двумя элементами: Индексом пространства имен (числовое целое число) и идентификатором узла (числовым целым числом, вектором символов или глобально уникальным идентификатором или GUID). Чтобы однозначно описать узел, вы должны предоставить и namespaceindex, и идентификатор; вы не можете указать только идентификатор, поскольку он может повторяться для различных индексов пространства имен.
OPC Toolbox предоставляет иерархию узлов через свойство пространства имен клиента OPC UA. Каждый элемент свойства пространства имен является узлом на самом верхнем уровне сервера. Каждый узел в пространстве имен имеет 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
Узлы могут иметь связанные с ними значения данных или могут просто быть контейнерами для других узлов. The NodeType
свойство узла определяет узел как узел объекта (контейнер) или узел переменной (данные). Дополнительные сведения о программном поиске пространства имен сервера см. в разделе Обзор пространства имен OPC UA Server.
Серверы OPC UA обеспечивают доступ как к текущим, так и к историческим значениям своих 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'
Для получения дополнительной информации о чтении и записи текущих значений смотрите Чтение и запись текущих данных OPC UA Server.
Исторические данные хранятся для выбранных узлов на сервере OPC UA. Серверные узлы, извлеченные на предыдущем шаге, не будут архивированы сервером, поскольку значения обычно не изменяются. Можно запросить Historizing
свойство Node, чтобы определить, архивирует ли сервер данные для этого узла в данный момент.
Поскольку список serverNode является массивом, необходимо собрать выходы с помощью конкатенации.
[serverNodes.Historizing]
ans = 0 0
Ни один из узлов сервера в данный момент не находится в истории. В сложение сервер не разрешает исторический доступ к этим узлам, о чем свидетельствует AccessLevelHistory
свойство узлов.
{serverNodes.AccessLevelHistory}
ans = 'none' 'none'
Чтобы найти узлы с историей, запросите у сервера узлы Double и 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
The Simulation
узел является Object
узел, поэтому у него нет Value
. Однако имеет 7 детей. Найдите Sinusoid
и Random
дочерние узлы. The '-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
false) можно считать исторические данные с узлов (история была записана при запуске, а затем отключена). Чтобы считать все данные, хранящиеся на сервере в указанной временной области значений, используйте 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® собственные типы данных для дальнейшей обработки. Для получения информации об обработке данных смотрите Визуализация и предварительная обработка данных OPC UA.
Когда вы закончили обмен данными с Сервером OPC, вы должны отсоединиться от сервера.
disconnect(uaClient)
Затем можно удалить переменные OPC UA из памяти MATLAB. Если удалить из памяти клиент OPC UA, подключение к серверу автоматически закроется.