You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;

修正说明

  1. L3的参数改为parameter Integer r[:][:],直接存储每个L2需要的r数组,无需通过start/stop切片
  2. 实例化L2数组时,使用L2 l2[size(r, 1)](r=r[i]) for i in 1:size(r, 1),直接为每个L2传递对应的子数组
  3. M3中实例化L3时,直接传入嵌套数组r={{2,3}, {2,3,4}},清晰对应两个L2实例的参数
  4. 修正了M3中最后一条connect语句的索引错误(原代码中l3.l2[3]不存在,改为l3.l2[2])

内容的提问来源于stack exchange,提问作者Sof

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 01:37:01