用 2 个变量构建状态机
Posted
技术标签:
【中文标题】用 2 个变量构建状态机【英文标题】:Build state machine with 2 variables 【发布时间】:2020-10-15 15:48:05 【问题描述】:我是 Modelica 的新手,但我想用 2 个变量构建一个简单的状态机: 初始步骤是“关闭”(变量 Light_cabin==0),然后如果 button_Evac == 1(第二个变量)然后转到步骤“on”,如果 Button_Evac==0 返回初始步骤,则 Light_Cabin == 1。 这是我的状态机: state_machine
但是当我启动模拟时 Light_Cabin = 0 即使 button_Evac = 1 并且活动步骤是初始步骤。
这是我的代码:
model StateMachine
block Off
outer output Integer Light_Cabin;
equation
Light_Cabin = 0;
end Off;
block On
outer output Integer Light_Cabin;
equation
Light_Cabin = 1;
end On;
parameter Integer Button_Evac(start=0);
inner Integer Light_Cabin(start=0);
Off off;
On on;
equation
transition(
off,
on,
Button_Evac == 1,
immediate=true,
reset=false,
synchronize=false,
priority=1);
transition(
on,
off,
Button_Evac == 0,
immediate=true,
reset=false,
synchronize=false,
priority=1);
initialState(off);
end StateMachine;
如果您知道我的错误在哪里,请告诉我。 谢谢您的帮助, 埃洛伊丝
【问题讨论】:
你能发布代码吗?很难仅提供屏幕截图... 是的,我刚刚编辑了我的帖子,谢谢 :) 【参考方案1】:这是由于 Modelica 中的状态机设计,可以在 https://specification.modelica.org/v3.4/Ch17.html#semantics-summary 中看到
即使转换是立即的,状态也会在一个时钟周期内处于活动状态。如果不是这种情况,那么如果所有转换都是立即的,则存在无限循环的风险 - 这需要额外的语义检查。 从技术上讲,它不是从“关闭”开始,而是从一个单独的“初始状态”开始,并且在第一个时钟滴答声中,状态机转换为“关闭”,因此无法在该时钟滴答声中进一步转换。【讨论】:
默认时钟是1s,所以模拟超过1s会显示Light_Cabin
的变化,以防Button_Evac==1
。由于答案中的解释,这是在 1 秒后完成的。
感谢您的回答,我更改了时钟周期,但并未更改 Light_Cabin 的值。如果我创建另一个状态“初始状态”,从“初始状态”到“关闭”的转换是什么?过渡是“在第一个时钟滴答声”吗?如果是这样,我真的不知道如何编写它,因为我对 Modelica 语言非常陌生。以上是关于用 2 个变量构建状态机的主要内容,如果未能解决你的问题,请参考以下文章
用状态机控制业务状态扭转 Hello Spring StateMachine
Java Secret: Using an enum to build a State machine(Java秘术:用枚举构建一个状态机)