嗨,Modelica社区,
我想在JModelica中并行运行两个模型,但我不确定如何在模型之间传递变量。一个模型是python模型,另一个是EnergyPlusToFMU模型。
JModelica文档中的示例在模拟模型之前定义了完整的模拟周期输入。我不明白如何配置一个暂停输入的模型,这是FMU和协同模拟的一个关键特性。
谁能给我提供一个例子或一段代码,说明如何在JModelica中实现这一点?
我要把模拟命令放在循环中吗?如果是这样,我如何处理预热周期和初始化,而不会在之前的时间步中丢失数据?
谢谢您抽时间见我,
贾斯汀
发布于 2017-03-08 22:35:26
回答晚了,但以防它被其他人拿到...
你确实可以把模拟放到一个循环中,你只需要跟踪系统的状态,这样你就可以在每次迭代时重新初始化它。考虑以下示例:
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编译选项。
https://stackoverflow.com/questions/39216764
复制相似问题