Возникли проблемы с работой моего VI как Sub VI - PullRequest
0 голосов
/ 17 апреля 2019

У меня проблемы с тем, чтобы терминалы передавали какие-либо данные тому, к чему они подключены, потому что элементы управления, к которым они подключаются, находятся в цикле while. Мой уровень разочарования высок, так как я бы уже сделал это, если бы написал это на C.

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

Мой ВП основан на обработчике сообщений в очереди в разделе Шаблоны создания нового ВП. У меня есть 2 вещи, которые должны иметь место. Первый - я создал TCP-клиент, которому я постоянно отправляю сообщения, чтобы получить статус от оборудования, с которым я общаюсь. Это временное событие, и оно должно обрабатываться в цикле while, чтобы я мог поддерживать соединение с сервером. Я не делаю обработку сообщений типа «Открыть», «Отправить», «Закрыть», «Открыть заново», «Отправить», «Закрыть» и т. Д. Слишком неэффективно. Это нижняя половина примера шаблона.

Второй - Иногда пользователь нажимает кнопку на передней панели, которая создает сообщение, которое отправляется на оборудование, чтобы заставить его что-то делать. И это, казалось бы, тоже должно быть в цикле, отсюда и моя проблема. Некоторые / большинство элементов управления существуют в структуре событий. Это верхняя половина примера шаблона.

На самом деле у меня это работает как передняя панель, но все в одном цикле, и я не могу заставить терминалы работать. Вот тут-то и возникает моя путаница: если я передаю что-то в цикл while, я получаю его значение только один раз, и если оно меняется, вы не получаете это изменение, а если вы передаете данные из цикла while, вы получите его только когда цикл закончится. Эти две вещи действительно сбивают меня с толку. Как можно передавать данные, которые изменяются при использовании цикла while, потому что я должен, но цикл while прерывается с помощью терминалов. Кажется круговой Связь по TCP не может остановиться, и я не могу найти пример того, как это сделать, используя моего друга Google. Я единственный человек на этой планете, который должен сделать это? Сомневаюсь.

Не собираюсь показывать мой код, так как это не проблема кода. Это понимание того, как LabView работает, а не просто как написать код на C, используя какую-то библиотеку. А также просто незнаком со всеми вещами, которые вы можете делать в LabView, не говоря уже о том, как все по-другому. Я не знаю, чего не знаю, но я могу научиться.

Я хочу иметь возможность передать созданный мной ВП любому пользователю и позволить ему использовать его для управления моим оборудованием. Если они просто хотят запустить его как лицевую панель, или если они хотят использовать его как Sub VI, это тоже нормально. Мне просто нужно, чтобы терминалы действительно передавали данные при таком использовании.

Спасибо, я сегодня заказал книгу на LabView, но скоро не получу. Мне действительно нужно уложить эту проблему в постель.

Ответы [ 2 ]

1 голос
/ 17 апреля 2019

Ничего не поделаешь, не увидев код.Но я могу попытаться дать вам небольшое представление о том, что происходит.

Поток данных - это важная концепция, которую нужно понять в LabVIEW.элементы (ВП, петли и т. д.) не запустятся до тех пор, пока все их входы (т. е. клеммы) не будут получены или установлены чем-то, что вызывалось ранее, и затем они будут принимать свои входы только один раз.Если ваш терминал находится за пределами цикла, то цикл может считывать только его начальное значение.(См. «Бесконечные циклы» на этой странице ).Простой способ решения этой проблемы - поместить терминал внутри цикла, а не снаружи, поэтому он будет считываться на каждой итерации цикла.

Что касается передачи значений за пределы цикла, существуетколичество методов для этого.Опять же, из-за потока данных вы обычно не сможете получить доступ к значению чего-либо внутри цикла, пока цикл не завершится.Однако есть несколько способов прочитать эти значения в другом цикле.Локальные или глобальные переменные будут самым простым способом, но они не рекомендуются NI.Правильный способ справиться с этим - использовать что-то на поддоне синхронизации.Дополнительную информацию об этих опциях можно найти здесь .

Если вы что-то основываете на обработчике сообщений в очереди, то очередь может быть хорошим способом для начала.LabVIEW имеет встроенные примеры кода, чтобы показать вам, как использовать эти функции.

Синхронизация цикла и асинхронное программирование являются фундаментальными концепциями для написания кода LabVIEW.Если это не те концепции, с которыми вы знакомы, я бы сказал, что вы многому научитесь, демонстрируя другим свой действительный код и помогая людям решать эти проблемы.Если вы хотите поделиться чем-то частным, попробуйте сделать простой пример и опубликовать этот код, чтобы лучше понять концепции.

0 голосов
/ 19 апреля 2019

Структура событий, реагирующая на evr8 и функциональный глобал для передачи данных.

Предложить блок-схему вставки.

...