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

OpenModelica编译Dymola创建的Modelica包失败问题求助

问题:Modelica模型在OpenModelica编译失败(Dymola环境正常)

我用Dymola结合开源库创建了一个Modelica包,包内模型在Dymola中可正常编译与仿真,但在OpenModelica中编译时失败,具体错误信息如下:

System_CL_NightCTRL_14lnz.c:7:88: warning: non-void function does not return a value [-Wreturn-type]
7 | { /* system too big, use compiler flag --maxSizeLinearization to change threshold / }
| ^
System_CL_NightCTRL_14lnz.c:9:88: warning: non-void function does not return a value [-Wreturn-type]
9 | { / system too big, use compiler flag --maxSizeLinearization to change threshold / }
| ^
2 warnings generated.
System_CL_NightCTRL_02nls.c:399:110: error: no member named 'nominal' in 'struct INTEGER_ATTRIBUTE'
399 | sysData->nominal[i] = data->modelData->integerVarsData[4].attribute / compressorStepController.desStep /.nominal;
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^
System_CL_NightCTRL_02nls.c:403:93: error: no member named 'nominal' in 'struct BOOLEAN_ATTRIBUTE'
403 | sysData->nominal[i] = data->modelData->booleanVarsData[4].attribute / $whenCondition1 /.nominal;
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^
System_CL_NightCTRL_02nls.c:404:93: error: no member named 'min' in 'struct BOOLEAN_ATTRIBUTE'
404 | sysData->min[i] = data->modelData->booleanVarsData[4].attribute / $whenCondition1 /.min;
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^
System_CL_NightCTRL_02nls.c:405:93: error: no member named 'max' in 'struct BOOLEAN_ATTRIBUTE'
405 | sysData->max[i++] = data->modelData->booleanVarsData[4].attribute / $whenCondition1 /.max;
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^
System_CL_NightCTRL_02nls.c:407:94: error: no member named 'nominal' in 'struct BOOLEAN_ATTRIBUTE'
407 | sysData->nominal[i] = data->modelData->booleanVarsData[15].attribute / $whenCondition2 /.nominal;
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^
System_CL_NightCTRL_02nls.c:408:94: error: no member named 'min' in 'struct BOOLEAN_ATTRIBUTE'
408 | sysData->min[i] = data->modelData->booleanVarsData[15].attribute / $whenCondition2 /.min;
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^
System_CL_NightCTRL_02nls.c:409:94: error: no member named 'max' in 'struct BOOLEAN_ATTRIBUTE'
409 | sysData->max[i++] = data->modelData->booleanVarsData[15].attribute / $whenCondition2 /.max;
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^
System_CL_NightCTRL_02nls.c:411:107: error: no member named 'nominal' in 'struct INTEGER_ATTRIBUTE'
411 | sysData->nominal[i] = data->modelData->integerVarsData[5].attribute / compressorStepController.step */.nominal;

System_CL_NightCTRL_02nls.c:4447:94: error: no member named 'nominal' in 'struct BOOLEAN_ATTRIBUTE'
4447 | sysData->nominal[i] = data->modelData->booleanVarsData[15].attribute /* $whenCondition2 /.nominal;
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^
System_CL_NightCTRL_02nls.c:4448:94: error: no member named 'min' in 'struct BOOLEAN_ATTRIBUTE'
4448 | sysData->min[i] = data->modelData->booleanVarsData[15].attribute / $whenCondition2 /.min;
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^
System_CL_NightCTRL_02nls.c:4449:94: error: no member named 'max' in 'struct BOOLEAN_ATTRIBUTE'
4449 | sysData->max[i++] = data->modelData->booleanVarsData[15].attribute / $whenCondition2 /.max;
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^
System_CL_NightCTRL_02nls.c:4451:93: error: no member named 'nominal' in 'struct BOOLEAN_ATTRIBUTE'
4451 | sysData->nominal[i] = data->modelData->booleanVarsData[4].attribute / $whenCondition1 /.nominal;
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^
System_CL_NightCTRL_02nls.c:4452:93: error: no member named 'min' in 'struct BOOLEAN_ATTRIBUTE'
4452 | sysData->min[i] = data->modelData->booleanVarsData[4].attribute / $whenCondition1 /.min;
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^
System_CL_NightCTRL_02nls.c:4453:93: error: no member named 'max' in 'struct BOOLEAN_ATTRIBUTE'
4453 | sysData->max[i++] = data->modelData->booleanVarsData[4].attribute / $whenCondition1 /.max;
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^
System_CL_NightCTRL_02nls.c:4455:110: error: no member named 'nominal' in 'struct INTEGER_ATTRIBUTE'
4455 | sysData->nominal[i] = data->modelData->integerVarsData[4].attribute / compressorStepController.desStep /.nominal;
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^
System_CL_NightCTRL_02nls.c:4459:107: error: no member named 'nominal' in 'struct INTEGER_ATTRIBUTE'
4459 | sysData->nominal[i] = data->modelData->integerVarsData[5].attribute / compressorStepController.step */.nominal;
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

相关模型代码:

model CompressorStepController
  import Modelica.Units.SI;
  import Modelica.Blocks.Interfaces.{RealInput, RealOutput};
  
  // --- Parameters ---
  parameter Real E[4] = {150, 350, 500, 575} "Irradiance thresholds [W/m2]";
  parameter Real F[4] = { 80, 133, 186, 240} "Frequencies [Hz] at steps 1..4";
  parameter Real Fmax = 240 "Maximum frequency [Hz]";
  parameter SI.Time upDelay = 100 "Upgrade delay [s]";
  parameter SI.Time downDelay = 250 "Downgrade delay [s]";
  
  // --- Input (Irradiance) ---
  RealInput G "Irradiance [W/m2]"
  annotation(Placement(transformation(extent={{-120,-20},{-100,20}})));
  
  // --- Output (Normalized frequency) ---
  RealOutput freqNorm "Normalized compressor frequency (Hz/Fmax)"
  annotation(Placement(transformation(extent={{100,-20},{120,20}})));
  
  protected
  Integer desStep;
  Integer step;
  Real freqHz;
  SI.Time nextUpTime(start=0);
  SI.Time nextDownTime(start=0);
  
algorithm
  // Irradiance → desired step
  if G < E[1] then
    desStep := 0;
  elseif G < E[2] then
    desStep := 1;
  elseif G < E[3] then
    desStep := 2;
  elseif G < E[4] then
    desStep := 3;
  else
    desStep := 4;
  end if;
  
  // Initialization
  when initial() then
    step := 0;
    nextUpTime := time + upDelay;
    nextDownTime := time + downDelay;
  end when;
  
  // Upgrade step
  when {time >= pre(nextUpTime) and desStep > pre(step)} then
    step := min(pre(step) + 1, desStep);
    nextUpTime := time + upDelay;
  end when;
  
  // Downgrade step
  when {time >= pre(nextDownTime) and desStep < pre(step)} then
    step := max(pre(step) - 1, desStep);
    nextDownTime := time + downDelay;
  end when;
  
  // Compute frequency Hz → normalize
  freqHz := if step == 0 then 0.0 else F[step];
  freqNorm := freqHz / Fmax;
  
  annotation (
  Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,100}}),
  graphics={
  Rectangle(extent={{-100,-100},{100,100}}, lineColor={0,0,255}, fillColor={230,230,250}, fillPattern=FillPattern.Solid),
  Text(string="Compressor
Step Ctrl", extent={{-80,30},{80,-30}}, fontSize=12, lineColor={0,0,0}),
  Text(
  extent={{-90,48},{102,-74}},
  textColor={28,108,200},
  textString="ChillerCompCon
  ")}), Diagram(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,100}})));
end CompressorStepController;

解决思路建议

  • 修复变量属性访问问题:
    错误核心是OpenModelica尝试读取Integer/Boolean类型变量的nominal/min/max属性,但这些属性是Real类型变量的专属属性,不符合Modelica规范。可以给相关Integer变量显式添加nominal属性(绕过编译器bug):

    protected
      Integer desStep(nominal=1);
      Integer step(nominal=1);
      // 其余变量保持不变
    
  • 调整编译参数:
    针对开头的线性化阈值警告,添加编译参数--maxSizeLinearization=1000(可根据模型大小调整数值),避免生成有问题的代码。

  • 升级OpenModelica版本:
    该错误大概率是编译器的版本bug,尝试升级到最新稳定版的OpenModelica,看是否已修复Integer/Boolean变量的属性访问问题。

  • 单独调试模型:
    先单独编译CompressorStepController模型,确认是否能正常运行。如果单独编译没问题,再逐步集成其他模块,定位冲突来源。

  • 检查规范兼容性:
    确认模型代码严格符合Modelica规范,比如when语句的触发条件、变量初始化是否合理。例如给nextUpTime和nextDownTime添加fixed=true属性,确保初始值被正确使用:

    SI.Time nextUpTime(start=0, fixed=true);
    SI.Time nextDownTime(start=0, fixed=true);
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 06:35:55