Меню
+7 (495) 785-95-25
sale@lcard.ru
sale@lcard.ru
Страницы 1
|
||||
|
Работа с несколькими измерительными модулямиЗдравствуйте. Опыта работы сразу с несколькими модулями нет (Как и в использовании более 2х потоков). До этого создавал простые программы на основе ваших примеров. Возникла проблема: при текущих настройках (LTR11 - 1000Гц, LTR212 - 150ГЦ) практически сразу возникает задержка в показаниях LTR11. Однако если снизить частоту LTR11 до равной или меньшей LTR212 проблема пропадает. Проблема, мне кажется, вызвана разницей частот опроса. Вопросы следующие: С уважением, Максим(gug.shm@mail.ru). P.S. |
|||
|
||||
|
Re: Работа с несколькими измерительными модулями1. Во первых по поводу "Настроил массивы для хранения одного элемента (за вызов Recv получаем одно значение)", выглядит не очень правильно для частоты 1000 Гц. ОС общего назначения вполне может задерживать вызовы на единицы-десятки мс, а у Вас для приема по одной точке вызовы должны выполняться раз в 1 мс. При таких частотах и выше данные следует принимать и обрабатывать все же блоками (например принимать и обрабатывать по 20 точек с частотой обновления на графике в 50 раз в секунду, сильно большая частота обновления все равно не до конца понятно, что дает). Я сам предпочитаю подход с выделением потока на каждый модуль и работа с каждым модулем как отдельными (только с добавлением обработки меток при необходимости) , т.к. это сильно упрощает сам сбор, избавляет от многих сложностей из-за разных частот сбора, разных задержек, все модули работают независимо и т.д. Но подходы могут вообще разные. В LGraph2, насколько я знаю, используется третий подход, где всего один поток, в котором периодически вызывается Recv на все модули с минимальным таймаутом и заведомо большим размером, т.е. раз в заданный интервал вчитываются по сути все накопленные данные, правда он требует потом ручного выравнивания данных на кадр при обработке. 2. Функция Recv возвращает управление, когда произойдет одно из событий - будет принято запрашиваемое число отсчетов (точнее 32-битных слов, для некоторых модулей, как LTR212 одному отсчету соответствует два слова), либо истечет заданный таймаут. Т.е. функция ожидает одно из этих событий, что первое произойдет, то и послужит условием завершения работы функции. Как правило используется один из двух подходов. Либо определяющим для штатной работы выбирается параметр кол-во точек, а таймаут задается заведомо большим, и в этом случае скорость прихода точек (со всеми возможными задержками передачи) от модуля определяет время выполнения функции, а таймаут служит только чтобы не зависнуть в функции навсегда при нештатных ситуаций (для потока на модуль с моей точки зрения - это наиболее удобный вариант). Во втором подходе наоборот, кол-во точек задается заведомо большее, а таймаут определяет время работы функции, т.е. работа идет по методу вычитать все, что накопится за это время (но требует выравнивания данных на кадр). 3. Если в буфере накопилось 1000 отсчетов, то Вы считаете самые первые пришедшие 100 отсчетов и в буфере останется еще 900. При следующем чтении Вы вычитаете следующие 100 отсчетов и в буфере останется 800 (плюс в конец добавятся новые пришедшие данные за это время). Т.е. в фифо новые данные всегда добавляются в конец буфера, а Вы вычитываете их из начала буфера всегда последовательно (если конечно не произойдет переполнение буфера из-за слишком медленного считывания, когда размер несчитанных данных превысит размер буфера, в этом случае новые данные будут отбрасываться, а Recv на считывании блока с разрывом данных вернет ошибку, соответствующую переполнению буфера). 4. С точки зрения описания программиста, информация об этом находится в разделе 4.6 общего руководства по ltrapi (https://www.lcard.ru/download/ltrapi.pdf). Также раздел 4.7 руководства пользователя (https://www.lcard.ru/download/ltr.pdf). |
Страницы 1
Адрес: 117105, Москва, Варшавское шоссе, д. 5, корп. 4, стр. 2
Многоканальный телефон:
+7 (495) 785-95-25
Отдел продаж: sale@lcard.ru
Техническая поддержка: support@lcard.ru
Время работы: с 9-00 до 19-00 мск