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

Форум

Вы не вошли.

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

#1 Re: Техническая поддержка » сброс входов Е20-10 на землю » 26.01.2015 22:49:23

Здравствуйте, Александр!

Спасибо Вам за Вашу помощь.

Название датчика САПФИР-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) ведет к изменению знака регистрируемого сигнала.

Данные на блок питания и схему подключений нарисую завтра с утра и выложу на форум в виде ссылки.

спасибо

#2 Re: Техническая поддержка » сброс входов Е20-10 на землю » 26.01.2015 19:40:48

прошу прощения - ошибся,

в L-Graph включены два канала, каждый по 3 вольта. Данные одного кнала умножаются на -1, чтобы данные вдоха и выдоха (которые измеряет датчик давления) визуально разделить.

Все остальные настройки - по умолчанию

спасибо

#3 Re: Техническая поддержка » сброс входов Е20-10 на землю » 26.01.2015 19:36:56

Poul пишет:

А какие временные настройки в 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;

или там есть еще настройки?

#4 Re: Техническая поддержка » сброс входов Е20-10 на землю » 26.01.2015 18:57:53

... в продолжение описания проблемы

Сергей, похоже, что это электрическая зависимость контуров самих внешних источников тока в данной схеме подключения. Приводите подробную схему подключения, а также схему (или подробные характеристики) самих источников тока. Как заземлён компьютер? Источники тока изолированы от земли?

Источниками тока в данном случае являются два датчика давления САПФИР-22. Они питаются от одного канала блока питания с напряжением 36 В. Датчики измеряют давление в диапазоне 0-2500Па, 0 - соответсвует 4 мА, 2500Па - 20мА. Выходы ддатчиков соединены через экранированный провод с прибором.Падение напряжения продуцируется резистором в 200 Ом.

спасибо

#5 Re: Техническая поддержка » сброс входов Е20-10 на землю » 26.01.2015 17:36:19

Здравствуйте,

вопрос про то, что означено в теме. Ниже приведены настройки прибора, как вы писали:

    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  регистрирует два канала.


спасибо

#6 Re: Техническая поддержка » сброс входов Е20-10 на землю » 23.01.2015 16:15:17

Здравствуйте,

сейчас проверяли прибор на LGraph2 - там выставлен предел измерения 1 вольт. На программе, написанной при помощи библиотеки lcomp прибор показывает значение 8000 при 3 вольтах. Скажите пожалуйста как программно настроить входы прибора на нужный диапазон измерения,

спасибо

#7 Re: Техническая поддержка » сброс входов Е20-10 на землю » 23.01.2015 12:45:46

Здравствуйте, Александр,

спасибо Вам за Ваш ответ.  Компьютер не заземлен, установка, заземлена. Но, при такой же схеме подключения - Ваша программа Lgraph 2 работала нормально. Значит это вообще не аппаратный дефект?

спасибо

#8 Техническая поддержка » сброс входов Е20-10 на землю » 22.01.2015 14:56:05

Sergei Alexeev
Ответов: 13

Здравствуйте,

возникает такая ситуация с 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. Данные канала, который показывает большее значение отображаются верно.

При переключении каналов - картина повторяется. Т.е., если первый канал показывает большие значения - второй заземляется. При перемене их местами - заземляется первый канал.

спасибо

#9 Re: Техническая поддержка » Указатель на void » 19.01.2015 13:18:42

Здравствуйте,

спасибо за Ваш ответ. Т.е., если я правильно понял при установк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;

спасибо

#10 Re: Техническая поддержка » Указатель на void » 18.01.2015 19:31:53

Здравствуйте,

скажите пожалуйста, достаточно ли установить параметр 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[]

? В документации на прибор этот параметр упомянут как коэффициент усиления входного синала.

спасибо

#11 Re: Техническая поддержка » Указатель на void » 29.12.2014 12:46:04

а то значение, которое задается вашей программой, оно сохраняется потом при выключении прибора?

#12 Re: Техническая поддержка » Указатель на void » 29.12.2014 12:36:39

Здравствуйте,

спасибо Вам за ответ, я это уже реализовал. Скажите, вот еще вопрос - можно ли настроить программно , например структурой ADC_PAR уровни напряжений на входе прибора 0,3В, 1В или 3В?

спасибо

#13 Re: Техническая поддержка » Указатель на void » 26.12.2014 17:17:42

Здравствуйте,

скажите пожалуйста, как можно посчитать время заполнения большого кольцевого буфера? Например, как посчитать, за какое время будет заполняться буфер размером 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], ... ?


с наступающим Новым Годом и Рождеством,

спасибо

#14 Re: Техническая поддержка » Указатель на void » 19.12.2014 09:29:31

я испытывал при 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 изменяется, сбор данных вроде бы происходит , но, очевидно не полностью.

Скажите пожалуйста можно ли при сборе и обработке данных рассматривать весь буфер целиком, если да, то что я делаю неправильно?

спасибо

#15 Re: Техническая поддержка » Указатель на void » 18.12.2014 15:15:31

Здравствуйте,

скажите пожалуйста, почему при установленном 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;
 

спасибо

#16 Техническая поддержка » количество половинок буфера больше двух » 25.11.2014 16:14:33

Sergei Alexeev
Ответов: 5

Здравствуйте,

подскажите пожалуйста, где можно прочитать про организацию большого кольцевого буфера подробно?

В описании

Устройство АЦП собирает данные в кольцевой буфер или 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 адресовать пространство буфера, не дожидаясь заполнения его частей (как это можно понять из описания)?

спасибо,

#17 Re: Техническая поддержка » Указатель на void » 14.11.2014 08:40:45

Переделал преобразование к signed short. Получил следующие значения :
...
7
7
10
8
8
9
9
11
9
...

Правильно ли я понимаю, что при настроенных пределах измерения +- 0,3 вольта, значению -0,3 вольта соответствует значение -32768, а +0,3 вольта - 32767? В таком случае полученные значения, которые приведены выше означают, что сигнал незначительно колеблется около 0?

спасибо

#18 Re: Техническая поддержка » e2010b feat InitStartLDevice » 14.11.2014 08:32:49

Вместе с библиотекой я получил уже скомпилированный 64-битный пример (файл - l7xx.tst/release_amd64/client64.exe). Когда я его запускаю, сбора данных не происходит, файлы data.dat и data1.dat, расположенные в этой папке  - пустые.

Более подробно симптомы описаны в сообщении #8 этой ветки.

#19 Техническая поддержка » Указатель на void » 13.11.2014 16:37:47

Sergei Alexeev
Ответов: 21

Здравствуйте,

скажите пожалуйста как можно получить уровни напряжений на каналах Е2010В? В примере l7xx.tst, который рекомендуется использовать в руководстве программиста, данные из кольцевого буфера переписываются в файл, сохраняя при этом тип void* (или void**). Указатель на void можно привести к любому типу, но к какому его надо привести, чтобы получить адекватные значения, при пределах измерения +-0,3В? Я посмотрел параметр pointsize, он равен двум байтам? Значит ли это, что void необходимо приводить к целому значению?

спасибо

#20 Re: Техническая поддержка » e2010b feat InitStartLDevice » 13.11.2014 16:24:12

Скомпилировал 32 битный пример и запустил его на 64 битной машине - работает, данные собирает,

спасибо

#21 Re: Техническая поддержка » e2010b feat InitStartLDevice » 28.10.2014 15:06:41

По 0 сбросил параметры, как вы советовали - результат тот же, сбора нет, диод не моргает

#22 Re: Техническая поддержка » e2010b feat InitStartLDevice » 28.10.2014 14:29:29

да работает, я испытывал 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);

он горит зеленым и больше не моргает, т.е. можно сказать, что прием/передача больше не идет,

спасибо

#23 Re: Техническая поддержка » e2010b feat InitStartLDevice » 28.10.2014 13:38:35

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;

результат, тот же,

спасибо

#24 Re: Техническая поддержка » e2010b feat InitStartLDevice » 27.10.2014 17:05:23

В 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 и более минут, затем по нажатию кнопки на клавиатуре, программа может быть остановлена пользователем.

спасибо

#25 Re: Техническая поддержка » e2010b feat InitStartLDevice » 24.10.2014 17:42:51

сбор не пошел, программа сваливается в ошибку.

Таким образом я пытался опроверить где находится ее источник - в потоке, который читает буфер или в функциях работы с устройством.

спасибо

Контакты

Адрес: 117105, Москва, Варшавское шоссе, д. 5, корп. 4, стр. 2

Многоканальный телефон:
+7 (495) 785-95-25

Отдел продаж: sale@lcard.ru
Техническая поддержка: support@lcard.ru

Время работы: с 9-00 до 19-00 мск