0

我试图通过状态图在模拟中一个一个地执行 2 个模型。伪代码如下。在模型测试中,有两个块,stateA 和 stateB。在模拟开始时,执行 stateA。10 秒后,stateA 停止,而 stateB 执行。停止点 v 的值需要从 stateA 转移到 stateB。有人可以给我一些建议吗?非常感谢!


model test 
  inner Integer v(start = 1); 

  block StateA 
    outer output Integer v; 
  equation 
    v = previous(v) + 2; 
  end StateA; 
  StateA stateA; 

  block StateB 
    outer output Integer v; 
  equation 
    v = previous(v) - 1; 
  end StateB; 
  StateB stateB; 

equation 
  initialState(stateA); 
  transition(stateA, stateB, t >= t0, immediate=false); 
end test;

另一件事是为什么我无法在 openModelica 中模拟以下简单示例?

model StateMachine1
  inner Integer i(start=0);

  block State1
    outer output Integer i;
  equation
    i = previous(i) + 2;
  end State1;
  State1 state1;

  block State2
    outer output Integer i;
  equation
    i = previous(i) - 1;
  end State2;
  State2 state2;

equation
  initialState(state1);
  transition(state1, state2, i > 10, immediate=false);
  transition(state2, state1, i < 1, immediate=false);
end StateMachine1;

错误:在范围 StateMachine1 中找不到类 initialState

4

2 回答 2

1

关于您的模型,我认为实现它的最佳方法是将三个模型编码在三个不同的类中,然后有一个包装器,其中包含我们模型的所有变量,然后在包装器中实现 when - elsewhen - elsewhen 语句将重新启动已激活模型的状态变量,最后是 if - elseif - else 语句将包装器变量链接到相应的活动块。这样,您还可以更改模型中变量的因果关系而不会导致错误。作为一个例子,我发布了一个破碎的钟摆模型的案例:

model BreakingPendulum2
extends BasePendulum(p(m=1, g=9.81, L=0.5));
input Boolean Broken;
protected
Pendulum pend (p=p, u=u, enable=not Broken);
BrokenPendulum bpend(p=p, u=u, enable=Broken);
equation
when Broken then
reinit(bpend.pos, pend.pos);
reinit(bpend.vel, pend.vel);
end when;
pos = if not Broken then pend.pos else bpend.pos;
vel = if not Broken then pend.vel else bpend.vel;
end BreakingPendulum2;

BasePendulum类实现了您需要计算的关于被模拟的系统的变量。从该 cass 扩展,您可以实现在不同情况下有效的三个不同版本的模型。然后,您编写一个像我发布的块一样的块,并根据不同模型的有效性实现逻辑。

于 2013-03-18T10:53:01.243 回答
0

您正在尝试做的事情在有关 Modelica 3.3 规范中引入的新状态机功能的材料中进行了详细描述。您可以在下面找到一些参考资料:

您的模型中的错误是在 Modelica 3.3 中引入了对所有变量的采样时间推断,即不能在相同的方程中使用具有不同时间离散化的离散变量,换句话说,您必须只使用具有相同时钟的变量方程。在您的情况下,您有一个连续变量(时间)和一个离散变量 v。因此,您不能将时间用于影响离散变量 v 行为的转换语句(在 modelica 代码的转换过程中将成为方程) . 为了满足您的需要,一种解决方案是为模型中的所有变量定义一个时钟,然后建立逻辑(如果您需要多个采样时间,则必须使用特殊运算符,例如 superSample)。

    model StateMachine3
  Real i(start = 0,fixed=true);
  inner Real id(start = 2);
  Real td(start = 0,fixed=true);

  State1 state1;

  model State1
    outer output Real id;
  equation 
    id = 2;
  end State1;

  model State2
    outer output Real id;
  equation 
    id = - 1;
  end State2;
  State2 state2;
equation 
  td = sample(time, Clock(1, 10));
  when Clock(1, 10) then
    i =  previous(i) + id;
  end when;
  initialState(state1) ;
  transition(
    state1,
    state2,td > 10,
    immediate=false,
    reset=false,
    priority=1,synchronize=false);
end StateMachine3;
于 2013-03-11T15:53:48.153 回答