初始化OpenModelica时转换为false true

初始化OpenModelica时转换为false true,modelica,openmodelica,Modelica,Openmodelica,我在Modelica初始化方面遇到了一些问题。我想模拟有限状态机的初始步骤,我希望初始状态从false开始,并在模拟开始时立即变为true equation OUTPUT=active; algorithm when change(INPUT) then X:= not X; reinit(t,0); end when; initial algorithm active:=true; 这是代码。 变量输入、输出和X都是布尔类型。输入是一个使状

我在Modelica初始化方面遇到了一些问题。我想模拟有限状态机的初始步骤,我希望初始状态从false开始,并在模拟开始时立即变为true

equation
      OUTPUT=active;
    algorithm
      when change(INPUT) then X:= not X; reinit(t,0); end when;
    initial algorithm
      active:=true;
这是代码。 变量输入、输出和X都是布尔类型。输入是一个使状态改变的变量(从true变为false,反之亦然)

代码的作用是在初始化时将变量active设置为true。我想得到的是,它从false开始,在t=0时变为true;基本上,我希望在模拟的第一个瞬间看到从false到true的转换。可能吗?

编辑2: 考虑到这一点,使用when子句的
initial()
解决了问题

model Test
  Boolean x(start=false) "state";
  Boolean u;
  Modelica.Blocks.Interfaces.BooleanOutput y;
equation
  u=true;
  when initial() then
    x = not pre(x);
  elsewhen edge(u) then
    x = not pre(x);
  end when;
  y=x;
end Test;
查看OpenModelica的调试器,首先x获得分配的起始值
false
,然后跳入when子句并将其设置为true


如果您提供一个可重复性最低的示例,帮助会容易得多:首先感谢您的回答。是的,我听说过pre(),但它与初始化一起使用时不起作用。我试图运行您的代码,但出现以下错误:内部错误BackendDAECreate.lowerWhenEqn:公式未处理:未处理时的公式pre(u)==u然后x=not x;结束时;我忘了在
x
周围添加
pre()
语句。但是,我建议的解决方案不起作用。我所能想到的就是使用一个小数字
eps
。在这种情况下,应该使用
edge(b)
操作符,它转换为
b,而不是pre(b)
。我将您的when条件更改为
edge(u\u internal)
,它似乎产生了预期效果。谢谢大家。我正在处理离散事件系统和布尔变量。我需要一个t=0的上升沿,因为我处理离散事件并使用when语句。从理论上我知道:when语句只有在条件变为真时才有效。在我的例子中,条件从一开始就是true,所以when语句被跳过,这就是为什么我需要一个在t=0时从false变为true的信号。另外,我不能延迟它,因为系统工作于离散事件,我不希望它与时间有关。感谢
edge()
命令,我不知道这个。查看以下问题,使用
initial()
可以解决该问题。我再次编辑了我的答案。