В этом примере показано, как считать и записать данные на сервер 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);