MAB(Mathworks Advisory Board,Mathworks咨询委员会)针对MATLAB、Simulink、Stateflow规定了建模重要基本规则,这些建模指南的总体目的是让模型的建模者和使用者能够形成简单、统一的理解,本文章主要针对2020年3月发布的5.0版本进行逐条解读。
众所周知,编码规范可以在命名、缩进、注释、格式上统一代码风格,别人一看就懂,降低了沟通成本,并且规范的代码结构也使得代码的可读性、可维护性极大提升,同样,建模规范也有异曲同工之妙,遵守建模规范是实现以下目标的重要前提主要目标是:
- 提高图形的可理解性
- 提高功能分析的可读性
- 防止连接错误
- 注释等
- 提高代码生成效率
- 确保生成代码的健壮性
目录
- Stateflow建模规范(共54条)
-
- [条件转移 / 动作(19 条)](#条件转移 / 动作(19 条))
- 详细解读
-
- [jc_0790: Chart 块的动作语言规范](#jc_0790: Chart 块的动作语言规范)
- [jc_0702: Stateflow 命名参数 / 常量使用规范](#jc_0702: Stateflow 命名参数 / 常量使用规范)
- [jm_0011: Stateflow 中的指针规范](#jm_0011: Stateflow 中的指针规范)
- [jc_0491: Stateflow 数据复用规范](#jc_0491: Stateflow 数据复用规范)
- [jm_0012: 事件和广播事件使用限制规范](#jm_0012: 事件和广播事件使用限制规范)
- [jc_0733: 状态动作类型顺序规范](#jc_0733: 状态动作类型顺序规范)
- [jc_0734: 状态动作类型数量规范](#jc_0734: 状态动作类型数量规范)
- [jc_0740: 退出状态动作使用限制规范](#jc_0740: 退出状态动作使用限制规范)
- [jc_0741: 状态图转换条件中数据更新时序规范](#jc_0741: 状态图转换条件中数据更新时序规范)
- [jc_0772: 转换线的执行顺序和转换条件规范](#jc_0772: 转换线的执行顺序和转换条件规范)
- [jc_0753: Stateflow 中的条件动作和转换动作规范](#jc_0753: Stateflow 中的条件动作和转换动作规范)
- [jc_0711: Stateflow 中的除法运算规范](#jc_0711: Stateflow 中的除法运算规范)
- [db_0127: Stateflow 块中 MATLAB 命令使用限制规范](#db_0127: Stateflow 块中 MATLAB 命令使用限制规范)
- [jc_0481: Stateflow 中浮点数严格等价比较使用规范](#jc_0481: Stateflow 中浮点数严格等价比较使用规范)
- [na_0001: Stateflow 运算符标准使用规范](#na_0001: Stateflow 运算符标准使用规范)
- [jc_0655: Stateflow 中禁止逻辑值比较规范](#jc_0655: Stateflow 中禁止逻辑值比较规范)
- [jc_0451: 无符号整数上单目减使用规范](#jc_0451: 无符号整数上单目减使用规范)
- [jc_0802: Stateflow 中禁止隐式类型转换规范](#jc_0802: Stateflow 中禁止隐式类型转换规范)
- [jc_0803: 向库函数传递值规范](#jc_0803: 向库函数传递值规范)
- 其他Stateflow规范
-
- [Stateflow模块 / 数据 / 事件](#Stateflow模块 / 数据 / 事件)
- Stateflow图
- 标签描述
- 其他
- 声明
MAB 5.0共151条规范,分为命名规范、Simulink建模规范、Stateflow建模规范、MATLAB规范四类。
Stateflow规范共54条,分以下5部分进行解读
- 第1部分:Stateflow模块 / 数据 / 事件
- 第2部分:Stateflow图
- 第3部分:条件转移 / 动作
- 第4部分:标签描述
- 第5部分:其他
本文章解读第3部分 条件转移 / 动作
MAB 5.0最全规范见 MATLAB MAB 5.0建模规范解读(最全)
Stateflow建模规范(共54条)
条件转移 / 动作(19 条)
| 序号 | 规范 ID | 规范名称 | 核心要求简述 |
|---|---|---|---|
| 1 | jc_0790 | Action language of Chart block Chart 块的动作语言规范 | Chart 动作语言设为 "C" |
| 2 | jc_0702 | Use of named Stateflow parameters/constants Stateflow 命名参数 / 常量使用规范 | Stateflow 不使用数值字面量(初始值 0、增减量 1 除外),需用命名参数 / 常量 |
| 3 | jm_0011 | Pointers in Stateflow Stateflow 中的指针规范 | Stateflow 不使用指针变量 |
| 4 | jc_0491 | Reuse of Stateflow data Stateflow 数据复用规范 | 单个 Chart 中变量不允许有多重含义 |
| 5 | jm_0012 | Usage restrictions of events and broadcasting events 事件和广播事件使用限制规范 | 广播事件需使用 "send (状态名。事件名)" 语法;事件仅用于 Stateflow 输出 |
| 6 | jc_0733 | Order of state action types 状态动作类型顺序规范 | 状态动作类型顺序:entry→during→exit(基础类型和组合类型一致) |
| 7 | jc_0734 | Number of state action types 状态动作类型数量规范 | 同一状态动作类型不重复描述超过两次 |
| 8 | jc_0740 | Limitation on use of exit state action 退出状态动作使用限制规范 | 不使用 exit 状态动作 |
| 9 | jc_0741 | Timing to update data used in state chart transition conditions 状态图转换条件中数据更新时序规范 | 状态转换条件中使用的变量不通过 during 动作更新 |
| 10 | jc_0772 | Execution order and transition conditions of transition lines 转换线的执行顺序和转换条件规范 | 所有转换路径需可执行;R2016b + 设 "不可达执行路径" 为 "错误" |
| 11 | jc_0753 | Condition actions and transition actions in Stateflow Stateflow 中的条件动作和转换动作规范 | 不使用转换动作;同一 Chart 中不同时使用条件动作和转换动作 |
| 12 | jc_0711 | Division in Stateflow Stateflow 中的除法运算规范 | Stateflow 中不执行除法;若执行需避免除零 |
| 13 | db_0127 | Limitation on MATLAB commands in Stateflow blocks Stateflow 块中 MATLAB 命令使用限制规范 | Stateflow 块中不使用 MATLAB 命令;若使用需通过 MATLAB Function 访问 |
| 14 | jc_0481 | Use of hard equality comparisons for floating point numbers in Stateflow Stateflow 中浮点数严格等价比较使用规范 | 浮点数不使用等价比较运算符(==、!=、~=) |
| 15 | na_0001 | Standard usage of Stateflow operators Stateflow 运算符标准使用规范 | 动作语言为 C 时,&/ /^/~ 仅用于位运算;!=/~=/<> 用于不等式;! 用于逻辑否定 |
| 16 | jc_0655 | Prohibition of logical value comparison in Stateflow Stateflow 中禁止逻辑值比较规范 | 不比较逻辑常量(如 flg==true) |
| 17 | jc_0451 | Use of unary minus on unsigned integers 无符号整数上单目减使用规范 | 无符号整数不使用单目减 |
| 18 | jc_0802 | Prohibited use of implicit type casting in Stateflow Stateflow 中禁止隐式类型转换规范 | 计算中变量类型需一致;不同类型需显式转换 |
| 19 | jc_0803 | Passing values to library functions 向库函数传递值规范 | abs 不输入有符号整数最小值;sqrt/log/log10 不输入负数;fmod 第二个参数不为 0 |
详细解读
jc_0790: Chart 块的动作语言规范
规范描述
Chart\](Stateflow 图块)的参数 {Action Language}(动作语言)必须设置为 "C",禁止使用 "MATLAB" 作为动作语言。
核心目的
- 保障代码生成一致性:C 语言是嵌入式控制器的主流开发语言,统一动作语言为 C,可减少生成代码中的语法转换逻辑,避免因语言差异导致的代码执行异常。
- 提升跨团队协作效率:标准化动作语言,让熟悉 C 语言的开发人员无需额外适配 MATLAB 语法,降低模型理解与维护成本。
- 简化语法适配成本:C 语言语法严谨、执行逻辑明确,避免 MATLAB 与 C 语言在运算符、数据类型、执行时序等方面的差异引发的逻辑歧义。
示例说明
| 正确示例 |
|---|
动作语言设置为 C。 ![]() |
| 错误示例 |
|---|
动作语言设置为 MATLAB。 ![]() |
jc_0702: Stateflow 命名参数 / 常量使用规范
规范描述
- Stateflow 中禁止直接使用数值字面量(numeric literal),需通过命名参数或常量替代。
例外:仅允许以下场景使用数值字面量 ------ 初始值为 0、递增 / 递减步长为 1。
核心目的
- 提升可读性与可理解性:命名参数 / 常量能直观体现数值的业务含义(如HIGH_TEMP=120明确为 "高温阈值"),避免纯数值导致的 "魔法数字" 问题,降低跨团队协作时的理解成本。
- 便于校准与维护:集中定义的命名参数 / 常量可统一修改(如调整阈值时仅需修改参数值,无需遍历所有使用场景),适配嵌入式控制器的校准需求,减少维护失误。
- 保障逻辑一致性:避免相同数值在多处重复写入导致的不一致(如同一阈值在不同状态中误写为不同数值),确保模型逻辑统一。
示例说明
| 正确示例 |
|---|
不使用数字字面值。 ![]() |
| 错误示例 |
|---|
使用了数字字面值。 ![]() |
jm_0011: Stateflow 中的指针规范
规范描述
- Stateflow 中禁止使用指针变量,包括直接定义指针类型数据、通过指针访问或修改内存地址中的数据(如&var取地址、*ptr解引用操作)。
核心目的
- 避免内存访问风险:指针操作可能导致越界访问、空指针引用等内存安全问题,嵌入式控制器中此类问题易引发系统崩溃或非预期行为,禁止指针可从源头规避风险。
- 提升模型可读性与可维护性:指针操作的内存指向关系隐蔽,开发人员难以直观追溯数据流向,禁止指针后数据访问路径清晰,降低跨团队协作的理解成本。
- 保障代码生成稳定性:指针相关语法在 Stateflow 代码生成过程中可能出现解析异常,或生成的代码与建模逻辑不一致,禁止指针可确保生成代码的可靠性与一致性。
示例说明
| 正确示例 |
|---|
Stateflow Chart (Stateflow) 未使用指针变量。 ![]() |
| 错误示例 |
|---|
使用了指针变量。 ![]() |
jc_0491: Stateflow 数据复用规范
规范描述
- 应仅在 Stateflow Chart (Stateflow) 的输出中使用 Stateflow 事件。。
核心目的
- 避免逻辑歧义:变量复用会导致其业务含义模糊,开发人员难以追溯变量的实际用途,易引发对模型逻辑的误解。
- 降低维护风险:复用变量可能导致修改一处逻辑时,意外影响其他依赖该变量的功能模块,增加调试与维护难度。
- 提升模型可读性:单一用途的变量可通过命名直观体现其功能(如count_cycle"周期计数"、temp_threshold"温度阈值"),让跨团队协作时快速理解变量作用。
- 保障逻辑一致性:禁止变量复用可避免因变量值被多次修改导致的逻辑冲突,确保仿真与代码生成时的逻辑确定性。
示例说明
| 正确示例 |
|---|
一个变量在单个 Stateflow Chart (Stateflow) 中不具有多重含义(用法)。 ![]() |
| 错误示例 |
|---|
变量 k 和 kk 在 Stateflow Chart 中有多种用途。 ![]() |
jm_0012: 事件和广播事件使用限制规范
规范描述
- 应仅在 Stateflow Chart (Stateflow) 的输出中使用 Stateflow 事件。
- 应使用 send (Stateflow) 语法 send(event_name, state_name) 来广播 Stateflow 事件。
- 应使用具有限定事件名称的 send (Stateflow) 语法 send(state_name.event_name) 来广播 Stateflow 事件。
核心目的
- 避免递归处理风险:禁止事件用于 Stateflow 图块内部递归,防止因递归触发导致的逻辑死循环或仿真异常。
- 提升事件触发可读性:强制广播事件时指定接收状态,让开发人员直观识别事件的发送方与接收方,避免事件流向模糊,降低跨团队协作理解成本。
- 保障逻辑确定性:明确事件的使用范围与广播语法,避免因事件触发对象不明确导致的非预期行为,确保仿真与代码生成时的逻辑一致性。
示例说明
| 正确示例 |
|---|
仅在 Stateflow Chart 输出中使用了事件。 ![]() |
事件使用 send 语法send(event_name, state_name) 进行广播。 ![]() |
事件使用 send 语法send(state_name.event_name)进行广播。 ![]() |
| 错误示例 |
|---|
在 Stateflow Chart 输出之外使用了事件。 ![]() |
接收广播的状态尚未在 send (Stateflow) 语法中定义。 ![]() |
jc_0733: 状态动作类型顺序规范
规范描述
- Stateflow 中禁止使用指针变量,包括直接定义指针类型数据、通过指针访问或修改内存地址中的数据(如&var取地址、*ptr解引用操作)。
核心目的
- 避免内存访问风险:指针操作可能导致越界访问、空指针引用等内存安全问题,嵌入式控制器中此类问题易引发系统崩溃或非预期行为,禁止指针可从源头规避风险。
- 提升模型可读性与可维护性:指针操作的内存指向关系隐蔽,开发人员难以直观追溯数据流向,禁止指针后数据访问路径清晰,降低跨团队协作的理解成本。
- 保障代码生成稳定性:指针相关语法在 Stateflow 代码生成过程中可能出现解析异常,或生成的代码与建模逻辑不一致,禁止指针可确保生成代码的可靠性与一致性。
示例说明
| 正确示例 |
|---|
基本状态动作类型按以下顺序表述: entry (en) during (du) exit (ex) ![]() |
组合状态动作类型应按以下顺序表述: entry (en) during (du) exit (ex) ![]() |
| 错误示例 |
|---|
动作类型顺序错误。 ![]() |
动作类型顺序错误 ![]() |
jc_0734: 状态动作类型数量规范
规范描述
- 同一状态的动作类型(entry/en、during/du、exit/ex)不得重复描述同一功能超过两次。
核心目的
- 避免执行顺序歧义:同一功能在多个动作类型中重复描述,会导致执行时序难以判断(不同动作类型的执行时机不同),规范可杜绝此类混淆。
- 提升模型可读性:精简动作类型中的重复逻辑,让开发人员快速识别状态的核心功能,降低跨团队协作的理解成本。
- 减少维护风险:重复的动作逻辑会增加修改成本(需同步修改所有重复场景),且易出现修改遗漏,规范可降低维护失误概率。
示例说明
| 正确示例 |
|---|
基本状态动作类型按以下顺序表述: entry (en) during (du) exit (ex) ![]() |
| 错误示例 |
|---|
动作类型顺序错误。 ![]() |
jc_0740: 退出状态动作使用限制规范
规范描述
- 禁止使用状态动作类型中的退出动作(exit/ex)。
核心目的
- 避免执行时序误解:exit 动作的执行时机与转移目标状态的 entry 动作存在时序关联(exit 动作先执行,再执行目标状态 entry 动作),易导致开发人员误判逻辑执行顺序,禁止使用可杜绝此类混淆。
- 防止逻辑覆盖风险:exit 动作中定义的变量赋值、状态标识等逻辑,可能被转移目标状态的 entry 动作覆盖,导致 exit 动作的设计意图失效,规范可规避此类无效逻辑。
- 提升模型可读性与可维护性:统一状态退出逻辑的实现方式(如通过父状态动作、转移条件动作等),让跨团队协作时快速识别状态退出相关逻辑,降低理解成本。
示例说明
| 正确示例 |
|---|
未使用exit动作 ![]() |
| 错误示例 |
|---|
当使用状态动作类型 exit(ex) 时,看起来会Cond输出 TBD,但实际上它被转移目标状态的状态动作类型 entry 所覆盖。它并不是由 Stateflow Chart (Stateflow) 输出的。 ![]() |
jc_0741: 状态图转换条件中数据更新时序规范
规范描述
- 用于状态转移条件的变量,禁止通过 during(执行中)动作进行更新。
核心目的
- 避免执行时序混淆:during 动作的执行时机与转移条件的判断时序存在关联(转移条件判断与 during 动作执行顺序易混淆),禁止通过 during 更新条件变量可明确数据更新与条件判断的先后关系,杜绝逻辑歧义。
- 保障转移逻辑确定性:确保状态转移条件所依赖的数据在判断前已完成更新,避免因 during 动作动态修改数据导致的转移触发异常(如条件判断时数据未更新或重复更新)。
- 提升模型可读性与可维护性:标准化条件变量的更新时机,让开发人员清晰追溯数据更新路径,降低跨团队协作时对时序逻辑的理解成本。
示例说明
| 正确示例 |
|---|
条件中的数据未使用"during"进行更新。 ![]() |
| 错误示例 |
|---|
条件中的数据使用了"during"进行更新。 ![]() |
jc_0772: 转换线的执行顺序和转换条件规范
规范描述
- 核心约束 1:所有转移路径必须具备可执行性,禁止存在不可达的执行路径。
- 核心约束 2:
- R2011b 至 R2016a 版本:配置参数 {Transition shadowing}(转移遮蔽)必须设置为 "Error"。
- R2016b 及以后版本:配置参数 {Unreachable execution path}(不可达执行路径)必须设置为 "Error"。
核心目的
- 避免不可达路径:通过配置参数报错机制,强制排查模型中 "逻辑上无法触发" 的转移路径(如被优先级更高的无条件转移遮蔽的条件转移),杜绝无效逻辑冗余。
- 明确执行时序:规范转移线的优先级顺序(无条件转移最后执行),避免因顺序混乱导致的非预期转移触发,确保转移逻辑与设计意图一致。
- 提升模型可验证性:确保所有转移路径均可被测试覆盖,降低因隐藏不可达路径导致的调试难度,符合嵌入式控制器模型的可验证性要求。
- 保障代码生成有效性:剔除不可达路径可减少生成代码中的冗余条件判断,提升代码执行效率,避免无效逻辑占用硬件资源。
示例说明
| 正确示例 |
|---|
执行顺序 2 是无条件转移,条件表达式 [C1] 在执行条件 1 中描述。 ![]() |
| 错误示例 |
|---|
执行顺序 1 是无条件转移,条件表达式 [C1] 在执行条件 2 中描述。 ![]() |
jc_0753: Stateflow 中的条件动作和转换动作规范
规范描述
- 状态机中禁止使用转移动作(transition actions),仅允许通过条件动作(condition actions)实现逻辑执行。
- 同一 [Chart] 内严禁同时使用条件动作与转移动作,需保持动作类型的统一性,不得交叉混用。
核心目的
- 避免执行时序混淆:条件动作在转移判断时触发执行,转移动作在转移完成后执行,禁用转移动作可彻底杜绝时序误解,确保动作执行顺序与设计意图一致。
- 提升模型可读性:统一动作类型后,开发人员无需额外区分两种动作的执行差异,可直观识别逻辑触发时机,降低跨团队协作的理解成本。
- 保障逻辑一致性:标准化动作实现方式,避免因混用动作类型导致的仿真与代码生成异常,确保嵌入式控制器运行时的逻辑确定性。
- 简化维护与评审:单一动作类型使模型逻辑结构更规整,减少评审时对动作时序的核查成本,便于后续调试与修改。
示例说明
| 正确示例 |
|---|
未使用转移动作。 ![]() |
可以使用条件动作或转移动作之一。 ![]() |
| 错误示例 |
|---|
使用了转移动作。 ![]() |
同时包含了条件动作和转移动作。 ![]() |
jc_0711: Stateflow 中的除法运算规范
规范描述
- 禁止在 Stateflow 图块([Chart])内部执行除法运算,除法逻辑需在 Stateflow 外部(如 Simulink 模块)实现。
- 若因业务需求必须在 Stateflow 内部执行除法运算,必须添加 "防除零" 处理逻辑,确保除数不为零。
核心目的
- 避免运算异常风险:除法运算中除数为零会导致仿真报错或生成代码执行异常(如结果为无穷大、NaN),规范可从源头规避此类风险。
- 提升模型可维护性:将除法运算剥离至 Simulink 外部,使 Stateflow 专注于状态逻辑与流程控制,职责边界清晰,降低跨模块维护难度。
- 保障代码生成稳定性:Stateflow 内部除法的语法解析与代码生成逻辑相对复杂,外部实现可减少语法转换偏差,确保生成代码的可靠性。
示例说明
| 正确示例 |
|---|
除法是在 Stateflow Chart 之外进行的。 ![]() |
定义了防止除以零的过程。 ![]() |
| 错误示例 |
|---|
除法运算发生在 Stateflow Chart 内部。 ![]() |
过程不能防止除以零的发生。 ![]() |
db_0127: Stateflow 块中 MATLAB 命令使用限制规范
规范描述
- 禁止在 Stateflow 块中直接使用 MATLAB 命令(如sin()、cos()、sqrt()等原生 MATLAB 函数)。
- 若因业务需求必须使用 MATLAB 命令,需通过[MATLAB Function]块间接调用,禁止在 Stateflow 的状态动作、转移条件等逻辑中直接嵌入 MATLAB 命令。
核心目的
- 保障代码生成兼容性:并非所有 MATLAB 命令都支持嵌入式代码生成,直接使用可能导致代码生成失败或生成的代码无法在目标硬件上运行,规范可规避此类风险。
- 提升模型可读性与一致性:通过MATLAB Function块集中管理 MATLAB 相关逻辑,使 Stateflow 模型专注于状态流转与流程控制,职责边界清晰,降低跨团队协作理解成本。
- 分离不同语言逻辑:将 MATLAB 命令与 Stateflow 的状态 / 流程逻辑分离,避免 C 语言动作模式(jc_0790 规范要求)与 MATLAB 语法混合导致的解析歧义。
示例说明
| 正确示例 |
|---|
除法是在 Stateflow Chart 之外进行的。 ![]() |
使用了 MATLAB Function 模块来访问 MATLAB 命令。 ![]() |
| 错误示例 |
|---|
在 Stateflow 模块中使用了 MATLAB 命令。没有使用 MATLAB Function 来访问 MATLAB 命令。 ![]() |
jc_0481: Stateflow 中浮点数严格等价比较使用规范
规范描述
- 禁止对浮点型操作数使用严格相等比较运算符,包括 ==(等于)、!=(不等于)、~=(不等于)。
核心目的
- 规避精度误差风险:浮点数在计算机中以二进制近似存储(如 0.1 无法精确表示),严格相等比较可能因微小精度偏差(如 0.1+0.2≠0.3)导致逻辑判断错误,规范可从源头避免此类问题。
- 保障逻辑确定性:通过范围比较(如 "差值小于极小值 eps")统一浮点数相等判断标准,确保仿真与代码生成时的逻辑一致性,符合嵌入式控制器对判断准确性的要求。
- 提升模型可靠性:避免因浮点数精度特性引发的非预期行为(如状态切换失败、控制逻辑误触发),确保嵌入式系统运行稳定。
示例说明
| 正确示例 |
|---|
浮点操作数中没有使用相等性比较运算符。 ![]() |
| 错误示例 |
|---|
浮点操作数中使用了相等性比较运算符 ==。 ![]() |
na_0001: Stateflow 运算符标准使用规范
规范描述
- 当 [Chart] 参数 {Action Language} 设为 "C" 时,运算符 &"|""^""~" 仅允许用于位运算,禁止用于逻辑运算。
- 当 [Chart] 参数 {Action Language} 设为 "C" 时,需统一使用一种不等式运算符(三选一):"~=" "!=" "<>",避免混用。
- 当 [Chart] 参数 {Action Language} 设为 "C" 时,逻辑非运算必须使用运算符 !,禁止使用其他替代符号。
核心目的
- 避免语法歧义:C 语言中 & 与 &&、| 与 || 分别对应位运算与逻辑运算,明确运算符用途可杜绝因混用导致的逻辑执行错误(如位运算结果误用于条件判断)。
- 提升模型一致性:统一不等式运算符与逻辑非运算符的使用方式,降低跨团队协作时的理解成本,避免因运算符差异导致的代码生成异常。
- 保障代码生成准确性:运算符使用符合 C 语言语法规范,可确保生成的嵌入式代码与 Stateflow 建模逻辑一致,避免语法转换过程中的语义偏差。
示例说明
| 正确示例 |
|---|
运算符(&、|、^、~)用于位运算。 ![]() |
| 错误示例 |
|---|
运算符(&、|、^、~)没有用于位运算。 ![]() |
jc_0655: Stateflow 中禁止逻辑值比较规范
规范描述
- 禁止将逻辑常量(如true/false、ON/OFF等)与逻辑信号进行显式比较。
核心目的
- 提升模型可读性:直接使用逻辑信号作为条件(如[!flg1])比显式比较(如[flg1==false])更简洁直观,减少冗余语法对逻辑的干扰,降低跨团队协作的理解成本。
- 避免逻辑表达冗余:逻辑信号的本质是 "真 / 假" 二值状态,显式与常量比较未增加额外信息,反而导致模型冗余,规范可精简逻辑表达。
- 保障逻辑一致性:统一逻辑判断的表达方式,避免因不同开发人员使用 "==true""==1""==ON" 等不同比较形式导致的风格混乱。
示例说明
| 正确示例 |
|---|
逻辑常量之间没有相互比较。 ![]() |
| 错误示例 |
|---|
逻辑常量之间存在相互比较。 ![]() |
jc_0451: 无符号整数上单目减使用规范
规范描述
- 禁止对无符号整数类型(如uint8"uint16" 等)使用一元负号(-)进行运算。
核心目的
- 提升模型可读性:直接使用逻辑信号作为条件(如[!flg1])比显式比较(如[flg1==false])更简洁直观,减少冗余语法对逻辑的干扰,降低跨团队协作的理解成本。
- 避免逻辑表达冗余:逻辑信号的本质是 "真 / 假" 二值状态,显式与常量比较未增加额外信息,反而导致模型冗余,规范可精简逻辑表达。
- 保障逻辑一致性:统一逻辑判断的表达方式,避免因不同开发人员使用 "==true""==1""==ON" 等不同比较形式导致的风格混乱。
示例说明
| 正确示例 |
|---|
未对无符号整数使用一元减法。 ![]() |
| 错误示例 |
|---|
对无符号整数使用了一元减法。 ![]() |
jc_0802: Stateflow 中禁止隐式类型转换规范
规范描述
- Stateflow 中禁止隐式类型转换,不同数据类型的变量在进行计算、比较、赋值或函数调用前,必须通过显式类型转换(如int16(var))统一类型。
核心目的
- 避免非预期结果:隐式类型转换可能导致数值溢出、精度丢失(如浮点转整数截断)、符号错误(如无符号与有符号混用)等问题,禁止隐式转换可从源头规避此类风险。
- 保障逻辑确定性:显式类型转换使数据类型转换过程透明化,确保仿真与代码生成时的逻辑一致性,符合嵌入式控制器对数值计算准确性的要求。
- 提升模型可读性与可维护性:明确的类型转换逻辑让开发人员直观知晓数据类型变化,避免因隐式转换导致的逻辑误解,降低跨团队协作的理解成本。
示例说明
| 正确示例 |
|---|
变量使用相同的数据类型进行计算。 ![]() |
| 错误示例 |
|---|
变量使用不同的数据类型进行计算。 ![]() |
jc_0803: 向库函数传递值规范
规范描述
- abs 库函数:禁止传入有符号整数的最小值;或直接禁止使用 abs 库函数。
- sqrt 库函数:禁止传入负数;或直接禁止使用 sqrt 库函数。
- log/log10 库函数:禁止传入负数;或直接禁止使用 log/log10 库函数。
- fmod 库函数:禁止第二个参数传入 0;或直接禁止使用 fmod 库函数。
核心目的
- 避免非预期行为:库函数对无效输入的处理依赖于执行环境(如 sqrt(-1) 可能返回 NaN 或报错),禁止无效输入可杜绝因环境差异导致的仿真或代码生成异常。
- 保障逻辑稳定性:规避无效输入引发的数值异常(如无穷大、非数 NaN、溢出等),确保嵌入式控制器运行时的逻辑确定性,避免因库函数调用错误导致的系统故障。
- 简化验证与调试:标准化库函数的传值规则,减少因无效输入导致的调试成本,使模型的可验证性更强,符合嵌入式工程化建模对安全性的要求。
- 统一调用规范:明确库函数的合法输入范围或禁用场景,避免开发人员因不熟悉库函数特性导致的误用,提升跨团队协作效率。
示例说明
| 正确示例 |
|---|
使用 abs 库函数时,未提供有符号整数类型的最小值。 ![]() |
| 错误示例 |
|---|
使用 abs 库函数时,提供了有符号整数类型的最小值。 ![]() |
其他Stateflow规范
Stateflow模块 / 数据 / 事件
Stateflow模块 / 数据 / 事件规范详细解读见 MATLAB MAB 5.0建模规范-Stateflow规范 第1部分(详细)
Stateflow图
Stateflow图规范详细解读见 MATLAB MAB 5.0建模规范-Stateflow规范 第2部分(详细)
标签描述
标签描述规范详细解读见 MATLAB MAB 5.0建模规范-Stateflow规范 第4部分(详细)
其他
其他规范详细解读见 MATLAB MAB 5.0建模规范-Stateflow规范 第5部分(详细)
声明
此文章基于Mathworks官方MAB 5.0规范进行解读,部分图形会有引用,而非另起炉灶撰写。
感谢阅读,如有错误恳请指正,如对您有帮助,动手点个赞吧^ - ^















































