⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ycn1sub.plm

📁 这是一个产品完整的代码
💻 PLM
📖 第 1 页 / 共 2 页
字号:
/*------------------------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 + -