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

📄 js520a.c

📁 用于F3200掌机抄表设表
💻 C
📖 第 1 页 / 共 3 页
字号:

void SetTarrif(ULLONG devID, ULONG pPswd)
{
	OS_WIN *w0,*w1;
	OS_CALENDAR p;
	UBYTE s[20],k,i,t[12][20];
	ULLONG nID;
	ULONG sele;
	
	sprintf(s," ID [%04X%08X]",(ULONG)(devID>>32),(ULONG)devID);
	w0 = OSCreatSubWindow(0,0,128,128,1,1,s);
	sele = 0;
	while(1){
		for(i=0;i<12;i++) {
			sprintf(t[i],"%02d--%02X:%02X 费率%02X",i+1,tr[i][2],tr[i][1],tr[i][0]);
		}				
		k = OSListInWin(w0,2,2,9,20,0,19,&sele,12,1,&t[0][0]);
		if(k==K_ESC) break;
		else if(k==K_ENTER) {		
			for(i=0;i<12;i++){
				if(tr[i][0] > 0x04){ break; }
			}
			if(DLT645_Write(4,devID,0xC33F,pPswd,&tr[0][0],i*3,2000,3)==0) {
				OSMessageBox("修改显示选择","修改成功!","任意键返回...");
			}		
		}
		else if(k==K_HYPHEN){
			w1 = OSCreatSubWindow(8,32,100,64,1,1,"修改时段表");
			sprintf(s,"输入时段%d:",sele+1);
			OSDrawInWin(w1,2,4,s,3,0);
			OSDrawInWin(w1,2,16,"[时:分 费率]",3,0);
			s[0]=0;
			k = OSEntryInWin(w1,2,32,6,s,0,0,1);		//输入
			if(k==K_ENTER){
				tr[sele][2] = (s[0]<<4)+(s[1]&0xF);
				tr[sele][1] = (s[2]<<4)+(s[3]&0xF);
				tr[sele][0] = (s[4]<<4)+(s[5]&0xF);
			}							
			CloseSubWindow(w1);
		}		
	}
	CloseSubWindow(w0);
}

void SetStore(ULLONG devID,ULONG pPswd)
{
	OS_WIN *w0;
	UBYTE k,d[8],s[20];
	ULLONG nID;

	sprintf(s," ID [%04X%08X]",(ULONG)(devID>>32),(ULONG)devID);
	w0 = OSCreatSubWindow(0,0,128,128,1,1,s);
	OSDrawInWin(w0,2,14,"请输入抄表日:",3,0);
	OSDrawInWin(w0,24,34,"[日:时]",3,0);
	d[0]=0;
	k = OSEntryInWin(w0,26,50,4,d,0,0,1);		
	if(k==K_ENTER){
		s[1] = (d[0]<<4)+(d[1]&0xF);
		s[0] = (d[2]<<4)+(d[3]&0xF);
		if(DLT645_Write(4,devID,0xC117,pPswd,s,2,1000,3)==0) {
			OSMessageBox("修改抄表日","修改成功!","任意键返回...");
		}
	}
	CloseSubWindow(w0);
}

void ReadPswd(ULLONG devID)
{
	OS_WIN 	*w0;
	UBYTE k;
	UBYTE d[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,0xC1EE,d,12,1000,3)<0) 	break;
		sprintf(s,"清零密码: %02X%02X%02X-%02X",d[3],d[2],d[1],d[0]);
		OSDrawInWin(w0,2,30,s,3,0);
		sprintf(s,"编程密码: %02X%02X%02X-%02X",d[7],d[6],d[5],d[4]);		
		OSDrawInWin(w0,2,44,s,3,0);
		OSDrawInWin(w0,2,100,"任意键返回...",3,0);	
		OSWaitKey();
		break;	
	}
	CloseSubWindow(w0);
}

void ReadEE(ULLONG devID)
{
	OS_WIN 	*w0;
	UBYTE k;
	UBYTE d[16],c[3],s[20];
	UWORD addr;

	sprintf(s," ID [%04X%08X]",(ULONG)(devID>>32),(ULONG)devID);
	w0 = OSCreatSubWindow(0,0,128,128,1,1,s);
	while(1){
		OSDrawInWin(w0,2,4,"输入地址",3,0);		
		d[0] = 0;
		k = OSEntryInWin(w0,14,20,6,d,0,0,1);
		if(k==K_ESC) break;
		else if(k==K_ENTER){
			addr = (UWORD)atol(d);
			addr = (addr&0xFF) + 0xFF00;
		}
		if(DLT645_Read(4,devID,addr,d,18,1000,3)<0) 	break;
		sprintf(s,"00: %02X%02X%02X%02X",d[0],d[1],d[2],d[3]);
		OSDrawInWin(w0,2,12,s,3,0);
		sprintf(s,"04: %02X%02X%02X%02X",d[4],d[5],d[6],d[7]);
		OSDrawInWin(w0,2,24,s,3,0);
		sprintf(s,"08: %02X%02X%02X%02X",d[8],d[9],d[10],d[11]);
		OSDrawInWin(w0,2,36,s,3,0);
		sprintf(s,"0C: %02X%02X%02X%02X",d[12],d[13],d[14],d[15]);
		OSDrawInWin(w0,2,48,s,3,0);
		OSDrawInWin(w0,2,100,"任意键返回...",3,0);	
		OSWaitKey();
		break;	
	}
	CloseSubWindow(w0);
}

void ClrAll()
{
	OS_WIN 	*w0;
	UBYTE s[64],r[32],k;
	OS_CALENDAR p;
	UWORD d[8] ={ 0x0000,0x0000,0x0FFF,0x0FFF,0x0000,0x0000,0x0FFF,0x0FFF };

	w0 = OSCreatSubWindow(0,0,128,128,1,1,"电表初始化");

	s[7] = 0x00;
	s[8] = 0x56;
	s[9] = 0x34;
	s[10] = 0x12;
	s[11] = 0x01;
	s[12] = 0x56;
	s[13] = 0x34;
	s[14] = 0x12;
	sprintf(r,"密码  : %02X%02X%02X%02X",s[10],s[9],s[8],s[7]);
	OSDrawInWin(w0,2,36,r,3,0);
	sprintf(r,"        %02X%02X%02X%02X",s[14],s[13],s[12],s[11]);
	OSDrawInWin(w0,2,48,r,3,0);
	s[15] = 0x00;
	s[16] = 0x01;	//抄表日: 1日0点
	sprintf(r,"抄表日: %02X:%02X",s[16],s[15]);
	OSDrawInWin(w0,2,8,r,3,0);	
	s[17] = 0x10;
	s[18] = 0x00;
	s[19] = 0x7F;
	sprintf(r,"循显  : %02X%02X%02X",s[17],s[18],s[19]);
	OSDrawInWin(w0,2,22,r,3,0);
	//-----------------
	s[20] = 0x06;
	s[21] = 0x02;
	s[22] = 0x00;
	s[23] = 0x07;
	s[24] = 0x04;
	s[25] = 0x00;
	s[26] = 0x22;
	sprintf(r,"时段数: %02X",s[20]/3);
	OSDrawInWin(w0,2,64,r,3,0);
	sprintf(r,"%02X:%02X 费率%02X",s[23],s[22],s[21]);
	OSDrawInWin(w0,12,76,r,3,0);
	sprintf(r,"%02X:%02X 费率%02X",s[26],s[25],s[24]);
	OSDrawInWin(w0,12,88,r,3,0);
	while(1){
		OSDrawInWin(w0,2,100,"ECS退出,其它发送",3,0);
		OSKeyBufClr();
		k = OSWaitKey();
		if(k==K_ESC) break;
		OSGetCalendar(&p);
		s[0] = hex2bcd(p.second);
		s[1] = hex2bcd(p.minute);
		s[2] = hex2bcd(p.hour);
		s[3] = 0;		//week
		s[4] = hex2bcd(p.day);
		s[5] = hex2bcd(p.month);
		s[6] = hex2bcd(p.year%100);
		DLT645(4,0x999999999999,0xFE,s,27,r,0,0);	
		BuzzPlay(12,120,5);
	}
	CloseSubWindow(w0);			
}


//------------------------------------------
void SetMeter(void)
{
	OS_WIN 	*w0;
	UBYTE k;
	ULONG sele;
	ULLONG a;
	
	w0 = OSCreatSubWindow(0,0,128,126,1,1,"设置电表数据");
	while(1){
		k = OSMenuInWin(w0,2,1,19,9,&sele,13,1," 1.设置初始编号"," 2.设置密码"," 3.广播校时"," 4.电表清零"," 5.设置时间"," 6.设置出厂表号"," 7.设置局编号"," 8.显示选择"," 9.设置时段表"," 10.设置抄表日","11. 读密码","12. 读EE"," 13.电表初始化");
		if(k==K_ESC) break;
		else if(k==K_HYPHEN){
			a = DLT645_InputID();
			if(a<0x1000000000000) devID = a;
			sele = DLT645_InputPswd(0);	
			if(sele!=0xFFFFFFFF) ClrPswd = (sele<<8);
			sele = DLT645_InputPswd(1);	
			if(sele!=0xFFFFFFFF) PgmPswd = (sele<<8)+1;
		}
		else if(k==K_ENTER){
			switch(sele){
			case 0:	SetIniID(devID); 	break;
			case 1: SetPassword(devID,ClrPswd,PgmPswd);	break;
			case 2:	CorrectTime();	break;
			case 3:	SetPower(devID,ClrPswd);	break;
			case 4: SetTime(devID,PgmPswd);		break;
			case 5:	SetMtID(devID,PgmPswd);		break;
			case 6:	devID = SetDevID(devID,PgmPswd);	break;
			case 7:	SetDisplay(devID,PgmPswd);	break;
			case 8: SetTarrif(devID,PgmPswd);	break;
			case 9: SetStore(devID,PgmPswd);	break;
			case 10: ReadPswd(devID);			break;
			case 11: ReadEE(devID);			break;
			case 12: ClrAll();			break;
			default:	break;			
			}
		}		
	}
	CloseSubWindow(w0);			
}


//--------------------------------------------------------------
//--------------------------------------------------------------
void ComSele(void)
{
	OS_WIN 	*w0;
	UBYTE k;
	ULONG sele;
	
	w0 = OSCreatSubWindow(20,60,88,46,1,1,"选择串口");	
	if(Global_ComNum==4) sele = 1;
	else sele = 0;
	k = OSMenuInWin(w0,4,4,12,2,&sele,2,1,"电力红外接口","RS485接口");
	if(k==K_ENTER){
		if(sele==0) Global_ComNum = 1;		//TVIR
		else if(sele==1) Global_ComNum = 4;	//RS485
		else Global_ComNum = 1;
		OSComIni(Global_ComNum,1200,1,0,1,8);
	}
	CloseSubWindow(w0);			
}


//--------------------------------------------------------------
//--------------------------------------------------------------
void ReadMeter(void)
{
	OS_WIN 	*w0;
	OS_DBF *rd;
	OS_FIELD *id,*rflag,*rtime,*rdata;
	OS_CALENDAR p;
	FIELD fld,fld1;
	UBYTE k,d[40];
	ULONG sele;
	ULLONG devid = 0xAAAAAAAAAAAA;
	
	w0 = OSCreatSubWindow(0,0,128,128,1,1,"日常抄表");	
	OSDrawInWin(w0,16,32,"正在分析数据...",3,0);
	rd = (OS_DBF*)OSDBFOpen(0,0,"read.dbf");
	if(rd==0){		
		OSMessageBox("打开数据库","打开失败!" ,"任意键返回...");
		CloseSubWindow(w0);	
		return;
	}
	id = OSDBFFieldSearch(rd,"METERID");
	if(id==0) {
		OSMessageBox("打开数据库","数据库字段错!" ,"任意键返回...");
		OSDBFClose(rd);
		CloseSubWindow(w0);	
		return;
	}
	rflag = OSDBFFieldSearch(rd,"RFLAG");
	if(rflag==0) {
		OSMessageBox("打开数据库","数据库字段错!" ,"任意键返回...");
		OSDBFFieldFree(id);
		OSDBFClose(rd);
		CloseSubWindow(w0);	
		return;
	}
	rtime = OSDBFFieldSearch(rd,"RTIME");
	if(rtime==0) {
		OSMessageBox("打开数据库","数据库字段错!" ,"任意键返回...");
		OSDBFFieldFree(rflag);
		OSDBFFieldFree(id);
		OSDBFClose(rd);
		CloseSubWindow(w0);	
		return;
	}
	rdata = OSDBFFieldSearch(rd,"RDATA");
	if(rdata==0) {
		OSMessageBox("打开数据库","数据库字段错!" ,"任意键返回...");
		OSDBFFieldFree(rtime);
		OSDBFFieldFree(rflag);
		OSDBFFieldFree(id);
		OSDBFClose(rd);
		CloseSubWindow(w0);	
		return;
	}
	while(1){		
		k = OSMessageBox("抄表","请对准要抄收的电表." ,"ENTER键抄表...");
		if(k==K_ENTER){
			devid = 0xAAAAAAAAAAAA;
			if(DLT645_Read(4,devid,0xC033,d,6,1000,3)<0){
				OSMessageBox("数据抄收","读回电表编号失败!","任意键继续...");
				continue;
			}
			devid = (ULLONG)d[0]+((ULLONG)d[1]<<8)+((ULLONG)d[2]<<16)+((ULLONG)d[3]<<24)+((ULLONG)d[4]<<32)+((ULLONG)d[5]<<40);
			for(k=0;k<250;k++) fld1.C.data[k] = 0xFF;	
			if(DLT645_Read(4,devid,0x901F,d,16,1000,3)<0) continue;
			bcd2ascii(d,fld1.C.data,16);
			if(DLT645_Read(4,devid,0x9020,d,4,1000,3)<0) continue;						
			bcd2ascii(d,&fld1.C.data[32],4);
			if(DLT645_Read(4,devid,0xB020,d,4,1000,3)<0) continue;
			bcd2ascii(d,&fld1.C.data[40],4);
			if(DLT645_Read(4,devid,0xB021,d,3,1000,3)<0) continue;
			bcd2ascii(d,&fld1.C.data[48],3);
			if(DLT645_Read(4,devid,0xB210,d,4,1000,3)<0) continue;
			bcd2ascii(d,&fld1.C.data[54],4);
			if(DLT645_Read(4,devid,0xB212,d,2,1000,3)<0) continue;
			bcd2ascii(d,&fld1.C.data[62],2);
			if(DLT645_Read(4,devid,0xC010,d,4,1000,3)<0) continue;
			bcd2ascii(d,&fld1.C.data[66],4);
			if(DLT645_Read(4,devid,0xC011,d,3,1000,3)<0) continue;
			bcd2ascii(d,&fld1.C.data[74],3);
			if(DLT645_Read(4,devid,0xC020,d,1,1000,3)<0) continue;
			bcd2ascii(d,&fld1.C.data[80],1);
			if(DLT645_Read(4,devid,0xC030,d,3,1000,3)<0) continue;
			bcd2ascii(d,&fld1.C.data[82],3);
			if(DLT645_Read(4,devid,0xC032,d,6,1000,3)<0) continue;
			bcd2ascii(d,&fld1.C.data[88],6);
			if(DLT645_Read(4,devid,0xC117,d,2,1000,3)<0) continue;
			bcd2ascii(d,&fld1.C.data[100],2);			
			if(DLT645_Read(4,devid,0xC33F,d,36,1000,3)<0) continue;
			bcd2ascii(d,&fld1.C.data[104],36);
			OSDrawInWin(w0,16,32,"抄表完成,正在存贮...",3,0);
			//------------------------------------------
			sele = 0;
			while(1){
				if(OSDBFFieldRead(rd,id,sele,&fld)==0){
					if(fld.N.data == devid){ 		//正确, 存贮数据
						fld.C.data[0] = '1';
						OSDBFFieldWrite(rd,rflag,sele,&fld);						
						OSGetCalendar(&p);		//读当前时钟
						fld.T.year = p.year;
						fld.T.month = p.month;
						fld.T.day = p.day;
						fld.T.week = p.week;
						fld.T.hour = p.hour;
						fld.T.minute = p.minute;
						fld.T.second = p.second;
						OSDBFFieldWrite(rd,rtime,sele,&fld);
						OSDBFFieldWrite(rd,rdata,sele,&fld1);
						OSMessageBox("数据抄收","抄收成功!","任意键继续...");
						break;
					}
					else sele++;		//不是本记录
				}	
				else{		//末找到,增加一条记录
					if(OSDBFRecordAdd(rd)==0){
						fld.N.data = devid;						
						OSDBFFieldWrite(rd,id,sele,&fld);
						fld.C.data[0] = '1';
						OSDBFFieldWrite(rd,rflag,sele,&fld);
						OSGetCalendar(&p);		//读当前时钟
						fld.T.year = p.year;
						fld.T.month = p.month;
						fld.T.day = p.day;
						fld.T.week = p.week;
						fld.T.hour = p.hour;
						fld.T.minute = p.minute;
						fld.T.second = p.second;
						OSDBFFieldWrite(rd,rtime,sele,&fld);
						OSDBFFieldWrite(rd,rdata,sele,&fld1);
						OSMessageBox("数据抄收","抄收成功!","任意键继续...");
						break;
					}
					else {
						OSMessageBox("数据抄收","磁盘已满!","任意键返回...");
					}
				}				
			}															
		}
		else break;
	}	
	OSDBFFieldFree(rdata);
	OSDBFFieldFree(rtime);
	OSDBFFieldFree(rflag);
	OSDBFFieldFree(id);
	OSDBFClose(rd);
	CloseSubWindow(w0);	
}


//--------------------------------------------------------------
//--------------------------------------------------------------
void ReadHistory(void)
{

}

/**************************************/
/*  主程序: 用户程序从此开始         */
/**************************************/
int main(void)
{ 
	OS_WIN 	*wnd_Main;
	UBYTE	k;
	LONG sele;

	for(k=0;k<12;k++){ tr[k][0] = 0xFF; }
	tr[0][0] = 0x02; tr[0][1] = 0x00; tr[0][2] = 0x07;
	tr[1][0] = 0x04; tr[1][1] = 0x00; tr[1][2] = 0x22;
	OSLCDClearPanel(0);	
	wnd_Main = OSCreatSubWindow(8,16,110,84,1,1,"江苏DDSF[V1.00]");	//创建子窗口
	OSComIni(Global_ComNum,1200,1,0,1,8);
	while(1){
		k = OSMenuInWin(wnd_Main,2,2,16,5,&sele,5,1,"[1]日常抄表","[2]查看电表数据","[3]设置电表数据","[4]串口选择","[5]返回系统");
		if(k==K_ENTER){
			switch(sele){
			case 0: ReadMeter(); break;
			case 1: ViewMeter(); break;
			case 2:	SetMeter();	break;
			case 3: ComSele();	break;
			case 4: OSExit(); 	break;
			default:	break;
			}
		}
	}
	CloseSubWindow(wnd_Main);	
}						

⌨️ 快捷键说明

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