当我的输出达到某个限制或值时,我想停止模拟,无论模拟时间如何。让我们举个例子,我的输出是“prod”,一个变量,其中存储了两个数字的乘积。如果两个数字的乘积大于 12,则无论数组中剩余的其他值如何,模拟都必须停止。
是否有任何关键字可以在开放的 modelica 中执行此操作?我尝试使用break和terminate命令,但是3秒后prod的输出达到12,然后绘图继续5秒(这是模拟时间)并且存储在prod中的值为零。我希望我的模拟停止,并且乘积为 12,之后它不应该计算乘积,也不应该在图中显示这些值。
model ForLoopExample;
Real A[5] = {1,2,3,4,5};
Real B[5] = {2,3,4,5,6};
Real prod[5];
Boolean test_case(start = false);
algorithm
for i in 1:size(A,1) loop
prod[i]:=A[i]*B[i];
if prod[i]>=12 then
test_case = true;
break;
end if;
end for;
when test_case then
terminate("product above 12");
end when;
end ForLoopExample;
这是一个有点棘手的例子,因为它涉及对 Modelica 和时间的理解。该代码按我的预期工作(如果您只是调整代码 text_case := true)。该算法在模拟一开始就进行所有计算,并且有点不“花费时间”。您需要使系统时间离散,并且对于每个采样间隔(例如 1 秒)进行一轮计算。
我已将您的代码粗略地转换为时间离散系统。我让 A 和 B 的索引代表时间 1, 2,..5 秒,这样我们就可以得到每个采样周期的 A 和 B 的值。
当 prod = 20(即大于 12)时,该算法在 time=4 时工作并停止。
这能捕捉到你想要的吗?
model ForLoopExample
parameter Real samplePeriod = 1;
parameter Real A[5] = {1,2,3,4,5};
parameter Real B[5] = {2,3,4,5,6};
Real prod (start=0, fixed=true);
Boolean test_case(start = false);
equation
when sample(0, samplePeriod) then
prod = A[integer(time)]*B[integer(time)];
test_case = prod > 12;
end when;
when test_case then
terminate("product above 12");
end when;
end ForLoopExample;