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

📄 cbcx.c

📁 485单相电能表开发程序
💻 C
📖 第 1 页 / 共 5 页
字号:
		}
		if(i>=Retry) {
			k = OSMessageBox("DLT645","通讯失败!","[ENTER]重试");	//消息框
			if(k!=K_ENTER) { a = -1; break; }
		}
		else break;
	}
	CloseSubWindow(w0);
	return a;

}


LONG DLT645_Write485tdd(UBYTE Index,ULLONG DevID,UWORD id, ULONG oPswd,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+2] = d[i];
		for(i=0;i<Retry;i++){
			a = DLT645(Index,DevID,0x04,s,Len+2,r,0,Dly);
			if(a>=0) break;
			//if (a=-1)
		//	{OSMessageBox("DLT645","电表清零超时","按任一键返回主菜单");
		//	 break;
		//	 } 
		}
		if(i>=Retry) {
			k = OSMessageBox("DLT645","通讯失败!","[ENTER]重试");	//消息框
			if(k!=K_ENTER) { 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); 
//	s[2] = (UBYTE)oPswd; s[5] = (UBYTE)(oPswd>>8); s[4] = (UBYTE)(oPswd>>16); s[3] = (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,r,0,Dly);
			if(a>=0) break;
		}
		if(i>=Retry) {
			k = OSMessageBox("DLT645","通讯失败!","[ENTER]重试");	//消息框
			if(k!=K_ENTER) { 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);		//表号-->BCD
	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!=K_ENTER) { a = -1; break; }
		//	if(k==K_ESC) break;
		}
		else break;
	}
	CloseSubWindow(w0);
	return a;

}


LONG DLT645_WritePswd(UBYTE Index,ULLONG DevID, ULONG oPswd, ULONG nPswd,UWORD Dly, UBYTE Retry)
//LONG DLT645_WritePswd(UBYTE Index,ULLONG DevID, UBYTE *oPswd, UBYTE *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[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!=K_ENTER) { a = -1; break; }
		}
		else break;
	}
	CloseSubWindow(w0);
	return a;
}

void DLT645_BroadTime(UBYTE Index)
{
	OS_CALENDAR p;
	UBYTE s[20],r[8];
	ULONG DlyCnt,Dly,i;
	OS_WIN 	*w1;
	OSGetCalendar(&p);
	w1 = OSCreatSubWindow(9,30,110,60,1,1,"通讯");
	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);
	DlyCnt = OSTMRGet();		//2005-08-15添加  开始延时
		Dly=1500;
	OSDrawInWin(w1,16,10,"正在广播校时...",3,0);
	while(OSTMRGet()<(DlyCnt+Dly)){
	i+=1;
    
	
	                                 }	
	       CloseSubWindow(w1);//2005-08-15添加  开始延时
	OSMessageBox("广播校时","发送完成!","任意键返回...");
}

ULLONG DLT645_InputID(void)
{
	OS_WIN 	*w0;
	UBYTE k,d[12],i;
	ULLONG a=0;
	w0 =OSCreatSubWindow(5,32,120,44,1,1,"输入电表表号");
	//w0 = OSCreatSubWindow(6,32,110,44,1,1,"输入电表编号");
	d[0] = 0;
	k = OSEntryInWin(w0,2,8,12,d,0,0,1);
	if(k==K_ESC) a=0x1000000000000;
	else if(k==K_ENTER){
	//	if(d[0]==0) a=0x000000000000; 
	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==K_ESC) a=0xFFFFFFFF;
	else if(k==K_ENTER){		
		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 viewbh(ULLONG devID)//读取表号
{
	OS_WIN 	*w0,*w1;
	UBYTE k;
	UBYTE d[20],s[20],bh[20],bh1[20];
	ULLONG nID,m;
		sprintf(s," ID [%04X%08X]",(ULONG)(devID>>32),(ULONG)devID);
	    w0 = OSCreatSubWindow(0,0,128,128,1,1,s);
	    nID = DLT645_InputID();
		if(nID<0x1000000000000){  
	   
	while(1){

    	sprintf(s," ID [%04X%08X]",(ULONG)(nID>>32),(ULONG)nID);
    	 w1 = OSCreatSubWindow(0,0,128,128,1,1,s);
	    if(DLT645_Read(4,devID,0xC032,bh1,6,2000,3)<0) 	break;
	
		OSDrawInWin(w1,2,4,"电表表号:",3,0);
		sprintf(bh,"%02X%02X%02X%02X%02X%02X",bh1[5],bh1[4],bh1[3],bh1[2],bh1[1],bh1[0]);	OSDrawInWin(w1,8,18,bh,3,0);
	
		OSDrawInWin(w1,2,100,"任意键返回...",3,0);	
		OSWaitKey();
		CloseSubWindow(w1);
		CloseSubWindow(w0);
		break;	
	}
	}
	CloseSubWindow(w1);
	CloseSubWindow(w0);
}
void ViewPower485(ULLONG devID)//读取电量
{

	OS_WIN 	*w0,*w1;
	UBYTE k;
	UBYTE d[20],s[20],bh[20],bh1[20];
	ULLONG nID,m;
		sprintf(s," ID [%04X%08X]",(ULONG)(devID>>32),(ULONG)devID);
	    w0 = OSCreatSubWindow(0,0,128,128,1,1,s);
	    nID = DLT645_InputID();
		if(nID<0x1000000000000){  
	   
	while(1){

    	sprintf(s," ID [%04X%08X]",(ULONG)(nID>>32),(ULONG)nID);
    	 w1 = OSCreatSubWindow(0,0,128,128,1,1,s);
		if(DLT645_Read(4,nID,0x9010,d,20,2000,3)<0) 	break;
	//	if(DLT645_Read(4,devID,0xC032,bh1,6,2000,3)<0) 	break;
	
	//	OSDrawInWin(w1,2,4,"电表表号:",3,0);
	//	sprintf(bh,"%02X%02X%02X%02X%02X%02X",bh1[5],bh1[4],bh1[3],bh1[2],bh1[1],bh1[0]);	OSDrawInWin(w1,8,18,bh,3,0);
		OSDrawInWin(w1,2,4,"当前电量:",3,0);
		
		sprintf(s," %02X%02X%02X.%02X kWh",d[3],d[2],d[1],d[0]);	OSDrawInWin(w1,8,18,s,3,0);
		OSDrawInWin(w1,2,100,"任意键返回...",3,0);	
		OSWaitKey();
		CloseSubWindow(w1);
		CloseSubWindow(w0);
		break;	
	}
	}
	CloseSubWindow(w1);
	CloseSubWindow(w0);
}
void Viewzt(ULLONG devID)//读取状态
{

	OS_WIN 	*w0,*w1;
	UBYTE k;
	UBYTE d[20],s[20],bh[20],bh1[20];
	ULLONG nID,m;
		sprintf(s," ID [%04X%08X]",(ULONG)(devID>>32),(ULONG)devID);
	    w0 = OSCreatSubWindow(0,0,128,128,1,1,s);
	    nID = DLT645_InputID();
		if(nID<0x1000000000000){  
	   
	while(1){

    	sprintf(s," ID [%04X%08X]",(ULONG)(nID>>32),(ULONG)nID);
    	 w1 = OSCreatSubWindow(0,0,128,128,1,1,s);
		if(DLT645_Read(4,nID,0xC020,d,20,2000,3)<0) 	break;
	//	if(DLT645_Read(4,devID,0xC032,bh1,6,2000,3)<0) 	break;
	
	//	OSDrawInWin(w1,2,4,"电表表号:",3,0);
	//	sprintf(bh,"%02X%02X%02X%02X%02X%02X",bh1[5],bh1[4],bh1[3],bh1[2],bh1[1],bh1[0]);	OSDrawInWin(w1,8,18,bh,3,0);
		OSDrawInWin(w1,2,4,"当前状态:",3,0);
		
		sprintf(s," %02X",d[0]);	OSDrawInWin(w1,8,18,s,3,0);
		OSDrawInWin(w1,2,100,"任意键返回...",3,0);	
		OSWaitKey();
		CloseSubWindow(w1);
		CloseSubWindow(w0);
		break;	
	}
	}
	CloseSubWindow(w1);
	CloseSubWindow(w0);
}
void ViewPowersjk485(ULLONG devID)//读取正向有功电能数据块
{

	OS_WIN 	*w0,*w1,*w2;
	UBYTE k;
	UBYTE d[48],s[20],bh[20],bh1[20];
	ULLONG nID,m;
		sprintf(s," ID [%04X%08X]",(ULONG)(devID>>32),(ULONG)devID);
	    w0 = OSCreatSubWindow(0,0,128,128,1,1,s);
	    nID = DLT645_InputID();
		if(nID<0x1000000000000){  
	   
	while(1){

    	sprintf(s," ID [%04X%08X]",(ULONG)(nID>>32),(ULONG)nID);
    	 w1 = OSCreatSubWindow(0,0,128,128,1,1,s);
		if(DLT645_Read(4,nID,0x901F,d,48,2000,3)<0) 	break;
	//	if(DLT645_Read(4,devID,0xC032,bh1,6,2000,3)<0) 	break;
	
	//	OSDrawInWin(w1,2,4,"电表表号:",3,0);
	//	sprintf(bh,"%02X%02X%02X%02X%02X%02X",bh1[5],bh1[4],bh1[3],bh1[2],bh1[1],bh1[0]);	OSDrawInWin(w1,8,18,bh,3,0);
		OSDrawInWin(w1,2,2,"前一月:",3,0);		
		sprintf(s," %02X%02X%02X.%02X 度",d[3],d[2],d[1],d[0]);
		OSDrawInWin(w1,36,2,s,3,0);
		OSDrawInWin(w1,2,16,"前二月:",3,0);		
		sprintf(s," %02X%02X%02X.%02X 度",d[7],d[6],d[5],d[4]);
		OSDrawInWin(w1,36,16,s,3,0);
		OSDrawInWin(w1,2,30,"前三月:",3,0);		
		sprintf(s," %02X%02X%02X.%02X 度",d[11],d[10],d[9],d[8]);
		OSDrawInWin(w1,36,30,s,3,0);
		OSDrawInWin(w1,2,44,"前四月:",3,0);		
		sprintf(s," %02X%02X%02X.%02X 度",d[15],d[14],d[13],d[12]);
		OSDrawInWin(w1,36,44,s,3,0);
		OSDrawInWin(w1,2,58,"前五月:",3,0);		
		sprintf(s," %02X%02X%02X.%02X 度",d[19],d[18],d[17],d[16]);
		OSDrawInWin(w1,36,58,s,3,0);
		OSDrawInWin(w1,2,72,"前六月:",3,0);		
		sprintf(s," %02X%02X%02X.%02X 度",d[23],d[22],d[21],d[20]);
		OSDrawInWin(w1,36,72,s,3,0);	
		OSDrawInWin(w1,1,100,"任一键返回Enter下一页",3,0);	
		k=OSWaitKey();
		
		
		if(k==K_ENTER)
		{
		sprintf(s," ID [%04X%08X]",(ULONG)(nID>>32),(ULONG)nID);
		w2 = OSCreatSubWindow(0,0,128,128,1,1,s);
			OSDrawInWin(w2,2,2,"前 七 月",3,0);		
		sprintf(s," %02X%02X%02X.%02X度",d[27],d[26],d[25],d[24]);
		OSDrawInWin(w2,48,2,s,3,0);
		OSDrawInWin(w2,2,16,"前 八 月",3,0);		
		sprintf(s," %02X%02X%02X.%02X度",d[31],d[30],d[29],d[28]);
		OSDrawInWin(w2,48,16,s,3,0);
		OSDrawInWin(w2,2,30,"前 九 月",3,0);		
		sprintf(s," %02X%02X%02X.%02X度",d[35],d[34],d[33],d[32]);
		OSDrawInWin(w2,48,30,s,3,0);
		OSDrawInWin(w2,2,44,"前 十 月",3,0);		
		sprintf(s," %02X%02X%02X.%02X度",d[39],d[38],d[37],d[36]);
		OSDrawInWin(w2,48,44,s,3,0);
		OSDrawInWin(w2,2,58,"前十一月:",3,0);		
		sprintf(s," %02X%02X%02X.%02X度",d[43],d[42],d[41],d[40]);
		OSDrawInWin(w2,48,58,s,3,0);
		OSDrawInWin(w2,2,72,"前十二月:",3,0);		
		sprintf(s," %02X%02X%02X.%02X度",d[47],d[46],d[45],d[44]);
		OSDrawInWin(w2,48,72,s,3,0);
		OSDrawInWin(w2,2,100,"按任一键返回...",3,0);	
		OSWaitKey();
		
		CloseSubWindow(w2);CloseSubWindow(w1);CloseSubWindow(w0);return;
	   	}
	   	
		CloseSubWindow(w1);
	CloseSubWindow(w0);
		break;	
	}
//	CloseSubWindow(w1);CloseSubWindow(w0);return;
	}
//	CloseSubWindow(w2);
//	CloseSubWindow(w1);
//	CloseSubWindow(w0);
}
void Viewmccs485(ULLONG devID)//读取脉冲常数
{

	OS_WIN 	*w0,*w1;
	UBYTE k;
	UBYTE d[20],s[20],bh[20],bh1[20];
	ULLONG nID,m;
		sprintf(s," ID [%04X%08X]",(ULONG)(devID>>32),(ULONG)devID);
	    w0 = OSCreatSubWindow(0,0,128,128,1,1,s);
	    nID = DLT645_InputID();
		if(nID<0x1000000000000){  
	   
	while(1){

    	sprintf(s," ID [%04X%08X]",(ULONG)(nID>>32),(ULONG)nID);
    	 w1 = OSCreatSubWindow(0,0,128,128,1,1,s);
		if(DLT645_Read(4,nID,0xC030,d,3,2000,3)<0) 	break;
	
		OSDrawInWin(w1,2,4,"当前脉冲常数:",3,0);
		
		sprintf(s," %02X%02X%",d[1],d[0]);	OSDrawInWin(w1,8,18,s,3,0);
		OSDrawInWin(w1,2,100,"任意键返回...",3,0);	
		OSWaitKey();
		CloseSubWindow(w1);
		CloseSubWindow(w0);
		break;	
	}
	}
	CloseSubWindow(w1);
	CloseSubWindow(w0);
}



void ViewDatelf(ULLONG devID)  //联发读取电表日期
{
	OS_WIN 	*w0,*w1;
	UBYTE k;
	UBYTE d[4],c[3],s[20],d1[3];
	ULLONG nID,m;
	sprintf(s," ID [%04X%08X]",(ULONG)(devID>>32),(ULONG)devID);
    w0 = OSCreatSubWindow(0,0,128,128,1,1,s);
    nID = DLT645_InputID();
     sprintf(s," ID [%04X%08X]",(ULONG)(nID>>32),(ULONG)nID);
    w1 = OSCreatSubWindow(0,0,128,128,1,1,s);
	if(nID<0x1000000000000){  
	while(1){
		if(DLT645_Read(4,nID,0xC010,d,4,6000,3)<0) 	break;
		if(DLT645_Read(4,nID,0xC011,c,3,6000,3)<0) 	break;
		if(DLT645_Read(4,nID,0xC030,d1,3,2000,3)<0) 	break;
		OSDrawInWin(w1,2,4,"电表日期",3,0);
		sprintf(s,"%02X年%02X月%02X日",d[3],d[2],d[1]);	OSDrawInWin(w1,8,18,s,3,0);
		OSDrawInWin(w1,2,36,"电表时间",3,0);
		
    	sprintf(s,"%2X:%02X:%02X",c[2],c[1],c[0]);	OSDrawInWin(w1,8,50,s,3,0);
    	OSDrawInWin(w1,2,68,"电表脉冲",3,0);
    	sprintf(s," %02X%02X%",d1[1],d1[0]);	OSDrawInWin(w1,8,82,s,3,0);
		OSDrawInWin(w1,2,100,"任意键返回...",3,0);	
		OSWaitKey();
		CloseSubWindow(w1);
		break;	
	}
	}
	CloseSubWindow(w1);
	CloseSubWindow(w0);
}
void ViewDatelfau(ULLONG devID)  //联发读取电表日期
{
	OS_WIN 	*w0,*w1;
	UBYTE k;
	UBYTE d[4],c[3],s[20],d1[3];
	ULLONG nID,m;
	sprintf(s," ID [%04X%08X]",(ULONG)(devID>>32),(ULONG)devID);
    w0 = OSCreatSubWindow(0,0,128,128,1,1,s);
    //nID = DLT645_InputID();
     nID=devID;
     sprintf(s," ID [%04X%08X]",(ULONG)(nID>>32),(ULONG)nID);
    w1 = OSCreatSubWindow(0,0,128,128,1,1,s);
	if(nID<0x1000000000000){  
	while(1){
		if(DLT645_Read(4,nID,0xC010,d,4,6000,3)<0) 	break;
		if(DLT645_Read(4,nID,0xC011,c,3,6000,3)<0) 	break;
		if(DLT645_Read(4,nID,0xC030,d1,3,2000,3)<0) 	break;
		OSDrawInWin(w1,2,4,"电表日期",3,0);
		sprintf(s,"%02X年%02X月%02X日",d[3],d[2],d[1]);	OSDrawInWin(w1,8,18,s,3,0);
		OSDrawInWin(w1,2,36,"电表时间",3,0);
		
    	sprintf(s,"%2X:%02X:%02X",c[2],c[1],c[0]);	OSDrawInWin(w1,8,50,s,3,0);
    	OSDrawInWin(w1,2,68,"电表脉冲",3,0);

⌨️ 快捷键说明

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