以项目串联知识点
用同一份合同连接模型与观察者
本项目把第 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 的状态周期可能完全错过运动阶段,首条状态已经到端点不代表瞬间移动。
自动判定之前先做基线实验
- 在安装版 CANoe 中编译第 06 篇完整源码,保存编译诊断;本站尚未对该示例执行 CANoe 编译。
- 不发送命令,启动测量,观察收到的 CAN1 0x300 数据帧:DLC 3,载荷 00 00 00。
- 发送一次 0x202 数据帧,DLC 1,载荷 01。记录模型收到命令的事件及后续状态帧。
- 分别检查内部事件序列与周期状态。预期最终位置 100(十六进制 64)、静止;声称运动耗时之前,应测量实际事件时间。
- 关闭模型重复负例。观察者应超时,不能复用上次状态字节而通过。
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 执行证据。