CAPL Script

以项目串联知识点

用同一份合同连接模型与观察者

本项目把第 06 篇车门/车窗模型、受控发送源和独立观察者连接起来。这是可重复的教学实验,不是生产 ECU,也不是本站已经执行的测试报告。

第 07 篇测试模块检查的是另一份合同:0x200 上的 AA 心跳。不能原样粘贴到本项目;这里 0x200 是锁定命令,0x300 才是状态。心跳练习应放在单独配置中,或只复用其有界等待和数据校验方法,再按本合同改写。

分清三个参与者

参与者 发送 观察 责任
受控发送源 0x200、0x201、0x202 自己的输入计划 只发送当前用例要求的命令
第 06 篇模型 名义每 500 ms 的 0x300 CAN1 上的命令 拥有锁、位置、运动状态
观察者/测试模块 除明确兼任发送源外不发送 新收到的 0x300 和命令 Trace 用新观察核对预期状态

使用经典 CAN、标准 ID、单一 CAN1 映射。关闭相同 ID 的其他发送者,检查数据库冲突;每个独立用例重新开始测量。CAPL 测试模块需要对应 Test Feature Set 与许可,普通仿真节点不能替代其运行环境。

变量属于各自的 CAPL 程序。测试模块里声明 faultStatus,不会自动读到仿真节点的同名变量。节点间应通过明确定义的报文,或有明确所有者的系统变量通信。本项目使用第 06 篇已有状态报文。

连接组件前冻结协议

ID 载荷 模型规则
0x200 忽略载荷,本练习 DLC 0 即可 静止时锁定
0x201 忽略载荷,本练习 DLC 0 即可 静止时解锁
0x202 严格 1 字节:01 下降,02 上升 锁定、运动、无效命令时拒绝;已在目标端点时不启动运动
0x300 严格 3 字节:锁、位置、运动 锁 0/1;位置 0–100;运动 0 静止、1 上升、2 下降

初始状态为解锁、位置 0(全升)、静止。全行程需要 20 次、每次 5 的变化,名义间隔 20 ms,因此为 400 ms,不是两秒。500 ms 的状态周期可能完全错过运动阶段,首条状态已经到端点不代表瞬间移动。

自动判定之前先做基线实验

  1. 在安装版 CANoe 中编译第 06 篇完整源码,保存编译诊断;本站尚未对该示例执行 CANoe 编译。
  2. 不发送命令,启动测量,观察收到的 CAN1 0x300 数据帧:DLC 3,载荷 00 00 00。
  3. 发送一次 0x202 数据帧,DLC 1,载荷 01。记录模型收到命令的事件及后续状态帧。
  4. 分别检查内部事件序列与周期状态。预期最终位置 100(十六进制 64)、静止;声称运动耗时之前,应测量实际事件时间。
  5. 关闭模型重复负例。观察者应超时,不能复用上次状态字节而通过。

Interactive Generator 中配置了一行,不等于命令已经到达模型;要核实实际发送、接收通道和帧类型。

复用测试方法时避免陈旧数据假通过

0x300 协议没有事务编号。新收到的周期状态也可能仍是旧状态;新鲜度不能单独证明某条命令导致了变化。应建立已知基线、隔离其他命令源,并把结论写成观察到状态转换,而不是已确认请求事务。

写自动观察器代码之前,先遵循以下算法:

在新测量中建立并记录有效基线。
为本用例启动一个固定的总截止时间。
发送选定命令,记录其 Trace 时间。
只使用剩余时间等待一条新的 0x300 事件。
分别处理超时、等待中断和其他错误。
提取触发等待的报文;提取失败时停止检查。
核对通道、方向、标准数据帧环境与 DLC == 3。
核对范围:锁 0..1、位置 0..100、运动 0..2。
比较观察状态与用例预期。
只有允许中间状态且时间未到时才继续等待。
记录真实证据或有界失败,绝不把缓存全局变量当作本次证明。

这是伪代码,不是可编译 CAPL 文件。等待成功返回 1,而 TestGetWaitEventMsgData 成功返回 0,详见第 07 篇。循环中每次重新等待完整超时,会悄悄扩大总用时。执行前应确定总预算,并考虑 500 ms 报告相位和实际测得的调度容差。

有限的验收矩阵

以下是待执行检查,没有一行宣称已经 PASSED。

用例 准备与输入 待验证预期 额外证据
初始状态 重启,不发命令 状态 00 00 00 没有冲突发送者
锁定 新的静止模型;0x200 锁字节由 0 变 1 基线及命令记录
锁定后开窗 建立锁定后发 0x202 / 01 位置保持 0 拒绝日志;仅状态不能识别拒绝原因
完整下降 新的解锁模型;0x202 / 01 最终位置 100、静止 内部 20 步及实测时间
端点请求 已在 100,再请求下降 位置保持 100 不启动新运动定时器
无效载荷 新模型;0x202 的 DLC 0、DLC 2 或字节 03 状态不变 拒绝分支,没有越界读取
运动中命令 在受控运动期间明确注入锁定 保持解锁、继续运动 内部事件顺序;500 ms 状态可能错过该阶段
模型缺失 禁用模型并等待已提交流量排空 有界超时 不使用旧观察通过
重启 运动中停止,再启动 恢复初始状态 不复用待处理旧状态

即使这些检查实际通过,也只支持记录配置下的教学合同,不能据此证明防夹安全、诊断行为、实物执行器时序或与生产 ECU 等价。

先记录结果,再解释偏差

每个用例记录:源码版本、工具版本与许可环境、通道映射、活动节点、初始状态、命令及时间、接收报文、预期、实际结果、证据文件和未解释差异。执行前实际结果留空,避免带日期与 PASSED 字样的合成报告被误认为测量。

按报文筛选流程导出单一状态流,再交给时间间隔分析工具。周期统计回答的是该报文流如何到达,不能验证锁和车窗状态机。扩展故障前,应先定义确定性触发条件和可观察的失败状态,再考虑随机输入。

协议由第 06 篇定义。集成计划、陈旧数据反例与验收矩阵为本站独立分析,不代表已有 CANoe 执行证据。