2.7.1 函数定义

2.7.1 函数定义

函数是以“function”关键字定义的受限类,遵循Modelica类定义的语法形式。函数体是以“algorithm”开始的算法区域,或者是外部函数声明,作为函数调用时的执行系列。函数的输入形参以变量声明的形式定义,并有“input”前缀,输出形参也是以变量声明的形式定义,但前缀是“output”。函数定义的典型格式如下:

函数中使用的临时变量(局部变量)在“protected”区域中定义,并且不带“input”和“output”前缀。函数的形参可以使用声明赋值的形式定义默认参数,如上例中的“in3”和“out2”。

输入形参之间的相对顺序与调用函数时按位置传参的顺序是一致的,同样,输出形参之间的相对顺序与调用函数时返回值的顺序也是相同的。输入形参与输出形参之间的相对顺序没有要求。下例是合法的,但不推荐这样定义。

函数作为一种受限类,除了遵循Modelica类定义的通用语法外,还有一些限制和增强的特性,具体为:

(1)public区域的变量声明是函数的形参,必须有“input”或“output”前缀,protected区域的变量声明是函数的临时变量,不能有“input”和“output”前缀。

(2)输入形参是只读的,也就是说,在函数体中不能给输入形参赋值。

(3)函数不能用于连接,不能有“方程equation”和“初始算法initial algorithm”,至多有一个“算法algorithm”区域或外部函数接口。

(4)函数中输出形参数组和临时数组变量的长度必须能由输入形参或函数中的参数、常量确定。

(5)函数中不能调用der、initial、terminal、sample、pre、edge、change、delay、cardinality、reinit等内置操作符和函数,也不能使用when语句。

(6)函数中使用“return”语句退出函数调用,返回值取输出形参的当前值。

(7)函数是数学意义上的纯函数,也就是说,相同的输入总是具有相同的输出,并且调用顺序与调用次数不改变所在模型的仿真状态。

函数和普通类一样支持继承,通过继承定义的函数同样要遵循函数的限制。通过继承的方式,可以在基类中实现通用的输入/输出形参结构,在派生类中实现不同的算法。例如: