Всем привет.
Довольно долго велись поиски проблемы низкой скорости при прошивке блоков управления при помощи адаптера Wifi_K-line . Если быть точнее, то пол года, не меньше. Не скажу, что занимался только этой задачей, но внимания уделялось ей много.
В поисках решений мне много помог Влад qwerty095, за что ему большое спасибо.
Собственно о чём речь…
Время чтения прошивки с блока Январь 7.2 составляло ~2 минуты. Пакеты с адаптера на ПК и обратно летели очень тухло. Было видно как "редко" моргает светодиод отправки данных. Но стоило просто запустить браузер "Chrome", пошевелить мышкой на форме и скорость в разы увеличивалась! Установка связи с блоком проходила за пару секунд! Более наглядно эффект можно посмотреть в видео:
Вот так появился вопрос: "Каким образом активность браузера так увеличивает скорость?!"
Поиски были долгими и с разных направлений. Одним из предположений было, что браузер меняет приоритет системы работы с сетью или режим работы служб QoS. Был скачан сниффер TCP и разобран протокол общения ОС с сетью. Были проверены временные задержки между отправкой пакетов на ПК и получением их на адаптере. Всё было красиво, пакеты доставлялись в пределах пинга, меньше 1 мс. Ясным стал лишь факт, что скорость зависела от задержки между отправкой пакетов. Предполагалось, что VSPD вносит свои задержки со стороны COM- моста, но это не подтвердилось.
В общем, много было предположений, но всё мимо, пока не наткнулся на интересную забугорную статью о проблемах работы библиотеки System.IO.Ports .NET. В статье очень "красиво" поливали грязью разработчиков этого чуда и были приведены факты, что ряд методов этой библиотеки работают неадекватно и их нельзя использовать при обработке данных. Многие глюки ранее я уже обнаружил и наставил "костылей", а некоторые не знал. Также было сказано, что в библиотеке используется стандартный системный таймер с разрешением 15 мс.
После прочтения и осмысливания данной статьи пришлось отказаться от этой библиотеки и разобраться в прямой работе с драйвером Win32 API. Попутно была изучена работа с видеотаймером, который позволяет получить разрешение меньше 1 мс.
Также было принято решение полностью переработать программу Wifi_tuner на основе новых знаний с созданием отдельных классов и их взаимодействия без нарушения принципов ООП.
В добавок был разработан свой протокол общения между программой на ПК и адаптером Wifi_k-line, который в себя включает заголовок, тип данных, длину и контрольную сумму. Теперь сводится на нет возможность пересечения служебных и полезных данных.
После проделанных изменений появилась программа Wifi-OBDII Dridge. По сути, это новая программа, написанная с чистого листа, но сохранившая интерфейс и фундаментальные принципы Wifi_tuner. Да, название решил сменить т.к., по факту, она ничего не настраивает и изначально название дал некорректное.
Внешний вид Wifi-OBDII Dridge:

Как видно, интерфейс остался почти без изменений. Добавлено два таймаута, поле с отображением количества пакетов в секунду и активация нового алгоритма связи.
Сравнение скорости прошивки Январь 7.2 наглядно можно увидеть в видео:
На старом алгоритме при установке связи скорость была 6 п/с, а на новом :

Разница в 5 раз! На мой взгляд, достойно!
Общее время чтения прошивки:
Было: 2 мин 5 с.
Стало: 27 с.
Время записи прошивки:
Было: 2 мин 17 с.
Стало: 37 с.
Скорость работы с прошивкой ТРС на новом алгоритме:
Разница незначительна. Количество пакетов увеличилось с 10 до 12.
Скорость работы с пакМАН на новом алгоритме:
Разницы совсем нет. Видимо на программном уровне реализована выдача диагностики раз в 100 мс. Положительный момент переработки в том, что теперь оболочка работает с типом адаптера USB-FTDI.
Вывод.
Таким образом получилось:
— снизить задержки между пакетами, что актуально для коротких посылок;
— более чем в 4,5 раза увеличить скорость чтения и записи прошивки на Январь;
— стабильно получать 12 п/с при работе с ТРС на длинной диагностике;
— заставить работать оболочку пакМАН с типом адаптера USB-FTDI.
— повысить стабильность связи за счёт применения своего протокола связи и отказа от библиотеки .NET.
Спасибо за внимание!
Комментарии 19
Мало. Матрица 24 пакета дает на длинной диагностике. (при этом значительно более длинной чем у TRS длинная)…
Мало или много можно долго рассуждать. Кто-то рад 10 пакетам, а кому-то 20 мало. Моя задача, по отношению к скорости, сделать не хуже проводного адаптера. Кабель (на Ft232rl) позволяет получить 12 п/с на длинной диагностике ТРС. Мне удалось эти же 12 п/с получить по WiFi. На софте j73 народ получает 22 пакета на моих адаптерах (длину диагностики не знаю). На пакмане пакет диагностики 315 байт, при этом скорость 10 п/с. Можно больше, если отказаться от COM и работать напрямую с TCP.
Мне интересно какая скорость получится на матрице. Попробуем?
Кабель позволяет получить 50 пакетов в секунду — и это теоретический предел!
Пакман вообще должен по кану на мегабите работать — а 10 пакетов это непригодный для работы мусор. Никому не интересно часами настраивать то что можно настроить за полчаса.
Хорошо что кабель позволяет 50 пакетов! Какой длины пакеты? У меня при прошивке получилось 31 пакет принять (фото выше в статье). То что должен пакман по CAN, мы сейчас не говорим. Речь о к-линии. Пропускная способность, у g канала WiFi в разы больше чем у любого переходника usb-com. Если работать напрямую с TCP, то кабель в подметки не годится. Какими часами?! Бред написал.
Кому интересна твоя пропускная способность по WIFI G? максимальная дальность достигается в B!
И за wifi стоит K-line у которого теоретический предел 50 пакетов в секунду. потому что чаще чем раз в 20 мс пакет не пошлеться! Любой длинны пакеты… Скорость 100 кбит.
Матрица изначально работает под windows api — не используя левые говнобиблиотеки и убогие говноязыки с ООП и набором говнометодов, поэтому упирается только в TCP-IP стеки системы. И таймер на 1мс в ней перепрограммируеться с момента как лямбда быстрая появилась.
Максим, не путай овец с баранами. Говорим про скорость, а не про дальность. При этом B и G одинаковые по дальности.
Я и не спорю что в связке WiFi — K-line потолок в скорости будет зависеть от k-line! Говорю о том, что сам по себе канал связи Wi-Fi способен большую скорость обеспесить, чем usb-com!
Обсирание языков, программы, стека необоснованно абсолютно. Уже доказазал, что это не даёт космических задержек и занимает время меньше 1 мс.
И зачем эта скорость нужна если ей нельзя воспользоваться?
Для к-лайна не нужна. Достаточно 100 Кбит/с для 50 пакетов, ты сам это сказал…
А почему Матрица всего 25 пакетов выдает, вместо 50?
Потому что вагон стеков и формирование пакетов никуда не денется! А методы реалзиованные в матрице — не читерские типа "послал и забыл" а абсолютно корректные.
Огромная работа, а главное то что нужно и очень качесьно судя по фото. Респект че сказать💪
Спасибо! 👍
Молодца)
Ещё бы избавиться от костыля с пересылкой из кома в ком)
Чтоб одной программой работать)
И где качнуть новую версию?
Спасибо! Да, хорошо бы избавиться от виртуального моста. Работаю в этом направлении. Новую версию скину завтра утром на почту.
Мужик! Главное — идти к цели, через множество экспериментов и кучу работы, и результат не заставит себя ждать.
Спасибо, Дима! Полностью согласен!) Благодарю тебя за тесты и поддержку!
а как определяется контрольная сумма пакетов? в kwp2000 это должна быть сумма всех байт кроме байта суммы. вот несколько команд winflashecu 1.14 посланных в направлении январь 7.2
00 00 F4 00 FF FF 02 F7
00 00 F4 00 FF FF 12 E6
последний байт не получается как сумма всех предыдущих. в чем здесь загвоздка?
При прошивке kwp2000 не используется. Там bootstrap saf509
благодарю за наводку! буду курить даташит)))
Пожалуйста)