📄 ycn1sub.plm
字号:
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 + -