Меню

+7 (495) 785-95-25
sale@lcard.ru
sale@lcard.ru
Страницы 1
Тема закрыта
|
||||
|
Многопоточное приложение для Е14-140-МЕсть потребность одновременно вести непрерывный потоковой сбор аналоговых данных и в то же время выводить логические сигналы из модуля вовне для управления техпроцессом на основании тех же данных.
|
|||
|
||||
|
Re: Многопоточное приложение для Е14-140-Мможно, но нужно оценить необходимое время реакции системы управления... может и нельзя... |
|||
|
||||
|
Re: Многопоточное приложение для Е14-140-ММне нужно чтобы программа прекращала разгон двигателя при достижении заданных оборотов. Надеюсь, она в любом случае сделает это быстрее оператора жмущего красную кнопку.
|
|||
|
||||
|
Re: Многопоточное приложение для Е14-140-МКоманда по управляющему каналу USB (к которым относится TTL_OUT()) обычно выполняется за время порядка десятков миллисекунд. Подавать команду во время сбора данных можно. Нельзя из нескольких потоков программы одновременно подавать команды (например, START_ADC, STOP_ADC, SET_ADC_PARS, TTL_OUT и т.п. - их надо сериализовать), но в задаче такого типа инициализацию и пуск АЦП можно выполнить до пуска потоков обработки и обойтись без критических секций.
|
|||
|
||||
|
Re: Многопоточное приложение для Е14-140-МА если запустить одновременно два модуля Е14-140-М?
|
|||
|
||||
|
Re: Многопоточное приложение для Е14-140-Мкардинального - нет. |
|||
|
||||
|
Re: Многопоточное приложение для Е14-140-МЭто не повлияет на два основных фактора:
Вообще я бы сказал, что включать обычный ПК в обратную связь какой-то физической установки надо крайне осторожно. На конкретной лабораторной машине, не запуская в фоне тяжелых программ и т.д. Времена, думаю, будут порядка десятков или сотен мс. Но в любом случае это не должна быть система, критичная по безопасности (скажем, если запоздалая реакция приводит к разрыву маховика и т.п.). В конце концов, компьютер ведь может и просто зависнуть в произвольный момент... Можно, кстати, попробовать вводить по одному отсчету через ADC_SAMPLE (если не важна равномерность оцифровки во времени). Сделайте тестовую программу и замерьте максимальное-минимальное-среднее время выполнения одного цикла измерение-проверка-ttlout на конкретной машине. Или время реакции на ступеньку (по осциллографу). |
|||
|
||||
|
Re: Многопоточное приложение для Е14-140-МАлександр, благодарю за полезные советы. Собственно говоря, программу под Е14-140-М для машины трения (это такая установка, где испытываются углеродные образцы путём их сжатия на высоких оборотах) я написал ещё год назад, переработав прилагаемые к модулю примеры. Сейчас это работает (и очень успешно) примерно так: вначале, после инициализации модуля, управление передаётся в цикл, где посредством периодических (10 Гц) вызовов ADC_KADR() с нескольких каналов обновляются разные переменные: скорости, силы сжатия, тормозного момента, и выводятся на экран. Цикл работает, пока скорость не превысит определённый порог, а затем оператором break по условию вываливаемся вниз по коду в основной поток сбора данных, где всё и записывается в файл. Частота 10 кгц для 10 каналов (т. е. 1 кгц на канал). Проблема в том, что машиной очень желательно управлять программно во время сбора данных, а это по-видимому возможно только если запустить цикл с вызовами ADC_KADR()и TTL_OUT() в параллельном потоке. То есть одновременно порциями собирать данные в файл и управлять машиной посредством ADC_KADR()и TTL_OUT(). Непонятно только, можно ли одновременно в одном потоке собирать данные в файл, а в другом вызывать ADC_KADR()и TTL_OUT()? И нужно ли часть кода заключать в критические секции? Думаю, если ничего не получиться, в самом крайнем случае использовать два модуля. Кстати, в руководстве сказано, что ADC_KADR() можно вызывать с частотой "порядка нескольких десятков герц", а TTL_OUT() "порядка нескольких сотен герц". Это обнадёживает. Буду экспериментировать. |
|||
|
||||
|
Re: Многопоточное приложение для Е14-140-МКак я понял, природа сигналов не требует привязки к сетке времени, поэтому ADC_KADR() годится (но о частоте дискретизации в этом случае можно говорить только условно).
Поясню природу процесса. Прибор имеет два канала связи с ПК: относительно медленный побайтовый командный (используется USB control pipe) и относительно быстрый пакетный для данных (USB bulk). По bulk передаются только сами данные АЦП или ЦАП в потоковом режиме, т.е. ReadData/WriteData. Все остальное - GetModuleName, SET_ADC_PARS, START_ADC, STOP_ADC, ADC_KADR, ADC_SAMPLE, TTL и т.д. - это команды. Одновременно можно:
Естественно, команды ADC_KADR и ADC_SAMPLE не сочетаются с чтением потоковых данных - не работают, если АЦП был запущен через START_ADC.
В Вашей задаче проще всего вставить TTL_OUT в цикл между очередными ADC_KADRами.
Команды можно вызывать так часто, как они успеют выполниться #include <time.h>
Можете потестировать сами - это время не регламентируется и зависит от машины, USB-контроллера и т.д. |
|||
|
||||
|
Re: Многопоточное приложение для Е14-140-МЗадачу осилил посредством одновременной работы двух модулей. Разумеется, пришлось запустить в программе и два отдельных потока: для модуля использующего START_ADC и модуля использующего ADC_KADR и TTL_OUT.
Однако удивила трудность инициализации сразу двух модулей. Постоянно выскакивали ошибки вроде: GET_MODULE_DESCRIPTION() --> Bad и SET_ADC_PARS() --> Bad и приложение закрывается. Что любопытно, с одним модулем таких проблем никогда не было. Вывернулся - переписал функцию AbortProgram, убрал из неё exit(1), добавил рекурсивный вызов функции - той, где выполняется инициализация модуля. То есть, попытки инициализации теперь выполняются несколько раз вплоть до успешной.
|
Страницы 1
Тема закрыта