在 Modelica 中动态切换连接
Dynamically switching connect in Modelica
假设我有一个涉及各种基本类型(Real、Integer、String、Boolean)的大型连接器。如何根据状态事件切换连接?
我想做这样的事情:
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中正确表达?
答案基于 Adrian Pop 的评论。
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;
更新:上面的模型是错误的,因为如果没有事件发生,ocon 将永远输出 icon[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;
不可能。您只能根据编译时已知的参数(也称为结构参数)切换它们。包含connects的if方程中的condition需要是参数表达式
请注意,connect
语句是等式。您可以自己扩展它们。它们的存在主要是为了避免生成样板方程的 "bookkeeping" 错误。所以我建议你做的是简单地采用你的 switch
模型并将每个 connect
展开为方程式。它应该工作。
假设我有一个涉及各种基本类型(Real、Integer、String、Boolean)的大型连接器。如何根据状态事件切换连接? 我想做这样的事情:
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中正确表达?
答案基于 Adrian Pop 的评论。
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;
更新:上面的模型是错误的,因为如果没有事件发生,ocon 将永远输出 icon[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;
不可能。您只能根据编译时已知的参数(也称为结构参数)切换它们。包含connects的if方程中的condition需要是参数表达式
请注意,connect
语句是等式。您可以自己扩展它们。它们的存在主要是为了避免生成样板方程的 "bookkeeping" 错误。所以我建议你做的是简单地采用你的 switch
模型并将每个 connect
展开为方程式。它应该工作。