Помогите подключиться к NuDaq PCI-9112

Простейшие вопросы в области инженерной разработки
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 127 раз
Контактная информация:

Re: Помогите подключиться к NuDaq PCI-9112

Сообщение dadreamer »

soleda писал(а):Приветствую! Пол книжки прочитал, но как бы стремно не звучало, ребята где мой любимый a++?
Если вы об инкременте, то вот же он.
2016-11-03_13-22-55.jpg
soleda писал(а):И хочу я это число куда нибудь запомнить, чтобы им когда нибудь оперировать... Как это нарисовать? Где переменные??? Что только шифт регистр?
В пределах одного цикла - сдвиговый регистр или feedback node, смотря что удобнее. Можно и локальные переменные использовать, хотя и не рекомендуется (почему - должно быть отражено у Трэвиса в книжке).

В пределах всей программы: те же локальные + глобальные переменные, очереди, уведомители, рандеву, dvr. Ну, и никто не отменял старые-добрые провода :) Лишь бы всё это хозяйство в лапшу не превращалось. :crazy:
Вложения
nrjsxmfm912163998723206173.jpg
soleda
junior
junior
Сообщения: 54
Зарегистрирован: 26 сен 2016, 06:52
Версия LabVIEW: 2011
Контактная информация:

Re: Помогите подключиться к NuDaq PCI-9112

Сообщение soleda »

Элемент +1 меня вообще мало интересует, он как бы и ненужен. Там вообще много лишних элементов типа >= или <= достаточно одного из них.
Это чего же получается:
int a=0;
while(1)
{
while(a<=1256)
{
a++;
a=a*2;
}
if(a>=1256) a=3;
}
Выглядеть будет вот так?
Вложения
hre.JPG
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 127 раз
Контактная информация:

Re: Помогите подключиться к NuDaq PCI-9112

Сообщение dadreamer »

soleda писал(а):Элемент +1 меня вообще мало интересует, он как бы и ненужен. Там вообще много лишних элементов типа >= или <= достаточно одного из них.
Это чего же получается:
int a=0;
while(1)
{
while(a<=1256)
{
a++;
a=a*2;
}
if(a>=1256) a=3;
}
Выглядеть будет вот так?
Близко, но не полностью. Если уж быть крайне дотошным, то:
1) на С вы объявили переменную как int32, а в :labview: - как double;
2) цикл While в :labview: соответствует конструкции

Код: Выделить всё

do
statement
while ( expression ) ;
на С или Repeat ... Until на Delphi и т.д. То есть, у вас первая итерация цикла всегда будет выполняться, даже если условие expression ложно.
3) сдвиговый регистр (feedback node) во внешнем цикле нужно инициализировать нулём;
4) во внутреннем While условие остановки должно быть (a > 1256), а не >=; либо можно поменять терминал условия (остановка / продолжение работы), нажав на него инструментом "рука" (иконка примет вид зелёной стрелки), тогда можно будет использовать (a <= 1256).
5) то же самое во внешнем While при желании.
6) верхний туннель смысла не несёт; нижний можно убрать, взяв значение сразу с регистра.
hre.JPG
Чувствую, вы не с того конца за изучение :labview: взялись. Это среда графического программирования потоков данных. Часто здесь терминология C/C++ и других текстовых IDE не применима. Если так сильно хочется писать на C, попробуйте узлы Formula Node. Или напишите свою библиотеку.
Последний раз редактировалось dadreamer 03 ноя 2016, 12:53, всего редактировалось 1 раз.
Artem.spb

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

Re: Помогите подключиться к NuDaq PCI-9112

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

soleda писал(а):Элемент +1 меня вообще мало интересует, он как бы и ненужен.
хм, а как же
soleda писал(а):Приветствую! Пол книжки прочитал, но как бы стремно не звучало, ребята где мой любимый a++?
???
Там вообще много лишних элементов типа >= или <= достаточно одного из них.
Странное заявление.
(>=) != !(<=)
в вашем же примере есть ошибка, подтверждающая этот факт.
Это чего же получается:
Выглядеть будет вот так?
есали исправить ряд ляпов, то да
c.png
т.е. условие выхода из внутреннего цикал и смена a на 3 не верные.
soleda
junior
junior
Сообщения: 54
Зарегистрирован: 26 сен 2016, 06:52
Версия LabVIEW: 2011
Контактная информация:

Re: Помогите подключиться к NuDaq PCI-9112

Сообщение soleda »

Спасибо за разъяснения. С ошибочками нарисовал пример каюсь, надеялся все же, что есть такие переменные в которые можно было записывать и из которых считывать причем без проводников. Ну ладно это переосмыслить нужно, привыкнуть.
Artem.spb, на счет +1, этот элемент равносилен элементу "+" с подключенным к нему числом, причем не обязательно 1), а++ означает, что я взял переменную "а" прибавил к ней единицу и положил обратно и когда буду её брать в следующий раз она будет уже в измененном виде. Больше, меньше легко друг друга заменяют, если поменять местами между собой входящие проводники (мне не удобно пользоваться элементом меньше).
dadreamer - действительно formula node может мне пригодиться, спасибо.
Остался ещё один вопрос, который не совсем ещё понял, это таймеры.
Скажем мне нужно опрашивать входы на плате 10 раз в секунду, результат собирать в матрицу и записывать в файл. Как организовать цикл, чтобы он раз в 100мс просыпался, выполнялся и снова засыпал? Чего то не совсем я с этим разобрался ещё.
На Си я выкручивался по типу:
int time=0;
while(1)
{
delay_ms(1);
time++;
if(time>=1000)
{
...
...
...
time=0
}
}
То есть получается что раз в 1-2 секунды срабатывает if и выполняются какой то код.
Последний раз редактировалось soleda 03 ноя 2016, 14:12, всего редактировалось 1 раз.
Artem.spb

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

Re: Помогите подключиться к NuDaq PCI-9112

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

soleda писал(а):Спасибо за разъяснения. С ошибочками нарисовал пример каюсь, надеялся все же, что есть такие переменные в которые можно было записывать и из которых считывать причем без проводников. Ну ладно это переосмыслить нужно, привыкнуть.
Локальные и глобальные переменные. но их использование - примерно то же самое, что goto в текстовых.
Artem.spb, на счет +1, этот элемент равносилен элементу "+" с подключенным к нему числом, причем не обязательно 1),
а чем а++ кардинально отличается от а+1 в вашей логике?
А больше, меньше легко друг друга заменяют, если поменять местами между собой входящие проводники (мне не удобно пользоваться элементом меньше).
а мне неудобно пересекать провода :)
Странная логика "мне эта фкункция неудобна, значит её должны отсюда выкинуть". А как насчёт простоты понимания программы не только вами?

Остался ещё один вопрос, который не совсем ещё понял, это таймеры.
Скажем мне нужно опрашивать входы на плате 10 раз в секунду, результат собирать в матрицу и записывать в файл. Как организовать цикл, чтобы он раз в 100мс просыпался, выполнялся и снова засыпал? Чего то не совсем я с этим разобрался ещё.
На Си я выкручивался по типу:

Код: Выделить всё

int time=0;
while(1)
{
delay_ms(1);
time++;
if(time>=1000)
{
...
...
...
time=0
}
}
То есть получается что раз в 1-2 секунды срабатывает if и выполняются какой то код.
а зачем так извращаться?
почему не

Код: Выделить всё

delay_ms(1000);
?
палитра Timing в помощь. В частности wait (ms).
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 127 раз
Контактная информация:

Re: Помогите подключиться к NuDaq PCI-9112

Сообщение dadreamer »

soleda писал(а):надеялся все же, что есть такие переменные в которые можно было записывать и из которых считывать причем без проводников
Есть - локальные переменные. Можно без проводов использовать. Но нужно следить, чтобы не возникало состояния гонки.
soleda писал(а):Как организовать цикл, чтобы он раз в 100мс просыпался, выполнялся и снова засыпал?
Вложения
Untitled 5.vi
lv2011
(5.99 КБ) 64 скачивания
soleda
junior
junior
Сообщения: 54
Зарегистрирован: 26 сен 2016, 06:52
Версия LabVIEW: 2011
Контактная информация:

Re: Помогите подключиться к NuDaq PCI-9112

Сообщение soleda »

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

На счет извращения:
В мой код постоянно работает, т.е дошел до delay_ms(1), прибавил единичку к time, проверил условие if и если условие не выполняется, пошел выполнять остальной код дальше. Если time дошёл до 1000, if сработал выполнил в себе код, обнулил time и программа пошла выполняться дальше.
А в вашем случае программа дойдя до delay, "зависнет" на одну секунду не выполняя больше ничего.
soleda
junior
junior
Сообщения: 54
Зарегистрирован: 26 сен 2016, 06:52
Версия LabVIEW: 2011
Контактная информация:

Re: Помогите подключиться к NuDaq PCI-9112

Сообщение soleda »

[quote="dadreamer"] ok, почитатю, а можно файл опустить до версии 8.5? Не завелась у меня плата на более новых версиях.
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 127 раз
Контактная информация:

Re: Помогите подключиться к NuDaq PCI-9112

Сообщение dadreamer »

 
Вложения
Untitled 5.vi
lv8.5
(8.32 КБ) 69 скачиваний
Artem.spb

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

Re: Помогите подключиться к NuDaq PCI-9112

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

soleda писал(а):Предыдущее сообщение подправил на счет "а". (а++ означает, что я взял переменную "а" прибавил к ней единицу и положил обратно и когда буду её брать в следующий раз она будет уже в измененном виде).
+1 в :labview: делает то же самое: прибавляет 1 и кладёт обратно в проводник.
Только надо понимать, что проводник до и после ЛЮБОЙ функции это практичеки две разные переменные, если вы будете эти проводники ветвить, а если не ветвить, то это как раз и есть одна переменная (новый буфер не выделяется для экономии памяти)
На счет больше меньше, я не говорил, чтобы выбросить - просто в схемотехнике такого обозначения компаратора нет. Есть вход "+", есть вход "-", а значок больше указывает на то, что это компаратор, а не операционный усилитель. Поэтому мне "больше" роднее.
:labview: всё же не схемотехника, а язык программирования. Аналогии проводить можно, но может случиться и не разбериха, как при сравнении с тексовыми языками.
На счет извращения:
В мой код постоянно работает,
и чем же он занят? :)
конкретно ваш код ничего не делает. Если бы кроме проверки на 1000 что-то было, я бы не предлагал delay(1000), ну а так предложил оптимальную реализацию того, что вы запросили.
soleda
junior
junior
Сообщения: 54
Зарегистрирован: 26 сен 2016, 06:52
Версия LabVIEW: 2011
Контактная информация:

Re: Помогите подключиться к NuDaq PCI-9112

Сообщение soleda »

dadreamer - спасибо, сейчас буду разбираться!
Artem.spb - 1. в том то и дело, что не тоже самое. Если команда a++; означает взять из ячейки переменную, прибавить переменную и положить полученную сумму обратно, то "+" в labview другое: взять переменную, прибавить единицу и создать новую переменную.
2. В моем понимании это не аналогия, а стандартизация, вообще это математика. Опять же никто не утверждает что на компараторе обязательно "+" должен быть вверху.
3. Ну как же, происходит инициализация переменной, заходим в бесконечный цикл и цикл начинает крутиться со скоростью приблизительно раз в 1ms+0.001ms+количество выполненных строк, скажем 1кГц. А ваш код будет крутиться чуть ниже 1Гц. С такой частотой обновления цикла много не напрограммируешь.
Я в labview заметил, что когда выполняются таймеры, параллельные задачи находятся в ожидании поэтому и спросил.
Borjomy_1

Activity Professionalism Silver
doctor
doctor
Сообщения: 2211
Зарегистрирован: 28 июн 2012, 09:32
Награды: 3
Версия LabVIEW: 2009..2020
Откуда: город семи холмов
Благодарил (а): 27 раз
Поблагодарили: 27 раз

Re: Помогите подключиться к NuDaq PCI-9112

Сообщение Borjomy_1 »

Если команда a++; означает взять из ячейки переменную, прибавить переменную и положить полученную сумму обратно, то "+" в labview другое: взять переменную, прибавить единицу и создать новую переменную.
В :labview: новая переменная НЕ СОЗДАЕТСЯ при прибавлении единицы. Создается копия, когда вы это значение используете в разных местах, где оно модифицируется. В сях вы будете вынуждены делать тоже самое.
Для проверки вы можете воспользоваться средствами :labview: Меню Tools.../Profile.../Show Buffer Allocations
А ваш код будет крутиться чуть ниже 1Гц.
В :labview: таймер выполняет синхронизацию с заданным временем. Т.е если выполнение кода укладывается в заданную задержку, то время цикла будет равно указанной задержке. Например задержка составляет 100 мс, а код выполняется 5 мс. Время цикла - 100мс, в течение первых 5 мс которого выполняется код.

Что касается ваших опасений касаемо утечек памяти, то за свой 20-летний опыт работы с :labview: я НИ РАЗУ не сталкивался с утечками памяти в простых типах. Несмотря на то, что мои приложения бывали под 1000 :vi: и работают в режиме 24/7 месяцами (и я никакими специальными средствами сбора мусора не пользуюсь, оптимизация работы с массивами, чтобы при операциях реже делались копии, - это максимум ). Про выделение памяти следует вспоминать исключительно при работе с огромными массивами и классами.
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 127 раз
Контактная информация:

Re: Помогите подключиться к NuDaq PCI-9112

Сообщение dadreamer »

soleda, действительно, всё именно так, как написал Borjomy_1.
1. Все реальные переменные, такие, какими вы их привыкли видеть в текстовых языках, лежат в специальной области памяти. На каждую переменную своя ячейка, называемая транспортным буфером. Когда вы читаете контрол, значение контрола копируется в буфер. Когда вы пишете данные в индикатор, значение из буфера копируется в индикатор. А провода на БД - это графическое отображение транспортного буфера. То есть, реальные данные находятся в этих проводах. Почему/как :labview: работает с потоками данных? Включите лампочку (Highlight Execution) и запустите программу. :wink: Что касается инкремента в :labview: , то он (как большинство встроенных простейших операций) выполняется In Place, т.е. без дополнительного буфера, что на asm'е выглядит как INC [регистр].
2. Когда у вас задержка Wait стоит в цикле и не привязана ни к чему, то она запускается параллельно остальному коду. Поэтому время старта задержки и время старта кода в цикле примерно одинаково. Ясно, что в большинстве случаев время выполнения кода меньше времени задержки, поэтому цикл крутится именно с частотой, определяемой инструментом Wait. Если бы время выполнения кода было больше времени задержки, то тогда цикл крутился бы с другой частотой. Однако, если вы специально привяжете Wait к остальному коду, например, с помощью Sequence, то тогда у вас время выполнения одной итерации будет складываться из времени работы кода и времени задержки. Соответственно, будет и частота, отличная от случая, когда Wait не привязан ни к чему.
soleda писал(а):Я в labview заметил, что когда выполняются таймеры, параллельные задачи находятся в ожидании поэтому и спросил.
Это где вы такое увидели? Если участок кода работает параллельно, то на него никакие прочие куски кода влияния оказывать не должны (не учитываем в данном случае прерывания процессора на одноядерной системе).
Artem.spb

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

Re: Помогите подключиться к NuDaq PCI-9112

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

dadreamer писал(а):
soleda писал(а):Я в labview заметил, что когда выполняются таймеры, параллельные задачи находятся в ожидании поэтому и спросил.
Это где вы такое увидели? Если участок кода работает параллельно, то на него никакие прочие куски кода влияния оказывать не должны (не учитываем в данном случае прерывания процессора на одноядерной системе).
суть в том, что в LV (в отличие от текстовых) всё, что не связано явно проводниками выполняется ПАРАЛЛЕЛЬНО.
Подозреваю, что описанная "проблема" замечена в циклах. Так суть wait в том и заключается (как описано в предыдущих двух сообщениях), чтобы подождать.
Это значит, что функции работают себе, как и должны, в параллель с ожиданием. И ожидание работает в параллель с остальными функциями.
НО цикл не может перейти на новую итерацию, пока всё, что в нём находится не будет выполнено.
Соответственно, все быстрые функции закончили НЕ ждут, а ЗАКОНЧИЛИ работу и "ждут" следующей итерации.
А wait добросовестно ждёт, когда истечёт заданное время. хот 1, хоть 1000мс.

Если надо что-то делать с частотой 1 Гц и параллельно делать что-то быстрее, то не исключено, что будет разумно сделать два цикла. Они спокойно будут крутиться параллельно. Один с таймером 1 Гц, а второй с нужной частотой (но там wait тоже рекомендуется поставить, чтобы не перегружать процессор).

И да, в отличие от текстовых, где
soleda писал(а): и цикл начинает крутиться со скоростью приблизительно раз в 1ms+0.001ms+количество выполненных строк, скажем 1кГц.
т.е вовсе не 1 кГц, а ниже, в LV цикл будет крутиться именно с заданным периодом (при условии, конечно, что все параллельные функции успеют отработать в заданное время и что ОС не решит отдефрагментировать винчестер или установить какое-нибудь обновление)
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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