Этот пример показывает вам, как читать и записать данные к серверу UA OPC. Чтобы запустить этот пример в вашем сеансе работы с MATLAB, необходимо будет установить и запустить Сервер Симуляции UA Prosys OPC. Считайте раздел Getting Started документации 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' }
Метка времени возвращена как переменная 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
Качество возвращено как Качество UA OPC, которое отображается как текстовое описание.
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);