0

我正在尝试在 Modelica 中执行一个字符串。该字符串将保存在一个变量中,以便在需要时能够更改它。

function Test

input String inComp="resistor.R:=2";
output String outComp;


algorithm 


  outComp:=inComp;


end Test;

能否请您


我正在使用 Dymola。

我需要做的是以下。

- 从文本文件中读取组件名称(或在执行函数时输入它们) -然后更改这些组件的参数。此代码是一个示例:

function Test

input String inComp="resistor";  //Entered by the user, or read from a text file
output Real result;

algorithm 

  inComp.R :=2 ;  /*This is incorrect since it wouldn't understand that 
                    I want to enter : resistor.R := 2;  */

  result := inComp.R ; //In order to view the result

end Test;
4

2 回答 2

6

您尝试做的事情在 Modelica 中通常是不可能的。可能是某些工具有一个“反射 API”允许这样做(或者可能是一个内置函数,它接受一个命令字符串并执行它),但肯定没有跨工具工作的通用 API。

如果您想在 Dymola 中使用不同的参数值运行一堆模拟,我可以建议至少三个不同的想要继续。

  • 使用 DDE 接口向 Dymola 发送命令。通过这种方式,您可以“以某种方式”(从 Dymola 外部)制定参数值,然后只需请求 Dymola 运行模拟。我不确定 DDE 接口有多丰富,所以我不确定它是否能满足您的需求(例如获得结果)。
  • 编写脚本文件。这与编写函数有点不同,但语法几乎相同。例如,要使用几个不同的惯性值运行“CoupledCutches”示例,您可以这样做(在命令窗口中):
    对于 {1.0, 1.1, 1.2, 1.5, 1.8} 循环中的 j
      J1.J := j;
      模拟模型(“Modelica.Mechanics.Rotational.Examples.CoupledClutches”,
                    resultFile="CoupledClutches_"+String(j));
    结束;
  • 使用一个函数(就像你一样),但用修饰符调用模拟模型,例如
    函数运行循环
    算法
      对于 {1.0, 1.1, 1.2, 1.5, 1.8} 循环中的 j
        模拟模型("Modelica.Mechanics.Rotational.Examples.CoupledClutches(J1(J="+String(j)+"))",
                    resultFile="CoupledClutches_"+String(j));
      结束;
    结束运行循环;
  • 使用内置函数simulateExtendedModelsimulateMultiExtendedModel它们的作用与上面几乎相同,但方式更简洁(在 Dymola 命令窗口中键入document("simulateExtendedModel")document("simulateMultiExtendedModel")获取有关这些的更多信息)。

好的,这应该给你一个开始。如果无论出于何种原因这些都不起作用,只需使用您有的任何其他要求更新问题。

于 2011-07-04T16:58:57.480 回答
0

使用 Perl 等动态编写和执行某些脚本的不同选项。例如Text::Template可以用作模板引擎。我经常为 LaTeX 做这个。

于 2011-07-21T04:22:31.223 回答