C 小程序设计
ETStudio 的小程序功能基于开源 VS Code,具有良好的可扩展性。理论上支持多种语言,但为符合当前用户的使用习惯,主要支持 C++ 与 C 语言的小程序设计、编译与运行。小程序使用标准的 C/C++ 编译器,除可调用软件提供的函数接口外,用户也可以引用 Windows 系统资源或其他现有库进行扩展。
小程序的主要用途
小程序是 ETStudio 的重要扩展机制,使 ETStudio 能满足仿真、分析、测试与诊断等复杂需求,并持续扩展其功能。小程序的典型用途包括:
- 使用易理解的编程语言模拟节点或模块;
- 生成事件报文、周期报文或带有附加条件的重复报文;
- 使用 PC 键盘模拟操作按钮等人工操作事件;
- 模拟节点的定时或网络事件;
- 模拟多个时间驱动事件,每个事件实现特定行为;
- 模拟常规操作、诊断或生产流程;
- 模拟物理参数或报文的变化;
- 模拟模块或网络故障以评估容错/防错机制;
- 提供网络测试、诊断等功能性测试库。
小程序的设计思路与使用规范
ETStudio 的 C 小程序与 CAPL 类似,是一种触发式的执行模型。理解其设计思路有助于编写高效、稳定的仿真逻辑。
1. 触发式设计思路
ETStudio C 小程序的整体设计思路是:
- 用户操作(如点击 Panel 按钮)触发系统变量的变化;
- 该系统变量被绑定到 C 小程序的
OnSysVarUpdate事件中; - 在
Update回调函数中处理对应的业务逻辑; - 处理完成后立即退出,不阻塞主线程。
该模式与 CAPL 中通过
on envVar/on key等事件触发处理的思路一致,强调回调函数。
2. 主程序中的休眠函数(delay_ms / delay_us)
为了兼容用户在主程序 OnStart 中使用休眠函数的行为,ETStudio 提供了不会卡死的延时函数:
delay_ms:毫秒级延时delay_us:微秒级延时
在 OnStart 中可以安全使用上述函数,在Stop时不会阻塞主程序的其他事件处理。
3. 事件函数中的休眠函数(推荐用法)
严谨的编程习惯是:在以下事件回调函数中使用 delay_ms / delay_us / Sleep 等任何休眠函数(行为类似 CAPL):
OnTimer:定时器事件OnReceiveFrame:报文接收事件OnSysVarUpdate:系统变量更新事件- 其他自定义事件函数
代码编辑器简介
可通过主界面 Tools 下的 Code Editor 图标打开代码编辑器界面:

也可以双击节点或在节点上右键选择 Editor 打开代码编辑器:

界面要点

1. 活动栏(Activity Bar) 位置:界面左侧垂直栏。 功能:提供若干图标用于快速访问核心功能:
- 文件资源管理器:浏览项目文件与目录结构。
- 搜索:在项目中搜索代码或文件。
- 源代码管理:集成 Git 等版本控制操作(提交/推送)。
- 运行与调试:执行或调试程序。
- 扩展市场:浏览并安装扩展插件。
操作:点击图标切换功能视图,右键可自定义活动栏顺序。
2. 侧边栏(Sidebar) 位于活动栏右侧,展示所选图标对应的内容(例如文件树、扩展市场等)。可拖动边缘调整宽度。
3. 编辑区(Editor Area) 位于界面中间,是主要的代码编辑区域,支持多文件并排编辑、语法高亮与代码补全。
4. 状态栏(Status Bar) 位于界面底部,显示编码、语言模式、行列号、错误/警告提示等信息。
5. 命令面板(Command Palette)
按 Ctrl+Shift+P 或通过 View → Command Palette 调用,可执行各种命令(如切换语言、安装扩展等)。
6. 菜单栏(Menu Bar)
包含 File、Edit、View、Run、Terminal 等菜单,用于创建文件、保存、运行任务与打开设置等。
7. 终端(Terminal)
内置终端用于运行命令行操作(例如 npm install、运行 Python 脚本等),支持创建多个终端并切换 shell 类型(PowerShell、bash 等)。
8. 界面自定义 可通过命令面板或设置调整主题、布局、字体与快捷键等偏好。
9. 实用技巧
- 多光标编辑:
Alt+Click或Ctrl+Alt+↑/↓添加多个光标。 - 代码折叠:点击左侧折叠控制收起或展开代码块。
- 快速打开文件:
Ctrl+P后输入文件名快速定位。
创建并运行最小结构的小程序
注意: 请不要在工程子目录与工程文件名中添加空格,会导致编译失败。
在 File 菜单中点击 New File,创建例如 test.cpp 或 test.c 的小程序文件:

新建文件后会生成对应的编辑视图:

最小的 C 小程序示例(扩展名必须为 .cpp ,代码可以兼容C和C++):
#include "BaseMiniProgram.h"
void OnStart(){
}
void OnExit(){
}
添加示例输出代码:
#include "BaseMiniProgram.h"
void OnStart(){
show_console_message("started application...\\n");
}
void OnExit(){
show_console_message("finished application...\\n");
}
运行小程序时,会先执行 OnStart() 中的语句;程序结束时执行 OnExit(),上述示例将在控制台输出运行与结束信息:
访问全局变量
在 ETStudio 中通过 Setup → Global Variables 创建的系统变量,可在小程序中引用。示例:命名空间为 Test,变量名为 Button_1 与 Led_1:

在小程序中需要包含系统变量相关的头文件:
#include "BaseMiniProgram.h"
#include "SystemVariable.h" // 小程序的系统变量头文件
void OnStart(){
show_console_message("started application...\\n");
}
void OnExit(){
show_console_message("finished application...\\n");
}
给系统变量赋值:
Test::Button_1 = 1;
读取系统变量值:
testvalue = Test::button_1;
访问 DBC 与报文信号
发送报文
- 通过
dbc/ldf文件导入
点击 Add 并选择要导入的 dbc 文件;对 ldf 文件的操作相同。
报文接收事件

报文定义与发送
具体的报文定义和发送示例请参考 C 小程序示例。

事件类型与用法
具体的代码配置可参照示例工程中的实现。

定时器的使用
定时器相关的定义与发送请参考 C 小程序示例。

小程序与仪表盘的交互

小程序编译与调试
将脚本绑定到节点的建议流程:先确保编译通过,然后启动工程并运行测试。
运行前请先启动项目。

编译范围
工作目录及其子目录下的所有 .c / .cpp 文件都会参与编译。
小程序第三方路径编译
可以按照下面的两种方法使用其他.cpp文件的函数
1.将需要的.cpp文件放到绑定节点的.cpp文件的目录下,在绑定节点的.cpp文件中include需要的.cpp文件的头文件,即可使用需要的.cpp文件的函数。注意需要保持文件中只有一个OnStart()/OnExit()。
2.使用第三方路径:编译小程序后,可以在小程序所在目录找到env_vars.txt文件,在文件的第二行EXTENDED_PATH=中填入需要的.cpp文件所在路径(支持多条路径,按照;分割),在绑定节点的.cpp文件中include需要的.cpp文件的头文件,即可使用需要的.cpp文件的函数。编译成功后,会生成.vscode文件,以文件夹形式打开,第三方路径的头文件就不会报错。注意不要在第三方路径中填入绑定节点的.cpp文件的子目录,会导致重编译问题。
小程序添加用户自定义公共库
1.静态库.a
需要有静态库.a文件与头文件.h文件,将静态库所在路径填入env_vars.txt文件第二行EXTENDED_PATH=中,在.cpp文件中include对应头文件,即可使用静态库的函数
2.动态库.dll
需要动态库.dll文件、头文件.h文件与导入库.dll.a文件,将动态库所在路径填入env_vars.txt文件第二行EXTENDED_PATH=中,在.cpp文件中include对应头文件,即可使用动态库的函数