📄 js520a.psc
字号:
break; case 9: if(i<=(rl+2)){ l=i; RcvPro++; } else RcvPro = 0; break; default: if(RcvPro==(l+10)) { if((UBYTE)(i+i)==ChkSum) RcvPro++; else RcvPro = 0; } else if(RcvPro==(l+11)){ if(i==0x16) { return l; } else RcvPro = 0; } else{ r[RcvPro-10] = i-0x33; RcvPro++; } break; } } } return -1;} LONG DLT645_Read(UBYTE Index, ULLONG DevID, UWORD ID, UBYTE *d, UBYTE Len, UWORD Dly, UBYTE Retry) { OS_WIN *w0; UBYTE k,s[20],r[255],i,j; LONG a; w0 = OSCreatSubWindow(16,20,92,80,1,1,"抄收数据"); OSDrawInWin(w0,2,2,"电表",3,0); sprintf(s,"%4X%08X",(ULONG)(DevID>>32),(ULONG)DevID); OSDrawInWin(w0,8,14,s,3,0); sprintf(s,"数据: %04X",ID); OSDrawInWin(w0,2,26,s,3,0); OSDrawInWin(w0,16,46,"正在通讯...",3,0); while(1){ s[1] = (UBYTE)(ID>>8); s[0] = (UBYTE)ID; for(i=0;i<Retry;i++){ a = DLT645(Index,DevID,0x01,s,2,r,Len,Dly); if(a>=2){ for(j=0;j<(a-2);j++) d[j] = r[j+2]; break; } } if(i>=Retry) { k = OSMessageBox("DLT645","通讯失败!","[ENTER]重试"); if(k!= 0x0D ) { a = -1; break; } } else break; } CloseSubWindow(w0); return a;}LONG DLT645_Write(UBYTE Index,ULLONG DevID, UWORD id, ULONG oPswd, UBYTE *d, UBYTE Len, UWORD Dly, UBYTE Retry){ OS_WIN *w0; UBYTE k,s[255],r[8],i,j; LONG a; w0 = OSCreatSubWindow(16,20,92,80,1,1,"数据编程"); OSDrawInWin(w0,2,2,"电表",3,0); sprintf(s,"%4X%08X",(ULONG)(DevID>>32),(ULONG)DevID); OSDrawInWin(w0,8,14,s,3,0); sprintf(s,"数据: %04X",id); OSDrawInWin(w0,2,26,s,3,0); OSDrawInWin(w0,16,46,"正在通讯...",3,0); while(1){ s[0] = (UBYTE)id; s[1] = (UBYTE)(id>>8); s[2] = (UBYTE)oPswd; s[3] = (UBYTE)(oPswd>>8); s[4] = (UBYTE)(oPswd>>16); s[5] = (UBYTE)(oPswd>>24); for(i=0;i<Len;i++) s[i+6] = d[i]; for(i=0;i<Retry;i++){ a = DLT645(Index,DevID,0x04,s,Len+6,r,0,Dly); if(a>=0) break; } if(i>=Retry) { k = OSMessageBox("DLT645","通讯失败!","[ENTER]重试"); if(k!= 0x0D ) { a = -1; break; } } else break; } CloseSubWindow(w0); return a;}LONG DLT645_WriteID(UBYTE Index,ULLONG DevID,UWORD Dly,UBYTE Retry){ OS_WIN *w0; LONG a; UBYTE k,s[20],r[6],i; w0 = OSCreatSubWindow(16,20,92,80,1,1,"设置电表编号"); OSDrawInWin(w0,2,2,"编号",3,0); sprintf(s,"%4X%08X",(ULONG)(DevID>>32),(ULONG)DevID); OSDrawInWin(w0,8,14,s,3,0); OSDrawInWin(w0,16,46,"正在通讯...",3,0); ID2bcd(DevID,s); while(1){ for(i=0;i<Retry;i++){ a = DLT645(Index,0x999999999999,0x0A,s,6,r,0,Dly); if(a>=0) break; } if(i>=Retry) { k = OSMessageBox("DLT645","通讯失败!","[ENTER]重试"); if(k!= 0x0D ) { a = -1; break; } } else break; } CloseSubWindow(w0); return a;}LONG DLT645_WritePswd(UBYTE Index,ULLONG DevID, ULONG oPswd, ULONG nPswd,UWORD Dly, UBYTE Retry){ OS_WIN *w0; LONG a; UBYTE k,s[20],r[6],i; w0 = OSCreatSubWindow(16,20,92,80,1,1,"设置电表密码"); OSDrawInWin(w0,2,2,"编号",3,0); sprintf(s,"%4X%08X",(ULONG)(DevID>>32),(ULONG)DevID); OSDrawInWin(w0,8,14,s,3,0); OSDrawInWin(w0,16,46,"正在通讯...",3,0); s[0] = (UBYTE)oPswd; s[1] = (UBYTE)(oPswd>>8); s[2] = (UBYTE)(oPswd>>16); s[3] = (UBYTE)(oPswd>>24); s[4] = (UBYTE)nPswd; s[5] = (UBYTE)(nPswd>>8); s[6] = (UBYTE)(nPswd>>16); s[7] = (UBYTE)(nPswd>>24); while(1){ for(i=0;i<Retry;i++){ a = DLT645(Index,DevID,0x0F,s,8,r,4,Dly); if(a>=0) break; } if(i>=Retry) { k = OSMessageBox("DLT645","通讯失败!","[ENTER]重试"); if(k!= 0x0D ) { a = -1; break; } } else break; } CloseSubWindow(w0); return a;}void DLT645_BroadTime(UBYTE Index){ OS_CALENDAR p; UBYTE s[20],r[8]; OSGetCalendar(&p); s[0] = hex2bcd(p.second); s[1] = hex2bcd(p.minute); s[2] = hex2bcd(p.hour); s[3] = hex2bcd(p.day); s[4] = hex2bcd(p.month); s[5] = hex2bcd(p.year%100); DLT645(Index,0x999999999999,0x08,s,6,r,0,0); OSMessageBox("广播校时","发送完成!","任意键返回...");}ULLONG DLT645_InputID(void){ OS_WIN *w0; UBYTE k,d[12],i; ULLONG a=0; w0 = OSCreatSubWindow(6,32,110,44,1,1,"输入编号"); d[0] = 0; k = OSEntryInWin(w0,4,8,12,d,0,0,1); if(k== 0x1B ) a=0x1000000000000; else if(k== 0x0D ){ if(d[0]==0) a=0xAAAAAAAAAAAA; else { for(i=0;i<12;i++){ if(d[i]==0) break; if(d[i]>0x39) d[i] += 9; a = (a<<4)+(d[i]&0xF); } } } CloseSubWindow(w0); return a;}ULONG DLT645_InputPswd(UBYTE mode){ OS_WIN *w0; UBYTE k,d[12],i; ULONG a=mode; if(mode==0) w0 = OSCreatSubWindow(16,32,80,44,1,1,"输入清零密码"); else w0 = OSCreatSubWindow(16,32,80,44,1,1,"输入编程密码"); d[0] = 0; k = OSEntryInWin(w0,16,8,6,d,0,0,1); if(k== 0x1B ) a=0xFFFFFFFF; else if(k== 0x0D ){ for(i=0;i<6;i++){ if(d[i]==0) break; if(d[i]>0x39) d[i] += 9; a = (a<<4)+(d[i]&0xF); } } CloseSubWindow(w0); return a;} void ViewPower(ULLONG devID){ OS_WIN *w0; UBYTE k; UBYTE d[16],c[4],s[20]; sprintf(s," ID [%04X%08X]",(ULONG)(devID>>32),(ULONG)devID); w0 = OSCreatSubWindow(0,0,128,128,1,1,s); while(1){ if(DLT645_Read(4,devID,0x901F,d,16,2000,3)<0) break; if(DLT645_Read(4,devID,0x9020,c,4,1000,3)<0) break; OSDrawInWin(w0,2,4,"当前正向电量",3,0); sprintf(s,"总: %02X%02X%02X.%02X kWh",d[3],d[2],d[1],d[0]); OSDrawInWin(w0,8,18,s,3,0); sprintf(s,"峰: %02X%02X%02X.%02X kWh",d[7],d[6],d[5],d[4]); OSDrawInWin(w0,8,30,s,3,0); sprintf(s,"平: %02X%02X%02X.%02X kWh",d[11],d[10],d[9],d[8]); OSDrawInWin(w0,8,42,s,3,0); sprintf(s,"谷: %02X%02X%02X.%02X kWh",d[15],d[14],d[13],d[12]); OSDrawInWin(w0,8,54,s,3,0); OSDrawInWin(w0,2,70,"当前反向电量",3,0); sprintf(s,"总: %02X%02X%02X.%02X kWh",c[3],c[2],c[1],c[0]); OSDrawInWin(w0,8,84,s,3,0); OSDrawInWin(w0,2,100,"任意键返回...",3,0); OSWaitKey(); break; } CloseSubWindow(w0);}void ViewHistory(ULLONG devID){ OS_WIN *w0,*w1; UBYTE k; ULONG sele; UBYTE d[12][16],c[4],s[20],i; UWORD id=0xD120; sprintf(s," ID [%04X%08X]",(ULONG)(devID>>32),(ULONG)devID); w0 = OSCreatSubWindow(0,0,128,128,1,1,s); for(i=0;i<12;i++){ if(DLT645_Read(4,devID,id+i,d[i],16,2000,3)<0) break; } sele =0; while(1){ k = OSMenuInWin(w0,2,2,19,9,&sele,12,1, " 上 1月电量", " 上 2月电量", " 上 3月电量", " 上 4月电量", " 上 5月电量", " 上 6月电量", " 上 7月电量", " 上 8月电量", " 上 9月电量", " 上10月电量", " 上11月电量", " 上12月电量"); if(k== 0x1B ) break; else if(k== 0x0D ){ sprintf(s,"上%2d月正向电量",sele+1); w1 = OSCreatSubWindow(2,20,120,90,1,1,s); sprintf(s,"总: %02X%02X%02X.%02X kWh",d[sele][3],d[sele][2],d[sele][1],d[sele][0]); OSDrawInWin(w1,8,4,s,3,0); sprintf(s,"峰: %02X%02X%02X.%02X kWh",d[sele][7],d[sele][6],d[sele][5],d[sele][4]); OSDrawInWin(w1,8,17,s,3,0); sprintf(s,"平: %02X%02X%02X.%02X kWh",d[sele][11],d[sele][10],d[sele][9],d[sele][8]); OSDrawInWin(w1,8,30,s,3,0); sprintf(s,"谷: %02X%02X%02X.%02X kWh",d[sele][15],d[sele][14],d[sele][13],d[sele][12]); OSDrawInWin(w1,8,43,s,3,0); OSDrawInWin(w1,2,60,"任意键返回...",3,0); OSWaitKey(); CloseSubWindow(w1); } } CloseSubWindow(w0);}void ViewReverse(ULLONG devID){ OS_WIN *w0; UBYTE k; UBYTE d[4],c[3],s[20]; sprintf(s," ID [%04X%08X]",(ULONG)(devID>>32),(ULONG)devID); w0 = OSCreatSubWindow(0,0,128,128,1,1,s); while(1){ if(DLT645_Read(4,devID,0xB020,d,4,2000,3)<0) break; if(DLT645_Read(4,devID,0xB021,c,3,2000,3)<0) break; OSDrawInWin(w0,2,4,"反向起始时间",3,0); sprintf(s,"%02X月%02X日%02X时%02X分",d[3],d[2],d[1],d[0]); OSDrawInWin(w0,8,18,s,3,0); OSDrawInWin(w0,2,36,"反向累计总时间",3,0); sprintf(s,"%2X%02X%02X分钟",c[2],c[1],c[0]); OSDrawInWin(w0,8,50,s,3,0); OSDrawInWin(w0,2,100,"任意键返回...",3,0); OSWaitKey(); break; } CloseSubWindow(w0);}void ViewProgram(ULLONG devID){ OS_WIN *w0; UBYTE k; UBYTE d[4],c[3],s[20]; sprintf(s," ID [%04X%08X]",(ULONG)(devID>>32),(ULONG)devID); w0 = OSCreatSubWindow(0,0,128,128,1,1,s); while(1){ if(DLT645_Read(4,devID,0xB210,d,4,2000,3)<0) break; if(DLT645_Read(4,devID,0xB212,c,2,2000,3)<0) break; OSDrawInWin(w0,2,4,"最后一次编程时间",3,0); sprintf(s,"%02X月%02X日%02X时%02X分",d[3],d[2],d[1],d[0]); OSDrawInWin(w0,8,18,s,3,0); OSDrawInWin(w0,2,36,"编程次数",3,0); sprintf(s,"%2X%02X 次",c[1],c[0]); OSDrawInWin(w0,8,50,s,3,0); OSDrawInWin(w0,2,100,"任意键返回...",3,0); OSWaitKey(); break; } CloseSubWindow(w0);}void ViewTime(ULLONG devID){ OS_WIN *w0; UBYTE k; UBYTE d[4],c[3],s[20]; sprintf(s," ID [%04X%08X]",(ULONG)(devID>>32),(ULONG)devID); w0 = OSCreatSubWindow(0,0,128,128,1,1,s); while(1){ if(DLT645_Read(4,devID,0xC010,d,4,2000,3)<0) break; if(DLT645_Read(4,devID,0xC011,c,3,2000,3)<0) break; OSDrawInWin(w0,2,4,"电表日期",3,0); sprintf(s,"%02X年%02X月%02X日",d[3],d[2],d[1]); OSDrawInWin(w0,8,18,s,3,0); OSDrawInWin(w0,2,36,"电表时间",3,0); sprintf(s,"%2X:%02X:%02X",c[2],c[1],c[0]); OSDrawInWin(w0,8,50,s,3,0); OSDrawInWin(w0,2,100,"任意键返回...",3,0); OSWaitKey(); break; } CloseSubWindow(w0);}void ViewStatus(ULLONG devID){ OS_WIN *w0; UBYTE k; UBYTE d[6],s[20]; sprintf(s," ID [%04X%08X]",(ULONG)(devID>>32),(ULONG)devID); w0 = OSCreatSubWindow(0,0,128,128,1,1,s); while(1){ if(DLT645_Read(4,devID,0xC020,d,1,2000,3)<0) break; OSDrawInWin(w0,2,4,"电表状态: ",3,0); if(d[0]&1) OSDrawInWin(w0,8,18,"电池-异常",3,0); else OSDrawInWin(w0,8,18,"电池-正常",3,0); if(d[0]&2) OSDrawInWin(w0,8,30,"电表硬件-异常",3,0); else OSDrawInWin(w0,8,30,"电表硬件-正常",3,0); if(d[0]&4) OSDrawInWin(w0,8,42,"电表通讯-异常",3,0); else OSDrawInWin(w0,8,42,"电表通讯-正常",3,0); if(d[0]&8) OSDrawInWin(w0,8,42,"电表时钟-异常",3,0); else OSDrawInWin(w0,8,42,"电表时钟-正常",3,0); if(d[0]&0x10) OSDrawInWin(w0,8,54,"电能方向-反向",3,0); else OSDrawInWin(w0,8,54,"电能方向-正向",3,0); if(d[0]&0x20) OSDrawInWin(w0,8,66,"允许校时期",3,0); else OSDrawInWin(w0,8,66,"禁止校时期",3,0); if((d[0]&0xC0)==0) OSDrawInWin(w0,8,78,"当前费率-尖",3,0); else if((d[0]&0xC0)==0x40) OSDrawInWin(w0,8,78,"当前费率-峰",3,0); else if((d[0]&0xC0)==0x80) OSDrawInWin(w0,8,78,"当前费率-平",3,0); else OSDrawInWin(w0,8,78,"当前费率-谷",3,0); OSDrawInWin(w0,2,100,"任意键返回...",3,0); OSWaitKey(); break; } CloseSubWindow(w0);}void ViewConstant(ULLONG devID){ OS_WIN *w0; UBYTE k; UBYTE d[3],s[20]; sprintf(s," ID [%04X%08X]",(ULONG)(devID>>32),(ULONG)devID); w0 = OSCreatSubWindow(0,0,128,128,1,1,s); while(1){ if(DLT645_Read(4,devID,0xC030,d,3,2000,3)<0) break; OSDrawInWin(w0,2,4,"脉冲常数",3,0); sprintf(s,"%02X%02X%02X",d[2],d[1],d[0]); OSDrawInWin(w0,8,18,s,3,0); OSDrawInWin(w0,2,100,"任意键返回...",3,0); OSWaitKey(); break; } CloseSubWindow(w0);}void ViewID(ULLONG devID){ OS_WIN *w0; UBYTE k; UBYTE d[8],c[8],s[20]; sprintf(s," ID [%04X%08X]",(ULONG)(devID>>32),(ULONG)devID); w0 = OSCreatSubWindow(0,0,128,128,1,1,s); while(1){ if(DLT645_Read(4,devID,0xC032,d,6,2000,3)<0) break; if(DLT645_Read(4,devID,0xC033,c,6,2000,3)<0) break; OSDrawInWin(w0,2,4,"出厂编号",3,0); sprintf(s,"%02X%02X%02X%02X%02X%02X",d[5],d[4],d[3],d[2],d[1],d[0]); OSDrawInWin(w0,8,18,s,3,0); OSDrawInWin(w0,2,36,"局编号",3,0); sprintf(s,"%02X%02X%02X%02X%02X%02X",c[5],c[4],c[3],c[2],c[1],c[0]); OSDrawInWin(w0,8,50,s,3,0); OSDrawInWin(w0,2,100,"任意键返回...",3,0); OSWaitKey(); break; } CloseSubWindow(w0);}void ViewTarrif(ULLONG devID){ OS_WIN *w0; UBYTE d[12][3],s[20],t[12][16]; LONG l,i; ULONG sele; sprintf(s," ID [%04X%08X]",(ULONG)(devID>>32),(ULONG)devID); w0 = OSCreatSubWindow(0,0,128,128,1,1,s); while(1){ l = DLT645_Read(4,devID,0xC33F,&d[0][0],38,2000,3); if(l<0) break; if((l<3)||(l>38)) { OSSureBox("抄收时段表","时段表无数据!"); break; } for(i=0;i<(l/3);i++) { sprintf(t[i],"%02X:%02X 费率%02X",d[i][2],d[i][1],d[i][0]); } sele = 0; OSListInWin(w0,2,2,9,16,0,19,&sele,l/3,1,&t[0][0]); break; } CloseSubWindow(w0);}void ViewStore(ULLONG devID){ OS_WIN *w0; UBYTE k; UBYTE d[6][16],c[3],s[20]; sprintf(s," ID [%04X%08X]",(ULONG)(devID>>32),(ULONG)devID); w0 = OSCreatSubWindow(0,0,128,128,1,1,s); while(1){ if(DLT645_Read(4,devID,0xC117,d[5],2,1000,3)<0) break; sprintf(s,"自动抄表日: %02X日%02X时",d[5][1],d[5][0]); OSDrawInWin(w0,2,44,s,3,0); OSDrawInWin(w0,2,100,"任意键返回...",3,0); OSWaitKey(); break; } CloseSubWindow(w0);}void ViewDisplay(ULLONG devID){ OS_WIN *w0; UBYTE k; UBYTE d[6][16],c[3],s[20]; sprintf(s," ID [%04X%08X]",(ULONG)(devID>>32),(ULONG)devID); w0 = OSCreatSubWindow(0,0,128,128,1,1,s); while(1){ if(DLT645_Read(4,devID,0xC115,d[5],3,1000,3)<0) break; sprintf(s,"显示选择: %02X-%02X-%02X",d[5][0],d[5][1],d[5][2]); OSDrawInWin(w0,2,44,s,3,0); OSDrawInWin(w0,2,100,"任意键返回...",3,0); OSWaitKey(); break; } CloseSubWindow(w0);}void ViewVolage(ULLONG devID){ OS_WIN *w0; UBYTE k; UBYTE d[6][16],c[3],s[20]; sprintf(s," ID [%04X%08X]",(ULONG)(devID>>32),(ULONG)devID); w0 = OSCreatSubWindow(0,0,128,128,1,1,s); while(1){ if(DLT645_Read(4,devID,0xCFFF,d[5],3,1000,3)<0) break; sprintf(s,"温度: %d",d[5][0]); OSDrawInWin(w0,2,44,s,3,0); sprintf(s,"电压: %02X-%02X",d[5][1],d[5][1]); OSDrawInWin(w0,2,60,s,3,0); OSDrawInWin(w0,2,100,"任意键返回...",3,0); OSWaitKey(); break; } CloseSubWindow(w0);} void ViewMeter(void){ OS_WIN *w0; UBYTE k; ULONG sele; ULLONG devID=0xAAAAAAAAAAAA,a; w0 = OSCreatSubWindow(0,0,128,126,1,1,"查看电表数据"); while(1){ k = OSMenuInWin(w0,2,1,19,9,&sele,12,1," 1.电量数据"," 2.历史电量数据"," 3.反向信息"," 4.编程信息"," 5.电表时间"," 6.电表状态"," 7.电表常数"," 8.电表编号"," 9.时段"," 10.抄表日"," 11.显示选择"," 12.电池电压及温度"); if(k== 0x1B ) break; else if(k== 0x09 ){ a = DLT645_InputID(); if(a<0x1000000000000) devID = a; } else if(k== 0x0D ){ switch(sele){ case 0: ViewPower(devID); break; case 1: ViewHistory(devID); break; case 2: ViewReverse(devID); break; case 3: ViewProgram(devID); break; case 4: ViewTime(devID); break; case 5: ViewStatus(devID); break; case 6: ViewConstant(devID);break; case 7: ViewID(devID); break; case 8: ViewTarrif(devID); break; case 9: ViewStore(devID); break; case 10: ViewDisplay(devID); break; case 11: ViewVolage(devID); break; default: break; } } } CloseSubWindow(w0);} void SetIniID(ULLONG devID){ OS_WIN *w0; UBYTE s[20]; sprintf(s," ID [%04X%08X]",(ULONG)(devID>>32),(ULONG)devID); w0 = OSCreatSubWindow(0,0,128,128,1,1,s); if(DLT645_WriteID(4,devID,1000,3)==0){ OSMessageBox("设置电表编号","设置成功!","任意键返回..."); } CloseSubWindow(w0);}ULONG inpswd(UBYTE *d){ ULONG a = 0; UBYTE i; for(i=0;i<6;i++){ if(d[i]==0) break; a = (a<<4)+(d[i]&0xF); } return a;}void SetPassword(ULLONG devID, ULONG cPswd, ULONG pPswd){ OS_WIN *w0; UBYTE s[20],d[8],c[8],k; ULONG nPswd; UBYTE a = 1; sprintf(s," ID [%04X%08X]",(ULONG)(devID>>32),(ULONG)devID); w0 = OSCreatSubWindow(0,0,128,128,1,1,s); while(a){ OSDrawInWin(w0,2,4,"输入新清零密码",3,0); d[0] = 0; k = OSEntryInWin(w0,14,20,6,d,0,0,1); if(k== 0x1B ) break; else if(k== 0x0D ){ while(1){ c[0] = 0; OSDrawInWin(w0,2,40,"输入新编程密码",3,0); k = OSEntryInWin(w0,14,56,6,c,0,0,1); if(k== 0x1B ) break; else if(k== 0x0D ){ nPswd = (inpswd(d)<<8); if(DLT645_WritePswd(4,devID,cPswd,nPswd,1000,3)<0) break; ClrPswd = nPswd; nPswd = (inpswd(c)<<8)+1; if(DLT645_WritePswd(4,devID,pPswd,nPswd,1000,3)<0) break; PgmPswd = nPswd; OSMessageBox("修改电表密码","修改成功!","任意键返回..."); a = 0; break; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -