【问题标题】:Modelica: when initial print only onceModelica:初始打印时只打印一次
【发布时间】:2019-03-31 21:47:10
【问题描述】:

我在系统模型中多次使用的组件内有以下 Modelica 代码:

parameter fileName = "world.log"
equation  
  when initial() then
    if not Modelica.Utilities.Files.exist(fileName) then
      Streams.print("Hello World", fileName);
    end if;
  end when;

我希望在创建的文件中准确找到一行代码,但通常会打印 5 行或更多行,但有时它似乎可以按预期工作。在 Windows 10 上使用 Dymola 2019。 有人可以澄清发生了什么吗?文件存在性检查似乎不可靠!?

【问题讨论】:

    标签: initialization modelica dymola utilities


    【解决方案1】:

    根据之前的答案和 cmets,以下似乎可行:

    parameter fileName = "world.log"
    protected 
    Modelica.SIunits.Time startTime;
    
    equation  
      when initial() then
        startTime := time;
      end when; 
      when time >= startTime then
        if not Modelica.Utilities.Files.exist(fileName) then
          Streams.print("Hello World", fileName);
        end if;
      end when;
    

    【讨论】:

      【解决方案2】:

      when initial() 根本与事件无关。它被转换为一个初始方程,因此可以执行多次。当只执行一次方程时,外部对象要可靠得多。

      【讨论】:

      • 这已经有所帮助,谢谢。像when time == 0 then 这样的东西可以工作吗?存在性检查有什么问题?
      • 存在检查不知道是什么问题。但是,如果您只是在包本身中引用文件 world.log,我认为模拟不会在那个地方寻找它(模拟可能在某个地方的临时目录中运行,您应该使用 modelica:// URI 并加载运行时的路径)。也许when time > startTime 会起作用(尽管该变量不存在并且开始时间通常是未知的......)== 0 不会起作用,因为在初始步骤中自time==0 以来不会有正边,但是在初始化期间您将无法运行该函数。
      • 使用when time >= startTime 可能更有意义?根据 Modelica 规范 3.4 第 99 页,并通过 Dymola 显示的警告指示,只有 >=< 生成时间事件。在我看来,在这种情况下,时间事件似乎更有效、更可靠。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-27
      • 1970-01-01
      • 2021-01-30
      • 1970-01-01
      • 1970-01-01
      • 2015-11-09
      • 2018-12-25
      相关资源
      最近更新 更多