Страница 2 из 2

Re: Синхронизация AO

Добавлено: 04 апр 2017, 09:10
Borjomy_1
Итак, цикл обновления 50мс. В принципе, не слишком маленький. Настоятельно советую в данном случае ограничить количество циклов. Т.е вычисления должны быть групповыми и выдача сигнала одна на плату. Чтобы выдача не подтормаживала, необходимо развязать ее от графического интерфейса, т.е никаких излишеств, обращений к свойствам контролов и т.п.
Что касается задержки. Почитал я хелп... У меня нет сейчас под рукой платы, чтобы проверить. Итак, есть такой вход "таймаут" он ожидает, пока данные не будут записаны в таск. Поэтому для низкоуровневой синхронизации можно попробовать буфер... уменьшить до 10000..15000 точек (50..70% вашей выдачи). И назначить таймаут в пределах 100..1000 мс. Тогда функция сама будет ждать, пока буфер не освободится.

Re: Синхронизация AO

Добавлено: 04 апр 2017, 20:20
Fancnc
Поэтому для низкоуровневой синхронизации можно попробовать буфер... уменьшить до 10000..15000 точек (50..70% вашей выдачи). И назначить таймаут в пределах 100..1000 мс. Тогда функция сама будет ждать, пока буфер не освободится.
Так не получается, приходится создавать сигнал длительностью не менее 0,15с, буфер ставить где то в 3 раза больше и тогда начинает стабильно работать, а по другому вылетает с ошибкой переполнения буфера.

Re: Синхронизация AO

Добавлено: 05 апр 2017, 13:22
Fancnc
Какой то непонятный глюк, не могу понять в чем дело. Запускаешь программу первый раз работает все норм, останавливается без ошибок. Второй раз запускаешь, не запускаются модули, пытаешся остановить программу через стоп,один цикл не останавливается. При чем, когда по разному соединяешь кластеры ошибок, получаются разные эффекты.

Re: Синхронизация AO

Добавлено: 05 апр 2017, 15:07
Fancnc
Еще вот так побывал...почему то не останавливаются некоторые циклы=(

Re: Синхронизация AO

Добавлено: 05 апр 2017, 21:57
Borjomy_1
Потому что сделано через одно место...
Останавливать циклы следует не провоцированием ошибки, а отсылкой, например, пустого массива в нотификаторы. В цикле вы проверяете, не пустой ли пришел массив. если да, то стоп. А уже когда цикл завершен, и задача остановлена, тогда можно грохать и нотификатор. Кстати, в вашем случае достаточно одного нотификатора, если вы одни и те-же данные отсылаете. Т.е отсылка в одном месте, а прием в трех. Обработку стопа делаете в цикле генерации. Если стоп, то отсылать пустой массив.
Кейс эвента ставят в цикл while (вообще-то). И стопят его по соответствующему событию.

Re: Синхронизация AO

Добавлено: 06 апр 2017, 12:40
Fancnc
Спасибо=)Странно, что такой способ остановки предлагают в примерах, если это через одно место. Пустой массив как признак, а если передавать по нотификатору непосредственно true или false или это тоже через одно место?

Re: Синхронизация AO

Добавлено: 06 апр 2017, 14:09
Blackman
Fancnc, раздача данных через Notifier для Вашей задачи не лучший вариант. Посмотрите примеры с RealTime FIFO.

Re: Синхронизация AO

Добавлено: 06 апр 2017, 15:03
Fancnc
он не поддерживает 2d массивы=(, а упаковывать в 1d и потом обратно...надо пробывать

Re: Синхронизация AO

Добавлено: 06 апр 2017, 16:07
Fancnc
Не очень понимаю как это работает, но это работает, но стоит убрать это кластер ошибок, показанный на скриншоте и опять подвисают циклы.Если не сложно объясните плз.

Re: Синхронизация AO

Добавлено: 06 апр 2017, 18:15
Fancnc
Дело не в нотификаторах и не способах остановки циклов, а просто подвисают модули когда переполняется буфер. Если убрать старт триггер, работает без проблем, но нет синхронизации, модули запускаются в разное время.

Re: Синхронизация AO

Добавлено: 06 апр 2017, 23:00
Blackman
Дело не в Start Triggere, а скорее всего в изменение размера буфера и его записи при первом вызове функции Write до старта задачи. Учтите, что драйвер при этих операциях производит различные проверки валидности параметров конфигурации задачи, резервирует ресурсы и т.д. что требует определенных временных затрат. При этом он может генерировать ошибку, если что то не так, т.е. заходить в цикл в этом случае нет никакого смысла. Я считаю такой запуск задачи в цикле не совсем удачным. Требующим еще и различные "таблетки": First call?, Case Structure.
По поводу RT FIFO: поддерживает 1D Array of Waveforms (аналог 2D Array).
Upd: Когда используется режим Not Allow Regeneration рекомендуется определить при каких условиях происходит подкачка onboard buffer (FIFO): почти полный, почти пустой или заполнен на половину и меньше.

Re: Синхронизация AO

Добавлено: 07 апр 2017, 00:05
Fancnc
считаю такой запуск задачи в цикле не совсем удачным. Требующим еще и различные "таблетки": First call?, Case Structure.
Когда идет постоянное обновление сигнала, при других вариантах запуска модули вообще отказываются синхронно запускаться, .
Когда используется режим Not Allow Regeneration рекомендуется определить при каких условиях происходит подкачка onboard buffer (FIFO): почти полный, почти пустой или заполнен на половину и меньше.
это в настройках DAQmx write ?