Обновить
16K+
4

Пользователь

24,1
Рейтинг
2
Подписчики
Отправить сообщение

Про анализ времени цикла в самой TIA — спасибо, это неприятно полезно. Три месяца работал в среде и не знал, что инструмент лежит внутри. Сниму, как доберусь до машины с лицензией.

Про архитектуру понял и записал. Экземплярный DB на устройство вместо массива — это ровно тот размен, который я не сделал: я получил правку логики в одном месте и потерял перекрёстные ссылки, вы предлагаете обратное. Спорить не буду, у вас пятнадцать лет сопровождения таких проектов, у меня три месяца.

Про энкодеры я знал, но узнал дорого: на другом стенде программный счётчик на 10 мс цикле терял импульсы, лечилось аппаратным счётчиком. Вы это назвали сразу, не наступая.

И честно предупреждаю: ваш разбор я процитировал в следующей статье, она вышла только что — https://habr.com/ru/articles/1077270/ Там отдельный раздел про то, что первое за 98 дней внешнее ревью моих архитектурных решений пришло из комментариев, а не изнутри. С ником и ссылкой на эту ветку. Если против — скажите, уберу.

Староверы в АСУТП — это, по-моему, не религия, а профессиональная деформация в хорошем смысле. Тут за красивое решение платит не автор, а наладчик через пять лет.

Спасибо, что написали на тридцатом часу. Идите спать, серьёзно, ответ подождал бы.

Про «где надо было думать самому — делегировали агенту» очень хочу подробностей, когда будут силы. Это ровно то, чего я по себе не вижу: я знаю, где я думал, и не знаю, где мне только казалось, что я думал. Со стороны это видно, изнутри нет.

Про «как из-под учебника» — назовите хотя бы одно конкретное место, где есть более простой общепринятый путь. Я пришёл в TIA из CODESYS и из Mitsubishi FX, и общепринятого в S7 мог просто не знать: у меня нет за спиной ни одного человека, который бы сказал «так не делают».

С монстром согласен и уже дописал это в статью. Меньше кода я посчитал за проще в поддержке, а это разные вещи. У оригинала 95 блоков, всё плохо, но всё на виду. У меня меньше строк, но сначала надо понять схему, а потом уже что-то менять. Плюс перекрёстные ссылки перестают работать из-за индексного доступа — на это указал другой комментатор, и он прав.

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

По отладке согласен, и цифра у меня похожая по ощущению.

Конкретный случай из этой же работы: один SCL-источник при импорте в TIA дал 37 ошибок компиляции, после моих правок стало 51. Все вокруг вызова инструкции Modbus-клиента: несоответствие типов, неизвестный формальный параметр, неверное число аргументов. Гипотеза сложилась мгновенно и выглядела убедительно — несовместимость версии инструкции. Полдня я сверял версии и пробовал варианты вызова.

Оказалось, в TIA импортировалась устаревшая копия файла. Я правил один файл, а компилировался другой. Все 51 ошибка были абсолютно корректными, просто относились к тексту, который я уже исправил.

Ассистент такое не ловит вообще. Он честно и правдоподобно объясняет каждую из 51 ошибки — а предпосылку «а тот ли файл вообще собирается» проверять некому, кроме вас. Проверяется за минуту: вставить заведомо ошибочную строку и посмотреть, сообщит ли о ней компилятор.

Спасибо, это самый полезный комментарий за оба моих текста. Прошёлся по всем четырём пунктам, отвечаю по порядку.

Cross reference. Вы правы, и дыра тут не только в проекте, но и в самой статье: я показал выигрыш data-driven и не показал счёт. Индексы вычисляются в рантайме, разрешать среде нечего, и наладчик на объекте остаётся без основного инструмента поиска. Дописал в текст отдельный раздел «За что data-driven берёт плату» — раньше его не было.

Temp в блоках с индексным доступом. Прогнал все семь блоков файла статическим проходом: искал переменные VAR_TEMP, которые читаются раньше, чем в них что-то записали. Не нашёл ни одной, в этом файле temp чистые.

Но по следу вашего замечания вылезло другое. В fbCyclogram на ветке раннего выхода (cycleNo вне диапазона 1..12) сбрасывались solMask и finished, а выход stepIdx — нет. Он не мусорный, он хуже: сохраняет значение прошлого вызова, и верхний уровень видит залипший номер шага у неактивной циклограммы. Одна строка, поправил.

То есть само замечание не подтвердилось, а проверка по нему нашла ошибку. За это отдельное спасибо — я бы туда не полез.

Прерывания с постоянной цикличностью. Не сделано, всё в OB1. Замера худшего времени цикла у меня нет, ни разу не снимал. Записал в статью как дыру, а не как решённый вопрос. На другом стенде цикличность меня уже кусала: программный счётчик энкодера на 10 мс цикле терял импульсы, и лечилось это аппаратным счётчиком, а не аккуратным кодом.

Про монстра. Спорить не буду. Меньше кода и проще в поддержке — разные вещи, а я их в тексте склеил. У оригинала 95 блоков, там всё плохо, но всё на виду; у меня меньше строк, но сначала надо понять схему. Порог входа я поднял и написал об этом только сейчас, после вашего комментария.

Если найдёте время расписать про непрямую адресацию подробнее — прочитаю внимательно. 300-500 IO это ровно тот масштаб, где мои решения и должны начать ломаться.

Понял, спасибо. Текст я правда писал с моделью и сказал об этом в первом абзаце — но это не отменяет того, что читается он как модель. Для меня это плохой результат: хотел рассказать про конкретный таймер, а получил претензию к слогу.

Да, и я на этом ровно и попался: решил, что ELM327 — это спецификация. А это марка, которую переписали кто во что горазд, и совместимость проверяется только опытом.

Отсюда практический вывод, до которого я дошёл поздно: сравнивать адаптеры надо не по надписи, а по поведению. Программа теперь перебирает три способа дочитать длинный ответ и пишет в журнал, какой сработал. Если такие строчки собирать от разных людей, сложится таблица «плата — прошивка — что умеет». Пока в ней одна строка, и та отрицательная.

Про «всё своё» согласен целиком. SLCAN-адаптер, у которого логики транспортного уровня нет вообще, снял вопрос за вечер и стоит столько же.

Спорить не буду: для регулярной работы нормальный сканер быстрее и удобнее.

Задача была другая. При плавающем контакте сканер отвечает на вопрос «есть ли ошибка», а мне нужно было «в какой момент она появляется, когда я шевелю вот этот кусок жгута». Для такого нужен самописец: сидит в цикле, пищит на изменение счётчика, пишет CSV с метками времени. Второй мотив менее уважительный — было интересно, сколько можно выжать из железки за шестьсот рублей. Оказалось, меньше, чем хотелось, и статья в основном про то, где именно упираешься.

VAG-KKL — это K-line, на Polo Sedan с CAN он бы не помог. VCDS хорош, но у меня его нет, а покупать ради одного перебитого провода не хотелось.

В точку, и возразить нечем. Проверял я на одном клоне — том, что представляется как v1.5. Написал «обойти нельзя», а честно было бы «на этом обойти не вышло».

Полез смотреть Pyren после вашего комментария и наткнулся на неприятную для себя вещь. В версии для компьютера у меня с самого начала была лестница из трёх способов заставить адаптер дочитать длинный ответ: ATCRA и адаптер справляется сам; ATCRA плюс вручную заданный кадр разрешения; сырые кадры, где разрешение шлёт сама программа. А в Android-порт я эту лестницу просто не перенёс — приложение получало первый кадр и сдавалось. Заметить было нечем: заглушка в обоих случаях отдавала только первый кадр, разницы не видно. Нашлось только сверкой кода с кодом, и повод посмотреть дал ваш комментарий.

Теперь лестница есть в обеих версиях, и в журнал пишется, какой способ сработал, вроде «0x70A: длинный ответ дочитан — адаптер справился сам (ATCRA)». Мой клон по-прежнему не умеет, доходит до третьей ступени и там встаёт.

Если тот адаптер, которым Pyren читает Рено, у вас под рукой — скажите, что на плате написано и что он отвечает на ATI. Хочу собрать список «какой адаптер что умеет»: такого списка нигде нет, а вопрос «какой ELM327 брать» задают постоянно. Пока в списке одна строка, и та отрицательная.

Уже не планируется — уже лежит. Kotlin и Compose, не обёртка над питоновской версией, протокол переписан.

Исходники: https://github.com/gdm0991/vagdiag/tree/main/android-app

Готовый APK: https://github.com/gdm0991/vagdiag/releases

Ради чего вообще стоило делать: Bluetooth-адаптеры. Из браузера к ним не подобраться, из Termux тоже, а в бардачке у большинства лежит именно такой. Wi-Fi и USB через OTG тоже есть, но USB живьём проверить не смог — кабеля у меня нет.

Чтобы не было завышенных ожиданий: полный цикл приложение прошло пока через программную заглушку адаптера, на двух телефонах — Redmi Note 13 (Android 15) и Mi 11 Lite (Android 13). На живой машине компьютерная версия обкатана куда лучше. Поставите и что-то отвалится — заводите issue, мне это сейчас полезнее всего.

Спасибо за разбор. Открыть гит и сверить с текстом — это больше, чем я мог рассчитывать, и по делу почти всё.

Про нейросеть отвечу сразу, иначе остальное будет выглядеть отпиской. Да, текст я писал с языковой моделью. И расхождения, которые вы нашли, вылезли ровно там, где я диктовал по памяти вместо того, чтобы открыть файл. Это не оправдание, это причина: сверялся бы с кодом — девять команд не превратились бы в четыре.

Команды инициализации. Ваша правда. pdc_core.py, строки 229–238: ATZ, дальше ATE0, ATL0, ATS0, ATH1, ATSP6, ATCAF1, ATAT0, ATST32. В _recover сверху ещё ATCF000 и ATCM000. Хуже, чем просто неточность: три из них прямо про тему статьи. Без ATH1 не видно, с какого адреса пришёл ответ, и весь разговор про смещение теряет смысл. ATAT0 стоит вместо ATAR намеренно — в статье про это есть, а в списке команд нет. Кто повторил бы за мной, получил бы другое поведение адаптера и не понял почему.

PAD. Тоже ваша. Рабочий путь — pdc_core.py, строка 512, добивка нулями. 0xAA живёт в pdc_diag.py, строка 1224, в третьем способе с сырыми кадрами: я там проверял, отличает ли блок мою добивку от заводской — VAG добивает AA. Не отличает, длина берётся из первого байта. В статью значение уехало из эксперимента и было выдано за рабочее.

Восемь датчиков против четырёх. Тут противоречия нет, но виноват всё равно я — не объяснил. Датчиков восемь: четыре в переднем бампере, четыре в заднем. Отключаешь по одному бамперу за раз, поэтому в подсказке четыре. Формулировку в menu.py уже поправил, в статью допишу.

На любом автомобиле с 2001 года — ошибка, и ваш Patrol ровно тот случай. Правильно: в США OBD-II обязателен с 1996, в Европе EOBD для бензиновых с 2001 и для дизелей с 2004, а у машин с других рынков разъём на месте, а режимов нет. В README и в pdc_obd.py уже исправлено, в Android-версии тоже.

Выбросы — выхлопные. OBD-II затевался как экологическое требование, и обязательные режимы покрывают то, что влияет на состав выхлопа. Написал так, что вышла загадка.

Руки — поймали. Со сканером руки заняты сканером, с регистратором — жгутом, и это не «свободные руки». Имел в виду, что не надо одновременно смотреть в экран и щупать проводку.

Боковой режим и увидел электрически — крыть нечем, я это сам сочинил, и никому оно не помогло. Первое означало, что ELM327 сделан прежде всего как интерфейс к блоку двигателя, а сырые кадры отдаёт постольку-поскольку. Второе — что байт типа отказа описывает электрику цепи: обрыв, замыкание, а не логическую ошибку. Так и напишу.

Ещё одно, чего вы не писали, но что всплыло из комментария 200sx_Pilot: «обойти невозможно» сказано слишком широко. Проверял-то я на одном клоне.

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

Информация

В рейтинге
348-й
Зарегистрирован
Активность