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


Buffer в структуре IO_REQUEST_LUSBAPI

Вы не вошли.

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

МОТ
08.03.2011 22:06:12
#1

Гость

Buffer в структуре IO_REQUEST_LUSBAPI

в мануале написано что данные в буфере распологаются покадрово. Причем это зависит от количества логических каналов в ControlTable. нашел константу MAX_CONTROL_TABLE_LENGTH_E140  равна 128.

Я немного переделал пример SynchroInput(builder c++), сделал там Chart вместо PaintBox :

//-- -------------------------------------------------------------------------
// отобразим все графики
//-- -------------------------------------------------------------------------
void __fastcall TChannelThread::RedrawViewer(void)
{
    DWORD i;
    MainForm->View->Series[0]->Clear();
    for(i = 0x0; i < PointsToRead; i++) {
    MainForm->Buffer[i] = ReadBuffer[i];
    MainForm->View->Series[0]->AddY(ReadBuffer[i]);
    }

}
View - это Chart.
Вот так выглядят получаемые данные:
[img][url]http://www.imagepost.ru/images/730/1.png[/img][/url]

http://www.imagepost.ru/?v=730/1.png

на синусойду не очень похожа...если честно не совсем понял принцип кадров. Если можно расскажите поподробнее...

МОТ
09.03.2011 10:08:09
#2

Гость

Re: Buffer в структуре IO_REQUEST_LUSBAPI

не понятно почему она такая широкая...

то есть как я понял кадр это  последовательность чисел , н-р 6340, 3456, 2332, 4343 ...
6340 для 1 канала
3456 для 2 канала
2332 для 3 канала
4343 для 4 канала
...
а как определить сколько по стандарту каналов тогда? мне например надо 4 серии сделать для 4 каналов. Поправьте ,Если не так понял...

09.03.2011 12:13:21
#3

Инженер-электронщик
Откуда: "Л Кард"
Здесь с 21.04.2014
Сообщений: 4,597

Re: Buffer в структуре IO_REQUEST_LUSBAPI

Если про E14-140 речь идет, то сразу определите, к какому контакту контакту разъёма что подключаете, и что у Вас за источник сигнала. Подобные картинки получаются, например, при неправильном подключении...

09.03.2011 12:17:59
#4

Сотрудник "Л Кард"
Здесь с 24.04.2014
Сообщений: 1,495

Re: Buffer в структуре IO_REQUEST_LUSBAPI

Текущий размер кадра задается параметром ChannelsQuantity. Например, если ChannelsQuantity = 2, то при Вашей последовательности чисел получаем:
6340 отсчет с  1ого канала для 1ого кадра;
3456 отсчет со 2ого канала для 1ого кадра;
2332 отсчет с  1ого канала для 2ого кадра;
4343 отсчет со 2ого канала для 2ого кадра;
и т.д. по циклу...

МОТ
09.03.2011 12:30:03
#5

Гость

Re: Buffer в структуре IO_REQUEST_LUSBAPI

Сергей ,  а вот в чем разница между виртуальными каналами и физическими? То есть логических каналов может быть 128. А на приборе 32 посути, 16 инвертирующих и 16 неинвертирующих.
Для эксперимента на 1 канала подвесил резистор и по логике должна получиться прямая линия, но получаю шум , вот  код
//-- -------------------------------------------------------------------------
// отобразим все графики
//-- -------------------------------------------------------------------------
void __fastcall TChannelThread::RedrawViewer(void)
{
    DWORD i;
    int count =0;
    double* tmpBuf;
        // выделим память для Viewer
    tmpBuf = new double[ChannelPoint * ChannelsQuantity];
    memset(tmpBuf, 0x0, sizeof(double)*ChannelPoint * ChannelsQuantity);

    MainForm->View->Series[0]->Clear();
    MainForm->View->Series[1]->Clear();
    MainForm->View->Series[2]->Clear();
    MainForm->View->Series[3]->Clear();
    for(i = 0x0; i < PointsToRead/8; i++) {
    MainForm->Buffer[i] = ReadBuffer[i];
    tmpBuf[i]=ReadBuffer[i];
    MainForm->View->Series[0]->AddY(ReadBuffer[i]);
    //MainForm->View->Series[1]->AddY(ReadBuffer[i+1]);
   //MainForm->View->Series[2]->AddY(ReadBuffer[i+2]);
    //MainForm->View->Series[3]->AddY(ReadBuffer[i+3]);
    //MainForm->Memo1->Lines->Add(IntToStr(MainForm->Buffer[i]));
    //count++;
    i+=128;
    }
   //    MainForm->View->Series[0]->AddArray(tmpBuf, count);
    //MainForm->View->Series[1]->AddY(ReadBuffer[i+1]);
    //MainForm->View->Series[2]->AddY(ReadBuffer[i+2]);
    //MainForm->View->Series[3]->AddY(ReadBuffer[i+3]);


}


я пытаюсь под себя переделать вашу прогу SynhroThread, там ChannelsQuantity =4 я оставил также... Не менял...
i+=128; надо делать? чтобы перескочить 128 логических каналов? Заранее извиняюсь за то что не догоняю)

МОТ
09.03.2011 12:31:37
#6

Гость

Re: Buffer в структуре IO_REQUEST_LUSBAPI

на LGRAPH проверил там прямая линия получается, то есть резистор нормально висит.

МОТ
09.03.2011 13:49:28
#7

Гость

Re: Buffer в структуре IO_REQUEST_LUSBAPI

а-а-а наверно 1 канала надо было сделать ChannelsQuantity=1... так как другие не заземлены, то так шум выводил...

09.03.2011 13:57:38
#8

Сотрудник "Л Кард"
Здесь с 24.04.2014
Сообщений: 1,495

Re: Buffer в структуре IO_REQUEST_LUSBAPI

1. Не совсем понятно какое именно изделие Вы используете.
2. Вместо понятия //'виртуальный//' мы применяем термин логический канал. Логический канал включает в себя номер физического канала модуля, а также, как правило, используемый для этого канала диапазон входного напряжения. Массив этих лог.каналов формирует управляющую таблицу (или
кадр отсчётов), которая и определяет циклическую последовательноть опроса АЦП. Всю эту информацию можно найти в руководстве программиста, в частности, в параграфе под названием //'Логический номер канала АЦП//'. Для примера управляющая таблица может быть такой {0x0, 0xA, 0x5, 0x2, 0x1, 0x0, 0x5 } и ChannelsQuantity = 4. Это означает, что размер кадра равен 4 и для оцифровки модулем будут использованы только первые 4 логических канала. При этом последовательность опроса физических каналов АЦП будет такой: 1ый канал, 11ый канал, 6ой канал, 3ий канал, 1ый канал, 11ый канал ... и т.д. по циклу.
3. Ваш цикл для ChannelsQuantity = 4 можно попробовать записать, например, так:
for(i = 0x0; i < PointsToRead/ChannelsQuantity; i++)
{
MainForm->View->Series[0]->AddY(ReadBuffer[0x0 + i*ChannelsQuantity]);
MainForm->View->Series[1]->AddY(ReadBuffer[0x1 + i*ChannelsQuantity]);
MainForm->View->Series[2]->AddY(ReadBuffer[0x2 + i*ChannelsQuantity]);
MainForm->View->Series[3]->AddY(ReadBuffer[0x3 + i*ChannelsQuantity]);
}

МОТ
09.03.2011 14:10:25
#9

Гость

Re: Buffer в структуре IO_REQUEST_LUSBAPI

Сергей, спасибо.
Хотелось бы уточнить. для модуля Е14-140М, в примерах для lusbapi33 есть пример SynchroInput,

Там в момент инициализации АЦП в методе(событии) FormShow, есть код :

    // формируем управляющую таблицу логических каналов
    for(i = 0x0; i < ap.ChannelsQuantity; i++) ap.ControlTable[i] = (WORD)(i |
                                                                                   (IsCommonGnd << 0x5)/*общая земля*/ |
                                                               (0x1 << 0x6)/*усиление 4*/);

он формирует эту таблицу  ControlTable.
Можете пояснить что значит   (0x1 << 0x6)/*усиление 4*/ ?
если коэффициент усиления 1 нужен ,то как?

09.03.2011 14:17:41
#10

Сотрудник "Л Кард"
Здесь с 24.04.2014
Сообщений: 1,495

Re: Buffer в структуре IO_REQUEST_LUSBAPI

1. Всё-таки неплохо бы было бы почитать руководство пользователя (http://www.lcard.ru/download/e14_140_pr … _guide.pdf). И в частности, параграф 3.2.3. //'Логический номер канала АЦП//'.
2. Если нужен коэффициент усиления равный 1, то пишем так:
for(i = 0x0; i < ap.ChannelsQuantity; i++) ap.ControlTable[i] = (WORD)(i);

МОТ
09.03.2011 14:22:31
#11

Гость

Re: Buffer в структуре IO_REQUEST_LUSBAPI

Сергей, спасибо. Понял. 0x1 << 0x6 сдвигаем и получаем 01000000 то естьпервые биты 01 то есть 4 коэффициент усиления, спасибо