Постоянно получать данные в MATLAB, используя обратные вызовы и постоянные переменные - PullRequest
2 голосов
/ 31 августа 2011

Я только недавно начал использовать MATLAB для получения данных с платы сбора данных и нуждался в функции для непрерывного сбора данных (т.е. до тех пор, пока я не выйду из функции).Для этого я использую набор инструментов для сбора данных в 32-битной операционной системе Windows.

Основываясь на документации в справке по 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

Исходный аналоговый вход определенно работает правильно.Я попытался много перестановок для передачи обратного вызова AcquireData к TimerFcn.Я получаю ошибку

`???Ошибка при использовании ==> acqu_arena_test> AcquireData Слишком много входных аргументов.

Предупреждение. Обратный вызов TimerFcn отключен.Чтобы включить обратный вызов, установите свойство TimerFcn.`

Заранее спасибо за любую помощь.

Ответы [ 2 ]

1 голос
/ 01 сентября 2011

Извините, что ответил на мой вопрос, но я понял это. Спусковой крючок не был нужен в конце концов. Используя национальную панель инструментов (или звуковую карту, как оказалось), вы можете просто изменить LoggingMode на «диск» и указать файл для сохранения файла .daq (набор инструментов для сбора данных), который будет сохранен как в LogFileName. Если вы хотите использовать память на своей плате, измените режим на диск и память. Полезный документ:

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. Спасибо Джонасу за помощь.

1 голос
/ 31 августа 2011

Я думаю, что синтаксис, который вы используете для настройки TimerFcn, неверен.Вы пишете

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

, но это означает, что ваша функция AcquireData будет вызываться с параметрами дерева: AcquireData(ai, event, ai) как объяснено здесь , что, конечно, вызывает сообщение об ошибке, так как ваш AcquireData функция принимает только два параметра.Просто измените свой код на

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

, и он должен работать;объект ai автоматически передается в качестве первого параметра (см. ссылку на документацию MATLAB выше).

...