This example shows how to save data acquired in the background to a file. Use the session-based interface and acquires analog input data using non-blocking commands. If you are using the legacy interface, refer to "Logging Data To Disk" in the Analog Input examples list
Create a session and add two analog input channels with Voltage measurement type. For this example use National Instruments X Series data acquisition device, NI PCIe-6363 card with ID Dev1.
d = daq.getDevices; s = daq.createSession('ni'); s.addAnalogInputChannel('Dev1',0:1, 'Voltage'); s
s = Data acquisition session using National Instruments hardware: Will run for 1 second (1000 scans) at 1000 scans/second. Number of channels: 2 index Type Device Channel MeasurementType Range Name ----- ---- ------ ------- --------------- ---------------- ---- 1 ai Dev1 ai0 Voltage (Diff) -10 to +10 Volts 2 ai Dev1 ai1 Voltage (Diff) -10 to +10 Volts
Create the file log.bin and open it. You will write the acquired data to this file in binary format. Save the file identifier in the variable fid1.
fid1 = fopen('log.bin','w');
When you acquire data in the background, you can provide the acquisition session directions to handle the incoming data, using listeners and events. A DataAvailable event occurs when a specific amount of data is available to the session. A listener can respond to that event and initiate specified function.
Use addlistener to add an anonymous function to the session. This function is called every time the DataAvailable event occurs, and logs the acquired data to a file. By default this listener is called 10 times per second.
The anonymous function logData requires three inputs:
src- source of the event
event- name of the event
fid1- file identifier for logging data
When you add a listener, a handle to the listener is returned. Save the handle in the variable lh and delete it later.
lh = s.addlistener('DataAvailable',@(src, event)logData(src, event, fid1));
Acquire data continuously in a non-blocking mode.
s.IsContinuous = true; s.startBackground;
Continuous background acquisition runs in parallel with other operations on MATLAB. You can execute MATLAB commands while the acquisition is running. For the purpose of this example, simulate a long computation by calling pause.
Explicitly call stop after 5 seconds to end the background acquisition and delete the listener.
Close the log file.
s.stop; delete(lh); fclose(fid1);
Read the log file.
Load file contents as a 3 column matrix into data.
Close the log file.
fid2 = fopen('log.bin','r'); [data,count]= fread(fid2,[3,inf],'double'); fclose(fid2);
Assign each column of data to the following variables:
ch- channel 0 and channel 1
Plot ch against t.
t = data(1,:); ch = data(2:3,:); plot(t, ch);
Create a multi-line function logData and store in a separate MATLAB file.
function logData(src, evt, fid) % Add the time stamp and the data values to data. To write data sequentially, % transpose the matrix. % Copyright 2011 The MathWorks, Inc. data = [evt.TimeStamps, evt.Data]' ; fwrite(fid,data,'double'); end