Цикл в цикле
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 126 раз
- Контактная информация:
Re: Цикл в цикле
Borjomy_1, ну всё равно, WinAPI + Network Streams или что там внутри используется. Просто подано всё это в красивой, удобной и многофункциональной оболочке. Здесь и USB, и GPIB, и всё через одни и те же инструменты. Однако это уже совсем не по сабжу.
-
- beginner
- Сообщения: 32
- Зарегистрирован: 18 окт 2011, 18:10
- Версия LabVIEW: 8.6;2012
- Откуда: Москва
- Контактная информация:
Re: Цикл в цикле
У меня по сути вот что: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
- guru
- Сообщения: 5462
- Зарегистрирован: 02 дек 2009, 17:44
- Награды: 7
- Версия LabVIEW: 2015, 2016
- Откуда: СССР
- Благодарил (а): 28 раз
- Поблагодарили: 86 раз
Re: Цикл в цикле
Вы свою программу выкладывайте, а то не видя кода можно много насоветовать.SusLiK495 писал(а):Возникает вопрос(скорее всего глупый) отработает ли цикл чтения параллельно с основным циклом программы?
Но вообще, крутить цикл внутри другого не очень органично
Знание нескольких принципов освобождает от знания многих фактов!
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
-
- beginner
- Сообщения: 32
- Зарегистрирован: 18 окт 2011, 18:10
- Версия LabVIEW: 8.6;2012
- Откуда: Москва
- Контактная информация:
Re: Цикл в цикле
Выкладываю часть программы, которая отвечает за прием значений с весов и отправку в другой прибор команды в зависимости от выбранного положения.Re: Цикл в цикле
Сообщение IvanLis Вчера, 11:24
SusLiK495 писал(а):
Возникает вопрос(скорее всего глупый) отработает ли цикл чтения параллельно с основным циклом программы?
Вы свою программу выкладывайте, а то не видя кода можно много насоветовать.
Но вообще, крутить цикл внутри другого не очень органично
Внутри цикла чтения идет резка строки в 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
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 126 раз
- Контактная информация:
Re: Цикл в цикле
Что-то не вижу тут вменяемого терминатора. Вряд ли это последняя точка. Должен быть символ типа 0xA, 0xD и т.п. Ну, в крайнем случае можно просто сделать VISA Read на 32 байта и парсить полученную строку. А весы какой модели и кто производитель? На оф. сайте должен быть мануал.SusLiK495 писал(а):S!AAAAAAA.pAAAAA AAAAAA.26.240..
-
- beginner
- Сообщения: 32
- Зарегистрирован: 18 окт 2011, 18:10
- Версия LabVIEW: 8.6;2012
- Откуда: Москва
- Контактная информация:
Re: Цикл в цикле
Собственно так и было сделано. Проблема в том, что из-за циклов строка не всегда приходит фиксированной длины. Как я уже пиисал выше она приходит рандомным числом от 0 до 32. Если же считывать вне основного цикла программы, то все идёт строками по 32 байта стабильно.Re: Цикл в цикле
Непрочитанное сообщение dadreamer 19 минут назад
SusLiK495 писал(а):
S!AAAAAAA.pAAAAA AAAAAA.26.240..
Что-то не вижу тут вменяемого терминатора. Вряд ли это последняя точка. Должен быть символ типа 0xA, 0xD и т.п. Ну, в крайнем случае можно просто сделать VISA Read на 32 байта и парсить полученную строку. А весы какой модели и кто производитель? На оф. сайте должен быть мануал.
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 126 раз
- Контактная информация:
Re: Цикл в цикле
Вам бы для начала с архитектурой программы определиться. А то у вас всё в одну кучу (цикл) свалено, так не делается. Поищите в поиске информацию о построении программ по принципу "конечный автомат" (state machine) и переделайте программу. В данном случае можно уложиться в два или три параллельных цикла: обработка UI (опционально), получение данных по RS-232, цикл обработки состояний (последовательность state machine). Передача данных между циклами оформляется через очереди и уведомители.
Далее, у вас имеются кое какие ошибки на БД: 1) уверены, что у вас терминатор = 0xA? Я вот нет, ибо в протоколе его не увидел. А марку и производителя весов вы сообщить отказались.
2) VISA Clear не нужен, тем более в цикле.
3) почему читается 35 байт, а не 32?
4) VISA Close вызывается один раз за циклом.
5) закрывать нужно все открытые устройства - это правило хорошего тона в программировании.
6) цикл работает без задержки - огромная нагрузка на ЦП.
7) один While точно лишний, нужно убрать какой-то из них.
Кроме того,
Далее, у вас имеются кое какие ошибки на БД: 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 и прочим хостингам перекрыт.
-
- beginner
- Сообщения: 32
- Зарегистрирован: 18 окт 2011, 18:10
- Версия LabVIEW: 8.6;2012
- Откуда: Москва
- Контактная информация:
Re: Цикл в цикле
Спасибо за ответ!
Касательно state machine спасибо, поищу, исправлю в ближайшее время.
Искал информацию по маркировке, я не отказывался сообщать. Весы Mettler Tolledo, судя по терминалу весов это IND6901) уверены, что у вас терминатор = 0xA? Я вот нет, ибо в протоколе его не увидел. А марку и производителя весов вы сообщить отказались.
Это описка, исправлю3) почему читается 35 байт, а не 32?
Прошу прощения, но у меня нет возможности прикреплять вложения, поэтому и пришлось выложить на файлообменник.Это также касается и . Никому неохота лишний раз смотреть рекламу на файлообменниках. Прикрепляйте ваши к сообщениям.
Касательно state machine спасибо, поищу, исправлю в ближайшее время.
Выставлю задержку, спасибо6) цикл работает без задержки - огромная нагрузка на ЦП.
Смысл программы был в том, чтобы считывание с приборов происходило даже без запущенного измерения веса. Т.е цикл чтения с 232 должен протекать вне зависимости от выбора нужного положения и нажатия кнопки старт. Убрав один из while loop не прекратиться ли данное условие?7) один While точно лишний, нужно убрать какой-то из них.
-
- doctor
- Сообщения: 2210
- Зарегистрирован: 28 июн 2012, 09:32
- Награды: 3
- Версия LabVIEW: 2009..2020
- Откуда: город семи холмов
- Благодарил (а): 27 раз
- Поблагодарили: 26 раз
Re: Цикл в цикле
это может быть потому, что посылки идут постоянно, но вы начинаете чтение посылки в процессе ее передачи. Что получается. В конце посылки терминальный символ, который завершает прием посылки. Но она неполная. Вы очищаете буфер перед чтением и будете каждый раз натыкаться на эти грабли. В ЛЮБОМ СЛУЧАЕ первая посылка, которую вы примете, будет с шансами 31 из 32 битой. Эти шансы уменьшаются по мере того, чем реже идет посылка.Проблема в том, что из-за циклов строка не всегда приходит фиксированной длины.
1. перед началом работы основного цикла надо синхронизироваться - выбрать неполную посылку.
2. чтение производить непрерывно, вычитывая ВСЕ, без очистки буфера.
3. если вы сихронизировались, то дальше достаточно вычитывать данные по размеру посылки.
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 126 раз
- Контактная информация:
Re: Цикл в цикле
Вот мануал на ваши весы, там есть описание протокола (глава 6 "Interface description"). Структура посылаемого сообщения меняется в зависимости от выбранного режима. Конкретно ваш формат я что-то не нашёл, но может невнимательно смотрел. Если у вас continuous mode, то терминальный байт будет 0xD.SusLiK495 писал(а):Весы Mettler Tolledo, судя по терминалу весов это IND690
Подпись IvanLis внимательно читали?..SusLiK495 писал(а):но у меня нет возможности прикреплять вложения
Как я уже писалSusLiK495 писал(а):Смысл программы был в том, чтобы считывание с приборов происходило даже без запущенного измерения веса. Т.е цикл чтения с 232 должен протекать вне зависимости от выбора нужного положения и нажатия кнопки старт. Убрав один из while loop не прекратиться ли данное условие?
Если разберётесь со state machine и оформите программу в виде параллельных циклов, то не будет необходимости в двойных циклах. Вы можете создать сколько угодно циклов для чтения информации с каких угодно устройств, и они будут работать независимо от остального кода.dadreamer писал(а):В данном случае можно уложиться в два или три параллельных цикла: обработка UI (опционально), получение данных по RS-232, цикл обработки состояний (последовательность state machine).
-
- beginner
- Сообщения: 32
- Зарегистрирован: 18 окт 2011, 18:10
- Версия LabVIEW: 8.6;2012
- Откуда: Москва
- Контактная информация:
Re: Цикл в цикле
Дело в том, что я пробывал передавать данные тем путём,который там описан, но всё тщетно(не отрицаю возможности кривости рук), но попробую ещё. У меня всё передаётся отлично в режиме удалённого терминала.Re: Цикл в цикле
Сообщение dadreamer 23 сен 2015, 22:19
SusLiK495 писал(а):
Весы Mettler Tolledo, судя по терминалу весов это IND690
Вот мануал на ваши весы, там есть описание протокола (глава 6 "Interface description"). Структура посылаемого сообщения меняется в зависимости от выбранного режима. Конкретно ваш формат я что-то не нашёл, но может невнимательно смотрел. Если у вас continuous mode, то терминальный байт будет 0xD.
Каюсь, не читал( Исправлюсь.Подпись IvanLis внимательно читали?..
Спасибо ещё раз за информацию, буду читать. Но я ведь правильно понимаю, что главный и основной принцип это распараллеливание задач?Если разберётесь со state machine и оформите программу в виде параллельных циклов, то не будет необходимости в двойных циклах. Вы можете создать сколько угодно циклов для чтения информации с каких угодно устройств, и они будут работать независимо от остального кода.
А что к примеру мешает сделать subVI тогда? Или это всё равно будет другое? Т.е. грубо говоря сделать цикл чтения под программой и вынести вне цикла.
-
- beginner
- Сообщения: 32
- Зарегистрирован: 18 окт 2011, 18:10
- Версия LabVIEW: 8.6;2012
- Откуда: Москва
- Контактная информация:
Re: Цикл в цикле
Подскажите, есть ли смысл создания программы из большого количества подпрограмм(модулей)?dadreamer писал(а): Если разберётесь со state machine и оформите программу в виде параллельных циклов, то не будет необходимости в двойных циклах. Вы можете создать сколько угодно циклов для чтения информации с каких угодно устройств, и они будут работать независимо от остального кода.
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 126 раз
- Контактная информация:
Re: Цикл в цикле
Если вы о SubVI, то смысл есть, но нужно понимать, зачем это делается. Вообще, согласно идеологии программирования в , любая диаграмма должна помещаться на экран монитора. Допускается создавать строго горизонтальный код (слева направо) или вертикальный (сверху вниз). Часто этот идеал бывает недостижим. Тогда имеет смысл поместить некоторые части кода в SubVI, чтобы обеспечить компактность всей программы. Другой пример, когда использование SubVI актуально, это использование одного и того же кода в разных местах программы. Проще вызывать один и тот же инструмент, чем копировать идентичный код. Плюс, отладка и модификация одного SubVI намного проще, нежели работа с одинаковыми участками кода. SubVI также могут быть использованы для работы в параллельных циклах при многопоточных вызовах (реентерантное выполнение). Так что вполне естественно рассматривать SubVI просто как подпрограмму (процедуру/функцию) в текстовых языках программирования.SusLiK495 писал(а):Подскажите, есть ли смысл создания программы из большого количества подпрограмм(модулей)?
Если задача должна быть независимой от других задач, то она должна выполняться параллельно остальному коду, и это логично. Так исключается влияние одних участков кода на другие. И кроме того проще отладка: вы можете изменять или удалять элементы параллельного цикла, а остальные циклы останутся работоспособны. Можно попросту отключить один цикл и это не нарушит работоспособность остальной программы (учитывая, что цикл обработки UI событий и state-цикл останутся на месте).SusLiK495 писал(а):Спасибо ещё раз за информацию, буду читать. Но я ведь правильно понимаю, что главный и основной принцип это распараллеливание задач?
А что к примеру мешает сделать subVI тогда? Или это всё равно будет другое? Т.е. грубо говоря сделать цикл чтения под программой и вынести вне цикла.
Что касается state machine, то это просто довольно удобная архитектура. Удобство её в том, что из любого состояния программы можно перейти в любое другое, достаточно лишь изменить значение сдвигового регистра. Таких состояний можно создать сколь угодно много, и ими легко управлять. Закладывая заранее шаблон state machine, вы облегчаете себе жизнь в будущем, когда проект разрастётся и потребуются корректировки.
Можно в принципе обойтись даже одним циклом state machine безо всякого распараллеливания. Но вы потеряете часть гибкости и универсальности: в один цикл придется поместить всю работу с устройствами и всю логику. Рано или поздно попросту запутаетесь в проводах, регистрах, индикаторах.