Российский производитель и разработчик сертифицированного измерительного оборудования с 1987 года


Вывод данных с АЦП с массив (не в файл)

Вы не вошли.

 Поиск | Регистрация | Вход 

Андрей
21.04.2011 02:28:50
#1

Гость

Вывод данных с АЦП с массив (не в файл)

Модуль Е14-140М. Библиотека Lusbapi v.3.3.
Программирование в Borland C++ Builder 6.

Подскажите пожалуйста как осуществить запись считанных данных в массив?
Во всех примерах запись ведется в файл, а мне нельзя расточать время на запись/считывание в/из файла, да и данных не так много, и сохранять нужно только результаты расчета.

За основу для сбора данных взят пример из //Examples//Borland C++ Builder 6.0//ReadData.
Понимаю, что нужно просто заменить кусок кода:

// запишем полученную порцию данных в файл
if(!WriteFile(    hFile, IoReq[RequestNumber^0x1].Buffer, 2*DataStep, &FileBytesWritten, NULL)) { ReadThreadErrorNumber = 0x4; break; }

но т.к. в С++ Builder не силен (а требование писать программу именно в этой среде) плохо представляю как сюда подпихнуть массив...
Каким типом корректно следует определить результирующий массив?

И второй, попутный вопрос.
Необходимо последовательно произвести сбор данных с одних каналов, а потом с других каналов. Мне нужно после выполнения первого сбора данных (перед переопределением структуры ADC_PARS_E140) освобождать интерфейс модуля ReleaseLInstance() и затем вызывать CreateLInstance?

21.04.2011 10:22:25
#2

Сотрудник "Л Кард"
Здесь с 18.04.2014
Сообщений: 810

Re: Вывод данных с АЦП с массив (не в файл)

То, из чего пишется в файл - и есть массив smile
Но вообще в этом случае можно вовсе убрать и цикл, и двойную буферизацию, и отдельный поток, оставив один вызов ReadData с нужной длиной. И все.

21.04.2011 10:29:49
#3

Сотрудник "Л Кард"
Здесь с 18.04.2014
Сообщений: 810

Re: Вывод данных с АЦП с массив (не в файл)

По второму вопросу: нет, разумеется, закрывать устройство не нужно.
Достаточно сделать STOP_ADC(), SET_ADC_PARS(), START_ADC(). В 140M допустимо даже сначала SET_ADC_PARS(), а потом STOP_ADC() - параметры вступают в силу только при следующем пуске.

Андрей
21.04.2011 11:54:35
#4

Гость

Re: Вывод данных с АЦП с массив (не в файл)

Пробую считывать IoReq[RequestNumber^0x1].Buffer, но ничего не получается - очевидно, не правильно это делаю:
for(int j = 0x0; j < DataStep; j++)
{
    SHORT DataTempFloat = (SHORT) IoReq[RequestNumber].Buffer;
    ... дальше пытаюсь обрабатывать DateTempFloat и перекидываю обработанные отсчеты в свой массив.
}


Если убираю цикл, буферизацию, поток и оставляю только ReadDate(), ошибка выскакивает на предварительном измерении.

// установим желаемые параметры АЦП
ap.ClkSource = INT_ADC_CLOCK_E140;
ap.EnableClkOutput = ADC_CLOCK_TRANS_DISABLED_E140;
ap.InputMode = NO_SYNC_E140;

ap.ChannelsQuantity = 1;
ap.ControlTable[0] = 0x3F; // 31-й канал, с общей землей, усиление = 1
ap.AdcRate = 10.0;
ap.InterKadrDelay = 0.1;

if(!pModule->SET_ADC_PARS(&ap))
    Application->MessageBox("Не могу выполнить функцию SET_ADC_PARS()!", "ОШИБКА!!!", MB_OK + MB_ICONINFORMATION);

// определим размер буфера
DataStep = 1*1024;
Datas = new SHORT[DataStep];

DWORD FileBytesWritten;
OVERLAPPED ReadOv[1];
IO_REQUEST_LUSBAPI IoReq[1];

IoReq[0].Buffer = Datas;
IoReq[0].NumberOfWordsToPass = DataStep;
IoReq[0].NumberOfWordsPassed = 0x0;
IoReq[0].Overlapped = &ReadOv[i];
IoReq[0].TimeOut = DataStep/ap.AdcRate + 1000;

// остановим работу АЦП и одновременно сбросим USB-канал чтения данных
if(!pModule->STOP_ADC())
{
    IsReadThreadComplete = true;
    Application->MessageBox("Не могу выполнить функцию STOP_ADC()!", "ОШИБКА!!!", MB_OK + MB_ICONINFORMATION);
}

// делаем предварительный запрос на ввод данных
if(!pModule->ReadData(&IoReq[0x0]))
{
    IsReadThreadComplete = true;
    Application->MessageBox("Не могу выполнить функцию ReadData!", "ОШИБКА!!!", MB_OK + MB_ICONINFORMATION);
}

// запустим АЦП
if(pModule->START_ADC())
{
    if(!pModule->ReadData(&IoReq[0x0]))
    {
        IsReadThreadComplete = true;
        Application->MessageBox("Не могу выполнить функцию ReadData!", "ОШИБКА!!!", MB_OK + MB_ICONINFORMATION);
    }
    for(int j = 0; j < DataStep; j++)
    {
        float DataTempFloat = (SHORT) Datas[j];
        if(DataTempFloat > 32768)
            DataTempFloat = DataTempFloat - 65536;
        Datas[j] = DataTempFloat*10/8192;
    }
}
// остановим работу АЦП
if(!pModule->STOP_ADC())
    Application->MessageBox("Не могу остановить!", "ОШИБКА!!!", MB_OK);

Андрей
21.04.2011 13:07:31
#5

Гость

Re: Вывод данных с АЦП с массив (не в файл)

С ошибкой разобрался - пропустил все, связанное с OVERLAPPED. Добавил - программа запускается, но измеряет нули. sad

Андрей
21.04.2011 14:46:03
#6

Гость

Re: Вывод данных с АЦП с массив (не в файл)

И тоже разобрался почему ноль.
Проблема решена. Спасибо!

21.04.2011 17:06:52
#7

Сотрудник "Л Кард"
Здесь с 18.04.2014
Сообщений: 810

Re: Вывод данных с АЦП с массив (не в файл)

Очевидно, потому что IoReq[RequestNumber].Buffer - это указатель на массив, а .Buffer[i] - это уже сами данные...