如何在一次模拟中逐个执行2个模型?

时间:2013-03-10 14:33:53

标签: modelica openmodelica dymola

我试图通过状态图在模拟中逐个执行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

2 个答案:

答案 0 :(得分: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扩展,您可以实现在不同情况下有效的三种不同版本的模型。然后你写一个像我发布的那个块,并根据不同模型的有效性实现逻辑。

答案 1 :(得分:0)

有关Modelica 3.3规范中引入的新状态机功能的详细信息中详细介绍了您要执行的操作。您可以在下面找到一些参考资料:

模型中的错误是在Modelica 3.3中引入了所有变量的采样时间推断,即在时间上具有不同离散化的离散变量不能用于相同的方程,换句话说,您必须仅使用相同的变量等式中的时钟。在你的情况下,你有一个连续的变量(时间)和一个离散的变量v。因此,你不能将时间用于转换语句(将成为modelica代码转换期间的方程式),这会影响离散变量v的行为为了满足您的需求,一种解决方案是为模型中的所有变量定义一个时钟,然后构建逻辑(如果需要多个采样时间,则必须使用特殊运算符,如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;