如何使用FMPy提取连续时间状态列表?能否同时获取离散时间状态?
在FMPy中获取连续/离散时间状态字典实现断点续仿
FMPy没有提供PyFMI那样直接的get_states_list()函数,但可以通过解析FMU的模型描述筛选变量,构建连续/离散状态字典,甚至可以同时获取两者。
获取连续时间状态字典
通过模型描述筛选本地因果性+连续可变性的变量,即可得到连续状态列表,进而构建状态字典:
代码示例
from fmpy import read_model_description, extract, instantiate_fmu # 读取FMU的模型描述 model_desc = read_model_description('your_model.fmu') # 筛选连续状态变量 continuous_vars = [var for var in model_desc.variables if var.causality == 'local' and var.variability == 'continuous'] # 初始化连续状态字典 continuous_state_dict = {var.name: None for var in continuous_vars} # 提取并实例化FMU unzip_dir = extract('your_model.fmu') fmu = instantiate_fmu(unzip_dir, model_desc) # 初始化仿真流程 fmu.setupExperiment(startTime=0) fmu.enterInitializationMode() fmu.exitInitializationMode() # 仿真到目标时间点 fmu.doStep(currentCommunicationPoint=0, communicationStepSize=10) # 更新字典为当前仿真的最终状态值 for var in continuous_vars: continuous_state_dict[var.name] = fmu.getReal([var.valueReference])[0]
同时获取离散时间状态字典
离散状态变量满足本地因果性,且可变性为discrete或event,需要根据变量类型(Real/Integer/Boolean)分别读取值:
代码示例
# 筛选离散状态变量 discrete_vars = [var for var in model_desc.variables if var.causality == 'local' and var.variability in ['discrete', 'event']] # 初始化离散状态字典 discrete_state_dict = {var.name: None for var in discrete_vars} # 更新字典为当前仿真的最终状态值 for var in discrete_vars: vr = [var.valueReference] if var.type == 'Real': discrete_state_dict[var.name] = fmu.getReal(vr)[0] elif var.type == 'Integer': discrete_state_dict[var.name] = fmu.getInteger(vr)[0] elif var.type == 'Boolean': discrete_state_dict[var.name] = fmu.getBoolean(vr)[0]
基于状态字典实现断点续仿
重置FMU后,将保存的状态值重新设置到模型中,即可从上次结束的时间点继续仿真:
# 重置FMU fmu.reset() # 恢复连续状态 for var in continuous_vars: fmu.setReal([var.valueReference], [continuous_state_dict[var.name]]) # 恢复离散状态 for var in discrete_vars: vr = [var.valueReference] val = discrete_state_dict[var.name] if var.type == 'Real': fmu.setReal(vr, [val]) elif var.type == 'Integer': fmu.setInteger(vr, [val]) elif var.type == 'Boolean': fmu.setBoolean(vr, [val]) # 继续仿真(从上次结束时间点开始) fmu.doStep(currentCommunicationPoint=10, communicationStepSize=10)
内容的提问来源于stack exchange,提问作者janpeter
相关产品推荐
相关产品推荐

