用 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 个变量构建状态机的主要内容,如果未能解决你的问题,请参考以下文章

verilog HDL状态机 赋初值问题

用状态机控制业务状态扭转 Hello Spring StateMachine

简单了解状态机

Java Secret: Using an enum to build a State machine(Java秘术:用枚举构建一个状态机)

如何写好Verilog状态机

游戏状态机的设计与实现