82

Помогите разобрать протокол

Возникла необходимость прочитать и имитировать данные, посылаемые датчиком в ЭБУ. Датчик измеряет 4 параметра и шлёт их по шине LIN с нестандартной скоростью в ЭБУ. ЭБУ, в свою очередь, отображает полученные данные в ПО на компе.

Вопрос как считать поток и как вычленить нужные данные я решил. Промерял осциллом единичный бит, посчитал частоту.

Помогите разобрать протокол Электроника, Нужна помощь в ремонте, Arduino

Выяснил, скорость 8000 бод. Считал поток в терминал, вычленил ID отключая разные исполнительные девайсы, висящие на шине. Нашёл нужный мне ID, который давал данные при подключенном датчике, и не давал при отключенном.

Далее написал прошивку, которая отвечает на запрос ЭБУ вместо датчика. В ПО присутствие эмулятора видно (начинают появляться данные), корректность получаемых данных тоже подтверждена. Формат пакета стандартный LIN: синхра(0х55), ID (в моём случае 47), 4 байта данных, контрольная сумма один байт. Если просчитатся с контролькой и отправить некорректную, то датчик в ПО отваливается. Отсюда-данные передаются и воспринимаются ЭБУ и ПО корректно.

И вот тут затык. Из 4 байтов данных два средних байта не влияют на данные, отображаемые ПО. А малейшее изменение первого и последнего меняют три параметра, отображаемые ПО, один параметр постоянно болтается в ноле. На него 1 и 4 байт не влияют.

Как такое может быть? Как четырьмя тетрадами можно закодировать минимум три трёхзначных параметра, два с дробной частью до десятых и два до сотых? Четвёртый параметр тоже шевелится посредством реального датчика, но этот снимок я не сделал.

Провёл несколько экспериментов, полученные данные свёл в таблицу. Жёлтый столбик данные датчика, зелёный отображаемые в ПО.

Помогите разобрать протокол Электроника, Нужна помощь в ремонте, Arduino

TECHNO BROTHER

2K постов13.5K подписчика

Правила сообщества

1-Мы А-политическое сообщество. 2-Запрещено оскорбление: Администрации Пикабу, сообщества, участников сообщества а также родных, близких выше указанных.

3-Категорически запрещается разжигание межнациональной розни или действий, направленных на возбуждение национальной, расовой вражды, унижение национального достоинства, а также высказывания о превосходстве либо неполноценности пользователей по признаку их отношения к национальной принадлежности или политических взглядов. Мат - Нежелателен. Учитесь выражать мысли без матерщины

1
Автор поста оценил этот комментарий

Зачем все это ?  Хотите импортозаместить сборку датчики-мк ?   Погуглите, это может оказаться не МК, а прям готовый ic для температуры-давления итп, который можно купить...

Что-нибудь по типу мах18855 или как там его, который в состоянии с термопары давать наружу уже оцифрованную температуру, имеет на борту усилитель, АЦП, градусник для холодного конца, таблицы для расчёта итд итп.

Как-то сомнительно, что люди аж свой МК ставили и сами все это делали. Очень это чревато, дорого и геморно.

Протокол штука такая. Чтобы импортозаместить надёжно вам боюсь понадобится все варианты проверить.

Иначе потом окажется, что в случае обрыва оно выдает температуру -128 как ds18b20...

раскрыть ветку (1)
3
Автор поста оценил этот комментарий

в общем не секрет, зачем. С датчиком всё отлично, его импортозамещать не требуется. Проблема в неисправном ЭБУ. Чтоб его починить, надо его запустить, а чтоб его запустить на столе, надо собрать всё, что ему нужно в реале. Можно, конечно, тупо дуть в датчик двумя давлениями, и ЭБУ запустится, но тащить домой компрессор и вакуумный насос желания нет. Ресивера, опять же можно, да. Была идея, что проще сколбасить имитацию датчика.

показать ответы
Автор поста оценил этот комментарий

Вы что хотели то тогда? Похвастаться? Мы таки даже не поняли чем. Но на всякий случай восхитились.

раскрыть ветку (1)
2
Автор поста оценил этот комментарий

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

показать ответы
0
Автор поста оценил этот комментарий

Запустите поделие с константными температурами и давлениями на 5 минут, запишите лог обмена, лог должен быть поделен на месседжи, контрольки и хидеры можно убрать. Измените ОДНО значение (любое), снова запишите лог. Можно выслать eulle@yandex.ru.

раскрыть ветку (1)
2
Автор поста оценил этот комментарий

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

В общем случае, конкретно вопрос эмуляции датчика не решён, но работать дальше уже возможно.

Хотел сделать универсальный инструмент, который мог повторить каждый из обычной ардуинки или дешёвого МК, но, видимо, не вывез. "Не получилось, не фартануло".

Лог с костылём вместо датчика снял, но яснее ничего не стало. Как он выставляет данные непонятно.

показать ответы
1
Автор поста оценил этот комментарий

Купите девайс can-lin hacker. Стоит 5000 р. Я на авито купил, хороший девайс.

раскрыть ветку (1)
2
Автор поста оценил этот комментарий
Я его уже сам сделал, как бы я иначе шину прочитал и в обратку отправил пакеты
показать ответы
4
Автор поста оценил этот комментарий
Если пакет с датчика записать и отправить, данные отобразятся верно?
раскрыть ветку (1)
2
Автор поста оценил этот комментарий

да

1
Автор поста оценил этот комментарий
Сорямба, а датчики что, не разъёмом крепятся что ли? У меня в башке все просто. Берём разъём, находим ноги дата шины и фигачим туда напругу. Как ещё то датчики заменить? Или у вас датчик со своим хвостом проводов что ли? Как тогда соединение с цбу происходит?
раскрыть ветку (1)
1
Автор поста оценил этот комментарий

датчик на 4 пина, три сенсора внутри(два давления один температура), один сенсор внешний. Пин питалова, пин земля, пин LIN и пин на внешний сенсор (термистор). 4 сенсора в одном корпусе, наружу торчит только LIN

показать ответы
2
Автор поста оценил этот комментарий
У вас датчик от разницы давления даёт разное напряжение ведь. Так дайте ему то самое напряжение, вся имитация. Или вы именно битами дать в шину хотите? Читаю и впитываю ответы в вашей ветке) очень интересно, правда нифига не понятно) с Lin шинами не сталкивался, только кан пока)
раскрыть ветку (1)
1
Автор поста оценил этот комментарий

именно так, изначальная идея состояла в том, чтоб имитировать голыми данными по шине. Тут в камментах уже предложили ваше решение, подменить сенсоры в датчике на делитель напряжения и тем самым заместить давление. Отличная идея, только для этого надо расковырять физически датчик, а это стоит нормально денег и не масштабируется, ограничено количеством "донорских" датчиков. Если не смогу разобрать протокол, то так и сделаю, под это дело надыбал уже два неисправных датчика.

показать ответы
3
Автор поста оценил этот комментарий

Это потому, что "одно число в ответе" вовсе не число, а набор бит.

Маркировки на датчике нету ?  В даташите будет проще посмотреть.

Скорее всего их таких датчиков всего несколько штук доступно разных. И лучше бы их даташиты в любом случае глянуть. Там обычно все друг у друга передирают по возможности

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Собственно датчик это набор сенсоров, два давления и два термистора, всё это сходится в какую-то затёртую микруху, скорее всего МК, и она уже по LIN отдаёт данные в ЭБУ. На термисторы даташит ясен, давление тоже, выдают 0-5 вольт в зависимости от давления. МК может оказаться любым, но это и не суть важно, потому что в МК главное не железо, а прошивка.

показать ответы
1
Автор поста оценил этот комментарий
А с чего вы взяли что в датчике что то кодируется? Он отправляет свои сырые "электронные единицы" которые ПО потом уже конвертирует по своему алгоритму.
А параметры скорее всего выдаются последовательно. А датчик реально включить отдельно без ЭБУ и снять с него что он шлет?
как я понимаю вы с имитатора шлете постоянно одну и туже посылку?
раскрыть ветку (1)
1
Автор поста оценил этот комментарий
Реально. Собрать эмулятор ЭБУ в этот раз, и слать в датчик запрос. Но тут уже непонятно, как оценить то, что ответит датчик, расшифровывать его ответ будет уже некому
показать ответы
15
Автор поста оценил этот комментарий

попробуйте по очереди закинуть в эмуляторе "1" в каждый бит, чтобы увидеть какие биты на какие параметры влияют. если получится разделить на группы(например, бит по 8-10 на параметр), то дальше экспериментируйте с каждым параметров отдельно. если один бит будет менять сразу несколько параметров, то, скорее всего, кодируются не абсолютные значения параметров, возможно, дельты

раскрыть ветку (1)
1
Автор поста оценил этот комментарий
Завтра (уже сегодня) попробую прогнать один бит по 8х4=32 разрядам.
показать ответы
0
Автор поста оценил этот комментарий

Зависимость параметра P2 от старшего байта D3 (примерно): (D3h-1)*0,26+0,49

Иллюстрация к комментарию
раскрыть ветку (1)
1
Автор поста оценил этот комментарий
Залупа а том, что изменение DD3 меняет T1, T2, P2
показать ответы
4
Автор поста оценил этот комментарий

Из двух последних (с реальным датчиком) наборов очевидно следует, что параметр P2 зависит только от DD3. И, с учётом предыдущих примеров, зависимость линейная вида DD3*0,0161458333333333+0,03625. По крайней мере все приведённые примеры ей удовлетворяют.

T1 и T2 вероятно зависят как-то чуть более хитро от DD0 и DD3. Но чтобы точно понять как, нужно другие примеры наделать (например, когда DD3 зафиксирован, а DD0 меняется на единицу)

раскрыть ветку (1)
1
Автор поста оценил этот комментарий
А при этом крутил я единственный доступный температурный сенсор, а давление я не трогал
показать ответы
2
Автор поста оценил этот комментарий

А что за датчик, если не секрет? И что он, собственно, измеряет? А то по представленной табличке, лично я пока что могу только предположить, что датчик тупо шлет показания четырех каналов 8-битного АЦП. А все формулы и/или таблицы пересчета в параметры забиты в ЭБУ.

раскрыть ветку (1)
1
Автор поста оценил этот комментарий
Две температуры и два давления. Изменение ОДНОГО числа в ответе меняет ТРИ ПАРАМЕТРА в ПО
показать ответы
0
Автор поста оценил этот комментарий

как успехи? заинтриговали и тишина.

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

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

отложил пока. Как тут советовали, взял другой, горелый датчик, расколупал, вытащил сенсоры давления и поставил переменные резисторы. ЭБУ такой датчик принял, резисторами настроил приемлемые давления. Всё завелось и поехало, смог восстановить ЭБУ. В итоге, конечная цель достигнута, промежуточная нет. Ну она как бы и не актуальна стала, можно теперь пользоваться эрзац-датчиком. Возможно, вернусь к этому вопросу позже, когда будет свободное время. Академически интересно, как же такое работает.


Лог обмена снял, не всегда на 47 ID посылки одинаковые. Но и соответствия не вижу.


55 47 00 00 00 61 9E 00

55 06 00 00 01 FE 00

55 85 87 00 01 D3 A3 00

55 47 14 00 00 16 D5 00

55 06 00 00 03 FC 00

55 3C 60 06 B4 11 7C 80 00 00 D6 00

55 06 00 00 03 FC 00

55 3C 60 06 B4 11 7C 80 00 00 D6 00

55 47 14 00 00 12 D9 00

55 06 00 00 00 FF 00

55 C4 01 14 EA 00

55 47 00 00 00 61 9E 00

55 06 00 00 01 FE 00

55 85 87 00 01 D2 A4 00

55 47 14 00 00 16 D5 00

55 06 00 00 02 FD 00

55 3C 60 06 B4 11 7C 80 00 00 D6 00

55 47 00 00 00 81 7E 00

55 06 00 00 00 FF 00

55 C4 01 14 EA 00

55 47 00 00 00 61 9E 00

55 06 00 00 01 FE 00

55 85 87 00 01 D3 A3 00

55 47 14 00 00 17 D4 00

55 06 00 00 03 FC 00

55 3C 60 06 B4 11 7C 80 00 00 D6 00

55 47 14 00 00 12 D9 00

55 06 00 00 00 FF 00

55 C4 01 14 EA 00

55 47 00 00 00 61 9E 00

55 06 00 00 01 FE 00

55 85 87 00 01 D2 A4 00

55 47 14 00 00 16 D5 00

55 06 00 00 02 FD 00

55 3C 60 06 B4 11 7C 80 00 00 D6 00

55 47 00 00 00 81 7E 00

55 06 00 00 00 FF 00

55 C4 01 14 EA 00

55 47 00 00 00 61 9E 00

55 06 00 00 01 FE 00

55 85 87 00 01 D2 A4 00

55 47 14 00 00 17 D4 00

55 06 00 00 03 FC 00

55 3C 60 06 B4 11 7C 80 00 00 D6 00

55 47 14 00 00 12 D9 00

55 06 00 00 00 FF 00

55 C4 01 14 EA 00

55 47 00 00 00 61 9E 00

55 06 00 00 01 FE 00

55 85 87 00 01 D2 A4 00

55 47 14 00 00 16 D5 00

55 06 00 00 02 FD 00

55 3C 60 06 B4 11 7C 80 00 00 D6 00

55 47 00 00 00 81 7E 00

55 06 00 00 00 FF 00

55 C4 01 14 EA 00

55 47 00 00 00 61 9E 00

55 06 00 00 01 FE 00

55 85 87 00 01 D3 A3 00

55 47 14 00 00 16 D5 00

55 06 00 00 03 FC 00

55 3C 60 06 B4 11 7C 80 00 00 D6 00

55 47 14 00 00 13 D8 00

55 06 00 00 00 FF 00

55 C4 01 14 EA 00

55 47 00 00 00 61 9E 00

55 06 00 00 01 FE 00

55 85 87 00 01 D2 A4 00

55 47 14 00 00 16 D5 00

55 06 00 00 02 FD 00

55 3C 60 06 B4 11 7C 80 00 00 D6 00

55 47 00 00 00 82 7D 00

55 06 00 00 00 FF 00

55 C4 01 14 EA 00

55 47 00 00 00 61 9E 00

55 06 00 00 01 FE 00

55 85 87 00 01 D2 A4 00

55 06 00 00 01 FE 00

55 85 87 00 01 D2 A4 00

55 47 14 00 00 16 D5 00

55 06 00 00 02 FD 00

55 3C 60 06 B4 11 7C 80 00 00 D6 00

55 47 00 00 00 81 7E 00

55 06 00 00 00 FF 00

55 C4 01 14 EA 00

55 47 00 00 00 61 9E 00

55 06 00 00 01 FE 00

55 85 87 00 01 D3 A3 00

55 47 14 00 00 17 D4 00

55 06 00 00 03 FC 00

55 3C 60 06 B4 11 7C 80 00 00 D6 00

55 47 14 00 00 12 D9 00

55 06 00 00 00 FF 00

55 C4 01 14 EA 00

55 47 00 00 00 61 9E 00

55 06 00 00 01 FE 00

55 85 87 00 01 D2 A4 00

55 47 14 00 00 16 D5 00

55 06 00 00 02 FD 00

55 3C 60 06 B4 11 7C 80 00 00 D6 00

55 47 00 00 00 81 7E 00

55 06 00 00 00 FF 00

55 C4 01 14 EA 00

55 47 00 00 00 61 9E 00

55 06 00 00 01 FE 00

55 85 87 00 01 D2 A4 00

55 47 14 00 00 17 D4 00

55 06 00 00 03 FC 00

55 3C 60 06 B4 11 7C 80 00 00 D6 00

55 47 14 00 00 12 D9 00

55 06 00 00 00 FF 00

55 C4 01 14 EA 00

55 47 00 00 00 61 9E 00

55 06 00 00 01 FE 00

55 85 87 00 01 D2 A4 00

55 47 14 00 00 16 D5 00

55 06 00 00 02 FD 00

55 3C 60 06 B4 11 7C 80 00 00 D6 00

55 47 00 00 00 81 7E 00

55 06 00 00 00 FF 00

55 C4 01 14 EA 00

55 47 00 00 00 61 9E 00

55 06 00 00 01 FE 00

55 85 87 00 01 D3 A3 00

55 47 14 00 00 16 D5 00

55 06 00 00 03 FC 00

55 3C 60 06 B4 11 7C 80 00 00 D6 00

55 47 14 00 00 13 D8 00

55 06 00 00 00 FF 00

55 C4 01 14 EA 00

55 47 00 00 00 61 9E 00

55 06 00 00 01 FE 00

55 85 87 00 01 D2 A4 00

55 47 14 00 00 16 D5 00

55 06 00 00 02 FD 00

55 3C 60 06 B4 11 7C 80 00 00 D6 00

55 47 00 00 00 82 7D 00

55 06 00 00 00 FF 00

55 C4 01 14 EA 00

55 47 00 00 00 61 9E 00

55 06 00 00 01 FE 00

55 85 87 00 01 D2 A4 00 06 00 00 01 FE 00

55 85 87 00 01 D3 A3 00

55 47 14 00 00 16 D5 00

55 06 00 00 03 FC 00

55 3C 60 06 B4 11 7C 80 00 00 D6 00

55 47 14 00 00 12 D9 00

55 06 00 00 00 FF 00

55 C4 01 14 EA 00

55 47 00 00 00 61 9E 00

55 06 00 00 01 FE 00

55 85 87 00 01 D2 A4 00

55 47 14 00 00 17 D4 00

55 06 00 00 02 FD 00

55 3C 60 06 B4 11 7C 80 00 00 D6 00

55 47 00 00 00 81 7E 00

55 06 00 00 00 FF 00

55 C4 01 14 EA 00

55 47 00 00 00 61 9E 00

55 06 00 00 01 FE 00

55 85 87 00 01 D2 A4 00

55 47 14 00 00 16 D5 00

55 06 00 00 03 FC 00

55 3C 60 06 B4 11 7C 80 00 00 D6 00

55 47 14 00 00 13 D8 00

55 06 00 00 00 FF 00

55 C4 01 14 EA 00

55 47 00 00 00 61 9E 00

55 06 00 00 01 FE 00

55 85 87 00 01 D3 A3 00

1
Автор поста оценил этот комментарий
Может, уже ответили: "Как такое может быть? Как четырьмя тетрадами можно закодировать минимум три трёхзначных параметра, два с дробной частью до десятых и два до сотых?"
Смотря какой диапазон значений. Приведу лёгкий пример: как двумя байтами закодировать дробные числа с точностью до сотых.
1. Дробное число умножаем на 100
2. Округляем
3. Прибавляем 32000, получаем 16-битный ответ, который и передаём.
Алгоритм будет работать в диапазоне от -320.00 до +320.00 (чуть побольше, не суть).
Чтобы восстановить начальное значение - выполняем шаги в обратной последовательности:
1. Вычесть 32000
2. Поделить на 100.
раскрыть ветку (1)
0
Автор поста оценил этот комментарий
Передайте вашим методом 4 числа 100.1, -200.2, 2.02, 3.33? При этом впишите их в 4 восьмибитных числа, два из которых 00 и 00. В вашем распоряжении только два uint8
показать ответы
1
Автор поста оценил этот комментарий

уже два неисправных датчика.

расковыряйте и узнайте какая микросхема map там находится, потому что судя по поиску в интернете map сенсоров с lin интерфейсом нет. по маркировке можно будет узнать положение бит которые выбирают какой параметр передается. например https://www.infineon.com/dgdl/Infineon-KP253-DS-v01_01-EN.pd... стр12 Command Definition (как видно у него spi, в датчике еще находится мост spi lin)
другой пример https://www.nxp.com/docs/en/data-sheet/FXPS7115D4.pdf

раскрыть ветку (1)
0
Автор поста оценил этот комментарий
Да, расковырял. UJA1023T/2R04/C
показать ответы
0
Автор поста оценил этот комментарий

вы пробовали посылать сразу две или три посылки (единичных пакетов) с инкрементом одного из значений? или этот датчик всегда в ответ на запрос только по четыре тетрады отвечает?

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

его ответ всегда 4 байта данных + байт CRC

показать ответы
0
Автор поста оценил этот комментарий

вы уверены что значение меняется одной посылкой по шине, а не группой?

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

нет конечно, не уверен. Но и как проверить не придумал пока. В общем потоке отключение датчика вызывает только отсутствие ответа по ID 47, остальные ID никак не меняются. Отсюда делаю вывод, что только эти данные формирует датчик. Понимаю, что математически четырьмя тетрадами не передать 3-4 трёхзначных дробных знаковых величины, но и обнаружить обратное не могу.

Сегодня попробовал копать в обратную сторону, начал бомбить датчик его ID, но датчик молчит. Пока не решил, по какой причине такое поведение, наиболее вероятно что я неправильно формирую запрос, потому что шлю ему тупо из терминала 0x55 0x47, разрыв синхры перед ID не выполняю.

показать ответы