似鸥电气 发表于 2020-5-10 13:35:14

PSCAD入门教程第8节调用C语言函数及file reference组件(附模型

第8节在PSCAD中调用C语言函数及file reference组件使用

如果电脑上装的是Gfortran编译器就方便点,如果用的是CVFortran编译器就可能就要弄几个晚上才不会报错(此处给出了判别方法,可以减少出错的概率):至于怎么判断装的是Gfortran编译器还是CVFortran编译器,只需分别运行官方模型(文末可提取)中的C_Interface_GF.pscx和C_Interface_VF.pscx,运行哪个不报错,对应的就是哪个编译器,视频中有演示。
   
8.1Gfortran编译器(不是装的这个编译器请跳至8.2)
(因为我电脑里没装这个,所以这部分的程序没跑过,不保证全对)

8.1.1 编写C语言函数(并命名为.C文件):

#include<math.h>
void my_bj(double*i,double*j)
{doublet;
   if(*i>*j)
       t=*i;
       *i=*j;
      *j=t;
}

8.1.2 通过鼠标右键add component添加一个filereference组件

8.1.3 在PSCAD中的Script里编写如下函数:

#STORAGE INTEGER:10

#STORAGE REAL:10

#LOCAL INTEGER NMY_NSTORF

#LOCAL INTEGER NMY_NSTORI

#LOCAL REAL 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<math.h>

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语言。

       Subroutinemy_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)。

#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

         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仿真模型解读


往期回顾



PSCAD入门教程(第6节):构建自定义元件(附讲解模型)
简单示例模型在文章底部自行提取!



PSCAD入门教程(第5节): 4种常用元件的使用(附讲解模型)
简单示例模型在文章底部自行提取!


由于本人水平有限,所述内容难免会有疏漏之处,有遗漏或阐述不当之处请各位同学、老师傅指正,公众号私信或QQ(3135975766)。






示例模型百度网盘链接(其中有一个为官方CInterface模型可用于学习):

链接1:

https://pan.baidu.com/s/1U0_Lj0YbMHa1H1M9_iD7yQ

提取码1:p4u7

链接2:

https://pan.baidu.com/s/1APFaBsBzniOspbx0-jy8kA

提取码2:4ynb

wang123 发表于 2020-10-31 10:22:50

ding ding ding

kobe0203 发表于 2020-11-2 12:02:50

非常好的资料,给力!!!!!!

yangliuqingmo 发表于 2020-11-26 04:50:34

好资料 学习学习

sjm1997 发表于 2021-11-20 16:33:09

为什么原模型我都会报错??我用的Gfortran编译器

流离纷乱 发表于 2021-12-16 16:43:13

这个还是复杂了用c的肯定不想用f,所以还是全c好,但是楼上是f里调用c,纯c的坑,后辈还要爬。 就是下划线的坑
页: [1]
查看完整版本: PSCAD入门教程第8节调用C语言函数及file reference组件(附模型