2

最近、MATLAB を使用してデータ収集ボードからデータを収集し始めたばかりで、継続的にデータを収集する関数が必要でした (つまり、ctrl^C で関数を終了するまで)。これを行うために、32 ビット Windows OS でデータ取得ツールボックスを使用しています。

matlab ヘルプのドキュメントとこのサイトのいくつかの回答に基づいて、チャネルを入力ハンドルに追加した後、次のことを行う必要があることがわかりました。

  1. 「SamplesPerTrigger」を Inf に設定します
  2. 「TimerPeriod」を何らかの値に設定して、「TimerFcn」をトリガーします
  3. 「TimerFcn」を、データを永続変数に追加するサブ関数コールバックに設定します

これは正しい方法ですか?

私のコードは次のとおりです。

  function acquire_arena_test(samprate,daq_device ,device_ID ,channels, saveroot)
        setup.SampleRate = samprate;
        setup.DAQdevice = {daq_device, device_ID};
        setup.AIChannels = channels;            
        setup.SaveRoot = {saveroot};


        ai = analoginput(setup.DAQdevice{1},setup.DAQdevice{2});
        addchannel(ai,[setup.AIChannels]);
        set(ai,'SamplesPerTrigger',Inf);
        set(ai,'TimerPeriod',0.5);
        set(ai,'TimerFcn',{@AcquireData,ai});

        start(ai);

        while(strcmpi(get(ai,'Running'),'On'))
            pause(1)
        end

        stop(ai);
        time = datestr(now,30);
        save([saveroot time], 'data');
        delete(ai);
        clear ai;


        function AcquireData(hObject, ~)
            persistent totalData;
            data = getdata(hObject);
            if isempty(totalData)
                totalData =data;
            else
                totalData = [totalData; data];
            end

初期のアナログ入力は間違いなく正常に機能しています。「TimerFcn」に AcquireData コールバックを与える多くの順列を試しました。私が受け取るエラーは

??? ==> acquire_arena_test>AcquireData の使用エラー 入力引数が多すぎます。

警告: TimerFcn コールバックが無効になっています。コールバックを有効にするには、TimerFcn プロパティを設定します。`

助けてくれてありがとう。

4

2 に答える 2

1

TimerFcn の設定に使用する構文が間違っていると思います。あなたが書く

set(ai,'TimerFcn',{@AcquireData,ai});

ただし、これは、関数 AcquireData がツリー パラメーターで呼び出されることを意味します。ここで説明されAcquireData(ai, event, ai)ているように、関数は 2 つのパラメーターしか受け入れないため、もちろんエラー メッセージがトリガーされます。コードを次のように変更するだけですAcquireData

set(ai,'TimerFcn',@AcquireData);

そしてそれはうまくいくはずです。ai オブジェクトは最初のパラメーターとして自動的に渡されます (上記の MATLAB ドキュメントへのリンクを参照してください)。

于 2011-08-31T18:29:20.313 に答える
1

自分の質問に答えて申し訳ありませんが、私はそれを理解しました。結局、トリガーは必要ありませんでした。National Instruments ボード (またはサウンド カード) を使用すると、LoggingMode を 'disk' に変更し、.daq (データ取得ツールボックス) ファイルを保存するファイルを指定して、LogFileName として保存することができます。ボード上のメモリを使用する場合は、モードを disk&Memory に変更します。役立つドキュメント:

http://www.mathworks.com/help/toolbox/daq/f12-16658.html

以下のスクリプトは、一時停止中に必要なだけデータを取得します。

daqreset;
clear all;
ai = analoginput('nidaq','Dev1');
chans = addchannel(ai,0:6);
set(ai,'SamplesPerTrigger',Inf);
set(ai,'SampleRate',1000)
set(ai,'LogToDiskMode','Overwrite')
set(ai,'LogFileName','log.daq')
set(ai,'LoggingMode', 'disk') 

start(ai)

pause()
stop(ai)

data = daqread('log.daq');
delete(ai);

これを正しく機能させるには、'SamplesPerTrigger' を Inf に設定する必要があることに注意してください。Jonas の協力にも感謝します。

于 2011-08-31T21:32:49.633 に答える