Referentie
Projectformaat (YAML)
Een project is één YAML-bestand, eventueel opgesplitst met includes:. Paden zijn relatief aan het projectbestand. Het JSON Schema (arnodiqa schema, ook in docs/arnodiqa.schema.json) geeft autocomplete en validatie in VS Code via de eerste regel van het bestand. Dit is het echte demoproject:
# yaml-language-server: $schema=../../docs/arnodiqa.schema.json # # Arnodiqa demo project: two virtual CAN channels with a remaining bus # simulation built from the databases (every database node runs the CAN # interaction layer), so it runs without hardware: # # arnodiqa run examples/demo/demo.yaml --simulated --duration 10s # version: 21 name: Demo description: PowerTrain (CAN FD) and Comfort (CAN) on virtual networks. includes:2 system_variables: sysvars.yaml networks:3 - name: PowerTrain channel: 1 bus: can_fd4 bitrate: 500000 data_bitrate: 2000000 hardware:5 virtual: network: vcan1 databases:6 - powertrain.dbc - name: Comfort channel: 2 bitrate: 500000 hardware: virtual: network: vcan2 databases: - comfort.dbc measurement:7 working_mode: simulated_bus duration: 10s measurement_setup:8 blocks: - logging: id: Logging file: logs/{ConfigName}_{MeasurementIndex}.blf9 - filter: id: PowerTrainOnly action: pass rules: - channels: [1] # Fires on the first EngineData frame with EngineSpeed = 800 rpm (the # database start value); later ones are ignored while the block is open. - trigger: id: HighRpm input: PowerTrainOnly10 mode: single pre_trigger: 50ms11 post_trigger: 200ms conditions: - event: signal: message: EngineData signal: EngineSpeed op: '==' value: 800 max_triggers: 1 - logging: id: HighRpmLog input: HighRpm file: logs/high_rpm_{IncMeasurement}.asc - view: id: Trace kind: trace - view: id: Statistics kind: statistics simulation:12 # All nodes of both databases become IL nodes. To test a real ECU, list it # under `exclude` (e.g. `exclude: [ECM]`) and connect the hardware. restbus: il: counters: - message: EngineData signal: AliveCounter
versionis de formaatversie (nu 2). Oudere projecten worden automatisch gemigreerd, nieuwere geweigerd met een foutmelding.includeszet een sectie (hier de systeemvariabelen) in een eigen bestand, zodat teams minder merge-conflicten hebben.networksbevat één netwerk per applicatiekanaal (channel: 1= CAN1), met naam en bitrate.bus: can_fdgaat samen metdata_bitrate. Optioneel zijnsample_point,fd_mode: iso|non_isoenlisten_only.hardwareis de kanaalmapping:virtual(benoemd virtueel netwerk), een backend-specifieke vorm zoalspcan,vector,kvaser,socketcan,slcanofgs_usb(ziearnodiqa hw list), of de generieke vormdevice. In de simulated-busmodus zijn alle netwerken virtueel, ongeacht de mapping.databasesnoemt de DBC-bestanden voor decodering, triggers op signaalwaarden en de Interaction Layer.measurementbevatmode: online|offline,working_mode: real_bus|simulated_bus,duration, event-sortering, offline-bronnen en pacing.measurement_setup.blocksbeschrijft de analyse-dataflow, zie Measurement Setup.- Bestandsnamen kunnen field codes bevatten. Zonder
inputhangt een blok aansource(alle events). inputkoppelt blokken tot een keten, of voegt er meerdere samen met een lijst van ids.- Tijden schrijf je als
50ms,1.5s,2min(eenheden ns, us, ms, s, min, h, d). simulation.restbusregelt de restbussimulatie. Elke node uit de databases wordt een Interaction Layer-node die zijn berichten zendt volgens de send types en cyclustijden uit de DBC. Metexclude: [ECM]laat je een node weg om een echte ECU te testen;il.countersdefinieert alive counters. Daarnaast zijn ersimulation.nodesvoor afzonderlijke nodes, bijvoorbeeld een CAPL-programma (kind: capl,file: capl/gateway.can), en replay-blokken. Panels staan onderpanels:als YAML-bestanden.
Waardetypes
| Type | Schrijfwijze |
|---|---|
| TimeSpan | 250ms, 1.5s, 10s, 2min; kaal getal = milliseconden |
| FrameId | "0x123" (standaard), "0x18FEF100x" (extended), of een getal (extended als > 0x7FF) |
| SysVar-types | int32 uint32 int64 uint64 float string data int_array float_array |
Measurement Setup
De Measurement Setup is een boom (DAG) van functieblokken met als wortel de meetbron (source). Takken lopen parallel. Een blok met meerdere inputs voegt die in tijdsvolgorde samen en geeft een event dat via twee takken binnenkomt slechts één keer door. Het demoproject als graaf:
Bloktypes
| Blok | Doel | Belangrijkste velden |
|---|---|---|
filter | Pass- of stopfilter. Een event matcht als één regel matcht (OF); binnen een regel moeten alle criteria kloppen (EN). Uitgeschakeld laat het filter alles door. | action: pass|stop, rules: [{channels, ids, id_ranges, messages, directions, event_types, signal}], enabled |
trigger | Laat data alleen door rond triggermomenten, met pre- en post-trigger. | mode: single|toggle|entire_measurement, conditions (start, stop, event, sysvar), pre_trigger, post_trigger, max_triggers, retrigger: ignore|extend, stop_measurement, buffer_size |
logging | Schrijft naar BLF of ASC in een eigen thread; kan zelf ook een trigger bevatten. | file (field codes), format: blf|asc, compression 0-9, asc_decimals: 6|9, max_file_size, max_file_duration, log_sysvars, trigger, queue_capacity |
view | Uitgang naar een venster; precies wat het venster krijgt. | kind: trace|data|graphics|statistics |
break | Blokkeert alles erachter (om tijdelijk een tak uit te zetten). | id, input |
Alle blokken hebben id, input (standaard source, of een lijst voor merge) en comment.
Field codes
In bestandsnamen van logging-blokken kun je deze field codes gebruiken:
{MeasurementStart} {MeasurementIndex} {IncMeasurement} {IncTrigger} {IncSize} {IncTime} {LoggingBlock} {ConfigName} {TriggerCondition} {@NS::Var}.
Overbelasting
In real time wacht de meting nooit. Volle queues worden geteld (mainQueueDropped, lost) en leveren exitcode 5. In simulated- of offline-modus ("as fast as possible") wachten producenten en gaat er niets verloren. UI-subscripties laten altijd de oudste events vallen, met een teller.
Architectuur
Zie Hoe het werkt voor het diagram. Kort samengevat bestaat het product uit Rust-crates (bf-core, bf-hw, bf-db, bf-log, bf-project, bf-engine, bf-cli, bf-diag, bf-test, de script-VM) en een Tauri/React-applicatie die alleen via de Session-facade met de engine communiceert.
IPC-contract (UI ↔ engine)
| Command | Resultaat |
|---|---|
load_project(path) | ProjectInfo (networks, messages + signals, blocks) |
start_measurement / stop_measurement | () / MeasurementReport |
measurement_status | state, time, load 0..1, stopRequested |
pause / resume / step(size) | simulated bus en offline |
transmit(req) | Interactive Generator: channel, id, data, fd, brs |
subscribe_events(tap, interval, capacity) | binaire batches per 16 tot 33 ms, drop-oldest met teller |
statistics / block_statistics(id) | StatisticsSnapshot |
sysvars / set_sysvar | SysVarInfo[] / bool |
messages / subscribe_messages | meldingen voor het Write-venster |
JSON-velden zijn camelCase, tijden zijn nanoseconden sinds meetstart (i64), CAN-ID's zijn strings ("0x123", "0x18FEF100x").