Modelica 如何使字符串可执行?

Modelica 如何使字符串可执行?,modelica,Modelica,我试图在Modelica中执行一个字符串。这个字符串将保存在一个变量中,以便在需要时可以更改它 function Test input String inComp="resistor.R:=2"; output String outComp; algorithm outComp:=inComp; end Test; 你能帮我吗 我用的是Dymola 我需要做的是以下几点 -从文本文件读取组件名称(或在执行函数时输入) -然后更改这些组件的参数。此代码是一个示例: func

我试图在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;

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

如果您想在Dymola中使用不同的参数值运行一系列模拟,我可以建议至少三种不同的方法继续

  • 使用DDE接口向Dymola发送命令。通过这种方式,您可以“以某种方式”(从Dymola外部)制定参数值,然后仅请求Dymola运行模拟。我不确定DDE接口有多丰富,因此我不确定它是否能满足您的需要(例如,获取结果)
  • 编写一个脚本文件。这与编写函数略有不同,但在语法上几乎相同。例如,要使用多个不同的惯性值运行“耦合离合器”示例,可以执行以下操作(在命令窗口中):
对于{1.0,1.1,1.2,1.5,1.8}循环中的j J1.J:=J; simulateModel(“Modelica.Mechanics.Rotational.Examples.CoupledClutchs”, resultFile=“CoupledClutches_u3;”+字符串(j)); 结束于;
  • 使用一个函数(就像以前一样),但使用修饰符调用simulateModel,例如
函数运行循环 算法 对于{1.0,1.1,1.2,1.5,1.8}循环中的j simulateModel(“Modelica.Mechanics.Rotational.Examples.CoupledClutches(J1(J=“+String(J)+”)”), resultFile=“CoupledClutches_u3;”+字符串(j)); 结束于; 末端运行回路;
  • 使用内置函数
    simulateExtendedModel
    simulateMultiExtendedModel
    ,这两个函数实际上与上面的函数基本相同,但使用的方式更简洁(在Dymola命令窗口中键入
    document(“simulateExtendedModel”)
    document(“simulateMultiExtendedModel”)
    ,以获取更多信息)

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

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

如果您想在Dymola中使用不同的参数值运行一系列模拟,我可以建议至少三种不同的方法继续

  • 使用DDE接口向Dymola发送命令。通过这种方式,您可以“以某种方式”(从Dymola外部)制定参数值,然后仅请求Dymola运行模拟。我不确定DDE接口有多丰富,因此我不确定它是否能满足您的需要(例如,获取结果)
  • 编写一个脚本文件。这与编写函数略有不同,但在语法上几乎相同。例如,要使用多个不同的惯性值运行“耦合离合器”示例,可以执行以下操作(在命令窗口中):
对于{1.0,1.1,1.2,1.5,1.8}循环中的j J1.J:=J; simulateModel(“Modelica.Mechanics.Rotational.Examples.CoupledClutchs”, resultFile=“CoupledClutches_u3;”+字符串(j)); 结束于;
  • 使用一个函数(就像以前一样),但使用修饰符调用simulateModel,例如
函数运行循环 算法 对于{1.0,1.1,1.2,1.5,1.8}循环中的j simulateModel(“Modelica.Mechanics.Rotational.Examples.CoupledClutches(J1(J=“+String(J)+”)”), resultFile=“CoupledClutches_u3;”+字符串(j)); 结束于; 末端运行回路;
  • 使用内置函数
    simulateExtendedModel
    simulateMultiExtendedModel
    ,这两个函数实际上与上面的函数基本相同,但使用的方式更简洁(在Dymola命令窗口中键入
    document(“simulateExtendedModel”)
    document(“simulateMultiExtendedModel”)
    ,以获取更多信息)

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

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

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

Modelica是否具有与其他各种语言支持的eval()功能等效的功能?如果是这样,你可以用它。但是如果可以避免的话,请不要这样做。Modelica是否具有与其他各种语言支持的eval()功能等效的功能?如果是这样,你可以用它。但是如果你能避免的话,请不要这样做。 for j in {1.0, 1.1, 1.2, 1.5, 1.8} loop J1.J := j; simulateModel("Modelica.Mechanics.Rotational.Examples.CoupledClutches", resultFile="CoupledClutches_"+String(j)); end for; function RunLoop algorithm for j in {1.0, 1.1, 1.2, 1.5, 1.8} loop simulateModel("Modelica.Mechanics.Rotational.Examples.CoupledClutches(J1(J="+String(j)+"))", resultFile="CoupledClutches_"+String(j)); end for; end RunLoop;