如何通过PyFMI从FMU中读取Modelica标准库(MSL)版本号?
如何通过PyFMI读取FMU中的MSL版本号
问题背景
我希望通过PyFMI从FMU中读取Modelica标准库(MSL)的版本号。MSL版本信息存储在包的description-string中(属于Modelica语言注释,详见Modelica规范3.5版第2.2节),对应代码示例:
MSL/Modelica/package package within; package Modelica "Modelica Standard Library - version 3.2.2" extends Modelica.Icons.Package;
目前PyFMI的model.get_variable_description()仅支持读取变量的description-string,无法读取包、模型或模块的文档字符串,想知道有没有适用的函数?
另外一种思路是在Modelica代码中读取包的description-string并存储为字符串常量/参数,再通过model.get()从FMU读取,但不知道如何在Modelica中实现这一步?
解决方案
方案一:解析FMU内部的模型描述文件
PyFMI没有直接提供读取包/模型级description-string的API,但可以通过解压FMU并解析内部的modelDescription.xml文件来提取信息:
- FMU本质是zip压缩包,用Python的
zipfile模块解压后找到modelDescription.xml - 用XML解析库(如
xml.etree.ElementTree)定位到包含MSL版本的描述字段 - 根据XML结构提取版本信息
示例代码:
import zipfile import xml.etree.ElementTree as ET def extract_msl_version(fmu_file_path): with zipfile.ZipFile(fmu_file_path, 'r') as fmu_zip: if 'modelDescription.xml' not in fmu_zip.namelist(): return None with fmu_zip.open('modelDescription.xml') as xml_file: tree = ET.parse(xml_file) root = tree.getroot() # 优先检查根节点的description属性 root_desc = root.get('description', '') if 'version' in root_desc: return root_desc.split('version ')[-1].strip() # 遍历组件节点查找Modelica包的描述 for component in root.findall('.//Component'): if component.get('name') == 'Modelica': comp_desc = component.get('description', '') if 'version' in comp_desc: return comp_desc.split('version ')[-1].strip() return None
方案二:在Modelica代码中预存版本参数
通过Modelica代码将MSL版本信息存储为可访问的参数,再通过PyFMI读取:
- 依赖内部工具函数(部分编译器支持):使用
Modelica.Utilities.Internal.Package.getPackageInfo获取包的描述信息(该函数在Dymola等编译器中可用) - 手动指定(兼容性更好):直接将版本号写为常量参数,避免依赖内部API
示例Modelica代码:
model TargetModel // 方法1:通过内部函数获取(需编译器支持) parameter String msl_version = Modelica.Utilities.Internal.Package.getPackageInfo("Modelica").description; // 方法2:手动指定版本(兼容性更强) // parameter String msl_version = "3.2.2"; equation end TargetModel;
编译为FMU后,即可通过PyFMI的model.get("msl_version")读取该参数值。
注意:Modelica.Utilities.Internal.Package属于非标准内部模块,不同Modelica编译器的支持情况有差异,优先推荐手动指定版本的方式。
内容的提问来源于stack exchange,提问作者janpeter
相关产品推荐
相关产品推荐

