K3-13 模式表/场景表与仲裁规则的静态体检:可达性、死锁与切换质量
课程代码 K3-13 | 板块 K 控制、软件与标定 / K3 控制策略与算法 时长 约 3.5~4.0 学时 | 难度 L3 专家 适合对象 控制策略工程师与热管理域控策略负责人(本课的直接执行者);模式表 / 仲裁规则表 / 切换序列表的评审人;整车热管理标定负责人(本课交付的验收页是标定放行的输入);负责签署「策略层可以进环境舱、可以进整车」这道闸的人。控制方向必修,标定与耐久方向选修。 前置 K3-01 整车热管理控制策略总览与模式管理 整车热管理控制策略总览与模式管理;K4-05 模式状态机的完备性核对与可验证性设计 模式状态机的完备性核对与可验证性设计;B3-04 热泵型整车热管理架构(多通阀一体化方案) 热泵型整车热管理架构(多通阀一体化方案);G8-06 冷却液侧集成模块(CIM):阀岛/泵/膨胀壶一体化架构 冷却液侧集成模块(CIM):阀岛/泵/膨胀壶一体化架构。体系外前置(需自备):有向图与环检测的基本概念(可达集、有向环、上三角矩阵),以及二维矩阵型规格表的评审经验。 本讲义定位 本课只做一件事:把状态机完备性核对那套方法,用到策略层那一叠具体的表上——模式表、迁移矩阵、需求合成表、执行器优先级表、切换序列表、权限矩阵、场景表。它不是算法课(可达性遍历、等待图查环、模型检验工具边界的方法本体归 K4-05 模式状态机的完备性核对与可验证性设计),不是仲裁机制课(优先级式、按权分摊、迟滞带与最小驻留的取法归 K3-01 整车热管理控制策略总览与模式管理),也不给任何合格阈值——本课交付的是判据的形状、取数的口径与一页可签署的验收页。
引言:一叠已经评审通过的表,为什么还要再体检一遍
策略层的交付物长得很朴素:几张 Excel 表。模式表一张、迁移矩阵一张、需求合成表一张、执行器优先级表一张、请求源权限矩阵一张、切换序列表一张、场景清单一张。每一张都被逐行评审过,每一张都有属主签字。然后它们被交给软件、交给标定、交给试验。
问题是,这些表是一张一张评审的,而缺陷长在它们之间。
一张模式表自己看没有毛病:八行模式,每行的进入条件、退出条件、执行器目标都填满了。一张优先级表自己看也没有毛病:每个请求源都有一个优先级数字。可是把两张表叠在一起看,会发现第五行那个模式,在任何工况组合下都拿不到执行器——它的请求源优先级恒低于另一路,而另一路的置位条件是那一路的超集。于是这一行是一个死格:写在表上、写进代码、写进测试用例、写进标定清单,占了所有人的工时,而车上永远走不到它。
这类缺陷有三个共同特征,正是本课存在的理由:
第一,它们在单张表的评审里查不出来。评审是逐行看的,而这类缺陷的证据分布在两张甚至三张表上。人眼把两张表在脑子里做一次连接运算,做八行还行,做四十行必漏——K3-01 整车热管理控制策略总览与模式管理 已就三表核对立过同一条:人眼逐格看必漏,而且两次走查漏的格子还不一样。
第二,它们在功能测试里也查不出来。功能测试验的是「走到这个模式时行为对不对」,而一个走不到的模式不会产生任何失败用例。它安静地通过一切,直到某一天有人改了一个门限,它突然可达了,带着一段从未被验证过的行为上路。
第三,它们的排查代价随发现时刻指数上升。在表阶段发现,改一格;在状态机建好之后发现,要连带改模型、改用例、改标定三处;带进环境舱才发现,花的是舱时——K6-07 热泵与多模式切换标定 已经写死了这条拦截要求:不可达模式、死锁与无出口迁移应在这一层拦掉,⛔ 别带进环境舱花舱时才发现。
本课的入口动作是一道翻译,不是一次分析。这一点必须先说清,因为它决定了本课与 K4-05 模式状态机的完备性核对与可验证性设计 的分工。K4-05 模式状态机的完备性核对与可验证性设计 的输入已经是一台成型的状态机——节点、边、guard 都是显式的,遍历算法可以直接跑。策略层不是这样:策略层的输入是一叠二维表,行是模式、列是请求或工况,格子里写的是条件表达式和执行器目标。要跑任何图算法,先得把这叠表逐格翻成「状态—事件—迁移」三元组。而翻译本身就会产出第一批缺陷:那些翻不出来的格——表里写了条件却找不到对应的状态、写了目标却说不清由哪个事件触发——是拿不到算法输入的,它们在翻译台上就掉出来了。
会做错的第一个动作:等状态机建好了再做可达性分析。这个念头很自然——图算法要图,图在状态机里。但策略层在表阶段就该做一遍:表里已经有「行=模式、列=请求/工况」的全部信息,等进了模型再查,一次改动的代价是表阶段的三倍以上(模型、用例、标定三处联动)。⇒ 表阶段那一遍不是「提前做一次」,是成本最低的那一次。
会做错的第二个动作:把不可达模式一律删掉。「查出来不可达 → 删格」听起来干净利落,实际上三类成因的处置完全不同,删错了会把一条真需求删掉:门限写反了要改门限;优先级恒被压过要改优先级或者承认它是死格;工况谱里根本没有落进这个模式的区间,那是需求侧的问题,要退回需求与架构,不是在仲裁里继续加分支——O3-07 FCEV 系统级热管理模式管理与功率—热仲裁 已就此写死一条:有解不上的区间是需求不合理或自由度不足。
会做错的第三个动作:把「温度全合格」当成切换质量合格。这是本领域最常见的假通过。一台车在环境舱里所有温度点都在窗口内、无任何故障码,而它的主动进气格栅在山区路段上反复对开对关,跑到三万公里已经吃掉寿命配额的一大半。温度是被控量,切换质量是另外四个独立的验收量——切换频次、执行器动作次数、驻留时长分布、切换瞬间的输出跳变幅度。四个量里任何一个超限,那台车都不该签字放行。
本课的射程与它答不了的问题。本课的体检对象被钉死为热管理策略层的规则表与场景表。它答不了四类问题:① 方法本体——可达性遍历怎么写、等待图查环用什么算法、模型检验工具能证什么不能证什么、「未证明 ≠ 通过」这条边界,全部归 K4-05 模式状态机的完备性核对与可验证性设计,本课只讲这套方法作用在具体规则表上时输入怎么准备、结论怎么判读、报告怎么签,两门必须互链,不许各写一遍;② 仲裁机制本体——优先级式与按权分摊、紧急度折算、迟滞带的三项下界、最小驻留的两条下界与计时起点、饥饿防护三件套、可用功率四段握手,全部归 K3-01 整车热管理控制策略总览与模式管理,本课一个阈值也不定;③ 模式层与执行器层的穷举——模式表五列填法与四条校核规则、过渡阀位逐格校核归 B3-04 热泵型整车热管理架构(多通阀一体化方案) 与 B3-01 冷却液回路拓扑:串/并联、多回路耦合与模式切换,阀位组合真值表与状态数上限归 G8-06 冷却液侧集成模块(CIM):阀岛/泵/膨胀壶一体化架构,本课的对偶表只做场景层;④ 逐场景的判定判据——暴晒归 C6-05 暴晒后快速降温专项设计,拖挂爬坡与长下坡回收归 K7-01 预测性热管理(导航/云端/驾驶意图协同),快充预约归 D4-03 充电过程温控策略与充电功率协同 与 D3-04 低温预热与出行预约热管理,露营归 C6-04 智能座舱:人员感知与按需送风(露营/休息模式),热浸续跑归 K3-11 热管理域的上下电时序、run-on 编排与休眠期能耗预算 与 K3-08 冷却侧执行器需求生成与协同仲裁:电子水泵/冷却风扇/AGS。本课只回答「这两个场景能不能同时成立」,⛔ 不回答「这个场景现在成不成立」。
⚠ 本课不引任何「静态体检」或「场景标志位」专用标准号。可达性核对、死锁排查、场景表与标志位接口的要求散落在各主机厂软件开发规范、整车电子电气架构接口规范与项目适用矩阵中,具体条款与适用性按现行版本确认,讲义不得自造编号。本课借用而不重讲的两条体系口径(静态分析属软件单元验证的可选方法之一、结构覆盖类型按功能安全等级分档选取而非越高越好)只写去向:本体与分档表见 K4-02 基于模型开发(MBD):Simulink 建模与代码生成 与 K4-03 MIL/SIL/HIL 验证流程,功能安全方法本体见 K2-03 功能安全(ISO 26262)在热管理中的应用,版次以现行目录为准、引用前须核。
五讲的走法。第 1 讲立体检对象与翻译规则,做出可达模式集,并说清它为什么是下游三处覆盖率的分母;第 2 讲把请求-资源图建起来,讲策略层死锁的四类成因与它们在表上的表面形式;第 3 讲做场景层的互斥/并存对偶表与「场景→模式请求」映射,并守住「映射表不许自带第二套仲裁」这条线;第 4 讲把场景标志位的接口约定写足——九个必填字段、编号规则、版本演进三种改动的处置;第 5 讲把切换质量四个验收量的取数窗口、分布判读与验收页落到一页纸上。其后是典型案例、一次完整的动手做、关键公式详解、常见误区速查与按任务导航。
第 1 讲 策略层规则表的迁移可达性核对:从表到可达集
本讲要交出三样东西:一份翻译台账(表格 → 三元组,含翻不出来的格)、一份带版本号的可达模式集清单、一份不可达/陷阱项清单(每项标注成因类别与处置)。这三样合起来就是静态体检报告的前半页,它是两道下游闸的输入。
1.1 体检对象先点名:六张表,属主一律引用不重讲
体检不能从「所有相关文档」开始,那是没有边界的活。本课把体检对象钉死为六张策略层交付表:
| # | 表名 | 属主 | 本课要从它取什么 |
|---|---|---|---|
| ① | 模式表(含互斥/并存表与非法组合排除表)与迁移矩阵 | K3-01 整车热管理控制策略总览与模式管理 | 模式全集、每行的进入/退出条件、迁移矩阵每一格 |
| ② | 需求合成表、执行器稳态出力优先级表 | K3-08 冷却侧执行器需求生成与协同仲裁:电子水泵/冷却风扇/AGS | 每一行「谁赢、要不要回执」——这是请求-资源图的边 |
| ③ | 切换序列表 | K3-09 冷却液回路模式切换的执行时序:泵—阀联动、断流窗口与切换序列表 | 每条迁移在执行层展开成几步、有没有中间态 |
| ④ | 请求源权限矩阵 | K3-16 座舱 HVAC 请求源仲裁与人机接管:安全强制、AUTO 退出/恢复与设定记忆 | 每一格「压过之后怎么办」——同样是图的边 |
| ⑤ | 整车级门限表 | K6-08 电驱与前端散热回路标定(BEV) | 进入/退出门限的实际取值方向(不取具体数) |
| ⑥ | 状态—仲裁表 | O3-07 FCEV 系统级热管理模式管理与功率—热仲裁 | 含不可支配热源架构下的授权关系 |
这六张表的内容一律引用不重讲。本课不重新定义模式、不重新划优先级、不重新整定门限——本课只做「体检」这一道工序。⇒ 体检报告里出现的每一个模式名、每一条迁移、每一个请求源,都必须能反查到上面某一张表的某一行;反查不到的,就是体检员自己加进去的东西,一律划掉。这条听起来像形式主义,实际上是本课最容易被违反的一条:体检做到一半,发现某条迁移「显然应该有」,顺手就补上了——于是体检报告与被体检的表分了岔,而两边都以为自己是对的。
1.2 入口是一道翻译:把二维表逐格翻成「状态—事件—迁移」三元组
策略层的表和状态机之间隔着一次格式转换,而这次转换不是机械的。
翻译规则四条。
① 行 → 状态。模式表每一行是一个状态,状态名取模式表上的模式名,⛔ 不许改写、不许合并同类项。合并会让后面的可达集数不对——两个被合并的模式,可能一个可达一个不可达。
② 列头 + 格内条件 → 事件。列头是请求源或工况维度,格内写的是条件表达式。事件名的构造法是「列头 + 条件跨越方向」,例如列头是「座舱制冷请求」、格内条件是某温度高于进入门限,事件就是「座舱制冷请求置位(该温度上穿进入门限)」。⚠ 一个格子可能产出两个事件——上穿一个、下穿一个,方向不同的两个事件不许写成一个。
③ 格内的目标模式 → 迁移。三元组 = (源状态, 事件, 目标状态)。迁移矩阵那张表是这一步的交叉校核:从模式表逐格翻出来的迁移集合,与迁移矩阵上写着的边集合,必须逐条对上。对不上的两个方向都要记账——矩阵有而表翻不出的、表翻得出而矩阵没有的。
④ 翻不出来的格,就地立缺陷单。四种典型形态:
- 写了条件没有目标状态——格子里写着「若某温度超限」,然后没有下文,或者写的是一句执行器动作而不是模式名。这类格子在实车上的行为取决于代码作者当时怎么理解,而不同的人理解不同。
- 写了目标状态说不清触发事件——格子里只写「进入某模式」,条件那一栏空着或者写「视工况」。它派生不出用例,因为用例要的是一个可注入的触发。
- 条件里引用了一个不在信号清单里的量——例如引用了一个「预计到达时间」,而这个量的属主、更新周期、失效值都没人认领。
- 同一个 (源状态, 事件) 对出现两个不同的目标状态——这是非确定性,在表上长得像「两行都写着从 A 出发」,在实车上表现为结果取决于代码里 if 的书写顺序。
⚠ 这四类里,第一类和第四类是最危险的,因为它们不会在任何评审里显形:第一类看起来只是「这一格写得简略了些」,第四类看起来是「两条规则各自都对」。
1.3 可达模式集:本课钉死的符号是 M_reach,⛔ 与两门邻课的 S_reach 不是一个东西
翻译完成后跑一次前向可达性遍历(算法本体归 K4-05 模式状态机的完备性核对与可验证性设计 第 3 讲,本课不重讲),从上电初始模式出发,得到可达模式集。本课把它记作 M_reach,元素是模式表上的模式(表的行);模式全集条目数记作 N_mode。
⚠⚠ 这里有一处必须先钉死的跨课撞名。K4-05 模式状态机的完备性核对与可验证性设计 用 S_reach 指「状态机的可达状态集」,元素是状态机的状态;G8-06 冷却液侧集成模块(CIM):阀岛/泵/膨胀壶一体化架构 也用 S_reach,指「可达回路连接状态集」,元素是阀位组合表达出的连接关系。两者元素类型已经不同、不可互算。本课的 M_reach 是第三个东西:元素是策略层规则表上的行。三者的关系是:
- M_reach 与 K4-05 模式状态机的完备性核对与可验证性设计 的 S_reach 通常一一对应,但不保证相等——状态机里常有表上没有的实现态(初始化态、迁移中间态),也常把表上两行合成一个状态加一个内部变量。⇒ 两者对不上的地方,正是「模型没照着表建」或者「表没写全」,是要记账的。
- M_reach 与 G8-06 冷却液侧集成模块(CIM):阀岛/泵/膨胀壶一体化架构 的 S_reach 没有对应关系,一个数模式、一个数连接关系,⛔ 不可比大小、不可互代。
⇒ 写法口径:凡在正文里出现,本课一律写 M_reach 并在每一节首次出现时写足「可达模式集」四个字;引用邻课的量时一律写足「状态机的可达状态集」或「可达回路连接状态集」,⛔ 不许裸写 S_reach。读到一个不带限定语、身边也没有定义行的 S_reach(在别人的报告里也一样),先停下来确认它数的是模式、状态还是回路连接关系。
M_reach 的补集就是不可达模式清单:N_mode 减去 |M_reach| 那些行。同理,翻译出来的迁移集合减去可达迁移,就是不可达迁移清单。这两份清单必须带版本号——版本号取被体检那六张表的版本号组合,⛔ 不许只写体检日期。理由在 1.6 节。
1.4 不可达模式的三类策略侧成因:判别不同,处置也不同
查出一行不可达,下一步不是删,是分类。三类成因的判别特征与处置如下。
成因① 进入门限严于退出门限(门限写反)。判别特征:该模式的进入条件与退出条件同时引用同一个被控量,而进入门限落在退出门限的「里面」——于是任何时刻只要满足进入条件就同时满足退出条件,模式进去的瞬间就被弹出,遍历上表现为该状态入边可达而驻留长度恒为零,或者干脆连入边都不可达。处置=改门限,改法归 K3-01 整车热管理控制策略总览与模式管理 的迟滞带三项下界。⚠ 这一类最容易在两个人分别填「进入」列与「退出」列时产生,且两人各自都填对了自己那一列。
成因② 优先级恒被压过。判别特征:该模式的请求源在权限矩阵与优先级表上恒低于另一路,而另一路的置位条件是这一路的超集——于是无论工况怎么组合,这一路都拿不到执行器。判别动作是两步:先在优先级表上找出压过它的那一路,再核对两路置位条件的包含关系;包含关系成立才是本类,不成立只是「大部分时候拿不到」,那是饥饿不是不可达(两者的区别见 2.6 节,用错药会误诊)。处置=改优先级,或者承认它是死格并从表里删掉——删是合法处置之一,但必须写明「已确认它在本架构下无存在意义」,⛔ 不许静默删除。
成因③ 工况谱里没有落进该模式的区间。判别特征:门限没写反、优先级也拿得到,但把该模式的进入条件拿到目标市场的工况谱上去筛,落进这个区间的样本数为零或者接近零。⚠ 这一类不是策略缺陷,是需求或架构缺陷,处置是退回需求与架构:要么这条需求本来就不该有,要么系统自由度不足以到达那个工作点。⛔ 绝不是「继续加仲裁分支去够到它」——O3-07 FCEV 系统级热管理模式管理与功率—热仲裁 的工况谱点名法已经写死这条:有解不上的区间是需求不合理或自由度不足。(工况谱的来源与区间统计归 B1-01 整车热平衡与全工况热负荷谱分析,本课只用它的结论。)
1.5 陷阱态(不可逃逸)在策略层的两种形态
陷阱态是「进得去、出不来」的状态。它在软件层的成因(迁移表漏了出边)归 K4-05 模式状态机的完备性核对与可验证性设计;在策略层,它有两种成因完全不同的典型形态,而且都不是「漏写了出边」——出边写得好好的,只是永远不成立。
形态一:进入条件写成「或」,退出条件写成「与」。进入条件是若干子条件的析取(任一成立即进入),退出条件却是同一批子条件的合取(全部反转才退出)。⚠ 这在写表的时候看不出任何问题,因为两列是分开填的,每一列自己都很合理:「任一路热请求超限就进保护模式」很合理,「所有热请求都回落才退出保护模式」也很合理。合在一起就是:只要有任何一路长期挂在门限上,这个模式就永远出不来。判别动作:逐模式把进入条件与退出条件的逻辑结构并排写出来,看析取/合取的方向是否匹配;不匹配的逐条追问「有没有一个子条件可能长期成立」。
形态二:退出条件依赖一个进入该模式后就不再有效或不再更新的量。典型例:进入除霜模式后,蒸发器温度不再反映结霜程度(表面已被加热,而霜层还在),却仍然拿它当退出判据;再如,进入某个保护模式后为省电关掉了某路传感器的采样,而退出条件恰恰引用那一路。判别动作是逐模式的一张小表:把退出条件依赖的每一个量列出来,逐个回答两问——在这个模式内它还有效吗?在这个模式内它还会变化吗?两问任一为「否」,这条退出边就是假的。
⚠ 形态二的危险在于它是有条件的。同一个量在别的模式里完全有效,只在这个模式里失效——所以按信号清单逐信号核对是查不出来的,必须逐模式核。
1.6 可达模式集是下游三处的分母:算错了三处一起虚高
体检报告里那份 M_reach(可达模式集)清单不是给自己看的,它是三处覆盖率的分母。
第一处:标定覆盖率。K6-07 热泵与多模式切换标定 的模式覆盖率是一个按工况谱权重加权的比值,分子是本版已实标或已合法继承的模式的权重和,分母是模式全集的权重和。⚠ 这里的「模式全集」必须取本课体检后的 M_reach,⛔ 不是模式表的行数。把不可达模式算进分母会发生什么:那些行永远标不了(因为走不到),于是它们的权重永远进不了分子,覆盖率被一个永远不可能补上的缺口压着——反过来,如果有人为了让数字好看而给不可达模式记了权重零,那覆盖率就虚高了,因为分母被人为缩小而缩小的理由没有写下来。⇒ 正确做法是先体检、后算覆盖率,并在报告上写明分母取的是哪一版 M_reach。
第二处:迁移覆盖率。K4-03 MIL/SIL/HIL 验证流程 与 K4-05 模式状态机的完备性核对与可验证性设计 的迁移覆盖率,分母取自迁移表上写着的边。本课的贡献是:这个分母必须先剔掉不可达迁移——一条永远走不到的边,会让迁移覆盖率永远达不到 100%,于是团队要么长期带着一个红项放行(久而久之这个红项就没人看了),要么给它写一条豁免论证(豁免论证的写法归 K4-05 模式状态机的完备性核对与可验证性设计)。两条路都比「先把它从分母里剔出去并说明为什么」贵。
第三处:场景覆盖率。K4-03 MIL/SIL/HIL 验证流程 的场景覆盖率,分子是已有至少一条回放用例的场景数,分母是场景全集条数。⚠ 这里的分母来自本课第 3 讲交付的场景全集与映射表,同理必须是体检后的版本。
⚠⚠ 三处共有一条硬要求:报比值必须同时给出分子分母的绝对条数与分母的版本号。只写百分比会掩盖分母口径的变化——表改了一版、体检重跑了一次、分母悄悄变了,而百分比看起来还很好。这条要求的本体在 K4-03 MIL/SIL/HIL 验证流程 与 K4-05 模式状态机的完备性核对与可验证性设计,本课把它落成体检报告的一条格式约束:M_reach 清单必须带版本号,版本号取被体检那六张表的版本号组合。
1.7 出口有两处闸口:报告怎么签,交给谁
体检报告不是评审用的文档,它是两道闸的输入。这一点决定了它的格式。
闸一:接进验证流程的出口判据。K4-03 MIL/SIL/HIL 验证流程 的出口判据里,静态体检报告与需求覆盖率、结构覆盖率并列——三项都不达标就不放行。⇒ 报告上必须有一栏是「本次体检的结论:放行 / 有条件放行 / 不放行」,以及有条件放行时那些条件的兑付时刻。
闸二:进环境舱前的拦截项。K6-07 热泵与多模式切换标定 已写死:不可达模式、死锁与无出口迁移应在这一层拦掉。⚠ 这一条的经济性很清楚:一次舱时的代价远高于一次逐格核对,而不可达模式在舱里表现为「怎么也标不到那个工况点」,工程师会先怀疑舱、怀疑车、怀疑标定参数,最后才怀疑表——排查顺序本身就把成本推高了。
报告的签署栏至少四行:体检对象的六张表各自的版本号;本次遍历工具与版本(工具本体归 K4-05 模式状态机的完备性核对与可验证性设计,本课只要求记录);结论与未闭项清单;体检人与日期。⚠ 缺版本号的体检报告等于没做——因为它无法回答「表改了之后这份结论还算不算数」,而表一定会改。
后面还有 4 讲正文 · 关键公式 · 案例拆解 · 常见误区 · 动手做