2

我在 Modelica 的 2D-CombiTimeTable 中使用了一个 .txt 文件 (T_in1) 作为输入。它包含一个大小为 (4,2) 的数组;第一列是时间,第二列是时间相关变量。我想对每个时间步的第二列求和或(求平均值)。如果在这方面有任何帮助,我将不胜感激。代码如下:

model integration
    import Modelica.Fluid.Types;


  Modelica.Blocks.Sources.CombiTimeTable T_in1(
    extrapolation=Modelica.Blocks.Types.Extrapolation.LastTwoPoints,
    fileName="C:/Users/Tin1.txt",
    smoothness=Modelica.Blocks.Types.Smoothness.LinearSegments,
    tableName="tab1",
    tableOnFile=true,
    timeEvents=Modelica.Blocks.Types.TimeEvents.Always,
    timeScale(displayUnit="min") = 60)                                                                                                                                                                                   annotation (
    Placement(visible = true, transformation(origin={-61,32.2828},     extent = {{-6, -6}, {6, 6}}, rotation = 0)));

equation 
 for i in 1:3 loop
  ...
  ...   
 end for;
  annotation (Icon(coordinateSystem(preserveAspectRatio=false)), Diagram(
        coordinateSystem(preserveAspectRatio=false)),
    experiment(StopTime=240, __Dymola_Algorithm="Dassl"));
end integration;
4

1 回答 1

0

得益于 Modelica 的内置模块,无需像其他环境那样使用 for 循环。我发现两个块的组合,称为采样器 (Modelica.Blocks.Discrete.Sampler) 和积分器 (Modelica.Blocks.Continuous.Integrator) 作为解决方案很有用。第一个命名的 bock 需要连接到 CombiTimeTable 并且积分器连接到采样器。这样,由于我将使用 CombiTimeTable 在每个点之间应用线性拟合,因此该解决方案是对每个时间段进行采样,然后对该值进行积分。由于其配置和模型定义,单独使用积分器不会提供接近预期结果的结果。以下是总结值的解决方案:

model integration
    import Modelica.Fluid.Types;


  Modelica.Blocks.Sources.CombiTimeTable T_in1(
    extrapolation=Modelica.Blocks.Types.Extrapolation.LastTwoPoints,
    fileName="C:/Users/Tin1.txt",
    smoothness=Modelica.Blocks.Types.Smoothness.LinearSegments,
    tableName="tab1",
    tableOnFile=true,
    timeEvents=Modelica.Blocks.Types.TimeEvents.Always,
    timeScale(displayUnit="min") = 60)                                                                                                                                                                                   annotation (
    Placement(visible = true, transformation(origin={-61,32.2828},     extent = {{-6, -6}, {6, 6}}, rotation = 0)));

  Modelica.Blocks.Discrete.Sampler sampler1(samplePeriod(displayUnit="min") = 60)
                                                              annotation(Placement(visible = true, transformation(origin={4,-64},      extent = {{-10, -10}, {10, 10}}, rotation = 0)));
  Modelica.Blocks.Continuous.Integrator integrator2 annotation(Placement(visible = true, transformation(origin={52,-66},    extent = {{-10, -10}, {10, 10}}, rotation = 0)));
equation 
 for i in 1:4 loop

 end for;
  connect(sampler1.y,integrator2. u) annotation(Line(points={{15,-64},{28,-64},{
          28,-66},{40,-66},{40,-66}},                                                                                color = {0, 0, 127}));
  connect(T_in1.y[1], sampler1.u) annotation (Line(points={{-54.4,32.2828},{-54.4,
          -64},{-8,-64}}, color={0,0,127}));
  annotation (Icon(coordinateSystem(preserveAspectRatio=false)), Diagram(
        coordinateSystem(preserveAspectRatio=false)),
    experiment(StopTime=40500, __Dymola_Algorithm="Dassl"));
end integration;

***然而,仍然存在的问题是如何在每个时间步取平均值?

于 2020-10-04T16:59:21.153 回答