条件动作和转移动作运行有所区别,条件动作在条件满足的时候就运行了,而转移动作需要在整个转移通路有效时才运行。
条件动作和转移动作实际使用时候的区别???????????????????
状态动作
状态动作的执行与状态是否是活动的息息相关,在下列情况时,发生状态动作 ? 初始为非活动状态,事件驱动使其激活—— entry动作
? 初始为活动状态,事件驱动使其进入非活动状态—— exit动作
? 初始为活动状态,事件没有改变其活动的状态——during动作或on动作
状态动作一般作为状态名称标签的一部分,可以紧跟在标签名称后面定义动作的名称,不过,定义动作的时候需要使用关键字来标识动作的作用类型。
使用状态动作,需要按照下列两种格式书写: Name/Keyword:Actions或者 Name
Keyword:Actions
数亿 “/”在第二种格式中可以选择性添加使用 状态动作的关键字:
? entry or en 在事件触发状态进入活动状态时执行 ? exit or ex 在事件触发状态退出活动状态时执行
? during or du 在事件触发发生,状态保持原有的活动状态时执行 ? on event_name 当以event_name命名的事件发生时,状态保持原有的活动状态而执行相应的动作
动作的执行顺序
前文提及,在有事件驱动且条件满足的时候,执行相应的条件动作,条件的两个分支分别被检查确定有效的通路,如果整条通路都有效,系统才执行转移动作。而原状态的退出动作在转移动作执行之前
被执行,接着是组含义动作,然后是目标状态的进入动作。
Stateflow 动作语言
Stateflow动作语言是图表内部进行交互的手段,同样也是同外部环境进行交互的手段,使用动作可以:
? 进行数学运算: ? 对数据对象赋值 ? 操作数据对象 ? 调用函数: ? MATLAB 函数
? 用户自定义的M函数 ? C数学库中的函数 ? 用户自定义的C函数 ? 触发事件
? 触发图表内部事件的执行
? 触发模型中的其他子系统或模块 支持的数学运算
二元运算:? * / %% + - ^ ? > < >= <= == ~= != <> 一元运算: ? ~ ! - 赋值运算: ? = 位运算: ? >> <<
? & | && ||
? ++ --
? += -+ *= /= ? & ^ | ? &= ^= |=
调用MATLAB函数
调用MATLAB 函数,需要在函数的名字前使用
MATLAB命名空间运算符——ml,例如: ? y = ml.abs(x)
? y = ml.max(x1,x2)
在使用ml运算符调用MATLAB函数时需要注意以下几点:
? 使用ml关键字调用的MATLAB函数仅能使用标量或者字符串作为函数的输入参量 ? 调用函数时的圆括号是必须,无论被调用的函数是否具有参量 ? 如果调用的函数具有返回参数,则返回数值的类型必须为double型 ? 如果具有多个返回变量,仅有第一个返回变量被赋值 ? 如果返回的参数不是标量,仅向量中的第一个元素被赋值
使用C语言数学函数
调用C语言数学函数形式上比较简单,例如:: ? y = abs(x)
? y = max(x1,x2)
对于Min和Max运算,仿真目标代码生成器提供了min 和max函数的宏定义: #define min(x1,x2) ((x1) > (x2))? (x2):(x1) #define max(x1,x2) ((x1) > (x2))? (x1):(x2) 此外,还可以使用下表中列举的数学函数:
abs cos labs sin acos cosh ldexp sinh asin exp log sqrt atan fabs log10 tan atan2 floor pow tanh ceil fmod rand 注意:使用上表中列举的数学函数时,不需要提供函数源文件的定义。不过,在使用用户自定义的C语言函数时,必须提供函数原型的定义,以及函数的C语言源文件。
调用函数:
下面的例子调用了MATLAB函数和C语言数学函数,分别计算数据对象的绝对值。这里,调用MATLAB函数时需要使用ml操作符,而调用C语言函数的时候则比较简单。
?????????????????怎么调用自己编的C函数,怎么看库里有什么函数
图表更新方法
图表更新也是可以配置的,更新主要有三种形式:
? Triggered 或Inherited ——状态或者被外部输入的事件触发,或者按照输入信号的采样
频率进行触发
? Sampled—— 按照一个固定的频率触发状态转换 ? Continuous——每个仿真步长触发状态转换 设置更新属性:
1. 执行File菜单下的Chart Properties命令
2. 在弹出的对话框中,设置Update method 字段中的内容 注意: 系统默认的更新方式是Triggered or Inherited.
触发和继承
触发更新依赖于过零信号的输入,如果图表具有事件输入则图表的更新方式必须如此。状态图初始状态为非活动状态,如果需要在模型运行伊始,状态就是活动的,则需要在Chart Properties对话框中选择Execute(enter) Chart At Initialization选项。
当没有驱动事件输入时,图表可以按照输入数据的采样频率更新自己的状态。这时的图表好比具有一个和输入数据对象更新频率一致的驱动事件输入,如果,状态图既没有输入事件也没有输入数据,那么,图表继承而来的更新速率将同系统仿真求解器步长一致。
采样更新
如果使用采样更新方法,则Stateflow状态图类似于系统的离散模块,具有固定的运算频率。采样更新方法按照固定的仿真步长更新自己的状态,这样,就好比状态图有固定频率的驱动事件输入。
注意:采样更新方法在系统仿真开始时触发状态图,如果选择了Execute (enter) Chart At Initialization 选项,则状态图被触发两次。
连续更新
如果使用连续更新方法,则Stateflow图表同连续系统模块类似。连续更新方法以仿真计算的步长触发状态的更新。一个具有连续更新方法的状态图就好像具有一个极小或者极大的周期的驱动事件输入一样。
注意: 连续更新方法在模型首次运行时触发状态图,如果选择了Execute (enter) Chart At Initialization 选项,状态图在首次运行时会触发两次。
Stateflow调试器
在开发一个强壮的系统时,需要具有系统的方法来分析和解决系统开发过程中出现的问题。Stateflow调试器提供在状态图运行过程中,对整个运行过程的控制能力。
运行Stateflow调试器使用Tool菜单下的Debug命令,也可以在Stateflow编辑器的工具条中找到相应的按钮
Stateflow调试器界面
利用调试器,首先需要设置断点来暂停系统的运行,断点全局控制整个Stateflow状态图的运行,断点的属性可以在对象属性对话框中设置。可以在调试器中设置图表的动画行为,如果忽略动画,一般仿真的速度会比较快。当打开动画模式时,仿真的速度会有所降低。
使用文本显示区,可以观察图表运行过程中的所有信息,主要包括: ? Breakpoints – 显示断点
? Browse Data – 显示数据对象
? Active States – 显示当前活动的状态
? Coverage – 显示图表中处理的信息
? Call Stack – 显示运行步骤过程中的时序信息
在调试器进行模型仿真运行的时候,可以直接在调试器对话框的MATLAB命令行
(MATLAB Command)字段中输入MATLAB命令,而不必回到MATLAB命令行窗口中执行同样的MATLAB命令
设置断点
可以将转移或者状态作为本地断点来控制Stateflow状态图的运行: 1. 右键单击对象,在快捷菜单中设置属性 2. 执行Properties 命令调用对话框
3. 选择Debugger breakpoints 字段中相应的属性
设置也可以将断点设置为数据对象的修改或者事件的触发,而这些设置在Stateflow浏览器中完成。
查寻器
从Tool 菜单栏中选择find选项, 你也可以使用按钮访问finder 。
你可以限制搜寻的范围,要么查找Stateflow组件,要么既查找Stateflow组件,同时也查找Simulink对象。
转移检测优先权
在仿真过程中, 如果Stateflow 在离开状态时检测到有多个有效的转移, 转移检测规则将会决定采纳何种转移。一般规则是:如果一个转移具有更多的严格的限制,那么这个转移具有更高的优先级。
根据这个规则:
1. 既有事件又有条件的转移第一个被检测 2. 仅具有事件的转移则被第二个检测 3. 仅具有条件的转移第三个被检测 4. 不加任何限制的转移最后被检测
转移冲突
如果在同一个优先级中,具有两个合法的转移,会发生什么? 这种情况会触发一个转移冲突错误的警告信息。 Stateflow 通过几何的方法解决这样的问题:
? 对于来自于一个节点的转移, 按顺时针方向检测转移
? 对于来自于一个状态的转移, 从状态的左上角开始,检测转移
注意: 通过在Stateflow debugger中的Error checking options 选项,可以选择清除Transition Conflict,这样就可以抑制转移冲突错误警告信息。
流程图
Stateflow 图如果不包含任何状态就构成了一个流程图。流程图主要是由转移和连接节点组成。
流程图并不包含任何存储器。流程图一旦被触发,就会一直执行到退出为止。在两个连续的触发之间,这个流程图是不活动的。状态图
在没有合法的转移分支的连接节点处执行结束。
终止节点
终止节点就是连接节点,只不过该连接节点聚集了所有转移路径。它是一个没有附加任何流出路径的节点。终止节点类似函数中的return声明。在一个流程图中,必须要有一个无条件路径来终止连接,防止无穷递归。
在一个流程图中, 以{} 表示的条件动作仅仅是一个可执行的动作。
图形化If-Else结构
Stateflow 使用转移检测以及几何学的方法解决转移冲突这个问题,我们可以利用这个特点,使用图形化的方法表达逻辑状态。构造一个if-else结构,创建的流程图如下图所示。Stateflow 使用转移检测来决定何种转移将会被执行。有条件的转移代表if ,而无条件的转移代表else 。
为了表达if-elseif-else 结构, 我们可以使用多个连接节点创建流程图。在第一个连接节点上, 第一个条件被测试到(if 声明). 如果转移无效,那么就会继续下一个连接节点,测试第二个条件,(elseif声明). 如果转移无效,那么就会执行无条件转移。