Proměnná Matrix (pole, křivka, mapa)
Vedle skalární proměnné umí QInsight i proměnnou typu Matrix — souvislý blok bajtů, který se interpretuje jako tabulka hodnot s volitelnými osami. Typické použití jsou kalibrační data řídicích jednotek: bloky hodnot, charakteristiky a mapy (v terminologii ASAP2 typy VAL_BLK, CURVE a MAP).
Podle toho, které osy jsou definované, má proměnná jeden ze tří tvarů:
| Tvar | Osy | Data | Příklad |
|---|---|---|---|
| Pole | žádné | N hodnot | blok 16 korekčních konstant |
| Křivka | X | 1×N hodnot | charakteristika čidla (8 bodů) |
| Mapa | X + Y | N×M hodnot | mapa předstihu otáčky × teplota |
Osy nesou breakpointy (hodnoty, ve kterých je mapa definovaná), datová sekce vlastní hodnoty. Celá matice — osy i data — se ze zařízení čte jako jeden souvislý blok (zapisují se jen změněné buňky) a zobrazuje se controlem Matrix.
Založení proměnné
- Otevřete Home → Project Configuration → Variables.
- V rozbalovacím seznamu vedle tlačítka + zvolte Matrix a klikněte na +.
- V detailu proměnné vyplňte kromě obvyklých vlastností (Name, Label…) tři pole specifická pro matici: Default Data Type, Endianness a Layout.


Na obrázku je teplotní pole 8 × 6 z ukázky
Simulace: všechny signály: typ prvku
UShort, Little endian a Layout
xCount="8";xPres="posMm";xLabel="X [mm]";yCount="6";yPres="posMm";yLabel="Y [mm]";dataPres="tempC"
Default Data Type a Endianness
- Default Data Type — datový typ prvku, který se použije pro všechny
sekce, jež si v Layoutu neurčí vlastní typ. Výchozí je
byte. - Endianness — pořadí bajtů vícebajtových prvků (
Little/Big). Platí pro celý blok, tedy pro osy i data.
Podporované typy prvků (typ string u matice použít nelze):
| Typ | Velikost prvku |
|---|---|
byte, sbyte | 1 B |
ushort, short | 2 B |
uint, int, float | 4 B |
ulong, long, double | 8 B |
Layout — definice sekcí
Pole Layout popisuje sekce matice stejným zápisem klíč="hodnota";…,
jaký znáte z polí Settings a Comm params. Sekce se definují v počtech
hodnot (ne bajtů) — bajtové offsety a celková velikost se dopočítají
automaticky z počtů a typů prvků.
| Klíč | Význam |
|---|---|
xCount | počet breakpointů osy X (sloupce); zadáním klíče osa X vzniká |
xType | datový typ prvků osy X (jinak Default Data Type) |
xPres | jméno prezentace pro osu X |
xLabel | popisek osy X — Matrix control ho zobrazí nad tabulkou |
yCount | počet breakpointů osy Y (řádky); vyžaduje osu X |
yType, yPres, yLabel | totéž pro osu Y (popisek se kreslí svisle vlevo) |
dataCount | počet datových hodnot — jen u pole bez os |
dataType | datový typ datových prvků (jinak Default Data Type) |
dataPres | jméno prezentace pro data |
Pravidla:
- Pole (bez os) musí mít
dataCount. S osami sedataCountneuvádí — počet dat je odvozený: křivkaxCount, mapaxCount × yCount. - Osa Y vyžaduje osu X (
yCountbezxCountje chyba). xType/xPres/xLabelbezxCountje chyba (obdobně pro Y).- Prezentace (
xPres,yPres,dataPres) odkazují jménem na prezentace projektu — musí existovat. Datovou sekci popisuje Label samotné proměnné, samostatnýdataLabelneexistuje. - Chybný Layout se projeví okamžitě — pole se orámuje červeně a chyba se zobrazí jako tooltip.
Příklady
Pole — 16 hodnot typu float (64 B):
dataCount="16";dataType="float"
Křivka — 8 breakpointů otáček a 8 hodnot momentu:
xCount="8";xPres="Speed";xLabel="Speed [RPM]";dataPres="Torque"
Mapa — 3 sloupce (otáčky) × 2 řádky (teplota), s popisky obou os:
xCount="3";xPres="Speed";xLabel="Speed [RPM]";yCount="2";yPres="Temp";yLabel="Temp. [K]";dataPres="Torque"
Uspořádání bloku v paměti
Blok má vždy pořadí: osa X → osa Y → data; data mapy jsou uložená
po řádcích (index = y × xCount + x). Pro mapu 3×2 z příkladu výše
s Default Data Type = ushort a bez vlastních typů sekcí:
| Sekce | Hodnot | Bajty (offset) |
|---|---|---|
| osa X | 3 | 0–5 |
| osa Y | 2 | 6–9 |
| data (2 řádky × 3 sloupce) | 6 | 10–21 |
Celkem 11 hodnot = 22 B. Změníte-li typ některé sekce (xType, yType,
dataType), offsety se automaticky přepočítají.
Prezentace a konverze per sekce
Každá sekce má vlastní prezentaci — osy mívají jiné jednotky a škálování než data (otáčky × teplota × moment). Platí totéž co u skalární proměnné:
- Lineární konverze přepočítá raw hodnotu z bloku na engineering
hodnotu (
eng = raw × Multiplier + Offset); Print Format a Unit prezentace určují formát zobrazení. - Enum konverze zobrazí místo čísla název stavu.
- Sekce bez prezentace zobrazuje přímo raw hodnotu.
Při editaci ve write módu zadáváte vždy engineering hodnotu — do zařízení se zapíše raw hodnota získaná inverzní konverzí (zaokrouhlená a zkontrolovaná na rozsah datového typu).
Omezení velikosti
Největší možná matice závisí na protokolu, ke kterému ji přiřadíte:
| Protokol | Limit | Důvod |
|---|---|---|
Modbus Master — direction="read" | 125 registrů = 250 B (osy + data) | celá matice se čte jedním požadavkem FC03/FC04 |
Modbus Master — write / readWrite | 123 registrů = 246 B (osy + data) | Write Multiple Registers (FC16) přenese nejvýše 123 registrů |
| XCP (on CAN i on TCP) | datová sekce 16 384 B (64 × 64 × 4) + osy | přenos po blocích (block mode), viz níže |
Limit hlídá protokol, ne editor Project Configuration — v editoru
založíte matici libovolné velikosti (kontroluje se jen správnost Layoutu).
Matici, která se do limitu svého protokolu nevejde, protokol odmítne:
v logu se objeví varování
Protocol variable specification for variable … could not be created (…)
s důvodem (např. …exceeding the Modbus limit of 123 registers (246 bytes) per request. nebo …the XCP limit is 16384 bytes (64 × 64 × 4).)
a proměnná se nekomunikuje.
Přiřazení k protokolu
Matici přiřadíte k protokolu stejně jako skalární proměnnou (šipkou do
Communicated). Matici dnes podporují Modbus Master a XCP
(on CAN i on TCP); v ukázce Simulation Signals ji generuje i signál
thermal.
Modbus Master
U Modbus Masteru zadejte v Comm params např.:
registerType="holdingRegister";address="100";direction="readWrite";eventRef="poll500ms"
Zvláštnosti oproti skalární proměnné:
- Matice smí být jen v registrové tabulce (
holdingRegister, pro čtení iinputRegister) — bitové tabulkycoil/discreteInputvalidace odmítne. - Blok zabírá souvislý rozsah registrů od
address; počet registrů = velikost v bajtech / 2 (zaokrouhleno nahoru). Mapa z příkladu (22 B) obsadí registry 100–110. - Celá matice se čte jedním požadavkem FC03/FC04; při zápisu se posílají jen registry změněných buněk (FC06/FC16).
wordOrderse u matice neuplatní — pořadí bajtů určuje Endianness proměnné. Registr Modbusu jsou 2 bajty, vyšší bajt první.
Tip: s buňkami
ushortaEndianness = Bigodpovídá jedna buňka přesně jednomu registru a hodnoty v QInsight odpovídají 1:1 registrům v zařízení. Pozor na tyto případy: buňkybyte= dvě buňky v jednom registru,ushort+Little= prohozené bajty (hodnota 5 se přenese jako 1280).
XCP (on CAN, on TCP)
U XCP jsou klíče Comm params stejné jako u skalární proměnné, např. mapa zapalování z ukázky Nucleo H723:
address="0x24014270";addressExtension="0";direction="readWrite";multiplier="1";eventRef="OnRequest"


address(+addressExtension) je začátek celého bloku, tedy první prvek osy X (u pole bez os začátek dat). Pořadí sekcí v paměti ECU musí odpovídat uspořádání bloku: osa X → osa Y → data po řádcích.- Volitelný klíč
sizemusí odpovídat velikosti celého bloku (osy + data), jinak jde o chybu konfigurace.dataTypese u matice ignoruje — typy prvků určuje Layout. - Endianness proměnné musí odpovídat ECU. Blok se přenáší surově a dekóduje podle Endianness proměnné; nesoulad s pořadím bajtů ECU ohlásí QInsight po připojení varováním (data nemění).
- Událost: periodická — celá matice se polluje jako jeden blok
každou periodu; On Request — matice se nepolluje a čte se
tlačítkem Read v Matrix controlu.
Bez
eventRef(a se směrem jiným nežwrite) jde o chybu konfigurace. - Matici nelze navázat na DAQ/STIM událost — protokol ji odmítne s chybou cannot bind to the DAQ/STIM event channel … a matrix is polled by a periodic event or read on request.
Přenos po blocích. Blok do velikosti MAX_CTO − 1 bajtů (na TCP
247 B, na CAN 7 B) se přečte jedním SHORT_UPLOAD. Větší blok se čte
jedním SET_MTA a sérií UPLOAD po nejvýše 255 B, na které ECU
v block módu odpovídá dávkou paketů bez dalších dotazů. Zápis jde
přes SET_MTA + DOWNLOAD/DOWNLOAD_NEXT v blocích (s block módem
mastera). Neumí-li ECU block mód, QInsight přenos řetězí paket po
paketu — funguje to, jen pomaleji. Vícepaketový přenos není atomický.
Zápis buněk. Při zápisu se neposílá celá matice: rozeditované buňky se seřadí podle offsetu, sousední buňky se sloučí do souvislých oken a každé okno se zapíše samostatně. Vložený řádek 64 buněk je tak jeden přenos.
Orientačně: na TCP (smyčka proti pc_server z QFW SDK) trvá čtení mapy
1 072 B asi 3,5 ms a mapy 64 × 64 (16 640 B) asi 6 ms. Na CAN
(500 kbit/s) jsou časy o řády delší.
Kompletní projekty s mapami, křivkou a mapou 64 × 64 najdete v ukázkách XCP on TCP — kalibrační mapy a XCP on CAN — kalibrační mapy.
Dále
Matici zobrazíte a editujete controlem Matrix.

