【问题标题】:How to continously log data and plot data using Data Aquisition Toolbox in MATLAB如何在 MATLAB 中使用 Data Acquisition Toolbox 连续记录数据和绘制数据
【发布时间】:2016-06-22 22:18:04
【问题描述】:

我正在使用数据采集工具箱收集数据。数据在后台收集。我正在从 8 个热电偶收集数据,并且能够打电话给我的听众来不断更新我的情节。但是,我还需要保存收集数据的文件、数组或某种日志。这是我的代码:

daq.getDevices;
s = daq.createSession('ni');
s.Rate = 1.8;
s.DurationInSeconds = 60;

ch1 = addAnalogInputChannel(s,'cDAQ1Mod1','ai0','Thermocouple');
ch2 = addAnalogInputChannel(s,'cDAQ1Mod1','ai1','Thermocouple');
ch3 = addAnalogInputChannel(s,'cDAQ1Mod1','ai2','Thermocouple');
ch4 = addAnalogInputChannel(s,'cDAQ1Mod1','ai3','Thermocouple');
ch5 = addAnalogInputChannel(s,'cDAQ1Mod1','ai4','Thermocouple');
ch6 = addAnalogInputChannel(s,'cDAQ1Mod1','ai5','Thermocouple');
ch7 = addAnalogInputChannel(s,'cDAQ1Mod1','ai6','Thermocouple');
ch8 = addAnalogInputChannel(s,'cDAQ1Mod1','ai7','Thermocouple');
ch1.ThermocoupleType = 'T';
ch2.ThermocoupleType = 'T';
ch3.ThermocoupleType = 'T';
ch4.ThermocoupleType = 'T';
ch5.ThermocoupleType = 'T';
ch6.ThermocoupleType = 'T';
ch7.ThermocoupleType = 'T';
ch8.ThermocoupleType = 'T';

fid1 = fopen('log.bin','w');
lh = addlistener(s,'DataAvailable', @plotData);
lh1 = addlistener(s,'DataAvailable',@(src, event)logData(src, event, fid1));

s.NotifyWhenDataAvailableExceeds = 20;
s.startBackground();

fclose(fid1);
fid2 = fopen('log.bin','r');
[data,count] = fread(fid2,[8,inf],'double');
fclose(fid2);

函数plotData是:

function plotData(src,event)
    plot(event.TimeStamps, event.Data)
    legend('Outside Sensor 1','Middle Sensor 1','Middle Sensor 2','Middle Sensor 4', ... 
           'External Sensor 2','Outside Sensor 2','Middle Sensor 3','External Sensor 1')
end

函数logData是:

function logData(src, evt, fid)
    data = [evt.TimeStamps, evt.Data]' ;
    fwrite(fid,data,'double');
end

知道如何在收集数据时保持数据的持续更新日志,同时更新收集到的所有数据点的日志文件吗?

【问题讨论】:

    标签: matlab data-acquisition


    【解决方案1】:

    除非您告诉它,否则 MATLAB 不会存储数据。在这种情况下,您应该预先分配一个变量、结构或文件来写入您的数据。

    有关创建和写入日志文件的帮助,请参阅此 MathWorks 链接:Acquire Continuous and Background Data Using NI Devices

    【讨论】:

    • 我试图从这个 Mathworks 链接添加代码 - 请参阅上面的更新代码。当我这样做时 - 连续绘图停止工作,据我所知,我没有记录任何数据。
    • 尝试添加另一个名称的第二个侦听器。 Listener1 可以保持不变: lh = addlistener(s,'DataAvailable', @plotData); fid1=fid1 = fopen('log.bin','w'); Listener2 应该记录数据: lh2 = addlistener(s,'DataAvailable',@(src, event)logData(src, event, fid1));其中 logData 是: function logData(src, evt, fid) data = [evt.TimeStamps, evt.Data]' ; fwrite(fid1,数据,'双');结束
    • 谢谢我已经按照你的建议更新了上面的代码。我现在收到此错误:“警告:为类 daq.ni.Session 定义的事件 DataAvailable 执行侦听器回调时发生错误:使用 fwrite 时出错 无效的文件标识符。使用 fopen 生成有效的文件标识符。logData 中的错误(第 3 行) ) fwrite(fid,data,'double');"有什么想法吗?
    • 你真的创建了 log.bin 文件吗?如果它尚不存在,您将无法在 fid1 中打开它。此外,请确保它与您的函数位于同一路径中。
    • 我能想到的唯一另一件事是您的 fclose 可能被放错位置/误用。看起来您正在关闭文件,同时仍在尝试写入它,因为您的数据收集中实际上没有 s.stop 。尝试根据您的 NotifyWhenDataAvailableExceeds 停止您的收藏
    猜你喜欢
    • 1970-01-01
    • 2022-09-23
    • 2021-09-17
    • 1970-01-01
    • 1970-01-01
    • 2020-06-20
    • 2015-02-17
    • 2013-09-15
    • 2020-09-04
    相关资源
    最近更新 更多