Советы по программированию на LabVIEW
- Select
- developer
- Сообщения: 281
- Зарегистрирован: 12 дек 2017, 23:56
- Версия LabVIEW: 18
- Откуда: Врата надежды.
- Поблагодарили: 2 раза
Re: Советы по программированию на LabVIEW
Да, есть такой и по сей день не решаемый под tab control баг с вставленнми там элементами.
Универасльного решения с ним нет, у меня в проекте есть tab control с более чем 150 элементами.
Если в свойствах проекта Вы зафиксировали размер фронтальной панели, и при этом в режиме правки изменили ее, то именно все эти элементы поплывут. Исправить можно закрыв проект без сохранения и заново открыть, при этом в свойствах отменить фиксированной размер по нолям, в таком случае ничего в режиме отладки не поплывет и можно разворачивать панель. Группировать и блокировать так же не вариант, переходы между вкладками подвешивают весь процесс переходов. В общем изрядно наигравшись другими вариантами из примеров, представления, пришлось откатить все в tab control с соблюдение выше изложенного.
Универасльного решения с ним нет, у меня в проекте есть tab control с более чем 150 элементами.
Если в свойствах проекта Вы зафиксировали размер фронтальной панели, и при этом в режиме правки изменили ее, то именно все эти элементы поплывут. Исправить можно закрыв проект без сохранения и заново открыть, при этом в свойствах отменить фиксированной размер по нолям, в таком случае ничего в режиме отладки не поплывет и можно разворачивать панель. Группировать и блокировать так же не вариант, переходы между вкладками подвешивают весь процесс переходов. В общем изрядно наигравшись другими вариантами из примеров, представления, пришлось откатить все в tab control с соблюдение выше изложенного.
LabView 14,18
-
- advanced
- Сообщения: 176
- Зарегистрирован: 18 июл 2019, 13:53
- Версия LabVIEW: 2020
- Откуда: Россия, Ижевск
- Благодарил (а): 34 раза
- Контактная информация:
Re: Советы по программированию на LabVIEW
Доброго времени суток.
Вопрос по управлению параллельными циклами.
1. Цикл №1 отвечает за контроль соединения - считывает системное время устройства максимально часто. Если устройство не отвечает, считает количество ошибок и при достижении некоторого значения сбрасывает флаг "Есть соединение";
2. Цикл №2 (конечный автомат) отвечает за всё остальное - вывод данных с устройства и визуализация, обработка событий интерфейса.
Обмен данными между циклами получился двусторонний - из 1-го цикла во 2-ой передаётся только флаг "Есть соединение", а из 2-го в 1-ый - нажатие кнопки "Останов".
Сначала реализовал на Shared Variables, но нестабильно работает. Сейчас планирую сделать флаг "Есть соединение" глобальной переменной, т.к. этот флаг надо считывать в ВПП (вложенность до 4-го уровня получилась), а обмен данными с помощю Channel Wires, но получается состояние гонки.
Какую технологию (Channel Wires, Notifier, Occurence и т.д.) лучше использовать для обмена данными между циклами? Или разобраться с Shared Variables?
Спасибо.
Вопрос по управлению параллельными циклами.
1. Цикл №1 отвечает за контроль соединения - считывает системное время устройства максимально часто. Если устройство не отвечает, считает количество ошибок и при достижении некоторого значения сбрасывает флаг "Есть соединение";
2. Цикл №2 (конечный автомат) отвечает за всё остальное - вывод данных с устройства и визуализация, обработка событий интерфейса.
Обмен данными между циклами получился двусторонний - из 1-го цикла во 2-ой передаётся только флаг "Есть соединение", а из 2-го в 1-ый - нажатие кнопки "Останов".
Сначала реализовал на Shared Variables, но нестабильно работает. Сейчас планирую сделать флаг "Есть соединение" глобальной переменной, т.к. этот флаг надо считывать в ВПП (вложенность до 4-го уровня получилась), а обмен данными с помощю Channel Wires, но получается состояние гонки.
Какую технологию (Channel Wires, Notifier, Occurence и т.д.) лучше использовать для обмена данными между циклами? Или разобраться с Shared Variables?
Спасибо.
-
- professor
- Сообщения: 3498
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 54 раза
- Поблагодарили: 185 раз
- Контактная информация:
Re: Советы по программированию на LabVIEW
Зависит от того, как у вас устроены эти циклы.
State машина может быть и через очереди, и сама по себе.
Самое логичное встраиваться в существующий механизм. Если там уже есть очередь, добавить в неё новый вариант.
Если ничего такого нет, то глобальная переменная - вполне рабочий вариант, но надо проверять регулярно. Notification тоже подойдут, если вписываются в вашу концепцию.
Использовать SV для внутреннего взаимодействия - расточительство какое-то.
-
- advanced
- Сообщения: 176
- Зарегистрирован: 18 июл 2019, 13:53
- Версия LabVIEW: 2020
- Откуда: Россия, Ижевск
- Благодарил (а): 34 раза
- Контактная информация:
Re: Советы по программированию на LabVIEW
Написал тестовую прогу на которой пытаюсь отладить управление параллельными циклами. Типы циклов (и машина состояний), глобальная переменная "Есть соединение?" и Channel Wires как в основной проге. Индикатор Report - только для отладки в тестовой программе.
Пока есть соединение производится опрос устройства. При нарушении соединения с устройством цикл №1 должен сбросить флаг и выдать пользователю сообщение. Опрос устройства прекращается, но программа продолжает работу. Но цикл №2 всё равно успевает опросить устройство уже при отсутствии соединения и возникает ошибка.
Что я неправильно сделал?
Пока есть соединение производится опрос устройства. При нарушении соединения с устройством цикл №1 должен сбросить флаг и выдать пользователю сообщение. Опрос устройства прекращается, но программа продолжает работу. Но цикл №2 всё равно успевает опросить устройство уже при отсутствии соединения и возникает ошибка.
Что я неправильно сделал?
-
- professor
- Сообщения: 3498
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 54 раза
- Поблагодарили: 185 раз
- Контактная информация:
Re: Советы по программированию на LabVIEW
Работу с железом в двух разных циклах.
Зачем два? Есть цикл опроса, в нём должны быть всё чтение и все проверки.
Второй - для интерфейса и прочих дел. Или ещё два: интерфейс и общий для алгоритма и всех вычислений.
-
- advanced
- Сообщения: 176
- Зарегистрирован: 18 июл 2019, 13:53
- Версия LabVIEW: 2020
- Откуда: Россия, Ижевск
- Благодарил (а): 34 раза
- Контактная информация:
Re: Советы по программированию на LabVIEW
Что-то я совсем запутался...
В реальной программе у меня много кнопок, которые вызывают ВПП, отвечающие за визуализацию определённого набора данных. Например, одна кнопка для визуализации аналогов, другая для работы с дискртетами и т.д. А ещё есть модули разных настроек, которые читают и записывают данные в устройство.
Обработка нажатий этих кнопок и контроль соединения в одном цикле делать? То есть вообще 2-ой цикл не нужен получается?
-
- professor
- Сообщения: 3498
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 54 раза
- Поблагодарили: 185 раз
- Контактная информация:
Re: Советы по программированию на LabVIEW
Нет, конечно, всё наоборот. Чем больше, тем лучше.
1) типа main, который все ЦУ раздаёт.
2) цикл с event structure, можно тут и данные отображать (пересылать через user event)
3) опрос прибора.
4,5,6...) запись в файл; другие приборы, если они разнородные; ну и много чего ещё можно придумать.
Всё это для устранения узких мест, но без фанатизма.
Например, вычисления могут иногда много времени занимать, пока они идут, параллельный цикл спокойно читает с прибора новые значения и в памяти их копит.
Накопили большой кусок для записи в файл, отправили, пока оно там пишет, можно спокойно другими делами заниматься без снижения скорости
-
- advanced
- Сообщения: 176
- Зарегистрирован: 18 июл 2019, 13:53
- Версия LabVIEW: 2020
- Откуда: Россия, Ижевск
- Благодарил (а): 34 раза
- Контактная информация:
Re: Советы по программированию на LabVIEW
Это я всё понимаю и согласен. Непонятно, как это реализовать (опрос времени для контроля соединения и прочие опросы устройства) в рамках моей концепции.Artem.spb писал(а): ↑26 сен 2023, 16:48 Всё это для устранения узких мест, но без фанатизма.
Например, вычисления могут иногда много времени занимать, пока они идут, параллельный цикл спокойно читает с прибора новые значения и в памяти их копит.
Накопили большой кусок для записи в файл, отправили, пока оно там пишет, можно спокойно другими делами заниматься без снижения скорости
Идея была в следующем:
Нужен глобальный флаг показывающий наличие соединения с устройством, видимый пользователю и доступный всем ВПП проекта. За флаг отвечает цикл №1 в главном ВП, который работает всегда.
Вызов ВПП (event structure), реализующих основной функционал, сделан в цикле №2. Если флаг есть - кнопочки доступны. При открытии модулей начинается опрос соответствующих регистров устройства, при этом постоянно контролируется наличие флага. Визуализация считанных данных тоже реализована в ВПП, а не в главном модуле. Если флага нет - доступна только установка нового соединения.
Проблема возникла в передаче флага из главного ВП в ВПП, вызываемых из цикла №2.
В моём случае для реализации идеи "опрос прибора в одном цикле" надо совместить в одном цикле главной формы контроль флага и все прочие опросы прибора, которые начинают выполняться только при открытии соответствующего ВПП. Как это сделать, я не представляю. Буду рад, если подскажете.
Или у меня концепция неправильная?
-
ladik
- developer
- Сообщения: 276
- Зарегистрирован: 18 ноя 2014, 11:45
- Награды: 1
- Версия LabVIEW: 2015, 2019
- Откуда: Екатеринбург
- Благодарил (а): 4 раза
- Поблагодарили: 3 раза
- Контактная информация:
-
- professor
- Сообщения: 3498
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 54 раза
- Поблагодарили: 185 раз
- Контактная информация:
Re: Советы по программированию на LabVIEW
Ну так именно это и нужно делать - всё взаимодействие с прибором в одном цикле.rsv писал(а): ↑27 сен 2023, 16:29 В моём случае для реализации идеи "опрос прибора в одном цикле" надо совместить в одном цикле главной формы контроль флага и все прочие опросы прибора, которые начинают выполняться только при открытии соответствующего ВПП. Как это сделать, я не представляю. Буду рад, если подскажете.
Более того, инициализацию туда же, а не вне.
Будет три (минимум) состояния
- инициализация. облом - остались тут, тогда ваша система будет позволять пользователю подключит железки без перезагрузки. Если успешно - пошли дальше + сообщили во второй цикл (хоть глобальная переменная, хоть очередь). Я бы на этом этапе вашу машину состояний переделал в QMH, чтобы другие циклы тоже могли что-то пересылать.
- проверка статуса. Периодически дёргать регистр 62. Если облом - вернуться. Если норм - остались. И снова, при смене статуса - оповестить второй цикл.
- пришёл запрос на чтение - начали чтение. Прочитали - остались тут + перекинули данные во второй. Облом - оповестили второй + перешли в начальное состояние.
-
- advanced
- Сообщения: 176
- Зарегистрирован: 18 июл 2019, 13:53
- Версия LabVIEW: 2020
- Откуда: Россия, Ижевск
- Благодарил (а): 34 раза
- Контактная информация:
Re: Советы по программированию на LabVIEW
Вот это мне и непонятно - как именно реализовать сообщения между циклами. Раз советуете использовать QMH, то попробую в обоих циклах эту технологию использовать.
-
- professor
- Сообщения: 3498
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 54 раза
- Поблагодарили: 185 раз
- Контактная информация:
-
- interested
- Сообщения: 1
- Зарегистрирован: 29 сен 2023, 21:09
- Версия LabVIEW: 21
- Контактная информация:
Re: Советы по программированию на LabVIEW
Ребят, всем привет. Имеется программа, которая может работать на двух пк, то есть на одном запускаем, синхронизируем и можно перейти на второй, подгрузить результаты. Я немного изменил программку, добавил еще значение, чтобы перерасчет был. Так вот , этот параметр, добавленный мной, все на одном пк работает, а при синхронизации этот параметр не отсылается на второй пк и там, следовательно, не правильно считается формула. Подскажите, как мне отправить этот параметр также на второй пк. В SQL не особо селен. Но, как я понял, в ней реализована передача через SQL.
-
- advanced
- Сообщения: 176
- Зарегистрирован: 18 июл 2019, 13:53
- Версия LabVIEW: 2020
- Откуда: Россия, Ижевск
- Благодарил (а): 34 раза
- Контактная информация:
Re: Советы по программированию на LabVIEW
Доброго времени суток.
В интерефейсе пользователя есть элемент типа ENum (TypeDef) в котором пользователь выбирает нужную команду.
В другом модуле по коду, считанному из одного места , надо получить значение поля Items из ENum.
У меня это получилось только через создание индикатора и переменной к нему. В данном модуле нет видимого интерфейса и создание индикатора с переменной выглядит излишним.
Есть какие-нибудь более оптимальные способы решить эту задачу?
В интерефейсе пользователя есть элемент типа ENum (TypeDef) в котором пользователь выбирает нужную команду.
В другом модуле по коду, считанному из одного места , надо получить значение поля Items из ENum.
У меня это получилось только через создание индикатора и переменной к нему. В данном модуле нет видимого интерфейса и создание индикатора с переменной выглядит излишним.
Есть какие-нибудь более оптимальные способы решить эту задачу?
-
jane_wild
- master
- Сообщения: 487
- Зарегистрирован: 30 июн 2016, 02:11
- Награды: 1
- Версия LabVIEW: 2020
- Благодарил (а): 94 раза
- Поблагодарили: 16 раз
- Контактная информация:
Re: Советы по программированию на LabVIEW
Так если это enum, так и отдавайте команды enum-ом, а не числовой константой
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение