You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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读取:

  1. 依赖内部工具函数(部分编译器支持):使用Modelica.Utilities.Internal.Package.getPackageInfo获取包的描述信息(该函数在Dymola等编译器中可用)
  2. 手动指定(兼容性更好):直接将版本号写为常量参数,避免依赖内部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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 15:18:03