在打开的modelica中是否有任何关键字可以在输出达到特定值时终止或停止模拟?

问题描述 投票:0回答:1

当我的输出达到某个限制或值时,我想停止模拟,无论模拟时间如何。让我们举个例子,我的输出是“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;
break terminate openmodelica
1个回答
0
投票

这是一个有点棘手的例子,因为它涉及对 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; 
© www.soinside.com 2019 - 2024. All rights reserved.