Dvě ECU najednou

Projekt Qenex_TcpClient_XCP_2NucleoBoards_DAQ_STIM.qproj najdete ve složce Examples vedle QInsight.exe.

QInsight není omezený na jedno zařízení: v tomto příkladu měří, kalibruje a stimuluje dvě reálné ECU současně — dvě desky NUCLEO-H723ZG připojené přes switch k PC. Každá deska má vlastní driver a vlastní instanci protokolu XCP on TCP, signály obou jednotek jsou zobrazeny společně v jednom workspace: grafy je záměrně kombinují, tabulky vedou každou jednotku zvlášť.

Dvě desky NUCLEO-H723ZG připojené přes switch k notebooku s QInsight

Každá jednotka běží zcela nezávisle na vlastní IP adrese (192.168.2.20 a 192.168.2.21) — generuje tři sinusovky a přijímá zápisy parametrů. QInsight se ke každé připojuje samostatnou XCP session, takže výpadek, kalibrace ani stimulace jedné jednotky druhou nijak neovlivní.

Jak příklad funguje

  1. Každá deska počítá tři sinusovky. sine1 je rozdělená na raw (interní model) a value (publikovaný signál) — na ní se předvádí STIM bypass. sine2 a sine3 jsou běžná měření.
  2. Měřené signály přicházejí DAQ eventem po 10 ms, kalibrační parametry (amplitudy, periody) se čtou pollingem po 500 ms a dají se kdykoli zapsat.
  3. Periodický skript streamuje přes STIM do sine1_stim obou desek pomalou sinusovku — pro každou jednotku s jiným rozkmitem a frekvencí, aby byly v grafech na první pohled rozlišitelné.
  4. Přepínačem sine1_bypass si u každé jednotky nezávisle vyberete, jestli sine1_value vlastní interní model desky, nebo master přes STIM.

Podstata vícejednotkového projektu je v konfiguraci: každá jednotka = vlastní driver + vlastní instance protokolu, zbytek (eventy, konverze, prezentace) se sdílí.

Projekt krok za krokem

Projekt a drivery

Projekt se jmenuje XCP on TCP - 2x Nucleo demo signals (STIM bypass).

Záložka Project — název a popis projektuZáložka Project — název a popis projektu

V sekci Drivers & Protocols jsou dva TCP Client drivery — STM1 Nucleo TCP a STM2 Nucleo TCP. Nastavení mají identické až na IP adresu: STM1 míří na 192.168.2.20, STM2 na 192.168.2.21. Pod každým driverem běží vlastní instance protokolu XCP on TCP — dvě nezávislé XCP session, každá se svou deskou.

Driver STM1 Nucleo TCP — ip=192.168.2.20, pod ním instance XCP on TCPDriver STM1 Nucleo TCP — ip=192.168.2.20, pod ním instance XCP on TCP

Driver STM2 Nucleo TCP — jediný rozdíl je ip=192.168.2.21Driver STM2 Nucleo TCP — jediný rozdíl je ip=192.168.2.21

Eventy

Tři eventy definované jednou a sdílené oběma protokoly — každá XCP session si z nich vytvoří vlastní běhový kontext:

EventTypK čemu
Daq_demo10msDAQ, 10 msdeska sama streamuje měřené signály
Stim_demo10msSTIM, 10 msmaster streamuje stimulaci do desky
Poll500mspolling, 500 msčtení kalibračních parametrů

Event Daq_demo10ms — direction DAQ, perioda 10 msEvent Daq_demo10ms — direction DAQ, perioda 10 ms

Event Stim_demo10ms — direction STIM, tentýž firmware eventEvent Stim_demo10ms — direction STIM, tentýž firmware event

Event Poll500ms — obyčejné periodické čteníEvent Poll500ms — obyčejné periodické čtení

Konverze

Dvě lineární konverze: PassThrough (1:1) pro většinu signálů a StimPercent (eng = raw × 5 + 50) pro stimulaci — hodnota se zadává v procentech rozsahu ±10, takže 75 % znamená raw 5,0. QInsight konverzi při zápisu invertuje a po STIM streamuje raw hodnotu.

Konverze PassThrough — lineární 1:1Konverze PassThrough — lineární 1:1

Konverze StimPercent — eng = raw × 5 + 50, vstup v procentechKonverze StimPercent — eng = raw × 5 + 50, vstup v procentech

Prezentace

Šest prezentací podle rolí signálů — a protože jsou obě desky stejné, každou prezentaci sdílí příslušná dvojice proměnných STM1/STM2:

PrezentaceRozsahK čemu
Sine value−10…10výstupy sinusovek
Amplitude0…10kalibrační parametr amplitudy
Period0,05…60 skalibrační parametr periody
HAL tickmsmilisekundový čítač desky
Bypass0/1přepínač bypassu
Stim level0…100 %stimulace (konverze StimPercent)

Prezentace Sine value — rozsah ±10Prezentace Sine value — rozsah ±10

Prezentace AmplitudePrezentace Amplitude

Prezentace Period — jednotka sPrezentace Period — jednotka s

Prezentace HAL tick — jednotka msPrezentace HAL tick — jednotka ms

Prezentace Bypass — 0/1Prezentace Bypass — 0/1

Prezentace Stim level — procenta přes konverzi StimPercentPrezentace Stim level — procenta přes konverzi StimPercent

Proměnné

Projekt má 26 proměnných — stejná třináctka dvakrát. Jména nesou prefix jednotky (stm1_/stm2_), namespace je dělí na /Stm1 a /Stm2 a každá polovina je napojená na svůj protokol — obě sady se liší jen tím, ke které jednotce patří. Role v každé třináctce:

  • sine1_value + sine1_raw — publikovaný signál a interní model (DAQ); dvojice, na které je vidět bypass.
  • sine2_value, sine3_value — běžná DAQ měření.
  • sine1–3_amplitude, sine1–3_period — zapisovatelné kalibrační parametry, čtené pollingem.
  • uwTick (HAL tick) — milisekundový čítač; důkaz, že po XCP je dostupná libovolná globální proměnná z ELF.
  • sine1_stim — zápisová proměnná streamovaná po STIM.
  • sine1_bypass — přepínač: 0 = signál vlastní deska, 1 = master.

26 proměnných ve dvou namespacech /Stm1 a /Stm2, každá napojená na svůj protokol26 proměnných ve dvou namespacech /Stm1 a /Stm2, každá napojená na svůj protokol

Skripty

Stimulaci obsluhuje dvojice skriptů: init.py (Startup) připraví parametry, script.py (Periodic, 20 ms) obsluhuje obě jednotky najednou — každou jinou amplitudou a frekvencí, aby byly křivky v grafech rozlišitelné:

import math
t = 0
a = 50
b = 75
f1 = 1/8
f2 = 1/3
t += 0.02
stm1_sine1_stim.EngValue = 50 + a * math.sin(2 * math.pi * f1 * t)
stm2_sine1_stim.EngValue = 50 + b * math.sin(2 * math.pi * f2 * t)

STM1 dostává pomalou vlnu (perioda 8 s), STM2 rychlejší a s větším rozkmitem (perioda 3 s). Zápis jde v procentech přes konverzi StimPercent — skript s raw hodnotami vůbec nepracuje.

Sekce Scripts — script.py každých 20 ms, init.py při startuSekce Scripts — script.py každých 20 ms, init.py při startu

Výsledek

Workspace záměrně kombinuje signály obou desek v jednom grafu: levý graf kreslí STM1 sine1 (value + raw, STIM bypass) spolu se STM2 sine2/3, pravý zrcadlově STM2 sine1 spolu se STM1 sine2/3. Pod grafy jsou dvě Watch Table — jedna pro každou jednotku, obě s kompletní sadou: hodnoty, kalibrační parametry se zápisem, stimulace a bypass.

Živý běh — dva grafy s kombinovanými signály obou desek, dvě tabulky pro každou jednotkuŽivý běh — dva grafy s kombinovanými signály obou desek, dvě tabulky pro každou jednotku

Zapněte STM1 Sine 1 bypass a červená čárkovaná křivka v levém grafu přestane sledovat interní model — převezme ji pomalá vlna ze skriptu, zatímco sine1_raw pokračuje dál. STM2 přitom běží nezávisle vlastním tempem. Stejně nezávislá je kalibrace: změna STM2 Sine 2 amplitude se projeví jen na druhé desce.

Co si z příkladu odnést

  • Více jednotek = více dvojic driver + protokol. Konfigurace se jinak nemění; eventy, konverze i prezentace se definují jednou a sdílejí.
  • Jednotky běží nezávisle — každá na své adrese, se svou session; výpadek nebo zásah do jedné se druhé nedotkne. Prefixy jmen a namespacy (/Stm1, /Stm2) udržují projekt přehledný.
  • Grafy nejsou vázané na zdroj — do jednoho grafu lze přidat signály z různých zařízení a porovnáváte je na společné časové ose.
  • Kalibrace a STIM zůstávají oddělené pro každou jednotku — každá session má vlastní zápisy, vlastní bypass a vlastní stimulaci; jeden skript může řídit všechny najednou.

Dále