Log Analog Input Data to a File Using NI Devices
This example shows how to save data acquired in the background to a file.
Create a DataAcquisition with Analog Input Channels
Create a DataAcquisition and add two analog input channels with Voltage
measurement type. For this example use a National Instruments® X Series data acquisition device, NI PCIe-6363 card with ID Dev1
.
d = daqlist("ni")
d = 12×4 table DeviceID Description Model DeviceInfo ___________ __________________________________ _____________ ____________________ "cDAQ1Mod1" "National Instruments NI 9205" "NI 9205" [1×1 daq.DeviceInfo] "cDAQ1Mod2" "National Instruments NI 9263" "NI 9263" [1×1 daq.DeviceInfo] "cDAQ1Mod3" "National Instruments NI 9234" "NI 9234" [1×1 daq.DeviceInfo] "cDAQ1Mod4" "National Instruments NI 9201" "NI 9201" [1×1 daq.DeviceInfo] "cDAQ1Mod5" "National Instruments NI 9402" "NI 9402" [1×1 daq.DeviceInfo] "cDAQ1Mod6" "National Instruments NI 9213" "NI 9213" [1×1 daq.DeviceInfo] "cDAQ1Mod7" "National Instruments NI 9219" "NI 9219" [1×1 daq.DeviceInfo] "cDAQ1Mod8" "National Instruments NI 9265" "NI 9265" [1×1 daq.DeviceInfo] "Dev1" "National Instruments PCIe-6363" "PCIe-6363" [1×1 daq.DeviceInfo] "Dev2" "National Instruments NI ELVIS II" "NI ELVIS II" [1×1 daq.DeviceInfo] "Dev3" "National Instruments PCIe-6363" "PCIe-6363" [1×1 daq.DeviceInfo] "Dev4" "National Instruments PCIe-6363" "PCIe-6363" [1×1 daq.DeviceInfo]
deviceInfo = d{9, "DeviceInfo"}
deviceInfo = ni: National Instruments PCIe-6363 (Device ID: 'Dev1') Analog input supports: 7 ranges supported Rates from 0.0 to 2000000.0 scans/sec 32 channels ('ai0' - 'ai31') 'Voltage' measurement type Analog output supports: -5.0 to +5.0 Volts,-10 to +10 Volts ranges Rates from 0.0 to 2000000.0 scans/sec 4 channels ('ao0','ao1','ao2','ao3') 'Voltage' measurement type Digital IO supports: 39 channels ('port0/line0' - 'port2/line6') 'InputOnly','OutputOnly','Bidirectional' measurement types Counter input supports: Rates from 0.1 to 100000000.0 scans/sec 4 channels ('ctr0','ctr1','ctr2','ctr3') 'EdgeCount','PulseWidth','Frequency','Position' measurement types Counter output supports: Rates from 0.1 to 100000000.0 scans/sec 4 channels ('ctr0','ctr1','ctr2','ctr3') 'PulseGeneration' measurement type
dq = daq("ni"); addinput(dq, "Dev1", 0:1, "Voltage"); dq.Channels
ans = Index Type Device Channel Measurement Type Range Name _____ ____ ______ _______ ________________ __________________ __________ 1 "ai" "Dev1" "ai0" "Voltage (Diff)" "-10 to +10 Volts" "Dev1_ai0" 2 "ai" "Dev1" "ai1" "Voltage (Diff)" "-10 to +10 Volts" "Dev1_ai1"
Create a Log File
Create the file log.bin
and open it. The file identifier is used to write to the file.
fid1 = fopen("log.bin","w");
Set the ScansAvailableFcn
During a background acquisition, the DataAcquisition can be directed to handle acquired data in a specified way using the ScansAvailableFcn
property.
dq.ScansAvailableFcn = @(src, evt) logData(src, evt, fid1);
Acquire Data in the Background
Use start
to acquire data for five seconds.
start(dq, "Duration", seconds(5))
During normal operation, other MATLAB commands can execute during this acquisition. For this example, use pause
in a loop to monitor the number of scans acquired for the duration of the acquisition.
while dq.Running pause(0.5) fprintf("While loop: Scans acquired = %d\n", dq.NumScansAcquired) end fprintf("Acquisition has terminated with %d scans acquired\n", dq.NumScansAcquired);
Close the Log File
fclose(fid1);
Load Data From the Log File
Load file contents as a 3-column matrix into data
.
fid2 = fopen('log.bin','r'); [data,count] = fread(fid2,[3,inf],'double'); fclose(fid2);
Assign and Plot the Data
t = data(1,:); ch = data(2:3,:); plot(t, ch);
function logData(src, ~, fid) [data, timestamps, ~] = read(src, src.ScansAvailableFcnCount, "OutputFormat", "Matrix"); data = [timestamps, data]' ; fwrite(fid,data,'double'); end
While loop: Scans acquired = 500 While loop: Scans acquired = 1000 While loop: Scans acquired = 1500 While loop: Scans acquired = 2000 While loop: Scans acquired = 2500 While loop: Scans acquired = 3000 While loop: Scans acquired = 3500 While loop: Scans acquired = 4000 While loop: Scans acquired = 4500 While loop: Scans acquired = 5000 Acquisition has terminated with 5000 scans acquired