exponenta event banner

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

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

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

Примечание

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

Шаг 1: Поиск сервера OPC UA

На этом шаге будет получена информация о том, что панель инструментов должна однозначно идентифицировать сервер OPC UA, к которому требуется подключиться. Эта информация используется при создании объекта клиента OPC UA, описанного в шаге 2 Создание объекта клиента OPC UA.

Первая информация - имя хоста компьютера сервера. Имя хоста (описательное имя, например, «SportingServer» или IP-адрес, например 192.168.16.32) определяет этот компьютер в сети и используется протоколами OPC для определения доступных OPC-серверов на этом компьютере. В любом приложении OPC Toolbox™ необходимо знать имя хоста сервера OPC, чтобы можно было установить соединение с этим хостом. Администратор сети может предоставить список имен узлов, предоставляющих серверы OPC в сети. В этом примере будет использоваться 'localhost' в качестве имени узла, поскольку вы будете подключаться к серверу OPC на том же компьютере, что и клиент.

Серверы OPC UA уникально идентифицируются с помощью Universal Resource Locations. Подобно веб-адресам, URL-адрес сервера OPC UA начинается с opc.tcp://, а затем предоставляет адрес сервера в виде имени хоста, порта и адреса в стандартном тексте ASCII. Например, URL-адрес сервера моделирования OPC UA Prosys: opc.tcp://localhost:53530/OPCUA/SimulationServer.

URL-адреса сервера OPC UA объявляются через службу локального обнаружения 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 для управления подключением к серверу, получения ключевых характеристик сервера и чтения и записи данных с сервера. Вы можете использовать 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

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

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

serverNodes = browseNamespace(uaClient)

Name space browser with selected items

При нажатии кнопки ОК выбранные элементы возвращаются в выходных данных окна команды.

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 свойство узла идентифицирует узел как объектный узел (контейнер) или переменный узел (данные). Дополнительные сведения о программном поиске пространства имен сервера см. в разделе Обзор пространства имен сервера OPC UA.

Шаг 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.

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

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

Поскольку список 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

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 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 из памяти соединение с сервером автоматически закрывается.