Скачки при считывании
-
- beginner
- Сообщения: 33
- Зарегистрирован: 27 фев 2008, 01:19
- Версия LabVIEW: 7.0 и 8.6
- Откуда: Россия/Клин
- Контактная информация:
Скачки при считывании
Здравствуйте! При написании программы, столкнулся с небольшой проблемой. Суть проблемы заключается в следующем: получая массив данных с прибора, я заметил периодически появляющиеся «скачки» (значения в массиве обнуляются).Чем это может быть вызвано? Связь с прибором осуществляется при помощи COM порта.На данный прибор написаны аналогичные программы на C++ и Delphi и подобных проблем не возникало. За ранее спасибо.
-
Eugen Graf
- guru
- Сообщения: 6502
- Зарегистрирован: 13 ноя 2007, 02:20
- Награды: 4
- Версия LabVIEW: 2009
- Откуда: Saarbrücken
- Контактная информация:
Re: Не могу добиться стабильной работы прибора.
Это связано с таймаутом при чтении данных с порта. Обнуление данных происходит из за того, что ты ждёшь данные, а они в течении определённого времени не приходят с порта. Это время устанавливается при конфигурации порта (обычно это 10 секунд). Я знаю три выхода из этой ситуации:
1. поставить ооочень большой таймаут при конфигурации
2. всю диаграмму находящуюся после считывания данных с порта поместить в свичь кейс, условием которого является ошибка исходящая при чтении с порта.
3. использовать систему ивентов (интерраптов) порта
Советую использовать второй вариант, т.к первый и третий не очень совместимы с драйвером VISA.
Лучше всего загрузи на форум картинку куска блок диаграммы, отвечающего за конфигурацию и считывание порта.
1. поставить ооочень большой таймаут при конфигурации
2. всю диаграмму находящуюся после считывания данных с порта поместить в свичь кейс, условием которого является ошибка исходящая при чтении с порта.
3. использовать систему ивентов (интерраптов) порта
Советую использовать второй вариант, т.к первый и третий не очень совместимы с драйвером VISA.
Лучше всего загрузи на форум картинку куска блок диаграммы, отвечающего за конфигурацию и считывание порта.
-
- beginner
- Сообщения: 33
- Зарегистрирован: 27 фев 2008, 01:19
- Версия LabVIEW: 7.0 и 8.6
- Откуда: Россия/Клин
- Контактная информация:
Re: Не могу добиться стабильной работы прибора.
Выкладываю кусок программы отвечающий, за считывание с COM порта.
- Вложения
-
- Считывание с порта.vi
- (83.76 КБ) 273 скачивания
-
Eugen Graf
- guru
- Сообщения: 6502
- Зарегистрирован: 13 ноя 2007, 02:20
- Награды: 4
- Версия LabVIEW: 2009
- Откуда: Saarbrücken
- Контактная информация:
-
- beginner
- Сообщения: 33
- Зарегистрирован: 27 фев 2008, 01:19
- Версия LabVIEW: 7.0 и 8.6
- Откуда: Россия/Клин
- Контактная информация:
Re: Не могу добиться стабильной работы прибора.
Спасибо за предложенное решение! Но массив данных всеравно продолжает скакать, правда значительно реже, примерно каждые 40 секунд, причем обнуляется не весь массив, а лиш несколько значений, еще я заметил, что скачки происходят в момент, когда я пытаюсь загружать какие-нибудь программы.
-
Eugen Graf
- guru
- Сообщения: 6502
- Зарегистрирован: 13 ноя 2007, 02:20
- Награды: 4
- Версия LabVIEW: 2009
- Откуда: Saarbrücken
- Контактная информация:
Re: Не могу добиться стабильной работы прибора.
О каком массиве именно идёт речь? Попробуй перед тем как ты записываешь данные на порт обнулить буфер с помощью Flush. Может быть ты считываешь не те 13 байт которые нужно, а например половину последнего пакета и половину нужного.
А что за бяку ты записываешь на порт? При чём здесь число double 185? Вот этого я точно не понимаю, а ты?
А что за бяку ты записываешь на порт? При чём здесь число double 185? Вот этого я точно не понимаю, а ты?
- Вложения
-
- FlushBuffer.PNG (2.77 КБ) 11164 просмотра
-
- beginner
- Сообщения: 33
- Зарегистрирован: 27 фев 2008, 01:19
- Версия LabVIEW: 7.0 и 8.6
- Откуда: Россия/Клин
- Контактная информация:
Re: Не могу добиться стабильной работы прибора.
Это «бяка - 185» дает команду на передачу 4 значений Rt – сопротивления, взял я ее из протокола, кстати, схожий протокол я тебе отсылал. Прибор называется электронный термометр, определяющий температуру по 4 каналам. Данный термометр определяет температуру с помощью платиновых датчиков сопротивления. Кусок программы как раз и отвечает за передачу сопротивления с прибора. Думаю, пакет считываю я правильно, так как значения совпадают с прибором практически до сотой (0,01). Видимо проблема кроется в другом, на мой взгляд, она связана из-за постоянного изменения сопротивления датчика, я заметил если температура резко изменяется, то скачки появляются чаще, а при ее стабилизации программа работает практически идеально. Может мне нужно установить время опроса Com порта??? Вот как это сделать в LabVIEW правильно я не знаю. Пробовал ввести задержки в цикл Case Structure, но нужного результата мне это не дало!
-
Eugen Graf
- guru
- Сообщения: 6502
- Зарегистрирован: 13 ноя 2007, 02:20
- Награды: 4
- Версия LabVIEW: 2009
- Откуда: Saarbrücken
- Контактная информация:
Re: Не могу добиться стабильной работы прибора.
Обязательно проверь что ты отсылаешь, потому что эта бяка выглядит неправильно. Так это не делается, возьми лучше обычный Type Cast или же Flatten To String.
А время для считывания у тебя установлено при инициализации порта. Оно установлено по умолчанию на 10 секунд, попробуй увеличить это время, хотя я не думаю что в этом проблема. Ты знаешь как быстро реагирует прибор на команду? Я думаю быстрее чем 10 секунд, так что искать надо в другом месте.
Попробуй продибагить (жёлтая лампочка в меню) твою программу, посмотри как часто выскакивают ошибки при чтении.
А время для считывания у тебя установлено при инициализации порта. Оно установлено по умолчанию на 10 секунд, попробуй увеличить это время, хотя я не думаю что в этом проблема. Ты знаешь как быстро реагирует прибор на команду? Я думаю быстрее чем 10 секунд, так что искать надо в другом месте.
Попробуй продибагить (жёлтая лампочка в меню) твою программу, посмотри как часто выскакивают ошибки при чтении.
-
Eugen Graf
- guru
- Сообщения: 6502
- Зарегистрирован: 13 ноя 2007, 02:20
- Награды: 4
- Версия LabVIEW: 2009
- Откуда: Saarbrücken
- Контактная информация:
Re: Не могу добиться стабильной работы прибора.
Я по-моему нашёл в чём может быть проблема!!!
Ведь ты используешь бинарный протокол, а не ASCII. Поэтому при инициализации порта тебе надо обязательно указать, что ты не используешь Termination Character. Там сверху есть флэг, его надо поставить на False.
Termination Char используется для ASCII протоколов. Обычно это <cr><lf> то есть <новая строка><возврат каретки>, в общем обозначает конец строки. При чтении порта, прибор VISA Read считывает порт и заканчивает чтение если:
1. истекло установленое время Timeout
2. считалось установленое количество байт
3. в буфере чтения находится Termination Char, но конечно если при конфигурации порта он включен
У тебя Termination Char был включен, и если вдруг в пакете случайно он оказывался, что не исключено при использовании бинарных протоколов, то чтение прерывалось и ты на выходе получал неполный пакет, который заменялся на нули.
Ведь ты используешь бинарный протокол, а не ASCII. Поэтому при инициализации порта тебе надо обязательно указать, что ты не используешь Termination Character. Там сверху есть флэг, его надо поставить на False.
Termination Char используется для ASCII протоколов. Обычно это <cr><lf> то есть <новая строка><возврат каретки>, в общем обозначает конец строки. При чтении порта, прибор VISA Read считывает порт и заканчивает чтение если:
1. истекло установленое время Timeout
2. считалось установленое количество байт
3. в буфере чтения находится Termination Char, но конечно если при конфигурации порта он включен
У тебя Termination Char был включен, и если вдруг в пакете случайно он оказывался, что не исключено при использовании бинарных протоколов, то чтение прерывалось и ты на выходе получал неполный пакет, который заменялся на нули.
-
- beginner
- Сообщения: 33
- Зарегистрирован: 27 фев 2008, 01:19
- Версия LabVIEW: 7.0 и 8.6
- Откуда: Россия/Клин
- Контактная информация:
Re: Не могу добиться стабильной работы прибора.
Я отключил "Termination Char" и действительно при постоянном значение температуры скачки прикатились, но когда температура начинает резко меняться, они все-же имеют место быть, правда горазда реже. Может мне стоит сделать интервал времени через который, я буду получать значения Rt сопротивления? А вот как это сделать я не знаю. Мне ведь не обязательно постоянно получать данные с прибора, гораздо важнее иметь ровную кривую на графики совпадающую со значениями на приборе. Спасибо за помощь!!!
-
Eugen Graf
- guru
- Сообщения: 6502
- Зарегистрирован: 13 ноя 2007, 02:20
- Награды: 4
- Версия LabVIEW: 2009
- Откуда: Saarbrücken
- Контактная информация:
Re: Не могу добиться стабильной работы прибора.
Ну так добавь задержку "Wait(ms).VI" например в 100 милисекунд перед каждым "VISA Write.VI" или просто в общий цикл While.
-
- beginner
- Сообщения: 33
- Зарегистрирован: 27 фев 2008, 01:19
- Версия LabVIEW: 7.0 и 8.6
- Откуда: Россия/Клин
- Контактная информация:
Re: Не могу добиться стабильной работы прибора.
Я сделал немножко подругому.Заметив, что значения в результате скачка меняются на одну и туже величину, я поместил значение Rt в цикл Case Structur, а условием цикла задал сравнения с приблизительно нужным результатом. Теперь в тот момент, когда происходит скачок, у меня остается последнее значения удовлетворяющая заданному условию. Конечно это не совсем правильный выход из ситуации, но теперь хоть можно провести исследования в автоматическом режиме, хотя в дальнейшим хотелось бы разобраться с этой проблемой. Огромное спасибо за помощь!
-
Eugen Graf
- guru
- Сообщения: 6502
- Зарегистрирован: 13 ноя 2007, 02:20
- Награды: 4
- Версия LabVIEW: 2009
- Откуда: Saarbrücken
- Контактная информация:
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
- 19 Ответы
- 5223 Просмотры
-
Последнее сообщение jane_wild
-
- 23 Ответы
- 4626 Просмотры
-
Последнее сообщение maxim_MA
-
- 6 Ответы
- 1639 Просмотры
-
Последнее сообщение ladik
-
- 38 Ответы
- 13298 Просмотры
-
Последнее сообщение AndreyDmitriev
-
- 2 Ответы
- 270 Просмотры
-
Последнее сообщение Optoelectronics