Automatisering en CI

De command line arnodiqa gebruikt dezelfde engine en dezelfde projectbestanden als de desktop-app. Ze is bedoeld voor testbanken zonder scherm, nachtelijke runs en CI-pipelines. Elk commando geeft een gedocumenteerde exitcode en met --json een rapport voor verdere verwerking.

EULA en licentie op build-agents

Bij het eerste gebruik vraagt Arnodiqa om de EULA te aanvaarden. Op een build-agent zonder interactie doe je dat met --accept-eula of de omgevingsvariabele ARNODIQA_ACCEPT_EULA=yes; de aanvaarding wordt één keer lokaal vastgelegd. Wie de installer stil uitvoert, geeft ARNODIQA_ACCEPT_EULA=yes mee aan msiexec /qn of setup.exe /S; de aanvaarding geldt dan voor de hele machine. arnodiqa license eula toont de tekst offline.

Een licentiebestand zet je klaar in de licentiemap van de machine of geef je mee met ARNODIQA_LICENSE_FILE, bijvoorbeeld als alleen-lezen mount in een container.

CI agent
export ARNODIQA_ACCEPT_EULA=yes
export ARNODIQA_LICENSE_FILE=/licences/site.arnlic
arnodiqa license show --json

Een project draaien

De desktop-app komt als Windows-installer die zonder internetverbinding installeert en draait. Voor de voorbeelden is geen hardware nodig. Zonder licentiebestand werkt Arnodiqa 30 dagen met alle functies.

1. Een project valideren

arnodiqa validate
$ arnodiqa validate examples/demo/demo.yaml
ok

2. Een meting draaien

Het demoproject heeft twee virtuele CAN-netwerken (PowerTrain op CAN FD, Comfort op CAN). De Interaction Layer simuleert alle nodes uit de twee DBC-bestanden. De meting draait op de gesimuleerde bus, dus zo snel als de CPU toelaat.

arnodiqa run
$ arnodiqa run examples/demo/demo.yaml --duration 2s
measurement #3: 2.000000 s, 990 events, stop: Duration

channel  frames      rx      tx  err  fps(last s)  load%   peak%  state
CAN1        920       0     920    0          460   14.2    14.2  ErrorActive
CAN2         70       0      70    0           35    0.8     0.8  ErrorActive

channel  id            count  cycle avg/min/max [ms]
CAN1    400             400  4.998/4.002/5.998
CAN1    100             200  9.999/9.496/10.504
CAN1    210             200  10.000/9.500/10.500
CAN1    1A0             100  19.989/18.865/20.252
CAN2    320              40  50.000/49.536/50.464
CAN1    300              20  99.987/99.750/100.000
CAN2    321              20  99.987/99.708/100.292
CAN2    18FF1E01x        10  199.953/199.580/200.000

logging:
  Logging: 990 events, 0 lost
    examples\demo\logs\Demo_3.blf
  HighRpmLog: 94 events, 0 lost
    examples\demo\logs\high_rpm_003.asc

De meetindex (#3) wordt buiten het project bijgehouden in demo.state.yaml. Zo verandert het projectbestand niet bij elke run en blijft git schoon.

3. In CI: JSON-rapport

Met --json komt het volledige rapport als één JSON-object op stdout (hier geformatteerd weergegeven). Tijden staan in nanoseconden.

arnodiqa run --json
$ arnodiqa run examples/demo/demo.yaml --duration 2s --json | jq .
{
  "exitCode": 0,
  "report": {
    "duration": 2000000000,
    "events": 990,
    "lateEvents": 0,
    "logging": [
      {
        "error": null,
        "eventsWritten": 990,
        "files": [
          "examples\\demo\\logs\\Demo_4.blf"
        ],
        "id": "Logging",
        "lost": 0,
        "preTriggerOverflow": 0,
        "sysvarsWritten": 0
      },
      {
        "error": null,
        "eventsWritten": 94,
        "files": [
          "examples\\demo\\logs\\high_rpm_004.asc"
        ],
        "id": "HighRpmLog",
        "lost": 0,
        "preTriggerOverflow": 0,
        "sysvarsWritten": 0
      }
    ],
    "mainQueueDropped": 0,
    "measurementIndex": 4,
    "messages": [],
    "statistics": {
      "channels": [
        {
          "busloadMeasured": true,
          "busloadPeakPercent": 14.1834,
          "busloadPercent": 14.1832,
          "channel": 1,
          "chipState": "errorActive",
          "errorFrames": 0,
          "errorFramesPerSec": 0.0,
          "extData": 0,
          "extRemote": 0,
          "fdFrames": 400,
          "frames": 920,
          "framesPerSec": 460.0,
          "rec": 0,
          "recPeak": 0,
          "rx": 0,
          "rxOverruns": 0,
          "stdData": 920,
          "stdRemote": 0,
          "tec": 0,
          "tecPeak": 0,
          "tx": 920,
          "txQueueOverflows": 0,
          "txRequests": 0
        },
        {
          "busloadMeasured": true,
          "busloadPeakPercent": 0.814,
          "busloadPercent": 0.814,
          "channel": 2,
          "chipState": "errorActive",
          "errorFrames": 0,
          "errorFramesPerSec": 0.0,
          "extData": 10,
          "extRemote": 0,
          "fdFrames": 0,
          "frames": 70,
          "framesPerSec": 35.0,
          "rec": 0,
          "recPeak": 0,
          "rx": 0,
          "rxOverruns": 0,
          "stdData": 60,
          "stdRemote": 0,
          "tec": 0,
          "tecPeak": 0,
          "tx": 70,
          "txQueueOverflows": 0,
          "txRequests": 0
        }
      ],
      "eventsTotal": 990,
      "ids": [
        {
          "channel": 1,
          "count": 200,
          "cycleAvg": 9998723.618090453,
          "cycleLast": 9748000,
          "cycleMax": 10504000,
          "cycleMin": 9496000,
          "dlc": 8,
          "id": "0x100",
          "lastTime": 1990488000,
          "minSendDistance": 9258000
        },
        {
          "channel": 1,
          "count": 100,
          "cycleAvg": 19988535.353535354,
          "cycleLast": 20000000,
          "cycleMax": 20252000,
          "cycleMin": 18865000,
          "dlc": 8,
          "id": "0x1A0",
          "lastTime": 1980242000,
          "minSendDistance": 18623000
        },
        {
          "channel": 1,
          "count": 200,
          "cycleAvg": 10000000.0,
          "cycleLast": 9752000,
          "cycleMax": 10500000,
          "cycleMin": 9500000,
          "dlc": 8,
          "id": "0x210",
          "lastTime": 1990244000,
          "minSendDistance": 9256000
        },
        {
          "channel": 1,
          "count": 20,
          "cycleAvg": 99986842.10526316,
          "cycleLast": 100000000,
          "cycleMax": 100000000,
          "cycleMin": 99750000,
          "dlc": 8,
          "id": "0x300",
          "lastTime": 1900246000,
          "minSendDistance": 99504000
        },
        {
          "channel": 1,
          "count": 400,
          "cycleAvg": 4998125.313283208,
          "cycleLast": 4506000,
          "cycleMax": 5998000,
          "cycleMin": 4002000,
          "dlc": 15,
          "id": "0x400",
          "lastTime": 1995381000,
          "minSendDistance": 3621000
        },
        {
          "channel": 2,
          "count": 40,
          "cycleAvg": 50000000.0,
          "cycleLast": 49828000,
          "cycleMax": 50464000,
          "cycleMin": 49536000,
          "dlc": 8,
          "id": "0x320",
          "lastTime": 1950242000,
          "minSendDistance": 49294000
        },
        {
          "channel": 2,
          "count": 20,
          "cycleAvg": 99986947.36842105,
          "cycleLast": 99708000,
          "cycleMax": 100292000,
          "cycleMin": 99708000,
          "dlc": 4,
          "id": "0x321",
          "lastTime": 1900166000,
          "minSendDistance": 99542000
        },
        {
          "channel": 2,
          "count": 10,
          "cycleAvg": 199953333.33333334,
          "cycleLast": 200000000,
          "cycleMax": 200000000,
          "cycleMin": 199580000,
          "dlc": 8,
          "id": "0x18FF1E01x",
          "lastTime": 1800286000,
          "minSendDistance": 199294000
        }
      ],
      "time": 2000000000
    },
    "stopReason": "duration",
    "txFailed": 0
  }
}

4. Offline: een logbestand opnieuw analyseren

shell
arnodiqa run examples/demo/demo.yaml --offline examples/demo/logs/Demo_1.blf

De logbestanden vervangen de bronnen van het project. Filters, triggers en logging-blokken werken net als online.

Commando's

arnodiqa --help
arnodiqa headless measurement runner

Usage: arnodiqa.exe <COMMAND>

Commands:
  run       Run a measurement and print statistics
  validate  Check a project for errors
  schema    Print the JSON Schema of project files
  capl      CAPL tools
  convert   Convert a log file between ASC, BLF, MF4 and PCAPNG (formats from the extensions)
  export    Decode a log file with databases and export the signals as CSV, MATLAB (.mat) or Parquet
  stats     Print the contents of a log file: duration, counts per channel and identifier
  hw        Hardware interfaces
  db        Database tools for DBC, LDF and ARXML: lint, diff, convert, info
  test      Run the test units (`*.vtestunit.yaml`) or CAPL test modules of a project in the simulated bus and write reports. Exit code by verdict
  flash     Flash an ECU with its flash program (`diagnostics.ecus[].flash`): Intel HEX, S-record, binary or ODX-F/PDX. Exit code and JSON report for CI and the production line
  support   Support: bundle with logs and system information, system info, log folder
  license   Licence: status, install a licence file, machine fingerprint, EULA
  help      Print this message or the help of the given subcommand(s)

Options:
      --accept-eula  Accept the EULA on behalf of your company (recorded once; for CI also ARNODIQA_ACCEPT_EULA=yes). Read it with `arnodiqa license eula`
  -h, --help         Print help
  -V, --version      Print version
CommandoDoel
runMeting draaien (online, offline of gesimuleerd), statistiek en logbestanden
validate, schemaProject controleren; JSON Schema van projectbestanden
testTest units en CAPL-testmodules uitvoeren, rapporten schrijven
capl check, capl lspCAPL-programma compileren en foutmeldingen tonen; language server voor editors
hw list, hw selftestDriverbackends, status en aangesloten kanalen; zelftest van een interface
flashEen ECU flashen via UDS, met JSON-rapport
licenseLicentiestatus, licentiebestand installeren, fingerprint, EULA
supportSupportbundel, systeeminformatie en logmap
stats, convertLogbestand samenvatten; converteren tussen ASC, BLF, MF4 en PCAPNG
exportSignalen exporteren naar CSV, MATLAB of Parquet
dbDatabases controleren, vergelijken, converteren en samenvatten (DBC, LDF, ARXML)

arnodiqa run <PROJECT>

OptieBetekenis
--duration <SPAN>Stop na deze meettijd (bv. 10s, 500ms, 2min). Zonder deze optie loopt een online meting tot Ctrl+C.
--offline <FILE>Offline met deze logbestanden (herhaalbaar); vervangt de bronnen van het project.
--simulatedGesimuleerde bus (geen hardware).
--real-busEchte bus (hardware of virtuele netwerken op de wandklok).
--without-loggingStart met alle logging-blokken uit.
--timeout <SPAN>Veiligheidslimiet in wandkloktijd voor de hele run; wordt die bereikt, dan is de exitcode 6.
--start-time <ISO8601>Vaste starttijd voor de headers van logbestanden en {MeasurementStart}, voor reproduceerbare bestanden.
--top-ids <N>Aantal ID's in de statistieken (standaard 20).
-q, --quietAlleen fouten en de samenvattingsregel.
--jsonRapport als JSON op stdout: {"exitCode": n, "report": {…}} of {"exitCode": n, "error": "…"}.

Een project met CAPL-nodes draait op dezelfde manier. Meldingen van de nodes verschijnen met hun meettijd vóór het rapport.

arnodiqa run
$ arnodiqa run examples/demo/capl_demo.yaml --duration 2s
[    0.000000] info: CaplGateway: gateway PowerTrain -> Comfort active
[    0.000000] info: ParkAssist: park assist started
[    1.000000] info: CaplGateway: 100 frames routed, last speed 800 rpm
[    2.000000] info: CaplGateway: id 0x100 seen 200 times
[    2.000000] info: CaplGateway: id 0x210 seen 200 times
measurement #3: 2.000000 s, 1209 events, stop: Duration

channel  frames      rx      tx  err  fps(last s)  load%   peak%  state
CAN1        939       0     939    0          470   14.4    14.4  ErrorActive
CAN2        270       0     270    0          135    2.5     2.5  ErrorActive
…

arnodiqa validate <PROJECT> · arnodiqa schema

validate controleert het YAML-model, laadt daarna de databases en de blokverwijzingen via de engine en print ok of de gevonden problemen. schema print het JSON Schema van projectbestanden.

Exitcodes van run

CodeBetekenis
0Meting gedraaid en normaal gestopt
1Meting gedraaid, maar een logging-blok meldde een fout
2Ongeldige command line
3Project niet te laden of inconsistent
4Meting kon niet starten of faalde tijdens het draaien
5Meting gedraaid, maar events gingen verloren (overbelasting of volle logging-queue)
6--timeout bereikt; rapport en logbestanden zijn compleet tot dat moment
130Gestopt met Ctrl+C (na een nette stop met rapport en gesloten logs); een tweede Ctrl+C stopt direct

arnodiqa test <PROJECT>

Voert de test units (*.vtestunit.yaml) of CAPL-testmodules van een project uit in de gesimuleerde bus. Elke unit draait in een eigen meting met de simulatienodes, de restbus en een testnode. Omdat de gesimuleerde tijd zo snel loopt als de pc toelaat, duurt een wachttijd van 1 s minder dan een echte seconde, en twee runs geven identieke rapporten.

arnodiqa test
$ arnodiqa test examples/demo/capl_demo.yaml --html report.html --junit junit.xml --report report.json
running Demo ...
Demo [test unit] PASS
  PASS         T-1 EngineData cycle time
  PASS         T-2 Cycle time 256 in [9, 11] ms
  PASS         T-2 Cycle time 416 in [18, 22] ms
  PASS         T-2 Cycle time 528 in [9, 11] ms
  PASS         T-3 Park assist / Mode request 1
  PASS         T-3 Park assist / Mode request 2
  PASS         T-4 Park assist / Mode Off stops the status frame
  PASS         T-5 Speed limit ramp (stimulus)
verdict PASS: 1 test unit(s), 8 test case(s): 8 passed, 0 failed, 0 inconclusive, 0 error, 0 skipped
$ echo $?
0
OptieBetekenis
--unit <UNIT>Unit op naam, .vtestunit.yaml-bestand of CAPL-testmodule (.can); herhaalbaar. Standaard: alle units van het project.
--variant <NAME=VALUE>Waarde van een variant property (herhaalbaar).
--report, --junit, --html <FILE>Rapport als JSON, JUnit XML of HTML. Het HTML-rapport is één zelfstandige pagina zonder scripts.
--max-time <SPAN>Maximale meettijd per unit (standaard 1 uur gesimuleerde tijd).
--real-busDe working mode van het project gebruiken in plaats van de gesimuleerde bus.
--json, -qJSON-rapport op stdout; alleen de samenvatting.
ExitcodeBetekenis
0Alle uitgevoerde testcases geslaagd
1Minstens één testcase gefaald
2Ongeldige command line
3Project, test unit of testboom niet te laden, of geen unit gevonden
4Fout in het testsysteem (compileerfout, runtime-fout, unit niet afgerond)
5Slechtste verdict: inconclusive
8Geen enkele testcase uitgevoerd

arnodiqa capl check <FILE>

Compileert een CAPL-programma en toont foutmeldingen als bestand:regel:kolom: ernst code: melding. Met --project gebruikt de compiler de databases en systeemvariabelen van het project; zonder project zijn berichten en systeemvariabelen onbekend. --json levert de meldingen in JSON voor editors. De exitcode is 0 zonder fouten, 1 met fouten en 3 als het project niet te laden is.

arnodiqa capl check
$ arnodiqa capl check examples/demo/capl/gateway.can --project examples/demo/capl_demo.yaml
examples/demo/capl/gateway.can: 0 error(s), 0 warning(s)
$ arnodiqa capl check examples/demo/capl/gateway.can
examples/demo/capl/gateway.can:21:12: error E1012: unknown message 'EngineData'
examples/demo/capl/gateway.can:31:12: error E1012: unknown message 'WheelSpeeds'
examples/demo/capl/gateway.can:36:1: error E1013: unknown system variable 'Demo::Mode'
examples/demo/capl/gateway.can: 3 error(s), 0 warning(s)
$ echo $?
1

Verdere opties: --db (extra DBC-bestanden), -I (include-paden), --node (waarde van %NODE_NAME%), --allow-undeclared-sysvars.

arnodiqa hw list

Toont per driverbackend of de bibliotheek van de fabrikant gevonden is, en welke apparaten en kanalen aangesloten zijn. Een ontbrekende bibliotheek is geen fout; de backend wordt dan als "not found" gemeld. Met --json voor scripts.

arnodiqa hw list
$ arnodiqa hw list
virtual    Virtual CAN bus (in-process) found, 8 channels
             Virtual CAN Bus (serial VIRTUAL, 8 channels)
pcan       not found: PCANBasic.dll is missing (LoadLibraryExW failed)
vector-xl  not found: vxlapi64.dll is missing (LoadLibraryExW failed)
kvaser     not found: canlib32.dll is missing (LoadLibraryExW failed)
socketcan  not available on this operating system
slcan      SLCAN (serial) found, 2 channels
             COM4 (serial COM4, 1 channel)
             COM5 (serial COM5, 1 channel)
gs_usb     gs_usb / candleLight found, 0 channels

Uitvoer op een Windows-pc zonder geïnstalleerde PEAK-, Vector- en Kvaser-drivers. Kanaalmapping in het project: hardware: {pcan: {channel: PCAN_USBBUS1}}, {vector: {app: arnodiqa, channel: 1}}, {kvaser: {serial: …, channel: 0}}, {socketcan: {interface: can0}}, {slcan: {port: COM5}}, {gs_usb: {channel: 0}}.

arnodiqa hw selftest test een nieuwe interface met twee kanalen op één bus (--pair), één kanaal met interne loopback (--channel) of twee LIN-kanalen (--lin-pair), en schrijft een rapport als JSON of HTML.

arnodiqa flash <PROJECT> --ecu <ECU>

Flasht een ECU met het flashprogramma uit het project (diagnostics.ecus[].flash). Firmware als Intel HEX, Motorola S-record, binair bestand (met --base) of ODX-F/PDX (--odx-session). Zonder eigen stappen geldt de standaardsequentie: extended session, DTC-setting en communicatie uit, programming session, security access, fingerprint, per segment wissen, downloaden en controleren, en tot slot ECU-reset. Bij een fout of annulering volgt een ECU-reset.

arnodiqa flash
arnodiqa flash project.yaml --ecu DoorECU --file door_v2.hex --report flash.json
arnodiqa flash project.yaml --ecu DoorECU --file door.bin --base 0x80000 --var fingerprint=261015000000000001
arnodiqa flash project.yaml --ecu DoorECU --file door.pdx --odx-session APP --simulated --json

Verdere opties: --format ihex|srec|bin|odx, --timeout (exitcode 6 bij overschrijding), --real-bus, -q. Met --simulated antwoordt de ECU-simulatie van het project, zodat een flashprogramma zonder hardware te controleren is.

arnodiqa support bundle | info | logs

Maakt een supportbundel (zip) met systeeminformatie, versie en instellingen, de hardwarelijst, recente logs en crashrapporten. Gebruikersnamen, hostnaam en serienummers worden geanonimiseerd. Sleutels, busdata en CAPL-bronnen gaan er nooit in. Er wordt niets geüpload. --dry-run toont vooraf wat erin gaat.

arnodiqa support
arnodiqa support bundle --since 7d --out support.zip
arnodiqa support bundle --include-project project.yaml --dry-run
arnodiqa support info
arnodiqa support logs

Logs staan op Windows in %LOCALAPPDATA%\Arnodiqa\logs, op Linux in ~/.local/state/arnodiqa/logs. Het logniveau stel je in met ARNODIQA_LOG of in diagnostics.json, in de app via Help.

arnodiqa export --db <[CH:]FILE> <INPUT> <OUTPUT>

Decodeert een logbestand (ASC, BLF, MF4 of PCAPNG) met DBC- of LDF-databases en exporteert de signalen als CSV, MATLAB (.mat) of Parquet. Met het voorvoegsel KANAAL: geldt een database alleen voor dat kanaal. Layout wide (standaard) geeft één tabel per bericht; long geeft één tabel met een rij per signaalwaarde (tijd, kanaal, bericht, signaal, waarde, eenheid, tekst).

arnodiqa export
$ arnodiqa export --db 1:powertrain.dbc --db 2:comfort.dbc --format csv Demo_1.blf signals
1485 frames decoded (0 without database entry) of 1485 events, 12638 signal values in 8 table(s), 0.041 s
  EngineData                              300 rows  signals\EngineData.csv
  BCM_Lights                               60 rows  signals\BCM_Lights.csv
  DCM_DoorState                            30 rows  signals\DCM_DoorState.csv
  TransmissionData                        150 rows  signals\TransmissionData.csv
  Seat_Climate                             15 rows  signals\Seat_Climate.csv
  WheelSpeeds                             300 rows  signals\WheelSpeeds.csv
  BCM_MuxInfo                              30 rows  signals\BCM_MuxInfo.csv
  PT_FD_Status                            600 rows  signals\PT_FD_Status.csv
$ head -3 signals/EngineData.csv
time,channel,EngineSpeed,CoolantTemp,OilTemp,ThrottlePos,EngineState,EngineTorque,AliveCounter,Checksum
0.000242,1,768,20,0,0,0,0,0,0
0.01024,1,768.25,20,0,0,0,0,0,0
$ arnodiqa export --db 1:powertrain.dbc --db 2:comfort.dbc --format parquet --layout long Demo_1.blf signals.parquet
1485 frames decoded (0 without database entry) of 1485 events, 12638 signal values in 1 table(s), 0.066 s
  signals                               12638 rows  signals.parquet
FormaatwidelongOpmerkingen
csvmap met <Bericht>.csvsignals.csvKomma als scheidingsteken, punt als decimaalteken
matstruct per berichtkolommen en signaalnamenMATLAB Level 5
parquetmap met <Bericht>.parquetsignals.parquetSnappy-compressie, eenheden als metadata; voor pandas, Polars, Spark en DuckDB

time staat in seconden sinds de meetstart; de absolute starttijd staat in de metadata. CSV en Parquet schrijven tijdens het lezen weg en zijn daarom geschikt voor zeer grote logs. Exitcodes: 0 succes, 2 gebruiksfout, 3 database niet te laden, 4 lees- of schrijffout.

arnodiqa db lint | diff | convert | info

Databasetools voor DBC, LDF en ARXML. Bij een ARXML-bestand met meerdere clusters kies je er één met --cluster; zonder die optie behandelen lint en info elk cluster afzonderlijk.

arnodiqa db info
$ arnodiqa db info system.arxml
system.arxml#PT_CAN (CAN (AUTOSAR))
  frames:        5
  signals:       24
  nodes:         3 (ECM, GW, TCM)
  value tables:  0
  bus load:      3.6 % .. 4.3 % at 500 / 2000 kbit/s (cycle times; 3 frames, 160 frames/s; bit rate from database)

system.arxml#Body_CANFD (CAN FD (AUTOSAR))
  frames:        4
  signals:       15
  nodes:         2 (BCM, GW)
  value tables:  0
  bus load:      4.2 % .. 7.5 % at 500 / 2000 kbit/s (cycle times; 3 frames, 152 frames/s; bit rate from database)

system.arxml#Door_LIN (LIN)
  frames:        6
  signals:       9
  nodes:         3 (BCM, DDM, PDM)
  value tables:  2
  schedules:     Normal, Collision_Resolve, Config
  bus load:      33.3 % .. 46.7 % at 19.2 kbit/s (schedule table Normal; 4 frames, 100 frames/s; bit rate from database)
$ arnodiqa db convert system.arxml pt_can.dbc --cluster PT_CAN
pt_can.dbc written (dbc: 5 frames, 24 signals)
$ arnodiqa db diff system.arxml pt_can.dbc --cluster-a PT_CAN
--- system.arxml#PT_CAN
+++ pt_can.dbc
no differences
arnodiqa db lint
$ arnodiqa db lint body.ldf
body.ldf:20: warning[parse-warning] frame 'F2' reuses id 0x10
body.ldf:19: warning[parse-warning] frame 'F1': signal 'B' overlaps another signal
body.ldf: error[duplicate-id] F1: identifier 0x10 used by F1, F2
body.ldf: warning[unused-signal] Orphan: signal Orphan is in no frame
body.ldf: warning[unused-value-table] encoding type Unused is not used by any signal
body.ldf: error[zero-factor] encoding TooBig: scale 0
body.ldf: warning[value-description-out-of-range] Small: encoding TooBig uses raw 9..9, signal has 2 bits
body.ldf: warning[value-description-out-of-range] Small: encoding TooBig uses raw 0..10, signal has 2 bits
body.ldf: warning[suspicious-cycle-time] schedule table Main: delay 7 ms is no multiple of the time base 5 ms
2 error(s), 7 warning(s), 2 info(s)
$ arnodiqa db lint --format github body.ldf
::warning file=body.ldf,line=20,title=parse-warning::frame 'F2' reuses id 0x10
::warning file=body.ldf,line=19,title=parse-warning::frame 'F1': signal 'B' overlaps another signal
::error file=body.ldf,title=duplicate-id::F1: identifier 0x10 used by F1, F2
…
CommandoDoel en optiesExitcode
db lint <FILES>…Fouten en waarschuwingen (overlappende signalen, dubbele ID's, bereiken, cyclustijden, ongebruikte waardetabellen enzovoort). Meerdere bestanden gelden als één netwerk en worden ook op ID-conflicten gecontroleerd. --level, --strict, --format text|json|github.0 zonder fouten, 1 met fouten (met --strict ook bij waarschuwingen), 4 bestand niet te laden
db diff <A> <B>Inhoudelijke verschillen in frames, signalen en nodes, ook tussen formaten (ARXML tegen DBC).0 gelijk, 1 verschillen, 4 bestand niet te laden
db convert <IN> <OUT>ARXML naar DBC (CAN-cluster) of LDF (LIN-cluster), of een DBC/LDF normaliseren. --check schrijft niets en controleert in CI of een bestand genormaliseerd is; --cp1252 voor DBC in Windows-1252.bij --check: 1 als het bestand zou wijzigen
db info <FILE>Aantallen frames, signalen, nodes en waardetabellen, met een busload-schatting. --frames, --bitrate.0

arnodiqa license show | install | fingerprint | eula | accept

Licenties zijn ondertekende bestanden (*.arnlic) die lokaal gecontroleerd worden, zonder netwerkverbinding.

CommandoDoel
license showStatus: type, klant, einde onderhoud, evaluatie (--json)
license install <FILE>Licentiebestand installeren na controle van de handtekening; --system voor alle gebruikers van de computer
license fingerprintFingerprint van deze computer, voor een machinegebonden licentie
license eulaDe EULA tonen (--lang nl|en)
license acceptDe EULA aanvaarden namens het bedrijf; --system voor alle gebruikers

arnodiqa capl lsp en VS Code

De CAPL Language Server spreekt het Language Server Protocol over stdin/stdout en gebruikt dezelfde compiler als capl check en de meetstart. Hij levert foutmeldingen tijdens het typen, completion (ook met berichten, signalen en systeemvariabelen uit het project), hover, go-to-definition, outline, signature help en semantic tokens. Het project wordt gevonden via de instelling arnodiqa.project of het dichtstbijzijnde project boven het bestand.

De VS Code-extensie bevat syntaxkleuring, snippets, de LSP-client en het commando Arnodiqa: run test. Ze wordt geleverd als .vsix en installeert zonder internetverbinding:

shell
$ code --install-extension arnodiqa-capl.vsix

Andere editors gebruiken arnodiqa capl lsp (of arnodiqa-capl-lsp) als language server; een TextMate-grammatica is beschikbaar voor syntaxkleuring.

Voorbeeld: CI-stap

.gitlab-ci.yml / GitHub Actions (schets)
export ARNODIQA_ACCEPT_EULA=yes
arnodiqa db lint --format github db/*.dbc db/*.ldf
arnodiqa validate project.yaml
arnodiqa test project.yaml --junit junit.xml --html report.html
code=$?      # 0 = pass, 1 = fail, 4 = error in test system, 8 = no test case ...
arnodiqa run project.yaml --simulated --duration 30s --json > run.json
exit $code

Bestandsformaten, stats en convert

FormaatLezenSchrijvenDetails
BLFJaJaObjecten CAN_MESSAGE(2), CAN_FD_MESSAGE(_64), error frames, driver-error/chip-state, LIN-objecten; zlib-containers; streaming met begrensd geheugen; resync bij corrupte objecten; redt complete objecten uit een afgekapt bestand.
ASCJaJaVarianten van CANoe 7 tot 13, EN/DE-datum, absolute of relatieve tijd, CAN FD-regels met lengte en bitcount, LIN-regels, systeemvariabelen (SV:), 6 of 9 decimalen.
DBCJaJaUTF-8 en Windows-1252; mux en extended mux, VAL_, SIG_VALTYPE_, attributen, J1939.
LDFJaJaLIN 1.3, 2.0, 2.1, 2.2A, ISO 17987-3, SAE J2602-3.
ODX / PDXJaNeeDiagnosebeschrijvingen (ASAM MCD-2D) voor symbolische diagnose en ECU-simulatie.
MF4JaJaASAM MDF 4.1, bus logging voor CAN, CAN FD en LIN; deflate-compressie.
PCAPNGJaJaCAN en CAN FD (SocketCAN-linktype), te openen in Wireshark. LIN wordt overgeslagen en geteld.
ARXMLJanaar DBC/LDFAUTOSAR Classic 4.x en 3.x: CAN, CAN FD, container-PDU's, LIN-clusters; E2E- en SecOC-eigenschappen worden ingelezen. Meerdere bestanden worden samengevoegd.
CSV, MATLAB, ParquetNeeJaSignaalexport, zie arnodiqa export.

arnodiqa stats <FILE>

arnodiqa stats
$ arnodiqa stats examples/demo/logs/Demo_1.blf
file:        examples/demo/logs/Demo_1.blf
format:      BLF
start:       2026-10-14 17:51:22.976
stop:        2026-10-14 17:51:25.971
objects (header): 1485
events:      1485
time span:   0.000242 .. 2.995380 s (duration 2.995138 s)
skipped:     0

channel  classic   remote       fd   errors
      1      780        0      600        0
      2      105        0        0        0

channel  id            count
      1  100             300
      1  1A0             150
      1  210             300
      1  300              30
      1  400             600
      2  320              60
      2  321              30
      2  18FF1E01x        15

read in 0.004 s (395715 events/s)

Bij een klein bestand bepaalt de opstarttijd de doorvoer; zie Prestaties voor grote bestanden.

arnodiqa convert <INPUT> <OUTPUT>

arnodiqa convert
$ arnodiqa convert Demo_1.blf Demo_1.mf4
1485 events written to Demo_1.mf4 in 0.018 s (81291 events/s); 0 skipped, 0 unparsable, 0 not representable
$ arnodiqa convert Demo_1.mf4 Demo_1.pcapng
1485 events written to Demo_1.pcapng in 0.013 s (112468 events/s); 0 skipped, 0 unparsable, 0 not representable

Zet om tussen ASC, BLF, MF4 en PCAPNG; het formaat volgt uit de extensies. Starttijd en kanaalnamen gaan mee. Events die het doelformaat niet kan bewaren (bijvoorbeeld LIN in PCAPNG), worden overgeslagen en geteld. Met --db mag de uitvoer ook een signaalbestand zijn (.csv, .parquet, .mat). --level 0-9 zet de compressie voor BLF en MF4 (standaard 6, het kleinste bestand; metingen loggen met niveau 1). --json geeft het resultaat als JSON. bf-logtool is een alias met dezelfde functies.