Modelica中的动态切换连接

Modelica中的动态切换连接,modelica,openmodelica,Modelica,Openmodelica,假设我有一个大型连接器,涉及各种基本类型(实数、整数、字符串、布尔值)。如何根据状态事件切换连接? 我想这样做: model switch input ComplicatedConnector icon[2]; output ComplicatedConnector ocon; input Real x; equation if x >= 0 then connect(ocon, icon[1]); else connect(ocon, icon[2

假设我有一个大型连接器,涉及各种基本类型(实数、整数、字符串、布尔值)。如何根据状态事件切换连接? 我想这样做:

model switch
 input ComplicatedConnector icon[2];
 output ComplicatedConnector ocon;
 input Real x;
 equation
   if x >= 0 then
     connect(ocon, icon[1]);
   else
     connect(ocon, icon[2]);
   end if;
end switch;
这是行不通的。如何在Modelica中正确表达它

答案基于阿德里安·波普的评论

model switch
 input ComplicatedConnector icon[2];
 output ComplicatedConnector ocon;
 input Real x;
 ComplicatedConnector con;
 initial equation
   con = icon[1];
 equation
   connect(ocon, con);
   when x >= 0 then
     con := icon[1];
   end when;
   when x < 0 then
     con := icon[2];
   end when;
end switch;
型号开关
输入复杂的连接器图标[2];
输出连接器ocon;
输入实x;
复杂的连接器;
初始方程
con=图标[1];
方程式
连接(ocon、con);
当x>=0时,则
con:=图标[1];
结束时;
当x<0时,则
con:=图标[2];
结束时;
终端开关;
更新:上面的模型是错误的,因为如果没有事件发生,ocon将永远输出图标[1]的初始值,这与您期望的开关不同。请注意,这不是由于错误的答案,而是由于我对答案的错误解释。以下模型基于Michael Tiller的答案

model switch
 input ComplicatedConnector icon[2];
 output ComplicatedConnector ocon;
 input Real x;
 Integer k;
 initial equation
   k = 1;
 equation
   ocon = icon[k];
   when x >= 0 then
     k := 1;
   elsewhen x < 0 then
     k := 2;
   end when;
end switch;
型号开关
输入复杂的连接器图标[2];
输出连接器ocon;
输入实x;
整数k;
初始方程
k=1;
方程式
ocon=图标[k];
当x>=0时,则
k:=1;
当x<0时,则为Elsex
k:=2;
结束时;
终端开关;

不可能。只能基于编译时已知的参数(也称为结构参数)来切换它们。包含connects的if方程中的条件必须是参数表达式。

请注意,
connect
语句是方程。你可以自己扩展它们。它们的存在主要是为了避免在生成样板方程时出现“簿记”错误。因此,我建议您只需使用
开关
模型,并将每个
连接
展开为方程。问题是你想建立什么样的模型。有一种方法可以使用条件组件禁用与组件的连接,但条件组件中的条件必须是参数表达式。请参阅Modelica规范中的4.4.5条件组件声明。我想基于动态条件路由2个(非平凡)信号之一。Modelica.Blocks.Routing.Extractor中使用的技巧不起作用,因为*无法应用。在Modelica中,这个看似常见的问题是如何正确建模的?我认为唯一的方法是将它们连接起来,然后根据一个方程切换进入每个方程的值。