📄 sszjqz.plm
字号:
/*砂石电子秤程序 snwjgp.plm*/
ST0: DO; /*主程序开始*/
$INCLUDE(UTIL51.H)
$INCLUDE(REG51.DCL)
DECLARE
KKDD WORD IDATA,
KKDD3 WORD IDATA,
KKDD1 WORD IDATA,
KKDD2 WORD IDATA,
YSYS WORD IDATA,
QLL WORD IDATA,
KBF WORD IDATA,
KBF1 WORD IDATA,
KBF2 WORD IDATA,
MM1 WORD IDATA,
MM2 WORD IDATA,
TQLL WORD IDATA,
TQLL1 WORD IDATA,
TQLL2 WORD IDATA,
ERR1 BYTE,
ZTZW BYTE,/*状态转换位置*/
WWYY BYTE,/*状态转换位置*/
WYX(8) BYTE,/*显示8位数据*/
XS BYTE,/*控制PPB口记忆*/
XX BYTE,/*控制PPB口记忆*/
XY BYTE,/*控制PPB口记忆*/
DQ BYTE IDATA,
CZD BYTE,/*AD低位*/
CZG BYTE,/*AD高位*/
KZ BYTE,/*控制口*/
JJSS WORD IDATA,/*串行口*/
JJS1 WORD IDATA,/*串行口*/
JJS3 WORD IDATA,/*串行口*/
JJS2 BYTE IDATA,/*串行口*/
DDXX WORD IDATA,/*串行口*/
DDXX1 WORD IDATA,/*串行口*/
JSJS WORD IDATA,/*串行口*/
DDX1(7) BYTE IDATA,/*串行口*/
JP BYTE;/*键值*/
DECLARE
YZZL WORD,/*预置重量*/
SJZL WORD,/*实际重量*/
SL(4) WORD,/*每一种物料秤量前的重量*/
YZDDY(4) WORD,/*当前物料预置重量*/
SJL(4) WORD,
X BYTE,/*物料号循环变量*/
J WORD,/*预置数据存储地址*/
L WORD,/*记忆配方号的地址*/
D WORD,/*秤数*/
M WORD,/*计算地址变量*/
I WORD,/*实际数据存储地址*/
LYS(4) WORD;/*实际数据存储地址*/
DECLARE
LL WORD AT(204CH) AUXILIARY, /*当前测量值在48Z08地址*/
LLL WORD AT(204AH) AUXILIARY, /*当前测量值在48Z08地址*/
LLLL WORD AT(2048H) AUXILIARY, /*当前秤数*/
KKD WORD AT(2046H) AUXILIARY, /*当前测量值在48Z08地址*/
KD WORD AT(2044H) AUXILIARY, /*当前秤数*/
LLYS(3) WORD AT(203CH) AUXILIARY, /*各物料的提前量*/
IO8255 BYTE AT(4003H) AUXILIARY, /*8255地址.命令*/
PPA BYTE AT(4000H) AUXILIARY, /*PA口地址*/
PPB BYTE AT(4001H) AUXILIARY, /*PB口地址*/
PPC BYTE AT(4002H) AUXILIARY, /*PC口地址*/
D7218 BYTE AT(6000H) AUXILIARY, /*7218地址*/
AD7109 BYTE AT(8000H) AUXILIARY, /*7109地址*/
D244 BYTE AT(0A000H) AUXILIARY; /*74244地址*/
DLDL: PROCEDURE;/*7.5毫秒*/
DECLARE
DD1 BYTE,
DD2 BYTE;
DO DD1=1 TO 5;
DO DD2=1 TO 64;
P13=NOT P13;
END;
END;
END DLDL;
DLD1: PROCEDURE;/*240毫秒*/
DECLARE
DD3 BYTE,
DD4 BYTE;
DO DD3=1 TO 160;
DO DD4=1 TO 64;
P13=NOT P13;
END;
END;
END DLD1;
/*CXKK: PROCEDURE;
IF RI=1 THEN
DO;
JSJS=0;
RI=0;
DDX1(1)=SBUF;
CALL DLDL;
SBUF=DDX1(3);
WAI1: IF TI=0 THEN
DO;
JSJS=JSJS+1;
IF JSJS>=10000 THEN
DO;
JSJS=0;
RETURN;
END;
P13=NOT P13;
GOTO WAI1;
END;
TI=0;
JSJS=0;
WAI2: IF RI=0 THEN
DO;
JSJS=JSJS+1;
IF JSJS>=10000 THEN
DO;
JSJS=0;
RETURN;
END;
P13=NOT P13;
GOTO WAI2;
END;
RI=0;
JSJS=0;
DDX1(2)=SBUF;
CALL DLDL;
SBUF=DDX1(4);
WAI3: IF TI=0 THEN
DO;
JSJS=JSJS+1;
IF JSJS>=10000 THEN
DO;
JSJS=0;
RETURN;
END;
P13=NOT P13;
GOTO WAI3;
END;
TI=0;
JSJS=0;
END;
JSJS=0;
END CXKK;*/
CXKK: PROCEDURE;
;
END CXKK;
DJP: PROCEDURE BYTE;/*读键盘*/
P1=0FFH;
P13=NOT P13;
P10=0;
IF P14=0 THEN RETURN 11;/*状态转换*/
IF P15=0 THEN RETURN 12;/*配方*/
IF P16=0 THEN RETURN 13;/*物料*/
IF P17=0 THEN RETURN 21;/*个位*/
P10=1;
P11=0;
IF P14=0 THEN RETURN 14;/*十位*/
IF P15=0 THEN RETURN 15;/*百位*/
IF P16=0 THEN RETURN 16;/*千位*/
IF P17=0 THEN RETURN 17;/*启动*/
P11=1;
P12=0;
IF P14=0 THEN RETURN 18;/*打印*/
IF P15=0 THEN RETURN 19;/*卸料*/
IF P16=0 THEN RETURN 20;/*暂停*/
P12=1;
RETURN 0FFH;
END DJP; /*一次读键盘结束*/
KKZ: PROCEDURE BYTE;/*控制口*/
CALL DLDL;/*TIME(35)*/
IF (PPC AND 0F0H)=0E0H THEN CALL DLDL;/*TIME(75)*/
IF (PPC AND 0F0H)=0E0H THEN RETURN 1;
IF (PPC AND 0F0H)=0D0H THEN CALL DLDL;/*TIME(75)*/
IF (PPC AND 0F0H)=0D0H THEN GOTO Z2;
IF (PPC AND 0F0H)=0B0H THEN CALL DLDL;/*TIME(75)*/
IF (PPC AND 0F0H)=0B0H THEN GOTO Z3;
IF (PPC AND 0F0H)=70H THEN CALL DLDL;/*TIME(75)*/
IF (PPC AND 0F0H)=70H THEN GOTO Z4;
RETURN 0FFH;
/*Z1: CALL DLDL;
IF (PPC AND 0F0H)<>0E0H THEN RETURN 1;
GOTO Z1;*/
Z2: CALL DLDL;/*TIME(75)*/
IF (PPC AND 0F0H)<>0D0H THEN RETURN 2;/*PC5负脉冲启动*/
GOTO Z2;
Z3: CALL DLDL;/*TIME(75)*/
IF (PPC AND 0F0H)<>0B0H THEN RETURN 3;/*PC6负脉冲配方*/
GOTO Z3;
Z4: CALL DLDL;/*TIME(75)*/
IF (PPC AND 0F0H)<>70H THEN RETURN 4;/*PC7负脉冲状态*/
GOTO Z4;
END KKZ;/*结束*/
SZXS: PROCEDURE;/*数字显示*/
P13=NOT P13;
PPB=PPB OR 80H;
D7218=90H;
PPB=PPB AND 7FH; /*置7218MODE低电平输入数据*/
D7218=WYX(6)+0F0H;/*配方*/
D7218=WYX(5)+0F0H;/*物料*/
D7218=WYX(4)+0F0H;/*千*/
D7218=WYX(3)+0F0H;/*百*/
D7218=WYX(2)+0F0H;/*十*/
D7218=WYX(1)+0F0H;/*个*/
D7218=WYX(8)+0F0H;
D7218=WYX(7)+0F0H;
XX=PPA AND 80H;
IF XX=80H THEN
DO;
IO8255=98H;
;
;
PPB=XS;
PPC=XY;
END;
END SZXS; /*数字显示结束*/
ADYX: PROCEDURE;/*AD运行*/
DECLARE
CZZ BYTE;
DD: P13=NOT P13;
IF INT0=1 THEN GOTO DD;
T0=0;/*读低位*/
T1=1;
CZD=AD7109;
T0=1;/*读高位*/
T1=0;
CZZ=AD7109 AND 3FH;
CZG=CZZ AND 0FH;
CZZ=SHR(CZZ,4);
SJZL=CZG*256+CZD;
KKDD=KKD;
CALL DLDL;
KKDD3=2070H;
CALL MOVXD0(KKDD3,.KKDD1,2);
;
CALL DLDL;
IF KKDD<>KKDD1 THEN
DO;
KKDD3=2076H;
CALL MOVXD0(KKDD3,.KKDD2,2);
;
CALL DLDL;
IF KKDD1=KKDD2 THEN
DO;
KKDD=KKDD1;
KKD=KKDD1;
END;
ELSE
DO;
KKDD=100;
KKD=100;
CALL DLDL;
ERR1=14;
END;
END;
/* YSYS=SJZL MOD 100;
SJZL=SJZL/100;
YSYS=YSYS*KKDD/100;
SJZL=SJZL*KKDD+YSYS;
SJZL=SJZL;*/
IF KD=0 OR KD>5 THEN KD=1;
IF (SJZL MOD KD)>KD/2 THEN SJZL=SJZL+KD;
SJZL=SJZL/KD*KD;
IF SJZL>4000 THEN CZZ=3;
DO CASE CZZ;
DO;
IF SJZL>999 THEN
DO;
WYX(1)=13;
WYX(2)=13;
WYX(3)=13;
WYX(4)=13;
END;
ELSE
DO;
WYX(1)=SJZL MOD 10;
WYX(2)=SJZL/10 MOD 10;
WYX(3)=SJZL/100 MOD 10;
WYX(4)=10;
END;
END;
DO;
WYX(1)=13;
WYX(2)=13;
WYX(3)=13;
WYX(4)=13;
END;
DO;
WYX(1)=SJZL MOD 10;
WYX(2)=SJZL/10 MOD 10;
WYX(3)=SJZL/100 MOD 10;
WYX(4)=SJZL/1000;
END;
DO;
WYX(1)=12;
WYX(2)=12;
WYX(3)=12;
WYX(4)=12;
END;
END;
RETURN;
END ADYX; /*AD运行结束*/
CYSJ: PROCEDURE;/*存预置数据*/
P13=NOT P13;
M=WYX(6)*6+(WYX(5)-1)*2+J;
YZZL=WYX(1)+WYX(2)*10+WYX(3)*100+WYX(4)*1000;
CALL MOVDX0(.YZZL,M,2);/*存数据*/
CALL DLDL;
CALL DLDL;
RETURN;
END CYSJ; /*存预置数据结束*/
DYSJ: PROCEDURE;/*调用预置数据*/
P13=NOT P13;
M=WYX(6)*6+(WYX(5)-1)*2+J;
CALL MOVXD0(M,.YZZL,2);/*调数据*/
CALL DLDL;
CALL DLDL;
WYX(1)=YZZL MOD 10;
WYX(2)=YZZL/10 MOD 10;
WYX(3)=YZZL/100 MOD 10;
WYX(4)=YZZL/1000;
RETURN;
END DYSJ; /*调用预置数据结束*/
YZ1: PROCEDURE (WYX) BYTE;/*预置一位*/
DECLARE WYX BYTE;
WYX=WYX+1;
P13=NOT P13;
RETURN WYX;
END YZ1; /*预置一位结束*/
YZ: PROCEDURE;/*预置*/
P13=NOT P13;
PPC=0FEH;/*预置灯亮,其它灯不亮;*/
CALL DLDL;/*TIME(75)*/
M=WYX(6)*6+(WYX(5)-1)*2+J;
CALL MOVXD0(M,.YZZL,2);/*存配方预置数*/
CALL DLDL;/*TIME(75)*/
CALL DYSJ;
CALL SZXS;
YZYZ: JP=DJP;
P13=NOT P13;
IF JP =21 THEN DO;/*个*/
P13=NOT P13;
WYX(1)=YZ1(WYX(1));
IF WYX(1)>9 THEN WYX(1)=0;
CALL CYSJ;
CALL SZXS;
CALL DLD1;
END;
IF JP =14 THEN DO;/*十*/
P13=NOT P13;
WYX(2)=YZ1(WYX(2));
IF WYX(2)>9 THEN WYX(2)=0;
CALL CYSJ;
CALL SZXS;
CALL DLD1;
END;
IF JP =15 THEN DO;/*百*/
P13=NOT P13;
WYX(3)=YZ1(WYX(3));
IF WYX(3)>9 THEN WYX(3)=0;
CALL CYSJ;
CALL SZXS;
CALL DLD1;
END;
IF JP =16 THEN DO;/*千*/
P13=NOT P13;
WYX(4)=YZ1(WYX(4));
IF WYX(4)>9 THEN WYX(4)=0;
CALL CYSJ;
CALL SZXS;
CALL DLD1;
END;
IF JP =13 THEN DO;/*物料*/
P13=NOT P13;
WYX(5)=YZ1(WYX(5));
IF WYX(5)=0 THEN WYX(5)=1;
IF WYX(5)>3 THEN WYX(5)=1;
CALL DYSJ;
CALL SZXS;
CALL DLD1;
END;
IF JP =12 THEN DO;/*配方*/
P13=NOT P13;
WYX(6)=YZ1(WYX(6));
IF WYX(6)>12 THEN WYX(6)=0;
CALL DYSJ;
CALL SZXS;
CALL DLD1;
END;
CALL SZXS;
IF JP =11 THEN GOTO YYZZ;/*状态*/
KZ=KKZ;
IF KZ=4 THEN GOTO YYZZ;
GOTO YZYZ;
YYZZ: P13=NOT P13;
CALL MOVDX0(.WYX(6),L,1);/*存配方预置数*/
ZTZW=ZTZW+1;
DO WWYY =1 TO 3;
WYX(5)=WWYY;
M=WYX(6)*6+(WYX(5)-1)*2+J;
CALL MOVXD0(M,.YZZL,2);
;
CALL DLDL;
CALL DLDL;
MM1=10*6+(WYX(5)-1)*2+J;
CALL MOVXD0(MM1,.TQLL,2);
;
CALL DLDL;
KBF=(WYX(5)-1)*2+2050H;
CALL MOVDX0(.YZZL,KBF,2);
;
CALL DLDL;
CALL DLDL;
MM2=(WYX(5)-1)*2+2058H;
CALL MOVDX0(.TQLL,MM2,2);
;
CALL DLDL;
CALL DLDL;
KBF=(WYX(5)-1)*2+2060H;
CALL MOVDX0(.YZZL,KBF,2);
;
CALL DLDL;
CALL DLDL;
MM2=(WYX(5)-1)*2+2068H;
CALL MOVDX0(.TQLL,MM2,2);
;
CALL DLDL;
CALL DLDL;
END;
KKDD3=2046H;
CALL MOVXD0(KKDD3,.KKDD,2);
;
CALL DLDL;
KKDD3=2070H;
CALL MOVDX0(.KKDD,KKDD3,2);
;
CALL DLDL;
CALL DLDL;
KKDD3=2076H;
CALL MOVDX0(.KKDD,KKDD3,2);
;
CALL DLDL;
CALL DLDL;
WYX(5)=1;
CALL DLD1;
ERR1=0;
RETURN;
END YZ; /*预置结束*/
ZT: PROCEDURE;/*暂停*/
P13=NOT P13;
JP=DJP;
IF JP<>20 THEN GOTO ZT2;
PPB=0FFH;
CALL DLD1;
CALL DLD1;
ZT1: JP=DJP;
P13=NOT P13;
IF JP<>20 THEN GOTO ZT1;
CALL DLD1;
CALL DLD1;
PPB=XS;
ZT2: RETURN;
END ZT; /*暂停结束*/
QD2: PROCEDURE;/*秤量一种物料*/
DECLARE
DLW WORD;
PPC=0FBH;/*运行灯亮,其它灯不亮;*/
;
XY=0FBH;
XS=7FH;
CALL ZT;/*延时5秒*/
M=WYX(6)*6+(WYX(5)-1)*2+J;
CALL MOVXD0(M,.YZDDY(X),2);
;
CALL DLDL;
KBF=(WYX(5)-1)*2+2050H;
CALL MOVXD0(KBF,.KBF1,2);
;
CALL DLDL;
MM2=(WYX(5)-1)*2+2058H;
CALL MOVXD0(MM2,.TQLL1,2);
;
CALL DLDL;
IF YZDDY(X)<>KBF1 THEN
DO;
KBF=(WYX(5)-1)*2+2060H;
CALL MOVXD0(KBF,.KBF2,2);
CALL DLDL;
IF KBF1=KBF2 THEN
DO;
YZDDY(X)=KBF1;
CALL MOVDX0(.YZDDY(X),M,2);
;
CALL DLDL;
END;
ELSE
DO;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -