Подскажите по функциям NiScope
-
- beginner
- Сообщения: 32
- Зарегистрирован: 28 дек 2009, 22:09
- Версия LabVIEW: 8.5
- Откуда: Саров
- Контактная информация:
Подскажите по функциям NiScope
Произвожу сбор данных с помощью функции NiScope Fetch, триггер в режиме Digital Edge Ref Trigger, т.е. сбор данных производится, когда на вход PFI1 приходит импульс. Импульс может придти в неопределенное время, поэтому на входе timeout функции NiScope Fetch устанавливаю большое время ожидания. Проблема в том, что когда функция входит в режим ожидания триггерного события, то ее из этого режима может вывести только триггерное событие (приход импульса на вход PFI1). Никак не могу решить задачу как вывезти функцию NiScope Fetch из режима ожидания триггерного события программным путем, это необходимо для того, что триггерное событие может вообще не произойти (импульс на вход PFI1 не приходит), а программу необходимо завершить. Может кто подскажет как это осуществить? Очень надо!
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Подскажите по функциям NiScope
Вряд ли много вам подскажу, но можно было бы поставить событие с тайм-аутом, по которому выполняется финализация и Stop / Quit LabVIEW для выхода из программы. Можно это же событие привязать к нажатию на кнопку останова программы.
-
- beginner
- Сообщения: 32
- Зарегистрирован: 28 дек 2009, 22:09
- Версия LabVIEW: 8.5
- Откуда: Саров
- Контактная информация:
Re: Подскажите по функциям NiScope
В том то и дело, что у меня не получается никаким программным событием вывезти функцию из таймаута и произвести закрытие драйвера вызванной платы функцией close. Позже выложу скрин программы для наглядности.
-
Andrew Lunev
- VIP
- Сообщения: 957
- Зарегистрирован: 11 дек 2010, 12:31
- Награды: 2
- Версия LabVIEW: 2014-2021
- Откуда: Москва
- Благодарил (а): 4 раза
- Поблагодарили: 10 раз
Re: Подскажите по функциям NiScope
Выйти можно только по таймауту, для этого он и предназначен. Иначе программа будет вечно ждать триггерного события. Таймаут генерирует определенную ошибку в кластере ошибки, ее надо обрабатывать и сбрасывать, если не нужен выход из программы. Посмотрите пример UDP Receiver.vi в LabView. Там хоть для UDP, но принцип тот же самый.
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Подскажите по функциям NiScope
sergun08
Вот пример, как можно принудительно завершить программу. Здесь сделано по нажатию на кнопку Stop, но можно точно так же и программно выполнить: допустим, у вас структура последовательности в цикле, так в последнем кадре можно поставить останов по условию, или же привязать останов к терминалу цикла.
Вот пример, как можно принудительно завершить программу. Здесь сделано по нажатию на кнопку Stop, но можно точно так же и программно выполнить: допустим, у вас структура последовательности в цикле, так в последнем кадре можно поставить останов по условию, или же привязать останов к терминалу цикла.
- Вложения
-
- Stop Event.vi
- (9.69 КБ) 122 скачивания
-
Andrew Lunev
- VIP
- Сообщения: 957
- Зарегистрирован: 11 дек 2010, 12:31
- Награды: 2
- Версия LabVIEW: 2014-2021
- Откуда: Москва
- Благодарил (а): 4 раза
- Поблагодарили: 10 раз
Re: Подскажите по функциям NiScope
Это вариант некорректного завершения программы. С таким же успехом можно нажать на выключение питания компьютера. Программа должна не просто остановиться, а корректно завершить все запущенные задачи и процессы. Например задачи оборудования, корректно закрыть файлы на запись и так далее. Например если некорректно завершить задачу вывода информации из платы, то на выходе ЦАП останется последнее введенное напряжение и цифровые выходы останутся в текущем состоянии, а это может привести к аварии, если компьютер управляет каким-то оборудованием.dadreamer писал(а):Вот пример, как можно принудительно завершить программу.
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Подскажите по функциям NiScope
Andrew Lunev
Его легко сделать вполне себе корректным. Я в рабочей программе ставил внутрь Event'а Stacked Sequence Structure, в каждом кадре которой я выполнял по одному этапу финализации. Например, в первом кадре освобождается память, выделенная под IMAQ-изображения, во втором кадре закрываются объекты фреймграббера и видеокамеры, в третьем - ещё что-то, типа закрытия плат ввода-вывода. А самым последним кадром идёт как раз Stop / Quit LabVIEW. Ещё один вариант - поставить внутрь vi, в самое начало, DLL или CIN, на вход которого подать хэндлы/ссылки всех объектов, требующих финализации. И теперь если вызвать где-то в vi инструмент Stop / Quit LabVIEW, произойдёт событие Abort в этой DLL/CIN'е, и в соответствующей процедуре можно выполнить те же самые этапы финализации.
Его легко сделать вполне себе корректным. Я в рабочей программе ставил внутрь Event'а Stacked Sequence Structure, в каждом кадре которой я выполнял по одному этапу финализации. Например, в первом кадре освобождается память, выделенная под IMAQ-изображения, во втором кадре закрываются объекты фреймграббера и видеокамеры, в третьем - ещё что-то, типа закрытия плат ввода-вывода. А самым последним кадром идёт как раз Stop / Quit LabVIEW. Ещё один вариант - поставить внутрь vi, в самое начало, DLL или CIN, на вход которого подать хэндлы/ссылки всех объектов, требующих финализации. И теперь если вызвать где-то в vi инструмент Stop / Quit LabVIEW, произойдёт событие Abort в этой DLL/CIN'е, и в соответствующей процедуре можно выполнить те же самые этапы финализации.
-
Andrew Lunev
- VIP
- Сообщения: 957
- Зарегистрирован: 11 дек 2010, 12:31
- Награды: 2
- Версия LabVIEW: 2014-2021
- Откуда: Москва
- Благодарил (а): 4 раза
- Поблагодарили: 10 раз
Re: Подскажите по функциям NiScope
Тогда уж можно и так сделать. Но все равно без останова задачи цикл сбора данных дальше Read не продвинется. Timeout для того и придуман, что если событие не наступает за определенное время, то можно об этом узнать и обработать дальше без останова задачи. А уж что делать по timeout это уже решать программисту, может завершить задачу, а может выдать сообщение пользователю или что-то еще. Timeout в данном случае дает более гибкий вариант обработки и при этом не останавливает задачу сбора данных, но дает выполнение других действий в цикле сбора данных. Зачем изобретать велосипед, если все уже придумано?
-
- beginner
- Сообщения: 32
- Зарегистрирован: 28 дек 2009, 22:09
- Версия LabVIEW: 8.5
- Откуда: Саров
- Контактная информация:
Re: Подскажите по функциям NiScope
Структура программы такова:
Смысл в том, что пользователь запускает программу и уходит, через какое то время приходит внешний сигнал запуска, программа получает данные, сохраняет их и завершается. Но бывает так, что сигнал запуска не пришел, в этом случае пользователь должен нажать некую кнопку в программе, чтобы она вышла из ожидания и корректно завершилась. А если сигнал запуска не пришел, функция ждет этот свой тайм-аут и даже если грубо нажать виндусовый крестик в правом верхнем углу, оболочка закрывается, а сброса функции не происходит... приходится перезагружать комп...
Смысл в том, что пользователь запускает программу и уходит, через какое то время приходит внешний сигнал запуска, программа получает данные, сохраняет их и завершается. Но бывает так, что сигнал запуска не пришел, в этом случае пользователь должен нажать некую кнопку в программе, чтобы она вышла из ожидания и корректно завершилась. А если сигнал запуска не пришел, функция ждет этот свой тайм-аут и даже если грубо нажать виндусовый крестик в правом верхнем углу, оболочка закрывается, а сброса функции не происходит... приходится перезагружать комп...
-
Andrew Lunev
- VIP
- Сообщения: 957
- Зарегистрирован: 11 дек 2010, 12:31
- Награды: 2
- Версия LabVIEW: 2014-2021
- Откуда: Москва
- Благодарил (а): 4 раза
- Поблагодарили: 10 раз
Re: Подскажите по функциям NiScope
Так поставьте ваш Read в цикл Wile и пусть он крутится с шагом таймаута. А в цикле уже проверяйте, если таймаут вышел, и кнопка Стоп не нажата, то снова ждите триггерного события, а если событие произошло или кнопка стоп была нажата, то выходите из цикла и корректно завершайте программу.
-
- beginner
- Сообщения: 32
- Зарегистрирован: 28 дек 2009, 22:09
- Версия LabVIEW: 8.5
- Откуда: Саров
- Контактная информация:
Re: Подскажите по функциям NiScope
А не случится так, что во время сбора данных произойдет переход в цикле и данные будут потеряны? И как проверить в цикле, что произошло триггерное событие? (если вопросы кажутся легкими, то не удивляйтесь - я начинающий)))
-
Andrew Lunev
- VIP
- Сообщения: 957
- Зарегистрирован: 11 дек 2010, 12:31
- Награды: 2
- Версия LabVIEW: 2014-2021
- Откуда: Москва
- Благодарил (а): 4 раза
- Поблагодарили: 10 раз
Re: Подскажите по функциям NiScope
Данные по триггерному событию в буфер платы заносятся аппаратно, программа никак на эту скорость не влияет. Задачу же вы не останавливаете. В случае, если таймаут совпадет с триггерным событием вы всего лишь получите данные из буфера на следующей итерации цикла (чуть-чуть позже, чем если всегда ждать), но точно их не потеряете.
Я уже писал выше, что по завершению таймаута на выходе Read появляется ошибка с определенным кодом (какой именно не помню) ее надо проверять и сбрасывать, если реакция на нее не нужна. Зайдите в примеры LabView и посмотрите как работает пример "UDP Receiver" там как раз проверяется ошибка таймаута и сбрасывается, а выход из цикла организован по кнопке.
Я уже писал выше, что по завершению таймаута на выходе Read появляется ошибка с определенным кодом (какой именно не помню) ее надо проверять и сбрасывать, если реакция на нее не нужна. Зайдите в примеры LabView и посмотрите как работает пример "UDP Receiver" там как раз проверяется ошибка таймаута и сбрасывается, а выход из цикла организован по кнопке.
-
- beginner
- Сообщения: 32
- Зарегистрирован: 28 дек 2009, 22:09
- Версия LabVIEW: 8.5
- Откуда: Саров
- Контактная информация:
Re: Подскажите по функциям NiScope
Родилась вот такая идея:
в цикле мне кажется не обязательно устанавливать шаг, ибо цикл не уйдет на следующую итерацию пока не кончится тайм-аут функции.
Функцию поместил в "кадр", чтобы данные были получены надежно. Хотя может это лишнее...
На рисунке еще не хватает сброса ошибки по истечении тайм-аута. Потому что каждый раз по истечении тайм-аута выпрыгивает сообщение об его окончании. А если добавить сброс ошибки, то этого сообщения не будет?
Проверить смогу только завтра на работе.
Как считаете, такая схема будет работать?
в цикле мне кажется не обязательно устанавливать шаг, ибо цикл не уйдет на следующую итерацию пока не кончится тайм-аут функции.
Функцию поместил в "кадр", чтобы данные были получены надежно. Хотя может это лишнее...
На рисунке еще не хватает сброса ошибки по истечении тайм-аута. Потому что каждый раз по истечении тайм-аута выпрыгивает сообщение об его окончании. А если добавить сброс ошибки, то этого сообщения не будет?
Проверить смогу только завтра на работе.
Как считаете, такая схема будет работать?
-
Andrew Lunev
- VIP
- Сообщения: 957
- Зарегистрирован: 11 дек 2010, 12:31
- Награды: 2
- Версия LabVIEW: 2014-2021
- Откуда: Москва
- Благодарил (а): 4 раза
- Поблагодарили: 10 раз
Re: Подскажите по функциям NiScope
Идея скорее всего будет работать, но точно не в такой реализации.
Дело в том, что по концепции NI если на вход VI приходит ошибка, то этот VI не выполняется, а просто передает ошибку дальше. Это не лишено смысла, так как если была ошибка до этого, то зачем выполнять функцию с ошибочными входными данными, надо сначала обработать эту ошибку. Это легко проверить, если открыть блок диаграмму например "Acquisition Status". Получается, что у вас при возникновении ошибки таймаута весь цикл прекратит нормальную работу, так как ошибка у вас передастся на следующую итерацию через сдвиговый регистр. Так что ошибку таймаута сбрасывать придется перед выполнением "Acquisition Status".
Ну и по мелочи:
1. Шаг цикла дополнительно устанавливать не только не надо, но и вредно. Так как в цикле должен быть только один источник тактирования, иначе возможны конфликты.
2. Функцию "кадр" ставить совершенно не обязательно. Последовательность выполнения когда и так однозначно задается потоком данных. Почитайте подробней про "Принцип потока данных" в любом учебнике по LabView.
Дело в том, что по концепции NI если на вход VI приходит ошибка, то этот VI не выполняется, а просто передает ошибку дальше. Это не лишено смысла, так как если была ошибка до этого, то зачем выполнять функцию с ошибочными входными данными, надо сначала обработать эту ошибку. Это легко проверить, если открыть блок диаграмму например "Acquisition Status". Получается, что у вас при возникновении ошибки таймаута весь цикл прекратит нормальную работу, так как ошибка у вас передастся на следующую итерацию через сдвиговый регистр. Так что ошибку таймаута сбрасывать придется перед выполнением "Acquisition Status".
Ну и по мелочи:
1. Шаг цикла дополнительно устанавливать не только не надо, но и вредно. Так как в цикле должен быть только один источник тактирования, иначе возможны конфликты.
2. Функцию "кадр" ставить совершенно не обязательно. Последовательность выполнения когда и так однозначно задается потоком данных. Почитайте подробней про "Принцип потока данных" в любом учебнике по LabView.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
- 20 Ответы
- 672 Просмотры
-
Последнее сообщение Zloydj