有史以来第一个 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 欢迎任何帮助或建议!干杯和感谢, 蒂斯
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]
[package]
/
[relative-file-path]
package
的位置
必须加载引用的类
loadResource()
loadResource("modelica://Modelica/")
loadResource("modelica://Modelica")
ModelicaServices.ExternalReferences.loadResource()
相当于
Modelica.Utilities.Files.loadResource()
,但我建议使用后者。 Modelica
库对用户可见。 ModelicaSerivces
也会在启动时由 Dymola 自动加载,但它在包浏览器中是隐藏的。我建议在 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 库中打包的资源构建文件路径,包括当前包或其子目录(不是父目录)。