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