Main Content

Access Data at the Command Line

DA Programming Overview

This section illustrates the basic steps to create an OPC Data Access application by visualizing the Triangle Wave and Saw-toothed Wave signals provided by the Matrikon™ OPC Simulation Server. The application logs data to memory and plots that data, highlighting uncertain or bad data points. By visualizing the data you can more clearly see the relationships between the signals.


To run the sample code in the following steps you need the Matrikon OPC Simulation Server on your local machine. For installation details, see Install an OPC DA or HDA Simulation Server for OPC Classic Examples. The code requires only minor changes to work with other servers.

Step 1: Locate Your OPC Data Access Server

In this step, you obtain two pieces of information that the toolbox needs to uniquely identify the OPC Data Access server that you want to connect to. You use this information when creating an OPC Data Access Client object (opcda client object), described in Step 2: Create an OPC Data Access Client Object.

The first piece of information is the host name of the server computer. The host name (a descriptive name like "PlantServer" or an IP address such as qualifies that computer on the network, and is used by the OPC Data Access protocols to determine the available OPC servers on that computer, and to communicate with the computer to establish a connection to the server. In any OPC application, you must know the name of the OPC server's host, so that a connection with that host can be established. Your network administrator can provide a list of host names that provide OPC servers on your network. In this example, you will use localhost as the host name, because you will connect to the OPC server on the same machine as the client.

The second piece of information is the OPC server's server ID. Each OPC server on a particular host is identified by a unique server ID (also called the Program ID or ProgID), which is allocated to that server on installation. The server ID is a text character vector, usually containing periods.

Although your network administrator can provide a list of server IDs for a particular host, you can query the host for all available OPC servers. Discover Available Data Access Servers discusses how to query hosts from the command line.

Use the opcserverinfo function to make a query from the command line.

hostInfo = opcserverinfo('localhost')
hostInfo = 
                 Host: 'localhost'
             ServerID: {1x3 cell}
    ServerDescription: {1x3 cell}
     OPCSpecification: {'DA2' 'DA2' 'DA2'}
    ObjectConstructor: {1x3 cell}

Examining the returned structure in more detail provides the server IDs of each OPC server.

allServers = hostInfo.ServerID'
allServers = 

Step 2: Create an OPC Data Access Client Object

After determining the host name and server ID of the OPC server to connect to, you can create an opcda client object. The client controls the connection status to the server, and stores any events that occur from that server (such as notification of data changing state, which is called a data change event) in the event log. The opcda client object also contains any Data Access Group objects that you create on the client. For details on the OPC object hierarchy, see Toolbox Object Hierarchy for the Data Access Standard.

Use the opcda function to specify the host name and Server ID.

da = opcda('localhost','Matrikon.OPC.Simulation.1')
da =
   OPC Data Access Object: localhost/Matrikon.OPC.Simulation.1
      Server Parameters
         Host:           localhost
         ServerID:       Matrikon.OPC.Simulation.1
         Status:         disconnected
      Object Parameters
         Group:          0-by-1 dagroup object

For details on creating clients, see Create OPC Data Access Objects.

Step 3: Connect to the OPC Data Access Server

OPC Data Access Client objects are not automatically connected to the server when they are created. This allows you to fully configure an OPC object hierarchy (a client with groups and items) before connecting to the server, or without a server even being present.

Use the connect function to connect an opcda client object to the server at the command line.


Step 4: Create an OPC Data Access Group Object

You create Data Access Group objects (dagroup objects) to control and contain a collection of Data Access Item objects (daitem objects). A dagroup object controls how often the server must notify you of any changes in the item values, controls the activation status of the items in that group, and defines, starts, and stops logging tasks.

On their own, dagroup objects are not useful. Once you add items to a group, you can control those items, read values from the server for all the items in a group, and log data for those items, using the dagroup object. In Step 5 you browse the OPC server for available tags. Step 6 involves adding the items associated with those tags to the dagroup object.

Use the addgroup function to create dagroup objects from the command line. This example adds a group to the opcda client object already created.

grp = addgroup(da)
grp =
   OPC Group Object: Group0
      Object Parameters
         GroupType:        private
         Item:             0-by-1 daitem object
         Parent:           localhost/Matrikon.OPC.Simulation.1
         UpdateRate:       0.5
         DeadbandPercent:  0
      Object Status
         Active:           on
         Subscription:     on
         Logging:          off
         LoggingMode:      memory

See Create Data Access Group Objects for more information on creating group objects from the command line.

Step 5: Browse the Server Name Space

All OPC servers provide access to server items via a server name space. The name space is an ordered list of the server items, usually arranged in a hierarchical format for easy access. A server item (also known as a tag) is a measurement or data point on a server, providing information from a device (such as a pressure sensor) or from another software package that supplies data through OPC Data Access (such as a SCADA package).


If you know the item IDs of the server items you are interested in, you can skip this section and go directly to Step 6: Add OPC Data Access Items to the Group. In this example, assume that you do not know the exact item IDs, although you do know that you want to log information from the Saw-toothed Waves and Triangular Waves provided by the Matrikon Simulation Server.

From the command line, you can “browse” the server name space using the serveritems function. You need to supply a connected opcda client object to the serveritems function, and an optional character vector argument to limit the returned results. The character vector can contain wildcard characters (*). An example of using serveritems is as follows.

sawtoothItems = serveritems(da,'*Saw*')
sawtoothItems = 
    'Saw-toothed Waves.'
    'Saw-toothed Waves.Int1'
    'Saw-toothed Waves.Int2'
    'Saw-toothed Waves.Int4'
    'Saw-toothed Waves.Money'
    'Saw-toothed Waves.Real4'
    'Saw-toothed Waves.Real8'
    'Saw-toothed Waves.UInt1'
    'Saw-toothed Waves.UInt2'
    'Saw-toothed Waves.UInt4'

The command for obtaining the server item properties is serveritemprops. See the serveritemprops reference page for details.

Step 6: Add OPC Data Access Items to the Group

Now that you have found the server items in the name space, you can add Data Access Item objects (daitem object) for those tags to the dagroup object you created in Step 4. A daitem object is a link to a tag in the name space, providing the tag value, and additional information on that item, such as the Canonical Data Type.

Reading a Value from the Server

A daitem object initially contains no information about the server item that it represents. The daitem object only updates when the server notifies the client of a change in status for that item (the notification is called a data change event) or the client specifically reads a value from the server.

Each time you read or obtain data from the server through a data change event, the server provides you with updated Value, Quality, and Timestamp values.

Adding More Items to the Group

Use the additem function to add items to a dagroup object. You need to pass the dagroup object to which the items will be added, and the fully qualified item ID as a character vector. The item IDs were found using the serveritems function in Step 5.

itm1 = additem(grp,'Saw-toothed Waves.Real8')
itm1 =
   OPC Item Object: Saw-toothed Waves.Real8
      Object Parameters
         Parent:           Group0
         AccessRights:     read/write
         DataType:         double
      Object Status
         Active:           on

You can add multiple items to the group in one additem call, by specifying multiple ItemID values in a cell array.

itms = additem(grp,{'Triangle Waves.Real8', ...
                    'Triangle Waves.UInt2'})
itms =
   OPC Item Object Array:
   Index:  DataType:  Active:  ItemID:
   1       double     on       Triangle Waves.Real8
   2       uint16     on       Triangle Waves.UInt2

For details on adding items to groups, see Create Data Access Item Objects.

Step 7: View All Item Values

The group object lets you read and write values from all items in the group, and log data to memory and/or disk.

The Value, Quality, and Timestamp values of items continually update as long as you have Subscription enabled. Subscription controls whether data change events are sent by the OPC server to the toolbox, for items whose values change. UpdateRate and DeadbandPercent define how often the items must be queried for a new value, and whether all value changes or only changes of a specified magnitude are sent to the toolbox. For details on Subscription, see Data Change Events and Subscription.

By observing the data for a while, you will see that the three signals appear to have similar ranges. This indicates that you can visualize the data in the same axes when you plot it in Step 10.

In Step 9 you will configure a logging task and log data for the three items.

Use the read function with a group object as the first parameter to read values from all items in a group. The read function is discussed in detail in Read and Write Data on OPC DA Server.

Step 8: Configure Group Properties for Logging

Now that your dagroup object contains items, use the group to control the interaction of those items with the server. In this step, configure the group to log data from those items for 2 minutes at 0.2-second intervals. You can use the logged data in Step 9 to visualize the signals produced by the Matrikon Simulation Server.

OPC Data Access Servers provide access only to “live” data (the last known value of each server item in their name space). In many cases, a single value of a signal is not useful, and a time series containing the signal value over a period of time is helpful in analyzing that signal or signal set. Industrial Communication Toolbox™ allows you to log all OPC DA items in a group to disk or memory, and to retrieve that data for analysis in MATLAB®.

You configure a logging session using the dagroup object. By modifying the properties associated with logging, you control how often the data must be sent from the server to the client, how many records the group must log, and where to log the data.

Use the set function to set OPC object properties. From the command line you can calculate the number of records required for the logging task.

logDuration = 2*60;
logRate = 0.2;
numRecords = ceil(logDuration./logRate);
grp.UpdateRate = logRate;
grp.RecordsToAcquire = numRecords;

Step 9: Log OPC Server Data

Now that you configured the dagroup object's logging properties, your object can log the required amount of data to memory.

Use the start function with the required dagroup object to start a logging task.


The logging task occurs in the background. You can continue working in MATLAB while a logging task is in operation. The logging task is unaffected by other computations occurring in MATLAB, and MATLAB processing is not blocked by the logging task. You can instruct MATLAB to wait for the logging task to complete, using the wait function.


Step 10: Plot the Data

After logging finishes, transfer data from the toolbox engine to the MATLAB workspace using the getdata function, which provides two types of output, depending on its 'datatype' argument. For details, see the getdata reference page. In this case you retrieve the data into separate arrays, and plot the data.

This example produces the figure:

[logIDs, logVal, logQual, logTime, logEvtTime] = ...
axis tight

Notice how the three signals seem almost completely unrelated, except for the period of the two Real8 signals. The peak values for each signal are different, as are the periods for the two Triangle Waves signals. By visualizing the data, you can gain some insight into the way the Matrikon OPC Simulation Server simulates each tag. In this case, it is apparent that Real8 and UInt2 signals have a different period.

Step 11: Clean Up

After finishing an OPC task, you should remove the task objects from memory and clear the MATLAB workspace of the variables associated with these objects.

When using OPC objects at the MATLAB command line or from your own functions, you must remove them from the toolbox engine using the delete function. Note that when you delete a toolbox object, the children of that object are automatically removed from the toolbox engine. In this example, there is no need to delete grp and itm, as they are children of da.

clear da grp itm

OPC object management is discussed in detail in Delete Objects.