Monitor variable changes, send a LIN signal, and manually set an incorrect checksum
Thanks to Alex for providing the example
CAPL Analysis
The provided CAPL example is as follows:
on envVar EnvChecksumError
{
if (1 == getValue(EnvChecksumError)) // Checksum err
{
write("Checksum err");
linSetManualChecksum(frmAC_1, linGetChecksum(frmAC_1) - 1);
//linSetManualChecksum(frmReq, linGetChecksum(frmReq) - 1);
//output(frmReq);
output(frmAC_1);
}
}CAPL Code Walkthrough
The core logic of this CAPL script is:
- Environment variable listen:
on envVar EnvChecksumErrorlistens for changes to theEnvChecksumErrorenvironment variable - Condition check: When the variable value is 1, trigger error injection logic
- Error injection:
linGetChecksum(frmAC_1)obtains the correct checksum valuelinSetManualChecksum(frmAC_1, checksum - 1)manually sets an incorrect checksum (minus 1)output(frmAC_1)sends a LIN message with an incorrect checksum
NOTE
- Technical note: The LIN bus checksum mechanism is critical for ensuring data integrity. By deliberately setting an incorrect checksum, you can test the error handling capability of the receiving node.
- Test equipment: We choose LinCable as the testing device because it can flexibly inject various LIN errors.
Variable Configuration in EcuBus-Pro
Step 1: Create an environment variable
To implement variable watching, first create the corresponding environment variable in EcuBus-Pro. Environment variables are an important bridge between scripts and the user interface.
Path: Others → Variable → Add Variable

Key variable settings
- Name:
EnvChecksumError(must match the variable name in the CAPL script) - Type: Integer
- Initial value: 0 (normal state)
- Range: 0–1 (0 = normal, 1 = trigger error)
Step 2: Verify the variable
After creation, you can view and manage the variable in the variable list:

In the variable list, you can:
- View the current value of the variable
- Modify the variable configuration
- Delete unnecessary variables
- Export/Import variable configurations
UI Control Panel Configuration
Step 3: Create the control panel
To dynamically control the variable value during testing, create a user interface panel. Through the graphical interface, testers can switch the variable state in real time without modifying code.
Path: Home → Panel → Add Panel

Panel design recommendations
- Use a switch or toggle control to represent the 0/1 state
- Set descriptive button text such as "Send checksum error frame"
- Lay out the controls clearly to ensure intuitive operation
Step 4: Bind the variable
After creating the panel control, bind it to the environment variable to establish a two-way data association between the control and the variable.

Binding settings
- Target variable: Select the previously created
EnvChecksumErrorvariable - Control type: Boolean Switch
- Mapping: OFF = 0 (normal), ON = 1 (trigger error)
Step 5: Preview the UI
After configuration, you can preview the final user interface:

UI highlights
- Display the current variable state in real time
- Support one-click toggle operations
- Provide intuitive visual feedback
EcuBus-Pro TypeScript Implementation
Step 6: Write the TypeScript script
Now we convert the CAPL logic into an EcuBus-Pro TypeScript script. Compared with CAPL, TypeScript provides better type safety and a better development experience.
Util.OnVar("EnvChecksumError", ({ value }) => {
if (value == 1) {
console.log("Checksum err");
const msg: LinMsg =
{
frameId: 0x3c,
direction: LinDirection.SEND,
data: Buffer.from([0x60, 0x01, 0xb5, 0xff, 0xff, 0xff, 0xff, 0xff]),
checksumType: LinChecksumType.CLASSIC,
lincable:{
checkSum:3,// wrong checksum
}
}
output(msg);
}
});Detailed Script Walkthrough
1. Variable watch mechanism
Util.OnVar("EnvChecksumError", ({ value }) => {
// Callback, triggered when the variable value changes
});Util.OnVar()is the variable watch API provided by EcuBus-Pro- Destructuring assignment is supported to directly obtain the
valueparameter - The callback is automatically triggered when the variable value changes
2. LIN message construction
const msg: LinMsg = {
frameId: 0x3c, // LIN frame ID (hex)
direction: LinDirection.SEND, // Send direction
data: Buffer.from([...]), // Data byte array
checksumType: LinChecksumType.CLASSIC, // Checksum type
lincable: {
checkSum: 3 // Manually set incorrect checksum
}
}3. Key parameter descriptions
| Parameter | Description | Example |
|---|---|---|
frameId | LIN frame identifier | 0x3c (60) |
direction | Message direction | LinDirection.SEND |
data | Data payload | 8-byte data array |
checksumType | Checksum type | CLASSIC or ENHANCED |
checkSum | Manual checksum | 3 (intentionally incorrect) |
4. Error injection principle
Under normal circumstances, the checksum of a LIN message should be calculated automatically based on the data content. In testing scenarios, we manually specify an incorrect value (e.g., 3) via lincable.checkSum to simulate a transmission error and test the receiving node’s error-handling capability.
Test Run and Verification
Step 7: Run the test
After completing all configurations, run the test. Use the toggle button on the UI to control the variable value and observe the sending of LIN messages.
