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