Доступ к данным с серверов UA OPC

Обзор программирования UA OPC

Эта тема показывает основные шаги, чтобы создать приложение Унифицированной архитектуры (UA) OPC путем получения текущих и исторических данных с Сервера Симуляции, работающего локальной машине.

Примечание

Чтобы запустить пример кода в следующих шагах, вам нужен Сервер Симуляции UA Prosys OPC, работающий на вашей локальной машине. Можно также опционально установить Локальный Сервис Открытия и указать сервер Prosys с LDS. Для получения дополнительной информации установки смотрите Установку Сервер Симуляции UA OPC для Примеров UA OPC. Код требует только, чтобы незначительные изменения работали с другими серверами.

Шаг 1: найдите свой сервер 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.

Шаг 2: создайте клиент UA OPC и подключение к серверу

После определения местоположения вашего сервера UA OPC вы создаете Клиент UA OPC, чтобы справиться со связью с сервером, получить характеристики сервера ключей, и читать и записать данные с сервера. Можно использовать opcuaserverinfo закончитесь, чтобы создать клиент UA OPC непосредственно.

uaClient = opcua(hsInfo)

Или вы могли создать клиент, использующий имя узла и порт непосредственно.

uaClient = opcua('localhost',53530)
uaClient = 
OPC UA Client SimulationServer:
                     Hostname: myhost.local
                         Port: 53530
                      Timeout: 10

                       Status: Disconnected

Клиент первоначально отключается от сервера, как показано Status свойство. После того, как вы свяжете с сервером, дополнительные свойства показывают в дисплее клиента.

connect(uaClient)
uaClient
uaClient = 
OPC UA Client SimulationServer:
                     Hostname: myhost.local
                         Port: 53530
                      Timeout: 10

                       Status: Connected

                  ServerState: Running

                MinSampleRate: 0 sec
          MaxHistoryReadNodes: 0
      MaxHistoryValuesPerNode: 0
                 MaxReadNodes: 0
                MaxWriteNodes: 0

Дополнительные свойства описывают возможности сервера, особенно пределы для различных операций чтения и операций записи. Предельное значение 0 средних значений сервер не накладывает прямое ограничение на ту возможность.

Шаг 3: просмотрите пространство имен сервера UA OPC

Серверы 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.

Шаг 4: считайте текущие значения из сервера 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.

Шаг 5: считайте исторические данные из сервера 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 object:
                      Name: Simulation
               Description: The type for objects that organize other nodes.
            NamespaceIndex: 5
                Identifier: 85/0:Simulation
                  NodeType: Object
                  Children: 7 nodes.

Simulation узлом является Object узел, таким образом, это не имеет никакого Value. Однако это имеет 7 Дочерних элементов. Найдите Sinusoid и Random дочерние узлы. '-partial' отметьте находит узлы, начинающиеся с аргумента обеспеченный.

sineNode = findNodeByName(simNode,'Sinusoid', '-partial');
randNode = findNodeByName(simNode,'Random', '-partial')
randNode = 
OPC UA Node object:
                      Name: Random1
               Description: 
            NamespaceIndex: 5
                Identifier: Random1
                  NodeType: Variable
                    Parent: Simulation
                  Children: 0 nodes.
            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)]

Шаг 6: отобразите данные на графике

Можно отобразить данные на графике непосредственно из получившегося opc.ua.Data объект.

plot(histData)
legend show

Можно также преобразовать данные в собственные типы данных MATLAB® для последующей обработки. Для получения информации об обработке данных смотрите, Визуализируют и Предварительно обрабатывают Данные о UA OPC.

Шаг 7: Очистка

Когда вы закончили обмениваться данными с Сервером OPC, необходимо отключиться от сервера.

disconnect(uaClient)

Можно затем очистить переменные OPC UA из памяти MATLAB. Если вы очищаете клиент UA OPC из памяти, связь с сервером автоматически закрывается.

Для просмотра документации необходимо авторизоваться на сайте