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


Е-440: скорость работы ф-ии DAC_SAMPLE

Вы не вошли.

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

Елена
08.12.2010 15:17:17
#1

Гость

Е-440: скорость работы ф-ии DAC_SAMPLE

Добрый день,

Можно ли оценить временные затраты на вызов ф-й DAC_SAMPLE и ADC_SAMPLE?
У нас получается ~25мс для DAC_SAMPLE, это нормально или много?

Задача состоит в том, чтобы однократно вывести заданное значение напряжения  на ЦАП (DAC_SAMPLE),
результат отработки поданного напряжения получить с АЦП (ADC_SAMPLE), сделать пересчет и
подкорректированное значение напряжения снова однократно вывести на  ЦАП ... и так в цикле.
Конечно же, чем чаще, тем лучше.
Работа идет по двум каналам, соответственно на разовую установку напряжений тратится около 50 мс.
Работаем с модулем Е-440 ревизия ? (~2004г.) , библиотека lusbapi 3.3

Зависит ли скорость работы этих ф-й
-от установленных параметров работы ЦАП/АЦП?
-от ревизии модуля?

08.12.2010 16:11:41
#2

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

Re: Е-440: скорость работы ф-ии DAC_SAMPLE

... У нас получается ~25мс для DAC_SAMPLE, это нормально или много?
Это вполне нормальные временА для выполнения однократных функций типа DAC_SAMPLE(), ADC_SAMPLE(), TTL_IN() и т.д.
P.S. В принципе всю Вашу задачу можно попробовать реализовать на уровне DSP модуля. Тогда Вы получите практически real-time алгоритм. Все исходники открыты.

Елена
08.12.2010 16:45:06
#3

Гость

Re: Е-440: скорость работы ф-ии DAC_SAMPLE

Спасибо, Сергей. Работать на уровне DSP модуля пока небыло необходимости, но сейчас, видимо, придется

09.12.2010 12:05:00
#4

Сотрудник "Л Кард"
Здесь с 18.04.2014
Сообщений: 810

Re: Е-440: скорость работы ф-ии DAC_SAMPLE

На уровне DSP, если закон управления не очень сложен, то можно обойтись минимальной доработкой - сделать совмещенную функцию однократного ввода и вывода (ADC+DAC SAMPLE). Время тратится в основном на обработку команды по USB, там медленный канал управления.

Еще можно чисто программно попытаться использовать потоковый ввод на достаточно большой частоте дискретизации, чтобы уйти от команды ADC_SAMPLE. Конечно, будет задержка из-за передачи данных блоками, но ее можно попытаться сделать более детерминированной и, если повезет, в несколько раз поменьше, чем 25 мс (если, скажем, поставить в очередь много вызовов ReadFile() с небольшими буферами в режиме overlapped?...)
Если интересно, попробуйте проверить эту мысль на практике, тут надо тестировать на конкретной задаче и конкретном компьютере.

Елена
09.12.2010 15:31:45
#5

Гость

Re: Е-440: скорость работы ф-ии DAC_SAMPLE

"Еще можно чисто программно попытаться использовать потоковый ввод..."
Так уже пробовала, когда работала со старой библиотекой lusbapi (там не хотела работать ф-я ADC_SAMPLE). В целом работало, но сильно зависело от размера буфера и частоты. Подобрать эти параметры конечно не проблема, но в другом режиме работы программы(выше я написала только часть тз)требуется, наоборот, непрерывный вывод на ЦАП заранее сгенерированного сигнала и непрерывный прием с АЦП ответного, а тут буфер нужен большой да и частота меньше. Это тоже решаемо, но код получился сложнее, как-то... с подподвыподвертом. С однократными ф-ми DAC_(ADC_)SAMPLE все просто как табурет, прозрачно и корректно. Если нач-во решит, что по временам успеваем, оставлю так, если нет - буду разбираться на ур-не проц-ра

09.12.2010 15:49:48
#6

Сотрудник "Л Кард"
Здесь с 18.04.2014
Сообщений: 810

Re: Е-440: скорость работы ф-ии DAC_SAMPLE

Естественно, в таком режиме от размера буфера и частоты все зависит чуть менее, чем полностью. Код при таких двух разных режимах я бы не стал унифицировать, тут лучше две отдельные процедуры сделать...

Между прочим, у E14-140-MD есть настоящий потоковый вывод на ЦАП. Для первого режима он ни к чему, а вот для второго может быть интересно.

Елена
09.12.2010 17:44:48
#7

Гость

Re: Е-440: скорость работы ф-ии DAC_SAMPLE

"Естественно, в таком режиме от размера буфера и частоты все зависит чуть менее, чем полностью. Код при таких двух разных режимах я бы не стал унифицировать, тут лучше две отдельные процедуры сделать..."
У меня класс для работы с модулем E440: 2 метода для однократной работы с модулем(прием/передача) , один для запуска режима непрерывной выдачи и сбора данных, и так еще по мелочи. 2 потока(прием/передача). С разовыми все понятно, вызываются приложением по мере необходимость(тут-то и возник вопрос с длительностью работы). Если приложение вызывает ф-ю непрывной работы с устройством и передает адреса 2-х векторов(с сгенерированным сигналом и для собранных данных), модуль переводится в режим непрерывной работы ф-ми START_DAC(ADC), просыпаются потоки и понеслась...после отработки вызываются ф-ии STOP_DAC(ADC), потоки переводятся в режим ожидания. Пока так. Если есть какой-то изъян в таком подходе, напишите, учту)
Вопрос: (тут я повторюсь):
При создании объекта этого класса, устанавливаются параметры работы ЦАП и АЦП "удобные" для потокового режима выдачи/сбора. Зависит ли как-то скорость работы однократных ф-й от установленных параметров???

09.12.2010 18:20:34
#8

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

Re: Е-440: скорость работы ф-ии DAC_SAMPLE

... Зависит ли как-то скорость работы однократных ф-й от установленных параметров??? ...
Нет.

10.12.2010 11:05:29
#9

Сотрудник "Л Кард"
Здесь с 18.04.2014
Сообщений: 810

Re: Е-440: скорость работы ф-ии DAC_SAMPLE

Исправление: выше я написал не то название модуля (у E14-140-MD тоже есть потоковый ЦАП, но тут мы говорим про E14-440D).

Насчет структуры Вашей программы - вроде бы все нормально, если Вы не забыли перед началом потокового вывода заполнить буфер ЦАП.
Как я понял, там описан однократный сеанс работы (пуск, генерация/сбор заданного количества отсчетов, стоп), причем все массивы помещаются в оперативную память?
Вектор (std::vector?) для АЦП Вы, видимо, сразу инициализируете на общую длину?

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

В применении к задаче типа Uout = f(Uin), где Вы используете однократный ввод/вывод, можно экспериментировать с потоковыми режимами, но тут ситуация получается необычная: обмен надо стараться делать _маленькими_ блоками, чтобы уменьшить задержку между физ. процессом и моментом обработки данных компьютером. То есть это имеет смысл, если задержка из-за буферизации существенно меньше, чем время выполнения команды однократного ввода/вывода.
Маленькие буферы, однако, увеличивают опасность переполнения/опустошения. Поэтому я бы посоветовал в этом случае сделать массив или список маленьких буферов, которые будут все стоять в очереди (инициировать сразу N вызовов ReadFile() в режиме overlapped). Тогда на каждую маленькую порцию будет подниматься event, приложение будет его ловить и обрабатывать, а в это время операционная система сама уже запустила следующий блок и т.д. Приложение должно успевать прилепять в конец очереди новые вызовы на освободившиеся блоки, а устойчивость к однократным аномальным задержкам (например, из-за отвлечения ОС на другие задачи) будет зависеть от общей длины очереди. Как-то так...

Елена
10.12.2010 16:26:20
#10

Гость

Re: Е-440: скорость работы ф-ии DAC_SAMPLE

насчет E14-440D - пока работаем с тем, что есть

...Насчет структуры Вашей программы - вроде бы все нормально, если Вы не забыли перед началом потокового вывода заполнить буфер ЦАП...
- не забыла


в итоге рук-во решило, что однократные ф-ии DAC_(ADC_)SAMPLE не дают нужную частоту обращений к устройству, т.ч. либо через DSP, либо, как написал Александр, использовать потоковый режим.
В пн. посмотрим, время сдачи поджимает(

Всем спасибо!