2012-03-14 5 views
0

У меня есть vi с двумя бесконечными циклами. Левый цикл непрерывно считывает данные с устройства и разбивает его, правый цикл вызывает пользовательскую DLL и использует вывод для управления другим устройством. Блоки вызовов DLL около секунды, поэтому две петли не синхронизируются *. Теперь я хотел бы использовать мгновенное значение из первого цикла в качестве входа в DLL во втором. Я попытался просто подключить их - LabVIEW вставляет терминалы на границах цикла, но затем второй цикл не запускается. (Если это имеет значение, тип данных - «динамические данные» - измерение напряжения). Как мне это сделать?LabView: значение передачи между циклами

(* На самом деле, изначально был только один цикл, и график только был обновлен между DLL вызовов, который не был удовлетворительным.)

ответ

5

Это стандартное поведение, так как первый цикл не закончил данные на выходном затворе недоступны для запуска следующего цикла.

Самый быстрый способ получить данные из одной петли, используя локальную переменную:

  1. Создать индикатор для данных
  2. правой кнопкой мыши терминал индикатора и выберите «Создать \ локальную переменную '
  3. Переместите локальную переменную в правой петле
  4. Возможно, вам нужно изменить цикл от записи на чтение (с помощью контекстного меню)

Существует несколько других способов распространения ваших данных, и местные жители могут работать на данный момент, но вам нужно будет двигаться дальше, если вы масштабируетесь до более крупных приложений. Другие варианты - это очереди (без потерь или без потерь) или уведомитель или глобальные переменные, и если вы продвигаетесь в LabVIEW, вы придумаете свои собственные схемы.

+0

Спасибо, локальные переменные решили мою проблему. У меня был элемент управления в левом цикле, который все равно показывал мое значение, и я добавил переменную, связанную с этим, в другой цикл.(Для заднепроходности: пришлось изменить его на «чтение» из контекстного меню.) Одна маленькая вещь: я думаю, причина, по которой второй цикл не выполнялся, была не в том, что он ждал, когда первый закончен - в конце концов, оба циклы бесконечны - но у него не было ни одного входного узла. – jdm

+1

Я уверен, что вторая петля ждет первого завершения. Вы можете использовать «Execution Highlight» для просмотра кода в slow-mo. –

5

Что вы ищете - это цикл «Продюсер потребителей».

Существует шаблон, который поставляется с LabVIEW (Файл >> Новый ... >> VI >> Из шаблона >> Шаблоны проектирования), это хорошая отправная точка.

Кроме того, подробнее здесь:

http://zone.ni.com/devzone/cda/tut/p/id/3023

http://zone.ni.com/wv/app/doc/p/id/wv-1295

PS - причина, по которой второй цикл не запускается из-за концепции под названием "Data Flow". Узел (ваш второй цикл) не может работать до тех пор, пока все его входы не будут получены, включая данные из первого цикла. Узел (первый цикл) не выводит ничего из него, пока он не завершит выполнение, т. Е. До окончания цикла.

По существу, ваш второй цикл не будет работать до тех пор, пока первый цикл не будет запущен и закончен.

+0

Спасибо за ссылки, но я думаю, что это не то, что я ищу. Я не хочу ставить в очередь выходные значения, но я хочу, чтобы оба цикла выполняли каждый с их собственной скоростью, параллельно, а второй пример цикла - текущее значение из узла в первом. Это прекрасно, если некоторые значения, полученные в первом цикле, пропускаются. – jdm

+0

Вы хотите, чтобы второй цикл запускал * только * после того, как первый цикл выдал какое-то значение? Или вы хотите, чтобы второй цикл работал, даже если первый цикл еще не закончился (и выводит значение)? –

0

На самом деле вам может не понравиться этот дополнительный индикатор на передней панели, только чтобы использовать его значение через локальные переменные. Затем вы можете использовать глобальную переменную. Вы можете найти его в разделе «Структуры». Это создает новый ВП, где вы можете отбрасывать различные индикаторы или элементы управления только для записи и чтения данных в/из них. Вы можете перенести эту глобальную переменную VI на свою блок-диаграмму для доступа к данным. Затем вы можете использовать одну и ту же глобальную переменную VI и ее значения в других ВП, если это необходимо.

Смежные вопросы