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

В этом примере показано, как считать и записать данные на сервер OPC UA. Чтобы запустить этот пример в своем Сеансе работы с MATLAB, вам нужно будет установить и запустить Prosys OPC UA Симуляции Server. Для получения дополнительной информации ознакомьтесь с разделом «Начало работы» документации OPC Toolbox.

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

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

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

Найдите узлы DoubleDataItem, FloatDataItem и Int16DataItem в пространстве имен StaticData.

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' }

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

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);