Меню
+7 (495) 785-95-25
sale@lcard.ru
sale@lcard.ru
Страницы 1
Алексей, Благодарю за ответ!
Теперь стало понятно. Попробую на днях переделать настройку с учетом 1.5 МГц, правда, как Вы и сказали, ощутимой разницы в получаемых данных может и не быть (видимо отклонения по частотам крайне малы).
В принципе, т.к. частота сбора с плат у меня сейчас 4029 в сек, а макс частота внешнего сигнала (по которому забираются данные с потоков сбора) не более 1500, то как мне кажется, явно видимого "рассинхрона" скорей всего не будет. Но все равно есть желание сделать "по правильному", с синхронизацией.
Переходить нужно на обоих платах на 1.5 МГц или только перенастроить на ведущей? Само собой читал про это в документации, но когда запустил, то все заработало, поэтому опорные частоты оставил дефолтные (видимо как раз 2 МГц). Возможно в этом и есть моя ошибка (если так - то Вы наверное меня и поправите).
Нулевые значения появляются на ведомой плате и на всех каналах (32). Сбор идет постоянно, без задержек. В программе под каждую плату работает отдельно свой поток (никаких задержек во время считывания (sleep и прочее) нет).
При старте сначала все работает как надо, затем через 3-5 мин (но может и значительно больше), с ведомой платы не идут данные. Помогает только перезапуск всей программы (при старте однократно выполняется настройка плат, затем полученные дескрипторы передаются в потоки, дальше в X502_Recv).
Опять же повторюсь - почти месяц все работало хорошо, проблемы начались пару дней назад.
Режим работы программы - два раза в день по 8-10 часов непрерывный сбор, в остальное время остановка через X502_StreamsStop. При остановленном сборе мои потоки крутятся в холостую со Sleep - ом в 15 мс. По команде из интерфейса вызывается X502_StreamsStart и в работу.
Добрый день
Имеются две платы L502, соединенные кабелем межмодульной синхронизации. При запуске программы настраиваю режим генерации частоты синхронизации через X502_SetSyncMode (одна плата ведущая (X502_SYNC_INTERNAL), вторая ведомая(X502_SYNC_EXTERNAL_MASTER)). Около месяца все работало без нареканий, но пару дней назад начались странности: на одной из плат периодически нет сигнала (значения с аналоговых входов по нулям). При переводе обоих плат на режим X502_SYNC_INTERNAL проблема ушла. Т.к. частота считывания данных достаточно высокая (4000 в сек), то разницы с/без синхронизации не увидел, но, наверное, правильней бы было все таки с ней.
Проблема возникала непостоянно: может через пару мин после старта программы, а может и через день.
Подскажите, с чем может быть связана такая ситуация?
Реализовал синхронный сбор данных с каждой платы отдельным потоком. Настроил шаг прерывания равный кол-ву считываемых отсчетов - импульсы с цифровых данных теперь всегда соответствуют исходному (импульсы выдает промышленный контроллер). Но появилась другая проблема: периодически появляется ошибка -11 (X502_ERR_STREAM_OVERFLOW). При чем ошибка может появится как через 5-10 мин после запуска, так и через несколько часов. Пока что сделал перезапуск потоков сбора при ее появлении. В потоках программы, которые вызывают X502_Recv() / X502_ProcessData() никаких остановок нет (Sleep и прочие функции). Нагрузка на ПК минимальна (программа сбора забирает 1-2% ЦП, ничего остальное не включено, ОС Windows, ЦП i5).
А какое значение шага прерывания стоит изначально с завода? Если я буду менять через X502_SetStreamStep(), то потом чтоб при проблемах вернуть назад
Дополню свой вопрос - может по факту цифровые входа и правильно считываются, но я не совсем правильно их принимаю в своей программе. Если мне при синхронном вводе с плат нужно получить текущее значение цифровых входов, то мне необходимо брать последнее слово из массива, который передается для заполнения в X502_ProcessData? И если так, то и с аналоговыми данными так же (и если одна из плат считывает еще и цифровые входа, то как мне получить все последние данные с 32 каналов (у второй платы просто считываю с начала массива и все корректно, как в примере))? Ради эксперимента сделал следующий пример - два потока постоянно выкачиваю через X502_Recv / X502_ProcessData данные в свои буферы (частоты и значение READ_BLOCK_SIZE подобрал так, чтоб стабильно было в районе 3000 считываний в секунду). Третий поток по сигналу с цифрового входа (с одной из плат) собирает данные в общий буфер (т.е. есть жесткая привязка данных с двух плат на входной цифровой сигнал). При такой работе мое значение кол-ва импульсов цифрового входа как раз и скачет, при том что на вход подается ровно 1000. И ладно бы, если входное кол-во всегда постоянно, но в моей текущей задаче оно может меняться от 50 до 2000 в секунду, и нельзя их пропустить
Добрый день. На синхронном режиме почему то начинают не всегда корректно считываться импульсы цифровых входов (кол-во плавает: на вход подается 1000, в программе у себя считываю от 950 до 1020), поэтому пришлось вернуть работу на асинхронный режим (с ним проблем нет).
Так же вопрос - почему периодические при подключенных платах комп начинает грузить процесс "Системные прерывания"? При этом нагрузка от этого процесса на проц приличная (до 10%). Если платы снять - все проходит. Когда первый раз такое заметил - убрал кабель межмодульной синхронизации и проблема ушла. Через неделю появились снова те же симптомы. Пока что решается перезагрузкой ПК несколько раз.
Добрый день.
Есть текущая задача для которой необходимо получать как можно с меньшим интервалом цифровые + аналоговые данные. Для этой цели были закуплены две платы L502 + кабель для цифровых входов. Время между чтением данных порядка 1 мс и меньше.
В текущих реалиях сделал вариант через X502_AsyncInDig / X502_AsyncGetAdcFrame. Настройки плат: частота сбора с АЦП 2 МГц, частота ввода с цифровых входов 2 МГц, кол-во логических каналов - 32, режим - измерения напряжения относительно общей земли.
Периодически выпадают ошибки X502_ERR_RECV_INSUFFICIENT_WORDS (Принято недостаточно слов от модуля).
Функции постоянно дергаются фоновым потоком, в котором нет остановок (sleep и прочее), но при этом могут быть задержки (1-5 мс) для обработки принятых данных (когда поступают определенные события с цифрового входа).
Собственно, вопрос - может быть есть какой-то другой вариант наладить прием данных в реальном времени, без чтения буфера с таймаутом и прочего?
Сейчас в X502_AsyncGetAdcFrame стоит таймаут в 2 мс.
Пробовал через X502_Recv (с меньшей частотой сбора ), но при любой задержке в потоке (1 мс и более, когда нужно обработать принятые данные) функции сразу выпадают в ошибку X502_ERR_PROC_INVALID_CH_NUM (Неверный номер канала в обрабатываемом потоке синхронного ввода).
События для обработки принятых данных могут происходить с разными интервалами. Копить данные, пока идет обработка не нужно, т.к. вся необходимая информация перекладывается в буферы в программе. Т.е. нужные данные накопили, по сигналу с цифрового входа обработали их и снова вернулись к мониторингу текущей информации в реальном времени.
Страницы 1
Адрес: 117105, Москва, Варшавское шоссе, д. 5, корп. 4, стр. 2
Многоканальный телефон:
+7 (495) 785-95-25
Отдел продаж: sale@lcard.ru
Техническая поддержка: support@lcard.ru
Время работы: с 9-00 до 19-00 мск