Pāriet pie satura

J1708/J1587 magistralės dekodavimas su PicoScope

Kaip visi žinome, visų tipų technikoje magistralės egzistuoja kur kas ilgiau, nei linkstame manyti. Nuo pat pradžių, kai duomenimis lėtai apsikeisdavo du ar trys ECU, iki šiandieninių sistemų su 30 ir daugiau ECU, apimančių viską nuo LIN iki Ethernet. Toks skirtingų magistralių derinys nėra retas, įskaitant senų ir naujų formatų su skirtingais greičiais derinimą, ir jį galima pamatyti daugelyje šiuolaikinių sunkvežimių bei statybinės ir žemės ūkio technikos, kur dažnai rasite gamintojui specifinės CAN, J1939 ir jos pirmtakės J1587 derinį. 

J1587 galima laikyti pasenusia magistrale, nes dauguma gamintojų renkasi labiau standartizuotą J1939. Vis dėlto J1587 tebėra plačiai naudojama ir ją vis dar galima rasti daugelyje naujų transporto priemonių ir mašinų. Vienas klientas kreipėsi klausdamas, ar J1587 galima dekoduoti su PicoScope, nes įprastas CAN dekoderis ir naujesnis J1939 dekoderis (daugiau informacijos čia) tiesiog neveikė. Kadangi visada esu pasiruošęs sužinoti ką nors naujo, nusprendžiau pažiūrėti, ar su PicoScope galime nustatyti ką nors daugiau nei tik įtampos lygius. 

Po aukštesniuoju J1587 sluoksniu yra J1708, kuri apibrėžia fizinį sluoksnį. Tai vis dar susukta laidų pora, sukurianti diferencinį signalą, kuris užtikrina patikimą ir stabilią aplinką duomenims perduoti, o bet kokie trikdžiai yra panaikinami. J1708 duomenų perdavimas, palyginti su šiuolaikiniais standartais, yra kur kas lėtesnis – vos 9,6 kbit/s. Galite pagalvoti, kad dėl tokio greičio būtų galima naudoti LIN dekoderį, bet, deja, tai neveiks – bandžiau! Įtampos lygiai yra kiek netikėti, palyginti su įprasta CAN, kurią matome J1939. 

Kaip matote iš aukščiau esančio paveikslėlio, J1708 + įtampos reikšmės yra nuo 1 V iki 4 V, o J1708 – nuo -0,4 V iki -4 V. Sukūrus matematinį kanalą, kuriuo iš teigiamo atimamas neigiamas, gauname signalą nuo -3,5 V iki +4 V. Kita galimybė – pasinaudoti 4X25/A serijos osciloskopų diapazonais, kur turime plaukiojantį (floating) įėjimą, leidžiantį matuoti tarp abiejų magistralės laidų. Pavyzdį žiūrėkite žemiau.

Sunku pradėti ką nors diagnozuoti, kol nežinome, kaip tai veikia. Kad dekoduočiau J1587, turėjau išsiaiškinti paketų formatą, o dėl šio standarto amžiaus internete nemokamai prieinama be galo daug informacijos. Vis dėlto, kalbant apie bet ką, kas susiję su magistralėmis, besidomintiems patarčiau būtinai peržiūrėti atitinkamus SAE dokumentus. Juose gausu informacijos apie magistralę bei paaiškinimų, kaip interpretuoti duomenis, kartu su mastelio (scale) ir poslinkio (offset) reikšmėmis, leidžiančiomis duomenis paversti diagnostikai tinkamais vienetais. Trumpai tai paliesiu, bet visa informacija yra SAE dokumente

J1587 yra gana paprasta – pranešimo formatą sudaro vos keturios dalys:

1.    Pranešimo ID (MID)
2.    Parametro ID (PID)
3.    Duomenys (kintamas baitų skaičius, paprastai 1 arba 2. Baitų skaičių nusako PID numeris)
4.    Kontrolinė suma (checksum)

Žiūrint į dekoduotų duomenų paketą, formatas yra toks:

MIDPIDDuomenys Duomenys PIDDuomenys Kontrolinė suma
128190 32  28  100  20  14

Aukščiau esančioje lentelėje matome, kad mūsų pranešimo ID yra 128, po kurio eina pirmasis parametro ID 190. Su PID 190 susieti du duomenų baitai – 32 ir 28. Toliau eina dar vienas PID 100 su duomenimis 20, o paketą užbaigia kontrolinė suma 14, patvirtinanti, kad pranešimas galiojantis. Vienas dalykas, į kurį verta atkreipti dėmesį – formatas, kuriuo užrašyti baitai. Paprastai, dirbdami su CAN dekodavimu, esame linkę juos peržiūrėti šešioliktainiu (Hexadecimal) formatu. Tačiau pastebėjau, kad SAE dokumente išvardyti ID yra pateikti dešimtainiu formatu. Dėl šios priežasties visą dekodavimą atliksiu dešimtainiu formatu, kad viskas išliktų paprasta.

MID (Message-ID) yra nustatyti pagal SAE dokumentą ir lieka fiksuoti. Du ECU negali turėti to paties MID, o tai labai padeda, kai bandome nustatyti, ar ECU yra prisijungę prie magistralės, ar ne. Verta žinoti, kad yra keletas MID, kurie gali neatitikti J1587 formato. Šie MID yra nuo 0 iki 127.

PID kelia kiek daugiau painiavos dėl skirtingo ilgio, kurį jie gali turėti priklausomai nuo atstovaujamo parametro. PID nuo 0 iki 127 ir PID nuo 256 iki 383 reikšmei perteikti naudoja vieną duomenų baitą. PID nuo 128 iki 191 ir PID nuo 384 iki 447 reikšmei perteikti naudoja du duomenų baitus. Aukščiau pateiktame pavyzdyje turime PID 190, o tai pagal minėtas sąlygas reiškia, kad kiti 2 baitai sudaro mūsų duomenis. Tačiau PID 100 patenka į pirmąją kategoriją, vadinasi, jam skirtas tik 1 duomenų baitas. Prie to sugrįšiu vėliau.

Taigi, pereikime prie dekodavimo. Naudosime UART dekodavimą, kurį taip pat naudojome K-Line dekoduoti ir suprasti. Šis dekoderis suskaido duomenis į baitus be jokio paketų išdėstymo. Dėl to magistralių dekodavimas tampa kiek sudėtingesnis, bet jei žinome paketo struktūrą, suprasti lengviau. Norėdami sukonfigūruoti dekoderį, kairėje PicoScope 7 Automotive įrankių juostoje pasirinkite More > Serial Decoding.
 

1.    Pirmajame lange pasirinkite R232/UART ir spustelėkite Next.

2.    Pasirinkite kanalą, kurį norite dekoduoti. Jei naudojate matematinius kanalus, jie pasirodys kaip pasirinkimas kartu su kitais aktyviais kanalais. Slenkstį (threshold) nustačiau į 0 V, nes nagrinėjama kreivė buvo užfiksuota plaukiojančiu būdu tarp magistralės aukštosios ir žemosios dalių, o 0 V yra maždaug per vidurį. Slenkstis – tai kirtimo taškas, kuriame dekoderis ieškos signalo kitimo. Histerezė – tai dydis abipus slenksčio, į kurį nebus atsižvelgiama, jei signalas pasikeistų. Kadangi dirbame su magistralėmis, nenumatyti pokyčiai nėra dažni, todėl histerezę galima nustatyti nedidelę. Duomenų perdavimo sparta (Baud rate) gali būti apskaičiuota automatiškai. Jei ne, nustatykite ją į 9,6 kBaud. Baite yra 8 bitai su vienu stabdos bitu ir be lyginumo (parity). Bitų tvarka – mažiausiai reikšmingas bitas (least significant bit). Kai tai bus atlikta, spustelėkite Next

3.    Paskutiniame lange galime pervadinti dekoderį. Savo pavyzdyje pakeičiau jį į J1587. Rodomi dekoduoti duomenys gali būti įvairių išvardytų formatų. Tiek grafikui, tiek lentelei pasirinkau Decimal. Kaip minėjau anksčiau, būtent taip SAE dokumente aprašyti MID ir PID. Pasirinkus All Buffers, lentelėje matysite viską, o tai gali palengvinti eksportavimą.

Dabar turėtumėte matyti lentelę su dekoduotais duomenimis, taip pat dekoderį grafike. Surikiuokite lentelę didėjančia tvarka, kad baitai būtų išdėstyti pagal laiką. Tam spustelėkite Packet header ir spustelėkite Buffer Number
 

Dabar galime pradėti didinti duomenų paketus ir aiškintis, kaip jie išdėstyti. Norėdami greitai pereiti prie paketo, du kartus spustelėkite / bakstelėkite duomenų baitą lentelėje – vaizdas iškart priartės prie to baito. Ankstesniame pavyzdyje buvo naudojamas MID 128, o mes jį turime 7-ame pakete. Pasirinkę šiek tiek atitolinkite vaizdą pelės ratuku, suspausdami ekraną arba naudodami horizontalaus mastelio valdiklį mastelio apžvalgos lange. 

Turėdami šį vaizdą, galime pritaikyti anksčiau išmoktą struktūrą. Aukščiau pateiktuose dekoduotuose duomenyse turime:

MIDPIDDuomenysDuomenysPIDDuomenysKontrolinė suma
128 190156 9226168

Vieną dalyką dabar turime ignoruoti – kontrolinę sumą. Kadangi duomenys dekoduojami baitais, ši reikšmė neatspindi tikrosios kontrolinės sumos, kuri gaunama atliekant skaičiavimą su pakete esančiais baitais. Tačiau visa kita tinka konvertuoti į realaus pasaulio duomenis. 

Remdamiesi SAE J1587 dokumentu bei daugybe internetinių šaltinių, matome, kad MID 128 reiškia variklio ECU Nr. 1. PID 190 atitinka variklio sūkius ir patenka į kategoriją, kurioje yra du duomenų baitai: 156 ir 8. Tada gauname dar vieną PID 92 – variklio apkrovą procentais – su vienu duomenų baitu: 26.

Duomenų baitų konvertavimas į tikruosius vienetus yra kiek sudėtingesnis, ypač kai baitai yra du. Pirmiausia susitelkime į PID 92 su duomenimis 26. Pasižiūrėję SAE J1587 ir suradę PID 92, matome, kad jo bitų skiriamoji geba (mastelis) yra 0,5 %. Kadangi jau dekodavome į dešimtainę sistemą, tereikia pritaikyti šį mastelio koeficientą duomenims: 26 × 0,5 = 13 %.

Kad apskaičiuotume PID 190, turime šiek tiek padirbėti, nes duomenis reikia konvertuoti atgal į šešioliktainę sistemą, kad galėtume juos pertvarkyti. Šis formatas yra lygiai toks pat, kaip ir konvertuojant variklio sūkius iš J1939. Konvertuoti 2 duomenų baitus atgal į HEX galima naudojant integruotą Windows skaičiuotuvo programuotojo režimą arba galite pakeisti, kaip dekoduoti duomenys atvaizduojami grafike ar lentelėje PicoScope 7 Automotive programinėje įrangoje. Tam du kartus spustelėkite dekoduotą kanalą kanalo parinktyse – bus parodytas konfigūracijos langas. Čia jokių pakeitimų nereikia, tad spustelėję Next pereikite į kitą langą. 
Būtent čia galite pakeisti, kaip lentelė arba grafikas atvaizduoja duomenis. Man patinka grafiko vaizdą palikti dešimtainį, kad matyčiau struktūrą, todėl paprastai lentelę perjungiu į HEX, bet tai grynai skonio reikalas. Užvedus pelę virš duomenų baito grafike, atsiras apžvalga, kurioje bus ir paketo numeris. Taip pat galite du kartus spustelėti / bakstelėti duomenų baitą – vaizdas automatiškai priartės prie jo kaip ir anksčiau, be to, baitas bus paryškintas dekodavimo lentelėje.
 

Čia matome, kad 9-as paketas dekodavimo lentelėje turi reikšmę 9C. Taip pat žinome, kad reikalingas ir kitas baitas – 08. Dabar turime apversti tvarką ir sujungti abu, kad gautume 089C. Šią reikšmę galime konvertuoti atgal į dešimtainę, kad pritaikytume mastelį ir bet kokį poslinkį pagal SAE J1587 dokumentą. Jame matome, kad mastelio koeficientas yra vos 0,25 sūk./min. Taigi visas konvertavimas atrodo taip: 089C HEX = 2204 dešimtainėje, 2204 × 0,25 = 551 sūk./min.

Tikiuosi, kad tai padeda šiek tiek geriau paaiškinti, kaip net ir neturėdami skirto dekoderio kiekvienai magistralei, galime pritaikyti esamus ir, šiek tiek pasidomėję, gauti mums reikalingus duomenis. Parengsiu dar vieną straipsnį, kuriame apžvelgsiu, kaip dekoduotų duomenų eksportas į CSV gali padėti nustatyti, kurie ECU yra prisijungę.

Straipsnis išverstas iš Pico Technology bibliotekos su gamintojo leidimu. Originalas: picoauto.com. PicoScope įrangą rasite mūsų kataloge.

Range Rover Sport L320: stabdžių stiprintuvo gedimas