基于FMI标准从PAR文件初始化FMU参数的合规方案问询
从PAR文件初始化FMU参数的FMI合规实现方案
核心实现路径(完全符合FMI标准)
FMI本身未内置PAR文件解析的原生规范,但可以通过两种简便且合规的方式达成需求:
1. 将PAR解析逻辑嵌入FMU内部(推荐方案)
把PAR文件的读取、解析和参数赋值逻辑直接集成到FMU的模型代码中,具体步骤:
- 在FMU源代码中添加模块:指定固定目录(如
./config/params.par)或通过环境变量动态读取PAR文件路径 - 解析PAR文件的键值对(适配常见格式,如
param_name=value,跳过注释行) - 在FMU实例化阶段(FMI2对应
fmi2Instantiate,FMI3对应fmi3Instantiate)自动调用参数setter函数完成赋值 - 重新打包FMU,确保解析逻辑被包含在二进制文件或资源目录中
这种方式完全符合FMI标准,因为FMI允许模型在实例化阶段执行自定义初始化逻辑,只要接口函数遵循规范即可。
2. 基于FMI参数配置的外部转换方案
若不想修改FMU源代码,可借助FMI的参数配置扩展机制:
- 将PAR文件中的参数映射为FMI兼容的变量名格式,生成XML/JSON配置文件
- 在FMU实例化前,用脚本(如Python)将PAR文件转换为FMI配置格式,批量调用
fmi2SetReal/fmi2SetInteger等接口赋值 - 部分工具支持将配置后的FMU状态保存为快照,生成预配置的可直接使用的FMU实例
验证用代码示例(基于FMPy)
可先用FMPy编写测试脚本验证逻辑,再移植到FMU内部代码:
def parse_par_file(par_file_path): params = {} with open(par_file_path, 'r') as f: for line in f: line = line.strip() if not line or line.startswith('#') or '=' not in line: continue key, value = line.split('=', 1) # 自动识别参数类型 try: params[key] = float(value) except ValueError: if value.lower() in ['true', 'false']: params[key] = value.lower() == 'true' elif value.isdigit(): params[key] = int(value) else: params[key] = value return params # 加载PAR并赋值给FMU from fmpy import read_model_description, instantiate_fmu, free_fmu model_desc = read_model_description('target_model.fmu') par_params = parse_par_file('./config/params.par') fmu_instance = instantiate_fmu('target_model.fmu') for var_name, var_value in par_params.items(): var = next(v for v in model_desc.modelVariables if v.name == var_name) if var.type == 'Real': fmu_instance.setReal([var.valueReference], [var_value]) elif var.type == 'Integer': fmu_instance.setInteger([var.valueReference], [var_value]) elif var.type == 'Boolean': fmu_instance.setBoolean([var.valueReference], [var_value]) elif var.type == 'String': fmu_instance.setString([var.valueReference], [var_value]) # 可选:保存预配置状态,生成可直接使用的FMU实例 fmu_instance.saveState('preconfigured_state.bin') free_fmu(fmu_instance)
关键注意事项
- 确保PAR文件中的参数名与FMU模型变量名完全一致,避免赋值失败
- 联合仿真类型的FMU需在
initialize阶段前完成参数赋值,严格遵循FMI生命周期规范 - FMI3标准可使用
fmi3SetVariable统一接口,简化不同类型参数的赋值逻辑
内容的提问来源于stack exchange,提问作者Akhil Nandan
相关产品推荐
相关产品推荐

