3、创建第一个仿真节点:新建工程、添加CAN通道、插入仿真节点(Simulation Node)、节点CAPL脚本框架、节点属性配置

好,咱们正式开始动手了。

前面两章聊了不少概念,我知道大家可能有点手痒。今天我们就来创建第一个仿真节点。说白了,就是让CANalyzer里跑起来一个“虚拟的ECU”。

我个人习惯,每次做新项目,第一件事就是新建一个干净的工程。别嫌麻烦,这能避免很多历史遗留问题。我曾经见过有人直接在别人的工程上改,结果改到后面,连哪个信号是自己发的都分不清了。

3.1 新建工程——从零开始

打开CANalyzer,界面很干净对吧?

点击 File → New → Configuration。你会看到一个对话框,让你选择模板。这里我建议选 “CAN 500kBaud 1ch” 这个模板。为什么?因为大部分车载网络的基础速率就是500k,一个通道足够我们入门了。

我的小习惯: 工程命名时,加上日期和项目简称。比如 “20240511_DemoProject”。这样三个月后你翻出来,还能记得这是干嘛的。

新建完成后,你会看到主界面。左边是 Simulation Setup 窗口,右边是 Measurement Setup 窗口。别慌,我们一步步来。

3.2 添加CAN通道——让数据有路可走

没有通道,数据就无处可去。就像修了路,车才能跑。

Simulation Setup 窗口里,右键点击空白区域,选择 Insert → CAN Channel。或者更直接点,从工具栏里拖一个 CAN 图标进来。

添加后,你会看到一条绿色的总线出现在窗口里。双击它,可以配置参数:

参数 推荐值 说明
Baudrate 500 kBit/s 这是最常见的速率。如果项目特殊,再改。
Channel Number 1 单通道工程,默认就是1。
Bus Type CAN 别选成LIN或FlexRay,除非你确定。
注意: 波特率一定要和DUT(被测设备)匹配。我曾经有一次,工程里设了500k,但台架上的ECU是250k的,结果一上午啥数据都没抓到,还以为是线松了。嗯,这种低级错误,犯一次就够了。

3.3 插入仿真节点——让虚拟ECU跑起来

通道有了,接下来就是往总线上挂节点。

Simulation Setup 窗口里,右键点击绿色总线,选择 Insert → Network Node。或者从工具栏拖一个 Node 图标到总线上。

你会看到一个灰色的方块出现在总线上。这就是我们的仿真节点。双击它,给它改个名字。我习惯叫 “Sim_ECU_1”,简单明了。

嗯,这里要注意:一个节点就是一个虚拟的ECU。你可以挂多个节点,模拟多个ECU同时通信的场景。但刚开始,一个就够了。

3.4 节点CAPL脚本框架——给节点注入灵魂

节点是空的,它不会自己说话。我们需要用CAPL语言给它写“思想”。

右键点击节点,选择 Open CAPL Browser。你会看到一个代码编辑器。默认里面是空的,或者只有几行注释。

一个标准的CAPL脚本框架长这样:

/*@!Encoding:936*/
includes
{

}

variables
{
  // 在这里定义全局变量
  int gCounter = 0;
  message 0x100 gMsg;
}

on start
{
  // 仿真开始时执行一次
  write("Simulation Node Started!");
  gMsg.id = 0x100;
  gMsg.dlc = 8;
  gMsg.byte(0) = 0xAA;
}

on timer MyTimer
{
  // 定时器触发时执行
  gCounter++;
  gMsg.byte(1) = gCounter;
  output(gMsg);
}

on key 'a'
{
  // 按下键盘'a'键时触发
  write("Key 'a' pressed, counter = %d", gCounter);
}

我来解释一下这个框架:

  • includes:放头文件,一般用不到,但留着框架完整。
  • variables:定义全局变量。比如计数器、报文对象。
  • on start:启动事件。仿真一开始,这里面的代码就跑一次。我习惯在这里初始化报文和变量。
  • on timer:定时器事件。用来周期性地发送报文。这是仿真节点的核心。
  • on key:键盘事件。方便调试时手动触发一些动作。
核心思路: 仿真节点就是靠“事件”驱动的。收到报文、定时器到期、按键按下……这些事件触发了,节点才干活。别想着写一个死循环,CAPL不是这么玩的。

3.5 节点属性配置——让节点更真实

脚本写好了,但节点还有一些“外在属性”需要配置。

右键点击节点,选择 Configuration。你会看到属性对话框:

属性 说明 我的建议
Name 节点名称 保持和工程一致,别乱改。
Comment 注释 写上这个节点模拟的是哪个ECU。比如“模拟BCM”。
CAPL File 关联的CAPL脚本文件 确保路径正确。我习惯把脚本和工程放在同一个文件夹。
Bus 挂载的总线 默认就是CAN 1,不用动。
避坑指南: 我曾经把CAPL脚本放在桌面,结果清理桌面时删掉了。第二天打开工程,节点报错找不到脚本。所以,脚本文件一定要和工程文件放在一起,或者用相对路径。

配置完成后,点击 OK 保存。

3.6 验证一下——让节点跑起来

所有配置都完成了。点击工具栏上的 绿色三角(Start Measurement)

你会看到 Write Window 里打印出 “Simulation Node Started!”。然后,如果你在CAPL里设置了定时器,节点就会周期性地往总线上发报文。

打开 Trace Window,你应该能看到ID为0x100的报文在循环出现。数据域里,第一个字节是0xAA,第二个字节是递增的计数器。

看到这些,恭喜你,你的第一个仿真节点已经成功跑起来了!

说实话,第一次看到自己写的节点在总线上“说话”,那种成就感还是很踏实的。虽然只是发了一个简单的报文,但这是你踏入车载网络仿真世界的第一步。

下一章,我们会让这个节点变得更聪明——学会接收报文,并根据收到的数据做出响应。到时候,你就能模拟出更真实的ECU交互了。