3

嗨 Modelica 社区,

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

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

有人可以为我提供一个示例或一段代码来说明如何在 JModelica 中实现这一点吗?

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

感谢您的时间,

贾斯汀

4

1 回答 1

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编译选项。

于 2017-03-08T14:35:26.250 回答