Подскажите по функциям NiScope

Захват, обработка и генерирование сигнала
Ответить
sergun08
beginner
beginner
Сообщения: 32
Зарегистрирован: 28 дек 2009, 22:09
Версия LabVIEW: 8.5
Откуда: Саров
Контактная информация:

Подскажите по функциям NiScope

Сообщение sergun08 »

Произвожу сбор данных с помощью функции NiScope Fetch, триггер в режиме Digital Edge Ref Trigger, т.е. сбор данных производится, когда на вход PFI1 приходит импульс. Импульс может придти в неопределенное время, поэтому на входе timeout функции NiScope Fetch устанавливаю большое время ожидания. Проблема в том, что когда функция входит в режим ожидания триггерного события, то ее из этого режима может вывести только триггерное событие (приход импульса на вход PFI1). Никак не могу решить задачу как вывезти функцию NiScope Fetch из режима ожидания триггерного события программным путем, это необходимо для того, что триггерное событие может вообще не произойти (импульс на вход PFI1 не приходит), а программу необходимо завершить. Может кто подскажет как это осуществить? Очень надо!
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 127 раз
Контактная информация:

Re: Подскажите по функциям NiScope

Сообщение dadreamer »

Вряд ли много вам подскажу, но можно было бы поставить событие с тайм-аутом, по которому выполняется финализация и Stop / Quit LabVIEW для выхода из программы. Можно это же событие привязать к нажатию на кнопку останова программы.
sergun08
beginner
beginner
Сообщения: 32
Зарегистрирован: 28 дек 2009, 22:09
Версия LabVIEW: 8.5
Откуда: Саров
Контактная информация:

Re: Подскажите по функциям NiScope

Сообщение sergun08 »

В том то и дело, что у меня не получается никаким программным событием вывезти функцию из таймаута и произвести закрытие драйвера вызванной платы функцией close. Позже выложу скрин программы для наглядности.
Аватара пользователя
Andrew Lunev

Activity Professionalism
VIP
VIP
Сообщения: 957
Зарегистрирован: 11 дек 2010, 12:31
Награды: 2
Версия LabVIEW: 2014-2021
Откуда: Москва
Благодарил (а): 4 раза
Поблагодарили: 10 раз

Re: Подскажите по функциям NiScope

Сообщение Andrew Lunev »

Выйти можно только по таймауту, для этого он и предназначен. Иначе программа будет вечно ждать триггерного события. Таймаут генерирует определенную ошибку в кластере ошибки, ее надо обрабатывать и сбрасывать, если не нужен выход из программы. Посмотрите пример UDP Receiver.vi в LabView. Там хоть для UDP, но принцип тот же самый.
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 127 раз
Контактная информация:

Re: Подскажите по функциям NiScope

Сообщение dadreamer »

sergun08

Вот пример, как можно принудительно завершить программу. Здесь сделано по нажатию на кнопку Stop, но можно точно так же и программно выполнить: допустим, у вас структура последовательности в цикле, так в последнем кадре можно поставить останов по условию, или же привязать останов к терминалу цикла.
Вложения
Stop Event.vi
(9.69 КБ) 122 скачивания
Аватара пользователя
Andrew Lunev

Activity Professionalism
VIP
VIP
Сообщения: 957
Зарегистрирован: 11 дек 2010, 12:31
Награды: 2
Версия LabVIEW: 2014-2021
Откуда: Москва
Благодарил (а): 4 раза
Поблагодарили: 10 раз

Re: Подскажите по функциям NiScope

Сообщение Andrew Lunev »

dadreamer писал(а):Вот пример, как можно принудительно завершить программу.
Это вариант некорректного завершения программы. С таким же успехом можно нажать на выключение питания компьютера. Программа должна не просто остановиться, а корректно завершить все запущенные задачи и процессы. Например задачи оборудования, корректно закрыть файлы на запись и так далее. Например если некорректно завершить задачу вывода информации из платы, то на выходе ЦАП останется последнее введенное напряжение и цифровые выходы останутся в текущем состоянии, а это может привести к аварии, если компьютер управляет каким-то оборудованием.
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 127 раз
Контактная информация:

Re: Подскажите по функциям NiScope

Сообщение dadreamer »

Andrew Lunev

Его легко сделать вполне себе корректным. Я в рабочей программе ставил внутрь Event'а Stacked Sequence Structure, в каждом кадре которой я выполнял по одному этапу финализации. Например, в первом кадре освобождается память, выделенная под IMAQ-изображения, во втором кадре закрываются объекты фреймграббера и видеокамеры, в третьем - ещё что-то, типа закрытия плат ввода-вывода. А самым последним кадром идёт как раз Stop / Quit LabVIEW. Ещё один вариант - поставить внутрь vi, в самое начало, DLL или CIN, на вход которого подать хэндлы/ссылки всех объектов, требующих финализации. И теперь если вызвать где-то в vi инструмент Stop / Quit LabVIEW, произойдёт событие Abort в этой DLL/CIN'е, и в соответствующей процедуре можно выполнить те же самые этапы финализации.
Аватара пользователя
Andrew Lunev

Activity Professionalism
VIP
VIP
Сообщения: 957
Зарегистрирован: 11 дек 2010, 12:31
Награды: 2
Версия LabVIEW: 2014-2021
Откуда: Москва
Благодарил (а): 4 раза
Поблагодарили: 10 раз

Re: Подскажите по функциям NiScope

Сообщение Andrew Lunev »

Тогда уж можно и так сделать. Но все равно без останова задачи цикл сбора данных дальше Read не продвинется. Timeout для того и придуман, что если событие не наступает за определенное время, то можно об этом узнать и обработать дальше без останова задачи. А уж что делать по timeout это уже решать программисту, может завершить задачу, а может выдать сообщение пользователю или что-то еще. Timeout в данном случае дает более гибкий вариант обработки и при этом не останавливает задачу сбора данных, но дает выполнение других действий в цикле сбора данных. Зачем изобретать велосипед, если все уже придумано?
Вложения
Trig.png
sergun08
beginner
beginner
Сообщения: 32
Зарегистрирован: 28 дек 2009, 22:09
Версия LabVIEW: 8.5
Откуда: Саров
Контактная информация:

Re: Подскажите по функциям NiScope

Сообщение sergun08 »

Структура программы такова:

Изображение

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

Activity Professionalism
VIP
VIP
Сообщения: 957
Зарегистрирован: 11 дек 2010, 12:31
Награды: 2
Версия LabVIEW: 2014-2021
Откуда: Москва
Благодарил (а): 4 раза
Поблагодарили: 10 раз

Re: Подскажите по функциям NiScope

Сообщение Andrew Lunev »

Так поставьте ваш :vi: Read в цикл Wile и пусть он крутится с шагом таймаута. А в цикле уже проверяйте, если таймаут вышел, и кнопка Стоп не нажата, то снова ждите триггерного события, а если событие произошло или кнопка стоп была нажата, то выходите из цикла и корректно завершайте программу.
sergun08
beginner
beginner
Сообщения: 32
Зарегистрирован: 28 дек 2009, 22:09
Версия LabVIEW: 8.5
Откуда: Саров
Контактная информация:

Re: Подскажите по функциям NiScope

Сообщение sergun08 »

А не случится так, что во время сбора данных произойдет переход в цикле и данные будут потеряны? И как проверить в цикле, что произошло триггерное событие? (если вопросы кажутся легкими, то не удивляйтесь - я начинающий)))
Аватара пользователя
Andrew Lunev

Activity Professionalism
VIP
VIP
Сообщения: 957
Зарегистрирован: 11 дек 2010, 12:31
Награды: 2
Версия LabVIEW: 2014-2021
Откуда: Москва
Благодарил (а): 4 раза
Поблагодарили: 10 раз

Re: Подскажите по функциям NiScope

Сообщение Andrew Lunev »

Данные по триггерному событию в буфер платы заносятся аппаратно, программа никак на эту скорость не влияет. Задачу же вы не останавливаете. В случае, если таймаут совпадет с триггерным событием вы всего лишь получите данные из буфера на следующей итерации цикла (чуть-чуть позже, чем если всегда ждать), но точно их не потеряете.
Я уже писал выше, что по завершению таймаута на выходе :vi: Read появляется ошибка с определенным кодом (какой именно не помню) ее надо проверять и сбрасывать, если реакция на нее не нужна. Зайдите в примеры LabView и посмотрите как работает пример "UDP Receiver" там как раз проверяется ошибка таймаута и сбрасывается, а выход из цикла организован по кнопке.
sergun08
beginner
beginner
Сообщения: 32
Зарегистрирован: 28 дек 2009, 22:09
Версия LabVIEW: 8.5
Откуда: Саров
Контактная информация:

Re: Подскажите по функциям NiScope

Сообщение sergun08 »

Родилась вот такая идея:

Изображение

в цикле мне кажется не обязательно устанавливать шаг, ибо цикл не уйдет на следующую итерацию пока не кончится тайм-аут функции.
Функцию поместил в "кадр", чтобы данные были получены надежно. Хотя может это лишнее...
На рисунке еще не хватает сброса ошибки по истечении тайм-аута. Потому что каждый раз по истечении тайм-аута выпрыгивает сообщение об его окончании. А если добавить сброс ошибки, то этого сообщения не будет?
Проверить смогу только завтра на работе.
Как считаете, такая схема будет работать?
Аватара пользователя
Andrew Lunev

Activity Professionalism
VIP
VIP
Сообщения: 957
Зарегистрирован: 11 дек 2010, 12:31
Награды: 2
Версия LabVIEW: 2014-2021
Откуда: Москва
Благодарил (а): 4 раза
Поблагодарили: 10 раз

Re: Подскажите по функциям NiScope

Сообщение Andrew Lunev »

Идея скорее всего будет работать, но точно не в такой реализации.
Дело в том, что по концепции NI если на вход VI приходит ошибка, то этот VI не выполняется, а просто передает ошибку дальше. Это не лишено смысла, так как если была ошибка до этого, то зачем выполнять функцию с ошибочными входными данными, надо сначала обработать эту ошибку. Это легко проверить, если открыть блок диаграмму например "Acquisition Status". Получается, что у вас при возникновении ошибки таймаута весь цикл прекратит нормальную работу, так как ошибка у вас передастся на следующую итерацию через сдвиговый регистр. Так что ошибку таймаута сбрасывать придется перед выполнением "Acquisition Status".
Ну и по мелочи:
1. Шаг цикла дополнительно устанавливать не только не надо, но и вредно. Так как в цикле должен быть только один источник тактирования, иначе возможны конфликты.
2. Функцию "кадр" ставить совершенно не обязательно. Последовательность выполнения когда и так однозначно задается потоком данных. Почитайте подробней про "Принцип потока данных" в любом учебнике по LabView.
sergun08
beginner
beginner
Сообщения: 32
Зарегистрирован: 28 дек 2009, 22:09
Версия LabVIEW: 8.5
Откуда: Саров
Контактная информация:

Re: Подскажите по функциям NiScope

Сообщение sergun08 »

Все получилось! Всех благодарю за помощь! :thank:
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Обработка сигнала»