exponenta event banner

Чтение и запись текущих данных сервера OPC UA

В этом примере показано, как считывать и записывать данные на сервер OPC UA. Чтобы запустить этот пример в сессии MATLAB, необходимо установить и запустить Prosys OPC UA Simulation Server. Дополнительную информацию см. в разделе Начало работы в документации OPC Toolbox.

Создание клиента и подключение к серверу

Объекты клиента создаются с помощью результатов запроса к локальной службе обнаружения с помощью opcuaserverinfoили непосредственно с использованием имени хоста и номера порта сервера, к которому выполняется подключение. В этом случае используйте синтаксис номера хоста и порта.

uaClient = opcua('localhost',53530);
connect(uaClient)

Найдите узлы DouureDataItem, FloatDataItem и Int16DataItem в пространстве имен «» StartData «».

staticNode = findNodeByName(uaClient.Namespace,'StaticData','-once');
dataItemsNode = findNodeByName(staticNode,'DataItems','-once');
doubleNode = findNodeByName(dataItemsNode,'DoubleDataItem');
floatNode = findNodeByName(dataItemsNode,'FloatDataItem');
int16Node = findNodeByName(dataItemsNode,'Int16DataItem');
nodes = [doubleNode,floatNode,int16Node]
nodes = 

1x3 OPC UA Node array:
    index       Name       NsInd    Identifier    NodeType  Children
    -----  --------------  -----  --------------  --------  --------
      1    DoubleDataItem  3      DoubleDataItem  Variable  1
      2    FloatDataItem   3      FloatDataItem   Variable  1
      3    Int16DataItem   3      Int16DataItem   Variable  1

Считывание значений из узлов

Использовать readValue для считывания текущего значения узла. Можно запросить значение, отметку времени, когда значение было обновлено, и качество, связанное со значением при записи.

[v,t,q] = readValue(uaClient,nodes)
v =

  3×1 cell array

    {[0]}
    {[0]}
    {[0]}


t = 

  3×1 datetime array

   19-Mar-2019 02:52:35
   19-Mar-2019 02:52:35
   19-Mar-2019 02:52:35


q = 

OPC UA Quality ID:
	'Good'
	'Good'
	'Good'

При чтении из нескольких узлов значения возвращаются в виде массива ячеек. Класс данных на сервере максимально сохраняется.

valClasses = cellfun(@class,v,'UniformOutput',false)
valClasses =

  3×1 cell array

    {'double'}
    {'single'}
    {'int16' }

Временная метка возвращается как переменная datetime MATLAB ®. Он представляет время, когда источник предоставил значение серверу.

t
t = 

  3×1 datetime array

   19-Mar-2019 02:52:35
   19-Mar-2019 02:52:35
   19-Mar-2019 02:52:35

Качество возвращается как качество OPC UA, которое отображается как текстовое описание.

q
q = 

OPC UA Quality ID:
	'Good'
	'Good'
	'Good'

Для определения характеристик возвращаемого качества можно запросить качество. В этом примере качество хорошее.

isGood(q)
ans =

  3×1 logical array

   1
   1
   1

Значение не интерполируется, а является необработанным значением (сохраняется сервером непосредственно от датчика).

interpolated = isInterpolated(q)

raw = isRaw(q)
interpolated =

  3×1 logical array

   0
   0
   0


raw =

  3×1 logical array

   1
   1
   1

Запись данных в узлы

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

newValues = {12,65,-4};
writeValue(uaClient,nodes,newValues);

Для проверки правильности записи значений и повторного получения значения.

serverValues = readValue(uaClient,nodes)
serverValues =

  3×1 cell array

    {[12]}
    {[65]}
    {[-4]}

Можно обновить значения непосредственно в массиве ячеек и записать их обратно на сервер.

serverValues{2} = serverValues{2} + 1;
writeValue(uaClient,nodes,serverValues);

Считывание и запись значений с одним узлом

При работе с одним узлом вы получаете и можете передать и значение непосредственно, без использования массива ячеек.

dblValue = readValue(uaClient, doubleNode)
writeValue(uaClient, doubleNode, dblValue+15.6)
newDbl = readValue(uaClient, doubleNode)
dblValue =

    12


newDbl =

   27.6000

Чтение и запись непосредственно в узлы

Запись и чтение можно выполнить непосредственно из переменной узла, если этот узел был создан из клиента (с помощью свойства Namespace или browseNamespace) или если клиент был передан в opcuanode при создании переменной узла.

[vals,ts,qual] = readValue(nodes)
writeValue(nodes,v)
vals =

  3×1 cell array

    {[27.6000]}
    {[     66]}
    {[     -4]}


ts = 

  3×1 datetime array

   19-Mar-2019 02:52:36
   19-Mar-2019 02:52:36
   19-Mar-2019 02:52:36


qual = 

OPC UA Quality ID:
	'Good'
	'Good'
	'Good'

Отключить от сервера

После завершения связи с сервером отключите клиент от сервера. Это также выполняется автоматически, когда клиентская переменная выходит за пределы области действия в MATLAB.

disconnect(uaClient);