CAPL 脚本开发参考
将以下提示词粘贴到你的 AI 对话框中:
请根据 https://skillhub.cn/install/skillhub.md,安装 @user_8d2edbbe/caplscript。
技能介绍
你在 CANoe 里踩过的坑,多半不是 UDS 逻辑错
在 Vector CANoe/CANalyzer 里写 CAPL 做汽车诊断与安全测试时,编译器报错往往来自语言边界:CAPL 按 C89/C90 约束,变量不能插在语句中间、局部数组不能用 {} 初始化、Test Module 里函数名必须是 PascalCase(例如 TestWaitForTimeout,不是 testWaitForTimeout)。更麻烦的是 DLL:Windows 的 __declspec(dllexport) 不会让 CANoe 发现你的函数,必须在 CAPL_DLL_INFO4 表里注册,且平台位数、运行时(/MD vs /MT)与 CANoe 必须一致。
技能提供什么
本技能把「能跑起来的参考」整理成可检索的约定与模板,面向 CAPL + DLL 双层架构 的诊断安全测试场景:
- 语法与结构:块顶声明、
sprintf/strncpy等 C89 替代写法、文件骨架与关键事件(on start、on message、on timer、on sysvar_update等) - 报文与测试:CAN 帧收发模式、
TestStep/TestStepPass/TestStepFail等双参数调用规范 - DLL 集成:从官方 CAPLdll 示例工程起步,在
capldll.cpp中按既有条目扩展函数,在CAPL_DLL_INFO4 table[]中登记名称、函数指针、类型字符串与调用约定;表末{ 0, 0 }作为终止项 - 延伸阅读: pitfalls、UDS/安全测试模板、DLL 编译与加载步骤(配置 → Programming → CAPL DLL → 重编译节点 → 在 CAPL Browser 中核对)
遇到 CAPL 相关问题时,技能会优先按 C89 校验示例、用 PascalCase 写 Test Module,并在 DLL 问题上强调「示例工程 + 表注册」,而不是只给一段看似标准的 C++ 导出代码。
适用边界
- 面向 CANoe/CANalyzer 生态,不覆盖非 Vector 工具链
- 严格 C89 与「编译器有时能过」的写法可能不一致;技能倾向可移植、可维护的写法
- DLL 若跨边界传递动态分配内存,
/MT静态 CRT 容易引发释放责任问题;复杂场景应优先/MD并与示例中的宏保持一致
使用场景
- 在 CANoe 测量启动后,针对特定 CAN 报文 ID 编写 `on message` 响应逻辑,并用 Test Module 记录 UDS 安全访问各步骤通过/失败。
- 把安全算法或密钥计算从空 DLL 工程改为基于官方 CAPLdll 示例,在 `CAPL_DLL_INFO4` 表注册函数后在 CAPL 节点中调用。
- CAPL 编译报错涉及变量未在块顶声明、误用 `snprintf` 或 Test Module 写成 `testWaitForTimeout` 等小写名,需按 C89 与 PascalCase 对照修正。
- 加载自定义 DLL 后 CAPL Browser 看不到导出函数,需按配置路径添加 DLL、重编译节点,并核对表项类型字符串与 CANoe 位数一致。
适合人员
- 在 Vector CANoe/CANalyzer 中执行 ECU 诊断与安全访问测试、需要可维护 CAPL 与 Test Module 脚本的整车或零部件测试工程师
- 负责将 C/C++ 安全或诊断算法封装为 CAPL 可调用 DLL,并处理 `/MD` 与跨边界内存问题的嵌入式诊断软件开发人员
- 长期维护 CAN 仿真与 CAPL 节点,需要系统查阅事件处理、定时器与 `on sysvar_update` 触发逻辑的 HIL 或网络仿真工程师
- 编写 UDS 相关自动化用例,希望直接复用技能中安全/诊断测试模板而非从零拼凑 `TestStep` 调用规范的诊断协议工程师