В этом разделе показаны основные шаги по созданию приложения OPC Unified Architecture (UA) путем получения текущих и исторических данных с сервера моделирования, работающего на локальном компьютере.
Примечание
Чтобы выполнить пример кода в следующих шагах, необходимо запустить Prosys OPC UA Simulation Server на локальном компьютере. Можно также дополнительно установить службу локального обнаружения и зарегистрировать сервер Prosys в LDS. Дополнительные сведения об установке см. в разделе Установка сервера моделирования OPC UA для примеров 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.
После определения местоположения сервера 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 указывает на то, что сервер не накладывает прямого ограничения на эту возможность.
Серверы OPC UA предоставляют единое пространство имен для чтения и записи как текущих данных, так и исторических данных. Пространство имен организовано как иерархия узлов. Каждый узел имеет атрибуты, описывающие этот узел. Узел однозначно идентифицируется двумя элементами: индекс пространства имен (числовое целое число) и идентификатор узла (числовое целое число, символьный вектор или глобальный уникальный идентификатор или GUID). Для уникального описания узла необходимо указать и пространство имен, и идентификатор; нельзя указать только идентификатор, поскольку он может повторяться для различных индексов пространства имен.
OPC Toolbox предоставляет иерархию узлов через свойство пространства имен клиента OPC UA. Каждый элемент свойства namespace является узлом на самом верхнем уровне сервера. Каждый узел в пространстве имен имеет Children свойство, которое предоставляет подузлы, содержащиеся в этом узле. Можно просматривать пространство имен графически с помощью browseNamespace функция. Полученное диалоговое окно позволяет выбрать узлы из иерархии и вернуть их в выходных данных функции.
serverNodes = browseNamespace(uaClient)

При нажатии кнопки ОК выбранные элементы возвращаются в выходных данных окна команды.
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.
Серверы 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.
Исторические данные хранятся для выбранных узлов на сервере 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)]Можно распечатать данные непосредственно из результирующего opc.ua.Data объект.
plot(histData)
legend showДля дальнейшей обработки можно также преобразовать данные в собственные типы данных MATLAB ®. Сведения об обработке данных см. в разделе Визуализация и предварительная обработка данных OPC UA.
После завершения обмена данными с сервером OPC необходимо отсоединиться от сервера.
disconnect(uaClient)
Затем можно очистить переменные OPC UA из памяти MATLAB. При удалении клиента OPC UA из памяти соединение с сервером автоматически закрывается.