Цикл в цикле

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

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

Re: Цикл в цикле

Сообщение dadreamer »

Borjomy_1, ну всё равно, WinAPI + Network Streams или что там внутри используется. Просто подано всё это в красивой, удобной и многофункциональной оболочке. Здесь и USB, и GPIB, и всё через одни и те же инструменты. Однако это уже совсем не по сабжу.
Borjomy_1

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

Re: Цикл в цикле

Сообщение Borjomy_1 »

SusLiK495
beginner
beginner
Сообщения: 32
Зарегистрирован: 18 окт 2011, 18:10
Версия LabVIEW: 8.6;2012
Откуда: Москва
Контактная информация:

Re: Цикл в цикле

Сообщение SusLiK495 »

Re: Цикл в цикле
Непрочитанное сообщение Borjomy_1 13 сен 2015, 12:16

А что делать, если источник посылок такой

В посылке должен присутствовать хотя-бы признак начала и код посылки, идентифицирующий ее формат и длину. И каждый вменяемый разработчик должен соблюдать этот необходимый минимум. За несоблюдение этого надо бить по рукам или рублем.
У меня по сути вот что:
1. Прибор-весы.я не шлю запросы в прибор. Весы постоянно передают значения веса по RS-232.
2. Строка строго 32 байта. Есть признаки начала строки и конца.
3. Я вылавливаю строку и substring её режу в нужных мне местах.

Проблема вот в чём:
нужная мне строка не добирает полных 32 бита из-за того, что цикл чтения помещен в основной цикл.
Re: Цикл в цикле
Непрочитанное сообщение Borjomy_1 16 сен 2015, 16:12

Накопал на NI http://digital.ni.com/public.nsf/allkb/ ... FA00738F4A
это таким способом огранизовать чтение?

Возникает вопрос(скорее всего глупый) отработает ли цикл чтения параллельно с основным циклом программы?

P.S. Прошу прощения, если задаю глупые вопросы.
Аватара пользователя
IvanLis

Activity Professionalism Tutorials Gold Man of the year 2012
Автор
guru
guru
Сообщения: 5462
Зарегистрирован: 02 дек 2009, 17:44
Награды: 7
Версия LabVIEW: 2015, 2016
Откуда: СССР
Благодарил (а): 28 раз
Поблагодарили: 86 раз

Re: Цикл в цикле

Сообщение IvanLis »

SusLiK495 писал(а):Возникает вопрос(скорее всего глупый) отработает ли цикл чтения параллельно с основным циклом программы?
Вы свою программу выкладывайте, а то не видя кода можно много насоветовать.
Но вообще, крутить цикл внутри другого не очень органично :crazy:
Аватара пользователя
dadreamer

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

Re: Цикл в цикле

Сообщение dadreamer »

SusLiK495, описание протокола заодно тоже скиньте
SusLiK495
beginner
beginner
Сообщения: 32
Зарегистрирован: 18 окт 2011, 18:10
Версия LabVIEW: 8.6;2012
Откуда: Москва
Контактная информация:

Re: Цикл в цикле

Сообщение SusLiK495 »

Re: Цикл в цикле
Сообщение IvanLis Вчера, 11:24

SusLiK495 писал(а):
Возникает вопрос(скорее всего глупый) отработает ли цикл чтения параллельно с основным циклом программы?

Вы свою программу выкладывайте, а то не видя кода можно много насоветовать.
Но вообще, крутить цикл внутри другого не очень органично :crazy:
Выкладываю часть программы, которая отвечает за прием значений с весов и отправку в другой прибор команды в зависимости от выбранного положения.

Внутри цикла чтения идет резка строки в 32 байта, сам цикл построен по базовому примеру в LV. Далее значение, в зависимости от выбранного положения отображается на индикаторе.

Re: Цикл в цикле
Сообщение dadreamer Вчера, 11:36

SusLiK495, описание протокола заодно тоже скиньте
Чёткого описания я к сожалению дать не могу, так как мануалов дано не было и как упоминалось в треде раньше слушал порты. по итогу имею строку вида:
S!AAAAAAA.pAAAAA AAAAAA.26.240..
где S- меняется в зависимости от того, набирается вес или статичен или уменьшается(+\-). Строка идет 32 байта. Как видно будет в примере я её режу с 25.


При использовании стандартных примеров LV таких как,Advanced Serial Write and Read чтение происходит, всё идет как нужно, но вне программы.

Прошу, подскажите, как упростить\изменить\исправить программу, так как уже сломал голову. Заранее спасибо Вам.
Прога->>http://ifolder.su/44252372
Аватара пользователя
dadreamer

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

Re: Цикл в цикле

Сообщение dadreamer »

SusLiK495 писал(а):S!AAAAAAA.pAAAAA AAAAAA.26.240..
Что-то не вижу тут вменяемого терминатора. Вряд ли это последняя точка. Должен быть символ типа 0xA, 0xD и т.п. Ну, в крайнем случае можно просто сделать VISA Read на 32 байта и парсить полученную строку. А весы какой модели и кто производитель? На оф. сайте должен быть мануал.
SusLiK495
beginner
beginner
Сообщения: 32
Зарегистрирован: 18 окт 2011, 18:10
Версия LabVIEW: 8.6;2012
Откуда: Москва
Контактная информация:

Re: Цикл в цикле

Сообщение SusLiK495 »

Re: Цикл в цикле
Непрочитанное сообщение dadreamer 19 минут назад

SusLiK495 писал(а):
S!AAAAAAA.pAAAAA AAAAAA.26.240..

Что-то не вижу тут вменяемого терминатора. Вряд ли это последняя точка. Должен быть символ типа 0xA, 0xD и т.п. Ну, в крайнем случае можно просто сделать VISA Read на 32 байта и парсить полученную строку. А весы какой модели и кто производитель? На оф. сайте должен быть мануал.
Собственно так и было сделано. Проблема в том, что из-за циклов строка не всегда приходит фиксированной длины. Как я уже пиисал выше она приходит рандомным числом от 0 до 32. Если же считывать вне основного цикла программы, то все идёт строками по 32 байта стабильно.
Аватара пользователя
dadreamer

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

Re: Цикл в цикле

Сообщение dadreamer »

Вам бы для начала с архитектурой программы определиться. А то у вас всё в одну кучу (цикл) свалено, так не делается. Поищите в поиске информацию о построении программ по принципу "конечный автомат" (state machine) и переделайте программу. В данном случае можно уложиться в два или три параллельных цикла: обработка UI (опционально), получение данных по RS-232, цикл обработки состояний (последовательность state machine). Передача данных между циклами оформляется через очереди и уведомители.
Далее, у вас имеются кое какие ошибки на БД:
2015-09-23_11-19-15.jpg
1) уверены, что у вас терминатор = 0xA? Я вот нет, ибо в протоколе его не увидел. А марку и производителя весов вы сообщить отказались.
2) VISA Clear не нужен, тем более в цикле.
3) почему читается 35 байт, а не 32?
4) VISA Close вызывается один раз за циклом.
5) закрывать нужно все открытые устройства - это правило хорошего тона в программировании.
6) цикл работает без задержки - огромная нагрузка на ЦП.
7) один While точно лишний, нужно убрать какой-то из них.

Кроме того,
SusLiK495 писал(а):Прога->>http://ifolder.su/44252372
Правила форума писал(а):10. Запрещается размещать изображения на внешних хостингах. Прикрепляйте изображения к посту (вкладка "добавить вложения").

т.к.
1. Удаление изображения с внешнего хостинга - потеря связности форума (непонятно о чем шла речь)
2. Многие заходят с работы, и доступ к radikal.ru и прочим хостингам перекрыт.
Это также касается и :vi: . Никому неохота лишний раз смотреть рекламу на файлообменниках. Прикрепляйте ваши :vi: к сообщениям.
SusLiK495
beginner
beginner
Сообщения: 32
Зарегистрирован: 18 окт 2011, 18:10
Версия LabVIEW: 8.6;2012
Откуда: Москва
Контактная информация:

Re: Цикл в цикле

Сообщение SusLiK495 »

Спасибо за ответ!
1) уверены, что у вас терминатор = 0xA? Я вот нет, ибо в протоколе его не увидел. А марку и производителя весов вы сообщить отказались.
Искал информацию по маркировке, я не отказывался сообщать. Весы Mettler Tolledo, судя по терминалу весов это IND690
3) почему читается 35 байт, а не 32?
Это описка, исправлю
Это также касается и :vi: . Никому неохота лишний раз смотреть рекламу на файлообменниках. Прикрепляйте ваши :vi: к сообщениям.
Прошу прощения, но у меня нет возможности прикреплять вложения, поэтому и пришлось выложить на файлообменник.

Касательно state machine спасибо, поищу, исправлю в ближайшее время.
6) цикл работает без задержки - огромная нагрузка на ЦП.
Выставлю задержку, спасибо
7) один While точно лишний, нужно убрать какой-то из них.
Смысл программы был в том, чтобы считывание с приборов происходило даже без запущенного измерения веса. Т.е цикл чтения с 232 должен протекать вне зависимости от выбора нужного положения и нажатия кнопки старт. Убрав один из while loop не прекратиться ли данное условие?
Borjomy_1

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

Re: Цикл в цикле

Сообщение Borjomy_1 »

Проблема в том, что из-за циклов строка не всегда приходит фиксированной длины.
это может быть потому, что посылки идут постоянно, но вы начинаете чтение посылки в процессе ее передачи. Что получается. В конце посылки терминальный символ, который завершает прием посылки. Но она неполная. Вы очищаете буфер перед чтением и будете каждый раз натыкаться на эти грабли. В ЛЮБОМ СЛУЧАЕ первая посылка, которую вы примете, будет с шансами 31 из 32 битой. Эти шансы уменьшаются по мере того, чем реже идет посылка.
1. перед началом работы основного цикла надо синхронизироваться - выбрать неполную посылку.
2. чтение производить непрерывно, вычитывая ВСЕ, без очистки буфера.
3. если вы сихронизировались, то дальше достаточно вычитывать данные по размеру посылки.
Аватара пользователя
dadreamer

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

Re: Цикл в цикле

Сообщение dadreamer »

SusLiK495 писал(а):Весы Mettler Tolledo, судя по терминалу весов это IND690
Вот мануал на ваши весы, там есть описание протокола (глава 6 "Interface description"). Структура посылаемого сообщения меняется в зависимости от выбранного режима. Конкретно ваш формат я что-то не нашёл, но может невнимательно смотрел. Если у вас continuous mode, то терминальный байт будет 0xD.
SusLiK495 писал(а):но у меня нет возможности прикреплять вложения
Подпись IvanLis внимательно читали?.. :brows:
SusLiK495 писал(а):Смысл программы был в том, чтобы считывание с приборов происходило даже без запущенного измерения веса. Т.е цикл чтения с 232 должен протекать вне зависимости от выбора нужного положения и нажатия кнопки старт. Убрав один из while loop не прекратиться ли данное условие?
Как я уже писал
dadreamer писал(а):В данном случае можно уложиться в два или три параллельных цикла: обработка UI (опционально), получение данных по RS-232, цикл обработки состояний (последовательность state machine).
Если разберётесь со state machine и оформите программу в виде параллельных циклов, то не будет необходимости в двойных циклах. Вы можете создать сколько угодно циклов для чтения информации с каких угодно устройств, и они будут работать независимо от остального кода.
Вложения
2015-09-23_23-16-58.jpg
SusLiK495
beginner
beginner
Сообщения: 32
Зарегистрирован: 18 окт 2011, 18:10
Версия LabVIEW: 8.6;2012
Откуда: Москва
Контактная информация:

Re: Цикл в цикле

Сообщение SusLiK495 »

Re: Цикл в цикле
Сообщение dadreamer 23 сен 2015, 22:19

SusLiK495 писал(а):
Весы Mettler Tolledo, судя по терминалу весов это IND690

Вот мануал на ваши весы, там есть описание протокола (глава 6 "Interface description"). Структура посылаемого сообщения меняется в зависимости от выбранного режима. Конкретно ваш формат я что-то не нашёл, но может невнимательно смотрел. Если у вас continuous mode, то терминальный байт будет 0xD.
Дело в том, что я пробывал передавать данные тем путём,который там описан, но всё тщетно(не отрицаю возможности кривости рук), но попробую ещё. У меня всё передаётся отлично в режиме удалённого терминала.
Подпись IvanLis внимательно читали?.. :brows:
Каюсь, не читал( Исправлюсь.
Если разберётесь со state machine и оформите программу в виде параллельных циклов, то не будет необходимости в двойных циклах. Вы можете создать сколько угодно циклов для чтения информации с каких угодно устройств, и они будут работать независимо от остального кода.
Спасибо ещё раз за информацию, буду читать. Но я ведь правильно понимаю, что главный и основной принцип это распараллеливание задач?

А что к примеру мешает сделать subVI тогда? Или это всё равно будет другое? Т.е. грубо говоря сделать цикл чтения под программой и вынести вне цикла.
SusLiK495
beginner
beginner
Сообщения: 32
Зарегистрирован: 18 окт 2011, 18:10
Версия LabVIEW: 8.6;2012
Откуда: Москва
Контактная информация:

Re: Цикл в цикле

Сообщение SusLiK495 »

dadreamer писал(а): Если разберётесь со state machine и оформите программу в виде параллельных циклов, то не будет необходимости в двойных циклах. Вы можете создать сколько угодно циклов для чтения информации с каких угодно устройств, и они будут работать независимо от остального кода.
Подскажите, есть ли смысл создания программы из большого количества подпрограмм(модулей)?
Аватара пользователя
dadreamer

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

Re: Цикл в цикле

Сообщение dadreamer »

SusLiK495 писал(а):Подскажите, есть ли смысл создания программы из большого количества подпрограмм(модулей)?
Если вы о SubVI, то смысл есть, но нужно понимать, зачем это делается. Вообще, согласно идеологии программирования в :labview: , любая диаграмма должна помещаться на экран монитора. Допускается создавать строго горизонтальный код (слева направо) или вертикальный (сверху вниз). Часто этот идеал бывает недостижим. Тогда имеет смысл поместить некоторые части кода в SubVI, чтобы обеспечить компактность всей программы. Другой пример, когда использование SubVI актуально, это использование одного и того же кода в разных местах программы. Проще вызывать один и тот же инструмент, чем копировать идентичный код. Плюс, отладка и модификация одного SubVI намного проще, нежели работа с одинаковыми участками кода. SubVI также могут быть использованы для работы в параллельных циклах при многопоточных вызовах (реентерантное выполнение). Так что вполне естественно рассматривать SubVI просто как подпрограмму (процедуру/функцию) в текстовых языках программирования.
SusLiK495 писал(а):Спасибо ещё раз за информацию, буду читать. Но я ведь правильно понимаю, что главный и основной принцип это распараллеливание задач?

А что к примеру мешает сделать subVI тогда? Или это всё равно будет другое? Т.е. грубо говоря сделать цикл чтения под программой и вынести вне цикла.
Если задача должна быть независимой от других задач, то она должна выполняться параллельно остальному коду, и это логично. Так исключается влияние одних участков кода на другие. И кроме того проще отладка: вы можете изменять или удалять элементы параллельного цикла, а остальные циклы останутся работоспособны. Можно попросту отключить один цикл и это не нарушит работоспособность остальной программы (учитывая, что цикл обработки UI событий и state-цикл останутся на месте).
Что касается state machine, то это просто довольно удобная архитектура. Удобство её в том, что из любого состояния программы можно перейти в любое другое, достаточно лишь изменить значение сдвигового регистра. Таких состояний можно создать сколь угодно много, и ими легко управлять. Закладывая заранее шаблон state machine, вы облегчаете себе жизнь в будущем, когда проект разрастётся и потребуются корректировки.
Можно в принципе обойтись даже одним циклом state machine безо всякого распараллеливания. Но вы потеряете часть гибкости и универсальности: в один цикл придется поместить всю работу с устройствами и всю логику. Рано или поздно попросту запутаетесь в проводах, регистрах, индикаторах.
Ответить

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