This example shows you how to read and write data to an OPC UA server. To run this example in your MATLAB session, you will need to install and start the Prosys OPC UA Simulation Server. Read the Getting Started section of the OPC Toolbox documentation for further information.
You create client objects using the results of a query to the Local Discovery Service using opcuaserverinfo
, or directly using the host name and port number of the server you are connecting to. In this case, use the host and port number syntax.
uaClient = opcua('localhost',53530);
connect(uaClient)
Find the DoubleDataItem, FloatDataItem, and Int16DataItem nodes in the StaticData namespace.
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
Use readValue
to read the current value of a node. You can query the Value, the Timestamp when the Value was updated, and the Quality associated with the value when written.
[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'
When you read from multiple nodes, the Values are returned as a cell array. The class of the data on the server is preserved as much as possible.
valClasses = cellfun(@class,v,'UniformOutput',false)
valClasses = 3×1 cell array {'double'} {'single'} {'int16' }
The timestamp is returned as a MATLAB® datetime variable. It represents the time when the source provided the value to the server.
t
t = 3×1 datetime array 19-Mar-2019 02:52:35 19-Mar-2019 02:52:35 19-Mar-2019 02:52:35
The quality is returned as an OPC UA Quality, which displays as a text description.
q
q = OPC UA Quality ID: 'Good' 'Good' 'Good'
You can interrogate the Quality to determine characteristics of the returned quality. In this example, the quality is good.
isGood(q)
ans = 3×1 logical array 1 1 1
The value is not interpolated, but is a raw value (stored by the server directly from the sensor).
interpolated = isInterpolated(q) raw = isRaw(q)
interpolated = 3×1 logical array 0 0 0 raw = 3×1 logical array 1 1 1
You can write data to any scalar node. When you write to multiple nodes, you must pass a cell array of values, one for each node to be written.
newValues = {12,65,-4}; writeValue(uaClient,nodes,newValues);
To verify that the values were written correctly, and retrieve the value again.
serverValues = readValue(uaClient,nodes)
serverValues = 3×1 cell array {[12]} {[65]} {[-4]}
You can update values directly within the cell array and write them back to the server.
serverValues{2} = serverValues{2} + 1; writeValue(uaClient,nodes,serverValues);
When working with a single node, you receive and can pass and the value directly, without using a cell array.
dblValue = readValue(uaClient, doubleNode) writeValue(uaClient, doubleNode, dblValue+15.6) newDbl = readValue(uaClient, doubleNode)
dblValue = 12 newDbl = 27.6000
You can write and read directly from the node variable, as long as that node was created from the client (using the Namespace property or browseNamespace) or you passed a client to the opcuanode
function when creating your node variable.
[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'
When you have finished communicating with the server, disconnect the client from the server. This is also automatically performed when the client variable goes out of scope in MATLAB.
disconnect(uaClient);