Форум: Техническая поддержка

Тема: Помогите с пониманием времени опросов

Вы не вошли.

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

23.12.2016 10:05:35
#1

Участник
Здесь с 12.12.2016
Сообщений: 72

Помогите с пониманием времени опросов

Я сейчас работаю с LTR 114. Мне нужно получать теги (имя+время+значение) и сбрасывать их потоком на диск.

В настоящее время алгоритм упрощен - я читаю с крейта 1 фрейм, после LTR114_ProcessData я беру локальное время компьютера как время фрейма (т.е. все параметры фрейма имеют это время). Я читаю параметры фрейма и формирую таги. Тут возникает вопрос - с какой _максимальной_ частотой может вызываться LTR114_Recv для чтения одного кадра?  Нужно ли ставить задержки? У меня есть подозрение что нужно.

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

Пожалуйства проясните ситуацию.

23.12.2016 10:54:36
#2

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

Re: Помогите с пониманием времени опросов

После того, как Вы запустили сбор данных, модуль сам начинает собирать с заданной частотой на канал. Задержка между кадром соответствует установленной межкадровой задержке (в периодах измерения), которая может быть нулевой. Т.е. если сбор идет например на 4 КГц, то одно измерение = 0.25 мс, если у Вас допустим кадр из 4 каналов, то первому соответствует сдвиг 0, второму 0.25, 3 - 0.5, 4 - 0.75. А первому каналу второго кадра - 1 мс (если без задержки) и т.д. Т.е. в любом случае, если как-то привязать время первого отсчета, то дальше период следования отсчетов Вы знаете (с точностью для частоты генератора крейта - правда если измерения длительные, то за счет отклонение со временем без синхронизации это время будет разбегаться).

При этом совершенно не важно, принимаете Вы данные по одному кадру или по несколько. По сути модуль всегда их передает в ПК со скоростью измерения, а с помощью LTR114_Recv() Вы только их откачиваете из буфера. Между LTR114_Recv() задержки ставить не обязательно, если конечно для Recv() задан соответствующий таймаут (иначе к истечению таймаута могут не прийти все данные в буфер). Также Recv() нельзя вызывать слишком медленно, т.к. если Вы будете принимать реже, чем данные поступают, то количество данных в очереди будет постоянно расти.

23.12.2016 11:08:42
#3

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

Re: Помогите с пониманием времени опросов

Общие принципы оптимизации Real-Time задач для LTR: http://www.lcard.ru/support/faq/ltr_rt_prog_optimize

23.12.2016 15:03:55
#4

Участник
Здесь с 12.12.2016
Сообщений: 72

Re: Помогите с пониманием времени опросов

Алексей L Card пишет:

При этом совершенно не важно, принимаете Вы данные по одному кадру или по несколько. По сути модуль всегда их передает в ПК со скоростью измерения, а с помощью LTR114_Recv() Вы только их откачиваете из буфера.

Т.е. я так понимаю, что нет особого смысла заморачиваться считыванием фреймов блоками? На скорость это не влияет?

23.12.2016 16:51:07
#5

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

Re: Помогите с пониманием времени опросов

Ну только с той стороны, что если скорость фреймов большая, то очень частый вызов функции на прием каждого фрейма может слишком много потреблять ресурсов ПК. С другой стороны LTR114 все не такую большую скорость имеет.

26.12.2016 09:56:44
#6

Участник
Здесь с 12.12.2016
Сообщений: 72

Re: Помогите с пониманием времени опросов

Видимо покадровое чтение делать нельзя из-за отсутствия гарантии, что в FIFO что-то есть. Он так же может переполнится. Если буфер стал через некоторое время пустым, то будем читать нули.

Т.е. видимо стратегия быстрой записи должна быть видимо такая:
1 накопление в FIFO буфере  фреймов в течении например 1 секунды
2. После накопления считываем все фреймы в буфер (с одновременной очисткой  FIFO)
3. Сброс буфера на диск + плюс начинается новое накопление фреймов.

26.12.2016 12:20:04
#7

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

Re: Помогите с пониманием времени опросов

Если в буфере меньше данных, чем запрашивается, то Recv ждет данные в течение указанного таймаута. Если они не пришли и за таймаут, то принимаются не все слова, при этом Recv всегда возвращает кол-во принятых слов.

26.12.2016 15:28:11
#8

Участник
Здесь с 12.12.2016
Сообщений: 72

Re: Помогите с пониманием времени опросов

В функции LTR114_Recv в случае запроса блока фреймов - как узнать, сколько фреймов за раз я могу запросить?

26.12.2016 16:26:31
#9

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

Re: Помогите с пониманием времени опросов

Ну запросить то Вы можете сколько угодно. А сколько она вернет, можно узнать только после вызова, проверив возвращенное значение. Узнать заранее, не вычитывая данные, сколько слов в буфере нельзя

27.12.2016 15:15:57
#10

Участник
Здесь с 12.12.2016
Сообщений: 72

Re: Помогите с пониманием времени опросов

Испытываю непонятную проблему. Все упростил до теста, но все равно не пойму в чем дело. Тест простой - каждаю секунду срабатывает таймер и я пытаюсь прочитать пять фреймов. Делитель 1600, дискредитация 5 Гц (стало быть 5 фреймов в секунду). На входе первого канала +4.9V. Сначала все читает нормально. Потом значения начинают уменьшаться и падают до нулевого шума.
Вот как это выглядит:

Скрытый текст

Период таймера опроса(мсек): 1000.0; Timeout(мсек): 1000
Версия библиотеки : 1.5
Модуль открыт успешно
Информация о модуле:
Название модуля: LTR114    Серийный номер:  3D701036
Версия прошивки MCU: 1.3    Версия прошивки ПЛИС: 1
FreqDivider: 1600; Частота дискредитации:  5.0 Гц. Число фреймов в периоде опроса (FRAME_CNT): 5
Начальная автокалибровка выполнена
Размер входного буфера size (DWORDS): 10
Размер обработанный буфера (doubles)): 5
-----------------------------------
Timer: Запрашиваемый Recv size(DWORDS): 10
Timer: Считанный Recv size(DWORDS): 10
Timer: size after ProcessData (doubles): 5
Время первого врейма: 2016-12-27 14:58:04:875
  Frame: 0     4.5934
  Frame: 1     4.5934
  Frame: 2     4.5934
  Frame: 3     4.5934
  Frame: 4     4.5934
-----------------------------------
Timer: Запрашиваемый Recv size(DWORDS): 10
Timer: Считанный Recv size(DWORDS): 10
Timer: size after ProcessData (doubles): 5
Время первого врейма: 2016-12-27 14:58:05:875
  Frame: 0     4.5934
  Frame: 1     4.5934
  Frame: 2     4.5934
  Frame: 3     4.5934
  Frame: 4     4.5934
-----------------------------------
Timer: Запрашиваемый Recv size(DWORDS): 10
Timer: Считанный Recv size(DWORDS): 10
Timer: size after ProcessData (doubles): 5
Время первого врейма: 2016-12-27 14:58:06:875
  Frame: 0     4.5934
  Frame: 1     4.5934
  Frame: 2     4.5934
  Frame: 3     4.5934
  Frame: 4     4.5934
-----------------------------------
Timer: Запрашиваемый Recv size(DWORDS): 10
Timer: Считанный Recv size(DWORDS): 10
Timer: size after ProcessData (doubles): 5
Время первого врейма: 2016-12-27 14:58:07:875
  Frame: 0     4.5934
  Frame: 1     4.5934
  Frame: 2     4.5934
  Frame: 3     4.5934
  Frame: 4     4.5934
-----------------------------------
Timer: Запрашиваемый Recv size(DWORDS): 10
Timer: Считанный Recv size(DWORDS): 10
Timer: size after ProcessData (doubles): 5
Время первого врейма: 2016-12-27 14:58:08:875
  Frame: 0     4.5934
  Frame: 1     4.5934
  Frame: 2     4.5934
  Frame: 3     4.5934
  Frame: 4     4.5934
-----------------------------------
Timer: Запрашиваемый Recv size(DWORDS): 10
Timer: Считанный Recv size(DWORDS): 10
Timer: size after ProcessData (doubles): 5
Время первого врейма: 2016-12-27 14:58:09:875
  Frame: 0     4.5936
  Frame: 1     4.5936
  Frame: 2     4.5936
  Frame: 3     4.5936
  Frame: 4     4.5936
-----------------------------------
Timer: Запрашиваемый Recv size(DWORDS): 10
Timer: Считанный Recv size(DWORDS): 10
Timer: size after ProcessData (doubles): 5
Время первого врейма: 2016-12-27 14:58:10:875
  Frame: 0     4.5943
  Frame: 1     4.5943
  Frame: 2     4.5943
  Frame: 3     4.5943
  Frame: 4     4.5943
-----------------------------------
Timer: Запрашиваемый Recv size(DWORDS): 10
Timer: Считанный Recv size(DWORDS): 10
Timer: size after ProcessData (doubles): 5
Время первого врейма: 2016-12-27 14:58:11:875
  Frame: 0     2.8331
  Frame: 1     2.8331
  Frame: 2     2.8331
  Frame: 3     2.8331
  Frame: 4     2.8331
-----------------------------------
Timer: Запрашиваемый Recv size(DWORDS): 10
Timer: Считанный Recv size(DWORDS): 10
Timer: size after ProcessData (doubles): 5
Время первого врейма: 2016-12-27 14:58:12:875
  Frame: 0     0.1004
  Frame: 1     0.1004
  Frame: 2     0.1004
  Frame: 3     0.1004
  Frame: 4     0.1004
-----------------------------------
Timer: Запрашиваемый Recv size(DWORDS): 10
Timer: Считанный Recv size(DWORDS): 10
Timer: size after ProcessData (doubles): 5
Время первого врейма: 2016-12-27 14:58:13:875
  Frame: 0     0.0014
  Frame: 1     0.0014
  Frame: 2     0.0014
  Frame: 3     0.0014
  Frame: 4     0.0014
-----------------------------------
Timer: Запрашиваемый Recv size(DWORDS): 10
Timer: Считанный Recv size(DWORDS): 10
Timer: size after ProcessData (doubles): 5
Время первого врейма: 2016-12-27 14:58:14:875
  Frame: 0     0.0014
  Frame: 1     0.0014
  Frame: 2     0.0014
  Frame: 3     0.0014
  Frame: 4     0.0014

А вот код функции таймера

Скрытый текст

    int res=0;
        Me114("-----------------------------------");
        size = FRAME_CNT * hltr114.FrameLength;
        sprintf(temp_str, "Timer: Запрашиваемый Recv size(DWORDS): %d", size);
        Me114(temp_str);

        //прием данных от модуля
        res = LTR114_Recv(&hltr114, recv_data, NULL, size, timeout_ms);

        sprintf(temp_str, "Timer: Считанный Recv size(DWORDS): %d", res);  Me114(temp_str);

        if (res == 0) //данные не приняты
        {
            sprintf(temp_str, "Timer error: не приняты данные");  Me114(temp_str);
        }
        else
        if (res > 0)
        {
            //печатаем сообщение, если принято меньше данных, чем size
            if (res < size)
            {
                sprintf(temp_str, "Timer Warning! Приняты не все данные. \
                              Принято: %d; Запрашивалось: %d", res, size);
                Me114(temp_str);       size = res;
            }

            res = LTR114_ProcessData(&hltr114, recv_data, proc_data, &size,
                LTR114_CORRECTION_MODE_INIT, LTR114_PROCF_VALUE);

            sprintf(temp_str, "Timer: size after ProcessData (doubles): %d", size);  Me114(temp_str);

            if (res == LTR_OK)
            {
               //Время блока
                MY_time1 time(0.0, MTO_YYYY_MM_DD_HH_MM_SS_MSS_DASH); time.set_current_timedate();
                sprintf(temp_str, "Время первого врейма: %s", time.str);
                Me114(temp_str);

                INT j;
                for (j = 0; j < size; j++)
                {
                    double* frame_point = proc_data; char fr_str[200];
                     sprintf(fr_str, "Frame: %d  ", j / hltr114.LChQnt);
                     char str[200]; memset(str,0,sizeof(str));

                    for(int val_index = 0; val_index < hltr114.LChQnt; val_index++)
                      {
                        double val = frame_point[val_index];
                        sprintf(temp_str, "  %4.4f",  val);
                        strcat(str, temp_str);
                      }

                     char str_line[200];
                        sprintf(str_line, "  %s %s", fr_str, str);
                        Me114(str_line);
                }
            }
            else //выводим ошибку при обработке данных
            {
                sprintf(temp_str, "Timer ProcessData err:  Error : %s!!", LTR114_GetErrorString(res));
                Me114(temp_str);
            }
        }
        else //выводим ошибку при обработке данных
        {
            sprintf(temp_str, "Timer Recv Error (res < 0): %s!!", LTR114_GetErrorString(res));
            Me114(temp_str);
        }

}
//---------------------------------------------------------------------------

27.12.2016 15:30:22
#11

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

Re: Помогите с пониманием времени опросов

Подобное "уплывание" показаний возможно при ошибках подключения. Например, типично забывают подключить AGND при измерении напряжения, либо подключают X и GND и забывают про Y....  Дифференцильный вход напряжения LTR114 всегда требует 3-точечного подключения. Об этом и в руководстве сказано...

A что за источники сигналов, и как к ним подключаетесь?

27.12.2016 15:32:33
#12

Участник
Здесь с 12.12.2016
Сообщений: 72

Re: Помогите с пониманием времени опросов

Сорри небольшая ошибочка (которая не меняет вопроса, так как параметр 1)
Вместо
                for (j = 0; j < size; j++)
                {
                    double* frame_point = proc_data; char fr_str[200];

Нужно было
                for (j = 0; j < size; j++)
                {
                    double* frame_point = proc_data + j; char fr_str[200];

PS: Я так понял, что на форуме я не могу поправить свое сообщение?

27.12.2016 16:08:37
#13

Участник
Здесь с 12.12.2016
Сообщений: 72

Re: Помогите с пониманием времени опросов

Электронщики дали мне раъём (см картинку). От источника питания он подключен двумя проводами (от + и -) Насколько я понимаю мне нужно третий провод от "земли" источника напряжения к пину AGRD на раъеме модульного входа?


ссылка на изображение, размер: 38.4 кбайт, 800 x 395 точек

27.12.2016 16:18:32
#14

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

Re: Помогите с пониманием времени опросов

Соедините "-" c AGND.
Электронщикам читать http://www.lcard.ru/download/ltr.pdf,  п.16.3. Если они умеют писать, то пусть пишу вопросы сюда smile.

28.12.2016 10:20:10
#15

Участник
Здесь с 12.12.2016
Сообщений: 72

Re: Помогите с пониманием времени опросов

Гарманов Александр пишет:

Соедините "-" c AGND.

Да, помогло, спасибо.

16.01.2017 12:45:16
#16

Участник
Здесь с 12.12.2016
Сообщений: 72

Re: Помогите с пониманием времени опросов

При изучении LTR27 в документации не нашел описания как задать частоту дискретизации каналов.

В примере из документации есть без объяснения:
    // выбираем частоту дискретизации 100Гц
             ltr27.FrequencyDivisor=9;

Можно по подробнее? Например я хочу 10 Гц на канал (8 мезонинов заполнены)

16.01.2017 13:07:56
#17

Участник
Здесь с 12.12.2016
Сообщений: 72

Re: Помогите с пониманием времени опросов

Sorry, в документации информация о LTR 27 есть, не заметил с первого раза.

17.01.2017 13:42:55
#18

Участник
Здесь с 12.12.2016
Сообщений: 72

Re: Помогите с пониманием времени опросов

wink Все таки хочу уточнить моё понимание LTR27. И  так на нем 8 мезонинов по два канала. Выбираем частоту дискретизации 100 Гц ( ltr27.FrequencyDivisor=9;)
Реальная частота опроса одного канала будет 100/16? Или нужно делить на число мезонинов (8)?

17.01.2017 14:02:05
#19

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

Re: Помогите с пониманием времени опросов

alexko пишет:

wink Все таки хочу уточнить моё понимание LTR27. И  так на нем 8 мезонинов по два канала. Выбираем частоту дискретизации 100 Гц ( ltr27.FrequencyDivisor=9;)
Реальная частота опроса одного канала будет 100/16? Или нужно делить на число мезонинов (8)?

Поскольку в LTR27 -  параллельные каналы (без коммутатора), то частота дискретизации не делится между каналами, и в Вашем случае частота дискретизации 100 Гц будет у каждого канала.

19.01.2017 14:05:10
#20

Участник
Здесь с 12.12.2016
Сообщений: 72

Re: Помогите с пониманием времени опросов

Встретил пример на Билдере для LTR11 где встретилась функция LTR11_CreateLChannel

Во всех ltrapi11.pdf которые у меня есть описания этой функции нет. По примеру конечно понятно что дифференциальный режим это mode=0; С общим нулем mode=1 И т.д.
Но в примере из  ltrapi11.pdf LTR11_CreateLChannel вообще не используется и логические каналы настраиваются через таблицу довольно магическим образом

  /* диапазон - 10В, режим - 16-канальный, физический канал - 4 */
            hltr11.LChTbl[0] = (0 << 6) | (0 << 4) | (4 << 0);

19.01.2017 15:02:19
#21

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

Re: Помогите с пониманием времени опросов

Изначально логические каналы настраивались ручной установкой битов  слова логической таблицы, в соответствии с форматом, описанным в ltr11api.pdf. Т.к. этот способ не очень удобен и выглядит, как Вы же сами написали, несколько "магическим", то для удобства была добавлена уже позже функция LTR11_CreateLChannel(), которая сама формирует слово логического канала по заданным на входе параметрам (выполняя внутри себя эту "магическую" операцию). Коды режимов/диапазонов также можно посмотреть по определениям LTR11_CHMODE_ и LTR11_CHRANGE_ в ltr11api.h.

Соответственно этот новый более удобный способ используется и в примерах, которые были обновлены. К сожалению документация пока не обновлена и в ней эта вспомогательная функция отсутствует, как и вторая введенная позже вспомогательная функция LTR11_FindAdcFreqParams()

19.01.2017 15:22:39
#22

Участник
Здесь с 12.12.2016
Сообщений: 72

Re: Помогите с пониманием времени опросов

Алексей L Card пишет:

Соответственно этот новый более удобный способ используется и в примерах, которые были обновлены. К сожалению документация пока не обновлена и в ней эта вспомогательная функция отсутствует, как и вторая введенная позже вспомогательная функция LTR11_FindAdcFreqParams()

В принципе я вроде понял. Вот к примеру отрывок из моего ini файла c настройками слота LTR11:

Скрытый текст

#LTR11
#logic channels setup format: Chan_X=GG,MM.CCCC (X - номер лог. канала)
#GG   - входной диапазон:   0 - +-10 В; 1 - +-2.5 В;  2 - +-0.625 В;  3 - +-0.156В;
#MM   - режим:  0 - 16-канальный, каналы 1-16;
#                          1 - измерение собственного напряжения  смещения нуля;
#                          2 - 32-канальный, каналы 1-16;
#                          3 - 32-канальный, каналы 17-32;
# CCCC - номер физического канала:
#                          0 - канал 1 (17);
#                           . . .
#                         15 - канал 16 (32).
#    #    #    #    #    #    #    #    #    #    #    #

[slot6_2D673369]
Marka=LTR11
Kol_log_kanals=2
#канал1 0-10В, 32 канальный(диапазон 1-16, физ.канал. 1
Chan_1=0,2,1
#канал2 +-2.5В, 32 канальный(диапазон 17-32,  физ. канал 32
Chan_2=1,3,32

Андрей78
08.02.2017 13:26:33
#23

Гость

Re: Помогите с пониманием времени опросов

Здравствуйте, приобреталась ваша продукция, установка измерительная LTR-27 (LTR-EU-2-5) №2D563614 2012 г.
Проблема такая, пытались подключить к ней хромель-копельную термопару, не нашел в инструкции на какие разъемы(порты) сажать проводки от термопары, для измерения температуры.
Также увидел у вас на сайте, что для этого нужен субмодуль H-27x, так ли это?
Еще не совсем разобрались в программе LGraph2 и ACTest, в какой программе лучше работать для измерения температур.
Хотелось что бы вы помогли нам в нашей проблеме и\или дали телефон технической поддержи.

08.02.2017 13:40:09
#24

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

Re: Помогите с пониманием времени опросов

Андрей78 пишет:

Здравствуйте, приобреталась ваша продукция, установка измерительная LTR-27 (LTR-EU-2-5) №2D563614 2012 г.
Проблема такая, пытались подключить к ней хромель-копельную термопару, не нашел в инструкции на какие разъемы(порты) сажать проводки от термопары, для измерения температуры. Также увидел у вас на сайте, что для этого нужен субмодуль H-27x, так ли это?

Здравствуйте. В руководстве пользователя  http://www.lcard.ru/download/ltr.pdf имеется информация и по подключению, и по устройству LTR.

Андрей78
08.02.2017 14:30:31
#25

Гость

Re: Помогите с пониманием времени опросов

LTR-27 (LTR-EU-2-5) нужен ли субмодуль H-27x для подключения термопар или можно обойтись без него?

Контакты

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

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

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

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