第8节 在PSCAD中调用C语言函数及file reference组件使用
如果电脑上装的是Gfortran编译器就方便点,如果用的是CVFortran编译器就可能就要弄几个晚上才不会报错(此处给出了判别方法,可以减少出错的概率):至于怎么判断装的是Gfortran编译器还是CVFortran编译器,只需分别运行官方模型(文末可提取)中的C_Interface_GF.pscx和C_Interface_VF.pscx,运行哪个不报错,对应的就是哪个编译器,视频中有演示。
8.1 Gfortran编译器(不是装的这个编译器请跳至8.2)
(因为我电脑里没装这个,所以这部分的程序没跑过,不保证全对)
8.1.1编写C语言函数(并命名为.C文件):
#include
void my_bj(double*i,double*j)
{double t;
if(*i>*j)
t=*i;
*i=*j;
*j=t;
}
8.1.2通过鼠标右键add component添加一个filereference组件
8.1.3在PSCAD中的Script里编写如下函数:
#STORAGEINTEGER:10
#STORAGEREAL:10
#LOCALINTEGER NMY_NSTORF
#LOCALINTEGER NMY_NSTORI
#LOCALREAL a,b,c
#BEGIN
#ENDBEGIN
a=$i1
b=$i2
c=$i3
IF(a .gt.b)THEN
callmy_bj(a,b)
ENDIF
IF(b .gt.c)THEN
callmy_bj(b,c)
ENDIF
IF(a .gt.b)THEN
callmy_bj(a,b)
ENDIF
$o1=a
$o2=b
$o3=c
8.2 CVFortran编译器
8.2.1编写C语言函数(并命名为.C文件):
#include
voidmy_bjc(double*i,double*j)
{double t;
if (*i>*j)
t=*i;
*i=*j;
*j=t;}
8.2.2用fortran语言编写一个辅助子程序my_bjf(并命名为.f文件),让pscad能识别c语言。
Subroutine my_bjf(i,j)
Real i,j
Interface
Subroutine my_bjc(i,j)
!DEC$ attributes C:: my_bjc
!DEC$ attributes reference:: i,j
Real i,j
End Subroutine
End Interface
Call my_bjc(i,j)
end
8.2.3通过鼠标右键add component添加2个file reference组件(一个用于引用以上.C文件,一个用于引用以上的.f文件)
8.2.4在PSCAD脚本中调用my_bjf函数(注意此处是my_bjf不是my_bjc)。
#STORAGE INTEGER:10
#STORAGE REAL:10
#LOCALINTEGER NMY_NSTORF
#LOCALINTEGER NMY_NSTORI
#LOCALREAL a,b,c
#BEGIN
#ENDBEGIN
a=$i1
b=$i2
c=$i3
IF(a .gt. b) THEN
call my_bjf (a,b)
ENDIF
IF(b .gt. c) THEN
call my_bjf (b,c)
ENDIF
IF(a .gt. b) THEN
call my_bjf (a,b)
ENDIF
$o1=a
$o2=b
$o3=c
仿真输出结果:
总结:最好直接用fortran语言编写函数,然后在pscad的script脚本中调用该函数;实在是要用C语言编写函数,要注意自己装的编译器是Gfortran编译器还是CVFortran编译器(具体怎么甄别编译器,文中有提到,需要的模型见最后的链接。)若是Gfortran编译器则可以直接在pscad的script脚本中调用C函数, 若是CVFortran编译器则需要通过fortran语言简单的将c函数转换成pscad能识别的函数。
近
期
预
告
1.PSCAD/Matlab仿真模型解读
往期回顾
示例模型百度网盘链接(其中有一个为官方CInterface模型可用于学习):
链接1:
https://pan.baidu.com/s/1U0_Lj0YbMHa1H1M9_iD7yQ
提取码1:p4u7
链接2:
https://pan.baidu.com/s/1APFaBsBzniOspbx0-jy8kA
提取码2:4ynb