设置一段时间的布尔值

时间:2014-11-10 20:11:14

标签: controller boolean modelica dymola

我正在为加热系统编写一个控制器,该系统响应加热系统所在的电网状态。我尝试了几个控制器,但是那个给我带来问题的控制器就是下一个。

我试图编写一个考虑到网格中可再生能源数量的模型。当满足外部能量的某个阈值时,加热系统应该接通(以便在本地使用能量)。这是需求侧管理的一种形式。我遇到的问题是加热系统接通的阈值。这反过来意味着不再满足阈值,因为能量是在本地使用的。控制器由布尔值表示。如果满足阈值则为true,否则为false。

这是我认为有问题的代码的一部分:

算法

 if CurrentGoingExternal > 5 then SwitchOn :=true;
  elseif  CurrentGoingExternal < 5 and pre(SwitchOn) then SwitchOn :=true;
  elseif  CurrentGoingExternal < 1 then SwitchOn :=false;
  else SwitchOn :=false;
  end if;

模拟时我得到布尔无法弄清楚的错误,因为满足阈值确保加热开关确保布尔值在同一时间段内变为假。因此,我正在寻找一种方法来设置或锁定或其他任何方式。从满足阈值的那一刻起,布尔值为true,直到下一个时间段的开始,再次检查它。即使在该时间段内,由于在开始时接通加热系统,也不会满足阈值。

我尝试过像noEvent这样的事情,但这似乎不适用于持续存在的问题。

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

您可以随时对系统进行采样:

model M
  Real currentGoingExternal = time;
  Boolean switch(start=true);
equation
  when sample(0, 0.01) then
    switch = pre(currentGoingExternal) < 0.5;
  end when;
end M;

也可以设置下一次检查条件:

model M
  Real currentGoingExternal = time + (if time>0.6001 then -2*time else 0);
  Boolean switch(start=true);
  Real checkTime(start=0.01);
equation
  when currentGoingExternal < 0.5 and not pre(switch) and time>pre(checkTime) then
    switch = true;
    checkTime = time+0.1;
  elsewhen currentGoingExternal > 0.6 and pre(switch) and time>pre(checkTime) then
    switch = false;
    checkTime = time+0.1;
  end when;
end M;

答案 1 :(得分:2)

如果我理解你的问题,我认为你真正想要的是迟滞。您可以在this chapter of Modelica by Example中看到详细的讨论。