【问题标题】:Pause JModelica and Pass Incremental Inputs During Simulation在仿真期间暂停 JModelica 并传递增量输入
【发布时间】:2016-08-29 23:38:48
【问题描述】:

嗨 Modelica 社区,

我想在 JModelica 中并行运行两个模型,但我不确定如何在模型之间传递变量。一个模型是 python 模型,另一个是 EnergyPlusToFMU 模型。

JModelica 文档中的示例在模型仿真之前定义了完整的仿真周期输入。我不明白如何配置一个暂停输入的模型,这是 FMU 和协同仿真的一个关键特性。

谁能提供一个示例或一段代码来说明如何在 JModelica 中实现这一点?

我是否将模拟命令置于循环中?如果是这样,我如何在不丢失先前时间步长的数据的情况下处理预热期和初始化?

感谢您的宝贵时间,

贾斯汀

【问题讨论】:

  • 您想执行一个模拟,其中每个模型都在单独的进程中运行,还是可以在进程中运行并在它们之间交换信息?有没有考虑只在协同仿真 FMU 上使用 do_step 方法?
  • 嗨@ChristianAndersson,感谢您的信赖。我相信 do_step 可能是我正在寻找的。我已经使用 help(do_step) 来获取一些信息,但我不熟悉这个命令,是否有地方可以获取有关这些命令的其他文档?此外,我注意到变量的 set 和 get 表现得很奇怪。当我“设置”一个变量时,我注意到 FMU 结果的变化,但是当我“获取”相同的变量时,返回的不是设置的值。这是常见的行为吗?我将尝试在另一个 FMU 上重复此行为,但很好奇您能否提供见解。
  • 我建议查看标准规范 (fmi-standard.org/downloads) 并查看那里的方法 do_step。另请注意,该标准有 1.0 版和 2.0 版,因此您必须检查您的 FMU 遵循哪个版本。关于 set/get 的行为,按照标准,除非调用 do_step 方法,否则不会更新值。

标签: modelica openmodelica fmi jmodelica


【解决方案1】:

迟到的答案,但万一被别人捡到了……

您确实可以将模拟放入一个循环中,您只需要跟踪系统的状态,这样您就可以在每次迭代时重新启动它。考虑以下示例:

Ts = 100
x_k = x_0

for k in range(100):
    # Do whatever you need to get your input here
    u_k = ...

    FMU.reset()
    FMU.set(x_k.keys(), x_k.values())

    sim_res = FMU.simulate(
        start_time=k*Ts,
        final_time=(k+1)*Ts,
        input=u_k
    )

    x_k = get_state(sim_res)

现在,我编写了一个小函数来获取系统的状态x_k

# Get state names and their values at given index
def get_state(fmu, results, index):
    # Identify states as variables with a _start_ value
    identifier = "_start_"
    keys = fmu.get_model_variables(filter=identifier + "*").keys()
    # Now, loop through all states, get their value and put it in x
    x = {}
    for name in keys:
        x[name] = results[name[len(identifier):]][index]
    # Return state
    return x

这依赖于设置"state_initial_equations": True 编译选项。

【讨论】:

  • 嗨 Joakim,非常有趣的答案。我绝对可以看到这段代码有很多用处。但是,我发现有一个内置函数调用do_step,它以类似的方法进行迭代。但是,我认为您的代码是独一无二的,并且在其他情况下可能更强大。
  • 这非常方便,因为它还可能允许在循环中更改状态。另一种可能性是使用 ME2 方法:get_fmu_state()set_fmu_state()。见:jmodelica.org/assimulo_home/pyfmi_1.0/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-20
  • 1970-01-01
  • 1970-01-01
  • 2012-11-02
相关资源
最近更新 更多