暂停JModelica并在模拟过程中传递增量输入

暂停JModelica并在模拟过程中传递增量输入,modelica,openmodelica,fmi,jmodelica,Modelica,Openmodelica,Fmi,Jmodelica,嗨,莫德里卡社区 我想在JModelica中并行运行两个模型,但我不确定如何在模型之间传递变量。一个模型是python模型,另一个是EnergyPlastOfMu模型 JModelica文档中的示例具有在模型模拟之前定义的完整模拟周期输入。我不明白如何配置暂停输入的模型,这是FMU和联合仿真的一个关键特性 有人能给我提供一个示例或一段代码来说明如何在JModelica中实现这一点吗 我是否将simulate命令放入循环中?如果是这样,我如何处理预热期和初始化而不丢失以前时间段的数据 谢谢你抽出时

嗨,莫德里卡社区

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

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

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

我是否将simulate命令放入循环中?如果是这样,我如何处理预热期和初始化而不丢失以前时间段的数据

谢谢你抽出时间


贾斯汀

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

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

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)
现在,我编写了一个小函数来获取系统的状态,
xk

# 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\u initial\u equations”:True
编译选项。

您想在每个模型在单独的流程中运行的情况下执行模拟,还是在流程中运行它们并在它们之间交换信息就可以了?您是否考虑过在联合仿真FMU上使用do_step方法?嗨@ChristianAndersson,谢谢您的支持。我相信do_step可能就是我想要的。我已经使用帮助(do_步骤)获取了一些信息,但是我不熟悉这个命令,是否有其他地方可以获取关于这些命令的文档?此外,我注意到变量集和get的行为异常。当我“设置”一个变量时,我注意到FMU结果中的变化,但当我“获取”同一个变量时,返回值不是设置的值。这是常见的行为吗?我将尝试在另一个FMU上重复此行为,但很好奇您是否能提供见解。我建议您查看一下标准规范()并查看其中的方法do_步骤。另外请注意,标准有1.0版和2.0版,因此您必须检查您的FMU遵循哪个版本。关于set/get的行为,根据标准,除非调用do_步骤方法,否则不会更新值。嗨,Joakim,非常有趣的答案。我可以肯定地看到这段代码非常有用。然而,我发现有一个内置函数调用
do_step
,它以类似的方法进行迭代。然而,我认为您的代码是独一无二的,并且在其他情况下可能更强大。它非常方便,因为它还可能允许更改循环中的状态。另一种可能是使用ME2方法:
get_fmu_state()
set_fmu_state()
。见: