我正在通过Fortran语言为PSS / E中的逆变器开发用户编写的控制模型。我想将此控制模型链接到标准生成器模型。
我已经检查过控制模型是否正常工作。我正在输入2个输入命令:Real Power(P)和Reactive Power(Q)。我检查了内部变量,模型很好地理解了我定义的这些值。并且该控制模型的输出是“正确的”两个输出信号都是应该的。
问题在于我无法将其链接到标准生成器模型。由于此模型包含在外部.dll文件中,因此我在代码开头使用USE [MODULE]语句,而在MODE 3中我只写:
WIPCMD1(MC)=VAR(L+5)
WIQCMD1(MC)=VAR(L+4)
其中MC是应用两个模型的机器索引,WIPCMD和WIQCMD是用作生成器模型输入的数组,VAR(L+5)
和VAR(L+4)
是用户编写的控件模型的输出
我知道连接是错误的,因为当我更改控制模型的2个输入时,此控件的2个输出也会改变,但生成器模型的输出总是相同的(我认为这是初始化的)从权力流动。)
另一个可能的原因是我正在编译错误的PSS / E环境管理器中的文件:我只是将我的控件模型.flx文件放在“用户模型Fortran源文件”和.obj文件中,其名称相同包含“用户模型对象,库文件”中的GEPVMODULE的.mod文件。我使用生成的.dll文件。
有什么想法吗? Bellow是.flx控制模型的完整代码。
非常感谢。
此致
SUBROUTINE INVCTRLELEC (MC,ISLOT)
C
USE GEPVMODULE
C
$INSERT COMON4.INS
C
INTEGER I,J,K,L,MC,ISLOT,BS
INTEGER IERR1,IERR3
REAL VINP1,VINP2,VINP3,VINP4,VINP5,VINP6,VINP7,VINP8,VINP9,VINP10
REAL VOUT1,VOUT2,VOUT3,VOUT4,VOUT5,VOUT6,VOUT7,VOUT8,VOUT9,VOUT10
C
C
I=STRTIN(4,ISLOT)
J=STRTIN(1,ISLOT)
K=STRTIN(2,ISLOT)
L=STRTIN(3,ISLOT)
C
CALL FLOW1(I,L+6,L+1,L+7)
C
IF (MODE.EQ.8)
. CON_DSCRPT(1)='Kqi'
. CON_DSCRPT(2)='Kvi'
. CON_DSCRPT(3)='Ihql'
. CON_DSCRPT(4)='Ipmax'
. CON_DSCRPT(5)='Iphl'
. CON_DSCRPT(6)='Vmaxcl'
. CON_DSCRPT(7)='Vmincl'
. CON_DSCRPT(8)='Vdc'
. CON_DSCRPT(9)='Porder'
. CON_DSCRPT(10)='Qorder'
. ICON_DSCRPT(1)='Bus origen'
. ICON_DSCRPT(2)='Bus destino'
. ICON_DSCRPT(3)='Identificador'
. RETURN
...FIN
C
IF (MODE.GT.4) GO TO 1000
C
GO TO (100,200,300,400), MODE
C
100 VOUT1=CON(J+9)-VAR(L+1)
VINP1=INT_MODE1(1.0,VOUT1,K,IERR1)
C
VOUT3=VOUT2-VAR(L+2)
VINP3=INT_MODE1(1.0,VOUT3,K+1,IERR3)
VAR(L+2)=ABS(VOLT(ICON(I)))
C
VAR(L+5)=WIPCMD1(MC)
VAR(L+4)=WIQCMD1(MC)
C
RETURN
C
200 VAR(L+2)=ABS(VOLT(ICON(I)))
C
VINP1=CON(J+9)-VAR(L+1)
VOUT1=INT_MODE2(1.0,VINP1,K)
VAR(L)=CON(J+9)
C
VINP2=VOUT1*CON(J)
VOUT2=MIN(CON(J+5),MAX(CON(J+6),VINP2))
C
VINP3=VOUT2-VAR(L+2)
VOUT3=INT_MODE2(1.0,VINP3,K+1)
VAR(L+11)=VOUT3*CON(J+1)
C
VINP5=VAR(L+5)
VOUT5=((CON(J+3))**(2)-(VAR(L+5))**(2))**(0.5)
C
VINP6=VOUT5
VOUT6=MIN(CON(J+2),VINP6)
VAR(L+8)=VOUT6
C
VINP7=VAR(L+2)
VOUT7=-0.5+0.01733*(VINP7*360-360)-0.0117*(CON(J+7)-560)+VAR(L+6)*1/4.37
VAR(L+9)=VOUT7
C
VINP4=VOUT3*CON(J+1)
VOUT4=MIN(VOUT6,MAX((MAX(VOUT7,-VOUT6)),VINP4))
VAR(L+4)=VOUT4
C
VINP8=VAR(L+2)
VOUT8=MAX(0.01,VAR(L+2))
C
VINP9=CON(J+8)
VAR(L+3)=CON(J+8)
VOUT9=VINP9/VOUT8
C
VINP10=VOUT9
VOUT10=MIN(MIN(CON(J+3),CON(J+4)),VINP10)
VAR(L+5)=VOUT10
C
RETURN
C
300 VAR(L+2)=ABS(VOLT(ICON(I)))
C
VINP1=CON(J+9)-VAR(L+1)
VOUT1=INT_MODE3(1.0,VINP1,K)
VAR(L)=CON(J+9)
C
VINP2=VOUT1*CON(J)
VOUT2=MIN(CON(J+5),MAX(CON(J+6),VINP2))
C
VINP3=VOUT2-VAR(L+2)
VOUT3=INT_MODE3(1.0,VINP3,K+1)
VAR(L+11)=VOUT3*CON(J+1)
C
VINP5=VAR(L+5)
VOUT5=((CON(J+3))**(2)-(VAR(L+5))**(2))**(0.5)
C
VINP6=VOUT5
VOUT6=MIN(CON(J+2),VINP6)
VAR(L+8)=VOUT6
C
VINP7=VAR(L+2)
VOUT7=-0.5+0.01733*(VINP7*360-360)-0.0117*(CON(J+7)-560)+VAR(L+6)*1/4.37
VAR(L+9)=VOUT7
C
VINP4=VOUT3*CON(J+1)
VOUT4=MIN(VOUT6,MAX((MAX(VOUT7,-VOUT6)),VINP4))
VAR(L+4)=VOUT4
C
VINP8=VAR(L+2)
VOUT8=MAX(0.01,VAR(L+2))
C
VINP9=CON(J+8)
VAR(L+3)=CON(J+8)
VOUT9=VINP9/VOUT8
C
VINP10=VOUT9
VOUT10=MIN(MIN(CON(J+3),CON(J+4)),VINP10)
VAR(L+5)=VOUT10
C
WIPCMD1(MC)=VAR(L+5)
WIQCMD1(MC)=VAR(L+4)
C
VAR(L+12)=MC
VAR(L+13)=ISLOT
C
RETURN
C
400 NINTEG=MAX(NINTEG,K+3)
RETURN
C
IF (MODE.EQ.6) GO TO 2000
C
900 RETURN
1000 RETURN
2000 RETURN
RETURN
END