Как запустить часть кода определенное количество раз?
Как запустить часть кода определенное количество раз?
Здравствуйте.
Есть один вопрос. Мне кажется, что решение простое, но не могу придумать как.
Ситуация следующая. Мне нужно реализовать функцию усреднения данных. А чтобы это сделать, для начала нужно запустить некоторое количество измерений.
Кнопка "Старт" у меня находится в ивент структуре и по ее нажатию запускается ряд процессов.
Как мне видится, самое простое чтобы запустить несколько измерений подряд, надо нажать кнопку "старт" столько раз, сколько надо.
И вот вопрос - как это сделать?
Есть один вопрос. Мне кажется, что решение простое, но не могу придумать как.
Ситуация следующая. Мне нужно реализовать функцию усреднения данных. А чтобы это сделать, для начала нужно запустить некоторое количество измерений.
Кнопка "Старт" у меня находится в ивент структуре и по ее нажатию запускается ряд процессов.
Как мне видится, самое простое чтобы запустить несколько измерений подряд, надо нажать кнопку "старт" столько раз, сколько надо.
И вот вопрос - как это сделать?
-
- doctor
- Сообщения: 2366
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 12 раз
- Поблагодарили: 54 раза
- Контактная информация:
Re: Как запустить часть кода определенное количество раз?
Самое простое - использовать цикл for. Остальное - попахивает извращением :)
Re: Как запустить часть кода определенное количество раз?
Нее, я думаю, что for не выход. А насчет "остального" - какие идеи? Как вообще можно запустить цикл одинаковых измерений?
У меня спектрометр собирает данные. Я бы хотел запустить несколько одноразовых измерений (к примеру 10) эти данные собрать, суммировать их и поделить на кол-во циклов, чтобы усреднить все.
Вот бьюсь над двумя задачами:
1) запустить N-ное кол-во измерений
2) написать код для усреднения данных (прилагаю скрин, как сделал. Этот код работает, но не совсем правильно).
-
- doctor
- Сообщения: 2366
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 12 раз
- Поблагодарили: 54 раза
- Контактная информация:
Re: Как запустить часть кода определенное количество раз?
Т.е. запустить цикл while - это вариант, а цикл for - не вариант?
Как спектрометр данные собирает, как отдаёт?
upd: в цикле вообще что-то странное происходит. Проще верхние массивы разделит на N и прибавить нижние, получится то же самое :)
Как спектрометр данные собирает, как отдаёт?
upd: в цикле вообще что-то странное происходит. Проще верхние массивы разделит на N и прибавить нижние, получится то же самое :)
Re: Как запустить часть кода определенное количество раз?
Не не. Первая задача такая - нажать кнопку старт N-ное кол-во раз. И вот мне кажется, что тут не вариант использовать цикл for (хотя я еще не пробовал). Если были подобные варианты реализованы, то было бы интересно глянуть. Второй вариант мне видится таким - что через генератор внешних импульсов подключить спектрометр. А на генератор подавать столько импульсов, сколько надо ( один импульс - один запуск). Этот вариант беспроигрышный, но хочется знать о программной части - может можно это сделать пока что без генератора.
Вторая задача - после запуска нескольких измерений (одного за другим) собрать их все, просуммировать и разделить. Вот мой скрин был про вторую часть.
НА моем скрине суммирование и деление идет нормально. НО общая логика построена не правильно:
Прилетает массив данных и там начинает гонятся по циклу и суммироваться сам с собой (столько раз, сколько задали количество измерений). Потом прилетает второй массив и тоже сам с собой (а первый массив пропадает). И так повторяется столько раз, сколько задаем. В итоге на выходе не среднее 10 измерений (к примеру), а среднее послу суммирования последнего одного массива. Вот и не понятно, что я делаю не так.
Re: Как запустить часть кода определенное количество раз?
Спектрометры Avantes. За основу я брал их лабвьюшный код и доделывал до того, что надо мне.
На скрине в кейс структуре показано, откуда берутся данные. Это свои dll библиотеки. Собирается массив по у и массив по х (там еще немного разных домножений и ограничений. это уже от меня) и потом мы объединяем все в один.
Спектрометра два. ПОтому по два массива от каждого объединяем в один и выводим на ху графф. Я вот хотел вставить усреднение где-то между ху графф и кейс структурой.
-
- doctor
- Сообщения: 2366
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 12 раз
- Поблагодарили: 54 раза
- Контактная информация:
Re: Как запустить часть кода определенное количество раз?
ЗАЧЕМ?
По-моему, это не задача, а кривой метод.
и в чём проблема зациклить?И вот мне кажется, что тут не вариант использовать цикл for (хотя я еще не пробовал).
я показал, как можно усреднить при чтении. Есть всякие MeanPtByPtВторая задача - после запуска нескольких измерений (одного за другим) собрать их все, просуммировать и разделить. Вот мой скрин был про вторую часть.
Если "идёт нормально", но "не нормально", то точно нарушена логика в умозаключениях :)НА моем скрине суммирование и деление идет нормально. НО общая логика построена не правильно:
Я опять же говорил, что ваш цикл выглядит так:
А - один массив, В - второй
Цикл N раз
{A = A + В
}
А = A/N
Что то же самое, что
A = A + NB
A = A/N
Или быстрее и короче:
А = A/N + B
Re: Как запустить часть кода определенное количество раз?
Спектрометр (он синхронизирует себя и лазер, чтобы на спектре не было видно следа лазера. Происходит быстрое включение лазера путем импульса, и после потухания включается спектрометр.) посылает импульс на лазер. На один запуск спектрометра - один импульс на лазер. При таком режиме работы комплекса, сигнал получается слабый и слегка зашумленный. Потому мне надо запустить несколько одинаковых измерений и усреднить это, чтобы шум распределился равномерно.ЗАЧЕМ?
По-моему, это не задача, а кривой метод.
Как я и сказал, у меня две мысли, как это сделать - генератор внешних импульсов (на него задать только параметры и он сам будет гонять циклы, сколько надо) и программно нажимать кнопку старт, сколько надо.
Кнопка старт у меня выглядит так (смотри скрин).
Там все считается делится нормально. Проблема в том, что все суммирование идет только с одним массивом:Если "идёт нормально", но "не нормально", то точно нарушена логика в умозаключениях :)
Массив прилетает, я его разделяю на х и у. И он начинает суммироваться сам с собой (кол-во суммирований согласно кол-ву измерений).
Потом идет второе измерение и прилетает массив. Старый теряется, а новый начинает опять летать по циклу и суммироваться сам с собой.
И так повторяется столько раз, сколько задал циклов. Массивы не суммируются друг с другом, а только сами с собой и на выходе я получаю среднее значение из последнего массива.
Мне казалось, что должен прийти массив, он записался в память и ждет следующего массива, происходит сумма и ждут третий массив и так далее.
-
- doctor
- Сообщения: 2366
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 12 раз
- Поблагодарили: 54 раза
- Контактная информация:
Re: Как запустить часть кода определенное количество раз?
Наивно полагать, что программная синхронизация будет работать лучше аппаратной.
Для особо настойчивых повторяю (последний раз): если "у меня всё сделано правильно, но считает почему-то не правильно", то это всего лишь значит, что сделано НЕ правильно.Там все считается делится нормально. Проблема в том, что все суммирование идет только с одним массивом:
Как усреднять прилетающие данные я уже показывал.
Re: Как запустить часть кода определенное количество раз?
В общем, я попробовал кнопку старт просто поместить в цикл for. В целом - получилось. Лазер загорается столько раз, сколько включается спектрометр. По сути это повторение нажатия кнопки старт.Наивно полагать, что программная синхронизация будет работать лучше аппаратной.
Но появилась другая проблема - почему-то пропал сигнал. Точнее шум остался, а полезный сигнал от люминофора пропал.
Может рассинхрон. Надо разбираться.

Re: Как запустить часть кода определенное количество раз?
Честно говоря, я не совсем понимаю ваш скрин. Не могли вы дать комментарии к нему?Как усреднять прилетающие данные я уже показывал.
-
- doctor
- Сообщения: 2366
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 12 раз
- Поблагодарили: 54 раза
- Контактная информация:
Re: Как запустить часть кода определенное количество раз?
Массив заполняется приходящими значениями. Как только заполнили - усреднить.
Размер массива задаётся на старте.
Индекс элемента зависит от шага цикла.
Размер массива задаётся на старте.
Индекс элемента зависит от шага цикла.