Read and Write Current OPC UA Server Data

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.

Create a Client and Connect to the Server

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

Read Values from Nodes

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

Write Data to Nodes

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);

Read and Write Values With a Single Node

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

Reading and Writing to Nodes Directly

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'

Disconnect from Server

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);