Few pieces of technology have proved as quietly enduring as Bosch's Controller Area Network. Conceived in 1983 to replace ever-growing wiring harnesses in passenger cars, it now carries the most consequential conversations inside a modern electric vehicle — torque requests to inverters, contactor commands from battery management, fault codes destined for the technician's scanner — at modest data rates that would embarrass an ethernet engineer, yet with a reliability that has outlasted three generations of automotive computing.
This monograph is written for the practising EV controls engineer who needs to know not merely what CAN does, but why it survives in safety-critical powertrains, where it is being replaced, and how the protocol's mechanical details — bit timing, arbitration, error counters — translate into the calibration screens and oscilloscope traces of daily work. Each section ends with practical notes drawn from production experience on traction inverters and HV batteries.
Before CAN, an automobile was wired point-to-point: every switch, sensor and lamp had its own dedicated copper. By the early 1980s the harness in a fully optioned Mercedes had ballooned past two kilometres of wire weighing more than 50 kg. Bosch engineer Uwe Kiencke and his team set out to design a serial bus that was cheap, robust, prioritised and multi-master — a network where any node could speak when the bus was idle, and where the most urgent message would always go through first.
The 1986 SAE paper announcing CAN listed four design choices that, in retrospect, explain its longevity:
| Principle | Consequence |
|---|---|
| Message-oriented (not address-oriented) | Any node may consume any frame; ECUs can be added without rewiring software. |
| Non-destructive bitwise arbitration | Collisions cost nothing — the loser silently steps aside and the winner's frame survives intact. |
| Multi-cast broadcast | One transmission reaches every listener, halving traffic versus point-to-point. |
| In-bit error detection | Five complementary mechanisms catch corruption with a residual error probability below 10⁻¹³. |
For an electric vehicle, these properties matter more, not less, than they did for an internal-combustion car. A traction inverter must decide within a millisecond whether to honour a torque request; a battery management system must veto closing the main contactors if even one of 100+ cell modules reports a fault. CAN's deterministic priority resolution and its tolerance of single-wire failures (an open or short on either bus line still permits degraded operation per ISO 11898-2) make it a natural fit for safety-critical traffic that must arrive.
A high-speed CAN bus consists of exactly two wires — CAN_H and CAN_L — twisted together, terminated at each end of the trunk with a 120 Ω resistor matching the cable's characteristic impedance. Information is encoded not in the absolute voltage of either wire, but in the differential voltage between them, which radically improves immunity to the electromagnetic chaos of an EV powertrain.
The bus has two states, deliberately named to avoid the usual high/low ambiguity:
The asymmetry is intentional. When one node transmits a dominant bit and another transmits a recessive bit simultaneously, the dominant bit overwrites the recessive — this is the AND-of-the-bus property on which all arbitration depends.
A classical CAN data frame is a packet of between 47 and 135 bits — short, by any modern standard. Every byte exists for a reason: arbitration, addressing, length signalling, payload, integrity, acknowledgement, end-marker. Understanding the layout makes oscilloscope decoding intuitive and explains, for instance, why an 11-bit ID message of zero data length still requires 47 bit-times to transmit.
| Field | Bits | Purpose |
|---|---|---|
| SOF | 1 | Start-of-frame, always dominant; synchronises receivers. |
| Identifier | 11 | Message ID; doubles as arbitration priority (lower = higher priority). |
| RTR | 1 | Remote Transmission Request; dominant for data frames. |
| IDE | 1 | Identifier Extension; dominant = standard, recessive = extended. |
| r0 | 1 | Reserved. |
| DLC | 4 | Data Length Code, 0–8 bytes. |
| Data | 0–64 | The payload itself. |
| CRC | 15 + 1 | Cyclic-redundancy check + delimiter. |
| ACK | 1 + 1 | Acknowledge slot (recessive by sender, dominant by any healthy receiver) + delimiter. |
| EOF | 7 | End-of-frame, seven recessive bits. |
| IFS | 3 | Inter-frame space. |
One subtle but essential mechanism is bit stuffing. After any run of five identical bits in the field from SOF through CRC, the transmitter inserts an opposite-polarity stuff bit, which the receiver removes. This guarantees enough edges for receivers' bit-timing units to stay synchronised — and explains the upper bound of 135 bits per frame.
What happens when two ECUs decide to transmit at the same instant? On Ethernet, both detect the collision, back off, and retry with a randomised delay — wasting time and giving no guarantee of priority. CAN solves the same problem more elegantly. Because dominant bits overwrite recessive bits on the wire, each transmitter compares the bit it intended to send against the bit it actually sees. The moment a node sees a dominant bit when it transmitted a recessive bit, it knows another node has a higher-priority (lower-numbered) ID, and it instantly stops transmitting and switches to receive mode. The winner's frame continues uninterrupted.
This is called Carrier Sense Multiple Access with Collision Resolution (CSMA/CR), and it has a beautiful consequence: the highest-priority message in the system suffers, in the worst case, only one bit-time of latency for any given lower-priority frame already in transit — a deterministic bound that lets engineers prove real-time schedulability.
0x080 for emergency torque-off, 0x0A0–0x0FF for BMS contactor commands and HV interlock. Mid-range IDs (0x200–0x3FF) for 1 ms / 10 ms control loops. Higher IDs for diagnostics and infotainment. Never give two messages the same ID — the bus will lock up the moment they collide in the data field.
Every node on a CAN bus must agree, to within fractions of a bit-time, on where the middle of each bit is. There is no separate clock line: receivers extract timing from recessive-to-dominant edges in the data stream itself. To make this possible, the nominal bit time is divided into four segments:
The Synchronisation Segment (always 1 Time Quantum, TQ) is where edges are expected. The Propagation Segment compensates for signal-propagation delay along the cable plus transceiver group delay — round-trip. The two Phase Segments bracket the sample point, the instant at which the receiver actually latches the bit's logic level. Industry convention places the sample point at 75–87.5% of the bit time; CANopen recommends 87.5%, AUTOSAR drivers default similarly.
Resynchronisation occurs when an unexpected edge falls inside PhaseSeg1 or PhaseSeg2: the controller shortens or lengthens these segments by up to the Synchronisation Jump Width (SJW) to slide the sample point back over the new edge.
CAN's fault-confinement model is one of its most studied features. Every node maintains two counters — the Transmit Error Counter (TEC) and the Receive Error Counter (REC) — that move in response to detected errors and successful transmissions. The node's behaviour transitions through three states based on the counter values:
Five complementary error-detection mechanisms operate in parallel: bit monitoring (compare transmitted bit with bus value), bit stuffing (more than five identical consecutive bits), frame check (fixed-form fields must match), CRC (15-bit polynomial over the frame), and ACK check (at least one receiver must drive the ACK slot dominant). Together they reduce the residual undetected-error probability below 10⁻¹³ — about one undetected error per million years of continuous traffic at 500 kbit/s.
Classical CAN tops out at 1 Mbit/s and 8 bytes of payload — comfortably enough for periodic torque and temperature signals, but painfully slow for the multi-kilobyte secure flash blocks now demanded by over-the-air updates and for the parameter dumps of modern motor-control software. CAN-FD (Flexible Data-rate), introduced by Bosch in 2012 and standardised as ISO 11898-1:2015, addresses both shortcomings while preserving the priceless property of bitwise arbitration.
The trick is to use two bit rates per frame, separated by the BRS (Bit Rate Switch) bit:
The payload limit jumps from 8 to 64 bytes, the CRC widens to 17 or 21 bits with a different polynomial (chosen to maintain Hamming distance even under bit-stuffing irregularities), and a stuff-bit count field guards against a class of subtle errors that plagued early FD implementations.
Raw CAN gives you frames, IDs and bytes. To actually exchange diagnostic requests, segmented file transfers, or standardised emissions data, the industry layers higher protocols on top:
CAN's 8-byte (or 64-byte) payload is too small for many diagnostic operations. ISO-TP fragments a logical message of up to 4 GB into a sequence of single, first, consecutive and flow-control frames, with a tiny header in the first byte indicating the frame type and sequence number. Every UDS exchange you observe on a vehicle bus is in fact an ISO-TP conversation.
UDS defines the request/response protocol used by every modern OEM scan tool: read DTCs (0x19), read data by identifier (0x22), security access (0x27), routine control (0x31), request download (0x34) for ECU flashing, and many more. Each request carries a service identifier (SID); a positive response echoes the SID + 0x40, a negative response is 0x7F <SID> <NRC>.
Dominant in commercial vehicles and heavy machinery, J1939 uses 29-bit identifiers to encode source address, destination address and a Parameter Group Number (PGN). It defines a fixed catalogue of Suspect Parameter Numbers (SPNs) — engine RPM, coolant temperature, etc. — so any J1939-compliant ECU is plug-and-play. Several electric-truck programmes adopt J1939 conventions even when the powertrain is fully electric.
The legally mandated subset of diagnostics, accessed via the trapezoidal connector under the dash. PIDs (Parameter IDs) under service 0x01 expose a defined list of signals: vehicle speed, battery state of charge for EVs (PID 0x5B), HV battery pack temperature (0x5C), etc. Useful for compliance and for third-party telematics dongles.
Outside the automobile, CANopen (CiA 301) is the dominant higher-layer protocol — used in industrial robotics, medical devices, and increasingly in charging infrastructure on the back end of CCS DC fast chargers. It defines an object dictionary, PDOs (Process Data Objects), and SDOs (Service Data Objects).
A contemporary battery-electric vehicle does not have a CAN bus — it has several, partitioned by function and safety integrity. The diagram below shows a typical (and deliberately simplified) topology with the principal domains and the kind of traffic each carries.
Three reasons dominate:
The DC fast-charging story is split between standards:
Newer architectures — Mercedes-Benz MMA, VW SSP, GM Ultifi, Stellantis STLA Brain — are moving toward zonal rather than functional partitioning, with a high-bandwidth backbone (Automotive Ethernet 100/1000BASE-T1, TSN) connecting four to six zonal controllers, each of which fans out to local sensors and actuators via short CAN-FD or LIN segments. The number of long CAN runs shrinks; the number of short CAN segments multiplies. The protocol survives, but its role inverts — from vehicle backbone to local actuator bus.
Calculate worst-case bus load as Σ (frame_length_bits / period_ms) / bitrate. Targets in production EV programmes:
| Bus | Bitrate | Typical load | Hard limit |
|---|---|---|---|
| Powertrain (safety-critical) | 500 kbit/s CAN-FD or 2 Mbit/s data phase | < 40% | 60% |
| Chassis & ADAS sensors | 500 kbit/s | < 50% | 70% |
| Body & comfort | 125 or 250 kbit/s | < 60% | 80% |
| Diagnostic / OBD | 500 kbit/s | < 10% steady state | — |
The de-facto exchange format for CAN message catalogues is the Vector DBC file: a plain-text description of every message ID, signal start-bit, length, byte order (Intel/Motorola), scale, offset, units and value tables. Most tooling — Vector CANalyzer, CANoe, PEAK PCAN-View, Wireshark with the CAN plugin, Python's cantools library — consumes DBC directly. Treat the DBC as part of the source code: version-control it, code-review it, generate the embedded encoder/decoder from it.
An EV at rest in a parking garage cannot afford to keep every ECU powered. CAN Partial Networking (ISO 11898-6) allows selected ECUs to be put into sleep while a transceiver with selective wake-up filters specific IDs and powers the microcontroller only when a relevant frame arrives. This is essential for keeping 12 V battery drain below the typical 50 mA target during the long-key-off phase.
So far, the protocol. Now the metal. Every measurement, every flash, every dyno trace begins with a small black box that bridges three worlds: a host computer speaking USB or PCIe; a protocol stack speaking CAN frames with microsecond timestamps; and a transceiver speaking dominant and recessive bits onto a pair of copper wires. This object is the CAN interface, and choosing the right one is more consequential than its modest price suggests.
The professional automotive market is dominated by a small number of suppliers, each with a slightly different philosophy:
| Vendor | Flagship lines | Notes |
|---|---|---|
| Vector Informatik | VN1610, VN1630A, VN1640, VN5640, VN8900 | Default in OEM development; tight integration with CANoe / CANalyzer / CANape; XL-Driver Library. |
| PEAK-System | PCAN-USB FD, PCAN-PCI Express FD, PCAN-Ethernet | Excellent value; well-supported on Linux and macOS; SDK includes PCAN-Basic for Python, C#, etc. |
| Kvaser | Leaf Pro HS v2, U100, Memorator Pro | Strong on standalone logging; CANlib API; popular in motorsport and aerospace. |
| Intrepid Control Systems | ValueCAN 4, neoVI FIRE, RAD-Galaxy | Multi-protocol (CAN, LIN, Automotive Ethernet, FlexRay) in one chassis; Vehicle Spy software. |
| IXXAT (HMS) | USB-to-CAN FD, CAN@net III, CAN-IB family | Industrial heritage; popular for embedded gateways; supports CANopen out of the box. |
An interface is only as useful as the layers above it. From the bottom up:
SocketCAN framework which exposes CAN as a network interface.python-can, cantools), MATLAB (Vehicle Network Toolbox), or C# / .NET wrappers above the vendor API.UDS, covered in §VIII, is the diagnostic protocol; it answers "what is wrong?" and "what is your software version?" But the daily work of a controls engineer is different: you need to see a state variable evolve in real time while the inverter is spinning the dyno, and you need to tweak a calibration constant — a torque-table cell, a regulator gain, a current-limit threshold — without rebuilding and reflashing the ECU. That is the job of XCP, the Universal Measurement and Calibration Protocol, standardised by ASAM.
XCP descends from CCP (CAN Calibration Protocol, 1996), which was tied to CAN. XCP generalised the abstraction: the application layer is identical regardless of whether the underlying transport is CAN, CAN-FD, Ethernet (UDP or TCP), USB, FlexRay or a custom serial link. In an EV powertrain context you will encounter all four of the first transports, often in the same project: XCP on CAN on the production inverter, XCP on Ethernet for high-bandwidth rapid prototyping with dSPACE or ETAS hardware, and XCP on USB for bench-side data logging from a debug interface.
A master (CANape, INCA, MATLAB Vehicle Network Toolbox, a custom Python script using pyxcp) issues commands to a slave (the XCP driver embedded in the ECU firmware), which responds with answers and asynchronously streams measurement data back at configured event triggers.
XCP defines exactly two packet families:
On top of these, three services do almost all the work:
The XCP protocol does not know names. It moves bytes between memory addresses, full stop. The bridge between "address 0x80001234, four bytes, little-endian" and "motor mechanical speed in revolutions per minute" lives in the A2L file (ASAM MCD-2 MC), a plain-text description that every measurement / calibration tool ingests. A minimal entry looks like:
/* MEASUREMENT block — one per observable variable */ /begin MEASUREMENT motor_speed_rpm "Motor mechanical speed" FLOAT32_IEEE NoCompuMethod 0 0 -10000 10000 ECU_ADDRESS 0x80001234 DISPLAY_IDENTIFIER nSpeed FORMAT "%.1f" PHYS_UNIT "rpm" /end MEASUREMENT /* CHARACTERISTIC block — one per calibration parameter */ /begin CHARACTERISTIC Iq_Limit_A "q-axis current limit" VALUE 0x80008000 Linear_q15 500.0 -500.0 500.0 PHYS_UNIT "A" /end CHARACTERISTIC
For a model-based development flow — Simulink Embedded Coder, TargetLink, or ETAS ASCET — the A2L file is generated automatically from the model: every Simulink signal marked for measurement and every workspace tunable parameter appears in the A2L with the correct address (resolved post-link by parsing the linker map) and the correct conversion rule (inferred from the data-type and scale/offset attributes on the signal).
When commissioning a new motor map on the dyno, you load the existing flash calibration onto the reference page, copy it to the working page, then make incremental changes to the working page — torque table cells, MTPA breakpoints, field-weakening transition speeds — while the dyno is running. At any moment you can SET_CAL_PAGE → reference to A/B-compare the original and the new calibration on the same operating point. When you're happy, the working page becomes the new flash content and is written back to the ECU's non-volatile memory via the standard UDS flash sequence. The protocol is unchanged; the workflow is what makes XCP indispensable.
The protocols described in this monograph are not, on their own, productive. Around them an entire ecosystem of measurement, simulation, calibration, logging and testing tools has grown up — much of it from the same companies that supply the interface hardware. A working engineer needs to know which tool to reach for, and which file format to feed it.
| Tool | Vendor | Primary use |
|---|---|---|
| CANape | Vector | XCP master, measurement recording (MDF/MF4), calibration, ECU flashing, map editing. |
| INCA | ETAS | Direct competitor to CANape; deeper integration with ETAS HIL and Bosch ECUs. |
| ATI Vision | Accurate Technologies | Common in North American OEMs; supports CCP, XCP, KWP, UDS. |
| MATLAB Vehicle Network Toolbox | MathWorks | Scripted measurement, DBC/A2L parsing, dataflow into Simulink for offline analysis. |
| Tool | Use case |
|---|---|
| CANoe (Vector) | Full residual-bus simulation: model the entire vehicle network so a single ECU-under-test believes it sees its neighbours. CAPL scripting language for test sequences and signal manipulation. |
| CANalyzer (Vector) | Passive monitoring and post-trace analysis; the read-only cousin of CANoe. |
| vTESTstudio (Vector) | Authoring environment for automated test cases that execute on CANoe. |
| Vehicle Spy (Intrepid) | Tight integration with neoVI / RAD hardware; scripting in Python. |
| BUSMASTER (open-source) | Free alternative for CAN logging and simple replay; works with Vector and Kvaser hardware. |
Hardware-in-the-loop (HIL) systems close the loop between a real ECU and a real-time simulated plant. They consume your CAN signals as inputs to a vehicle dynamics or e-machine model and inject the model's responses back on the bus — a dyno-in-a-box. The four big platforms in the EV space:
Bypassing deserves a special note in an EV context. The technique replaces a piece of running ECU code — say, the q-axis current controller — with a function executing on external rapid-prototyping hardware, communicating via XCP-on-Ethernet at sub-millisecond cycle times. You iterate on the model in Simulink, hit "build and deploy", and the new controller is live on the dyno seconds later, with the rest of the production ECU code untouched. The technique is invaluable for tuning regulator gains, evaluating new MTPA strategies, or testing harmonic-current injection schemes before they are mature enough to embed in the production binary.
An ECU on the bench, unplugged from the rest of the vehicle, is hostile territory: every periodic message it expects from a neighbour is missing, every timeout fires, and the application either refuses to start or enters a limp-home mode. The cure is restbus simulation — typically authored in CANoe, where you load the vehicle DBC, mark which nodes are real and which are simulated, and the tool generates the expected periodic traffic for all simulated nodes. The device-under-test sees a believable network and behaves as it would in the vehicle.
| Extension | Standard | What it describes |
|---|---|---|
.dbc | Vector proprietary, ubiquitous | CAN messages and signals — IDs, byte order, scale, offset, value tables. |
.arxml | AUTOSAR XML | The full architectural description: ECUs, software components, signals, port mappings, network topology. Source-of-truth in AUTOSAR projects, with DBC generated as a by-product. |
.a2l | ASAM MCD-2 MC | ECU memory description for XCP — measurements, characteristics, conversion rules, events. |
.mf4 / .mdf | ASAM MDF 4.x / 3.x | Measurement data — multi-channel time-series, the standard recording format from CANape, INCA and MDF4-aware loggers. |
.blf | Vector binary logging | Compact CAN trace format produced by CANalyzer / CANoe. |
.asc | Vector ASCII trace | Plain-text bus log, human-readable, easily parsed by Python. |
.ldf | LIN Description File | The LIN equivalent of DBC — slave configuration, schedule tables, signal definitions. |
.cdd | CANdela (Vector) | UDS service catalogue and DTC list for a specific ECU — consumed by diagnostic testers. |
.odx | ISO 22901-1 | Open Diagnostic data eXchange — the standardised successor to vendor-specific diagnostic catalogues. |
For a controls engineer arriving on a new EV programme, the minimum-viable toolkit is: a four-channel CAN-FD interface (Vector VN1630A or PEAK PCAN-USB FD), Vector CANoe or PEAK PCAN-View for live bus monitoring, the project's DBC and A2L files under version control, Python with python-can and cantools for scripted measurement and replay, MATLAB / Simulink with Vehicle Network Toolbox if your team is model-based, and CANape or INCA the moment XCP-based calibration becomes part of the daily work. Add a HIL system when your control loops are mature enough that you can no longer tolerate dyno turnaround times.
Of the dozen vendor tools listed in the previous section, two account for the overwhelming majority of an EV-controls engineer's wall-clock time. CANape is where you measure and calibrate a real ECU; CANoe is where you simulate the rest of the vehicle so that ECU has someone to talk to. They share a vendor (Vector Informatik), an ancestor in CANalyzer, and a common visual idiom, but the workflows are genuinely different. This section walks through both with enough detail to recognise — and reproduce — what an experienced user is doing on the screen across the desk from you.
CANape is, at heart, an XCP master with very polished display, recording, and calibration windows on top. Open a project and you will find four artefacts that define what it can do:
The day-to-day rhythm is straightforward. You connect the interface, CANape sends the XCP CONNECT command, queries the slave's resources, and downloads the configured DAQ lists to the ECU. You hit the red Measurement button and signals begin streaming from the ECU to your display in real time. You drag a calibration parameter from the parameter tree onto a slider widget, change it on the fly, and watch the response in the same window. When you have something worth keeping, the Recorder writes the lot to an MDF4 file with full timing metadata, ready for offline analysis in MATLAB, Python, or Vector's own vSignalyzer.
Drag the Torque demand slider while measurement is running — the working page applies your calibrated Kp immediately and the actual-torque trace responds with the corresponding rise time. Flip the Page selector to Reference to see how the same demand would have been tracked with the flashed-baseline Kp. This is the workflow that distinguishes a calibration tool from a passive logger: the act of measurement and the act of tuning are unified in the same window.
CANape's parameter tree is hierarchical and typed. A scalar like Iq_Limit_A opens as a numeric editor; a 1-D table like MTPA_Iq_vs_Tdemand[] opens as a curve editor with draggable breakpoints; a 2-D map like Efficiency_eta(speed, torque) opens as a surface editor with both contour and 3-D views, and the cursor on the surface follows the ECU's live operating point if the corresponding signals are being measured. For an MTPA-curve recalibration session, you can have the map editor on one screen, a 4-channel scope of (Tdemand, Tactual, Iq, Id) on another, and reshape the map by dragging individual cells while watching the response in real time — a workflow that would have been unthinkable in the days when a calibration change meant a flash cycle and a power-down.
If CANape's centre of gravity is the device, CANoe's is the network. The premise is simple: most testing of an embedded ECU has to happen long before the rest of the vehicle exists, or in scenarios that would be expensive or dangerous to provoke on a real car. CANoe lets you build a virtual replica of the vehicle network — every bus, every node, every signal, every periodic message and every event-driven response — and run it in real time alongside the one or two real ECUs you actually have on the bench.
The configuration is organised around four main windows:
| Window | Purpose |
|---|---|
| Simulation Setup | Network topology view. Each node icon is either real (a passthrough to the physical bus) or simulated (a CAPL program standing in for an absent ECU). |
| Measurement Setup | What to record and how. Connects analysis blocks (Trace, Graphic, Statistics) between the bus and the recorder. |
| Trace | The bus log — every frame with timestamp, ID, DLC, data, and decoded signals from the DBC. |
| Graphic | Time-domain signal plots, similar to CANape's measurement window but driven by bus signals rather than XCP. |
The single feature most responsible for CANoe's dominance is CAPL — the Communication Access Programming Language, a C-flavoured event-driven scripting language with direct access to bus messages, signals, system variables, and Vector's environment functions. Every simulated node and every test case is a CAPL program. A minimal CAPL file that simulates a torque-request transmitter and reacts to a status response looks like this:
/* TorqueRequester.can — a simulated VCU node */ variables { message 0x100 TorqueReq; // frame definition msTimer SendCycle; // 10 ms periodic timer float currentDemand_Nm = 0.0; } on start { write("VCU node up at t = %f s", timeNow()); setTimer(SendCycle, 10); // fire every 10 ms } on timer SendCycle { // Encode physical Nm to raw (scale 0.0625 Nm/bit, signed 16-bit) TorqueReq.word(0) = (int)(currentDemand_Nm / 0.0625); TorqueReq.byte(2) = sysGetVariableInt(VCU::DriveMode); output(TorqueReq); setTimer(SendCycle, 10); } /* Event-driven: react to a received MotorStatus message */ on message MotorStatus { if (this.byte(0) & 0x01) { write("⚠ Motor fault flag at %.3f s", timeNow()); currentDemand_Nm = 0.0; // safe-state } } /* Panel-driven: react to operator changing a system variable */ on sysvar VCU::TorqueDemand { currentDemand_Nm = @VCU::TorqueDemand; }
Note three patterns: the on timer handler implements periodic transmission; the on message handler is the event-driven reception path; the on sysvar handler links a system variable to a user-interface widget on a CANoe panel. CAPL is fast enough to keep up with the bus in real time (microsecond-scale handler execution) and capable enough to express complex test logic, gateway behaviour, residual-bus simulation, and even bit-level fault injection.
For repeatable regression testing, hand-written CAPL gives way to vTESTstudio, Vector's test-authoring environment. Tests are authored declaratively as a sequence of stimulus and check statements; vTESTstudio compiles them into CAPL that runs on the same CANoe runtime. The output is a structured HTML report listing passed and failed cases — exactly the artefact you need for ASIL evidence under ISO 26262.
.blf or .asc file into a Replay block in the Measurement Setup. The bus replays the captured traffic exactly as it occurred, with original timing — invaluable for reproducing a field-failure scenario on the bench.On a typical day at the inverter bench you may well have both tools running at once: CANoe on one monitor simulating the VCU, BMS, and OBD-tester so the inverter under test sees a complete vehicle, and CANape on another monitor connected to the same bus, measuring inverter-internal signals via XCP and tuning the q-axis current PI gains live. The two programs share the bus through the same CAN interface — typically a Vector VN1610 or VN1630A — and Vector's drivers arbitrate access cleanly. Combined, they cover virtually the entire span of bench-side work between "a fresh binary just compiled" and "a calibrated, regression-tested release candidate."