Запрос данных из параллельного потока

Общие принципы, проектирование, модуляризация, темплейты и шаблоны
Ответить
Аватара пользователя
Eugen Graf

Activity Professionalism Silver Black
guru
guru
Сообщения: 6502
Зарегистрирован: 13 ноя 2007, 02:20
Награды: 4
Версия LabVIEW: 2009
Откуда: Saarbrücken
Контактная информация:

Запрос данных из параллельного потока

Сообщение Eugen Graf »

В этом уроке я покажу вам, как спрограммировать запрос данных из параллельного потока/цикла. Для начала вам надо прочитать и понять вот этот урок:
/viewtopic.php?f=23&t=153

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

Если вы зададитесь вопросом где это применять, то отвечу вам:
такая конструкция применяется если вы например пишите программу визуализации данных какого либо реального прибора. При этом верхний цикл отвечает за лицевую панель программы, а нижний цикл за коммуникацию с реальным прибором.
Аватара пользователя
Eugen Graf

Activity Professionalism Silver Black
guru
guru
Сообщения: 6502
Зарегистрирован: 13 ноя 2007, 02:20
Награды: 4
Версия LabVIEW: 2009
Откуда: Saarbrücken
Контактная информация:

Re: Запрос данных из параллельного потока

Сообщение Eugen Graf »

Для начала создаём два цикла, в верхнем располагаем ивент структуру, а в нижнем выбираем очередь в качестве получателя команд. Ивент структура может регистрировать не только ивенты лицевой панели, она может так же получать команды из других циклов. Это называется динамичные ивенты (dynamic events). В общем, для начала, приводим нашу программу в такой вид:


А кто не может, тот может скачать готовый темплейт (но всё таки рекомендую разобраться что к чему):
Вложения
FP_Dev_1.png
FP_Dev.vi
LV 8.0
(8.96 КБ) 272 скачивания
Аватара пользователя
Eugen Graf

Activity Professionalism Silver Black
guru
guru
Сообщения: 6502
Зарегистрирован: 13 ноя 2007, 02:20
Награды: 4
Версия LabVIEW: 2009
Откуда: Saarbrücken
Контактная информация:

Re: Запрос данных из параллельного потока

Сообщение Eugen Graf »

Как вы замметили мы обменялись референсами между циклами. Это нужно для коммуникации данными в обе стороны. Т.е. верхний цикл может посылать команды в нижний цикл используя референс очереди нижнего цикла, а нижний может отправлять данные в верхний используя референс юзер ивента.
FP_Dev_2.png
ПОПРАВКА кроме всего нужно задать строковой тип очереди:
FP_Dev_1.1.png
FP_Dev_1.1.png (740 байт) 6913 просмотров
Аватара пользователя
Eugen Graf

Activity Professionalism Silver Black
guru
guru
Сообщения: 6502
Зарегистрирован: 13 ноя 2007, 02:20
Награды: 4
Версия LabVIEW: 2009
Откуда: Saarbrücken
Контактная информация:

Re: Запрос данных из параллельного потока

Сообщение Eugen Graf »

Располагаем на нашей лицевой панели две кнопки и один цифровой индикатор:

Кнопка "get" будет запрашивать значение из нижнего цикла
Кнопка "stop" будет останавливать нашу программу, т.е. оба цикла
Цифровой индикатор "value" будет отображать запрошенное значение из нижнего цикла
Вложения
FP_Dev_3.png
FP_Dev_3.png (11.15 КБ) 6920 просмотров
Аватара пользователя
Eugen Graf

Activity Professionalism Silver Black
guru
guru
Сообщения: 6502
Зарегистрирован: 13 ноя 2007, 02:20
Награды: 4
Версия LabVIEW: 2009
Откуда: Saarbrücken
Контактная информация:

Re: Запрос данных из параллельного потока

Сообщение Eugen Graf »

Заменяем Timeout Event на Stop Value Change Event кнопки "stop". Сделать это можно нажав правой кнопкой мыши на рамку ивент структуры и выбрав Edit Event. Получится примерно такое:


Обратите так же внимание на нижний цикл, в нём обрабатывается команда "stop", которая заканчивает цикл (подробнее в первом уроке - линк в начале темы).
Вложения
FP_Dev_4.png
Аватара пользователя
Eugen Graf

Activity Professionalism Silver Black
guru
guru
Сообщения: 6502
Зарегистрирован: 13 ноя 2007, 02:20
Награды: 4
Версия LabVIEW: 2009
Откуда: Saarbrücken
Контактная информация:

Re: Запрос данных из параллельного потока

Сообщение Eugen Graf »

А так же добавляем ивент "get" верхний цикл а так же реакцию в нижний цикл на получение комады "get" из верхнего цикла:
Вложения
FP_Dev_5.png
Аватара пользователя
Eugen Graf

Activity Professionalism Silver Black
guru
guru
Сообщения: 6502
Зарегистрирован: 13 ноя 2007, 02:20
Награды: 4
Версия LabVIEW: 2009
Откуда: Saarbrücken
Контактная информация:

Re: Запрос данных из параллельного потока

Сообщение Eugen Graf »

А теперь нажимаем правой кнопкой мыши на ивент структуру, выбираем Add Event, а потом как на картинке - выбираем динамический ивент "FP":
Вложения
FP_Dev_6.png
Аватара пользователя
Eugen Graf

Activity Professionalism Silver Black
guru
guru
Сообщения: 6502
Зарегистрирован: 13 ноя 2007, 02:20
Награды: 4
Версия LabVIEW: 2009
Откуда: Saarbrücken
Контактная информация:

Re: Запрос данных из параллельного потока

Сообщение Eugen Graf »

Ну а содержимое этого ивента показано здесь:
Вложения
FP_Dev_7.png
FP_Dev_7.png (5.49 КБ) 6899 просмотров
Аватара пользователя
Eugen Graf

Activity Professionalism Silver Black
guru
guru
Сообщения: 6502
Зарегистрирован: 13 ноя 2007, 02:20
Награды: 4
Версия LabVIEW: 2009
Откуда: Saarbrücken
Контактная информация:

Re: Запрос данных из параллельного потока

Сообщение Eugen Graf »

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

Скачать конечный прибор этого урока можно здесь:
Вложения
FP_Dev.vi
(19.27 КБ) 340 скачиваний
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Модели программирования»