XCP on CAN na NUCLEO-H723ZG: měření, stimulace a kalibrační mapy

Projekt Qenex_CAN_XCP_NucleoH723_Maps_FreeRTOS.qproj najdete ve složce Examples vedle QInsight.exe. Patří k obrazu ukázkového firmwaru QFW SDK examples/nucleo_h723zg přeloženému presetem DebugCan (FreeRTOS, transport CAN); obraz bez RTOS CAN nemá.

Je to CAN varianta ukázky XCP on TCP na NUCLEO-H723ZG: tytéž proměnné, události, skripty i pracovní plocha, jen deska komunikuje po klasickém CAN přes adaptér PEAK PCAN-USB. Na osmibajtových rámcích je dobře vidět, jak QInsight kombinuje DAQ, polling a STIM v jedné XCP session, proč se velké mapy čtou na vyžádání a proč se hodí block mód — a protože driver má záměrně omezený počet pokusů o obnovu spojení, ukázka předvádí i to, co se stane, když adaptér za běhu odpojíte.

Pracovní plocha je stejná jako u TCP varianty:

Plocha „Nucleo H723 live + maps“ za běhu (snímek z TCP varianty, plocha je shodná)Plocha „Nucleo H723 live + maps“ za běhu (snímek z TCP varianty, plocha je shodná)

Co ukázka předvádí

  • DAQ měření — deska sama vysílá sine1_value, sine1_raw, sine2_value a sine3_value na svém eventu demo10ms (každých 10 ms).
  • Kalibraci pollingem — amplitudy a periody tří sinusovek se čtou každých 500 ms a dají se kdykoli zapsat.
  • STIM bypass — periodický skript streamuje do sine1_stim pomalou sinusovku; přepínačem sine1_bypass rozhodnete, zda sine1_value vlastní interní model desky, nebo master přes STIM.
  • Mapy a křivku — mapa předstihu 16 × 16 a mapa 64 × 64 čtené na vyžádání tlačítkem Read, křivka momentu pollovaná každých 500 ms, editace buněk ve Write Mode a zápis jen změněných buněk.
  • Obnovu spojení s limitem — reconnectAttempts=2: po odpojení adaptéru driver ohlásí ztrátu transportu, dvakrát se pokusí o obnovu a poté další pokusy ukončí; znovu jej spustí tlačítko Start.

Co potřebujete

  • Desku NUCLEO-H723ZG s firmwarem ukázkového projektu QFW SDK (examples/nucleo_h723zg) přeloženým pro transport CAN — preset DebugCan (QFW_XCP_TRANSPORT=can), viz XCP on classic CAN.
  • Adaptér PEAK PCAN-USB propojený s CAN rozhraním desky; sběrnice klasický CAN, 500 kbit/s, rámce DLC 8.
  • XCP identifikátory master 0x200 / slave 0x201 (11bitové) — tak je má firmware i projekt.
  • Device ID adaptéru: projekt má deviceId=0xff. Hodnotu nahraďte ID nastaveným ve vašem adaptéru (PEAK Settings), jinak driver adaptér nenajde a bude opakovat pokusy podle parametrů obnovy.
  • Adresy proměnných odpovídající vašemu sestavení firmwaru. Adresy jsou absolutní a pocházejí z ELF souboru konkrétního sestavení (preset DebugCan má jiné adresy maticových objektů než Debug). Nástroj tools/elf_vars_scan.py z balíčku SDK s konfigurací examples/nucleo_h723zg/nucleo_h723zg.vars.json upravenou na ELF presetu DebugCan je vyčte a pole exportuje jako proměnné Matrix. Po každém novém sestavení firmwaru je v projektu obnovte, viz Adresy proměnných pro QInsight.

Projekt

Projekt obsahuje jeden driver PEAK CAN Adapter s protokolem XCP on CAN, čtyři události, sedmnáct proměnných, dva skripty a pracovní plochu Nucleo H723 live + maps se čtyřmi controly.

Driver a protokol

Driver PEAK CAN Adapter (label PCAN-USB):

ParametrHodnotaVýznam
deviceId0xffID adaptéru (hexadecimálně) — upravte podle svého adaptéru
bitrate500000500 kbit/s, klasický CAN
reconnectDelayMs1000prodleva mezi pokusy o inicializaci adaptéru
reconnectAttempts2po dvou po sobě jdoucích neúspěšných pokusech driver další pokusy ukončí (výchozí -1 = bez omezení)

Pod ním jediná instance protokolu XCP on CAN:

ParametrHodnotaVýznam
masterId0x200CAN id rámců master → slave
slaveId0x201CAN id rámců slave → master
extendedIdsfalse11bitové identifikátory
requestTimeoutMs1000timeout odpovědi na příkaz
requestRetries2opakování příkazu po timeoutu (navíc k prvnímu pokusu)
daqTimestampsslavečasová osa DAQ vzorků podle časových značek desky

Nastavení daqTimestamps má na CAN zřetelný dopad na rozložení DAQ paketů: se slave nese první ODT každého cyklu čtyřbajtovou časovou značku a zbývají v něm 2 datové bajty; bez časových značek ECU (hodnota master) má každý ODT 6 datových bajtů. Čtyři měřené floaty se v obou případech rozloží do více paketů na cyklus — protokol to udělá sám, viz Chování a diagnostika DAQ.

Block mód se nenastavuje — protokol ho zjistí při připojení a zapíše do logu; slave na CAN hlásí MAX_BS 16.

Události

Čtyři události; DAQ a STIM ukazují na tentýž event kanál firmwaru demo10ms (daqId="0"), jen v opačném směru:

UdálostTypExtra ParamsK čemu
Daq_demo10msPeriodic 10 msdirection="DAQ";daqId="0"deska vysílá měřené signály (perioda jen dokumentuje cyklus kanálu)
Stim_demo10msPeriodic 10 msdirection="STIM";daqId="0"master každých 10 ms posílá aktuální hodnotu sine1_stim
Poll500msPeriodic 500 ms—polling kalibračních parametrů, přepínače bypass, čítače uwTick, křivky a qfwDemoMapOut
OnRequestOnRequest—mapy čtené tlačítkem Read

Skalární proměnné

Všech třináct skalárních proměnných má v Comm params addressExtension="0" a multiplier="1"; adresy jsou v sestavení DebugCan stejné jako v obrazu s FreeRTOS pro TCP:

ProměnnáTypAdresaSměrUdálostPrezentace
sine1_valuefloat0x2400005CreadDaq_demo10msSine value (−10…10)
sine1_rawfloat0x24000058readDaq_demo10msSine value — interní model sinusovky 1, běží i při bypassu
sine2_valuefloat0x24000074readDaq_demo10msSine value
sine3_valuefloat0x2400008CreadDaq_demo10msSine value
sine1_amplitudefloat0x24000050readWritePoll500msAmplitude (0…10)
sine1_periodfloat0x24000054readWritePoll500msPeriod (0,05…60 s; kratší periodu firmware ořízne)
sine2_amplitudefloat0x24000068readWritePoll500msAmplitude
sine2_periodfloat0x2400006CreadWritePoll500msPeriod
sine3_amplitudefloat0x24000080readWritePoll500msAmplitude
sine3_periodfloat0x24000084readWritePoll500msPeriod
sine1_stimfloat0x2400005CwriteStim_demo10msStim level (0…100 %)
sine1_bypassbyte0x24000060readWritePoll500msBypass (0/1)
uwTickuint0x24000124readPoll500msHAL tick (ms) — důkaz, že je dosažitelná libovolná globální proměnná z ELF

Za pozornost stojí dvojice sine1_value / sine1_stim: stejná adresa, jednou čtená přes DAQ, podruhé zapisovaná STIM proudem. Výchozí hodnoty firmwaru: sinusovka 1 amplituda 1,0 / perioda 1 s, sinusovka 2 5,0 / 3 s, sinusovka 3 0,5 / 10 s.

Konverze jsou tři: PassThrough (1:1) pro všechno kromě stimulace a osy velké mapy, StimPercent pro sine1_stim — lineární multiplier=5, offset=50, tedy eng = raw · 5 + 50 (operátor i skript zadávají procenta, QInsight hodnotu invertuje na raw: 75 % = raw 5,0; 50 % = raw 0) — a LoadTenth (×0,1) pro osu Y velké mapy.

Maticové proměnné

Maticové proměnné mají v sestavení DebugCan tyto adresy (address extension 0, little-endian):

Proměnná (Label)TvarVelikostAdresaSměrUdálost
qfwDemoMap (Ignition map)mapa 16 × 16 float, osy ushort / byte1072 B0x2401421CreadWriteOnRequest
qfwDemoCurve (Torque curve)křivka 8 bodů ushort32 B0x2401464CreadWritePoll500ms
qfwDemoBigMap (Injection map 64x64)mapa 64 × 64 float, osy ushort16 640 B0x2401466CreadWriteOnRequest
qfwDemoMapOut (Map lookup)skalár float4 B0x2401876CreadPoll500ms

Prezentace os a dat i výchozí hodnoty ve firmwaru jsou stejné jako v TCP variantě.

Skripty

Dva skripty, oba jen pro runtime (ne pro replay). init.py běží v režimu Startup a připraví stav:

import math
t = 0
a = 4
f = 1/5

script.py běží periodicky každých 20 ms (blokující, bez timeoutu):

t += 0.02
sine1_stim.EngValue = 50 + a * math.sin(2 * math.pi * f * t)

Skript tedy do sine1_stim zapisuje sinusovku 50 ± 4 % s periodou 5 s; po inverzní konverzi je to raw ±0,8. Zápis přes EngValue hodnotu jen uloží — do desky ji každých 10 ms přenáší STIM proud události Stim_demo10ms a projeví se, jen když je sine1_bypass = 1. Skripty sdílejí jeden prostor, takže t, a i f z init.py jsou ve script.py k dispozici; a a f můžete za běhu měnit v okně Python Interpreter.

Workspace

Pracovní plocha má čtyři controly:

  • Graph (15 s okno): sine1_value (červená), sine1_raw (oranžová), sine2_value (modrá) a sine3_value (zelená).
  • Watch Table (obnova 250 ms) se všemi skalárními proměnnými kromě sine1_raw a se sloupcem Write — odtud se kalibruje, přepíná bypass i ručně zadává stimulace.
  • XY Graph: sine1_value na ose X proti sine3_value, persistence 22 s.
  • Matrix se třemi záložkami: mapa qfwDemoMap (tlačítko Read, barevná škála 4–32,5), křivka qfwDemoCurve (pollovaná) a velká mapa qfwDemoBigMap (tlačítko Read).

Rozložení otevírá vedle plochy i oba skripty a okno Python Interpreter.

Specifika CAN

  • Rámec klasického CAN nese nejvýše 7 datových bajtů odpovědi, takže mapa 1072 B znamená přes 150 rámců a mapa 64 × 64 přes 2 300 rámců. Čtení mapy 16 KB při 500 kbit/s trvá přibližně 0,6 s — proto jsou obě mapy na události On Request a nepollují se.
  • Čtení využívá slave block mód (UPLOAD bursty), zápis master block mód po blocích 16 × 6 B (DOWNLOAD + DOWNLOAD_NEXT, jedno potvrzení na blok).
  • Křivka (32 B) se polluje každých 500 ms i na CAN.
  • Přenos matice po více rámcích není atomický — pokud firmware buňky právě mění, může načtený blok obsahovat směs starých a nových hodnot.

Co uvidíte a co vyzkoušet

  • Měření. Po Connect naváže XCP session, v logu se objeví jméno a cyklus event kanálu z desky a graf začne kreslit čtyři sinusovky; sine1_value a sine1_raw se překrývají, uwTick v tabulce roste po 500 ms, křivka momentu se naplní.
  • Mapy. Stiskněte Read na záložce mapy zapalování — na CAN je vidět, jak se blok načítá. Upravte buňky ve Write Mode, stiskněte Write a zkontrolujte dalším Read a hodnotou Map lookup. Velkou mapu načtěte na její záložce; čtení trvá přibližně 0,6 s.
  • Bypass. Zapište sine1_bypass = 1. sine1_value se odpojí od modelu a začne sledovat pomalou sinusovku ze skriptu (raw ±0,8), zatímco sine1_raw dál ukazuje interní model. Na XY grafu se změní tvar obrazce. Zapište 0 a sine1_value se vrátí k modelu.
  • Ruční stimulace. V Python Interpreteru nastavte a = 0 (nebo skript v projektu zakažte) a do sine1_stim zadejte např. 75 — do desky se bude přenášet konstantní raw hodnota 5,0, dokud hodnotu nepřepíšete.
  • Kalibrace. Zapište sine2_amplitude = 8 nebo sine3_period = 2 — zápis jde přes SET_MTA + DOWNLOAD v inženýrských jednotkách (Zápis hodnot do zařízení) a do 500 ms se nová hodnota vrátí pollingem.
  • Odpojení adaptéru. Odpojte PCAN-USB za běhu. Driver během jedné sekundy ohlásí protokolu ztrátu transportu, přejde do stavu Faulted, dvakrát (s prodlevou 1 s) se pokusí adaptér znovu otevřít a pak s chybou gave up after 2 reconnect attempt(s) zastaví svůj protokol a skončí ve stavu Stopped. Runtime přitom běží dál — skript dále počítá, data se však nepřenášejí. Znovu připojte adaptér a v okně Properties driveru stiskněte Start: driver i protokol se spustí, XCP naváže novou session a DAQ i STIM se obnoví, viz Stavy driverů a tlačítko Start. Pokud adaptér znovu připojíte ještě během dvou pokusů, spojení se obnoví samo.

Související kapitoly