创建第一个 ETStudio 仿真项目
新建第一个仿真工程
本示例演示两个单功能 ECU 之间的通信仿真,主要任务包括:
- 创建节点
ECU1; - 创建两个控制面板(开关仪表盘与指示灯仪表盘);
- 通过 C++ 脚本实现节点间通信。
实现目标:当用户操作开关时,通过 CAN 报文发送该操作;当接收到 CAN 报文后,根据报文中的信号值控制指示灯的亮灭。
在 ETStudio 主界面中,点击 File → New,选择 ETStudio 提供的项目模板(如 Empty Project),双击可生成一个空白的 CAN 总线仿真工程。将工程保存到 FirstDemo 文件夹下,并根据前文的项目命名规范在 FirstDemo 下创建 DBC、dashboards 与 Scripts 文件夹。

添加 CAN 数据库
数据库文件可被脚本与仪表盘调用,并能在 Trace、Diagram 等分析窗口中解析出相应信息,将十六进制数据转换为数据库中定义的报文与信号,从而提升可读性。
将数据库添加到工程:首先创建一个 DBC 数据库文件,在 DBC 的 Messages 下创建消息 Msg,在 Signals 下创建信号 switch,并将 switch 拖入 Msg 中,使其成为该消息的信号(本示例仅包含一个报文与一个信号)。
在 Virtual Node Setup 窗口中,点击视图内的 CAN Networks,右键选择 Add CANNetwork 添加 CAN 网络;然后在 CANNetwork → Databases 中右键选择 Add,将 FirstDemo.dbc 添加到仿真工程中。

定义系统变量
在 Setup 功能区点击图标打开 Global Variables 配置对话框,创建系统变量 Light 并按示例设置参数。

采用同样方式再创建一个系统变量 Switch,配置如下:Namespace: MyNamespace; Name: Switch; Data type: Signed32。设置完成后,可在变量列表中查看刚创建的两个系统变量。

创建仿真仪表盘
ETStudio 允许在一个或多个仪表盘中设计所需的控制与显示控件,便于用户在近似真实环境下进行操作与观察。
创建开关仪表盘
步骤:
- 在 Home 功能区点击仪表盘图标选择
New dashboard,新建仪表盘并命名为SWITCH,将其保存在dashboards文件夹下; - 在仪表盘 Designer 的 Toolbox 中选择
Add Control Switch/Indicator,在属性对话框中按需设置参数(保持其它属性为默认):- State Count:2
- Mouse Activation Type:LeftRight
- Symbol Filter:Variable
- Value:Switch
- 在开关右侧添加
Static Text控件,并将其文本设为Switch。
创建指示灯仪表盘
- 新建另一个仪表盘,命名为
LIGHT,保存到dashboards文件夹; - 在工具栏选择
Add Control,在属性对话框中设置:- Symbol Filter:Variable
- Symbol:Light
- 在指示灯右侧添加
Static Text,将文本设为Light。
完成后,两个所需的仪表盘即创建完毕,点击 File → Save 保存并退出仪表盘编辑器。

创建网络节点
处理系统变量变化、发送与接收报文的逻辑由脚本实现;在仿真配置中需创建节点并将脚本关联到节点上。
添加网络节点
在 Simulation Setup 窗口中右键 Nodes,选择 Insert Network Node 创建节点 ECU1。当按下开关时,ECU1 将发送 CAN 报文,接收方收到报文后会相应点亮指示灯。

添加 Switch_Light 脚本
在 Tools 功能区点击 Code Editor 图标打开代码编辑器,选择 File → Open Folder 打开 Scripts 文件夹。点击 New Folder 创建 Switch_Light 文件夹,再点击 New File 创建 Switch_Light.cpp,并将下列代码添加到该文件:
#include <iostream>
#include <string>
#include "BaseMiniProgram.h"
#include <functional>
#include <list>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void SendMessage();
void CANHandler(EM_CANSendFrame_t* TxFrame)
{
MyNamespace::Light = TxFrame->data[0];
}
void SendMessage()
{
CANNetwork::Msg msg;
msg.Switch = MyNamespace::Switch;
msg.Transmit();
}
void PreviewApplicationInitialize()
{
}
void OnStart()
{
MyNamespace::Switch.SetOnChange(SendMessage);
register_CANTxEvent(1, 0x100, CANHandler);
}
void OnExit()
{
}
该代码使节点 ECU1 在系统变量 Switch 变化时发送更新后的报文到总线;接收端在收到 Msg 报文后,会根据报文中的 switch 信号更新系统变量 Light,从而实现指示灯的点亮或熄灭。
将脚本添加后,在 Simulation Setup 中右键 ECU1 选择 Configuration 打开节点配置对话框,点击 Choose 按钮并选择 Switch_Light.cpp 文件。

选择对应脚本后,点击 ECU1 节点左下角的编译按钮进行编译。

工程运行测试
在 ETStudio 主界面点击 Start 启动工程。在 Home 功能区点击 dashboard 打开 SWITCH 与 LIGHT 仪表盘。右键单击 SWITCH 仪表盘中的开关进行开/关操作,LED 指示灯状态将随开关状态变化。

查看 Trace 报文
在操作开关的同时,可在总线上观察到 CAN 报文中的信号变化,见下图示例。
