- 9 Янв 2026
- 15
- 4
Все эти дни я пытался понять, почему в процессе работы нашего пафа в логе feedback.log были сообщения "DSFMService - No assembly part number found for", а в китайском — нет, и насколько критичны такие ошибки. Самое интересное, что спустя несколько дней вышло наоборот: в нашем пафе не было таких ошибок, а в китайском для некоторых модулей они появились.Обращайте внимание на наличие строк "DSFMService - No assembly part number found for <Название блока>, keeping <Версия прошивки>" в лог-файле. Это говорит о том, что софт блока имеет более новую версию, чем поддерживается PF. Это означает, что функционал работы с этим блоком будет ограничен. Если блок, в который загружается конфиг, имеет более новую версию, то загрузить конфиг в такой блок также не получится. Как минимум без патча PF.
Если кратко, то сообщения "DSFMService - No assembly part number found for" не говорят напрямую о том, что софт блока имеет более новую версию, чем поддерживается PF. Изучив кучу логов перед этими сообщениями, я понял, что в моём случае они возникали, когда не было связи с ECU-блоком (адаптер не распознавался / шнурок от адаптера отвалился в процессе работы и т.д.), и паф не смог получить из него информацию через UDS-команды.
А вот сообщения "ECUAssemblyNumber_Non_Released" больше похожи на то, что паф ничего не знает об установленной версии ПО в блоках. Далее — подробный разбор. Для контекста: у меня L550 2020, DOIP.
Для начала надо понять, как паф узнаёт о версиях ПО в блоках. Когда происходит автоскан, паф отправляет в каждый модуль UDS-команды для получения информации о версиях ПО, VIN, серийном номере и т.д. Вот пример такого взаимодействия с блоком BCM:
10.01.2026 17:44:06,361 console - SendRaw BCM: 22 F1 12
10.01.2026 17:44:06,457 console - Raw Answer BCM: 62 F1 12 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
10.01.2026 17:44:06,457 console - SendRaw BCM: 22 F1 13
10.01.2026 17:44:06,572 console - Raw Answer BCM: 62 F1 13 4A 50 4C 41 2D 31 34 46 30 34 31 2D 42 47 00 00 00 00 00 00 00 00 00 00
10.01.2026 17:44:06,576 console - SendRaw BCM: 22 F1 11
10.01.2026 17:44:06,658 console - Raw Answer BCM: 62 F1 11 4A 50 4C 41 2D 31 34 43 32 35 36 2D 42 47 00 00 00 00 00 00 00 00 00 00
10.01.2026 17:44:06,658 console - SendRaw BCM: 22 F1 88
10.01.2026 17:44:06,730 console - Raw Answer BCM: 62 F1 88 4C 50 4C 41 2D 31 34 43 31 38 34 2D 41 44 00 00 00 00 00 00 00 00 00 00
10.01.2026 17:44:06,730 console - SendRaw BCM: 22 F1 24
10.01.2026 17:44:06,819 console - Raw Answer BCM: 62 F1 24 4C 4B 37 32 2D 31 34 43 31 38 35 2D 41 41 00 00 00 00 00 00 00 00 00 00
10.01.2026 17:44:06,819 console - SendRaw BCM: 22 F1 08
10.01.2026 17:44:06,922 console - Raw Answer BCM: 62 F1 08 4C 50 4C 41 2D 31 34 43 34 30 38 2D 41 41 00 00 00 00 00 00 00 00 00 00
Тут всё просто: запрос начинается с 22, а дальше указывается DID, ответ, соответственно, начинается с 62 + DID.
Изучив различные файлы пафа, я нашёл список DID, специфичный для JLR. Итого, просто переведя ответы от модуля из hex-значений и сопоставив DID, получаем такую таблицу данных для модуля BCM:
| DID | Значение (ASCII) | Назначение (типичное) |
| ---- | ---------------- | ---------------------------------------- |
| F112 | пусто | ECU Assembly Number |
| F113 | JPLA-14F041-BG | ECU Delivery Assembly Number |
| F111 | JPLA-14C256-BG | ECU Core Assembly Number |
| F188 | LPLA-14C184-AD | Vehicle Manufacturer ECU Software Number |
| F124 | LK72-14C185-AA | ECU Calibration Data #1 Number |
| F108 | LPLA-14C408-AA | ECU Network Signal Calibration Number |
Это те самые значения, которые показывает интерфейс пафа, за исключением главного — основной версии прошивки блока BCM, в нашем случае LK72-14B476-AR. Сами блоки не выдают эту информацию через UDS-команды (DID F112), отвечая нулями на этот запрос.
Поэтому тут вступает логика пафа: получив информацию о версии железа, калибровок и прочего напрямую из блока, он сам вычисляет основную версию ПО блока по файлам ivs.
Вот, к примеру, сокращённое содержимое файла LK72-14B476-AR (основная версия блока). В нём описано, что прошивка по факту состоит из 4 файлов (Strategy, Secondary Bootloader, Calibration, Signal Configuration), а также указано, какие версии были до и какие версии есть после:
<?xml ?><ivs:eCUAcronym="BCM" assyPN="LK72-14B476-AR" asDeliveredPID="F112" predecessorPartNumber="LK72-14B476-AP" successorPartNumber="LK72-14B476-AS">
<hardwareComponentPart hardwareType="JPLA-14C256-BH" predecessorPartNumber="JPLA-14C256-BG" successorPartNumber="JPLA-14C256-BJ" filePNPid="F111"/>
<node nodeAddr="1726">
<softwareComponentPart partType="Strategy" filePN="LPLA-14C184-AD" successorPartNumber="LPLA-14C184-AE" predecessorPartNumber="LPLA-14C184-AC" filePNPid="F188">
<supportingSoftwarePart partType="Secondary Bootloader" filePN="JPLA-14C187-AA">
</supportingSoftwarePart>
</softwareComponentPart>
<softwareComponentPart partType="Calibration" filePN="LK72-14C185-AA" filePNPid="F124">
</softwareComponentPart>
<softwareComponentPart partType="Signal Configuration" filePN="LPLA-14C408-AA" filePNPid="F108">
</softwareComponentPart>
</node>
</ivs
Сводная таблица: 3 значения этих файлов полностью совпадают с полученными из блока, 1 значение было в предыдущей версии и одно не описано в XML.
| DID | Значение в BCM | Ожидание XML | Статус |
| ---- | -------------- | -------------- | -------------- |
| F111 | JPLA-14C256-BG | JPLA-14C256-BH |
| F188 | LPLA-14C184-AD | LPLA-14C184-AD |
| F124 | LK72-14C185-AA | LK72-14C185-AA |
| F108 | LPLA-14C408-AA | LPLA-14C408-AA |
| F113 | JPLA-14F041-BG | — |
На основе этого паф определяет, что основная версия ПО блока BCM — LK72-14B476-AR, о чём и пишет в логе сразу после UDS-команд:
10.01.2026 17:44:07,277 console - errorLog(message: ##! CHECKED LK72-14B476-AR, InIvsForSelectedSeries = true
10.01.2026 17:44:07,539 console - Setting assembly part number to: LK72-14B476-AR for domain Body Control Module [BCM] [3018]
10.01.2026 17:44:21,141 console - Identified ECU: BCM_L462_2018_00_V1
10.01.2026 17:44:21,141 console - <-- AREA SCAN Body Control Module [BCM] [3018] END --
А теперь рассмотрим сценарий (ошибка ECUAssemblyNumber_Non_Released), когда паф, после того как получил данные из блока, не может вычислить основную версию ПО по причине либо того, что ПО действительно новее, чем у него есть в ivs, либо, как в моём случае, версии файлов (Strategy, Secondary Bootloader, Calibration, Signal Configuration) неконсистентны.
Модуль TCU — паф стандартно запрашивает версии:
10.01.2026 18:22:46,370 console - SendRaw TCU: 22 F1 11
10.01.2026 18:22:46,420 console - Raw Answer TCU: 62 F1 11 4A 38 41 32 2D 37 30 37 31 39 2D 43 47 00 00 00 00 00 00 00 00 00 00 00
10.01.2026 18:22:46,420 console - SendRaw TCU: 22 F1 20
10.01.2026 18:22:46,500 console - Raw Answer TCU: 62 F1 20 4A 38 41 32 2D 37 30 37 31 32 2D 42 41 41 00 00 00 00 00 00 00 00 00 00
10.01.2026 18:22:46,500 console - SendRaw TCU: 22 F1 23
10.01.2026 18:22:46,583 console - Raw Answer TCU: 62 F1 23 4A 38 41 32 2D 37 30 37 31 32 2D 47 4B 00 00 00 00 00 00 00 00 00 00 00
10.01.2026 18:22:46,583 console - SendRaw TCU: 22 F1 21
10.01.2026 18:22:46,682 console - Raw Answer TCU: 62 F1 21 4A 38 41 32 2D 37 30 37 31 32 2D 43 5A 00 00 00 00 00 00 00 00 00 00 00
10.01.2026 18:22:46,682 console - SendRaw TCU: 22 F1 22
10.01.2026 18:22:46,743 console - Raw Answer TCU: 62 F1 22 4A 38 41 32 2D 37 30 37 31 32 2D 46 59 00 00 00 00 00 00 00 00 00 00 00
10.01.2026 18:22:46,743 console - SendRaw TCU: 22 F1 88
10.01.2026 18:22:46,803 console - Raw Answer TCU: 62 F1 88 4A 38 41 32 2D 37 30 37 31 32 2D 41 41 41 00 00 00 00 00 00 00 00 00 00
10.01.2026 18:22:46,803 console - SendRaw TCU: 22 F1 25
10.01.2026 18:22:46,862 console - Raw Answer TCU: 62 F1 25 4A 37 41 33 2D 37 30 37 31 33 2D 53 48 00 00 00 00 00 00 00 00 00 00 00
10.01.2026 18:22:46,862 console - SendRaw TCU: 22 F1 24
10.01.2026 18:22:46,923 console - Raw Answer TCU: 62 F1 24 4A 37 41 33 2D 37 30 37 31 33 2D 41 41 41 00 00 00 00 00 00 00 00 00 00
10.01.2026 18:22:46,923 console - SendRaw TCU: 22 F1 08
10.01.2026 18:22:46,983 console - Raw Answer TCU: 7F 22 31
10.01.2026 18:22:46,992 console - SendRaw TCU: 22 F1 91
10.01.2026 18:22:47,073 console - Raw Answer TCU: 62 F1 91 4A 38 41 32 2D 37 30 37 31 39 2D 43 47 00 00 00 00 00 00 00 00 00 00 00
Но дальше пишет ошибку "Сборочный номер ECU не выпущен":
10.01.2026 18:22:47,122 console - errorLog(message: ##VR##sECUAssemblyNumber =
10.01.2026 18:22:47,122 console - errorLog(message: ##VR##sECUAssemblyNumberLineage length = 0
10.01.2026 18:22:47,122 com.avl.ditest.dicore.diflow.flow.kf_TCU_L663_2020_00_VXX_ECUAssemblyNumber_Non_Released25cgha
Так как паф не смог определить версию по ivs, он берёт последний известный номер версии из файла VIN.xml (находится вместе с vin.vbf в архиве asis.zip). При определённых действиях в пафе он загружает данный файл на сервер JLR, в котором пишет дату работы, версию пафа, а также основные версии всех модулей. Но если машину обновляли в гараже без интернета или кто-то не смог починить DSFM по нашей инструкции, то, соответственно, такой файл на сервер не отправится, и получится неконсистентность.
Краткое содержимое VIN.xml по части нашего модуля:
<module gmrdb_acronym="TCU">
<node_id>0x754</node_id>
<part_set>
<part did="0xF112" gmrdb_name="ECU_ASSEMBLY_PN">
<part_number type="WERS">LK72-70488-CH</part_number>
Прочитав этот файл, паф назначает версию как резервную (fallback) из VIN.xml:
10.01.2026 18:22:47,182 console - Got fallback assembly part number 'Optional[LK72-70488-CH]' from dsfm file for vin VIN / model L550 (DoIP) / domain TCU
10.01.2026 18:22:47,192 console - FallbackAssyPN: 'LK72-70488-CH'
10.01.2026 18:22:47,403 console - errorLog(message: ##---- sECUAssemblyNumberFallBack = LK72-70488-CH
10.01.2026 18:22:47,403 console - Setting assembly part number to: LK72-70488-CH for domain Telematic Control Unit Module [TCU] [3125]
Теперь посмотрим, почему паф не смог вычислить версию сам. Возьмём за основу резервную версию LK72-70488-CH и сравним её с данными, полученными напрямую из модуля TCU через UDS-команды — видим много несовпадений:
| DID | XML | Совпадение |
| ---- | ------------- | ---------- |
| F111 | J8A2-70719-CG |
| F188 | J8A2-70712-AY |
| F120 | J8A2-70712-BY |
| F121 | J8A2-70712-CY |
| F122 | J8A2-70712-FY |
| F123 | J8A2-70712-GK |
| F124 | J7A3-70713-AY |
| F125 | J7A3-70713-SH |
Теперь возьмём более новую версию (меняется последняя буква) LK72-70488-CJ — чуть лучше:
| DID | XML | Совпадение |
| ---- | ------------- | ---------- |
| F111 | J8A2-70719-CG |
| F188 | J8A2-70712-AZ |
| F120 | J8A2-70712-BZ |
| F121 | J8A2-70712-CZ |
| F122 | J8A2-70712-FY |
| F123 | J8A2-70712-GK |
| F124 | J7A3-70713-AZ |
| F125 | J7A3-70713-SJ | ⚠ (±1) |
Ну и наконец берём самую последнюю, доступную в пафе, LK72-70488-CK для этого модуля:
| DID | XML | Совпадение |
| ---- | -------------- | ---------------- |
| F111 | J8A2-70719-CG |
| F188 | J8A2-70712-AAA |
| F120 | J8A2-70712-BAA |
| F121 | J8A2-70712-CZ |
| F122 | J8A2-70712-FY |
| F123 | J8A2-70712-GK |
| F124 | J7A3-70713-AAA |
| F125 | J7A3-70713-SK | ⚠ (SH → SJ → SK) |
Как видим, совпадает всё, кроме одного компонента Calibration: в прошивке указано, что F125 должно быть J7A3-70713-SK, а по факту в модуле стоит J7A3-70713-SH (более старая версия). То есть до этого в модуле TCU обновили все компоненты, кроме одной калибровки. Из-за этого получилась неконсистентность по версиям, и паф не смог сам определить версию и в итоге выбрал последнюю известную из VIN.xml.
То, что мой скачанный конфиг AS-IS с сервера оказался по факту не самым актуальным, подтверждается ещё и модулем IPMA. В VIN.xml последняя дата AS-IS — 2023 год, для него была указана версия LK72-19H406-BE, а когда я подключил свой паф, он сам распознал более новую — LK72-19H406-BK — по UDS-ответам и своей логике.
Бонусом прикладываю скрипты в архиве:
1. uds_log_parser.py — парсит feedback.txt и делает CSV-файл, который можно импортировать в тот же Excel, чтобы удобно просматривать / фильтровать / сортировать версии ПО, калибровок и прочую информацию, полученную напрямую из модулей с течением времени.
2. compare_did.py — берёт на вход CSV (из uds_log_parser.py) и автоматически показывает, что изменилось по сравнению с данными, полученными в первый раз для каждого модуля.
3. allmodulesversions.py — берёт VIN.xml и делает 2 CSV: в одном показывает все модули и их основные версии ПО для всех конфигураций (AS_Ordered, As_Built, As_Is). Второй CSV показывает только те модули, в которых есть изменения. Если у вас есть несколько файлов VIN.xml, в которых отличается только конфигурация AS_IS, то их можно склеить и сделать один VIN.xml, в который вставить несколько полноценных блоков <module_record type="AS_IS">...</module_record>.
