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:


Co ukázka předvádí
- DAQ měření — deska sama vysílá
sine1_value,sine1_raw,sine2_valueasine3_valuena svém eventudemo10ms(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_stimpomalou sinusovku; přepínačemsine1_bypassrozhodnete, zdasine1_valuevlastní 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 — presetDebugCan(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
DebugCanmá jiné adresy maticových objektů nežDebug). Nástrojtools/elf_vars_scan.pyz balíčku SDK s konfiguracíexamples/nucleo_h723zg/nucleo_h723zg.vars.jsonupravenou na ELF presetuDebugCanje 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):
| Parametr | Hodnota | Význam |
|---|---|---|
deviceId | 0xff | ID adaptéru (hexadecimálně) — upravte podle svého adaptéru |
bitrate | 500000 | 500 kbit/s, klasický CAN |
reconnectDelayMs | 1000 | prodleva mezi pokusy o inicializaci adaptéru |
reconnectAttempts | 2 | po 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:
| Parametr | Hodnota | Význam |
|---|---|---|
masterId | 0x200 | CAN id rámců master → slave |
slaveId | 0x201 | CAN id rámců slave → master |
extendedIds | false | 11bitové identifikátory |
requestTimeoutMs | 1000 | timeout odpovědi na příkaz |
requestRetries | 2 | opakování příkazu po timeoutu (navíc k prvnímu pokusu) |
daqTimestamps | slave | č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álost | Typ | Extra Params | K čemu |
|---|---|---|---|
Daq_demo10ms | Periodic 10 ms | direction="DAQ";daqId="0" | deska vysílá měřené signály (perioda jen dokumentuje cyklus kanálu) |
Stim_demo10ms | Periodic 10 ms | direction="STIM";daqId="0" | master každých 10 ms posílá aktuální hodnotu sine1_stim |
Poll500ms | Periodic 500 ms | — | polling kalibračních parametrů, přepínače bypass, čítače uwTick, křivky a qfwDemoMapOut |
OnRequest | OnRequest | — | 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á | Typ | Adresa | Směr | Událost | Prezentace |
|---|---|---|---|---|---|
sine1_value | float | 0x2400005C | read | Daq_demo10ms | Sine value (−10…10) |
sine1_raw | float | 0x24000058 | read | Daq_demo10ms | Sine value — interní model sinusovky 1, běží i při bypassu |
sine2_value | float | 0x24000074 | read | Daq_demo10ms | Sine value |
sine3_value | float | 0x2400008C | read | Daq_demo10ms | Sine value |
sine1_amplitude | float | 0x24000050 | readWrite | Poll500ms | Amplitude (0…10) |
sine1_period | float | 0x24000054 | readWrite | Poll500ms | Period (0,05…60 s; kratší periodu firmware ořízne) |
sine2_amplitude | float | 0x24000068 | readWrite | Poll500ms | Amplitude |
sine2_period | float | 0x2400006C | readWrite | Poll500ms | Period |
sine3_amplitude | float | 0x24000080 | readWrite | Poll500ms | Amplitude |
sine3_period | float | 0x24000084 | readWrite | Poll500ms | Period |
sine1_stim | float | 0x2400005C | write | Stim_demo10ms | Stim level (0…100 %) |
sine1_bypass | byte | 0x24000060 | readWrite | Poll500ms | Bypass (0/1) |
uwTick | uint | 0x24000124 | read | Poll500ms | HAL 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) | Tvar | Velikost | Adresa | Směr | Událost |
|---|---|---|---|---|---|
qfwDemoMap (Ignition map) | mapa 16 × 16 float, osy ushort / byte | 1072 B | 0x2401421C | readWrite | OnRequest |
qfwDemoCurve (Torque curve) | křivka 8 bodů ushort | 32 B | 0x2401464C | readWrite | Poll500ms |
qfwDemoBigMap (Injection map 64x64) | mapa 64 × 64 float, osy ushort | 16 640 B | 0x2401466C | readWrite | OnRequest |
qfwDemoMapOut (Map lookup) | skalár float | 4 B | 0x2401876C | read | Poll500ms |
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á) asine3_value(zelená). - Watch Table (obnova 250 ms)
se všemi skalárními proměnnými kromě
sine1_rawa se sloupcem Write — odtud se kalibruje, přepíná bypass i ručně zadává stimulace. - XY Graph:
sine1_valuena ose X protisine3_value, persistence 22 s. - Matrix se třemi záložkami: mapa
qfwDemoMap(tlačítko Read, barevná škála 4–32,5), křivkaqfwDemoCurve(pollovaná) a velká mapaqfwDemoBigMap(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 (
UPLOADbursty), 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_valueasine1_rawse překrývají,uwTickv 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_valuese odpojí od modelu a začne sledovat pomalou sinusovku ze skriptu (raw ±0,8), zatímcosine1_rawdál ukazuje interní model. Na XY grafu se změní tvar obrazce. Zapište0asine1_valuese vrátí k modelu. - Ruční stimulace. V Python Interpreteru nastavte
a = 0(nebo skript v projektu zakažte) a dosine1_stimzadejte např.75— do desky se bude přenášet konstantní raw hodnota 5,0, dokud hodnotu nepřepíšete. - Kalibrace. Zapište
sine2_amplitude = 8nebosine3_period = 2— zápis jde přesSET_MTA+DOWNLOADv 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
- XCP on TCP na NUCLEO-H723ZG — podrobný popis proměnných, prezentací, skriptů a pracovní plochy.
- Reference — PEAK CAN Adapter a Obnova spojení.
- Reference — XCP on CAN, Polling, DAQ a STIM u XCP, Proměnné typu Matrix u XCP a Block mód.
- Události — Extra Params pro DAQ a STIM.
- Spuštění a zastavení — stavy driverů.
- Matrix control.
- XCP v QFW SDK a XCP on classic CAN — firmware ukázky, transport CAN.
- Přehled skriptů — režimy Startup a Periodic.

