господа знатоки, нужен свежий взгляд на БД.
я не могу понять, в чём разница, и почему две функции ведёт себя кардинально по-разному.
в принципе, знание и наличие NXT-модуля не требуется, хотя вопрос и связан с ним.
ситуация: есть ультразвуковой датчик, измеряющий расстояние до препятствия. есть функция, позволяющая получить с него данные.
но, проблема в том, что где-то там закралась ошибка: если датчик перестаёт видеть цель (т.е расстояние до препятствия больше полутора метров), то то функция возвращает не 255 (это для неё бесконечность), а последнее значение. например, едет робот вдоль стенки, на которую смотрит ультрасоником, пусть на расстоянии 20см. и тут стена кончается (или угол). и датчик должен выдать 255, а он выдаёт "едем стабильно, 20см".
ну баг и баг. копать будем.
в пакете версии 2012 кроме функции "Sonar_cm.vi", которая ведёт себя странно, есть функция "NXT_DistanceSensor.vi", которая делает то же самое, но без того странного глюка. О!, это же решение, надо всего лишь посмотреть, как она работает, и исправить ошибку! но не тут-то было.
проведённый эксперимент:
тут у первой функции извлечены внутренности, чтоб можно было на экран вывести успешность операции.
к контроллеру подключено два датчика, они смотрят на одно и то же препятствие, программа запускается.
в итоге на экране (после исчезновения стены):
67
255
Т
т.е. первый датчик (с первой функцией) "замёрз"
лезу внутрь функция и начинаю переставать понимать, почему так - я никак не могу найти принципиальных различий.
для того, чтоб на код могли глянуть и те, у кого нет нужного пакета, я его в картинки перевёл, плюс вынул все внутренности на поверхность. оставлял только те функции, которые вызываются в обоих вариантах.
это алгоритм работы Sonar_cm.vi
в нём дважды вызывается функция i2c_sensors.vi с разными параметрам. второй вызов я не стал потрошить для экономии пространства (в последнем ряду - grab data оставлена)
теперь то же самое для NXT_DistanceSensor.vi
что я вижу:
1) конфигурируется датчик одной и той же функцией с одними и теми же параметрами.(не схожими, а именно одной и той же "LEGO.SetTypeAndMode.vi")
2) если это первый вызов функции, то в порт отправляется 2-41-2, ничего не читается
3) в порт отправляется 2-42 с запросом одного байта
4) в случае успешного прочтения оного, этот байт возвращается, плюс он сохраняется в массиве на случай будущих багов.
5) если же баг - вернуть последнее хорошее значение из того самого массива.
что я не упускаю? чем эти функции принципиально отличаются?
в приложении также сами vi (LV12).
нужен свежий взгляд
-
- professor
- Сообщения: 3409
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 49 раз
- Поблагодарили: 176 раз
- Контактная информация:
нужен свежий взгляд
- Вложения
-
- us-standart.vi
- (41.37 КБ) 198 скачиваний
-
- us-native.vi
- (4.88 КБ) 174 скачивания
-
IvanLis
- guru
- Сообщения: 5467
- Зарегистрирован: 02 дек 2009, 17:44
- Награды: 7
- Версия LabVIEW: 2015, 2016
- Откуда: СССР
- Благодарил (а): 28 раз
- Поблагодарили: 88 раз
Re: нужен свежий взгляд
Сложно зрительно, да еще когда не работал с этим железом.
Чисто гипотетически, с датчиком должен стоять контроллер. Возможно у него есть переключение режимов, т.е. что возвращать в случае ошибки: 255 или последнее значение.
Что касается отличий, мне сразу бросился в глаза параметр Return Length (Sonar_cm.vi = "0", а NXT_DistanceSensor.vi = "1"), что в принципе странно.
Чисто гипотетически, с датчиком должен стоять контроллер. Возможно у него есть переключение режимов, т.е. что возвращать в случае ошибки: 255 или последнее значение.
Что касается отличий, мне сразу бросился в глаза параметр Return Length (Sonar_cm.vi = "0", а NXT_DistanceSensor.vi = "1"), что в принципе странно.
Знание нескольких принципов освобождает от знания многих фактов!
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
-
mzu2006
- doctor
- Сообщения: 2456
- Зарегистрирован: 16 авг 2008, 02:12
- Награды: 3
- Версия LabVIEW: 7.1 10 11 12
- Откуда: St-Petersburg (RU), Phila, Boston, Washington DC
- Контактная информация:
Re: нужен свежий взгляд
Довольно непросто найти небольшие отличия в двух сложных картинках. Кроме того, в LabVIEW кое-что бывает и спрятано. Cделайте lvdiff на обе VI и напишите сюда список отличий.
Правила форума (Forum rules in Russian)
rm -rf /mnt/windows
rm -rf /mnt/windows
-
- professor
- Сообщения: 3409
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 49 раз
- Поблагодарили: 176 раз
- Контактная информация:
Re: нужен свежий взгляд
но настройка датчика происходит одинаково (функция LEGO.SetTypeAndMode.vi), по крайней мере я не нашёл различийIvanLis писал(а):Чисто гипотетически, с датчиком должен стоять контроллер. Возможно у него есть переключение режимов, т.е. что возвращать в случае ошибки: 255 или последнее значение.
в данном случае различий нет - в Sonar_cm.vi я вытащил наружу только первый вызов функции i2c_sensors.vi, при котором датчик настраивается на непрерывный опрос, там после записи в буфер параметров не идёт считывание (проверка перед кейсом даёт F и вариант со считыванием не отрабатывается.IvanLis писал(а):Что касается отличий, мне сразу бросился в глаза параметр Return Length (Sonar_cm.vi = "0", а NXT_DistanceSensor.vi = "1"), что в принципе странно.
при втором вызове - там где стоит комментарий "grab data" Return Length =1, там ещё раз вызывается вся эта простыня, но уже с заходом в вариант кейса, в котором идёт считывание данных
а в NXT_DistanceSensor.vi функция не пытается считывать данные после настройки, там, где коммент "firt call after..." буфер так же =0, а при втором вызове = 1
lvdiff никогда не пробовал, может что не так делаю, но по инструкцииmzu2006 писал(а):Cделайте lvdiff на обе VI и напишите сюда список отличий.
в cmd пишу:
lvdiff "C:\Program Files (x86)\National Instruments\LabVIEW 2012\vi.lib\NXT\Remote Library\Distance Sensor\NXT_DistanceSensor.vi" "C:\Program Files (x86)\National Instruments\LabVIEW 2012\vi.lib\NXT\Dual Mode Library\Sensors\Sonar_cm.vi"
открывается стандартное окно compare, но там чисто косметические сравнения, а косметика там очень сильно отличается, так что найти реальные отличия не получается.
других де сравнений данный способ мне не поведал.
-
- professor
- Сообщения: 3409
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 49 раз
- Поблагодарили: 176 раз
- Контактная информация:
Re: нужен свежий взгляд
разницу нашёл и проверил в эксперименте - в работающей функции спрятана принудительная задержка 50мс.
если опрашивать датчик чаще, ему башню сносит на дальних дистанциях
если опрашивать датчик чаще, ему башню сносит на дальних дистанциях