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

thi*_*ose 2 filepath modelica dymola

第一篇 Stack Overflow 帖子!

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

```fileName=ModelicaServices.ExternalReferences.loadResource("modelica://Master_Branch/components.../filename.mos")```
Run Code Online (Sandbox Code Playgroud)

现在,据我了解,应该发生的是该路径中的“modelica://”是工作目录,这样无论我将项目文件夹放在哪里都可以找到资源。然而,实际发生的情况如下:

当我尝试模拟组件时,我在翻译过程中收到消息,提示找不到“modelica://...”引用的所有文件。我收到如下错误:

Not possible to open file "C:/Program Files/Dymola 2021x/Modelica/Master_Branch/modelica:/Master_Branch/.../filename.mos" for reading:
Invalid argument
Run Code Online (Sandbox Code Playgroud)

现在我认为发生的情况是程序无法识别 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
Run Code Online (Sandbox Code Playgroud)

我尝试在https://specation.modelica.org/v3.4/Ch13.html (13.2.3 外部资源)查看 modelica 文档, 但没有从中得到太多信息,以及加载的文档.Resource() 命令位于https://doc.modelica.org/om/Modelica.Utilities.Files.loadResource.html

欢迎任何帮助或建议!干杯和感谢,蒂斯

mar*_*rco 6

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

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

获取工作目录

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

Modelica.Utilities.System.getWorkDirectory();
 = "C:/tmp/dymola"
Run Code Online (Sandbox Code Playgroud)

loadResource() 的用法

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

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

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

这将返回当前加载的 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"
Run Code Online (Sandbox Code Playgroud)

因此传递给的参数loadResource可以分解为:

[modelica-uri][top-level-package]/[relative-file-path]
Run Code Online (Sandbox Code Playgroud)

和:

  • [modelica-uri]: 模型://
  • [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库对用户可见。ModelicaServicesDymola 也会在启动时自动加载,但它对包浏览器是隐藏的。