2 交互式使用OpenModelica-下篇
文章目录
- 2 交互式使用OpenModelica-下篇
- 一、 Trying the system and cd Commands
- 二、 Modelica Library and DCMotor Model
- 三、The val() function
- 四、Clear All Models
- 五、VanDerPol Model and Parametric Plot
- 六、Using Chinese or Japanese Characters
- 七、Scripting with For-Loops, While-Loops, and If-Statements
- 八、 Variables, Functions, and Types of Variables
- 九、Getting Information about Error Cause
- 十、Alternative Simulation Output Formats
- 十一、Using Parallel Simulation via OpenMP Multi-Core Support
- 十二、Loading Speciffc Library Version
- 十三、Calling the Model Query and Manipulation API
- 十四、Quit OpenModelica
- 十五、Dump XML Representation
- 十六、Dump Matlab Representation
一、 Trying the system and cd Commands
也可以通过系统实用功能给出操作系统命令。命令提供为一个string参数。下面的示例显示了应用于UNIX命令cat的系统实用程序,在这里从命令行运行omc时,将文件bubblesort.mo的内容输出到输出流。
注意: 当运行基于CORBA的客户端,而不是进入可见的GUI窗口。因此,上述cat命令发出的文本将不会返回,这就是为什么它被重定向到另一个文件。
读取文件内容的更好方法是readFile命令:
系统命令只返回成功代码
另一个内置命令是cd,更改当前目录命令。返回生成的当前目录为一个字符串。
二、 Modelica Library and DCMotor Model
我们加载一个模型,这里是整个Modelica标准库,这也可以通过File-> load Mod-
elica库菜单项:
我们还加载一个包含dcmotor模型的文件:
注: dcmtor要求3.2.2版的Modelica软件包。使用Modelica 3.2.3代替,其中指出它是完全兼容的,无需转换脚本。
(一直到P12都是代码)
注:
通知: dcmtor请求了3.2.2版的软件包Modelica。使用Modelica 3.2.3代替,其中指出
它是完全兼容的,无需转换脚本。
我们绘制部分模拟结果如图:
三、The val() function
val(variableName,time) scription函数可用于检索仿真结果的内插值变量在模拟时间的某个点,请参阅下面的BouncingBall模拟中的usagc。
#四、 BouncingBall and Switch Models
我们加载并模拟包含何时方程和if表达式的弹跳球示例 (为了更好的可读性,Modelica关键字已经手动粗体处理):
我们不是仅仅给出一个模拟和绘图命令,而是执行一个runScript命令。mos (Modelica脚本)
包含这些命令的sim_BouncingBall.mos文件:
使用val(variableName,time) 函数检索时间 = 0时的itot值:
我们注意到,变量open从false (0) 切换到true (1),导致itot从1.0增加到2.0。
四、Clear All Models
现在,首先清除所有加载的库和模式
列出加载的模型:当前是没有的
五、VanDerPol Model and Parametric Plot
我们加载另一个模型,VanDerPol模型 (或通过菜单文件-> 加载模型):
仿真:
跑图:
将代码实例化为VanDerPol模型的平面形式:
六、Using Chinese or Japanese Characters
可以在引号 (单引号) 标识符中使用日语、中文和其他类型的UniCode字符,例如,下图中右侧的变量名称:
七、Scripting with For-Loops, While-Loops, and If-Statements
一个简单的求和整数循环 (使用多行输入而不评估每一行到OMShell需要复制-从另一个文档粘贴为一个操作):
嵌套循环求和实数和整数:
通过将两个 (或更多) 变量或赋值语句以分号分隔,以变量结尾,可以观察多个变量值:
一个具有向量遍历和字符串元素连接的for循环:
正常的while循环与10个 “abc” 字符串的连接:
一个简单的if语句。通过将变量放在最后,在分号之后,其值在评估后返回:
八、 Variables, Functions, and Types of Variables
将向量分配给一个变量:
函数中的输入:
函数的引用:
查看变量a的值:
查看a的类型;
检索b的类型:
mySqr是什么类型呢?尚无法即时处理:
列出可获得的变量:
Clear again:
九、Getting Information about Error Cause
在模拟失败后,调用getErrorString()函数可以获取更多关于错误原因的信息。
十、Alternative Simulation Output Formats
有几种输出格式可供选择,mat是默认格式。plt和mat是唯一允许在模拟后使用val()或plot()函数的格式。与plt的速度相比,对于小文件来说,mat大约快5倍,并且由于它是一种二进制格式,对于大文件来说扩展性更好。csv格式在数据密集型模拟中的速度大约是plt的两倍。plt格式在模拟期间将所有输出数据分配到RAM中,这意味着在32位平台上,由于应用程序只能寻址4GB的内存,模拟可能会失败。Empty不输出任何内容,应该是最快的。csv和plt格式适用于使用外部脚本或工具(如gnuplot)生成图表或处理数据。mat格式可以在MATLAB或Octave中进行后处理。
还可以通过使用POSIX扩展正则表达式来指定结果文件中应该包含哪些变量。给定的表达式必须匹配完整的变量名(^和$符号会自动添加到给定的正则表达式中)。
• 默认情况下,匹配所有内容:simulate(…, variableFilter=“,")
• 仅匹配包含数字1至3的变量myVar的索引:simulate(…, variableFilter="myVar[1-3]”)
• 匹配x、y或z:simulate(…, variableFilter=“x|y|z”)
十一、Using Parallel Simulation via OpenMP Multi-Core Support
可以通过使用OpenModelica的新特性在多核计算机上获得更快的模拟速度,该特性自动分区方程组,并使用基于共享内存的OpenMP执行调度不同部分。获得的加速取决于模型结构,以及方程组是否可以很好地分区。当前OpenModelica版本中的这个版本是一个没有负载平衡的实验版本。以下命令将在模型上运行并行模拟(目前还不能从OpenModelica GUI中使用):
十二、Loading Speciffc Library Version
存在许多不同版本的Modelica库,它们之间并不兼容。可以通过调用getModelicaPath()函数来保存同一个库的多个版本。通过调用loadModel(Modelica, “3.2”),OpenModelica会搜索名为"Modelica 3.2"的目录或名为"Modelica 3.2.mo"的文件。可以指定多个库版本以供搜索,并优先考虑已安装的库的预发布版本。如果搜索的版本是"default",优先级顺序为:没有版本名称(Modelica)、主要发布版本(Modelica 3.1)、预发布版本(Modelica 3.1Beta 1)和无序版本(Modelica Special Release)。
loadModel命令在加载后还会查看顶级类的uses注释。给定以下包,Complex 1.0和ModelicaServices 1.1也会自动加载到AST中。
如果模型有一个uses注释,包也会被加载:
注意:
通知:由于M中的uses注释,自动加载了包Modelica 3.2.1。
通知:由于Modelica中的uses注释,自动加载了包Complex 3.2.1。
通知:由于Modelica中的uses注释,自动加载了包ModelicaServices 3.2.1。
通过查看路径中的第一个标识符,包也会被加载:
注意:
通知:由于Modelica中的uses注释,自动加载了包Complex 4.0.0。
通知:由于Modelica中的uses注释,自动加载了包ModelicaServices 4.0.0。
通知:由于使用,自动加载了包Modelica default。
十三、Calling the Model Query and Manipulation API
在OpenModelica系统文档中,描述了一个外部API(应用程序编程接口),它返回有关模型的信息和/或允许操纵模型。这些函数的调用可以像下面这样交互式地完成,但更典型的是通过程序客户端对OpenModelica编译器(OMC)服务器进行调用。此类客户端的当前示例包括OpenModelica MDT Eclipse插件、OMNotebook、OMEdit图形模型编辑器等。出于性能原因,此API是未类型的,即在调用上不进行类型检查,且错误检查最小化。调用的结果以Modelica语法形式的文本字符串返回,客户端需要解析这些字符串。OMNotebook源代码中提供了一个C++的示例解析器,而MDT Eclipse插件中提供了一个Java的示例解析器。
下面我们展示了对之前模拟的BouncingBall模型进行的一些调用。关于这个API的完整文档可以在系统文档中找到。首先我们再次加载并列出模型,以展示其结构:
不同的调用和返回结果:
十四、Quit OpenModelica
十五、Dump XML Representation
命令dumpXMLDAE根据几个可选参数,将模型的XML表示形式转储出来。
dumpXMLDAE(modelname[,asInSimulationCode] [,filePrefix] [,storeInTemp] [,addMathMLCode])
这个命令使用XML表示形式转储模型的数学表示,带有可选参数。特别是,asInSimulationCode定义了在翻译过程中何时停止(在转储模型之前),其他选项与文件存储有关:filePrefix用于指定不同的名称,storeInTemp用于使用临时目录。可选参数addMathMLCode提供了不在xml文件中打印MathML代码的可能性,使其更易读。使用非常简单,只需:addMathMLCode=true/false(默认值是false)。
十六、Dump Matlab Representation
命令export根据几个可选参数,将模型的Matlab表示形式转储出来。
exportDAEtoMatlab(modelname):
这个命令使用Matlab表示形式转储模型的数学表示。示例: