Как запустить часть кода определенное количество раз?

Темы связанные с инженерными разработками, но не подходящие в другие ветки форума
Ответить
fizikaman
interested
interested
Сообщения: 8
Зарегистрирован: 07 ноя 2020, 10:07
Версия LabVIEW: 16

Как запустить часть кода определенное количество раз?

Сообщение fizikaman »

Здравствуйте.
Есть один вопрос. Мне кажется, что решение простое, но не могу придумать как.
Ситуация следующая. Мне нужно реализовать функцию усреднения данных. А чтобы это сделать, для начала нужно запустить некоторое количество измерений.
Кнопка "Старт" у меня находится в ивент структуре и по ее нажатию запускается ряд процессов.
Как мне видится, самое простое чтобы запустить несколько измерений подряд, надо нажать кнопку "старт" столько раз, сколько надо.
И вот вопрос - как это сделать?
Artem.spb

Activity Автор
doctor
doctor
Сообщения: 2366
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 12 раз
Поблагодарили: 54 раза
Контактная информация:

Re: Как запустить часть кода определенное количество раз?

Сообщение Artem.spb »

Самое простое - использовать цикл for. Остальное - попахивает извращением :)
fizikaman
interested
interested
Сообщения: 8
Зарегистрирован: 07 ноя 2020, 10:07
Версия LabVIEW: 16

Re: Как запустить часть кода определенное количество раз?

Сообщение fizikaman »

Artem.spb писал(а): 30 ноя 2020, 12:15 Самое простое - использовать цикл for. Остальное - попахивает извращением :)
Нее, я думаю, что for не выход. А насчет "остального" - какие идеи? Как вообще можно запустить цикл одинаковых измерений?
У меня спектрометр собирает данные. Я бы хотел запустить несколько одноразовых измерений (к примеру 10) эти данные собрать, суммировать их и поделить на кол-во циклов, чтобы усреднить все.
Вот бьюсь над двумя задачами:
1) запустить N-ное кол-во измерений
2) написать код для усреднения данных (прилагаю скрин, как сделал. Этот код работает, но не совсем правильно).
Вложения
Усреднение 2.jpg
Artem.spb

Activity Автор
doctor
doctor
Сообщения: 2366
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 12 раз
Поблагодарили: 54 раза
Контактная информация:

Re: Как запустить часть кода определенное количество раз?

Сообщение Artem.spb »

Т.е. запустить цикл while - это вариант, а цикл for - не вариант?
Как спектрометр данные собирает, как отдаёт?

upd: в цикле вообще что-то странное происходит. Проще верхние массивы разделит на N и прибавить нижние, получится то же самое :)
Artem.spb

Activity Автор
doctor
doctor
Сообщения: 2366
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 12 раз
Поблагодарили: 54 раза
Контактная информация:

Re: Как запустить часть кода определенное количество раз?

Сообщение Artem.spb »

как-то так
01.png
fizikaman
interested
interested
Сообщения: 8
Зарегистрирован: 07 ноя 2020, 10:07
Версия LabVIEW: 16

Re: Как запустить часть кода определенное количество раз?

Сообщение fizikaman »

Artem.spb писал(а): 30 ноя 2020, 18:26 Т.е. запустить цикл while - это вариант, а цикл for - не вариант?
Как спектрометр данные собирает, как отдаёт?

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

Вторая задача - после запуска нескольких измерений (одного за другим) собрать их все, просуммировать и разделить. Вот мой скрин был про вторую часть.
НА моем скрине суммирование и деление идет нормально. НО общая логика построена не правильно:
Прилетает массив данных и там начинает гонятся по циклу и суммироваться сам с собой (столько раз, сколько задали количество измерений). Потом прилетает второй массив и тоже сам с собой (а первый массив пропадает). И так повторяется столько раз, сколько задаем. В итоге на выходе не среднее 10 измерений (к примеру), а среднее послу суммирования последнего одного массива. Вот и не понятно, что я делаю не так.
fizikaman
interested
interested
Сообщения: 8
Зарегистрирован: 07 ноя 2020, 10:07
Версия LabVIEW: 16

Re: Как запустить часть кода определенное количество раз?

Сообщение fizikaman »

Artem.spb писал(а): 30 ноя 2020, 18:26 Т.е. запустить цикл while - это вариант, а цикл for - не вариант?
Как спектрометр данные собирает, как отдаёт?

upd: в цикле вообще что-то странное происходит. Проще верхние массивы разделит на N и прибавить нижние, получится то же самое :)
Спектрометры Avantes. За основу я брал их лабвьюшный код и доделывал до того, что надо мне.
На скрине в кейс структуре показано, откуда берутся данные. Это свои dll библиотеки. Собирается массив по у и массив по х (там еще немного разных домножений и ограничений. это уже от меня) и потом мы объединяем все в один.
Спектрометра два. ПОтому по два массива от каждого объединяем в один и выводим на ху графф. Я вот хотел вставить усреднение где-то между ху графф и кейс структурой.
Вложения
спектрометр.jpg
Artem.spb

Activity Автор
doctor
doctor
Сообщения: 2366
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 12 раз
Поблагодарили: 54 раза
Контактная информация:

Re: Как запустить часть кода определенное количество раз?

Сообщение Artem.spb »

fizikaman писал(а): 01 дек 2020, 09:47 Не не. Первая задача такая - нажать кнопку старт N-ное кол-во раз.
ЗАЧЕМ?
По-моему, это не задача, а кривой метод.
И вот мне кажется, что тут не вариант использовать цикл for (хотя я еще не пробовал).
и в чём проблема зациклить?
b.png
Вторая задача - после запуска нескольких измерений (одного за другим) собрать их все, просуммировать и разделить. Вот мой скрин был про вторую часть.
я показал, как можно усреднить при чтении. Есть всякие MeanPtByPt
НА моем скрине суммирование и деление идет нормально. НО общая логика построена не правильно:
Если "идёт нормально", но "не нормально", то точно нарушена логика в умозаключениях :)
Я опять же говорил, что ваш цикл выглядит так:
А - один массив, В - второй

Цикл N раз
{A = A + В
}
А = A/N

Что то же самое, что
A = A + NB
A = A/N

Или быстрее и короче:
А = A/N + B
fizikaman
interested
interested
Сообщения: 8
Зарегистрирован: 07 ноя 2020, 10:07
Версия LabVIEW: 16

Re: Как запустить часть кода определенное количество раз?

Сообщение fizikaman »

ЗАЧЕМ?
По-моему, это не задача, а кривой метод.
Спектрометр (он синхронизирует себя и лазер, чтобы на спектре не было видно следа лазера. Происходит быстрое включение лазера путем импульса, и после потухания включается спектрометр.) посылает импульс на лазер. На один запуск спектрометра - один импульс на лазер. При таком режиме работы комплекса, сигнал получается слабый и слегка зашумленный. Потому мне надо запустить несколько одинаковых измерений и усреднить это, чтобы шум распределился равномерно.
Как я и сказал, у меня две мысли, как это сделать - генератор внешних импульсов (на него задать только параметры и он сам будет гонять циклы, сколько надо) и программно нажимать кнопку старт, сколько надо.
Кнопка старт у меня выглядит так (смотри скрин).

Если "идёт нормально", но "не нормально", то точно нарушена логика в умозаключениях :)
Там все считается делится нормально. Проблема в том, что все суммирование идет только с одним массивом:
Массив прилетает, я его разделяю на х и у. И он начинает суммироваться сам с собой (кол-во суммирований согласно кол-ву измерений).
Потом идет второе измерение и прилетает массив. Старый теряется, а новый начинает опять летать по циклу и суммироваться сам с собой.
И так повторяется столько раз, сколько задал циклов. Массивы не суммируются друг с другом, а только сами с собой и на выходе я получаю среднее значение из последнего массива.
Мне казалось, что должен прийти массив, он записался в память и ждет следующего массива, происходит сумма и ждут третий массив и так далее.
Вложения
старт.png
Artem.spb

Activity Автор
doctor
doctor
Сообщения: 2366
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 12 раз
Поблагодарили: 54 раза
Контактная информация:

Re: Как запустить часть кода определенное количество раз?

Сообщение Artem.spb »

fizikaman писал(а): 02 дек 2020, 11:24 Потому мне надо запустить несколько одинаковых измерений и усреднить это, чтобы шум распределился равномерно.
Наивно полагать, что программная синхронизация будет работать лучше аппаратной.

Там все считается делится нормально. Проблема в том, что все суммирование идет только с одним массивом:
Для особо настойчивых повторяю (последний раз): если "у меня всё сделано правильно, но считает почему-то не правильно", то это всего лишь значит, что сделано НЕ правильно.
Как усреднять прилетающие данные я уже показывал.
fizikaman
interested
interested
Сообщения: 8
Зарегистрирован: 07 ноя 2020, 10:07
Версия LabVIEW: 16

Re: Как запустить часть кода определенное количество раз?

Сообщение fizikaman »

Наивно полагать, что программная синхронизация будет работать лучше аппаратной.
В общем, я попробовал кнопку старт просто поместить в цикл for. В целом - получилось. Лазер загорается столько раз, сколько включается спектрометр. По сути это повторение нажатия кнопки старт.
Но появилась другая проблема - почему-то пропал сигнал. Точнее шум остался, а полезный сигнал от люминофора пропал.
Может рассинхрон. Надо разбираться. :think:
fizikaman
interested
interested
Сообщения: 8
Зарегистрирован: 07 ноя 2020, 10:07
Версия LabVIEW: 16

Re: Как запустить часть кода определенное количество раз?

Сообщение fizikaman »

Как усреднять прилетающие данные я уже показывал.
Честно говоря, я не совсем понимаю ваш скрин. Не могли вы дать комментарии к нему?
Artem.spb

Activity Автор
doctor
doctor
Сообщения: 2366
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 12 раз
Поблагодарили: 54 раза
Контактная информация:

Re: Как запустить часть кода определенное количество раз?

Сообщение Artem.spb »

Массив заполняется приходящими значениями. Как только заполнили - усреднить.
Размер массива задаётся на старте.
Индекс элемента зависит от шага цикла.
Ответить

Вернуться в «Общие»