Разделение перменных с последовательного серийного порта

VISA, TCP/IP, USB, CAN, GPIB и подобные протоколы
ССС
interested
interested
Сообщения: 8
Зарегистрирован: 13 июн 2013, 14:07
Версия LabVIEW: 2012
Контактная информация:

Разделение перменных с последовательного серийного порта

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

Добрый день. Сравнительно недавно начал работать с LabView. Прошу помощи в вопросе с серийным портом. С помощью VISA принимаю данные с устройства через серийный порт. Устройство передает информацию с в виде двух переменных, которые я указываю в загрузочной программе. Хочу строить график зависимости между этими двумя переменными. Переменные, допустим x и у (числа могут варьироваться от 0 до 400), подаю в виде строки. Для удобства указываю, чтобы они подавались через пробел, то есть: x y x y x y и т. д. В случае с одной переменной ( x x x x x x ) всё прекрасно подается на блок Scan From String и считывается на контроле, изменяя значение с каждым x. Соответственно и график строится замечательно. Но не знаю как быть с двумя переменными, получается постоянное чередование x и y. Помогите, пожалуйста. Как можно их направить на разные оси графика?
Аватара пользователя
Super Star
adviser
adviser
Сообщения: 228
Зарегистрирован: 07 фев 2013, 08:37
Версия LabVIEW: 2011

Re: Разделение перменных с последовательного серийного порта

Сообщение Super Star »

сканируй как сканировал, получишь массив, где четное - У, нечетной - Х.
я люблю свою работу.... Я приду сюда в субботу ...
Аватара пользователя
Oleg B.

Activity Professionalism
leader
leader
Сообщения: 674
Зарегистрирован: 25 сен 2011, 11:30
Награды: 2
Версия LabVIEW: 5 .. 2021
Откуда: Israel
Контактная информация:

Re: Разделение перменных с последовательного серийного порта

Сообщение Oleg B. »

ССС писал(а):Переменные, допустим x и у (числа могут варьироваться от 0 до 400), подаю в виде строки. Для удобства указываю, чтобы они подавались через пробел, то есть: x y x y x y и т. д.
В подобной ситуации, пробел - опасный разделитель.
Правильнее назначить разные разделители - например & и ;
Тогда принимаемый техт будет выглядеть так:
x&y;x&y;x&y;x&y;x&y;x&y;x&y;x&y; (если в тексте будут пробелы - не беда)
После разделения по ; получаем -> x&y x&y x&y x&y x&y x&y x&y
Разделить пару на два числа тоже просто.
При подобном подходе у Вас никогда не перепутаются x и y - даже в случае сбоя в канале связи.
veni, vidi, phallomorphi
ССС
interested
interested
Сообщения: 8
Зарегистрирован: 13 июн 2013, 14:07
Версия LabVIEW: 2012
Контактная информация:

Re: Разделение перменных с последовательного серийного порта

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

Super Star писал(а):сканируй как сканировал, получишь массив, где четное - У, нечетной - Х.
Спасибо. Да, у меня была такая мысль, но счетчик сделать не получается. Не могу понять, как мне разделить четные и нечетные числа. Может быть есть какой-нибудь наглядный пример реализации похожего алгоритма?
Oleg B. писал(а):
ССС писал(а):Переменные, допустим x и у (числа могут варьироваться от 0 до 400), подаю в виде строки. Для удобства указываю, чтобы они подавались через пробел, то есть: x y x y x y и т. д.
В подобной ситуации, пробел - опасный разделитель.
Правильнее назначить разные разделители - например & и ;
Тогда принимаемый техт будет выглядеть так:
x&y;x&y;x&y;x&y;x&y;x&y;x&y;x&y; (если в тексте будут пробелы - не беда)
После разделения по ; получаем -> x&y x&y x&y x&y x&y x&y x&y
Разделить пару на два числа тоже просто.
При подобном подходе у Вас никогда не перепутаются x и y - даже в случае сбоя в канале связи.
Спасибо. Так тоже пытался сделать. Не подскажите как делить? Получается, что деление нужно производить до блока Scan From String, иначе ошибка из-за формата данных. Я делю функцией Match Pattern. Выражение указываю просто как ";". Но на выходе выражения до и после не такие как нужно. На всякий случай прилепил скриншот, если что-то описываю не так.
Вложения
MP.png
Аватара пользователя
dadreamer

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

Re: Разделение перменных с последовательного серийного порта

Сообщение dadreamer »

ССС писал(а):Спасибо. Да, у меня была такая мысль, но счетчик сделать не получается. Не могу понять, как мне разделить четные и нечетные числа. Может быть есть какой-нибудь наглядный пример реализации похожего алгоритма?
Посмотрите пример...
Вложения
Untitled 1.vi
LV2011
(10.03 КБ) 224 скачивания
ССС
interested
interested
Сообщения: 8
Зарегистрирован: 13 июн 2013, 14:07
Версия LabVIEW: 2012
Контактная информация:

Re: Разделение перменных с последовательного серийного порта

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

dadreamer писал(а):
ССС писал(а):Спасибо. Да, у меня была такая мысль, но счетчик сделать не получается. Не могу понять, как мне разделить четные и нечетные числа. Может быть есть какой-нибудь наглядный пример реализации похожего алгоритма?
Посмотрите пример...
Спасибо, не совсем разобрался в алгоритме, но к моей схеме применимо. Нашел другую проблему. Входная строка из буфера от VISA поступает не коррекстно через некоторый промежуток времени. Это применимо и к подаче одной переменной. Строка сдвигается, то есть может начинаться не с первой цифры числа и, соответственно, и заканчиваться не последней или тем же пробелом. Я так понимаю, что это связано с числом бит, которые мы указываем для чтения VISA, и с тем, что числа меняются от единиц до сотен. Менять число бит помогает только когда числа примерно одинаковы. Как можно устранить такой сдвиг?
Вложения
Сдвиг.png
Аватара пользователя
dadreamer

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

Re: Разделение перменных с последовательного серийного порта

Сообщение dadreamer »

ССС, если пробелы расположены в начале/в конце строки, то поможет Trim Whitespace из палитры String. Если же число в строке одно (что означает отсутствие пробелов вообще после Trim Whitespace, например, вместо "1 2" имеем "1"), то проще всего до цикла конвертации в массив проверять строку на пробел. Если его нет, то сразу превращать в одно число. Иначе, прогонять через цикл.
ССС
interested
interested
Сообщения: 8
Зарегистрирован: 13 июн 2013, 14:07
Версия LabVIEW: 2012
Контактная информация:

Re: Разделение перменных с последовательного серийного порта

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

dadreamer, но ведь строка после выхода из VISA может начинаться как с пробела, так и с числа. Причем вместо числа 105, она начинается с 5 (как видно на скриншоте в предыдущем сообщении). Нужно исправить это, прежде чем подавать строку на Trim Whitespace. Иначе значение 5 все равно будет восприниматься, как число. Я правильно понимаю?
Аватара пользователя
dadreamer

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

Re: Разделение перменных с последовательного серийного порта

Сообщение dadreamer »

ССС, да, всё верно, нужно устранить причину обрезания данных, иначе получите неверные числа. Попробуйте использовать Bytes At Port, пример здесь. И наверное стоит мало-мальски сконфигурировать порт перед работой: http://www.labviewportal.org/viewtopic. ... 337#p50327
ССС
interested
interested
Сообщения: 8
Зарегистрирован: 13 июн 2013, 14:07
Версия LabVIEW: 2012
Контактная информация:

Re: Разделение перменных с последовательного серийного порта

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

dadreamer, спасибо, посмотрю. Я вот пока проблему эту решил с помощью подачи переменной каждый раз с новой строки. Теперь это число сразу же на выходе VISA Read меняется мгновенно, то есть меняется строка содержит только X и сразу же заменяется следующей строкой X. То, что надо для подачи одной переменной. Вообщем, значение меняется с каждым новым x, никуда не сдвигаясь, только уже строки с пробелами нет. Соответственно и x с y будут так же меняться. Но как теперь мне организовать счетчик, чтобы он считал каждое новое значение и выделял четные и нечетные? Не могу проследить по тому примеру. Вообщем, задача почти та же, что в была начале.
Аватара пользователя
dadreamer

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

Re: Разделение перменных с последовательного серийного порта

Сообщение dadreamer »

ССС писал(а):Но как теперь мне организовать счетчик, чтобы он считал каждое новое значение и выделял четные и нечетные? Не могу проследить по тому примеру. Вообщем, задача почти та же, что в была начале.
Вы просто сложите все числа в один массив, а разделите его потом уже, после всех операций. Это делается с помощью Decimate 1D Array, на выходе будут два массива - с четными элементами и с нечетными.
ССС
interested
interested
Сообщения: 8
Зарегистрирован: 13 июн 2013, 14:07
Версия LabVIEW: 2012
Контактная информация:

Re: Разделение перменных с последовательного серийного порта

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

Я стал подавать оба числа в одной строке через пробел. Получилась обновляемая строка с двумя числами, ну а разделить их труда не составило. Я вот только не пойму, почему на графике отражается одна точка, вроде массив создаю перед графиком. Подскажите, пожалуйста, как изменить подключение X-Y Graph, чтобы линия по точкам строилась, а не одна точка бегала туда-сюда :think: ?
Вложения
Схема+график.png
Аватара пользователя
dadreamer

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

Re: Разделение перменных с последовательного серийного порта

Сообщение dadreamer »

ССС, накапливайте массив из точек, после цикла выводите сразу на график.
ССС
interested
interested
Сообщения: 8
Зарегистрирован: 13 июн 2013, 14:07
Версия LabVIEW: 2012
Контактная информация:

Re: Разделение перменных с последовательного серийного порта

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

dadreamer, в таком случае график будет строиться после считывания всех данных с устройства? Если так, то каким способом я могу делать это в реальном времени, чтобы одновременно с изменением данных видеть эти изменения на графике?
Аватара пользователя
IvanLis

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

Re: Разделение перменных с последовательного серийного порта

Сообщение IvanLis »

ССС писал(а):каким способом я могу делать это в реальном времени, чтобы одновременно с изменением данных видеть эти изменения на графике?
по образцу: http://www.labviewportal.org/viewtopic. ... 318#p48330
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Коммуникация с приборами»