Меню
+7 (495) 785-95-25
sale@lcard.ru
sale@lcard.ru
Здравствуйте, Александр!
Спасибо Вам за Вашу помощь.
Название датчика САПФИР-22М. Этот класс датчиков описан в документе "преобразователи_давления.pdf" : https://yadi.sk/i/9XQvrFxweFiiN.
Мы используем четырехпроводную линию связи для датчиков с предельными занчениями выходного сигнала - 4-20мА. Схема подключения приведена на странице 26 документа "преобразователи_давления.pdf". С Rн снимаем напряжение, которое является входным для LCard.
Мы используем два САПФИРа, которые подключены на один канал двухканального блока питания, работающего от переменного напряжения ~220 В. На выходе блок питания выдает постоянное напряжение 36 В. САПФИРы не заземлены, как не заземлен обычный стационарный компьютер, питающийся от ~220 В и LCard.
САПФИРы подключены на 1 и 2 каналы LCard, длины экранированного кабеля, соединяющего их с прибором, равны и составляют ~1 м. Кабели подключены параллельно Rн оплеткой к одной клемме (например - 5) и ценральным проводом - к другой (напрмер - 6). Перемена клемм (центральный провод подключается к 5, а оплетка к клемме 6) ведет к изменению знака регистрируемого сигнала.
Данные на блок питания и схему подключений нарисую завтра с утра и выложу на форум в виде ссылки.
спасибо
прошу прощения - ошибся,
в L-Graph включены два канала, каждый по 3 вольта. Данные одного кнала умножаются на -1, чтобы данные вдоха и выдоха (которые измеряет датчик давления) визуально разделить.
Все остальные настройки - по умолчанию
спасибо
А какие временные настройки в L-Graph стоят.
вот эти - я их продублировал с предыдущего поста
adcPar.t2.s_Type = L_ADC_PARAM;
adcPar.t2.AutoInit = 1;
adcPar.t2.dRate = 1000.0;
adcPar.t2.dKadr = 0.0;
adcPar.t2.SynchroType = 0x01; //0x84;//0x01;
adcPar.t2.SynchroSrc = 0x00;
adcPar.t2.AdcIMask = SIG_0 | V30_0 | SIG_1 | V30_1;
adcPar.t2.NCh = 2;
adcPar.t2.Chn[0] = 0x0;
adcPar.t2.Chn[1] = 0x1;
adcPar.t2.FIFO = 32768;
adcPar.t2.IrqStep = 32768;
adcPar.t2.Pages = 32;
adcPar.t2.IrqEna = 1;
adcPar.t2.AdcEna = 1;
// extra sync mode
adcPar.t2.StartCnt = 0;
adcPar.t2.StopCnt = 0;
adcPar.t2.DM_Ena = 0;
adcPar.t2.SynchroMode = 0;//A_SYNC_UP_EDGE | CH_0; // 0
adcPar.t2.AdPorog = 0;
или там есть еще настройки?
... в продолжение описания проблемы
Сергей, похоже, что это электрическая зависимость контуров самих внешних источников тока в данной схеме подключения. Приводите подробную схему подключения, а также схему (или подробные характеристики) самих источников тока. Как заземлён компьютер? Источники тока изолированы от земли?
Источниками тока в данном случае являются два датчика давления САПФИР-22. Они питаются от одного канала блока питания с напряжением 36 В. Датчики измеряют давление в диапазоне 0-2500Па, 0 - соответсвует 4 мА, 2500Па - 20мА. Выходы ддатчиков соединены через экранированный провод с прибором.Падение напряжения продуцируется резистором в 200 Ом.
спасибо
Здравствуйте,
вопрос про то, что означено в теме. Ниже приведены настройки прибора, как вы писали:
adcPar.t2.s_Type = L_ADC_PARAM;
adcPar.t2.AutoInit = 1;
adcPar.t2.dRate = 1000.0;
adcPar.t2.dKadr = 0.0;
adcPar.t2.SynchroType = 0x01; //0x84;//0x01;
adcPar.t2.SynchroSrc = 0x00;
adcPar.t2.AdcIMask = SIG_0 | V30_0 | SIG_1 | V30_1;
adcPar.t2.NCh = 2;
adcPar.t2.Chn[0] = 0x0;
adcPar.t2.Chn[1] = 0x1;
adcPar.t2.FIFO = 32768;
adcPar.t2.IrqStep = 32768;
adcPar.t2.Pages = 32;
adcPar.t2.IrqEna = 1;
adcPar.t2.AdcEna = 1;
// extra sync mode
adcPar.t2.StartCnt = 0;
adcPar.t2.StopCnt = 0;
adcPar.t2.DM_Ena = 0;
adcPar.t2.SynchroMode = 0;//A_SYNC_UP_EDGE | CH_0; // 0
adcPar.t2.AdPorog = 0;
При них прибор читает только один канал (тот, абсолютное значение отсчетов для которого больше). Второй показывает так, как будто провод от входа отключен. Каналы подключены к датчикам с выходным сигналом 4-20мА через сопротивление 200 Ом. Напряжение на сопротивлении того канала, который не читается также падает до 0.
Ниже привожу картинку https://yadi.sk/i/vcxgpoH7eFKtX. На экране представлены четыре столбца данных - первые два нули (они не несут информации), остальные два - первый и второй канал прибора. Как только значение одного из каналов становится больше чем значение другого канала, он сразу включается, а первый выключается. Поочередно входы и каналы проверялись с положительным результатом - они работали стабильно, без помех.
Скажите пожалуйста как мне завести два канала сразу. Стандартная ваша программа LGraph-2 регистрирует два канала.
спасибо
Здравствуйте,
сейчас проверяли прибор на LGraph2 - там выставлен предел измерения 1 вольт. На программе, написанной при помощи библиотеки lcomp прибор показывает значение 8000 при 3 вольтах. Скажите пожалуйста как программно настроить входы прибора на нужный диапазон измерения,
спасибо
Здравствуйте, Александр,
спасибо Вам за Ваш ответ. Компьютер не заземлен, установка, заземлена. Но, при такой же схеме подключения - Ваша программа Lgraph 2 работала нормально. Значит это вообще не аппаратный дефект?
спасибо
Здравствуйте,
возникает такая ситуация с E20-10:
Подключаем два токовых входа к прибору (4-20 мА), при сопротивлении 50 Ом на каждом. Настройки прибора приведены ниже:
// настроили параметрыы сбора
adcPar.t2.s_Type = L_ADC_PARAM;
adcPar.t2.AutoInit = 1;
adcPar.t2.dRate = 100.0;
adcPar.t2.dKadr = 0.0;
adcPar.t2.SynchroType = 0x01;//0x84;//0x01;
adcPar.t2.SynchroSrc = 0x00;
adcPar.t2.AdcIMask = SIG_0|SIG_1|GND_2|GND_3;
adcPar.t2.NCh = 2;
adcPar.t2.Chn[0] = 0x0;
adcPar.t2.Chn[1] = 0x1;
// adcPar.t2.Chn[1] = 0x1;
// adcPar.t2.Chn[0] = 0x2;
//adcPar.t2.Chn[1] = 0x3;
adcPar.t2.FIFO = 32768;
adcPar.t2.IrqStep = 32768;
adcPar.t2.Pages = 32;
adcPar.t2.IrqEna = 1;
adcPar.t2.AdcEna = 1;
// extra sync mode
adcPar.t2.StartCnt = 0;
adcPar.t2.StopCnt = 0;
adcPar.t2.DM_Ena = 0;
adcPar.t2.SynchroMode = 0;//A_SYNC_UP_EDGE | CH_0; // 0
adcPar.t2.AdPorog = 0;
При регистрации без ошибок опрашиваются два канала. При этом, канал, который получает меньшие значения автоматически заземляется. Напряжение на резисторе, сопротивлении - падает до 0. Данные канала, который показывает большее значение отображаются верно.
При переключении каналов - картина повторяется. Т.е., если первый канал показывает большие значения - второй заземляется. При перемене их местами - заземляется первый канал.
спасибо
Здравствуйте,
спасибо за Ваш ответ. Т.е., если я правильно понял при установкt
adcPar.t2.NCh = 2;
adcPar.t2.Chn[0] = 0x0;
adcPar.t2.Chn[1] = 0x1;
adcPar.t2.Chn[2] = 0x0;
adcPar.t2.Chn[3] = 0x1;
получается последовательность
<1>, <2>, <1>, <2>,<1>,<2>
.
А какой формируется кадр при следующих установках (когда количество опрашиваемых каналов установлено 2, но в массиве присутсвуют номера 3 и 4 кадра)?
adcPar.t2.NCh = 2;
adcPar.t2.Chn[0] = 0x0;
adcPar.t2.Chn[1] = 0x1;
adcPar.t2.Chn[2] = 0x2;
adcPar.t2.Chn[3] = 0x3;
спасибо
Здравствуйте,
скажите пожалуйста, достаточно ли установить параметр adcPar.t2.NCh = 2 чтобы lcard e2010 регистрировал два канала?
adcPar.t2.AdcIMask = SIG_0|SIG_1|GND_2|GND_3;
adcPar.t2.NCh = 2;
adcPar.t2.Chn[0] = 0x0;
adcPar.t2.Chn[1] = 0x1;
adcPar.t2.Chn[2] = 0x2;
adcPar.t2.Chn[3] = 0x3;
Т.е. правильно ли я понимаю, что при установке adcPar.t2.NCh = 1 прибор регистрирует первый канал в виде:
<1>, <1>, <1>, <1>, <1>, <1>, ... , <1>
? А при установке adcPar.t2.NCh = 2 прибор регистрирует данные первого и второго каналов в виде:
<1>, <2>, <1>, <2>, <1>, <2>, <1>, <2>, <1>, <2>, <1>, <2>, <1>, <2>, ...
- как описано в инструкции к прибору?
Какую функцию выполняет тогда параметр
adcPar.t2.Chn[]
? В документации на прибор этот параметр упомянут как коэффициент усиления входного синала.
спасибо
а то значение, которое задается вашей программой, оно сохраняется потом при выключении прибора?
Здравствуйте,
спасибо Вам за ответ, я это уже реализовал. Скажите, вот еще вопрос - можно ли настроить программно , например структурой ADC_PAR уровни напряжений на входе прибора 0,3В, 1В или 3В?
спасибо
Здравствуйте,
скажите пожалуйста, как можно посчитать время заполнения большого кольцевого буфера? Например, как посчитать, за какое время будет заполняться буфер размером 1048576 машинных слов (DWORD)? Известно время между кадрами в миллисекундах, но неизвестно время заполнения одного кадра, содержащего данные по двум каналам.
Как заполняется буфер данными, полученными с разных каналов? Из документа http://www.lcard.ru/download/e2010_prog … _guide.pdf я понял, что вперемешку. Т.е. данные первого канала адресуются как data[0], data[2], data[4], data[6], ... ,а второго, соответственно data[1], data[3], data[5], data[7], ... ?
с наступающим Новым Годом и Рождеством,
спасибо
я испытывал при 5.0. Тогда, при порции 32 К, ждать необходимо около 160 секунд, получается. Я так долго не ждал. Спасибо Вам за ответ - ситуация теперь понятна.
Вчера всплыла еще одна. Размер большого буфера у меня получается 1048576, как произведение IrqStep и Pages (32768 * 32). В примере l7xx.tst собираются половинки буфера. Я вчера попробовал собрать целиком весь. В куске кода, который собирает информацию из буфера:
unsigned long s;
InterlockedExchange (&s, *sync);
ULONG fl2, fl1 = fl2 = (s <= halfbuffer) ? 0 : 1;
// ожидание заполнения буфера
while (fl2 == fl1) {
InterlockedExchange (&s, *sync);
fl2 = (s <= halfbuffer) ? 0 : 1;
std::cout << s << " ";
}
std::cout << halfbuffer << " "
<< ((signed short *)data) [halfbuffer - 1]
<< std::endl;
InterlockedExchange (&s, *sync);
fl1 = (s <= halfbuffer) ? 0 : 1;
Sleep(200);
при значении
ULONG halfbuffer = adcPar.t2.IrqStep * adcPar.t2.pages / 1;
равном 1048576 (т.е. длине кольцевого буфера), все время крутится цикл ожидания заполнения буфера, переменная s при этом всегда равна 0.
При значении halfbuffer, равном 131072 (т.е. ~ в 10 раз меньшем, значение взято произвольным образом как произведение 1024 * 128) цикл ожидания крутится не бесконечно, значение переменной s изменяется, сбор данных вроде бы происходит , но, очевидно не полностью.
Скажите пожалуйста можно ли при сборе и обработке данных рассматривать весь буфер целиком, если да, то что я делаю неправильно?
спасибо
Здравствуйте,
скажите пожалуйста, почему при установленном adcPar.t2.dKadr, равном 0, сбор данных происходит, при значении, отличном от 0 - нет. Настройки привел ниже.
adcPar.t2.s_Type = L_ADC_PARAM;
adcPar.t2.AutoInit = 1;
adcPar.t2.dRate = 1000.0;
adcPar.t2.dKadr = 0.0;
adcPar.t2.SynchroType = 0x01;//0x84;//0x01;
adcPar.t2.SynchroSrc = 0x00;
adcPar.t2.AdcIMask = SIG_0|SIG_1|GND_2|GND_3;
adcPar.t2.NCh = 1;
adcPar.t2.Chn[0] = 0x0;
adcPar.t2.FIFO = 32768;
adcPar.t2.IrqStep = 32768;
adcPar.t2.Pages = 32;
adcPar.t2.IrqEna = 1;
adcPar.t2.AdcEna = 1;
// extra sync mode
adcPar.t2.StartCnt = 0;
adcPar.t2.StopCnt = 0;
adcPar.t2.DM_Ena = 0;
adcPar.t2.SynchroMode = 0;//A_SYNC_UP_EDGE | CH_0; // 0
adcPar.t2.AdPorog = 0;
спасибо
Здравствуйте,
подскажите пожалуйста, где можно прочитать про организацию большого кольцевого буфера подробно?
В описании
Устройство АЦП собирает данные в кольцевой буфер или FIFO, реализованный в ОЗУ сигнального процессора или микросхемы ПЛИС. При заполнении части буфера генерируется прерывание. Драйвер устройства по этим прерываниям вычитывает данные и помещает их в большой кольцевой буфер, реализованный в ОЗУ компьютера. Большой кольцевой буфер драйвера доступен пользовательскому приложению - имеется указатель на начало этого буфера. Кроме этого пользователю доступен счетчик заполнения буфера (тоже посредством указателя). Используя этот счетчик, пользователь может забирать данные из правильной части кольцевого буфера (т.е. из той, в которую драйвер уже записал данные)
ничего не сказано про половинки кольцевого буфера. При этом в прилагаемом к библиотеке примере они используются.
unsigned long s;
InterlockedExchange (&s, *sync);
// настройка флагов
ULONG fl2, fl1 = fl2 = (s <= halfbuffer) ? 0 : 1;
void * tmp, * tmp1;
// цикл по необходимомму количеству половинок
for (int i = 0; i < multi; i ++) {
while (fl2 == fl1) {
if (InterlockedCompareExchange (&complete, 3, 3))
return 0;
InterlockedExchange (&s, *sync);
// ждем заполнения половинки буфера
fl2 = (s <= halfbuffer) ? 0 : 1;
}
tmp1 = ((char *)data + (halfbuffer * fl1) * pointsize);
// записываем данные в файл
// memcpy (tmp, tmp1, halfbuffer * pointsize);
InterlockedExchange (&s, *sync);
// обновляем флаг
fl1 = (s <= halfbuffer) ? 0 : 1;
// если собираем медленно то можно и спать больше
Sleep (20);
}
Например, у меня получилась длина большого кольцевого буфера - 30001152 слов. При этом количество страниц IrqStep в кольцевом буфере PC равно 32, а сама переменная IrqStep определена как 32768, т.е. по этим данным получается длина буфера 1048576 - ровно (?!) в 28 раз меньше полученной длины кольцевого буфера. Как используется остальная часть кольцевого буфера?
Можно ли через счетчик *sync адресовать пространство буфера, не дожидаясь заполнения его частей (как это можно понять из описания)?
спасибо,
Переделал преобразование к signed short. Получил следующие значения :
...
7
7
10
8
8
9
9
11
9
...
Правильно ли я понимаю, что при настроенных пределах измерения +- 0,3 вольта, значению -0,3 вольта соответствует значение -32768, а +0,3 вольта - 32767? В таком случае полученные значения, которые приведены выше означают, что сигнал незначительно колеблется около 0?
спасибо
Вместе с библиотекой я получил уже скомпилированный 64-битный пример (файл - l7xx.tst/release_amd64/client64.exe). Когда я его запускаю, сбора данных не происходит, файлы data.dat и data1.dat, расположенные в этой папке - пустые.
Более подробно симптомы описаны в сообщении #8 этой ветки.
Здравствуйте,
скажите пожалуйста как можно получить уровни напряжений на каналах Е2010В? В примере l7xx.tst, который рекомендуется использовать в руководстве программиста, данные из кольцевого буфера переписываются в файл, сохраняя при этом тип void* (или void**). Указатель на void можно привести к любому типу, но к какому его надо привести, чтобы получить адекватные значения, при пределах измерения +-0,3В? Я посмотрел параметр pointsize, он равен двум байтам? Значит ли это, что void необходимо приводить к целому значению?
спасибо
Скомпилировал 32 битный пример и запустил его на 64 битной машине - работает, данные собирает,
спасибо
По 0 сбросил параметры, как вы советовали - результат тот же, сбора нет, диод не моргает
да работает, я испытывал L-Graph 2 вчера вечером перед тем как вам написать (тогда же и выкачал его).
Когда я читаю состояние устройства
PLATA_DESCR_U2 pd;
pI->ReadPlataDescr (& pd);
std::cout << "SerNum " << pd.t6.SerNum << std::endl
<< "BrdName " << pd.t6.BrdName << std::endl
<< "Rev " << pd.t6.Rev << std::endl
<< "DspType " << pd.t6.DspType << std::endl
<< "IsDacPresent " << pd.t6.IsDacPresent << std::endl
<< "Quartz " << pd.t6.Quartz << std::endl;
диод на тыльной стороне корпуса моргает о приеме/передаче.
Далее, после вызова функций
ULONG status = pI->InitStartLDevice (); //L_STREAM_ADC);
std::cout << status << " <-> " << GetLastError() << std::endl;
if (status != L_SUCCESS)
std::cout << "status: " << status << std::endl;
HANDLE hThread = CreateThread (0, 0x2000, ServiceThread, 0, 0, & tid);
// Запускаем сбор в драйвере
status = pI->StartLDevice ();//L_STREAM_ADC);
он горит зеленым и больше не моргает, т.е. можно сказать, что прием/передача больше не идет,
спасибо
C L-Graph2 я начинал работу с устройством - там все работает.
Может быть, что дело в настройках?
Сначала взял настройки из примера, поставляемого вместе с библиотекой, результат я вчера описал. Сегодня поменял на вот такие:
adcPar->t2.s_Type = L_ADC_PARAM;
adcPar->t2.AutoInit = 1;
adcPar->t2.dRate = 5000.0;
adcPar->t2.dKadr = 0.01;
adcPar->t2.SynchroType = 0x01;
adcPar->t2.SynchroSrc = 0x00;
adcPar->t2.AdcIMask = SIG_0|SIG_1|SIG_2|SIG_3;
adcPar->t2.NCh = 4;
adcPar->t2.Chn[0] = 0x0;
adcPar->t2.Chn[1] = 0x1;
adcPar->t2.Chn[2] = 0x2;
adcPar->t2.Chn[3] = 0x3;
adcPar->t2.FIFO = 32768;
adcPar->t2.IrqStep = 32768;
adcPar->t2.Pages = 32;
adcPar->t2.IrqEna = 1;
adcPar->t2.AdcEna = 1;
adcPar->t2.StartCnt = 0;
adcPar->t2.StopCnt = 500;
adcPar->t2.DM_Ena = 1;
adcPar->t2.SynchroMode = 0;//A_SYNC_UP_EDGE | CH_0;
adcPar->t2.AdPorog = 1;
результат, тот же,
спасибо
В Visual C++ скомпилировать пример l7xx.tst быстро не удалось.
Запустил версию этого примера, поставляемую вместе с библиотекой из папки Release_md64. Выглядит так, что похоже не работает. Я сделал скрин с результатов работы, выложил его по ссылке https://yadi.sk/i/JOZBf7PDcKVGo
После настройки сбора данных, создания файла, инициализации LCard, старта записи буфер
.......... Starting ...
SUCCESS -> CreateFile(data.dat)
SUCCESS -> CreateFileMapping(data.dat)
SUCCESS -> MapViewOfFile(data.dat)
SUCCESS -> InitStartLDevice(ADC)
SUCCESS -> StartLDevice(ADC)
индикатор сбора данных
........... 0
остается неизменным в течение 2 и более минут, затем по нажатию кнопки на клавиатуре, программа может быть остановлена пользователем.
спасибо
сбор не пошел, программа сваливается в ошибку.
Таким образом я пытался опроверить где находится ее источник - в потоке, который читает буфер или в функциях работы с устройством.
спасибо
Адрес: 117105, Москва, Варшавское шоссе, д. 5, корп. 4, стр. 2
Многоканальный телефон:
+7 (495) 785-95-25
Отдел продаж: sale@lcard.ru
Техническая поддержка: support@lcard.ru
Время работы: с 9-00 до 19-00 мск