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

📄 ycn1int.plm

📁 这是一个产品完整的代码
💻 PLM
📖 第 1 页 / 共 2 页
字号:
/*------------------------SSC-2 RTU YC card program----------------------*/
/*      Filename     :   YCN1MN.PLM                                      */
/*      Programed by :   Huang Jun                                       */
/*      Modified by  :   Steelen                                         */
/*      Version      :   V 3.04                                          */
/*      Date         :   from 05/10/98 to  dd/mm/yy                      */
/*      Print on     :                                                   */
/*-----------------------------------------------------------------------*/
SEND$BCD:PROCEDURE(GNM) PUBLIC reentrant;
     DCL GNM BYTE ;
     DCL (K1,K2,K3) BYTE ;

     TRBUF(1)=GNM;             /*YC card TEST LINE GNM DATA*/
     TRBUF(2)=64;
     DO K2=0 TO 15;
        DO K3=0 TO 3;
           TRBUF(K2*4+K3+3)=WEST(K2+16*(GNM-6)).BCD(K3);
        END;
     END;

     IF CHECK_FLAG=1 THEN
        DO K2=0 TO 3;
           TRBUF(27+K2)=EAST(0).BCD(K2); /*0V,2048*/
           TRBUF(31+K2)=EAST(1).BCD(K2); /*2.5V,3072*/
        END;

     K2=0;
     DO K1=1 TO (TRBUF(2)+2);
        K2=K2+TRBUF(K1);
     END;
     TRBUF(TRBUF(2)+3)=K2;
     CALL RS485T_CTL;
     TRPT=0;
     TRXH=0;
     TRBZ=1;
     CALL BITSET(.INT_PENDING,6);
END SEND$BCD;

/*-------------------------------------------------------------------*/
EXT_INT:PROCEDURE INTERRUPT 7;
        DCL WREG WORD FAST;
        DCL (REG0,REG1) BYTE AT(.WREG);

        IF CHECK_FLAG=0 THEN  /*normal sampling*/
             DO;IF SAMP$EN AND ITEM THEN
               DO;DO ITEM=0 TO 3; /*0:Uab, 1:Ia, 2:Ucb, 3:Ic*/
                    WREG=0;
                    P1_IMAGE=(NOT WAY) AND 8FH OR (ITEM*16);
                    /* choose what item to be sampled according to ITEM */
                    IOPORT1=P1_IMAGE; /*write to IOPORT1*/
                    CALL BITCLR(.INT_PENDING,7);
                    CALL BITCLR(.INT_PENDING,7);
                    CALL BITCLR(.INT_PENDING,7);   /* WAIT FOR SIGAL STABLE */
                    AD5740=0FFH;  /*start AD converting*/
                    DO WHILE NOT BITTST(.INT_PENDING,7);
                /*wait for the end of converting and the hardware interrupt*/
                       WREG=WREG+1;
                       IF WREG>40 THEN DO;SAMP$NO=0;/*overtime, sampling failed*/
                                          P1_IMAGE=(NOT WAY) AND 0FH;
                                          IOPORT1=P1_IMAGE;
                                          P1_IMAGE=(NOT WAY) OR 80H;
                                          IOPORT1=P1_IMAGE;
                                          ITEM=0FFH; /*reset sampling*/
                                          RETURN;
                                       END;
                    END;

                    REG0=AD5741;  /* read the low 4 bits*/
                    REG1=AD5740;  /* read the high 8 bits*/
                    WREG=SHR(WREG,4);
                    XT(SAMP$NO*4+ITEM)=WREG;/*stored into XT*/
                 END;
                 SAMP$NO=SAMP$NO+1;
                 CALL BITCLR(.INT_PENDING,7);
                 P1_IMAGE=(NOT WAY) AND 0FH; /*sampling next point*/
                 IOPORT1=P1_IMAGE; /*CLD=0*/
                 ITEM=0FFH;
                 IF SAMP$NO>=N THEN DO;SAMP$NO=0;
                                       SAMP$END=0FFH;
                                       SAMP$EN=0;
                                    END;
                               ELSE DO;P1_IMAGE=(NOT WAY) OR 80H;
                                       IOPORT1=P1_IMAGE; /*CLD=1*/
                                    END;
               END;
             END;

        IF CHECK_FLAG=1 THEN /* check AD converter*/
           DO;IF SAMP$EN AND ITEM THEN
              DO;ITEM=0;
                 CALL BITCLR(.INT_PENDING,7);
                 AD5740=0FFH;
                 WREG=0;
                 DO WHILE NOT BITTST(.INT_PENDING,7);
                    WREG=WREG+1;
                    IF WREG>40 THEN DO;SAMP$NO=0; /*overtime,sampling failed*/
                                       P1_IMAGE=5FH;
                                       IOPORT1=P1_IMAGE;
                                       P1_IMAGE=0DFH;
                                       IOPORT1=P1_IMAGE;
                                       ITEM=0FFH;/*reset sampling*/
                                       RETURN;
                                    END;
                 END;
                 REG0=AD5741;
                 REG1=AD5740;
                 WREG=SHR(WREG,4);
                 XT(SAMP$NO)=WREG;
                 SAMP$NO=SAMP$NO+1;
                 CALL BITCLR(.INT_PENDING,7);
                 ITEM=0FFH;
                 IF SAMP$NO>=N THEN IF SAMP$NO>=SHL(N,1) THEN
                                       /*2N points sampled,next cycle of sampling*/
                                       DO;SAMP$EN=0;
                                          SAMP$END=0FFH;
                                          SAMP$NO=0;
                                          P1_IMAGE=5FH;
                                          IOPORT1=P1_IMAGE;
                                       END;
                                                         ELSE
                                       DO;P1_IMAGE=7FH; /*sampling next 2.5V point*/
                                          IOPORT1=P1_IMAGE;
                                          P1_IMAGE=0FFH;
                                          IOPORT1=P1_IMAGE;
                                       END;
                               ELSE DO;P1_IMAGE=5FH;/*sampling next 0V point*/
                                       IOPORT1=P1_IMAGE;
                                       P1_IMAGE=0DFH;
                                       IOPORT1=P1_IMAGE;
                                    END;
              END;
           END;
END EXT_INT;

/*-----------------------------------------------------------------------*/
SIO_INT:PROCEDURE INTERRUPT 6;
  DCL (K0,K1) BYTE FAST;
        INT_MASK=80H;
        ENABLE;
        IF BITTST(.SP_STAT,6) THEN
          DO;REBUF(RECONT)=SBUF;                           /*Receive INT*/
             IF RECONT=0 THEN IF SBUF<>BHAD THEN DO;SP_CON=0AH;
                                                    GOTO TTBK;
                                                 END;
                                            ELSE SP_CON=0BH;
             IF RECONT>2 THEN
               DO;IF RECONT>(REBUF(2)+2) THEN
                    DO;K1=0;
                       DO K0=1 TO (REBUF(2)+2);
                         K1=K1+REBUF(K0);
                       END;
                       IF K1=REBUF(RECONT) THEN
                         DO;IF REBUF(1)=0FFH THEN TRXH=5;
                            IF YC_TEST_FLAG=0 THEN DO;IF REBUF(1)>5 THEN REBUF(1)=0;
                                                   END;
                                              ELSE DO;IF REBUF(1)>17 THEN REBUF(1)=0;
                                                   END;
                            DO CASE REBUF(1);
                              ;                              /*REBUF(1)=0*/

                              DO;TRLEN(0)=REBUF(2);          /*REBUF(1)=1*/
                                 IF REBUF(2)>12 THEN DO;REBUF(2)=12;
                                                        TRLEN(0)=12;
                                                     END;
                                 DO K0=1 TO REBUF(2);
                                   YCML(K0-1)=REBUF(K0+2);
                                 END;
                                 TRXH=1;
                              END;

                              DO;TRLEN(1)=REBUF(2);          /*REBUF(1)=2*/
                                 DO K0=1 TO REBUF(2);
                                   FML(K0-1)=REBUF(K0+2);
                                 END;
                                 TRXH=2;
                              END;

                              DO;TRLEN(2)=REBUF(2);          /*REBUF(1)=3*/
                                 DO K0=1 TO REBUF(2);
                                   WML(K0-1)=REBUF(K0+2);
                                 END;
                                 TRXH=3;
                              END;

                              DO;TRLEN(3)=REBUF(3);          /*REBUF(1)=4*/
                                 TRXH=4;
                              END;

                              DO;DO K0=1 TO REBUF(2);        /*REBUF(1)=5*/
                                   YZWML(K0-1)=REBUF(K0+2);
                                 END;
                                 TRXH=0;
                              END;

                              DO;TRXH=6;
                              END;

                              DO;TRXH=7;
                              END;

                              DO;TRXH=8;
                              END;

                              DO;TRXH=9;
                              END;

                              DO;TRXH=10;
                              END;

                              DO;TRXH=11;
                              END;

                              DO;TRXH=12;
                              END;

                              DO;TRXH=13;
                              END;

                              DO;TRXH=14;
                              END;

                              DO;TRXH=15;
                              END;

                              DO;TRXH=16;
                              END;

                              DO;TRXH=17;
                              END;

                            END;
                            SP_CON=0AH;
                            CALL BITSET(.INT_PENDING,1);
                            /*trigger AD interrupt, send data to Main control board*/
                         END;
                                           ELSE DO;SP_CON=0AH;
                                                   TRXH=0;
                                                END;
                       RECONT=0;
                    END;
                                         ELSE RECONT=RECONT+1;
               END;
                         ELSE RECONT=RECONT+1;
          END;
                              ELSE
          DO;IF TRBZ<>0 THEN     /*TRBZ:sending flag;  Sending INT*/
               DO;IF TRPT=0 THEN DO;SP_CON=12H;
                                    SBUF=TRBUF(0);
                                    TRPT=1;   /*TRPT:sending point*/
                                 END;
                            ELSE DO;SP_CON=03H;
                                    SBUF=TRBUF(TRPT);
                                    IF TRPT>TRBUF(2)+2 THEN
                                      DO;TRBZ=0;
                                         RECONT=0;
                                         SP_CON=0AH;
                                      END;
                                                       ELSE TRPT=TRPT+1;
                                 END;
               END;
                        ELSE     CALL RS485R_CTL;

          END;
TTBK:;
END SIO_INT;

/*-----------------------------------------------------------------------*/
SFT_INT:PROCEDURE INTERRUPT 5;
        INT_MASK=0C0H;
        ENABLE;
        IOS1_image=IOS1_image OR IOS1;
        IF BITTST(.IOS1_image,0) THEN
          DO;CALL BITCLR(.IOS1_image,0);
             HSO_COMMAND=38h;        /*10ms Delay*/
             HSO_TIME=TIMER1+7490;
             RUN$CNT=RUN$CNT+1;
             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;
END SFT_INT;

/*-----------------------------------------------------------------------*/
FS_INT:PROCEDURE INTERRUPT 1;
   /*send data to main control board*/
        DCL WORK WORD FAST;
        DCL (WORK0,WORK1) BYTE AT(.WORK);
        DCL (K1,K2,K3) BYTE FAST;

   INT_MASK=0C0H;
   ENABLE;
   IF CNVT$END=0H THEN
          DO;TRBUF(0)=BHAD;             /*TRXH=5*/
             TRBUF(1)=0FFH;             /*YC card status*/
             IF YC_TEST_FLAG=0 AND CHECK_FLAG=0 THEN
                 DO;TRBUF(2)=2;
                    TRBUF(3)=0;
                    TRBUF(4)=0;
                    TRBUF(5)=1;
                 END;
             IF YC_TEST_FLAG=1 THEN
                 DO;TRBUF(2)=4;
                    TRBUF(3)=0;
                    TRBUF(4)=0;
                    TRBUF(5)=0;
                    TRBUF(6)=0;

⌨️ 快捷键说明

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