Синхронизация AO
-
- doctor
- Сообщения: 2211
- Зарегистрирован: 28 июн 2012, 09:32
- Награды: 3
- Версия LabVIEW: 2009..2020
- Откуда: город семи холмов
- Благодарил (а): 27 раз
- Поблагодарили: 27 раз
Re: Синхронизация AO
Итак, цикл обновления 50мс. В принципе, не слишком маленький. Настоятельно советую в данном случае ограничить количество циклов. Т.е вычисления должны быть групповыми и выдача сигнала одна на плату. Чтобы выдача не подтормаживала, необходимо развязать ее от графического интерфейса, т.е никаких излишеств, обращений к свойствам контролов и т.п.
Что касается задержки. Почитал я хелп... У меня нет сейчас под рукой платы, чтобы проверить. Итак, есть такой вход "таймаут" он ожидает, пока данные не будут записаны в таск. Поэтому для низкоуровневой синхронизации можно попробовать буфер... уменьшить до 10000..15000 точек (50..70% вашей выдачи). И назначить таймаут в пределах 100..1000 мс. Тогда функция сама будет ждать, пока буфер не освободится.
Что касается задержки. Почитал я хелп... У меня нет сейчас под рукой платы, чтобы проверить. Итак, есть такой вход "таймаут" он ожидает, пока данные не будут записаны в таск. Поэтому для низкоуровневой синхронизации можно попробовать буфер... уменьшить до 10000..15000 точек (50..70% вашей выдачи). И назначить таймаут в пределах 100..1000 мс. Тогда функция сама будет ждать, пока буфер не освободится.
-
- assistant
- Сообщения: 147
- Зарегистрирован: 15 ноя 2011, 22:39
- Версия LabVIEW: 2018, 2020
- Откуда: СПб
- Контактная информация:
Re: Синхронизация AO
Так не получается, приходится создавать сигнал длительностью не менее 0,15с, буфер ставить где то в 3 раза больше и тогда начинает стабильно работать, а по другому вылетает с ошибкой переполнения буфера.Поэтому для низкоуровневой синхронизации можно попробовать буфер... уменьшить до 10000..15000 точек (50..70% вашей выдачи). И назначить таймаут в пределах 100..1000 мс. Тогда функция сама будет ждать, пока буфер не освободится.
-
- assistant
- Сообщения: 147
- Зарегистрирован: 15 ноя 2011, 22:39
- Версия LabVIEW: 2018, 2020
- Откуда: СПб
- Контактная информация:
Re: Синхронизация AO
Какой то непонятный глюк, не могу понять в чем дело. Запускаешь программу первый раз работает все норм, останавливается без ошибок. Второй раз запускаешь, не запускаются модули, пытаешся остановить программу через стоп,один цикл не останавливается. При чем, когда по разному соединяешь кластеры ошибок, получаются разные эффекты.
-
- doctor
- Сообщения: 2211
- Зарегистрирован: 28 июн 2012, 09:32
- Награды: 3
- Версия LabVIEW: 2009..2020
- Откуда: город семи холмов
- Благодарил (а): 27 раз
- Поблагодарили: 27 раз
Re: Синхронизация AO
Потому что сделано через одно место...
Останавливать циклы следует не провоцированием ошибки, а отсылкой, например, пустого массива в нотификаторы. В цикле вы проверяете, не пустой ли пришел массив. если да, то стоп. А уже когда цикл завершен, и задача остановлена, тогда можно грохать и нотификатор. Кстати, в вашем случае достаточно одного нотификатора, если вы одни и те-же данные отсылаете. Т.е отсылка в одном месте, а прием в трех. Обработку стопа делаете в цикле генерации. Если стоп, то отсылать пустой массив.
Кейс эвента ставят в цикл while (вообще-то). И стопят его по соответствующему событию.
Останавливать циклы следует не провоцированием ошибки, а отсылкой, например, пустого массива в нотификаторы. В цикле вы проверяете, не пустой ли пришел массив. если да, то стоп. А уже когда цикл завершен, и задача остановлена, тогда можно грохать и нотификатор. Кстати, в вашем случае достаточно одного нотификатора, если вы одни и те-же данные отсылаете. Т.е отсылка в одном месте, а прием в трех. Обработку стопа делаете в цикле генерации. Если стоп, то отсылать пустой массив.
Кейс эвента ставят в цикл while (вообще-то). И стопят его по соответствующему событию.
-
- assistant
- Сообщения: 147
- Зарегистрирован: 15 ноя 2011, 22:39
- Версия LabVIEW: 2018, 2020
- Откуда: СПб
- Контактная информация:
Re: Синхронизация AO
Спасибо=)Странно, что такой способ остановки предлагают в примерах, если это через одно место. Пустой массив как признак, а если передавать по нотификатору непосредственно true или false или это тоже через одно место?
-
- leader
- Сообщения: 932
- Зарегистрирован: 17 янв 2016, 15:02
- Награды: 1
- Версия LabVIEW: 6.1,8.5,20
Re: Синхронизация AO
Fancnc, раздача данных через Notifier для Вашей задачи не лучший вариант. Посмотрите примеры с RealTime FIFO.
-
- assistant
- Сообщения: 147
- Зарегистрирован: 15 ноя 2011, 22:39
- Версия LabVIEW: 2018, 2020
- Откуда: СПб
- Контактная информация:
Re: Синхронизация AO
он не поддерживает 2d массивы=(, а упаковывать в 1d и потом обратно...надо пробывать
-
- assistant
- Сообщения: 147
- Зарегистрирован: 15 ноя 2011, 22:39
- Версия LabVIEW: 2018, 2020
- Откуда: СПб
- Контактная информация:
Re: Синхронизация AO
Не очень понимаю как это работает, но это работает, но стоит убрать это кластер ошибок, показанный на скриншоте и опять подвисают циклы.Если не сложно объясните плз.
-
- assistant
- Сообщения: 147
- Зарегистрирован: 15 ноя 2011, 22:39
- Версия LabVIEW: 2018, 2020
- Откуда: СПб
- Контактная информация:
Re: Синхронизация AO
Дело не в нотификаторах и не способах остановки циклов, а просто подвисают модули когда переполняется буфер. Если убрать старт триггер, работает без проблем, но нет синхронизации, модули запускаются в разное время.
-
- leader
- Сообщения: 932
- Зарегистрирован: 17 янв 2016, 15:02
- Награды: 1
- Версия LabVIEW: 6.1,8.5,20
Re: Синхронизация AO
Дело не в Start Triggere, а скорее всего в изменение размера буфера и его записи при первом вызове функции Write до старта задачи. Учтите, что драйвер при этих операциях производит различные проверки валидности параметров конфигурации задачи, резервирует ресурсы и т.д. что требует определенных временных затрат. При этом он может генерировать ошибку, если что то не так, т.е. заходить в цикл в этом случае нет никакого смысла. Я считаю такой запуск задачи в цикле не совсем удачным. Требующим еще и различные "таблетки": First call?, Case Structure.
По поводу RT FIFO: поддерживает 1D Array of Waveforms (аналог 2D Array).
Upd: Когда используется режим Not Allow Regeneration рекомендуется определить при каких условиях происходит подкачка onboard buffer (FIFO): почти полный, почти пустой или заполнен на половину и меньше.
По поводу RT FIFO: поддерживает 1D Array of Waveforms (аналог 2D Array).
Upd: Когда используется режим Not Allow Regeneration рекомендуется определить при каких условиях происходит подкачка onboard buffer (FIFO): почти полный, почти пустой или заполнен на половину и меньше.
-
- assistant
- Сообщения: 147
- Зарегистрирован: 15 ноя 2011, 22:39
- Версия LabVIEW: 2018, 2020
- Откуда: СПб
- Контактная информация:
Re: Синхронизация AO
Когда идет постоянное обновление сигнала, при других вариантах запуска модули вообще отказываются синхронно запускаться, .считаю такой запуск задачи в цикле не совсем удачным. Требующим еще и различные "таблетки": First call?, Case Structure.
это в настройках DAQmx write ?Когда используется режим Not Allow Regeneration рекомендуется определить при каких условиях происходит подкачка onboard buffer (FIFO): почти полный, почти пустой или заполнен на половину и меньше.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение