保存和恢复操作点Stateflow图表
一个操作点是Simulink的快照吗®在仿真模型。如果您的模型包含一个状态流®图表中,操作点包含以下信息:
活跃的状态
图表输出数据
图表、状态和功能本地数据
MATLAB中的持久变量®函数和真值表
您可以将模型在某个时间步长的状态保存为操作点,然后使用该操作点作为模拟的初始状态。例如,假设您的模拟从初始化阶段开始。如果您在模型完成初始化阶段之后保存一个操作点,那么您可以将该操作点用作模型的初始状态,并且无需从时间开始就可以获得连续模拟的结果t= 0.有关更多信息,请参见使用操作点指定模拟的初始状态.
您还可以使用操作点来测试状态流图对不同设置的响应,包括在模拟中难以达到的配置。您可以通过更改本地、输出或持久数据的值、当前活动的状态以及模拟过程中历史结点记录的以前的状态活动来修改操作点。然后,您可以使用修改后的操作点作为模拟的起点,以测试图表如何响应您的更改。有关更多信息,请参见测试难以复制的图表配置而且具有故障检测和冗余逻辑的测试图.
保存操作点
要保存Simulink模型的最终操作点,请选择配置参数最终状态(模型)而且保存最终操作点(模型),为模型的操作点指定一个变量,并运行模拟。然后,通过调用状态流图的操作点信息得到
(模型)函数使用模型的操作点和图表的块路径。
例如,假设这样xFinal
是模型的操作点吗sf_car
,其中包含图表shift_logic
.
要访问此图表的工作点信息,请输入:
op =得到(xFinal,“sf_car / shift_logic”)
op = Block: "shift_logic" (handle) (active)路径:sf_car/shift_logic包含:+ gear_state "State (AND)"(active) + selection_state "State (AND)"(主动)齿轮“状态输出数据”gearType [1,1] down_th“局部作用域数据”double [1,1] up_th“局部作用域数据”double [1,1]
操作点按层次顺序列出图表中的状态、框、函数和数据。如果存在名称冲突,则在名称的末尾出现一个或多个下划线,以便所有对象都具有惟一的标识符。
要访问图表中对象的操作点信息,请使用点表示法。例如,访问顶级状态的操作点信息gear_state
,输入:
op.gear_state
ans = State: "gear_state" (handle) (active)路径:sf_car/shift_logic/gear_state+第四个“State (OR)”+第二个“State (OR)”+第三个“州(或)”(主动)
类似地,访问图表输出的操作点信息齿轮
,输入:
op.gear
ans =描述:'状态输出数据' DataType: 'gearType'大小:'[1,1]'范围:[1×1 struct] InitialValue:[]值:third
有关此示例的更多信息,请参见将图表模拟为带有本地事件的Simulink块.
请注意
无状态流程图有一个空的操作点,因为它们不包含状态或持久数据。
复制操作点
要为状态流图创建操作点的副本,请调用克隆
函数。例如,假设您试图复制操作点人事处
通过输入:
op1 =运算;《凤凰社》第2章=克隆(op);
在这种情况下,op1
指的是同一工作点人事处
,所以修改op1
也修改人事处
.相比之下,《凤凰社》第2章
指不需要修改即可修改的另一个操作点人事处
.
请注意
的克隆
函数复制整个状态流图的操作点信息。不能复制状态或数据对象的操作点信息。
修改工作点值
要测试状态流图对不同设置的响应,可以通过更改本地、输出或持久数据的值、当前活动的状态以及模拟期间由历史结点记录的以前的状态活动来修改操作点。
修改数据值
若要修改本地、输出或持久数据的值,请更改价值
操作点的属性。例如,假设这样人事处
包含图表的操作点。来修改图形输出的值输出
,输入:
op.output.Value = newValue;
修改数据值时:
不能更改数据类型或大小。
即使图表使用C语言作为操作语言,也要使用以圆括号和逗号分隔的单基索引来引用向量或矩阵的元素。
控件中指定的范围内,数值数据的新值必须在最低而且最大参数。有关更多信息,请参见限制范围内.
对于枚举数据类型,只能从类型定义中选择枚举值。
您不能在自定义C代码和外部MATLAB代码中修改机器父数据或持久数据的值。
修改当前状态活动
要更改操作点中当前活动的状态,请调用setActive
函数使用叶状态作为参数。该函数通过以下方法保持状态一致性:
退出和进入适当的状态
为新激活的状态重置时间计数器
更新活动状态数据的值
启用或禁用绑定到状态的函数调用子系统和Simulink函数
然而,图表不能执行退出
为以前的活动状态或条目
新激活状态的操作。此外,状态不会重新初始化任何由状态父级的本地数据。如果您希望这些操作发生,则必须分别执行它们。例如,如果您的状态操作为数据赋值,则必须如中所述显式地赋值修改数据值.
修改以前的状态活动
要更改历史连接记录的以前活动状态,请调用setPrevActiveChild
函数,使用包含历史连接的状态作为参数。调用此函数时,状态不能为活动状态。
加载修改的工作点信息
要将状态流图的修改操作点信息加载到Simulink模型的操作点中,请调用集
(模型)函数。例如,如果xFinal
是模型的操作点吗sf_car
而且人事处
包含图表的修改的操作点信息shift_logic
,可以保存修改后的操作点xModified
通过输入:
xModified =集(xFinal,“sf_car / shift_logic”, op);
请注意
的集
函数为整个状态流图加载操作点信息。无法加载状态或数据对象的操作点信息。
恢复操作点
若要使用一个工作点作为模拟的初始状态,请设置配置参数初始状态(模型)并为模型的操作点指定变量名。当您模拟您的模型时,模拟从操作点的时间开始。有关更多信息,请参见使用模型操作点更快的模拟工作流程(模型).
操作点的限制
连续时间图表
连续时间图表的操作点是只读的。您可以为连续时间图表保存一个操作点,并将其用作模拟的初始状态。但是,您不能修改状态活动或操作点中的任何数据值。有关连续时间图表的更多信息,请参见状态流中的连续时间建模.
使用边缘检测的图表
使用边缘检测操作符的状态流图不支持操作点。如果您的模型包含一个使用边缘检测的图表,试图保存最终操作点会导致编译时错误。有关边缘检测运算符的更多信息,请参见检测数据和表达式值的更改.
另请参阅
模型设置
对象
Stateflow.op.BlockOperatingPoint
|Stateflow.op.OperatingPointContainer
|Stateflow.op.OperatingPointData
功能
setActive
|setPrevActiveChild
|克隆
|得到
(模型)|集
(模型)