Modelica 如何在不影响模拟性能的情况下检查终止流程的绝对时间约束?
我想读取当前日期,如果该日期超出限制,则应终止系统。下面的代码可以工作Modelica 如何在不影响模拟性能的情况下检查终止流程的绝对时间约束?,modelica,Modelica,我想读取当前日期,如果该日期超出限制,则应终止系统。下面的代码可以工作 import Modelica.Utilities.System.getTime; model M Integer[7] today; constant Integer[7] limit={0,0,0,0,0,0,2021}; Real x; equation today = getTime(); if today[7] >
import Modelica.Utilities.System.getTime;
model M
Integer[7] today;
constant Integer[7] limit={0,0,0,0,0,0,2021};
Real x;
equation
today = getTime();
if today[7] > limit[7] then
terminate();
end if;
// Process
x = 1;
end M;
但是最好是在启动时读取日期,避免一直检查日期,这应该是一个负担,尽管运行上面的代码并不明显
最符合逻辑的是初始算法或方程部分,用getTime获取日期,如果合适,也可以终止
但只需将当前部分更改为initial equation gives编译错误,错误文本为:…以下变量无法与任何方程匹配:今天[1]。。。。今天[7]。模型中不需要今天,因此您可以将其移动到函数:
import Modelica.Utilities.System.getTime;
function afterLimit
input Integer limit[7];
output Boolean after;
protected
Integer[7] today;
algorithm
(,,,,,,today[7]) := getTime();
after := today[7]>limit[7];
end afterLimit;
model M
constant Integer[7] limit={0,0,0,0,0,0,2021};
Real x;
initial equation
if afterLimit(limit) then
terminate("Time is up!");
end if;
equation
// Process
x = 1;
end M;
或者,您可以按照@ReneJustNielsen的建议将其设置为fixed=false的参数,您现在不需要在模型中使用它,因此您可以将其移动到函数:
import Modelica.Utilities.System.getTime;
function afterLimit
input Integer limit[7];
output Boolean after;
protected
Integer[7] today;
algorithm
(,,,,,,today[7]) := getTime();
after := today[7]>limit[7];
end afterLimit;
model M
constant Integer[7] limit={0,0,0,0,0,0,2021};
Real x;
initial equation
if afterLimit(limit) then
terminate("Time is up!");
end if;
equation
// Process
x = 1;
end M;
或者,您可以按照@ReneJustNielsen的建议,将其设置为fixed=false的参数,您可以今天将其声明为fixed=false的参数,并在初始方程部分为其分配getTime。该代码在使用Modelica 4.0.0的Dymola 2021x中不起作用。terminate需要一个字符串作为参数,getTime返回多个值,而不是一个向量。对于MSL4,也请阅读此票证:您可以使用fixed=false将today声明为参数,并在初始方程部分为其分配getTime。该代码在使用Modelica 4.0.0的Dymola 2021x中不起作用。terminate需要一个字符串作为参数,getTime返回多个值,而不是一个向量。对于MSL4,也请阅读此票据:通过Marco上面提到的小调整,您的代码在OpenModelica中运行良好。我只是想知道说初始算法而不是初始方程是否更好/合乎逻辑?毕竟这部分没有方程式。在OpenModelica中,初始算法也可以工作。我通常在可能的情况下使用方程和初始方程。通过上面Marco提到的小调整,您的代码在OpenModelica中工作得很好。我只是想知道说初始算法而不是初始方程是否更好/合乎逻辑?毕竟这部分没有方程式。在OpenModelica中,初始算法也可以工作。我通常在可能的情况下使用方程和初始方程。