一、背景

Stateflow是一种图形化的设计开发工具,是有限状态机的图形实现工具,有人称之为状态流。主要用于simulink中控制和检测逻辑关系的。用户可以在进行simulink仿真时,使用stateflow来实现各个状态的切换,以解决复杂的逻辑问题。利用状态机原理、流图概念和状态转化图,stateflow能够对复杂系统的行为进行清晰、简洁的描述。

二、打开stateflow模型

在使用stateflow时,首先需要新建一个stateflow模型,常见的打开stateflow的方式主要有以下两类:

(1)命令行方式,可在matalab命令行中输入”sf”、”sflib”、”sfnew -matlab”、”sfnew -c”来打开stateflow;如下图所示:

(2)在”simulink library”中选择”stateflow”,如下图所示:

三、Stateflow基本操作

  1. 模型代码生成

使用模型的目的是将模型验证成功后转换为C代码,而后集成到硬件平台进行运行,所以需要了解如何将代码生成C代码以及如何对生成的C代码进行优化。单击stateflow界面中的“Model Configuration Parameters”选项进行相应的设置。

  1. 模型解算器solver设置

如下图所示为模型解算器solver设置界面,其中:

  1. Simulation time:仿真开始时间和结束时间,单位为s (对仿真有影响,代码生成无影响作用);
  2. Solver selection : 求解方法,stateflow都是定步长计算,并且是离散求解,因此Type设置为Fixed-step, Solver设置为Discrete;
  3. Solver details :定步长设置就是模型代码运行周期,单位为s如下图所示0.001,则表示模型代码的运行周期为1ms,这也要求硬件底层驱动需要提供一个准确的时基。

  1. 生成目标文件设置

如下图所示为”Code Generation”设置界面,

  1. Target selection:生成系统目标文件设置,系统默认选择grt.tlc作为系统目标文件,生成的代码可以用作快速原型,一般用来做si测试,主要考察生成软件的架构以及功能的正确性。需要修改为如下图所示的ert.tlc作为系统目标文件,以生成可以用与嵌入式系统的的更高效的代码。
  2. Build process:这里需要勾选仅生成code,防止对外部引用的信号报错或者没有编译环境报错。

  1. 硬件平台设置

模型生成的代码最终是要集成到指定的硬件平台去运行,因此需要根据实际项目平台,对硬件平台、型号、运算数据的长度等进行设置。如下图所示,在”Device vendor”及”Device type”中选择相应的硬件平台。

  1. Custom Code

主要用于添加用户自定义的后者编译模型时需要的源文件、头文件、头文件夹或者库文件等。

  1. 模型绘制

参数设置完成后,便可以根据实际逻辑对模型进行设计。如下图所示为stateflow的chart界面,可以选择在其中添加状态、节点、box、simulink组件、图形组件、matlab组件等以完成相应逻辑模型的设计。详细细节将在下一部分进行描述。

  1. 模型仿真

在模型绘制完成后,需要对模型进行单元仿真测试,以验证设设计的模型能否满足实际的逻辑要求。比较常用的用于单元测试的工具为”test harness”。

下面将对如何使用test harness对state flow模型进行单元测试进行简要说明。Test harness由被测试模型、信号输入和信号输出三部分组成,并且经过harness进行调试修改后可以保存到原模型中。如果模型不是很复杂的话,可以直接对一个模型整体创建一个test harness模型。如果模型很复杂的话,也可以对模型中的各个子系统分别创建test harness模型,然后分别测试这些模型,之后使用test manager对这些测试用例进行管理。如下图所示为新建test harness模型选项界面:

上图中,Name:是给出test harness模型的名称。Save test harness extern...:若勾选该选项,则test harness模型将以一个单独的文件进行保存,反之,将保存在原模型中。Souurces and Sinks:可在其中选择输入信号及输出信号的类型,如下图所示为信号类型选择界面:

由上图中可见,输入信号及输出信号的形式很多,输出信号一般保持默认的outport,若想从外部excel中导入信号进行测试,则输入信号选择inport,反之,可选择较为方便使用的test sequence。下面将对如何使用test sequence进行模型的单元测试进行介绍。在创建test harness界面选择完成后,点击OK,将生成如下图所示的一个test harness界面:

在上图中,点击输入部分的表格,将弹出一个输入信号的表格,可以在弹出的表格中填入输入、转移条件及转移目标,然后设置好仿真时间,在输出信号端添加,即可点击运行按钮进行测试,双击,可弹出输出信号曲线。如下图所示为输入信号设置的表格:

上图中第一列为输入信号,第二列为转移条件,第三列为转移目标。以第一行为例,输入信号为RedButtonIN=false,GreenButtonIN=false,转移条件为after(1,sec),转移目标为PressBothButtons,该行意思为设置输入信号RedButtonIN=false,GreenButtonIN=false,在1s之后,输入信号设置为PressBothButtons名称状态下的信号。并且,在调试过程中,可以通过在模型中添加断点的方式查看每个状态转移过程中的输出信号是否满足实际需求。

四、模型绘制

Stateflow提供了一种图形化的语言来帮助我们完成复杂逻辑的开发,包括状态转移图、流程图、状态转移表和真值表。 常用的是stateflow的状态转移图及流程图,下面就其界面内容、状态转移图、流程图三方面进行描述。

  1. 界面内容

如下图所示为stateflow界面,在菜单栏中,可以通过点击”Embedded Coder”来生成嵌入式代码,点击”Simulink test”来做模型的单元测试。在快捷栏中,从下往下依次为zoom(快速放大键)、Fit to view(快速模型适中)、state(图块(状态))、junction(节点)、default transtion(默认转移)、box(图形盒)、simulink function(simulink状态机封装模块)、graphics function(图形函数)、matlab function(matlab脚本函数)、turth table(真值表)、history(历史节点,相当于static,记住离开时的历史状态)、annotion(注释)、image(图片)。

  1. 状态转移图
  1. 状态层次结构

对于多级状态的复杂系统,可以在stateflow图中使用层次结构来表示系统中多个层级的子组件。如下图所示为一个三层级的状态图:

如图所示,在一个状态的边界内绘制另一个状态表示内部状态时外部状态的子状态,外部状态时内部状态的父级。

  1. 状态分解

Stateflow图可以组合互斥(OR)和并行(AND)状态:

互斥(OR)状态表示互斥的工作模式。在同一层级上不能有两个互斥状态同时被激活或执行。以实线矩形表示每个互斥状态,如下图所示:

并行(AND)状态表示独立的工作模式。虽然并行状态会依次执行,但是可以有两个或多个并行状态同时处于激活状态。以虚线矩形表示每个并行状态,其中的数字表示执行顺序,如下图所示为A、B两个并行状态,其中A状态的执行顺序优先于B状态的执行顺序:

  1. 状态标签

状态标签显示在状态的长方形框的左上角,一般为以下格式:

name/

entry:entry actions

during:during actions

exit:exit actions

on event_name:on event_name actions

on message_name:on message_name actions

bind:events

如下图所示为状态标签的构成:

上图中也同时包含了matlab组件的使用方法,simulink组件的使用与之类似。

  1. 状态名称

状态标签开头为状态名称,其后可接 / 字符。在前面的示例中,状态名称是 On 和 Off。有效的状态名称由字母数字字符组成,可以包含下划线字符 (_)。

  1. 状态动作

在名称后面,可以输入用于该状态的动作语句,对于每种动作类型,可以输入多个动作,以回车符、分号或逗号分隔。可以通过增添on event_name 或 on message_name 行,为一个或多个事件或消息指定动作。

下表所示为不同的状态动作类型:

  1. 时序逻辑

在搭建模型时,还可以根据时序逻辑来完成各个不同状态之间的转移、函数的调用以及变量值的更改。如下图所示为较常见的绝对时间时序逻辑运算符:

每个运算符在满足以下条件时都会将相关联的计时器置零:

①包含运算符的状态重新激活

②包含运算符的转移的原状态重新激活

③duration运算符中的bool条件变为false

另外,某些运算符(如after)支持以秒(sec)、毫秒(msec)和微秒(usec)的基于事件的时序逻辑和绝对时间时序逻辑。

  1. 流程图

Stateflow流程图表示组合逻辑,采用图形化结构,用于对决策树和迭代循环等逻辑模式进行建模。流程图的执行从默认转移开始,到终止节点(没有有效出向转移的节点)结束。

在使用流程图进行模型绘制时,建议将流程图封装在图形函数中,以创建可在图中的任何位置调用的模块化可重用逻辑。

创建流程图时,应遵循以下做法来创建高效准确的流程图:

①仅使用一个默认转移

②仅提供一个终止节点

③将所有转移路径汇聚到终止节点

④为终止节点以外的每个节点提供一个无条件出向转移

⑤使用条件动作而不是转移动作来处理更新

使用流程图,可以实现结构化的程序三种基本的程序结构:顺序结构、选择结构和循环结构。

1.选择结构

(1)if结构

(2)If else结构

(3)Switch case结构

2.循环结构

(1)while循环结构

(2)do while循环结构

(3)for循环结构

参考资料

1、

https://blog.csdn.net/qq_44889142/article/details/116985909?spm=1001.2101.3001.6650.4&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-4.pc_relevant_paycolumn_v3&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-4.pc_relevant_paycolumn_v3&utm_relevant_index=4

2、使用Simulink Test进行单元测试 - 知乎

3、Simulink Test笔记(含一些小技巧)一_Eigrl的博客-CSDN博客_simulink test

4、

Use External Excel or MAT-File Data in Test Cases- MATLAB & Simulink- MathWorks 中国

5、手把手教用matlab做无人驾驶(十五)--matlab/simulink stateflow学习教程_caokaifa的博客-CSDN博客_stateflow教程

6、https://ww2.mathworks.cn/help/stateflow/getting-started.html?s_tid=CRUX_lftnav

7、状态分解- MATLAB & Simulink- MathWorks 中国

8、状态- MATLAB & Simulink- MathWorks 中国

9、4. Stateflow - 流程图_QWQ-CSDN博客_stateflow流程图

10、Stateflow 中的流程图- MATLAB & Simulink- MathWorks 中国

11、https://ww2.mathworks.cn/help/stateflow/gs/temporal-logic.html

12、https://zhuanlan.zhihu.com/p/103845223

stateflow基本操作相关推荐

  1. MATLAB_stateflow_1

    目录 一.stateflow简介 二.stateflow基本操作 1.stateflow界面介绍 2,stateflow状态工具 3.stateflow状态动作 4.迁移状态关系设置 5.数据和事件的 ...

  2. 数据结构(03)— 数据处理基本操作(数据的查找、新增、删除、修改)

    我们先来看一个关于查找的例子.查找,就是从复杂的数据结构中,找到满足某个条件的元素.通常可从以下两个方面来对数据进行查找操作:​ 根据元素的位置或索引来查找: 根据元素的数值特征来查找. 针对上述两种 ...

  3. pytorch方法,Tensor及其基本操作_重点

    由于之前的草稿都没了,现在只有重写-. 我好痛苦 本章只是对pytorch的常规操作进行一个总结,大家看过有脑子里有印象就好,知道有这么个东西,需要的时候可以再去详细的看,另外也还是需要在实战中多运用 ...

  4. Gradle安装使用以及基本操作

    转自:https://www.cnblogs.com/linkstar/p/7899191.html Gradle安装使用以及基本操作 阅读目录 简单介绍 安装 使用idea创建一个web的Gradl ...

  5. c++文件读取空格_程序员术与道:术—C语言对文件进行处理,文件处理的基本操作...

    各种编程语言都实现了文件的基本操作,提供了对应的接口,本篇文章先为你介绍C语言对文件进行处理和文件处理的基本操作.主要从以下几个方面进行介绍: 读取文件 写入文件 重命名文件 读取目录 读取目录下的文 ...

  6. 【Pandas库】(3) DataFrame的创建方法及基本操作

    各位同学好,今天给大家介绍一下Pandas库中DataFrame类型数据的创建方法和基本操作. 文章内容如下: (1)使用字典类创建. 字典类有:①数组.列表.元组构成的字典:②Series构造的字典 ...

  7. 【MySQL】缩略语PK NN UQ BIN UN ZF AI G、基本操作语句

    一.缩略语 PK:primary key 主键 NN:not null 非空 UQ:unique 唯一索引 BIN:binary 二进制数据 UN:unsigned 无符号整数(非负数) ZF:zer ...

  8. MySQL中定义fk语句_MySQL基础篇/第3篇:MySQL基本操作语句.md · qwqoo/MySQL-Review - Gitee.com...

    ### 第3篇:MySQL基本操作语句 - MySQL基础操作 #### 排序检索数据 - 之前的数据没有进行排序,其是按照默认在数据表中的数据返回的 - SELECT语句的ORDER BY 子句进行 ...

  9. OpenCV-Java版学习(3.对视频的基本操作)

    前言 上一节我们学习了使用OpenCV对图像进行一些基础操作,现在我们学习对视频进行一些基础的操作. 对视频的基本操作 从相机中读取视频 我们从电脑自带的摄像头捕捉一段视频并在屏幕上显示出来,代码如下 ...

最新文章

  1. 弱类型、强类型、动态类型、静态类型语言的区别是什么?
  2. Hive学习笔记 —— Hive的数据类型
  3. openjdk linux tomcat,linux下配置安装OpenJDK+Tomcat(示例代码)
  4. Eclipse新建Maven项目web.xml is missing and failOnMissingWebXml is set to true错误 pox.xml编译错误
  5. linux下51单片机开发解决方案
  6. .net .toString() 金额数据转换
  7. 【剑指offer - C++/Java】3、从尾到头打印链表
  8. 本地创建分支push到github
  9. 上下文信息 RpcContext
  10. 车辆等红灯时是用N档还是D档呢?
  11. NOIP2018 DAY1T1 铺设道路(水题)
  12. Castle 整合.NET Remoting
  13. persistence java_Java数据持久层 - Persistence Manager Factory
  14. AntTweakBar with OpenGL
  15. 免费python编程自学网站-免费学习Python编程的3个优秀的网站资源
  16. php 0x颜色 转换,rgb和十六进制颜色互转
  17. java book_java_book java 图书管理系统 GUI - 下载 - 搜珍网
  18. 尚硅谷RabbitMQ学习笔记(上)
  19. 梦幻西游手游服务器维护公告,《梦幻西游手游》10月5日维护公告 部分区服合并...
  20. 基于AM5728 DSP+ARM平台的嵌入式车牌识别

热门文章

  1. 英语学习感悟,培养自信心,远离挫败感,人生更精彩
  2. redis,memcached
  3. matlab多元决策问题,matlab 贝叶斯决策对二维二分类问题的实现
  4. Conway(康威)定律理解
  5. 我的Fitbit Force手环使用体验
  6. CSS3——鼠标变小手
  7. APB——(Advanced Peripheral Bus)
  8. hInstance是什么参数
  9. Nginx、图片上传、FastDFS
  10. 模电二:电容、三极管、场效应管介绍