Цикл в цикле

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

Цикл в цикле

Сообщение SusLiK495 »

Добрый день, есть такая проблема:в программе есть запись в прибор через rs 232. Отправка идёт 3-х разных команд. Соответственно в While loop есть case в котором указаны необходимые команды, но при этом необходимо считывать ответ в реальном времени, но это происходит не корректно, так как чтение само идёт через while loop. В итоге я имею while loop в while loop и строка из прибора(длина которой стабильно 32 байта) читается кусками 23, 7, 19 байтов. Я пытался и с условиями остановки цикла чтения играть (not, or, and) и выносить чтение в отдельную подпрограмму и ставить вне цикла, ничего не выходит. Подскажите пожалуйста, есть ли возможность нормально организовать чтение внутри while loop?

Аватара пользователя
Jakob Brontfeyn

Activity Gold Silver Black
expert
expert
Сообщения: 1704
Зарегистрирован: 28 фев 2008, 11:01
Награды: 6
Репутация: 0
Контактная информация:

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

Сообщение Jakob Brontfeyn »

начало цикла
передал первую команду, подождал и прочел на нее ответ
передал вторую команду, подождал и прочел на нее ответ
передал третью команду, подождал и прочел на нее ответ
идем в начало цикла

Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3486
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Репутация: 0
Версия LabVIEW: 2.5 — 2020
Контактная информация:

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

Сообщение dadreamer »

SusLiK495 писал(а):необходимо считывать ответ в реальном времени

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

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

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

Сообщение SusLiK495 »

Jakob Brontfeyn Сегодня, 17:46

начало цикла
передал первую команду, подождал и прочел на нее ответ
передал вторую команду, подождал и прочел на нее ответ
передал третью команду, подождал и прочел на нее ответ
идем в начало цикла


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

dadreamer Сегодня, 18:45

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


Спасибо за ответ, как я уже написал выше, цикл запускается в теле программы, которая по сути один большой while loop. Как в данном случае разнести их?

Borjomy_1

Activity Professionalism Silver
expert
expert
Сообщения: 1917
Зарегистрирован: 28 июн 2012, 09:32
Награды: 3
Репутация: 0
Версия LabVIEW: 4-8.6,9-14
Откуда: город семи холмов

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

Сообщение Borjomy_1 »

А что, нельзя заказать сразу прием 32 байт? Зачем цикл какой-то городить?
Выдали строку, заказали прием 32 байт. последовательно.
Вложения
s1.PNG

Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3486
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Репутация: 0
Версия LabVIEW: 2.5 — 2020
Контактная информация:

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

Сообщение dadreamer »

SusLiK495 писал(а):Как в данном случае разнести их?

Ну, вот взять хотя бы пример из соседней темы: http://stackoverflow.com/questions/2067 ... k-possible В одном цикле читаете, в другом обрабатываете. Вместо User Event'а можно использовать очередь или нотифаер.

Аватара пользователя
Jakob Brontfeyn

Activity Gold Silver Black
expert
expert
Сообщения: 1704
Зарегистрирован: 28 фев 2008, 11:01
Награды: 6
Репутация: 0
Контактная информация:

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

Сообщение Jakob Brontfeyn »

Как то раз, я успешно применил такую методу.
Пусть некое устройство, пусть совершенно спонтанно передает на компорт некие посылки, пусть даже переменной длины.
Но никогда они не идут стык в стык, между ними всегда есть временной интервал несколько десятков милисекунд как минимум.
Я читаю в зикле с задержкой пусть, 2-5 мс количество байтов в буфере приема.
Если скажен 3 раза подряд это одинаковая величина(но не нуль), я интерпретирую это, как конец посылки и считываю буфер.

Borjomy_1

Activity Professionalism Silver
expert
expert
Сообщения: 1917
Зарегистрирован: 28 июн 2012, 09:32
Награды: 3
Репутация: 0
Версия LabVIEW: 4-8.6,9-14
Откуда: город семи холмов

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

Сообщение Borjomy_1 »

Мдя... на что люди только не идут, лишь-бы не организовывать стандартные и надежные решения обмена по последовательному протоколу.

Аватара пользователя
Jakob Brontfeyn

Activity Gold Silver Black
expert
expert
Сообщения: 1704
Зарегистрирован: 28 фев 2008, 11:01
Награды: 6
Репутация: 0
Контактная информация:

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

Сообщение Jakob Brontfeyn »

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

Borjomy_1

Activity Professionalism Silver
expert
expert
Сообщения: 1917
Зарегистрирован: 28 июн 2012, 09:32
Награды: 3
Репутация: 0
Версия LabVIEW: 4-8.6,9-14
Откуда: город семи холмов

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

Сообщение Borjomy_1 »

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

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

Аватара пользователя
Jakob Brontfeyn

Activity Gold Silver Black
expert
expert
Сообщения: 1704
Зарегистрирован: 28 фев 2008, 11:01
Награды: 6
Репутация: 0
Контактная информация:

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

Сообщение Jakob Brontfeyn »

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

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

Ну скажете, тоже , рублем..., только тайваньской и южнокорейской денежной еденицей,
ну долларом и евро еще, их можно бить, то бишь не покупать у них недорогие и надежные
пертативные устройства для лаборатории, со своей собственной цифровой индикацией,
из за "нестандартности" коммуникации по RS232 с компьютером.
download/file.php?id=6801&mode=view

Аватара пользователя
IvanLis

Activity Professionalism Tutorials Gold Man of the year 2012
Автор
professor
professor
Сообщения: 4924
Зарегистрирован: 02 дек 2009, 17:44
Награды: 7
Репутация: 0
Версия LabVIEW: 2015, 2016
Откуда: СССР

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

Сообщение IvanLis »

Jakob Brontfeyn писал(а):Ну скажете, тоже , рублем..., только тайваньской и южнокорейской денежной еденицей,
ну долларом и евро еще, их можно бить, то бишь не покупать у них недорогие и надежные
пертативные устройства для лаборатории, со своей собственной цифровой индикацией,
из за "нестандартности" коммуникации по RS232 с компьютером.


Яков, скорее всего, Вы драматизируете ситуацию.
Я не встречал еще ни одного, даже самого простого и дешевого контроллера имеющего внешний интерфейс, в котором бы не использовался "терминатор" (терминальный бит).
Просто нужно посмотреть документацию и описание протокола.
Киньте название и ссылку на описание одного из своих якобы "кривых" устройств, наверняка там все описано.

Аватара пользователя
Jakob Brontfeyn

Activity Gold Silver Black
expert
expert
Сообщения: 1704
Зарегистрирован: 28 фев 2008, 11:01
Награды: 6
Репутация: 0
Контактная информация:

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

Сообщение Jakob Brontfeyn »

Иван, нет никакой драматизации ситуации, проекты эти с термометром, гигрометром и pH-метром давно сделаны, закрыты и забыты, не было описаний протоколов, приходилось подслушивать компорты различными методами при работе с фирменным софтом этих приборов, чтобы встроить в свое лабвьюшное приложение.
Из популярных приборов серий ADAM, NUDAM, ICP, которые я уже давно и сейчас активно применяю, структура посылки содержит только признак начала ">" длина бывает разной, признак конца " \r", адрес прибора отправителя отсутствует.
Смотри на картинке справа внизу, там два модуля измерительных I-7019 и один:
релеиный управляющий I-7065
http://www.labviewportal.org/download/f ... &mode=view
Работают эти модули жестко в магистрали RS485, посылка опроса от PC должна быть с адресом.
Мой алгоритм приема вообще не анализирует, символы начала, конца и саму длину посылки, а анализирует только "первую производную" от количества символов в буфере приема и неравенство нулю, это мое ноу-хау. Работает очень хорошо, потому что не считывает не законченную посылку. Берите пользуйтесь.
Как то один пользователь в форуме имел проблемы, кажется это был флюгер с анемометром, это ему очень помогло.

Аватара пользователя
IvanLis

Activity Professionalism Tutorials Gold Man of the year 2012
Автор
professor
professor
Сообщения: 4924
Зарегистрирован: 02 дек 2009, 17:44
Награды: 7
Репутация: 0
Версия LabVIEW: 2015, 2016
Откуда: СССР

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

Сообщение IvanLis »

Jakob Brontfeyn писал(а):Из популярных приборов серий ADAM, NUDAM, ICP, которые я уже давно и сейчас активно применяю, структура посылки содержит только признак начала ">" длина бывает разной, признак конца " \r", адрес прибора отправителя отсутствует.
......
Мой алгоритм приема вообще не анализирует, символы начала, конца и саму длину посылки, а анализирует только "первую производную" от количества символов в буфере приема и неравенство нулю, это мое ноу-хау.
Работает очень хорошо, потому что не считывает не законченную посылку. Берите пользуйтесь.


Яков, Вы же не берете и не наматываете на обод лейкопластырь, чтобы было мягче ездить. . А наверное одеваете камеру и покрышку :dntknw: ? Еще например когда-то кишку овцы использовали (https://ru.wikipedia.org/wiki/%D0%9F%D1 ... 0%B8%D0%B2).... Как бы-то ни было, именно они для этого предусмотрены....

Тоже самое, что бы Вы не выдумывали различные "извращения" и не нагружали процессор ненужными потугами, производители оборудования договорились, стандартизировали и используют "терминатор".
При конфигурировании VISA (http://zone.ni.com/reference/en-XX/help ... rial_port/) достаточно обозначить termination char и включить механизм Enable Termination Char...
И по велению... Вашему, VISA без всяких "извращений" (<-- прошу прощения за прямоту, это именно мое мнение) типа побитового чтения, склейки, и т.д. и т.п. VISA Read (http://zone.ni.com/reference/en-XX/help ... visa_read/) будет возвращать именно строку целиком - read buffer (за исключением самой первой).

Он по этому и называется "терминатор", и производитель Вам явно на него указывает и гарантирует, что он больше нигде не встречается в посылке, кроме как в конце строки!
А Вы сами делаете неверно, но это чисто Ваши трудности, но еще и учите этому других!

Аватара пользователя
Jakob Brontfeyn

Activity Gold Silver Black
expert
expert
Сообщения: 1704
Зарегистрирован: 28 фев 2008, 11:01
Награды: 6
Репутация: 0
Контактная информация:

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

Сообщение Jakob Brontfeyn »

И где у меня наблюдается побитовое чтение и склейка, что то Вы не так поняли.

Ответить

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