Советы по программированию на LabVIEW

Простейшие вопросы в области инженерной разработки
Аватара пользователя
Select
developer
developer
Сообщения: 281
Зарегистрирован: 12 дек 2017, 23:56
Версия LabVIEW: 18
Откуда: Врата надежды.
Поблагодарили: 2 раза

Re: Советы по программированию на LabVIEW

Сообщение Select »

Да, есть такой и по сей день не решаемый под tab control баг с вставленнми там элементами.
Универасльного решения с ним нет, у меня в проекте есть tab control с более чем 150 элементами.
Если в свойствах проекта Вы зафиксировали размер фронтальной панели, и при этом в режиме правки изменили ее, то именно все эти элементы поплывут. Исправить можно закрыв проект без сохранения и заново открыть, при этом в свойствах отменить фиксированной размер по нолям, в таком случае ничего в режиме отладки не поплывет и можно разворачивать панель. Группировать и блокировать так же не вариант, переходы между вкладками подвешивают весь процесс переходов. В общем изрядно наигравшись другими вариантами из примеров, представления, пришлось откатить все в tab control с соблюдение выше изложенного.
LabView 14,18
rsv
advanced
advanced
Сообщения: 176
Зарегистрирован: 18 июл 2019, 13:53
Версия LabVIEW: 2020
Откуда: Россия, Ижевск
Благодарил (а): 34 раза
Контактная информация:

Re: Советы по программированию на LabVIEW

Сообщение rsv »

Доброго времени суток.
Вопрос по управлению параллельными циклами.
1. Цикл №1 отвечает за контроль соединения - считывает системное время устройства максимально часто. Если устройство не отвечает, считает количество ошибок и при достижении некоторого значения сбрасывает флаг "Есть соединение";
2. Цикл №2 (конечный автомат) отвечает за всё остальное - вывод данных с устройства и визуализация, обработка событий интерфейса.
Обмен данными между циклами получился двусторонний - из 1-го цикла во 2-ой передаётся только флаг "Есть соединение", а из 2-го в 1-ый - нажатие кнопки "Останов".
Сначала реализовал на Shared Variables, но нестабильно работает. Сейчас планирую сделать флаг "Есть соединение" глобальной переменной, т.к. этот флаг надо считывать в ВПП (вложенность до 4-го уровня получилась), а обмен данными с помощю Channel Wires, но получается состояние гонки.

Какую технологию (Channel Wires, Notifier, Occurence и т.д.) лучше использовать для обмена данными между циклами? Или разобраться с Shared Variables?
Спасибо.
Artem.spb

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

Re: Советы по программированию на LabVIEW

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

rsv писал(а): 25 сен 2023, 14:37 Какую технологию (Channel Wires, Notifier, Occurence и т.д.) лучше использовать для обмена данными между циклами? Или разобраться с Shared Variables?
Спасибо.
Зависит от того, как у вас устроены эти циклы.
State машина может быть и через очереди, и сама по себе.
Самое логичное встраиваться в существующий механизм. Если там уже есть очередь, добавить в неё новый вариант.
Если ничего такого нет, то глобальная переменная - вполне рабочий вариант, но надо проверять регулярно. Notification тоже подойдут, если вписываются в вашу концепцию.
Использовать SV для внутреннего взаимодействия - расточительство какое-то.
rsv
advanced
advanced
Сообщения: 176
Зарегистрирован: 18 июл 2019, 13:53
Версия LabVIEW: 2020
Откуда: Россия, Ижевск
Благодарил (а): 34 раза
Контактная информация:

Re: Советы по программированию на LabVIEW

Сообщение rsv »

Написал тестовую прогу на которой пытаюсь отладить управление параллельными циклами. Типы циклов (и машина состояний), глобальная переменная "Есть соединение?" и Channel Wires как в основной проге. Индикатор Report - только для отладки в тестовой программе.
Пока есть соединение производится опрос устройства. При нарушении соединения с устройством цикл №1 должен сбросить флаг и выдать пользователю сообщение. Опрос устройства прекращается, но программа продолжает работу. Но цикл №2 всё равно успевает опросить устройство уже при отсутствии соединения и возникает ошибка.
Что я неправильно сделал?
Main.PNG
ParallelLoops.7z
(49.61 КБ) 51 скачивание
Artem.spb

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

Re: Советы по программированию на LabVIEW

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

rsv писал(а): 26 сен 2023, 10:58 Что я неправильно сделал?
Работу с железом в двух разных циклах.

Зачем два? Есть цикл опроса, в нём должны быть всё чтение и все проверки.
Второй - для интерфейса и прочих дел. Или ещё два: интерфейс и общий для алгоритма и всех вычислений.
rsv
advanced
advanced
Сообщения: 176
Зарегистрирован: 18 июл 2019, 13:53
Версия LabVIEW: 2020
Откуда: Россия, Ижевск
Благодарил (а): 34 раза
Контактная информация:

Re: Советы по программированию на LabVIEW

Сообщение rsv »

Artem.spb писал(а): 26 сен 2023, 14:00
rsv писал(а): 26 сен 2023, 10:58 Что я неправильно сделал?
Работу с железом в двух разных циклах.

Зачем два? Есть цикл опроса, в нём должны быть всё чтение и все проверки.
Второй - для интерфейса и прочих дел. Или ещё два: интерфейс и общий для алгоритма и всех вычислений.
Что-то я совсем запутался...
В реальной программе у меня много кнопок, которые вызывают ВПП, отвечающие за визуализацию определённого набора данных. Например, одна кнопка для визуализации аналогов, другая для работы с дискртетами и т.д. А ещё есть модули разных настроек, которые читают и записывают данные в устройство.
Обработка нажатий этих кнопок и контроль соединения в одном цикле делать? То есть вообще 2-ой цикл не нужен получается?
Artem.spb

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

Re: Советы по программированию на LabVIEW

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

rsv писал(а): 26 сен 2023, 15:58 Обработка нажатий этих кнопок и контроль соединения в одном цикле делать? То есть вообще 2-ой цикл не нужен получается?
Нет, конечно, всё наоборот. Чем больше, тем лучше.
1) типа main, который все ЦУ раздаёт.
2) цикл с event structure, можно тут и данные отображать (пересылать через user event)
3) опрос прибора.
4,5,6...) запись в файл; другие приборы, если они разнородные; ну и много чего ещё можно придумать.

Всё это для устранения узких мест, но без фанатизма.
Например, вычисления могут иногда много времени занимать, пока они идут, параллельный цикл спокойно читает с прибора новые значения и в памяти их копит.
Накопили большой кусок для записи в файл, отправили, пока оно там пишет, можно спокойно другими делами заниматься без снижения скорости
rsv
advanced
advanced
Сообщения: 176
Зарегистрирован: 18 июл 2019, 13:53
Версия LabVIEW: 2020
Откуда: Россия, Ижевск
Благодарил (а): 34 раза
Контактная информация:

Re: Советы по программированию на LabVIEW

Сообщение rsv »

Artem.spb писал(а): 26 сен 2023, 16:48 Всё это для устранения узких мест, но без фанатизма.
Например, вычисления могут иногда много времени занимать, пока они идут, параллельный цикл спокойно читает с прибора новые значения и в памяти их копит.
Накопили большой кусок для записи в файл, отправили, пока оно там пишет, можно спокойно другими делами заниматься без снижения скорости
Это я всё понимаю и согласен. Непонятно, как это реализовать (опрос времени для контроля соединения и прочие опросы устройства) в рамках моей концепции.

Идея была в следующем:
Нужен глобальный флаг показывающий наличие соединения с устройством, видимый пользователю и доступный всем ВПП проекта. За флаг отвечает цикл №1 в главном ВП, который работает всегда.
Вызов ВПП (event structure), реализующих основной функционал, сделан в цикле №2. Если флаг есть - кнопочки доступны. При открытии модулей начинается опрос соответствующих регистров устройства, при этом постоянно контролируется наличие флага. Визуализация считанных данных тоже реализована в ВПП, а не в главном модуле. Если флага нет - доступна только установка нового соединения.
Проблема возникла в передаче флага из главного ВП в ВПП, вызываемых из цикла №2.
В моём случае для реализации идеи "опрос прибора в одном цикле" надо совместить в одном цикле главной формы контроль флага и все прочие опросы прибора, которые начинают выполняться только при открытии соответствующего ВПП. Как это сделать, я не представляю. Буду рад, если подскажете.
Или у меня концепция неправильная?
Аватара пользователя
ladik

Silver
developer
developer
Сообщения: 276
Зарегистрирован: 18 ноя 2014, 11:45
Награды: 1
Версия LabVIEW: 2015, 2019
Откуда: Екатеринбург
Благодарил (а): 4 раза
Поблагодарили: 3 раза
Контактная информация:

Re: Советы по программированию на LabVIEW

Сообщение ladik »

Глобальный флаг удобно делать через Functional Global Variable тык и тык
Дорогу осилит идущий.
Artem.spb

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

Re: Советы по программированию на LabVIEW

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

rsv писал(а): 27 сен 2023, 16:29 В моём случае для реализации идеи "опрос прибора в одном цикле" надо совместить в одном цикле главной формы контроль флага и все прочие опросы прибора, которые начинают выполняться только при открытии соответствующего ВПП. Как это сделать, я не представляю. Буду рад, если подскажете.
Ну так именно это и нужно делать - всё взаимодействие с прибором в одном цикле.
Более того, инициализацию туда же, а не вне.
Будет три (минимум) состояния

- инициализация. облом - остались тут, тогда ваша система будет позволять пользователю подключит железки без перезагрузки. Если успешно - пошли дальше + сообщили во второй цикл (хоть глобальная переменная, хоть очередь). Я бы на этом этапе вашу машину состояний переделал в QMH, чтобы другие циклы тоже могли что-то пересылать.

- проверка статуса. Периодически дёргать регистр 62. Если облом - вернуться. Если норм - остались. И снова, при смене статуса - оповестить второй цикл.

- пришёл запрос на чтение - начали чтение. Прочитали - остались тут + перекинули данные во второй. Облом - оповестили второй + перешли в начальное состояние.
rsv
advanced
advanced
Сообщения: 176
Зарегистрирован: 18 июл 2019, 13:53
Версия LabVIEW: 2020
Откуда: Россия, Ижевск
Благодарил (а): 34 раза
Контактная информация:

Re: Советы по программированию на LabVIEW

Сообщение rsv »

Artem.spb писал(а): 28 сен 2023, 00:56 Если успешно - пошли дальше + сообщили во второй цикл (хоть глобальная переменная, хоть очередь).
. . .

И снова, при смене статуса - оповестить второй цикл.
Вот это мне и непонятно - как именно реализовать сообщения между циклами. Раз советуете использовать QMH, то попробую в обоих циклах эту технологию использовать.
Artem.spb

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

Re: Советы по программированию на LabVIEW

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

rsv писал(а): 28 сен 2023, 08:22 Вот это мне и непонятно - как именно реализовать сообщения между циклами.
Очередь.
QMH (queue) на это как бы однозначно намекает.
Bigtoy
interested
interested
Сообщения: 1
Зарегистрирован: 29 сен 2023, 21:09
Версия LabVIEW: 21
Контактная информация:

Re: Советы по программированию на LabVIEW

Сообщение Bigtoy »

Ребят, всем привет. Имеется программа, которая может работать на двух пк, то есть на одном запускаем, синхронизируем и можно перейти на второй, подгрузить результаты. Я немного изменил программку, добавил еще значение, чтобы перерасчет был. Так вот , этот параметр, добавленный мной, все на одном пк работает, а при синхронизации этот параметр не отсылается на второй пк и там, следовательно, не правильно считается формула. Подскажите, как мне отправить этот параметр также на второй пк. В SQL не особо селен. Но, как я понял, в ней реализована передача через SQL.
rsv
advanced
advanced
Сообщения: 176
Зарегистрирован: 18 июл 2019, 13:53
Версия LabVIEW: 2020
Откуда: Россия, Ижевск
Благодарил (а): 34 раза
Контактная информация:

Re: Советы по программированию на LabVIEW

Сообщение rsv »

Доброго времени суток.
В интерефейсе пользователя есть элемент типа ENum (TypeDef) в котором пользователь выбирает нужную команду.
В другом модуле по коду, считанному из одного места :), надо получить значение поля Items из ENum.
У меня это получилось только через создание индикатора и переменной к нему. В данном модуле нет видимого интерфейса и создание индикатора с переменной выглядит излишним.
Есть какие-нибудь более оптимальные способы решить эту задачу?

ENum_Name.JPG
ENum_Name.vi
(8.71 КБ) 9 скачиваний
Аватара пользователя
jane_wild

Gold
master
master
Сообщения: 486
Зарегистрирован: 30 июн 2016, 02:11
Награды: 1
Версия LabVIEW: 2020
Благодарил (а): 94 раза
Поблагодарили: 16 раз
Контактная информация:

Re: Советы по программированию на LabVIEW

Сообщение jane_wild »

Так если это enum, так и отдавайте команды enum-ом, а не числовой константой
image_2024-07-25_075748157.png
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Для чайников»