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
相关产品推荐
相关产品推荐

