📄 ycn1sub.plm
字号:
/*------------------------SSC-2 RTU YC card program----------------------*/
/* Filename : YCN1SUB.PLM */
/* Programed by : HUANG JUN */
/* Modified by : STEELEN */
/* Version : V3.04 */
/* Date : from 05/10/98 to dd/mm/yy */
/* Print on : */
/*-----------------------------------------------------------------------*/
YCN1SUB: DO;
$INCLUDE(C196.PLM)
$INCLUDE(YCN1SUB.DEF)
/*------------------------------------------------------------*/
WPQ:PROCEDURE PUB;
DCL DWORK DWORD FAST;
DCL WORK(4) BYTE AT(.DWORK);
DCL (WORK0,WORK1) WORD AT(.DWORK);
DCL TEMP DWORD FAST;
DCL (K,TMPWAY,TMPPOS) BYTE FAST;
IF OVTM_COUNT<2 THEN DO;
DO K=0 TO 50;
CALL TIME(8);
END;
RETURN;
END;
DO K=0 TO 25;
CALL TIME(8);
END;
OVTM_COUNT=OVTM_COUNT-2;
DO TMPWAY=0 TO 11;
TMPPOS=TMPWAY*16;
WORK(0)=BUF1(TMPPOS+6).BIN(0); /*2*P*/
WORK(1)=BUF1(TMPPOS+6).BIN(1);
WORK(2)=0;
WORK(3)=0;
DWORK=4552*DWORK/72; /* caculate mWh */
/*PLUSES=P(KW)*T(us)/10^6/3600*2000=P*T/3600/500*/
/* 2000 PLUSES PER KWh */
IF BUF1(TMPPOS+6).BIN(3)=1 THEN WpF(TMPWAY)=WpF(TMPWAY)+DWORK;
ELSE Wp(TMPWAY)=Wp(TMPWAY)+DWORK;
WORK(0)=BUF1(TMPPOS+7).BIN(0); /*Q*/
WORK(1)=BUF1(TMPPOS+7).BIN(1);
WORK(2)=0;
WORK(3)=0;
DWORK=4553*DWORK/72; /* CACULATE mVarh */
IF BUF1(TMPPOS+7).BIN(3)=1 THEN WqF(TMPWAY)=WqF(TMPWAY)+DWORK;
ELSE Wq(TMPWAY)=Wq(TMPWAY)+DWORK;
/* WP */
WPDIV(TMPWAY)=WPDIV(TMPWAY)+WP(TMPWAY)/50000; /* add new pulse */
WP(TMPWAY)=WP(TMPWAY) MOD 50000; /* save the mWh that left */
IF WPDIV(TMPWAY)>=10 THEN
DO;WPDIV(TMPWAY)=WPDIV(TMPWAY)-10;
DO K=0 TO 3;
WORK(K)=BUF1(TMPPOS+12).BIN(K);
END; /* get old pulse */
DWORK=DWORK+1;
IF DWORK>9999999 THEN DWORK=0;
disable;
DO K=0 TO 3; /* save the sum of old and new */
BUF1(TMPPOS+12).BIN(K)=WORK(K);
END;
enable;
END;
/* WP END */
/* WQ */
WQDIV(TMPWAY)=WQDIV(TMPWAY)+WQ(TMPWAY)/50000; /* add new pulse */
WQ(TMPWAY)=WQ(TMPWAY) MOD 50000; /* save the mWh that left */
IF WQDIV(TMPWAY)>=10 THEN
DO;WQDIV(TMPWAY)=WQDIV(TMPWAY)-10;
DO K=0 TO 3;
WORK(K)=BUF1(TMPPOS+13).BIN(K);
END; /* get old pulse */
DWORK=DWORK+1;
IF DWORK>9999999 THEN DWORK=0;
disable;
DO K=0 TO 3; /* save the sum of old and new */
BUF1(TMPPOS+13).BIN(K)=WORK(K);
END;
enable;
END;
/* WQ END */
/* WPF */
WPFDIV(TMPWAY)=WPFDIV(TMPWAY)+WPF(TMPWAY)/50000; /* add new pulse */
WPF(TMPWAY)=WPF(TMPWAY) MOD 50000; /* save the mWh that left */
IF WPFDIV(TMPWAY)>=10 THEN
DO;WPFDIV(TMPWAY)=WPFDIV(TMPWAY)-10;
DO K=0 TO 3;
WORK(K)=BUF1(TMPPOS+14).BIN(K);
END; /* get old pulse */
DWORK=DWORK+1;
IF DWORK>9999999 THEN DWORK=0;
disable;
DO K=0 TO 3; /* save the sum of old and new */
BUF1(TMPPOS+14).BIN(K)=WORK(K);
END;
enable;
END;
/* WPF END */
/* WQF */
WQFDIV(TMPWAY)=WQFDIV(TMPWAY)+WQF(TMPWAY)/50000; /* add new pulse */
WQF(TMPWAY)=WQF(TMPWAY) MOD 50000; /* save the mWh that left */
IF WQFDIV(TMPWAY)>=10 THEN
DO;WQFDIV(TMPWAY)=WQFDIV(TMPWAY)-10;
DO K=0 TO 3;
WORK(K)=BUF1(TMPPOS+15).BIN(K);
END; /* get old pulse */
DWORK=DWORK+1;
IF DWORK>9999999 THEN DWORK=0;
disable;
DO K=0 TO 3; /* save the sum of old and new */
BUF1(TMPPOS+15).BIN(K)=WORK(K);
END;
enable;
END;
/* WQF END */
END;
END WPQ;
/*-------------------------------------------------------------------*/
/*-------------------------------------------------------------------*/
UIPQ:PROCEDURE PUB;
DCL K BYTE FAST;
DCL DWORK DWORD FAST;
DCL WORK WORD AT(.DWORK);
DCL TEMP DWORD FAST;
DCL LTEMP LONGINT FAST;
/*------calculate line A and B-------*/
DO K=0 TO N-1;
/*convert AD value to signed integer*/
IF XT(K*4)>=800H THEN WORK=XT(K*4)-800H;
ELSE WORK=-(800H-XT(K*4));
/*extend Uab as the real part*/
X(K+1).TRUE=EXTEND(SIGNED(WORK));
/*convert AD value to signed integer*/
IF XT(K*4+1)>=800H THEN WORK=XT(K*4+1)-800H;
ELSE WORK=-(800H-XT(K*4+1));
/*extend Ia as the virtual part*/
X(K+1).IMAG=EXTEND(SIGNED(WORK));
END;
CALL FFT; /*fft*/
DO K=1 TO N2; /*get fft(Uab) and fft(Ia)*/
Uaa(K-1).TRUE=SHORT(SAR(X(K).TRUE+X(N+2-K).TRUE,1));
Uaa(K-1).IMAG=SHORT(SAR(X(K).IMAG-X(N+2-K).IMAG,1));
Iaa(K-1).TRUE=SHORT(SAR(X(K).IMAG+X(N+2-K).IMAG,1));
Iaa(K-1).IMAG=SHORT(SAR(X(N+2-K).TRUE-X(K).TRUE,1));
END; /*2^16*/
DO K=1 TO N2-1;
U1(K)=VALUE(Uaa(K).TRUE,Uaa(K).IMAG);
I1(K)=VALUE(Iaa(K).TRUE,Iaa(K).IMAG);
END; /*2^16*/
/*get Uab*/
TEMP=0;
DO K=1 TO N2-1;
TEMP=TEMP+DOUBLE(U1(K))*DOUBLE(U1(K));
END;
TEMP=SHR(TEMP,1);/*+DOUBLE(U1(0))*DOUBLE(U1(0));*/ /*2^31*/
Uab=ZSQT(TEMP); /*2^15.5*/
/*get Ia */
TEMP=0;
DO K=1 TO N2-1;
TEMP=TEMP+DOUBLE(I1(K))*DOUBLE(I1(K));
END;
TEMP=SHR(TEMP,1);/*+DOUBLE(I1(0))*DOUBLE(I1(0));*/
Ia=ZSQT(TEMP);
/*get Pab*/
Pab=0;
DO K=1 TO N2-1;
Pab=Pab+EXTEND(Uaa(K).TRUE)*EXTEND(Iaa(K).TRUE);
Pab=Pab+EXTEND(Uaa(K).IMAG)*EXTEND(Iaa(K).IMAG);
END;
Pab=SAR(Pab,1); /*2^31*/
/*-----calculate line C and B--------*/
DO K=0 TO N-1;
/*convert AD value to signed integer*/
IF XT(K*4+2)>=800H THEN WORK=XT(K*4+2)-800H;
ELSE WORK=-(800H-XT(K*4+2));
/*extend Ucb as the real part*/
X(K+1).TRUE=EXTEND(SIGNED(WORK));
/*convert AD value to signed integer*/
IF XT(K*4+3)>=800H THEN WORK=XT(K*4+3)-800H;
ELSE WORK=-(800H-XT(K*4+3));
/*extend Ic as the virtual part*/
X(K+1).IMAG=EXTEND(SIGNED(WORK));
END;
CALL FFT; /*fft*/
DO K=1 TO N2; /* get fft(Ucb) and fft(Ic) */
Ucc(K-1).TRUE=SHORT(SAR(X(K).TRUE+X(N+2-K).TRUE,1));
Ucc(K-1).IMAG=SHORT(SAR(X(K).IMAG-X(N+2-K).IMAG,1));
Icc(K-1).TRUE=SHORT(SAR(X(K).IMAG+X(N+2-K).IMAG,1));
Icc(K-1).IMAG=SHORT(SAR(X(N+2-K).TRUE-X(K).TRUE,1));
END;
DO K=1 TO N2-1;
U2(K)=VALUE(Ucc(K).TRUE,Ucc(K).IMAG);
I2(K)=VALUE(Icc(K).TRUE,Icc(K).IMAG);
END;
/*get Ucb*/
TEMP=0;
DO K=1 TO N2-1;
TEMP=TEMP+DOUBLE(U2(K))*DOUBLE(U2(K));
END;
TEMP=SHR(TEMP,1);/*+DOUBLE(U2(0))*DOUBLE(U2(0));*/
Ucb=ZSQT(TEMP);
/*get Ic */
TEMP=0;
DO K=1 TO N2-1;
TEMP=TEMP+DOUBLE(I2(K))*DOUBLE(I2(K));
END;
TEMP=SHR(TEMP,1);/*+DOUBLE(I2(0))*DOUBLE(I2(0));*/
Ic=ZSQT(TEMP);
/*get Pcb*/
Pcb=0;
DO K=1 TO N2-1;
Pcb=Pcb+EXTEND(Ucc(K).TRUE)*EXTEND(Icc(K).TRUE);
Pcb=Pcb+EXTEND(Ucc(K).IMAG)*EXTEND(Icc(K).IMAG);
END;
Pcb=SAR(Pcb,1);
/*get Qab*/
/*get Qcb*/
Qab=0;
Qcb=0;
DO K=1 TO N2-1;
Qab=Qab+EXTEND(Uaa(K).TRUE)*EXTEND(Icc(K).TRUE);
Qab=Qab+EXTEND(Uaa(K).IMAG)*EXTEND(Icc(K).IMAG);
Qcb=Qcb+EXTEND(Ucc(K).TRUE)*EXTEND(Iaa(K).TRUE);
Qcb=Qcb+EXTEND(Ucc(K).IMAG)*EXTEND(Iaa(K).IMAG);
END;
Qab=SAR(Qab,1);
Qcb=SAR(Qcb,1);
Pab=SAR(Pab,1); /*2^30*/
Pcb=SAR(Pcb,1); /*2^30*/
Qab=SAR(Qab,1); /*2^30*/
Qcb=SAR(Qcb,1); /*2^30*/
P=Pab+Pcb; /*2^31 WTG 1999.01.09*/
Q=Qab-Qcb; /*2^31*/
/* S=S1+S2; */ /*2^31*/
/* WORK=VALUE( SHORT(SAR(P,14)),SHORT(SAR(Q,14)) );
S=SHL(DOUBLE(WORK),14); */
LTEMP=P/17321*20004;
LTEMP=SAR(LTEMP,14)* SAR(LTEMP,14)+ SAR(Q,14)*SAR(Q,14);
S=DOUBLE(ZSQT(UNSIGN(LTEMP)) );
/*get GLYSH*/
IF P<0 THEN DWORK=UNSIGN(-P);
ELSE DWORK=UNSIGN(P);
DWORK=DWORK/17321*20004;
DWORK=SHR(DWORK,2*NP); /*2^21*/
TEMP=SHL(S,14-2*NP); /*temp=S*sqrt(3)/2*998/1000*/
IF (TEMP<=100) OR (DWORK>=TEMP)
THEN GLYSH=1000;
ELSE DO;TEMP=DWORK*1000/TEMP;
IF P<0 THEN GLYSH=-SIGNED(LOW(TEMP));
ELSE GLYSH=SIGNED(LOW(TEMP));
END;
/*modify all values*/
P=SAR(P,P$SHIFT);
S=SHR(S,P$SHIFT);
Q=SAR(Q,P$SHIFT);
Uab=SHR(Uab,UI$SHIFT);
Ia=SHR(Ia,UI$SHIFT);
Pab=SAR(Pab,P$SHIFT);
Qab=SAR(Qab,P$SHIFT);
Ucb=SHR(Ucb,UI$SHIFT);
Ic=SHR(Ic,UI$SHIFT);
Pcb=SAR(Pcb,P$SHIFT);
Qcb=SAR(Qcb,P$SHIFT);
S1=SHR(S1,P$SHIFT);
S2=SHR(S2,P$SHIFT);
END UIPQ;
/*----------------------------------------------------*/
BDBH:PROCEDURE PUBLIC;
DCL DWORK DWORD FAST;
DCL TEMP DWORD FAST;
DCL TEMP0 WORD FAST;
DCL TEMP1 INTEGER FAST;
DCL TEMP2 LONGINT FAST;
DCL WORK(4) BYTE AT(.DWORK);
DCL K BYTE FAST;
/*------------------------COS----------------------*/
IF CNVT$END=0 THEN OLDGLYSH(LASTWAY)=GLYSH;
IF GLYSH>OLDGLYSH(LASTWAY) THEN TEMP1=GLYSH-OLDGLYSH(LASTWAY);
ELSE TEMP1=OLDGLYSH(LASTWAY)-GLYSH;
IF TEMP1<=GLYSH$XZH THEN
DO; OLDGLYSH(LASTWAY)=GLYSH;
IF GLYSH<0 THEN DO;BUF1(POS+1).BIN(3)=1;
WEST(POS+1).BCD(0)=88H;
DWORK=DOUBLE(UNSIGN(-GLYSH));
END;
ELSE DO;BUF1(POS+1).BIN(3)=0;
WEST(POS+1).BCD(0)=08H;
DWORK=DOUBLE(UNSIGN(GLYSH));
END;
disable;
DO K=0 TO 2;
BUF1(POS+1).BIN(K)=WORK(K);
END;
enable;
DWORK=BBCD(DWORK*100);
DO K=1 TO 3;
WEST(POS+1).BCD(K)=WORK(3-K);
END;
END;
ELSE OLDGLYSH(LASTWAY)=GLYSH;
/*------------------------COS----------------------*/
/*-----------------------Uab------------------------*/
IF CNVT$END=0 THEN OLDUAB(LASTWAY)=UAB;
IF OLDUAB(LASTWAY)>UAB THEN TEMP0=OLDUAB(LASTWAY)-UAB;
ELSE TEMP0=UAB-OLDUAB(LASTWAY);
IF TEMP0<UI$XZH THEN
DO;OLDUAB(LASTWAY)=UAB;
TEMP=DOUBLE(Uab)*U$MXS/DOUBLE(UUXS(LASTWAY)); /*Uab=real$value*1000V*/
DWORK=BBCD(TEMP);
DO K=1 TO 3;
WEST(POS+2).BCD(K)=WORK(3-K);
END;
WEST(POS+2).BCD(0)=02H;
DWORK=TEMP/100; /*Uab=real$value*10V*/
disable;
DO K=0 TO 3;
BUF1(POS+2).BIN(K)=WORK(K);
END;
enable;
END;
ELSE
DO;
OLDUAB(LASTWAY)=UAB;
END;
/*-----------------------Uab------------------------*/
/*-----------------------Ucb-------------------------*/
IF CNVT$END=0 THEN OLDUCB(LASTWAY)=UCB;
IF OLDUCB(LASTWAY)>UCB THEN TEMP0=OLDUCB(LASTWAY)-UCB;
ELSE TEMP0=UCB-OLDUCB(LASTWAY);
IF TEMP0<UI$XZH THEN
DO; OLDUCB(LASTWAY)=UCB;
TEMP=DOUBLE(Ucb)*U$MXS/DOUBLE(UUXS(LASTWAY)); /*Ucb=real$value*1000V*/
DWORK=BBCD(TEMP);
DO K=1 TO 3;
WEST(POS+3).BCD(K)=WORK(3-K);
END;
WEST(POS+3).BCD(0)=02H;
DWORK=TEMP/100; /*Ucb=real$value*10V*/
disable;
DO K=0 TO 3;
BUF1(POS+3).BIN(K)=WORK(K);
END;
enable;
END;
ELSE
DO; OLDUCB(LASTWAY)=UCB;
END;
/*-----------------------Ucb-------------------------*/
/*-----------------------Ia--------------------------*/
IF CNVT$END=0 THEN OLDIA(LASTWAY)=IA;
IF OLDIA(LASTWAY)>IA THEN TEMP0=OLDIA(LASTWAY)-IA;
ELSE TEMP0=IA-OLDIA(LASTWAY);
IF TEMP0<UI$XZH THEN
DO;OLDIA(LASTWAY)=IA;
TEMP=DOUBLE(Ia)*I$MXS/DOUBLE(IIXS(LASTWAY)); /*Ia=real$value*10000A*/
DWORK=BBCD(TEMP);
DO K=1 TO 3;
WEST(POS+4).BCD(K)=WORK(3-K);
END;
WEST(POS+4).BCD(0)=04H;
DWORK=TEMP/50; /*Ia=real$value*200A*/
disable;
DO K=0 TO 3;
BUF1(POS+4).BIN(K)=WORK(K);
END;
enable;
END;
ELSE
DO;OLDIA(LASTWAY)=IA;
END;
/*-----------------------Ia--------------------------*/
/*-----------------------Ic--------------------------*/
IF CNVT$END=0 THEN OLDIC(LASTWAY)=IC;
IF OLDIC(LASTWAY)>IC THEN TEMP0=OLDIC(LASTWAY)-IC;
ELSE TEMP0=IC-OLDIC(LASTWAY);
IF TEMP0<UI$XZH THEN
DO;OLDIC(LASTWAY)=IC;
TEMP=DOUBLE(Ic)*I$MXS/DOUBLE(IIXS(LASTWAY)); /*Ic=real$value*10000A*/
DWORK=BBCD(TEMP);
DO K=1 TO 3;
WEST(POS+5).BCD(K)=WORK(3-K);
END;
WEST(POS+5).BCD(0)=04H;
DWORK=TEMP/50; /*Ic=real$value*200A*/
disable;
DO K=0 TO 3;
BUF1(POS+5).BIN(K)=WORK(K);
END;
enable;
END;
ELSE
DO;OLDIC(LASTWAY)=IC;
END;
/*-----------------------Ic--------------------------*/
/*-----------------------P---------------------------*/
IF CNVT$END=0 THEN OLDP(LASTWAY)=P;
IF OLDP(LASTWAY)>P THEN TEMP2=OLDP(LASTWAY)-P;
ELSE TEMP2=P-OLDP(LASTWAY);
IF TEMP2<ZPQ$XZH THEN
DO;OLDP(LASTWAY)=P;
IF P<0 THEN DO;BUF1(POS+6).BIN(3)=1;
WEST(POS+6).BCD(0)=81H;
TEMP=UNSIGN(-P);
END;
ELSE DO;BUF1(POS+6).BIN(3)=0;
WEST(POS+6).BCD(0)=01H;
TEMP=UNSIGN(P);
END;
TEMP=TEMP*ZP$MXS/DOUBLE(PXS(LASTWAY))*2; /*P=real$value&*1000W */
DWORK=BBCD(TEMP);
DO K=1 TO 3;
WEST(POS+6).BCD(K)=WORK(3-K);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -