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

📄 ycn1sub.plm

📁 这是一个产品完整的代码
💻 PLM
📖 第 1 页 / 共 2 页
字号:
      END;

      DWORK=TEMP/50;  /*P=real$value&*2 W*/
      disable;
      DO K=0 TO 2;
         BUF1(POS+6).BIN(K)=WORK(K);
      END;
      enable;
  END;
                    ELSE
  DO;OLDP(LASTWAY)=P;
  END;
/*-----------------------P---------------------------*/

/*-----------------------Q---------------------------*/
  IF CNVT$END=0 THEN OLDQ(LASTWAY)=Q;
  IF OLDQ(LASTWAY)>Q THEN TEMP2=OLDQ(LASTWAY)-Q;
            ELSE TEMP2=Q-OLDQ(LASTWAY);
  IF TEMP2<ZPQ$XZH THEN
  DO;OLDQ(LASTWAY)=Q;
      IF Q<0 THEN DO;BUF1(POS+7).BIN(3)=1;
                     WEST(POS+7).BCD(0)=81H;
                     TEMP=UNSIGN(-Q);
                  END;
             ELSE DO;BUF1(POS+7).BIN(3)=0;
                     WEST(POS+7).BCD(0)=01H;
                     TEMP=UNSIGN(Q);
                  END;
      TEMP=TEMP*ZQ$MXS/DOUBLE(QXS(LASTWAY))*2; /*Q=real$value&*100 W*/
      DWORK=BBCD(TEMP);
      DO K=1 TO 3;
         WEST(POS+7).BCD(K)=WORK(3-K);
      END;

      DWORK=TEMP/50;  /*Q=real$value*2 W*/
      disable;
      DO K=0 TO 2;
         BUF1(POS+7).BIN(K)=WORK(K);
      END;
      enable;
  END;
                     ELSE
  DO;OLDQ(LASTWAY)=Q;
  END;
/*-----------------------Q---------------------------*/
/*-----------------------Pab-------------------------*/
  IF CNVT$END=0 THEN OLDPAB(LASTWAY)=PAB;
  IF OLDPAB(LASTWAY)>PAB THEN  TEMP2=OLDPAB(LASTWAY)-PAB;
                ELSE  TEMP2=PAB-OLDPAB(LASTWAY);
  IF TEMP2<PQ$XZH  THEN
  DO;OLDPAB(LASTWAY)=PAB;
      IF Pab<0 THEN DO;BUF1(POS+8).BIN(3)=1;
                       WEST(POS+8).BCD(0)=81H;
                       TEMP=UNSIGN(-Pab);
                    END;
               ELSE DO;BUF1(POS+8).BIN(3)=0;
                       WEST(POS+8).BCD(0)=01H;
                       TEMP=UNSIGN(Pab);
                    END;
      TEMP=TEMP*P$MXS/DOUBLE(PXS(LASTWAY)); /*Pab=real$value&*100 W*/
      DWORK=BBCD(TEMP);
      DO K=1 TO 3;
         WEST(POS+8).BCD(K)=WORK(3-K);
      END;

      DWORK=TEMP/50;  /*Pab=real$value*2 W*/
      disable;
      DO K=0 TO 2;
         BUF1(POS+8).BIN(K)=WORK(K);
      END;
      enable;
  END;
                    ELSE
  DO;OLDPAB(LASTWAY)=PAB;
  END;
/*-----------------------Pab-------------------------*/

/*-----------------------Pcb-------------------------*/
  IF CNVT$END=0 THEN OLDPCB(LASTWAY)=PCB;
  IF OLDPCB(LASTWAY)>PCB    THEN  TEMP2=OLDPCB(LASTWAY)-PCB;
                    ELSE  TEMP2=PCB-OLDPCB(LASTWAY);
  IF TEMP2<PQ$XZH  THEN
  DO;OLDPCB(LASTWAY)=PCB;
      IF Pcb<0 THEN DO;BUF1(POS+9).BIN(3)=1;
                       WEST(POS+9).BCD(0)=81H;
                       TEMP=UNSIGN(-Pcb);
                    END;
               ELSE DO;BUF1(POS+9).BIN(3)=0;
                       WEST(POS+9).BCD(0)=01H;
                       TEMP=UNSIGN(Pcb);
                    END;
      TEMP=TEMP*P$MXS/DOUBLE(PXS(LASTWAY));  /*Pcb=real$value&*100 W*/
      DWORK=BBCD(TEMP);
      DO K=1 TO 3;
         WEST(POS+9).BCD(K)=WORK(3-K);
      END;

      DWORK=TEMP/50;  /*Pcb=real$value*2 W*/
      enable;
      DO K=0 TO 2;
         BUF1(POS+9).BIN(K)=WORK(K);
      END;
      disable;
 END;
                    ELSE
 DO;OLDPCB(LASTWAY)=PCB;
 END;
/*-----------------------Pcb-------------------------*/

/*-----------------------Qab-------------------------*/
 IF CNVT$END=0 THEN OLDQAB(LASTWAY)=QAB;
 IF OLDQAB(LASTWAY)>QAB   THEN  TEMP2=OLDQAB(LASTWAY)-QAB;
                  ELSE  TEMP2=QAB-OLDQAB(LASTWAY);
 IF TEMP2<PQ$XZH THEN
 DO; OLDQAB(LASTWAY)=QAB;
      IF Qab<0 THEN DO;BUF1(POS+10).BIN(3)=1;
                       WEST(POS+10).BCD(0)=81H;
                       TEMP=UNSIGN(-Qab);
                    END;
               ELSE DO;BUF1(POS+10).BIN(3)=0;
                       WEST(POS+10).BCD(0)=01H;
                       TEMP=UNSIGN(Qab);
                    END;
      TEMP=TEMP*Q$MXS/DOUBLE(QXS(LASTWAY)); /*Qab=real$value&*100 W*/
      DWORK=BBCD(TEMP);
      DO K=1 TO 3;
         WEST(POS+10).BCD(K)=WORK(3-K);
      END;

      DWORK=TEMP/50;  /*Qab=real$value*2 W*/
      disable;
      DO K=0 TO 2;
         BUF1(POS+10).BIN(K)=WORK(K);
      END;
      enable;
 END;
                    ELSE
 DO; OLDQAB(LASTWAY)=QAB;
 END;
/*-----------------------Qab-------------------------*/

/*------------------------Qcb------------------------*/
 IF CNVT$END=0 THEN OLDQCB(LASTWAY)=QCB;
 IF OLDQCB(LASTWAY)>QCB THEN  TEMP2=OLDQCB(LASTWAY)-QCB;
                ELSE  TEMP2=QCB-OLDQCB(LASTWAY);
 IF TEMP2<PQ$XZH THEN
 DO; OLDQCB(LASTWAY)=QCB;
     IF Qcb<0 THEN DO;BUF1(POS+11).BIN(3)=1;
                       WEST(POS+11).BCD(0)=81H;
                       TEMP=UNSIGN(-Qcb);
                    END;
               ELSE DO;BUF1(POS+11).BIN(3)=0;
                       WEST(POS+11).BCD(0)=01H;
                       TEMP=UNSIGN(Qcb);
                    END;
      TEMP=TEMP*Q$MXS/DOUBLE(QXS(LASTWAY));   /*Qcb=real$value&*100 W*/
      DWORK=BBCD(TEMP);
      DO K=1 TO 3;
         WEST(POS+11).BCD(K)=WORK(3-K);
      END;

      DWORK=TEMP/50;  /*Qcb=real$value*2 W*/
      disable;
      DO K=0 TO 2;
         BUF1(POS+11).BIN(K)=WORK(K);
      END;
      enable;
  END;
                    ELSE
  DO;OLDQCB(LASTWAY)=QCB;
  END;
END BDBH;

/*-------------------------------------------------------------------*/
VALUE: PROCEDURE(T1,T2) WORD PUBLIC;
   /*calculate efficient value of a complex*/
   DCL (T1,T2) INTEGER FAST;
   DCL TT LONGINT FAST;
   IF T1=0 THEN DO;IF T2<0 THEN RETURN UNSIGN(-T2);
                           ELSE RETURN UNSIGN(T2);
                END;
   IF T2=0 THEN DO;IF T1<0 THEN RETURN UNSIGN(-T1);
                           ELSE RETURN UNSIGN(T1);
                END;
   TT=EXTEND(T1)*EXTEND(T1)+EXTEND(T2)*EXTEND(T2);
   RETURN ZSQT(UNSIGN(TT));
END VALUE;

/*------------------------------------------------------------*/
ZSQT: PROCEDURE(INPUT) WORD PUBLIC;
    /*evolution, input:DWORD,output:WORD*/
    DCL INPUT DWORD FAST;
    DCL (TP1,TP2) DWORD FAST;
    DCL OUTPUT WORD FAST;
    DCL (K3,K4) BYTE FAST;

      TP2=01;
      TP1=0;
      OUTPUT=0;
      K4=1;

      IF INPUT=0 THEN RETURN OUTPUT;

      IF HIGH(INPUT)=0 THEN DO;INPUT=ROL(INPUT,16);
                               K4=9;
                            END;

      DO K3=K4 TO 16;
         INPUT=ROL(INPUT,2);
         TP1=TP1 OR (INPUT AND 03H);
         IF TP1>=TP2 THEN DO;TP1=TP1-TP2;
                             TP1=SHL(TP1,2);
                             TP2=SHL(TP2,1);
                             CALL BITSET(.TP2,2);
                             CALL BITCLR(.TP2,1);
                             CALL BITSET(.TP2,0);
                             CALL BITSET(.OUTPUT,16-K3);
                          END;
                     ELSE DO;TP1=SHL(TP1,2);
                             TP2=SHL(TP2,1);
                             CALL BITCLR(.TP2,2);
                             CALL BITCLR(.TP2,1);
                             CALL BITSET(.TP2,0);
                          END;
      END;

      RETURN OUTPUT;
END ZSQT;

/*-------------------------------------------------------------------*/
BBCD: PROCEDURE(WNUM) DWORD PUBLIC;
        /*BIN to BCD*, scale:000000-999999*/
        DCL WNUM DWORD FAST;
        DCL NUM(4) BYTE AT(.WNUM);
        DCL AA DWORD FAST;
        DCL COUNT BYTE FAST;
        DCL TP(6) BYTE FAST;
        DCL (K0,K1) BYTE FAST;

        IF WNUM>=1000000 THEN RETURN 999999H;

        DO K0=0 TO 5;
           COUNT=0;
           AA=1;
           DO K1=K0 TO 4;
              AA=AA*10;
           END;
           DO WHILE WNUM>=AA;
              WNUM=WNUM-AA;
              COUNT=COUNT+1;
           END;
           TP(K0)=COUNT;
        END;

        NUM(0)=SHL(TP(4),4) OR TP(5);
        NUM(1)=SHL(TP(2),4) OR TP(3);
        NUM(2)=SHL(TP(0),4) OR TP(1);
        NUM(3)=0;

        RETURN WNUM;

END BBCD;

/*-------------------------------------------------------*/
DC$CAL: PROCEDURE PUBLIC;
  DCL (K2,K1) BYTE FAST;
  DCL (USUMD,REGD) DWORD FAST;
  DCL USUM(4) BYTE AT(.USUMD);
  DCL WORK WORD FAST;
  DCL FU BYTE FAST;
       /*delay*/

       /*calculate the average value of every DC line*/
       DO K2=0 TO 3;
          USUMD=0;
          DO K1=0 TO N-1;
             WORK=XT(K1*4+K2);
             IF WORK<800H THEN DO;WORK=800H-WORK;
                                  REGD=DOUBLE(WORK);
                                  REGD=-REGD;
                               END;
                          ELSE DO;WORK=WORK-800H;
                                  REGD=DOUBLE(WORK);
                               END;
             USUMD=USUMD+REGD;
          END;
          IF BITTST(.USUMD,31) THEN DO;USUMD=-USUMD;
                                       FU=1;
                                    END;
                               ELSE FU=0;
          USUMD=SHR(USUMD,NP);
          disable;
          DCV(K2).BIN(0)=USUM(0);
          DCV(K2).BIN(1)=USUM(1);
          DCV(K2).BIN(2)=0;
          DCV(K2).BIN(3)=FU;
          enable;
       END;
END DC$CAL;

/*-----------------------------------------------------------------------*/
/*---------------------------------------------------------------------*/
CHECK_SUB:PROCEDURE PUBLIC;
  DCL (K3,K2) BYTE FAST;
  DCL TEMP DWORD FAST;
  DCL TP(3) BYTE AT(.TEMP);
      /*delay*/
      DO K3=1 TO 50;
         CALL TIME(8);
      END;
      /*calculate average value*/
      DO K3=0 TO 1;
         TEMP=0;
         DO K2=0 TO N-1;
            TEMP=TEMP+DOUBLE(XT(K2+SHL(K3,NP)));
         END;
         TEMP=SHR(TEMP*100,NP);
         TEMP=BBCD(TEMP); /*bin to bcd*/
         EAST(K3).BCD(0)=04;
         EAST(K3).BCD(1)=TP(2);
         EAST(K3).BCD(2)=TP(1);
         EAST(K3).BCD(3)=TP(0);
      END;
END CHECK_SUB;

/*-----------------------------------------------------------------*/
FFT:PROCEDURE PUBLIC;
  DCL (FT1,FT2) LONGINT;
  DCL JJ   BYTE FAST;
  DCL KK   BYTE FAST;
  DCL MM   BYTE FAST;
  DCL LL   BYTE FAST;
  DCL ME   BYTE FAST;
    /*reorder sequence*/
    JJ=1;
    DO LL=1 TO N-1;
       IF LL<JJ THEN DO;FT1=X(JJ).TRUE;
                        FT2=X(JJ).IMAG;
                        X(JJ).TRUE=X(LL).TRUE;
                        X(JJ).IMAG=X(LL).IMAG;
                        X(LL).TRUE=FT1;
                        X(LL).IMAG=FT2;
                     END;
       KK=N/2;
       DO WHILE KK<JJ;
          JJ=JJ-KK;
          KK=SHR(KK,1);
       END;
       JJ=JJ+KK;
    END;

    /*calculate FFT*/
    DO MM=1 TO NP;
       ME=SHL(1,MM);
       KK=SHR(ME,1);
       DO JJ=1 TO KK;
          DO LL=JJ TO N BY ME;
             FT1=X(LL+KK).TRUE*W(KK+JJ-2).TRUE-X(LL+KK).IMAG*W(KK+JJ-2).IMAG;
             FT2=X(LL+KK).TRUE*W(KK+JJ-2).IMAG+X(LL+KK).IMAG*W(KK+JJ-2).TRUE;
             FT1=SAR(FT1,AMP);
             FT2=SAR(FT2,AMP);
             X(LL+KK).TRUE=X(LL).TRUE-FT1;
             X(LL+KK).IMAG=X(LL).IMAG-FT2;
             X(LL).TRUE=X(LL).TRUE+FT1;
             X(LL).IMAG=X(LL).IMAG+FT2;
          END;
       END;
    END;

    X(1).TRUE=SAR(X(1).TRUE,1);
    X(1).IMAG=SAR(X(1).IMAG,1);
    X(N+1).TRUE=X(1).TRUE;
    X(N+1).IMAG=X(1).IMAG;

END;

/*-------------------------------------------------------------------*/
FREQUENCY:PROCEDURE PUB;
  DCL REGD DWORD FAST;
  DCL TEMP DWORD FAST;
  DCL REG(4) BYTE AT(.REGD);
  DCL K BYTE FAST;

      /*Calculate frequency*/
      TEMP=1843200000;

      IF FNUM=0 THEN TEMP=0;
                ELSE TEMP=TEMP/DOUBLE(FNUM);
                    /*calculate Frequency,Unit:1/1000Hz*/
      REGD=BBCD(TEMP*10); /*1/10000Hz*/
      DO K=1 TO 3;
         WEST(POS).BCD(K)=REG(3-K);
      END;
      WEST(POS).BCD(0)=04H;

      REGD=TEMP/10; /*1/100Hz*/
      DO K=0 TO 3;
         BUF1(POS).BIN(K)=REG(K);
      END;

END FREQUENCY;

/*-------------------------------------------------------*/
RS485R_CTL:PROCEDURE PUBLIC;
        CALL BITCLR(.IOPORT2,6);  /*Receiver Output Enable */
        CALL BITCLR(.IOPORT2,7);  /*Driver Output Disable*/
END RS485R_CTL;

/*-------------------------------------------------------*/
RS485T_CTL:PROCEDURE PUBLIC;
        CALL BITSET(.IOPORT2,6);  /*Receiver Output Disable*/
        CALL BITSET(.IOPORT2,7);  /*Driver Output Enable */
END RS485T_CTL;

/*-------------------------------------------------------*/
START$RUN:PROCEDURE PUBLIC;
  DCL TEMP BYTE FAST;
          /*ignite or extinguish START lamp*/
          IF SAMP$EN THEN TEMP=05H;
                     ELSE TEMP=25H;
          DISABLE;
          HSO_COMMAND=TEMP;
          HSO_TIME=TIMER1+3;
          ENABLE;
END START$RUN;

/*-------------------------------------------------------*/
LED$RUN:PROCEDURE PUBLIC;
          IF RUN$CNT>30 THEN
          DO;RUN$CNT=0;
             DISABLE;
             IF BITTST(.IOS0,0) THEN HSO_COMMAND=0H;
                                ELSE HSO_COMMAND=20H;
             HSO_TIME=TIMER1+3; /*LED$RUN*/
             ENABLE;
          END;
END LED$RUN;

/*-------------------------------------------------------*/
RST_DOG:PROCEDURE PUBLIC;

        IF (IOS0 AND 40h)=0 THEN
          DO;
             DISABLE;
             HSO_COMMAND=03h;
             HSO_TIME=TIMER1+3;
             ENABLE;
          END;


        IF (IOS0 AND 40h)=0 THEN
          DO;
             DISABLE;
             HSO_COMMAND=23h;
             HSO_TIME=TIMER1+3;
             ENABLE;
          END;
        /*WATCHDOG=01eh;
        WATCHDOG=0e1h;*/

END RST_DOG;

/*------------------------------------------------------*/
END YCN1SUB;
EOF;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -