Documentation

Acquire Data from an OPC Data Access Server

This example illustrates the basic steps involved in using OPC Toolbox™ to acquire data from an OPC Server.

PREREQUISITES:

Create OPC Data Access™ Object Hierarchy

Create an opcda object associated with the required server and connect to the server.

da = opcda('localhost', 'Matrikon.OPC.Simulation.1')
connect(da)
da =
Summary of OPC Data Access Client Object: localhost/Matrikon.OPC.Simulation.1
   Server Parameters
      Host      : localhost
      ServerID  : Matrikon.OPC.Simulation.1
      Status    : disconnected
      Timeout   : 10 seconds
   Object Parameters
      Group     : 0-by-1 dagroup object
      Event Log : 0 of 1000 events

Create a group object to manage the required items.

grp = addgroup(da, 'DemoGroup')
grp =
Summary of OPC Data Access Group Object: DemoGroup
   Object Parameters
      Group Type   : private
      Item         : 0-by-1 daitem object
      Parent       : localhost/Matrikon.OPC.Simulation.1
      Update Rate  : 0.5
      Deadband     : 0%
   Object Status
      Active       : on
      Subscription : on
      Logging      : off
   Logging Parameters
      Records      : 120
      Duration     : at least 60 seconds
      Logging to   : memory
      Status       : Waiting for START.
                     0 records available for GETDATA/PEEKDATA

Add the Real8 item from Saw-Toothed Waves and the Real8 and UInt2 items from Triangle Waves to the group.

itmIDs = {'Saw-toothed Waves.Real8', ...
    'Triangle Waves.Real8', ...
    'Triangle Waves.UInt2'};
itm = additem(grp, itmIDs)
itm =
   OPC Item Object Array:
   Index:  Active:  ItemID:             Value:                Quality:    TimeStamp:
   1       on       ...hed Waves.Real8                        Bad: Ou...   
   2       on       ...gle Waves.Real8                        Bad: Ou...   
   3       on       ...gle Waves.UInt2                        Bad: Ou...   

Configure OPC Toolbox Object Properties

Configure the group to log 60 seconds of data at 0.2 second intervals.

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

Acquire OPC Server Data

Start the acquisition task, and wait for the task to complete before continuing execution of any MATLAB code.

start(grp)
wait(grp)

Note that while waiting for a logging task to complete, MATLAB will continue to process callbacks from OPC Toolbox objects (and other objects that include callback functionality).

Retrieve the logged data into separate arrays for the time stamps, quality and values.

[logIDs, logVal, logQual, logTime, logEvtTime] = getdata(grp, 'double');

Examine the workspace for the sizes of the data

whos log*
  Name               Size            Bytes  Class     Attributes

  logDuration        1x1                 8  double              
  logEvtTime       300x1              2400  double              
  logIDs             1x3               306  cell                
  logQual          300x3             86382  cell                
  logRate            1x1                 8  double              
  logTime          300x3              7200  double              
  logVal           300x3              7200  double              

Plot the Data

You can now plot this data all on one axes. The datetick function converts the X-axis ticks into formatted date strings.

plot(logTime, logVal);
axis tight
datetick('x', 'keeplimits')
legend(logIDs)

The Value data does not provide the full picture. You should always examine the Quality of the data to determine the validity of the Value array.

Annotate the plot with markers where the quality is not Good.

hold on
isBadQual = strncmp(logQual, 'Bad', 3);
isRepeatQual = strncmp(logQual, 'Repeat', 6);
for k = 1:size(logQual,2)
    badInd = isBadQual(:,k);
    plot(logTime(badInd, k), logVal(badInd, k), 'ro', ...
        'MarkerFaceColor','r', 'MarkerEdgeColor','k')
    repInd = isRepeatQual(:,k);
    plot(logTime(repInd, k), logVal(repInd, k), 'ro', ...
        'MarkerFaceColor',[0.8 0.5 0], 'MarkerEdgeColor','k')
end
hold off

Bad quality is marked in red, and Repeat quality is marked in orange.

Clean Up

Disconnect and delete the client object from the OPC Toolbox engine.

disconnect(da)
delete(da)
Was this topic helpful?