Matlab simulink建模与仿真 第十八章(Stateflow状态机)

news2025/1/10 3:15:03

参考视频:Simulink/stateflow的入门培训_哔哩哔哩_bilibili

一、概述

        Stateflow是集成于Simulink中的图形化设计与开发工具,主要用于针对控制系统中的复杂控制逻辑进行建模与仿真,或者说,Stateflow适用于针对事件响应系统进行建模与仿真。

        下图所示的是TCP状态机,系统每时每刻都会处于一个状态,当满足某些条件后,系统下一时刻的状态可能就会变换并做出指定动作,Stateflow正是用于实现这种复杂的控制逻辑,如果不使用Stateflow,而仅仅依靠Simulink中的其它模块对状态机进行搭建,这样不仅会使建模难度大大提升,还可能会发生系统在同一时刻处于两种状态的情况。

二、基本的Stateflow创建和模块信号交互

1、Stateflow的创建

(1)方法一:在命令行窗口中输入“sfnew”,MATLAB会新建一个模型文件并在其中添加一个状态机。

(2)方法二:直接打开模块库,找到Chart模块并将其拖拽到模型文件中。

(3)方法三:如下图所示,在MATLAB的工具栏中可以直接新建一个模型文件并在其中添加一个状态机。(较低版本的MATLAB可能不支持该方式)

2、模块信号交互

(1)双击Chart模块,即可进入Stateflow的编辑界面。

(2)和其它子系统模块一样,Chart模块可以随意添加输入端口和输出端口,在未旋转的前提下,添加输入端口时将信号线往Chart模块左侧引进,添加输出端口时将信号线往Chart模块右侧引进即可。

(3)使用Chart模块需要对其进行变量管理,按下Ctrl+H可打开模型浏览器,在这里可以更改输入变量、输出变量及内部变量的名称、数据类型等属性。

(4)Chart模块中只可对输出变量和内部变量进行更改,对输入变量只有读的权限。

三、Stateflow中的基础功能块

1、State状态块与Default transition缺省转移

(1)每个状态在Chart模块中对应一个状态块,状态块的添加方式如下图所示,其它模块的添加方式亦是如此。

(2)在添加第一个状态块时会自动为该块添加缺省转移,缺省转移可认为是状态机的入口,决定状态机的初始状态是哪一个状态块,它必须有且每个状态机中只能有一个。

(3)状态块的内容编辑可分为以下几部分:(其中关键词并不是必须都要有,且下面没有列出全部关键词,仅列出了三个常用的)

①状态名称:每个状态的名称置于状态块编辑区首行,其命名规则和一般变量名一样。

②entry关键词:在编辑区中键入“entry:”或者“en:”,在下一个关键词出现之前,以下的代码段(用MATLAB编写)都是该状态被激活时(或者说进入该状态)执行的动作,且只是在进入状态之初执行一次,并不是重复执行。

③exit关键词:在编辑区中键入“exit:”或者“ex:”,在下一个关键词出现之前,以下的代码段(用MATLAB编写)都是该状态退出时执行的动作。

④during关键词:在编辑区中键入“during:”或者“du:”,在下一个关键词出现之前,以下的代码段(用MATLAB编写)都是该状态下重复执行的动作,重复频率取决于仿真步长(在本章中如无特殊说明,所有举例的仿真步长均为0.2s)。

2、transition转移

(1)状态块与状态块之间需要依靠转移线连接,转移线代表状态的转换路径,其编辑区中提供了一对方括号和一对花括号。

①方括号内需要填写转移条件,在有触发事件的前提下也可以不填写,当状态机处于转移线首端的状态,且转移条件为真时(如果有触发事件,事件需要已发生),状态会根据该条转移线进行状态的切换,也就是退出上一个状态并进入下一个状态。(缺省转移没有转移条件)

②花括号内填写的是转移发生时执行的动作(也称条件动作),条件动作可以不填写。

③括号之外可填写触发事件,在有转移条件的前提下也可以不填写,当状态机处于转移线首端的状态,且事件发生时(如果有转移条件,转移条件需要为真),状态会根据该条转移线进行状态的切换。(缺省转移没有触发事件)

④除了缺省转移外,如果转移线不填写转移条件和触发事件,仿真时也能运行,但因为转移没有任何限制,转移线首端的状态仅会持续一个仿真步长就会退出。

(2)点击状态块的边界(除了四个角以外),按住鼠标拖动,即可从状态块引出一条转移线,拖住转移线的末端即可将其连接到其它状态块上(转移线两端可以连在同一个状态块上)。

(3)比较常用的触发事件有时间触发事件after,它有两个参数,第一个是时间参数,第二个是时间单位参数,当进入转移线首端的状态时,after开始计时,当达到计时时间后事件发生。

(4)当一个状态块引出两条转移线时,转移线上会有编号,Chart模块会优先判断编号较小的转移线是否满足转移条件(以下提到的“满足转移条件”均指的是转移条件为真且事件触发)。

(5)当转移线两端连接同一个状态块时,有两种情况:

①转移线在状态块外部:如果转移线生效,当前状态会先退出再重新进入,也就是要执行关键词entry下的代码段。

②转移线在状态块内部:内部的转移线优先判断,如果转移线生效,当前状态不会退出,不会执行关键词entry下的代码段。

3、Junction节点

(1)在Stateflow中,流程图是一种比较特殊的应用,流程图中不包含任何状态,它仅由连接节点和转移线组成,节点之间的转移线连接操作方法和状态块直接转移线的连接操作一样。

(2)由于流程图中没有任何状态,因此不具备任何记忆元件(状态块是记忆元件)。

(3)流程图从检测其默认转移开始,到检测完每一条有效的通路且到达不具备有效出口的转移线为止,简单来说就是从流程图的入口开始“走流程”,直到走到没有通往其它节点转移线的节点为止,这个过程是在一个仿真步长内完成的,这是和状态图最大的区别。

(4)使用节点和转移线搭建逻辑结构:

①选择结构:

[1]单分支if语句:

if <条件表达式>

   <满足条件执行的语句组>

end

[2]双分支if语句:

if <条件表达式>

   <满足条件执行的语句组>

else

   <不满足条件执行的语句组>

end

[3]多分支if语句:(switch语句实际上也是多分支选择结构,只是在流程图中表示起来可能稍微复杂些,这里不进行演示)

if <条件表达式1>

   <满足条件1执行的语句组>

elseif <条件表达式2>

   <不满足条件1而满足条件2执行的语句组>

 ... ...

elseif <条件表达式m>

   <仅满足条件m执行的语句组>

else

   <不满足所有条件执行的语句组>

end

②循环结构:

[1]for循环:

for <循环变量> = <取值列表>    %取值列表通常是一个向量

    <循环体>                 %不要在循环体内改变循环变量的值

end                   %循环语句可以嵌套使用

[2]while循环:

while <条件表达式>

    <循环体>

end                   %循环语句可以嵌套使用

[3]do...while循环:(MATLAB中没有直接提供do...while循环结构的语句)

4、Annotation和Image

(1)Annotation是文字说明模块,相当于程序文字版注释,不会影响状态机。

(2)Image是图片说明模块,相当于程序图片版注释,也不会影响状态机。

四、层次化建模

1、动作执行的顺序

        在系统状态转换时,可能涉及到多个动作,它们是有先后执行顺序的,首先状态机执行转移线上的条件动作,然后执行旧状态退出时需执行的动作,接着执行转移线上的转移动作(转移动作的代码段也用花括号包含,它位于条件动作之后,二者用“/”分隔,不过转移动作使用较少),最后执行新状态进入时需执行的动作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2143280.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java项目实战II基于Java+Spring Boot+MySQL的校园社团信息管理系统(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、论文参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 在当今高校…

DSC+DW实时+异步搭建部署

DSCDW实时异步搭建部署 实例及IP规划 配置 DMDSC实时备机配置 dmarch.ini--DSC节点1--DSC节点2 配置 dm.ini 配置实时备库&#xff08;实时备库上执行&#xff09;--初始化备库在DCS1执行&#xff0c;将备份文件上传到实时备机在实时备库执行还原 配置 dm.ini1.DSC节点1配置 dm…

PyCharm 安装教程

传送门 PyCharm 是一款由 JetBrains 开发的强大的 Python 集成开发环境&#xff08;IDE&#xff09;。它支持多种功能&#xff0c;包括调试、代码补全、智能代码分析、版本控制集成等&#xff0c;特别适合开发 Python 项目。接下来&#xff0c;我们将详细介绍如何在不同操作系…

# 深度学习笔记(6)Hugginface -Transformer

深度学习笔记&#xff08;6&#xff09;Hugginface -Transformer 文章目录 深度学习笔记&#xff08;6&#xff09;Hugginface -Transformer一、工具包二、 Tokenizer三、 模型加载四、 输出五&#xff0c;padding的作用5.1 attention_mask5.2 不同padding方法 六&#xff0c;数…

C++——哈希的应用(位图、布隆)

目录 前言 一、位图、布隆是什么&#xff1f; 二、位图 1.面试题 2.位运算 3 位图的应用 三、布隆过滤器 1、代码实现 2、 布隆过滤器的查找 3、 布隆过滤器删除 4、 布隆过滤器优点 5、 布隆过滤器缺陷 总结 前言 我们学习了哈希算法&#xff0c;我们知道存储数据可以构建一…

如何在自动化测试中应用装饰器、多线程优化自动化架构?

1、装饰器概念 装饰器是Python中用于修改函数或类的语法结构的工具。它以函数作为输入参数&#xff0c;并返回一个函数作为一个输出函数&#xff0c;在不改变原有函数的代码情况下&#xff0c;给函数增加功能或改变函数行为。 装饰器的使用方式是在函数定义的上方使用 decorato…

大数据新视界 --大数据大厂之数据驱动决策:如何利用大数据提升企业竞争力

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

3.信号量与互斥量

队列:用来传递数据 如果不想传递数据,只是"通知"呢? 这个时候,我们就可以使用"信号量","信号量"的本质:item_size等于 0 的队列 信号量里面有什么呢? 1.一个计数值 2.一个"队伍",就是一个链表:用来记录等待的对应信号量的任务 …

小阿轩yx-Prometheus监控系统部署

小阿轩yx-Prometheus监控系统部署 前言 Prometheus 由 Go 语言编写而成&#xff0c;采用 Pull 方式获取监控信息&#xff0c;并提供了多维度的数据模型和灵活的査询接口。Prometheus 不仅可以通过静态文件配置监控对象&#xff0c;还文持自动发现机制&#xff0c;能通过 Kube…

关于std::swap原理

swap 操作交换两个相同类型容器的内容。调用swap之后&#xff0c;两个容器中的元素将会 交换&#xff1a; vector<striong> svec1(10); //10个元素的vector vector<string> svec2(24); //24个元素的vector swap(svec1,svec2); 调…

红帽7—Mysql的源码编译

到官网选择源码进行安装 使用wget命令下载链接 下载安装后对文件包进行解压 [rootnginx ~]# tar zxf mysql-boost-5.7.44.tar.gz 安装cmake编译工具 [rootnginx ~]# yum install cmake 使用源码编译安装mysql [rootmysql-node10 mysql-5.7.44]# cmake \ -DCMAKE_INSTALL_PRE…

8.Lab Sevent —— Multithreading

首先切换到thread分支 git checkout thread make clean Uthread&#xff1a;switch between threads 为用户级线程系统设计上下文切换机制 xv6中已经放了两个文件&#xff1a; user/uthread.c和user/uthread_switch.S 以及一个规则&#xff1a;运行在Makefile中以构建uthre…

Linux:用户账号管理和组账号管理

用户账号管理 账号控制总述 用户账户 作用: 1.可以登陆操作系统 2.不同的用户具备不同的权限 唯一标识&#xff1a;UID&#xff08;编号从0开始的编号&#xff0c;默认最大60000&#xff09;zhangsan(UID 1200) 管理员root的UID&#xff1a;永远为0 系统用户&#xff08;为程…

django学习入门系列之第十点《A 案例: 员工管理系统9》

文章目录 12 管理员操作12.1 添加的界面集成12.2更改样式12.3验证密码 往期回顾 12 管理员操作 12.1 添加的界面集成 因为添加界面基本不用怎么改&#xff0c;所以可以直接集成进去 需要再次改动的地方 这样的话相当于直接在视图界面上直接传就行了&#xff0c;来提高复用率…

二十种编程语言庆祝中秋节

二十种编程语言庆祝中秋节 文章目录 二十种编程语言庆祝中秋节中秋快乐&#xff01;家人们 &#x1f973;一 Python二 C三 C四 Java五 C#六 Perl七 Go八 Asp九 PHP十 JavaScript十一 JavaScript HTML十二 Visual Basic十三 早期 VB十四 Visual C十五 Delphi十六 Shell十七 Cobo…

鸿蒙开发之ArkTS 界面篇 一

建好一个工程后&#xff0c;右侧可以预览&#xff0c;看到效果&#xff0c;效率十分可以&#xff0c;如图: State message: string 鸿蒙开发入门篇; 这个字符串改成什么&#xff0c;右侧就显示什么 Entry是类装饰器&#xff0c;可以简单的理解为程序入口的必须的装饰器&…

25届校招IQCAT思维能力自适应测验智鼎测评指南:题库获取、刷题策略与真题解析!

IQCAT思维能力自适应测验考试内容介绍 IOCAT思维能力自适应测验基于二因素智力理论&#xff0c;通过考察作答者的一般认知能力&#xff0c;预测其学习新知识、新技能以及理解、解决问题时的工作表现。IQCAT使用自适应测验技术&#xff0c;根据作答者的作答情况&#xff0c;从题…

shell脚本语法

shell脚本的变量 系统变量 系统变量是操作系统用来存储配置信息的变量&#xff0c;它们可以控制操作系统的行为和程序的运行环境。系统变量的种类和内容取决于操作系统的类型和版本。以下是一些常见的系统变量类别和它们可能包含的内容&#xff1a; 环境变量&#xff1a;这些…

OpenCV calcHist()函数及其用法详解

OpenCV calcHist()函数原型共有三个&#xff0c;如下&#xff1a; 该函数计算一个或多个数组的直方图。用于递增直方图箱的元组的元素取自同一位置的相应输入数组。 函数参数&#xff1a; images 源&#xff08;图像&#xff09;数组。它们都应具有相同的深度、CV_8U、CV_16U…