Dymola 中的相对 (modellica://...) 路径名出现问题

问题描述 投票:0回答:2

有史以来第一个 Stack Overflow 帖子!

我正在 Dymola 2021x 工作,我正在尝试运行同事为我提供的模型。其中一个组件的 package.mo 文件正在加载一些文件

```fileName=ModelicaServices.ExternalReferences.loadResource("modelica://Master_Branch/components.../filename.mos")```

现在,据我了解,应该发生的是该路径中的“modelica://”是工作目录,这样无论我将项目文件夹放在哪里都可以找到资源。然而,发生的事情如下: 当我尝试模拟组件时,我在翻译过程中收到消息,提示找不到“modelica://...”引用的所有文件。我收到如下错误:

Not possible to open file "C:/Program Files/Dymola 2021x/Modelica/Master_Branch/modelica:/Master_Branch/.../filename.mos" for reading: Invalid argument

现在
我认为

发生的情况是程序无法识别 modelica:// 应该是工作目录,而是尝试在工作目录内查找目录 modelica:// 。 我的同事没有收到此错误。我们都不太熟悉 Dymola,所以我想知道是否有一些我可能遗漏的基本知识?作为参考,我正在使用的库是:

MSL3.2.3 ModelicaServices 3.2.3 AixLib 0.10.7 BuildingSystems 2.0.0-Beta Modelica_Synchronous 0.92.2 NCDataReader2 2.5 SDF 0.41 Modelica_DeviceDrivers 1.7.0 ExternData 2.5.0

我尝试查看 modelica 文档
https://specation.modelica.org/v3.4/Ch13.html

(13.2.3 外部资源)但没有从中得到太多,以及 load.Resource() 命令的文档,位于 https://doc.modelica.org/om/Modelica.Utilities.Files。 loadResource.html 欢迎任何帮助或建议!干杯和感谢, 蒂斯

filepath modelica dymola
2个回答
6
投票
ModelicaServices.ExternalReferences.loadResource()

不返回工作目录的路径。它有不同的目的 - 见下文。如果您加载的库列表是正确的,它将不起作用,因为您必须引用加载的类。

引用的错误消息看起来很奇怪。但如果没有不完整的示例,就很难在这种特定情况下提供帮助。不过,我会尝试提供一些可能有帮助的一般信息。

获取工作目录

要获取当前工作目录,请使用以下命令:

Modelica.Utilities.System.getWorkDirectory(); = "C:/tmp/dymola"

loadResource()的用法

loadResource()

允许您检索硬盘上 modelica 库存储的资源(非 modelica 文件)的绝对文件路径。典型用法是引用图像、脚本或数据集。

您可以例如通过以下调用获取 Modelica 库在硬盘上的位置:

import Modelica.Utilities.Files.loadResource; loadResource("modelica://Modelica/"); = "C:/Program Files/Dymola 2022x/Modelica/Library/Modelica 4.0.0/"

这将返回当前加载的 Modelica 库存储目录的绝对文件路径。现在您可以扩展此调用以引用资源:

loadResource("modelica://Modelica/Resources/Scripts/Dymola/Mechanics/Rotational/CoupledClutches.mos") = "C:/Program Files/Dymola 2022x/Modelica/Library/Modelica 4.0.0/Resources/Scripts/Dymola/Mechanics/Rotational/CoupledClutches.mos"

因此传递给
loadResource

的论点可以分解为:

[modelica-uri][top-level-package]/[relative-file-path]

与:

    [modelica-uri]
  • :modelica://
  • [package]
  • :当前加载的包的绝对类路径
  • /
  • :斜杠至关重要。来自 modelica 规范:
    任何在包名称后包含斜杠的 Modelica 方案 URI 都会被解释为对
    资源

  • [relative-file-path]
  • :文件路径,相对于
    package
    的位置
    
  • 请记住这一点:

必须加载引用的类
  • loadResource()
  • 不检查引用的文件是否存在
    使用正斜杠,同样在 Windows 上
  • 当您只引用没有资源的库时,不要忘记结尾的斜杠。
  • 这个有效:
      loadResource("modelica://Modelica/")
    • 这不起作用:
    • loadResource("modelica://Modelica")
    • 
      
  • ModelicaServices 与 Modelica.Utilities

ModelicaServices.ExternalReferences.loadResource()

相当于

Modelica.Utilities.Files.loadResource()
,但我建议使用后者。
Modelica
库对用户可见。
ModelicaSerivces
也会在启动时由 Dymola 自动加载,但它在包浏览器中是隐藏的。
    


0
投票

我建议在 Dymola 2023 中使用 MSL 4.0.0。当我在 Dymola 2023 中测试它时,Modelica.Utilities.Files.loadResource("") 返回 "",它指的是您的包目录,而不是如图所示的默认工作目录在 Dymola 2021 中,“C:/Users/yourName/Documents/Dymola/”。那么只要相对路径正确并且要加载的数据文件在包目录中,loadResource("") 函数就应该可以正常工作。

另请注意:Modelica.Utilities.Files.loadResource() 函数旨在为 Modelica 库中打包的资源构建文件路径,包括当前包或其子目录(不是父目录)。

© www.soinside.com 2019 - 2024. All rights reserved.