通过OMShell调用/运行模型时出错&;奥皮顿-OpenModelica

通过OMShell调用/运行模型时出错&;奥皮顿-OpenModelica,modelica,openmodelica,pymodelica,Modelica,Openmodelica,Pymodelica,我使用维度模型放置我在许多不同模型中使用的系统参数,并使用扩展调用它们,而不是为每个模型再次声明它们。这是一个简单的例子,但实际上,我有更多的方法 一个简单的模型,结构如下: package Main model Dimensions final parameter Modelica.SIunits.Length x = 10; final parameter Modelica.SIunits.Length y = 5; end Dimensions; packa

我使用
维度模型
放置我在许多不同模型中使用的系统参数,并使用
扩展
调用它们,而不是为每个模型再次声明它们。这是一个简单的例子,但实际上,我有更多的方法

一个简单的模型,结构如下:

package Main

  model Dimensions
    final parameter Modelica.SIunits.Length x = 10;
    final parameter Modelica.SIunits.Length y = 5;
  end Dimensions;

  package Test_env
    extends Main.Dimensions;

    model Test_model
      Real z;
    equation
      z = x + y;
    end Test_model;

  end Test_env;
end Main;
如果我在OMEdit中运行此示例,它将毫无问题地工作。但是,如果我在OMShellOMPython/OMCSessionZMQ中运行它,它将不起作用

Q-可能我使用的
extends
子句不正确?如果是这样的话,有什么办法可以一次性声明参数并在其他模型中重用它们呢

这就是我在OMShell中得到的:

>> loadFile("D:/1.Modelica/Simulations/Main.mo")
true

>> getClassNames()
{Main}

>> getClassNames(Main)
{Dimensions,Test_env}

>> getClassNames(Main.Test_env)
{Test_model}

>> simulate(Main.Test_env.Test_model, startTime=0, stopTime=1, numberOfIntervals=500, tolerance=1e-4, method="dassl", outputFormat="mat"); getErrorString()
record SimulationResult
    resultFile = "",
    simulationOptions = "startTime = 0.0, stopTime = 1.0, numberOfIntervals = 500, tolerance = 0.0001, method = 'dassl', fileNamePrefix = 'Main.Test_env.Test_model', options = '', outputFormat = 'mat', variableFilter = '.*', cflags = '', simflags = ''",
    messages = "Failed to build model: Main.Test_env.Test_model",
    timeFrontend = 0.0110966,
    timeBackend = 0.0,
    timeSimCode = 0.0,
    timeTemplates = 0.0,
    timeCompile = 0.0,
    timeSimulation = 0.0,
    timeTotal = 0.0111225
end SimulationResult;
"[D:/1.Modelica/Simulations/Main.mo:3:5-3:45:writable] Error: Class Modelica.SIunits.Length not found in scope Main.Dimensions.
[D:/1.Modelica/Simulations/Main.mo:1:1-18:9:writable] Error: Class Test_env.Test_model not found in scope Main.
Error: Class Main.Test_env.Test_model not found in scope .
Error: Error occurred while flattening model Main.Test_env.Test_model
"
omc.sendExpression('simulate(Main.Test_env.Test_model, stopTime=1.0)')
---------------------------------------------------------------------------
{'resultFile': '',
 'simulationOptions': "startTime = 0.0, stopTime = 1.0, numberOfIntervals = 500, tolerance = 1e-006, method = 'dassl', fileNamePrefix = 'Main.Test_env.Test_model', options = '', outputFormat = 'mat', variableFilter = '.*', cflags = '', simflags = ''",
 'messages': 'Failed to build model: Main.Test_env.Test_model',
 'timeFrontend': 0.0018766,
 'timeBackend': 0.0,
 'timeSimCode': 0.0,
 'timeTemplates': 0.0,
 'timeCompile': 0.0,
 'timeSimulation': 0.0,
 'timeTotal': 0.0018919}
这是来自OMPython/OMCSessionZMQ的:

>> loadFile("D:/1.Modelica/Simulations/Main.mo")
true

>> getClassNames()
{Main}

>> getClassNames(Main)
{Dimensions,Test_env}

>> getClassNames(Main.Test_env)
{Test_model}

>> simulate(Main.Test_env.Test_model, startTime=0, stopTime=1, numberOfIntervals=500, tolerance=1e-4, method="dassl", outputFormat="mat"); getErrorString()
record SimulationResult
    resultFile = "",
    simulationOptions = "startTime = 0.0, stopTime = 1.0, numberOfIntervals = 500, tolerance = 0.0001, method = 'dassl', fileNamePrefix = 'Main.Test_env.Test_model', options = '', outputFormat = 'mat', variableFilter = '.*', cflags = '', simflags = ''",
    messages = "Failed to build model: Main.Test_env.Test_model",
    timeFrontend = 0.0110966,
    timeBackend = 0.0,
    timeSimCode = 0.0,
    timeTemplates = 0.0,
    timeCompile = 0.0,
    timeSimulation = 0.0,
    timeTotal = 0.0111225
end SimulationResult;
"[D:/1.Modelica/Simulations/Main.mo:3:5-3:45:writable] Error: Class Modelica.SIunits.Length not found in scope Main.Dimensions.
[D:/1.Modelica/Simulations/Main.mo:1:1-18:9:writable] Error: Class Test_env.Test_model not found in scope Main.
Error: Class Main.Test_env.Test_model not found in scope .
Error: Error occurred while flattening model Main.Test_env.Test_model
"
omc.sendExpression('simulate(Main.Test_env.Test_model, stopTime=1.0)')
---------------------------------------------------------------------------
{'resultFile': '',
 'simulationOptions': "startTime = 0.0, stopTime = 1.0, numberOfIntervals = 500, tolerance = 1e-006, method = 'dassl', fileNamePrefix = 'Main.Test_env.Test_model', options = '', outputFormat = 'mat', variableFilter = '.*', cflags = '', simflags = ''",
 'messages': 'Failed to build model: Main.Test_env.Test_model',
 'timeFrontend': 0.0018766,
 'timeBackend': 0.0,
 'timeSimCode': 0.0,
 'timeTemplates': 0.0,
 'timeCompile': 0.0,
 'timeSimulation': 0.0,
 'timeTotal': 0.0018919}

总结通过评论给出的答案:

在要扩展的模型中使用
扩展

 package Test_env
    model Test_model
      Real z;
      extends Main.Dimensions;
    equation
      z = x + y;
    end Test_model;
  end Test_env;
如果您的所有模型都需要相同的固定参数,那么将extend添加到每个模型中仍然是一个很好的做法,这样每个人都知道变量来自何处

还要与Modelica.Constants进行比较,以了解Modelica标准库如何定义常量。我用它创建了完整的示例:

package Main

  model Dimensions
    final constant Modelica.SIunits.Length x = 10;
    final constant Modelica.SIunits.Length y = 5;
  end Dimensions;

  package Test_env
    import Dim = Main.Dimensions;

    model Test_model
      Real z;
    equation
      z = Dim.x + Dim.y;
    end Test_model;

  end Test_env;
end Main;
如果您使用不同包中的内容(此处为
Modelica.SIunits.Length
),则需要加载该包。你的错误就是这么说的

Error: Class Modelica.SIunits.Length not found in scope Main.Dimensions.
在OpenModelica中,Modelica已在启动时加载,因此请在OMShell中使用
loadModel(Modelica)
loadFile(…)

>> loadModel(Modelica)
true

>> loadFile("Path/To/Main.mo")
true

>> simulate(Main.Test_env.Test_model, startTime=0, stopTime=1, numberOfIntervals=500, tolerance=1e-4, method="dassl", outputFormat="mat")
record SimulationResult
    resultFile = "C:/Users/USERNAME/AppData/Local/Temp/OpenModelica/Main.Test_env.Test_model_res.mat",
    simulationOptions = "startTime = 0.0, stopTime = 1.0, numberOfIntervals = 500, tolerance = 0.0001, method = 'dassl', fileNamePrefix = 'Main.Test_env.Test_model', options = '', outputFormat = 'mat', variableFilter = '.*', cflags = '', simflags = ''",
    messages = "LOG_SUCCESS       | info    | The initialization finished successfully without homotopy method.
LOG_SUCCESS       | info    | The simulation finished successfully.
",
    timeFrontend = 0.3193980510936645,
    timeBackend = 0.00467019998960375,
    timeSimCode = 0.001078686094233897,
    timeTemplates = 0.02625684206983937,
    timeCompile = 9.15578961474681,
    timeSimulation = 0.2440117147112652,
    timeTotal = 9.751522705140404
end SimulationResult;
>> 

您需要加载Modelica库:loadModel(Modelica);在加载文件之前。或者向包中添加uses注释。使用模型扩展包很奇怪。在测试模型中进行扩展。@Adrian。奇怪是一种轻描淡写的说法——Modelica规范不允许包从模型扩展。请参阅Modelica规范3.4中第7.1.3章对基类类型的限制。作为Modelica的新手,我觉得它很方便,所以我这样做了。尽管如此,如果我正确使用它,还是有一个问题,所以谢谢你的回答。