PSCAD入门教程(3、4节):自定义模型及Fortran语言应用
第3、4节 自定义模型及Fortran语言应用
一、自定义模型(组件)
1.PSCAD中自定义模型分类
PSCAD中自定义模型分为两大种,一种是自定义模型(组件),另一种是自定义模型(元件)。
(1)自定义模型(组件):可以在自定义模型里添加PSCAD库中自带的元器件,比如电压表、电容、IGBT、发电机等等,也可以添加自定义元件。比如官网中关于MMC的控制模块,它的外部接口如图所示。
双击该组件自定义模型即可看到它的内部结构是由库中自带的一些元件搭建而成的,如下图所示。
(2)自定义模型(元件):仅由程序语言(比如Fortran语言、C语言)构建该自定义模型。
比如,此处我通过Fortran语言构建了一个自定义的 可变电阻 ,它的外部接口如下图所示,由于该元件的功能通过程序表达,所以双击该元件自定义模型,其内部电气结构不可见,但可看到该元件的程序(程序未黑箱化的前提下)。
选中该元件自定义模型后,右键Edit definition,然后在界面偏下的部分就可以看到Graphic、paraments、Script三个选项,点击Script就可以看到该自定义模型的程序。
---------------------------
#STORAGE INTEGER:10
#STORAGE REAL:10
#LOCAL INTEGER NMY_NSTORF
#LOCAL INTEGER NMY_NSTORI
#LOCAL REAL NR
#LOCAL REAL NU
#LOCAL REAL Ntest
#LOCAL INTEGER j
#LOCAL INTEGER i
#BEGIN
CALL E_VARRLC1_CFG(0,$SS,$NTB,0)
#ENDBEGIN
NMY_NSTORF=NSTORF
NSTORF=NSTORF+10
NMY_NSTORI=NSTORI
NSTORI=NSTORI+10
IF (TIMEZERO) THEN
STORF(NMY_NSTORF)=0
STORF(NMY_NSTORF+1)=0
i=0
j=0
Ntest=0
ENDIF
NR=$R_my
NU=0
CALL E_VARRLC1_EXE(0,$SS,$NTB,0,NR,NU)
i=i+5
$Nout1=i*1.0
$Nout2=STORF(NMY_NSTORF)+5
STORF(NMY_NSTORF)=$Nout2
------------------------------------------------------------
以上程序虽然只实现了一个可变电阻的功能,但是此处我将构建自定义模型时的简单程序框架放上去,方便读者在以上基础上进行更改,由于其中小部分变量是由我自定义的,所以可能有些繁琐,具体含义下次介绍自定义模型(元件)时再讲。在PSCAD中该部分程序是自定义的,所以可以编辑,而主界面“Fortran”部分中的Fortran程序不可更改。
2.构建自定义模型(组件)
此处以
(a+b)*c
这个简单功能介绍自定义模型(组件)的构建步骤
在PSCAD库文件的界面中->鼠标右键->选择Create:component->当到达自定义组件界面;
设置好以上数据后,点击finish,在库文件主界面将会显示以下自定义元件的示意图。
图中a、b表示“加法”的两个输入量端子,c端子为乘法输入端子,通过自定义模块的参数输入界面输入,out1表示输出端子。
由于c端子通过参数输入界面输入,所以需要在组件中手动添加以下元件:
测试:(a+b)*c=(1+2)*2=6
此处以一个简单的加减乘除运算为例说明自定义模型的构建步骤,小伙伴们只要掌握了构建的方法,构建其他功能的自定义模型也就很简单了。
https://www.zhihu.com/video/1171886182685757440
二、自定义定义模型(元件)需要掌握的Fortran语法
Fortran语言看起来高大上,听起来好像又是一门程序语言,其实如果Fortran只用于在PSCAD中编写自定义模型,那么我们只需要掌握部分的语法,学过C语言、matlab的M语言或者FPGA中的语法后,再学Fortran不算太难。在PSCAD中使用Fortran可能需要注意到的问题:
1. Fortran 数组下标默认情况下是从1 开始(c语言从0开始),与一般矩阵的下标相同
2. 变量名不区分大小写,使用变量前建议对变量类型进行声明,且声明语句在所有执行语句之前。
在PSCAD中使用Fortran语言的方式有两种:①可以将Fortran语言与脚本语言结合起来使用,这样可以直接在脚本(Script)界面直接编写程序。②在外部编写.f函数,然后在PSCAD中的脚本(Script)界面中call该函数。
定义整型变量X: #LOCAL INTEGER X
实型变量X: #LOCAL REAL X
逻辑型变量X: #LOCAL Logical X
定义数组:
可以直接在PSCAD脚本中定义1维数组,高于1维的不能在脚本中直接定义,需要通过写.f函数文件,然后在脚本中call, 例如,定义包含9个数据的1维数组:
整型变量X: #LOCAL INTEGER X 9
实型变量X: #LOCAL REAL X 9
逻辑型变量X: #LOCAL Logical X 9
3.赋值语句
例如,
将a赋值给b
b=a
将a赋值给数组c中的第4个位置
c(4)=a
4.数学运算表达式
5.关系运算符
6.逻辑运算符
7.条件、循环语句
①.if 语句
if (a>0 ) then
…
elseif(a<0) then
…
else
…
Endif
②循环语句
DO j=1,b,c
…
End do
以上语句表示从j为1开始循环每次循环后j增加c,直到j大于b为止,若c不写,则默认每次循环后j增加1。
8.函数
例如,实现一个z=x+y的功能。
Subroutine add_sub(x,y,z)
!此处由于该函数不是在PSCAD脚本中编写的,所以声明变量时有所不同
Real:: x
Real::y
Real::z
z=x+y
end
在PSCAD脚本中使用以下语句就可以使用上述函数,语句中abc表示函数的三个输入输出参数,与上述函数中xyz相对应。
Call add_sub(a,b,c)