📄 ycn1int.plm
字号:
/*------------------------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 + -