主要内容

读写当前OPC UA服务器数据

本例向您展示如何向OPC UA服务器读写数据。

要在MATLAB®会话中运行此示例,必须安装并启动Prosys OPC UA仿真服务器。有关更多信息,请参阅工业通信工具箱™文档的入门部分。

创建客户端并连接到服务器

使用本地发现服务的查询结果创建客户端对象opcuaserverinfo,或直接使用所连接服务器的主机名和端口号。在本例中,请使用主机和端口号语法。

uaClient = opcua(“localhost”, 53530);连接(uaClient)

在StaticData命名空间中找到DoubleDataItem、FloatDataItem和Int16DataItem节点。

staticNode = findNodeByName(uaClient. staticNode = findNodeByName)名称空间,“StaticData”“好玩”);dataItemsNode = findNodeByName(staticNode,“DataItems”“好玩”);doubleNode = findNodeByName(dataItemsNode,“DoubleDataItem”);floatNode = findNodeByName(dataItemsNode,“FloatDataItem”);int16Node = findNodeByName(dataItemsNode,“Int16DataItem”);nodes = [doubleNode,floatNode,int16Node]
nodes = 1x3 OPC UA节点数组:index名称NsInd标识NodeType子节点----- -------------- ----- -------------- -------- -------- 1 DoubleDataItem 3 DoubleDataItem变量1 2 FloatDataItem 3 FloatDataItem变量1 3 Int16DataItem 3 Int16DataItem变量1 .使用实例

从节点读取值

使用readValue读取节点的当前值。您可以查询值、值更新时的时间戳以及写入时与值关联的质量。

[v,t,q] = readValue(uaClient,nodes)
v = 3×1 cell array {[0]} {[0]} {[0]} t = 3×1 datetime array 19- march -2019 02:52:35 19- march -2019 02:52:35 19- march -2019 02:52:35 q = OPC UA质量ID: 'Good' 'Good' 'Good'

当从多个节点读取时,值将作为单元格数组返回。服务器上数据的类会尽可能地保留。

valClasses = cellfun(@class,v,“UniformOutput”假)
valClasses = 3×1单元格数组{'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 = OPC UA质量ID: 'Good' 'Good' 'Good' 'Good'

您可以询问质量以确定返回的质量的特征。在这个例子中,质量是好的。

短距离(q)
Ans = 3×1逻辑阵列1 1 1

该值不是插值的,而是一个原始值(由服务器直接从传感器存储)。

interpolated = isInterpolated(q) raw =以色列(q)
Interpolated = 3×1逻辑阵列0 0 0 raw = 3×1逻辑阵列1 1 1 1

向节点写入数据

可以向任何标量节点写入数据。写入多个节点时,必须传递一个单元格数组的值,每个节点对应一个值。

newValues = {12,65,-4};writeValue (uaClient、节点newValues);

验证值是否正确写入,并再次检索值。

serverValues = readValue(uaClient,nodes)
serverValues = 3×1单元阵列{[12]}{[65]}{[4]}

您可以直接在单元格数组中更新值,并将它们写回服务器。

serverValues{2} = serverValues{2} + 1;writeValue (uaClient、节点serverValues);

单节点读写值

在处理单个节点时,可以直接接收和传递值,而不使用单元格数组。

dbl = 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- march -2019 02:52:36 19- march -2019 02:52:36 19- march -2019 02:52:36 qual = OPC UA质量ID: 'Good' 'Good' 'Good' 'Good'

从服务器断开连接

完成与服务器的通信后,断开客户机与服务器的连接。在MATLAB中,当客户端变量超出范围时,这也会自动执行。

断开(uaClient);