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ů:

TvarOsyDataPříklad
PoležádnéN hodnotblok 16 korekčních konstant
KřivkaX1×N hodnotcharakteristika čidla (8 bodů)
MapaX + YN×M hodnotmapa 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é

  1. Otevřete Home → Project Configuration → Variables.
  2. V rozbalovacím seznamu vedle tlačítka + zvolte Matrix a klikněte na +.
  3. V detailu proměnné vyplňte kromě obvyklých vlastností (Name, Label…) tři pole specifická pro matici: Default Data Type, Endianness a Layout.

Matrix proměnná ThermalField v Project ConfigurationMatrix proměnná ThermalField v Project Configuration

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):

TypVelikost prvku
byte, sbyte1 B
ushort, short2 B
uint, int, float4 B
ulong, long, double8 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
xCountpočet breakpointů osy X (sloupce); zadáním klíče osa X vzniká
xTypedatový typ prvků osy X (jinak Default Data Type)
xPresjméno prezentace pro osu X
xLabelpopisek osy X — Matrix control ho zobrazí nad tabulkou
yCountpočet breakpointů osy Y (řádky); vyžaduje osu X
yType, yPres, yLabeltotéž pro osu Y (popisek se kreslí svisle vlevo)
dataCountpočet datových hodnot — jen u pole bez os
dataTypedatový typ datových prvků (jinak Default Data Type)
dataPresjméno prezentace pro data

Pravidla:

  • Pole (bez os) musí mít dataCount. S osami se dataCount neuvádí — počet dat je odvozený: křivka xCount, mapa xCount × yCount.
  • Osa Y vyžaduje osu X (yCount bez xCount je chyba).
  • xType/xPres/xLabel bez xCount je chyba (obdobně pro Y).
  • Prezentace (xPres, yPres, dataPres) odkazují jménem na prezentace projektu — musí existovat. Datovou sekci popisuje Label samotné proměnné, samostatný dataLabel neexistuje.
  • 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í:

SekceHodnotBajty (offset)
osa X30–5
osa Y26–9
data (2 řádky × 3 sloupce)610–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:

ProtokolLimitDůvod
Modbus Master — direction="read"125 registrů = 250 B (osy + data)celá matice se čte jedním požadavkem FC03/FC04
Modbus Master — write / readWrite123 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) + osypř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í i inputRegister) — bitové tabulky coil/discreteInput validace 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).
  • wordOrder se u matice neuplatní — pořadí bajtů určuje Endianness proměnné. Registr Modbusu jsou 2 bajty, vyšší bajt první.

Tip: s buňkami ushort a Endianness = Big odpoví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ňky byte = 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"

Matrix proměnná qfwDemoMap (Ignition map) přiřazená k XCP on TCP s událostí OnRequestMatrix proměnná qfwDemoMap (Ignition map) přiřazená k XCP on TCP s událostí 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íč size musí odpovídat velikosti celého bloku (osy + data), jinak jde o chybu konfigurace. dataType se 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.