MATLAB MAB 5.0建模规范-Stateflow规范 第1部分(详细)

MAB(Mathworks Advisory Board,Mathworks咨询委员会)针对MATLAB、Simulink、Stateflow规定了建模重要基本规则,这些建模指南的总体目的是让模型的建模者和使用者能够形成简单、统一的理解,本文章主要针对2020年3月发布的5.0版本进行逐条解读。

众所周知,编码规范可以在命名、缩进、注释、格式上统一代码风格,别人一看就懂,降低了沟通成本,并且规范的代码结构也使得代码的可读性、可维护性极大提升,同样,建模规范也有异曲同工之妙,遵守建模规范是实现以下目标的重要前提主要目标是:

  • 提高图形的可理解性
  • 提高功能分析的可读性
  • 防止连接错误
  • 注释等
  • 提高代码生成效率
  • 确保生成代码的健壮性

目录

  • Stateflow建模规范(共54条)
    • [Stateflow模块 / 数据 / 事件(7 条)](#Stateflow模块 / 数据 / 事件(7 条))
  • 详细解读
    • [db_0122: Stateflow 与 Simulink 接口信号和参数规范](#db_0122: Stateflow 与 Simulink 接口信号和参数规范)
    • [db_0123: Stateflow端口名规范](#db_0123: Stateflow端口名规范)
    • [db_0125: Stateflow 本地数据规范](#db_0125: Stateflow 本地数据规范)
    • [db_0126: Stateflow 事件定义规范](#db_0126: Stateflow 事件定义规范)
    • [jc_0701: 首索引可用数值规范](#jc_0701: 首索引可用数值规范)
    • [jc_0712: 默认转换路径执行时序规范](#jc_0712: 默认转换路径执行时序规范)
    • [jc_0722: 并行状态中本地数据定义规范](#jc_0722: 并行状态中本地数据定义规范)
  • 其他Stateflow规范
  • 声明

MAB 5.0共151条规范,分为命名规范、Simulink建模规范、Stateflow建模规范、MATLAB规范四类。

Stateflow规范共54条,分以下5部分进行解读

  • 第1部分:Stateflow模块 / 数据 / 事件
  • 第2部分:Stateflow图
  • 第3部分:条件转移 / 动作
  • 第4部分:标签描述
  • 第5部分:其他

本文章解读第1部分 Stateflow模块 / 数据 / 事件

MAB 5.0最全规范见 MATLAB MAB 5.0建模规范解读(最全)

Stateflow建模规范(共54条)

Stateflow模块 / 数据 / 事件(7 条)

序号 规范 ID 规范名称 核心要求简述
1 db_0122 Stateflow and Simulink interface signals and parameters Stateflow 与 Simulink 接口信号和参数规范 Chart 启用 "与 Simulink I/O 强类型匹配"(动作语言为 C 时)
2 db_0123 Stateflow port names Stateflow端口名规范 Stateflow 输入 / 输出端口名与对应信号名一致(复用块除外)
3 db_0125 Stateflow local data Stateflow 本地数据规范 状态机级不定义 Local/Constant/Parameter 类型本地数据;父子关系块中本地数据名不重复
4 db_0126 Defining Stateflow events Stateflow 事件定义规范 Stateflow 事件按最小作用域定义
5 jc_0701 Usable number for first index 首索引可用数值规范 动作语言为 C 时,Stateflow 数据首索引统一设为 0 或 1
6 jc_0712 Execution timing for default transition path 默认转换路径执行时序规范 Chart 不启用 "初始化时执行(进入)图表"
7 jc_0722 Local data definition in parallel states 并行状态中本地数据定义规范 并行状态中,仅在一个状态中完成的局部变量需在该状态中定义

详细解读

规范描述

  1. Chart(Stateflow 图块)的参数 {Use Strong Data Typing with Simulink I/O}(启用与 Simulink I/O 的强数据类型)必须勾选启用。(仅当{Action Languages}设置为C时)

核心目的

  • 避免隐式类型转换风险:禁用强数据类型时,Simulink 信号默认以 double 类型与 Stateflow 交互,易因类型不匹配导致隐含转换,引发精度丢失或数值异常;强类型配置可强制显式匹配,杜绝此类风险。
  • 提升模型可读性与可维护性:明确的接口数据类型定义,让开发人员直观知晓 Stateflow 与 Simulink 的信号交互类型,无需额外追溯类型适配逻辑,降低跨工具协作理解成本。
  • 保障代码生成一致性:强数据类型配置确保生成代码中接口数据类型与模型设计完全一致,避免因隐式转换导致的代码逻辑偏差,符合嵌入式控制器对类型确定性的要求。
  • 简化错误排查:类型不匹配时会直接触发模型诊断错误,而非在仿真或运行阶段隐性暴露问题,便于早期定位接口配置失误。

示例说明

正确示例
当{Action Languages}设置为C时,Chart(Stateflow 图块)的参数 {Use Strong Data Typing with Simulink I/O}勾选。
错误示例
当{Action Languages}设置为C时,Chart(Stateflow 图块)的参数 {Use Strong Data Typing with Simulink I/O}未勾选。

db_0123: Stateflow端口名规范

规范描述

  1. Stateflow 图块的输入 / 输出端口名称,必须与对应连接的 Simulink 信号名称保持一致。
    例外:可复用的 Stateflow 模块(如库链接的 Stateflow 块),允许端口名称与信号线名称不同。

核心目的

  • 避免信号连接混淆:统一端口与信号线名称,让开发人员直观关联 Stateflow 的输入输出来源与去向,防止跨工具(Simulink 与 Stateflow)协作时的连接错误。
  • 提升模型可读性与维护性:标准化的命名对应关系,减少信号追溯成本,无需额外查阅关联逻辑即可明确信号流向,降低跨团队协作理解难度。
  • 保障代码生成可靠性:避免因命名不一致导致生成代码中信号标识混乱,确保 Stateflow 逻辑与 Simulink 信号在代码层面的映射准确性。

示例说明

正确示例
Stateflow 图块的输入 / 输出端口名称与对应连接的 Simulink 信号名称一致。
错误示例
Stateflow 图块的输入 / 输出端口名称与对应连接的 Simulink 信号名称不一致。

db_0125: Stateflow 本地数据规范

规范描述

  1. 禁止在 Stateflow 的 "状态机级(machine level)" 定义以下类型的局部数据:
    • "Local"(本地)类型数据;
    • "Constant"(常量)类型数据;
    • "Parameter"(参数)类型数据。
  2. 存在父子关系的 Stateflow 块中,局部数据名称不得重复。

核心目的

  • 避免数据共享风险:禁止机器级定义局部数据,防止数据被模型中所有块共享,确保局部数据仅服务于特定层级的逻辑,避免非预期的修改或干扰。
  • 提升逻辑清晰度:明确局部数据的作用域边界,让开发人员快速定位数据的适用范围,降低跨层级协作时的理解成本。
  • 防止命名冲突:父子级 Stateflow 块中数据名称唯一,避免因名称重复导致的数据引用歧义,确保代码生成时的变量映射准确性。
  • 保障模型可维护性:标准化局部数据的定义规则,简化后期数据修改、删除等维护操作,避免因数据作用域或命名问题引发的连锁错误。

示例说明

正确示例
数据对象未在状态机级上将作用域定义为 Local。
具有父子关系的 Stateflow 模块不包含同名的状态流数据。
错误示例
在状态机级上将作用域设置为 Local 局部数据。
具有父子关系的 Stateflow 模块包含同名的状态流数据。

db_0126: Stateflow 事件定义规范

规范描述

  1. Stateflow 事件(含触发事件、内部事件等)必须在最小适用作用域级别定义,即事件的作用域需严格匹配其使用范围,禁止过度扩大作用域(如全局作用域)。

核心目的

  • 避免事件触发混淆:限制事件作用域可防止跨层级、跨模块的无规则事件触发,明确事件的触发源与响应范围,降低事件流向的追溯难度。
  • 提升模型可读性与可维护性:最小化作用域让开发人员快速定位事件的使用场景,无需全局检索事件关联,清晰区分不同模块的事件逻辑,降低跨团队协作成本。
  • 减少仿真与代码生成风险:避免因全局事件重名导致的触发冲突,或子系统独立执行时引发的事件不匹配问题,保障仿真稳定性与代码生成的准确性。

示例说明

正确示例
Stateflow 事件(含触发事件、内部事件等)在最小适用作用域级别定义。
错误示例
Stateflow 事件(含触发事件、内部事件等)未在最小适用作用域级别定义。

jc_0701: 首索引可用数值规范

规范描述

  1. Chart(Stateflow 图块)的 {Action Language}(动作语言)设置为 "C" 时,Stateflow 数据的 {First index}(首索引)需统一配置为以下两种模式之一,禁止混合使用:
    • 模式 1:首索引统一设为 "0"(0-based 索引);
    • 模式 2:首索引统一设为 "1"(1-based 索引)。

核心目的

  • 避免索引逻辑混淆:统一首索引模式,防止因混合 0/1-based 索引导致的数据访问错误(如数组越界、索引对应关系错乱)。
  • 提升模型可读性与维护性:标准化的索引配置让开发人员快速理解数据的访问规则,无需额外区分不同数据的索引起点,降低跨团队协作成本。
  • 保障代码生成一致性:C 语言默认采用 0-based 索引,统一索引模式可减少生成代码中的索引转换逻辑,避免因索引不匹配导致的代码执行异常。

示例说明

正确示例
当 Stateflow Chart的属性{Action Languages} 设置为 C 时,Stateflow 的数据属性第一个索引均设置为 0。
当 Stateflow Chart的属性{Action Languages} 设置为 C 时,Stateflow 的数据属性第一个索引均设置为1。
错误示例
第一个索引设置为 0、1 和 2 的组合。

jc_0712: 默认转换路径执行时序规范

规范描述

  1. Chart的参数 {Execute (enter) chart at initialization}(初始化时执行 / 进入图块)必须设置为 "未勾选" 状态。

核心目的

  • 避免逻辑误解:统一默认转移的执行时机,防止因部分 Chart 启用初始化执行、部分未启用导致的行为不一致,确保所有 Chart 的默认转移逻辑遵循相同触发规则。
  • 保障信号有效性:模型初始化阶段,Chart 的输入信号可能尚未完成初始化(如传感器信号、外部输入参数),禁止初始化时执行默认转移,可避免使用无效信号触发转移逻辑,防止非预期行为。
  • 提升模型一致性:标准化默认转移的执行机制,降低跨团队协作时对转移时机的理解偏差,简化模型评审与调试流程。

示例说明

正确示例
Chart的参数 {Execute (enter) chart at initialization}(初始化时执行 / 进入图块)设置为 "未勾选" 状态。
错误示例
Chart的参数 {Execute (enter) chart at initialization}(初始化时执行 / 进入图块)设置为 "勾选" 状态。

jc_0722: 并行状态中本地数据定义规范

规范描述

  1. 在并行状态(Parallel States)中,仅在单个状态内完成逻辑运算的局部变量,必须在该状态内部定义,禁止在父状态或更高层级定义后跨并行状态共享。

核心目的

  • 避免数据竞争风险:并行状态为同步执行逻辑,跨状态共享局部数据可能导致多个并行状态同时读写数据,引发数值冲突或非预期覆盖。
  • 提升逻辑清晰度:数据定义在使用它的并行状态内部,让开发人员直观知晓数据的专属场景,无需跨状态追溯数据流向,降低理解成本。
  • 保障模型可维护性:明确的数据作用域边界,便于后期修改单个并行状态的逻辑时,不影响其他并行状态的运行,减少连锁错误。

示例说明

正确示例
局部变量已在其所在的并行状态中定义。
错误示例
局部变量未在其所在的并行状态中定义。

其他Stateflow规范

Stateflow图

Stateflow图规范详细解读见 MATLAB MAB 5.0建模规范-Stateflow规范 第2部分(详细)

条件转移 / 动作

条件转移 / 动作规范详细解读见 MATLAB MAB 5.0建模规范-Stateflow规范 第3部分(详细)

标签描述

标签描述规范详细解读见 MATLAB MAB 5.0建模规范-Stateflow规范 第4部分(详细)

其他

其他规范详细解读见 MATLAB MAB 5.0建模规范-Stateflow规范 第5部分(详细)

声明

此文章基于Mathworks官方MAB 5.0规范进行解读,部分图形会有引用,而非另起炉灶撰写。


感谢阅读,如有错误恳请指正,如对您有帮助,动手点个赞吧^ - ^

相关推荐
fengfuyao9851 天前
基于MATLAB的HHT变换完整实现(含EMD分解与三维时频谱生成)
开发语言·算法·matlab
Deep-w1 天前
【MATLAB】基于 MATLAB 的直流电动机双闭环调速系统建模与仿真
开发语言·算法·matlab
T.i.s2 天前
论文复现8
matlab·fmcw
海神之光2 天前
【语音识别】基于matlab语音MFCC特征提取CNN深度学习语音识别【含Matlab源码 14470期】
matlab
Evand J3 天前
【自适应滤波】基于新息协方差匹配的自适应CKF目标跟踪 MATLAB 实战——在目标跟踪、雷达定位、组合导航和传感器融合等问题
人工智能·matlab·目标跟踪
三行数学3 天前
Matlab之父克利夫·莫勒尔逝世
开发语言·matlab
AI Dog3 天前
MathHub数学建模交流社区
数学建模·matlab
机器学习之心3 天前
基于投影寻踪动态聚类的多指标综合评价方法(PPDC),实验文档+MATLAB代码
matlab·数据挖掘·聚类
ji198594434 天前
局部线性嵌入(LLE)算法 MATLAB 实现
算法·机器学习·matlab
Evand J4 天前
【代码介绍】自适应R的AEKF(自适应扩展卡尔曼滤波)和经典EKF比较,MATLAB例程|三维非线性系统
开发语言·matlab·ekf·自适应·自适应滤波