И да, я мечтаю чтобы в задаче была cRIO, но там её нет.
Коротко задача: на DO выдаётся хитрая последовательность импульсов (хитрость в том, что пауза между ними постепенно возрастает), поэтому разом взять готовый массив не получится.
решение: готовлю буфер на 2с, дальше в цикле описываю в него по 0,5с.
Задержки в цикле нет. потому что функция записи должна дождаться, когда в буфере будет место, только после этого отправит туда очередную порцию.
На эмуляторе даже всё прекрасно работает.
А дальше иду к реальному cDAQ и всё становится плохо.
В буфер всё успешно пишется, даже на выходе есть то, что надо, НО.
dt измеряется не с проста. На эмуляторе величина в среднем 500мс, что и ожидалось, а вот на реальном железе эта величина 3..100 мс, и через пару минут начинает подскакивать до 8000.
Т.е. получается, что на реальном железе данные отправляются в какой-то неведомый космос, откуда уже передаются на железо. (повторю, что на выходе то, что ожидается, так что прослойка реально работает).
Ещё одна особенность обнаружена: после остановки задачи на выходе часто остаётся 1, что не менее печально.
Долгая переписка с техподдержкой пока не дала результат, предложили только поставить "DAQmx Wait Until Done (VI)", и тут-то обнаружили правильность предположения.
за 10 с функция не дожидается окончания (чел из поддержки сказал, что он дождался минуты за 2-3, что опять же подтверждает огромные размеры буфера).
Тут я решаю проверить, что же там творится, и в случае ошибки запускаю последний цикл. И обнаруживаю, что:
- - буфер свободен, в нём всегда доступно 2000 точек. Т.е. созданный мной буфер реально на 2000 точек
- - задача продолжает работать. величина total generated продолжает расти.
И возникает вопрос, как получить доступ к параметрам этого буфера?
Так, чтобы не пихать туда больше, чем можно.
мОжно банально поставить в цикле задержку 500 мс, но этот вариант плох тем, что не гарантирует отправку данных с нужной скоростью (вдруг они будут поступать чуть медленнее), что через пару часов (в теории) приведёт к ошибке "нет данных".
ставить паузу меньше тоже не подходит, потому что получаю то, что имею, только в меньших масштабах.
Кто-нибудь сталкивался с такой задачей?
cDAQ-9188
модуль 9402