问题标签 [systemmodeler]
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.
modelica - 为什么连接器的图形注释在重新声明时不被继承?
我正在为系统动力学建模创建一个库,它与Cellier现有的免费库不同,它使用非因果连接器。对于“流” - 元素我有一个GenericFlow
定义接口的类:
洋红色FlowPort
连接器被声明为replaceable
- System Modeler 中的图标如下所示:
对于一些特殊情况,我将使用不同的端口,一个称为连接器SpecialFlowPort
的连接器被可视化为红色方块。举个例子,下面是一个名为的类Outflow
,它将重新声明用于其端口之一的连接器类(即 portA):
它的图标将自动显示已交换为 portA 的红色 SpecialFlowPort(在左侧):
但是,当我在新模型中使用此组件(拖放)时,它将显示两个洋红色端口,并且在悬停在端口上时 System Modeler 会将类名命名为FlowPort
- 而不是SpecialFlowPort
:
但是组件的行为是正确的,并且禁止将洋红色FlowPort
端口与所示的左侧端口连接。Outflow
难道我做错了什么?为什么在模型中使用重新声明的连接器的类的图形注释正确显示?
更新:
来自 Wolfram MathCore 的 Otto Tronarp 正确地指出,上面的示例并不完整,因为我没有包含图形注释(这通常会使代码不可读,但在这种情况下相当重要)。
因此,为了提供SSCCE,我将在此处包含他的示例:
Outflow
在 WSM 4.3 的模型图中使用此包中定义的类将显示错误的图形注释(例如,两个绿色而不是一个红色和一个绿色连接器)。
events - 如何在 Modelica 中使用布尔开关来防止库存低于零?
问题描述
我正在构建一个库来支持系统动力学 (SD),例如 Modelica 中的建模。与Cellier 等人免费提供的库不同。我相信人们可以很好地利用非因果连接器:通过连接器将库存价值作为“潜在”传输可以构建紧凑的组件(例如流程 = 流程)。
在 SD 中,我们可能会将物质(“大众”)股票与可能变为负数的信息股票区分开来。为了支持这一点,我对质量端口使用以下定义(这里给出 a 的定义StockPort
- 它的对应物 aFlowPort
将简单地具有布尔输入变量而不是输出变量,稍后给出):
布尔开关指示原料的每个端口是否允许填充或排放。
对于“材料库存”,该stopOutflow
开关应防止库存被排空到零以下。不幸的是,在下面的示例中,这将无法解决:库存将在略低于零的情况下耗尽。
使用连接器的最小示例
以下TestModel
使用这些构建块:
function constrainedRate( indicated rate, stopInflow, stopOutflow)
用于返回符合给定约束的速率(即布尔开关)connector StockPort
如上所述connector FlowPort
对应的StockPort
model MaterialStock
一种库存成分,其成分StockPort
不得低于零model LinearDecline
一个带有一个FlowPort
(即 Sink)的流量元素,它模拟以恒定速率(此处设置为 1)排出连接的库存
主模型简单地启动一个stock
与initialValue = 5
连接到process
线性下降的一个declineRate = 1
。
使用 DASSL 从 模拟模型StartTime = 0
揭示StopTime = 10
变量的预期行为stock.outflow.stock
:
不幸的是,该值略低于零t = 5.0
。
不知何故,事件(股票价值 <= 0)被检测到太晚了。我能做些什么?
(到目前为止,imo 不优雅的解决方法是使用when
事件(状态事件)reinit
将库存值归零。我在语句和布尔条件上使用noEvent
包装器的实验if
也没有成功。)
modelica - 在 Modelica 模拟中包含因果关系会导致模型展平时出现平移错误
我想模拟一个基于能量工作的质量弹簧模型的控制器:
但这会导致错误消息:
翻译错误
展平模型时出错
如果您能帮助我了解问题所在以及如何解决,我将不胜感激。
PS1。 SIMULINK也无法完成!
PS2。可以在这里看到新版本的代码。
P.S.3. According to this discussion on Discord, the algorithm
section was not really meant for casual relations. More information about the keyword is here.
runtime-error - 可以使用参数来设置组件的单位属性吗?
到目前为止,使用 Wolfram System Modeler 4.3 和 5.1 可以编译以下最小示例而不会出现错误:
但是随着 WSM 12.0 的新版本(版本的跳跃是由于与 Wolfram 的旗舰 Mathematica 的当前版本保持一致),我收到一条错误消息:
内部错误:Codegen.getValueString:非常量表达式:c.hasUnit
(注意:该错误是WSMLink'WSMSimulate
在内部运行 System Modeler 12.0 的 Mathematica 12.0 中给出的;这里询问"InternalValues"
上述模型的属性,因为我现在还没有安装 WSM 12.0)。
尝试在 OpenModelica [OMEdit v. 1.13.2 (64-bit)] 中模拟上述模型显示:
SimCodeUtil.mo: 8492:9-8492:218]: Internal error Unexpected expression (应该更早处理,可能在前端。Unit/displayUnit 表达式不是字符串文字:c.hasUnit
所以似乎设置单位属性我不能使用具有参数可变性的变量?为什么会这样 - 毕竟编译器在编译运行时可以硬连线单元就足够了(毕竟给定的模型将在 WSM 4.3 和 5.1 中运行而没有任何错误)?
编辑:从我的一个较旧问题的答案中,我相信至少可以使用最终参数来设置单位属性。进行最终修改(例如c( final hasUnit = "myUnit" )
,不能解决问题。
modelica - 可以使用内部/外部全局设置类型并且可以替换吗?
问题描述
我想在经济建模(例如系统动力学)中使用非国际单位制单位。虽然我当然可以花几秒钟(s)然后使用,但据我所知,在我主要使用的 System Modeler 中displayUnit
没有很好的方法来修改displayUnit的时间。
因此,在编写一个库时,我希望用户选择一个全局type
调用ModelTime
,理想情况下它会被声明为inner
某个replaceable
顶级类。然后模型中的任何组件都可以使用全局type
来一致地处理任何与时间相关的变量。
最小的例子
下面的例子展示了我想如何实现它。
package Units
声明了两种非国际单位制单位类型(Time_year
,Time_month
)package Interfaces
包含一个部分模型类GenericSimulationModel
,它将成为使用该库编写的任何模型的顶级范围。它应该提供type ModelTime
asinner
和replaceable
类package Components
定义一个简单的block
类,该类ModelTime
通过outer
定义来定义其在全局选择的时间单位中的output y
简单显示time
model Example
将所有这些联系在一起,以提供一个示例,使用该库的任何模型应该如何工作
这是代码:
虽然在 System Modeler 和 OpenModelica 中一切都编译没有错误,但不幸的是它没有成功:在Example
上面给出的模型中的组件 c 中没有使用重新声明的类型。
我能做些什么来实现我想做的事情?
modelica - 如何在可扩展连接器中使用灵活的阵列大小?
我想使用expandable connector
(例如类似总线的结构)来(主要)为更复杂的子系统建模input
和连接(An将不允许其元素具有不同的单元,并且扁平列表变得笨拙,而 a不允许仅轻松连接它的一个变量没有写方程)。output
array
record
虽然您可以简单地将一个变量连接到一个空 expandable connector
而没有问题,但它的unit
(和其他属性)不会被传递。因此,我想在可扩展连接器(例如 like x[:]
)内灵活地声明变量,并让它们的尺寸由实际连接确定。
不幸的是,这在OpenModelica和Wolfram System Modeler中均无效:
...也没有将其声明connector
为子组件并通过以下方式传递数组大小inner
并计算outer
出:
如何expandable connector
设置具有灵活、预定义的数组变量?
更新:
这似乎是与 OpenModelica 和 Wolfram System Modeler 相关的问题,因为给出的示例在 Dymola 中运行良好(参见下面 f.wue 的评论)。我在Wolfram Community上交叉发布了一个类似的问题。
在Modelica 规范(版本 3.2 修订版 2)中,我们在第 9.1.3 节可扩展连接器中找到:
在生成连接方程之前,在可扩展连接器中声明的非参数标量变量和非参数数组元素被标记为仅可能存在。非参数数组元素可以用数组维度“:”声明,表示大小未知。这适用于简单类型的变量和结构化类型的变量。
正如 f.wue 所指出的,我们应该连接connectors
- 而不仅仅是输入和输出。我在上面的代码中对此进行了更改,但这并没有解决问题。
modelica - 如何在块中使用未指定的数组维度?
使用未指定的数组维度 ( :
) 是设计灵活组件以供重用的基本特征。我很清楚在编译模型时必须固定实际尺寸。据我所知,将具有未指定数组维度的变量绑定到具有明确定义维度的变量就足够了。
所以我有点困惑为什么以下内容在任何一个或以下model Test
都不会验证:OpenModelica
Wolfram System Modeler
这样的事情怎么能做到呢?
modelica - 在 Modelica 中将逆变器与 smpm 连接时的仿真结果错误
我正在使用 Wolfram 的 SystemModeler 来研究连接到永磁同步电机的逆变器的系统行为。不幸的是,尽管我只使用了 Modelica 标准库中的组件,但我得到了错误的模拟结果。
到目前为止,我在下面的模型中尝试了几种设置。
一种设置是:JLoad=0 和 TLoad=0
我希望电机能够以怠速自由运行。相反,速度传感器显示幅度为 [-0.46;0.46] 的正弦波
另一个设置:JLoad=0.29 和 TLoad=-180
当我应用转矩阶跃时,电机的速度 = 0 并且从 t = 2s 开始减小并获得负值。
有人可以告诉我我的模型做错了什么以及为什么模拟结果是错误的吗?
我还尝试了图书馆中的一些示例,但它们从未将逆变器与电机一起使用。但我想研究 PWM,不想像示例中那样使用理想的正弦电压和电流......
感谢您的任何帮助!!