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

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

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

Примечание

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

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

Шаг 2: Создайте клиент 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 указывает, что сервер не налагает прямого предела на эту возможность.

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

Серверы OPC UA обеспечивают одно пространство имен для чтения и записи как текущих данных, так и исторических данных. Пространство имен организовано как иерархия узлов. Каждый узел имеет атрибуты, которые описывают этот узел. Узел однозначно идентифицируется двумя элементами: Индексом пространства имен (числовое целое число) и идентификатором узла (числовым целым числом, вектором символов или глобально уникальным идентификатором или GUID). Чтобы однозначно описать узел, вы должны предоставить и namespaceindex, и идентификатор; вы не можете указать только идентификатор, поскольку он может повторяться для различных индексов пространства имен.

OPC Toolbox предоставляет иерархию узлов через свойство пространства имен клиента OPC UA. Каждый элемент свойства пространства имен является узлом на самом верхнем уровне сервера. Каждый узел в пространстве имен имеет Children свойство, которое предоставляет подузлы, содержащиеся в этом узле. Вы можете просматривать пространство имен графически, используя browseNamespace функция. Получившееся диалоговое окно позволяет вам выбрать узлы из иерархии и вернуть их в выходе из функции.

serverNodes = browseNamespace(uaClient)

Name space browser with selected items

При нажатии кнопки мыши 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.

Шаг 4: Чтение Текущих значений с сервера OPC UA

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

Шаг 5: Чтение исторических данных с сервера OPC UA

Исторические данные хранятся для выбранных узлов на сервере 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)]

Шаг 6: Постройте график данных

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

plot(histData)
legend show

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

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

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

disconnect(uaClient)

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