问题标签 [openmodelica]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
970 浏览

package - 如何编译和模拟作为 JModelica 软件包一部分的 modelica 模型?

我的问题类似于janpeter的问题。我研究了Tiller 的电子书,并尝试使用OpenModelicaJModelica模拟示例“架构驱动方法”。我在 OpenModelica 中尝试了最小的示例“BaseSystem”,它工作正常。但是对于 JModelica 1.14 版,我在编译过程中遇到错误并且我的脚本失败。我的python脚本是:

我的问题是如何编译和模拟作为包一部分的模型?

0 投票
3 回答
2022 浏览

max - modelica:计算随时间变化的连续变量的最小值/最大值

如上所述:我希望随时间计算连续变量的最小值(和/或最大值)。这是一个演示的最小示例:

u是任意连续变量(出于演示目的,一个简单的正弦波)。 u_min/u_max是随时间变化的最小值/最大值。

显然预期的结果是u_min=-1u_max=1。不幸的是,模拟因“矩阵奇异!”而崩溃。错误。谁能指导我如何避免这种情况?


编辑 1

我正在使用 OpenModelica 1.15(原为 1.9.2)

编辑 2

由于我对 Modelica 很陌生,我很难理解以下方法之间的区别:

  1. u_min = if noEvent(u < u_min) then u else pre(u_min);
  2. if noEvent(u < u_min) then u_min = u; else u_min = pre(u_min); end if;
  3. u_min = if noEvent(u < u_min) then u else u_min;
  4. u_min = if u < u_min then u else pre(u_min);
  5. u_min = if u < u_min then u else u_min;
  6. when u < u_min then u_min = u; end when;
  7. u_min + T*der(u_min) = if u <= u_min then u else u_min;

1 和 2 是等效的,并导致预期的行为。

3 产生了预期的结果,但给出了关于“代数循环”的“翻译通知”,为什么?

4 到目前为止失败,结果u_min曲线与u?!为什么?

5 结合了 3 和 4。

6 编译失败Sorry - Support for Discrete Equation Systems is not yet implemented

7 我不清楚这背后的想法是什么,但如果T是建议的大小,它就可以工作。

如果我正确理解了 Modelica 文档,那么 1-5 的共同点是始终只有一个方程处于活动状态。noEvent在指定的过零处抑制事件生成。我的印象是,这主要是提高效率。为什么忽略它会导致 4 失败?pre指的是变量的前一个值,所以我想如果我们想保持一个变量不变,那是有道理的,但是为什么没有它 7 可以工作呢?我的理解when是,它的方程只在那个精确的事件中有效,否则保持以前的值,这就是我尝试在 6 中使用它的原因。如果我与常数值进行比较,它似乎有效(这对这个特殊的问题)。

编辑3

  1. u_min = smooth(0, if u < u_min then u else pre(u_min));

有趣的是,这也有效。

0 投票
2 回答
255 浏览

modelica - 在 Dymola 中通过 SBF 管理 Navier-Stokes PDE

有没有人尝试在 Modelica 中实现 Navier Stokes 偏微分方程(PDE)?我找到了空间基函数 (SBF) 的方法,该方法通过数值修改得到了 Dymola 可以处理的常微分方程 (ODE)。

问候,

胜利者

0 投票
1 回答
447 浏览

modelica - 在 Modelica 中构建简单的 DCDC 转换器的问题

我想为 DCDC 转换器编写一个非常简单的模型。出于某种原因,Dymola 告诉我“模型不是合适的”并且对于 Real 元素过度确定。

这可能是一个非常简单的问题,但我看不到!

这是我的代码:

希望有人可以在这里解决我的问题。先感谢您!

编辑:在得到答案后,我决定稍微改变一下我的模型,因为我需要转换器用于混合(能源/电力)供应。生成的转换器在以下代码中给出:

如果我使用两个简单的恒流源和一个恒流负载来测试转换器,我会再次遇到奇点错误。Dymola 2015 告诉我,可能存在无法确定的基础,但事实并非如此。

代码产生以下模型。(恒定电流负载来自 Modelica_EnergyStorages 库)

在此处输入图像描述

希望你能以某种方式帮助我解决这个问题!提前致谢!

0 投票
1 回答
1630 浏览

modelica - 如何在 Modelica 中读取时间序列数据文件

我需要在 Modelica 中读取时间序列数据(例如 csv),特别是使用开放的 modelica 编译器 (omc)。我做了一些互联网搜索,并在网上找到了一个ncReader 库。它适用于 dymola,但不适用于开放的 modelica 编译器。我的测试代码是这样的:

当我尝试在打开的 modelica 上运行它时,我收到以下错误:

翻译 09:21:41 0:0-0:0 构建模拟器时出错。构建日志:gcc -falign-functions -msse2 -mfpmath=sse -I"C:/OpenModelica1.9.0//include/omc" -I。-DOPENMODELICA_XML_FROM_FILE_AT_RUNTIME -c -o TimeSeries.NcTest.o TimeSeries.NcTest.c TimeSeries.NcTest.c:19:28: 错误: ncDataReaderEA.h: 没有这样的文件或目录 mingw32-make: *** [TimeSeries.NcTest.o ] 错误 1

我认为它在 dymola 上工作的原因是因为 dymola 使用 C 编译器,并且可能会即时编译库的 c 文件。不幸的是,我必须使用开放模型。

如果可以修复此错误以与开放式 modelica 编译器一起使用,或者如果在 modelica(开放式 modelica 编译器)中有任何其他替代读取时间序列数据文件的替代方法,任何人都可以提供帮助吗?

提前致谢

0 投票
0 回答
94 浏览

modelica - 具有组合起始值的 FluidPort 连接器

我正在使用 OpenModelica 进行多组分流体的过程模拟。我注意到在某些情况下初始化失败是由于(当组合向量 X 设置为零数组作为求解初始非线性方程组的初始估计时)。为避免这种情况,我必须如下声明我的连接器

Nb:我的初始条件是一致的并且是充分的。我的问题是非线性解决方案的初始猜测。

Modelica 中的 FluidPort 连接定义不应该自动包含具有正确起始值的猜测值吗?(我正在使用最新的 Modelica 3.2.1 库)

0 投票
1 回答
580 浏览

simulation - 如何在 Modelica 中对液压缸的机械停止建模?

我想知道如何最有效地模拟机械停止。

我在 OpenModelica 中使用受控液压缸进行液压模拟。对于液压缸,我使用sweptVolumeModelica 标准库中的模型。
这个模型让我烦恼的是,如果活塞到达气缸底部,就没有机械停止。

我尝试了几个想法,但没有好的结果。我试图通过 if 表达式将活塞的位移重置为零,如果它触及底部。但这并不是一个好的选择,因为体积是使用活塞的位移计算的。

然后,如果活塞撞到挡块,我尝试引入一个等于施加在活塞上的力的力。此选项也不起作用,因为在这种情况下无法计算气缸内的压力。

第三次尝试是使用MSL模型MassWithStopAndFriction链接到模型的平移法兰sweptVolume,但是这个模型对我来说似乎坏了。

现在我指望你们作为一个有能力的社区为我带来更多的想法来测试。

0 投票
1 回答
828 浏览

openmodelica - FMU FMI 模拟,初始化后不评估某些方程

我相信我的问题与之前的问题有关,但我无法用他们的建议解决我的问题。

这是一个最小的非工作示例。我有一个简单的电路,里面有一个换向开关(在 openModelica 中开发)。我想根据输入参数的值修改switch.control的值。为此,我有以下内容:

注意:我尝试了参数,输入等之间的许多组合......

我想做一个迭代模拟(例如模拟 60 秒的系统,但 60 次连续模拟 1 秒)。这是为了能够根据另一个 FMU 模拟更改输入值( openclose )。

因此,我可以修改来自 pyFMI 的输入值。(当我阅读它时,已将更改考虑在内)。但是,我的方程式中也没有考虑“新值”。

这是我的 pyfmi 脚本:

基本上我在 50 个单位时间内进行模拟,然后更改openclose变量的值,然后再次模拟,再次切换并重新模拟。结果我得到:

实际上,只有在第一次调用之前创建的集合才会model.simulate(...)在系统中传播其值。

我试图理解这里annotation(Evaluate = false)提出的建议,但没有奏效。我不确定它是否相关,因为我实际上可以改变我的价值。问题是基于此参数的方程似乎只在初始化期间评估:-/

任何想法/帮助都会非常受欢迎......

0 投票
1 回答
1042 浏览

simulation - 两相 Modelica Media 示例

我正在尝试在 OpenModelica 中开发具有单一物质(液体或蒸汽)的流动模拟。Modelica.Media.Water 模型确实有两个阶段,但非常复杂,并且很难复制完全不同的物质。我想找到一个可以使用的两相介质的简单示例。有一个部分包 TemplateMedium 和一个部分包 PartialTwoPhaseMedium,但我没有看到任何关于如何编写可以处于两个阶段中的任何一个的全新媒体的示例。
如果有人可以提供一个简单的示例,或者只是列出所需的最小属性和方程式列表,作为起点将非常有帮助。

为了解决评论中的一些问题:我刚刚开始使用这个模型,所以我试图了解如何构建媒体模型的细节,以及我的细节包含在模型中与必须添加的内容每个新媒体。我使用丙烯,所以有很好的数据可用。这是 CoolProp 中包含的媒体之一,因此能够使用 ExternalMedia 和 CoolProp 将非常有用,但我相信这些还不能与 OpenModelica 一起使用,从许多评论和错误报告来看。

0 投票
1 回答
822 浏览

modelica - 来自字符串的可替换函数和函数调用

以下三个问题捆绑在一起,所以请原谅帖子的长度。

使用 Dymola 2016。

在模型中使用可替换的函数调用为用户提供了拥有下拉选项的机会。下面的例子:

在函数中执行相同的可替换函数调用似乎不允许与调用函数相同的下拉功能(即在包浏览器中右键单击调用函数。我认为这是故意的,因为通常在其他函数/模型中调用函数. 示例如下:

问题 #1。是否可以像使用模型一样在函数中使用可替换的函数调用?如果是这样,适当的语法是什么?替代方法?

或者,另一种选择是在模型中执行可替换的函数调用,然后将结果传递给另一个函数,然后由该函数进行适当的调用。示例如下所示:

它将参数 x 和函数句柄 a 传递给:

问题2。这在 Modelica 中是否允许,如果允许,如何?替代方法?

问题 #3。是否可以定义一个字符串并将其转换为函数的名称。下面的例子:

先感谢您!感谢您的反馈,因为我将继续探索 Modelica 的使用。