问题1:将程序写在哪里?
首先要将算法程序分成两个部分:
一部分是PSCAD可以实现的,如处理仿真参数、读入仿真数据、输出仿真结果以及积分、微分等简单函数。这部分内容写在自定义元件definition的Script中。可以写在Fortran中也可以写在DSDYN中,两者略有不同但不会影响简单应用,具体内容请参阅帮助文件。
另一部分是我们自己的C语言算法,要将C算法总结成y=f(x,p)的输入输出形式的形式写在一个*.c文件中。并添加到PSCAD的File Reference中。 C函数的命名形式一定是 void XX_XXX__()的形式,注意名字中的下划线,本人的试验结果是必须有这三个下划线,哪位同学有其他发现可以一起探讨一下。
问题2:如何传数据?
由于PSCAD和C函数是互相传递指针,因此就需要将C函数写成f(y,x,p)的形式,例如:void ja_model__(real *h,real *ht,real *mt,real *ms,real *a,real *alpha,real *c,real *k,real *b,real *m)。其中h是输出,ht,mt是输入,后面的都是参数。在PSCAD中用call语句调用,例如:CALL JA_MODEL(H,HT,MT,$MS,$A,$ALPHA,$C,$K,B,M) 。注意函数名中的下划线,这里只有一个!其中H,HT,MT都是Fortran程序中的变量,后面参数前面加“$”是引用参数的意思,具体内容请参阅帮助文件。
问题3:如何保存前一时刻的变量并在本时刻调用?
在时域仿真的时候我们不可避免的要用到上一时刻的某些计算结果。而PSCAD中的Fortran程序和C程序每一时刻都重新执行一次,变量都要清零,所以就要单独存放需要的数据。PSCAD提供了一个STORF数组,这里直接给出例子:
#STORAGE REAL:4
MY_NSTORF=NSTORF
NSTORF=NSTORF+4
BT=STORF(MY_NSTORF)
HT=STORF(MY_NSTORF+1)
MT=STORF(MY_NSTORF+2)
H=STORF(MY_NSTORF+3)*$N/$L
这是读上一时刻值。
STORF(MY_NSTORF)=B
STORF(MY_NSTORF+2)=M
这是保存存本时刻值。
解决了上面3个问题就可以完成信号处理元件的建模。
问题4:如何建立电气元件?
我们对一个电气元件建模就是要描述其伏安特性。如一个双端口元件,测它两个结点电压,然后计算出支路电流就可以了。PSCAD提供了一个基于结点的电气接口函数,说白了就是一个受控电流源叫GGIN和CCIN。帮助里可以搜到,下面给出例子:
CCIN($NA,$SS)=CCIN($NA,$SS)-STORF(MY_NSTORF+3)/1000.0
CCIN($NB,$SS)=CCIN($NB,$SS)+STORF(MY_NSTORF+3)/1000.0
GGIN($NA,$SS)=GGIN($NA,$SS)+G
GGIN($NB,$SS)=GGIN($NB,$SS)+G
我觉得解决以上4个问题就能满足一般应用了。这里只是给大家提供一个思路,还有一些细节没有说到还需要看帮助文件,希望能帮到大家!附件中是个非线性电感,J-A模型是个微分方程在C函数中用龙格库塔法解之。
原文标题:由一个实例说明PSCAD与C语言接口方法 - PSCAD - 中国电力研学论坛 专注电力技术应用,关注电力科技前沿,打造专业电力社区! - Powered by Discuz!#pid399146#pid399146#pid399146#pid399146#pid399146#pid399146#pid399146#pid399146#pid399146#pid399146
原文链接:http://tech.cepsc.com/viewthread.php?tid=65942&pid=399146&page=1&extra=#pid399146
我也在做PSCAD和C的接口,发现一些细节:
1.fortran 接口子函数的文件名必须是xxx_df90.f ,C程序文件名必须是xxx_msc.c。当大家编译通过但连接出现问题的时候,可以试试修改调用的这两个文件的文件名。
2.PSCAD3.0以前的版本连接外部文件采用的是File reference;4.0以后的版本发生了一些变化,在以前的基础上,在project setting的fortran标签页里,也要添加接口子程序(.f)文件的文件路径。
3.楼主提到了PSCAD存放数据的数组,其实有4个,数组指针名分别是STORF(实数量) STORI(整数量) STORL(逻辑量) STORC(复数量),对应类型的量应该存到对应的数组里。
楼主说的C函数命名时要加下划线的奇怪规则我也发现了。但想不明白原因。
原文标题:由一个实例说明PSCAD与C语言接口方法 - PSCAD - 中国电力研学论坛 专注电力技术应用,关注电力科技前沿,打造专业电力社区! - Powered by Discuz!#pid399146#pid399146#pid399146#pid399146#pid399146#pid399146#pid399146#pid399146#pid399146#pid399146
原文链接:http://tech.cepsc.com/viewthread.php?tid=65942&pid=399146&page=1&extra=#pid399146
0 引言
高压直流输电线路保护是直流线路安全稳定运行的基本保障。完整的直流输电保护系统的核心技术目前只被ABB、SIEMENS等少数几个公司掌握,保护装置对实际运行人员往往是个黑盒子,只是给出保护动作或不动作的结果,难以对保护的动作过程进行分析。因此根据实际保护的原理和算法,建立相应的电磁暂态仿真模型,不仅能够得到保护动作结果,而且可以查看保护算法各中间量的变化,分析保护动作或不动作的原因,这对分析保护动作特性、改进保护定值等具有重要的意义。
PSCAD/EMTDC (Power System ComputerAided Design/Electro—Magnetic Transient in DCSystem)是使用最广泛的电磁暂态仿真程序之一,但其自带的继电保护元件过于简单,保护算法单一,无法建立与实际直流工程线路保护原理和算法相一致的模型,因此也无法真实而准确地反映直流线路保护的动作特性。为了满足用户不同的应用要求,提高仿真的灵活性,PSCAD/EMTDC为用户提供了自定义元件的功能。
自定义元件由于自身的优势,在实际仿真中得到了越来越多的应用。自定义元件实质上是PsCAD/EMTDc 所提供的与用户子程序进行接口的载体,对应不同的接口对象,自定义元件的原理、实现途径以及运行效率都有差异。目前对自定义元件的研究往往还局限于就事论事的方式,侧重于具体的实现方法,而对自定义建模缺乏一个整体的、机理层面上的认识。本文从机理层面对自定义元件的实现方式、运行效率以及适用性等进行深入分析,揭示了导致自定义元件内存调用冲突的问题,提出了相应的解决方案。最后,本文以实际直流工程行波保护为原型,利用自定义建模技术搭建了其详细、精确的仿真模型,仿真结果证明了该方法的可行性与有效性。
1 PSCAD/EMTDC自定义建模原理分析
1.1 PSOAD/EMTDC的运行机制
PSCAD与EMTDC的运行机制如图1所示。PSCAD是前端图形化操作界面,EMTDC是整个软件的计算核心,其主程序由System Dynamics和Network Solution两部分组成 j。System Dynamics包括DSDYN与DsOUT两个子程序,DSDYN一般用于加入用户的控制动态代码,而DS0UT则主要用于输出求解后的网络变量。
图1 PSCAD/EMTDC软件的运行机制图
1.2自定义元件的实现方式
PSCAD/EMTDC 目前可与Fo~ran、C和Matlab三种语言编写的代码或程序进行接口,自定义元件实质上是其与外部程序进行接口的载体。EMTDC与自定义元件之间的调用以及数据交换是通过DSDYN 和DSOUT两个子程序来实现的。用户自定义的代码加入到EMTDC中有两种方法:
(1)直接嵌入。直接由自定义元件script定义中编写的Fortran代码实现元件的功能。即把用户代码直接作为DSDYN和DSOUT子程序的一部分嵌入到EMTDC主程序中去。
(2)问接调用。通过在元件的script定义中添加对外部子程序(Fortran、C或Matlab)的调用声明,由DSDYN、DSOUT子程序对其进行调用,元件的核心功能由外部子程序实现。
1.3自定义元件三种开发语言的效率对比
采用Fortran编写源代码的自定义元件一般采用直接嵌入的方式,由于PSCAD/EMTDC 是在Fo~ran语言上实现的,且无需对外部子程序进行编译及频繁的调用,因而其内嵌性能好,运行效率高。
基于C语言和Matlab构建的自定义元件同属间接调用的范畴,但两者又有所区别。前者是PsCAD/EMTDC与其他程序设计语言的接口,外部的集成开发环境(如Microsoft Visual c++等)在运行中仅充当编译的角色,不参与具体运算,由PscAD/EMTDc直接调用经编译后的C语言代码进行运算;后者是PSCAD/EMTDC与Mat1ab软件的接口,由PSCAD/EMTDC直接调用MATLAB进行运算,除了两者本身所固有的运算速度上的差异以外,两者间的通信也很大程度上影响了整个仿真的效率,因而其运行效率要较前者低。
表1给出了三者在相同条件下(AMD Phenom2.1 GHz,RAM 2GB,仿真时间10 S,步长50 ps),实现每步长循环10。次所耗费的计算时间。可见,基于Fortran 的自定义元件计算耗时要远少于Matlab,C语言居中。由于Fortran 语言的格式较多,而C语言功能丰富、表达能力强,且在实际微机保护中得到了广泛应用,因此常选用C语言作为自定义元件的开发语言。Matlab拥有强大的数值计算能力、图形处理能力以及完备的工具箱,但运行效率较低,因而基于Matlab构建的自定义元件更适宜作为一个过渡方案应用于保护新原理和新算法的开发与评估。当算法成熟后,为了提高仿真速度,应将其转换为基于Fortran或C语言构建的自定义元件。
表1基于Fortran、C语言以及Matlab构建的自定义元件计算时间对比
1.4自定义元件与ModuIe的对比分析
元件是PSCAD/EMTDC最基本的组件,Module则是由若干个元件为了实现一定功能按一定逻辑结构组合而成的整体。实际仿真中,往往需要搭建单个白带元件所不能实现的功能结构体,在PSCAD/EMTDc中,有两类可实现特定功能的结构体:一类是自定义元件;另一类便是Module。
无论是自定义元件还是Module,其功能性是用户最关心的部分,即模块能否满足用户明确的或隐含的功能需求。两者区别在于,自定义元件的核心功能完全由编程实现,不受已有元件功能的制约,而Module只能由已定义的元件组合而成,其功能无可避免地受到已有元件的制约,不仅灵活性上不如自定义元件,而且往往无法实现某些特殊的逻辑结构及算法。在用户使用的角度而言,自定义元件的面板功能为用户提供了一种统一、规范、便捷的参数输入形式,且在自定义库加载后,用户可方便地将自定义元件通过拖曳与复制,应用于任一工程文件,对比于在同一工程文件内以及不同工程文件之间无法直接复制的Module而言, 自定义元件具有更好的可移植性。
但另一方面,由于Module是通过直接调用自带元件库中的元件进行编译计算,无需调用及编译外部程序,一般而言,与自定义元件相比,Module具有更好的内嵌性能与更高的执行效率,而且Module是由已定义元件按一定逻辑关系组合而成的,便于修改,更无需考虑程序调用以及程序间的数据接口中可能出现的各种问题,因而Module的可维护性要优于自定义元件。
随着PSCAD/EMTDC 越来越多地被应用于商业领域,用户对仿真模型的安全保密需求变得迫切。Module中的数据及逻辑结构是公开的,可供任何用户进行阅读及修改,因而并不具有安全保密性;自定义元件则可通过自定义元件库的Library( .1ib)文件间接地实现元件层面的封装,使其他用户无法查看及修改自定义库中的源代码,具备一定的安全保密性。
在仿真过程中,若模块所需的功能Module难以甚至无法实现,或者需要模块具有较好的适用性、可移植性以及安全保密性的情况下,可优先考虑选用自定义元件。
2 C语言静态变量的使用所导致的内存调用冲突
自定义元件与PSCAD/EMTDC之间的数据传输不仅是同一步长中运算数据的横向传递,而且往往还涉及不同步长间数据的纵向传递。
自定义建模的编程有着不同于一般编程的特殊性。在利用C语言构建自定义元件的过程中,并不能使用c语言中的静态变量实现程序数据的存储以及不同步长之间数据的纵向传递,否则将有可能引起内存调用冲突,具体表现为自定义元件之间的相互干扰(见图2)。
2.1内存调用冲突的机理分析
目前PSCAD/EMTDC并不支持对c语言源代码的直接调用,C语言源代码与PSCAD/EMTDC之间的链接需要通过一个Fortran语言编写的接口程序实现,如图3所示。
图2某自定义数字滤波模块的干扰波形
图3基于c语言构建的自定义元件调用关系
每一个自定义元件在EMTDC主程序中都相当于一个被调用的子函数。对于任何一个使用静态变量存储数据的自定义元件而言,若在同一工程中不止一次地被使用到,这些在工程的各处实现着相同功能的模块,将共享同一个C语言函数以及同一个静态变量存储数据。由于C语言中并没有C++语言中“类”的概念,自动为数据分配内存,当EMTDC主程序调用这些模块时,这些自定义元件在同一步长,调用同一个C语言函数,将各自不同的数据通过Fortran 接口函数传送给C语言函数,而C语言函数却无法准确判别数据的来源以及经处理后的数据该返回到哪一个模块,便会产生前文所述的内存的调用冲突,自定义元件之间相互产生干扰,无法正常工作。也就是说,通过一个C语言函数定义的个模块在同一个工程中仅可被使用一次。同一工程中多个自定义元件的调用关系如图4所示。
要解决因使用C语言的静态变量存储数据所引起的同一工程中自定义元件内存调用冲突的问题,其中一个途径就是确保每一个c语言函数只被一个模块所调用。即在同一工程中需要用到多少个该模块,就需要新建多少个同样的模块。新建的模块只是名称有所区别(包括其所调用的Fortran接口函数、c语言函数),而函数的内容,模块所实现的功能则是完全~致的。其平行调用关系如图5所示。
图5平行调用关系
这个方法虽能解决同一工程中自定义元件间相互干扰的问题,但当某一模块在工程中的使用频率较高时,需要建立大量的自定义元件,此法较为繁琐,大大影响工作效率,所以要尽量避免使用静态变量进行数据的存储以及不同步长之间数据的传递。这点在C语言编程构建自定义元件的过程中应引起注意。
2.2 PSCAD/EMTDC公用数组的使用
为了解决自定义元件与PSCAD/EMTDC 之间的数据传输所涉及到的内存管理问题,PSCAD/EMTDC提供了STORI、STORF、STORL和STORC四类公用数组作为与自定义元件之间的数据接口【9J,分别用于整形数、浮点数、逻辑量以及复数型数据的传递及存储。所有基于间接调用实现的自定义元件,无论是与EMTDC之间数据的横向传递,还是自定义元件自身数据在不同步长之间的纵向传递与存储,都必须通过这四类公用数组进行。在自定义元件的C语言函数中,利用EMTDC所提供的4类公用数组代替静态变量存取数据,每个步长中,当C语言子程序被主程序调用时都通过STORx数组及其指针从STORx数组中获取或存储数据,就能避免出现同一工程中自定义元件间出现内存调用冲突的问题。值得注意的是,在公用数组的使用中,为了避免存储的数据溢出,每个子程序在返回主程序之前,都必须增加各自的指针量,增加的指针量由子程序所使用到的地址的数量所决定Il⋯。所有STORx数组的指针在每个步长中都会重置为1。
3 直流线路行波保护仿真应用
目前,世界上广泛采用行波保护作为高压直流线路保护的主保护,它是利用故障瞬间所传递的电流、电压行波来构成超高速的线路保护。本文的保护仿真模型以西门子行波保护系统为原型,该保护系统的动作判据 l为―――式中,△f是各个条件的定值;该保护同时检测电压变化率 /d,和电压变化幅度Au,二者同时满足定值才能起动检测电流变化幅度△ 。当满足判据时,保护动作输出50 ms的正脉冲去启动直流线路故障重启功能,如果启动的次数超过预定的次数,该极将被闭锁。工作逻辑图如图6所示。
图6行波保护系统逻辑图
保护逻辑元件是构成西门子行波保护系统的基础,但该保护中部分重要且必须的逻辑模块,如二阶滤波器、阀值监视器等,PSCAD/EMTDC自带元件库中并没有提供,必须自主开发。本文采用c语言作为自定义元件的开发语言,参照其保护系统设计报告,构建出所需的自定义元件,并按模块问的逻辑关系搭建出完整的行波保护系统模型,不仅能得到保护的动作结果,而且可以定量地查看保护中各中间量的变化,对保护动作特性的分析、定值的改进等具有重要的意义。
3。1自定义元件源代码与PSCAD/EMTDC工程的连接
对于通过间接调用方法构建的自定义元件,在加载自定义元件库后,PSCAD/EMTDC需寻找相应的文件路径找到对应的定义段进行识别。因此,自定义元件所有使用到的源文件必须与PSCAD/EMTDC工程连接起来,才能保证自定义元件在工程中的正常运作。
通过使用File Reference元件,或者工程Fortran选项卡下的Additional Source (.f) files输入框皆可实现自定义元件源代码与PSCAD/EMTDC 的关联。上述两种方法中用户自定义元件的源代码是公开的并可被进一步修改的,PsCAD/EMTDC每次运行都需要对其重新进行编译,灵活性较强,主要适用于自定义元件的调试阶段。在一些情况下,出于商业或安全的原因,用户需要将源代码进行封装保密,PSCAD/EMTDC为此提供了第三种源代码与程序的连接方式—Library({.1ib)文件。Library( .1ib)文件就是PSCAD/EMTDC事先对用户自定义元件库里所包含的全部信息,包括其调用的所有外部源文件,统一进行编译,所生成的一个文件( .1ib)。要实现源代码与工程的连接,只需要在工程Project Setting⋯下的Link选项卡AdditionalLibrary(.1ib)and Object的输入框中输入Library(}.1ib)文件的路径及文件名即可。由于Library( .1ib)文件是经过编译的面向计算机的文件格式,与前两种方法相比,在进行仿真时节省了每次对源代码重新进行编译的时间,提高了仿真速度,且其他用户无法查看自定义元件库的源代码,也无法对其进行修改,实现了自定义元件的封装。
3.2直流系统模型与保护模型的仿真时序关系
为了对不同工况下行波保护系统的动作行为进行准确的评估,算例采用闭环仿真,即保护的动作行为返回到直流系统中。行波保护系统仿真模型采用与实际系统一致的采样周期T2=150 us,而为了更精确地反映直流系统的动态特性,直流系统的仿真步长为 =5“s,当t=n T2时,行波保护系统从直流系统中获取电流电压值,进行处理,并把动作结果返回到直流系统中,如图7所示。
图7直流系统模型与保护模型的仿真时序关系
3.3仿真计算示例
下面以一个500 kV双极直流系统仿真模型来验证自定义行波保护系统模型的功能。该直流系统双极输送容量为1 800 MW,线路全长980 km,直流系统模型如图8所示。
图8 500 kV双极直流系统仿真模型
接地故障设置在直流线路中点,故障起始时间为0.8 s,故障持续0.05 S,过渡电阻100 Q。行波保护系统对仿真实时电流、电压值计算,对电压变化率、电压变化量以及电流的变化量进行判别,满足定值条件发出跳闸信号。仿真表明,行波保护系统仿真模型能有效识别线路故障并正确动作。故障电压、电流仿真波形以及行波保护系统的逻辑输出信号示意图如图9、图10所示。
图9整流侧故障电流、电压
图10行波保护动作特性
4 结论
根据对PSCAD,EMTDC仿真软件的运行机制、自定义建模技术的基本原理的分析及仿真结果,可以得出以下结论:
(1)PSCAD/EMTDC 自定义元件的应用可实现高压直流线路保护的精确和详细建模,能有效地增强仿真的灵活性,提高仿真结果的精度和可信度。
(2)基于Matlab的实现方式作为过渡方案用于研究及评估保护新算法,而算法成熟后应转化为Fortran或c语言方式以提高运行效率。
(3)自定义元件具有较好的功能性、可移植性以及安全保密性,而Module则具有更高的执行效率以及更优异的可维护性,在实际仿真中,应根据实际需要合理地进行选用。
(4)利用c语言构建自定义元件的过程中,应完全通过PscAD/EMTDc 自带的公用数组进行数据的存储及传递,尽量避免使用c语言中的静态变量,否则容易造成自定义元件间的内存调用冲突。下载本文