Modelica层级连接器使用问题:三级连接器构建失败求助
Modelica三级层级连接器编译错误解决
问题背景
需要构建三级层级连接器:
- 一级连接器
L1:基于RealOutput数组实现 - 二级连接器
L2:L1的数组 - 三级连接器
L3:L2的数组
目前L1、L2及对应模型M1、M2可正常运行,但L3及模型M3在OpenModelica中触发内部编译错误。
错误信息
[1] 13:25:41 Translation Error [/var/lib/jenkins2/ws/LINUX_BUILDS/tmp.build/openmodelica-1.19.2~dev.beta1/OMCompiler/Compiler/NFFrontEnd/NFCeval.mo: 1053:9-1053:67]: Internal error NFCeval.evalBinarySub failed to evaluate ‘{2, 5}[i] - {1, 3}[i]‘
原始代码
within Experiment; package conn connector L1 "Level 1 connector" parameter Integer n; Modelica.Blocks.Interfaces.RealOutput R[n]; annotation( Diagram(graphics = {Ellipse(fillColor = {239, 41, 41}, fillPattern = FillPattern.Sphere, extent = {{-60, 60}, {60, -60}})}), Icon(graphics = {Ellipse(fillColor = {239, 41, 41}, fillPattern = FillPattern.Sphere, extent = {{-60, 60}, {60, -60}})})); end L1; connector L2 "Level 2 connector" parameter Integer r[:]; L1 l1[size(r, 1)](n=r); annotation( Icon(graphics = {Ellipse(fillColor = {252, 233, 79}, fillPattern = FillPattern.Sphere, extent = {{-60, 60}, {60, -60}})}), Diagram(graphics = {Ellipse(fillColor = {252, 233, 79}, fillPattern = FillPattern.Sphere, extent = {{-60, 60}, {60, -60}})})); end L2; connector L3 "Level 3 connector" parameter Integer a[:]; // {2, 3} parameter Integer r[sum(a)]; // {2, 3, 2, 3, 4} parameter Integer start[size(a, 1)]; // r start indices {1, 3} parameter Integer stop[size(a,1)]; // r stop indices {2, 5} // how to construct connector with a = {2, 3}, r = {2, 3, 2, 3, 4} ? // to get l2[1] = L2(r={2, 3}) // to get l2[2] = L2(r={2, 3, 4}) L2 l2[size(a,1)](r={r[start[i]:stop[i]] for i in 1:size(a,1)}); annotation( Diagram(graphics = {Ellipse(fillColor = {138, 226, 52}, fillPattern = FillPattern.Sphere, extent = {{-60, 60}, {60, -60}})}), Icon(graphics = {Ellipse(fillColor = {138, 226, 52}, fillPattern = FillPattern.Sphere, extent = {{-60, 60}, {60, -60}})})); end L3; model M1 "Model with level 1 connector" Modelica.Blocks.Sources.Constant[5] C(k = {1, 2, 3, 4, 5}); L1 l1(n=5); equation connect(C.y, l1.R); annotation( Icon(graphics = {Rectangle(fillColor = {239, 41, 41}, fillPattern = FillPattern.Sphere, extent = {{-100, 100}, {100, -100}})})); end M1; model M2 "Model with level 2 connector" Modelica.Blocks.Sources.Constant[5] C(k = {1, 2, 3, 4, 5}); L2 l2(r={2, 3}); equation connect(C[1:2].y, l2.l1[1].R[1:2]); connect(C[3:5].y, l2.l1[2].R[1:3]); annotation( Icon(graphics = {Rectangle(fillColor = {252, 233, 79}, fillPattern = FillPattern.Sphere, extent = {{-100, 100}, {100, -100}})}));end M2; model M3 "Model with level 3 connector" Modelica.Blocks.Sources.Constant[14] C(k = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14}); L3 l3(a={2,3}, r={2, 3, 2, 3, 4}, start={1,3}, stop={2,5}); equation connect(C[1:2].y, l3.l2[1].l1[1].R[1:2]); connect(C[3:5].y, l3.l2[1].l1[2].R[1:3]); connect(C[6:7].y, l3.l2[2].l1[1].R[1:2]); connect(C[8:10].y, l3.l2[2].l1[2].R[1:3]); connect(C[11:14].y, l3.l2[3].l1[2].R[1:4]); annotation( Icon(graphics = {Rectangle(fillColor = {138, 226, 52}, fillPattern = FillPattern.Sphere, extent = {{-100, 100}, {100, -100}})}));end M3; end conn;
问题分析
错误根源在于L3中实例化L2时使用的数组推导式{r[start[i]:stop[i]] for i in 1:size(a,1)}。OpenModelica在处理连接器参数实例化阶段,对这种依赖动态索引切片的推导式支持不足,导致内部求值失败。
修正方案
重新设计L3的参数,直接使用嵌套数组传递每个L2所需的r参数,避免动态切片操作:
修正后的代码
within Experiment; package conn connector L1 "Level 1 connector" parameter Integer n; Modelica.Blocks.Interfaces.RealOutput R[n]; annotation( Diagram(graphics = {Ellipse(fillColor = {239, 41, 41}, fillPattern = FillPattern.Sphere, extent = {{-60, 60}, {60, -60}})}), Icon(graphics = {Ellipse(fillColor = {239, 41, 41}, fillPattern = FillPattern.Sphere, extent = {{-60, 60}, {60, -60}})})); end L1; connector L2 "Level 2 connector" parameter Integer r[:]; L1 l1[size(r, 1)](n=r); annotation( Icon(graphics = {Ellipse(fillColor = {252, 233, 79}, fillPattern = FillPattern.Sphere, extent = {{-60, 60}, {60, -60}})}), Diagram(graphics = {Ellipse(fillColor = {252, 233, 79}, fillPattern = FillPattern.Sphere, extent = {{-60, 60}, {60, -60}})})); end L2; connector L3 "Level 3 connector" // 直接用嵌套数组定义每个L2对应的r参数 parameter Integer r[:][:]; L2 l2[size(r, 1)](r=r[i]) for i in 1:size(r, 1); annotation( Diagram(graphics = {Ellipse(fillColor = {138, 226, 52}, fillPattern = FillPattern.Sphere, extent = {{-60, 60}, {60, -60}})}), Icon(graphics = {Ellipse(fillColor = {138, 226, 52}, fillPattern = FillPattern.Sphere, extent = {{-60, 60}, {60, -60}})})); end L3; model M1 "Model with level 1 connector" Modelica.Blocks.Sources.Constant[5] C(k = {1, 2, 3, 4, 5}); L1 l1(n=5); equation connect(C.y, l1.R); annotation( Icon(graphics = {Rectangle(fillColor = {239, 41, 41}, fillPattern = FillPattern.Sphere, extent = {{-100, 100}, {100, -100}})})); end M1; model M2 "Model with level 2 connector" Modelica.Blocks.Sources.Constant[5] C(k = {1, 2, 3, 4, 5}); L2 l2(r={2, 3}); equation connect(C[1:2].y, l2.l1[1].R[1:2]); connect(C[3:5].y, l2.l1[2].R[1:3]); annotation( Icon(graphics = {Rectangle(fillColor = {252, 233, 79}, fillPattern = FillPattern.Sphere, extent = {{-100, 100}, {100, -100}})})); end M2; model M3 "Model with level 3 connector" Modelica.Blocks.Sources.Constant[14] C(k = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14}); // 直接传递嵌套数组,每个子数组对应一个L2的r参数 L3 l3(r={{2,3}, {2,3,4}}); equation connect(C[1:2].y, l3.l2[1].l1[1].R[1:2]); connect(C[3:5].y, l3.l2[1].l1[2].R[1:3]); connect(C[6:7].y, l3.l2[2].l1[1].R[1:2]); connect(C[8:10].y, l3.l2[2].l1[2].R[1:3]); connect(C[11:14].y, l3.l2[2].l1[3].R[1:4]); annotation( Icon(graphics = {Rectangle(fillColor = {138, 226, 52}, fillPattern = FillPattern.Sphere, extent = {{-100, 100}, {100, -100}})})); end M3; end conn;
修正说明
L3的参数改为parameter Integer r[:][:],直接存储每个L2需要的r数组,无需通过start/stop切片- 实例化
L2数组时,使用L2 l2[size(r, 1)](r=r[i]) for i in 1:size(r, 1),直接为每个L2传递对应的子数组 M3中实例化L3时,直接传入嵌套数组r={{2,3}, {2,3,4}},清晰对应两个L2实例的参数- 修正了
M3中最后一条connect语句的索引错误(原代码中l3.l2[3]不存在,改为l3.l2[2])
内容的提问来源于stack exchange,提问作者Sof
相关产品推荐
相关产品推荐

