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

📄 cbcx.c

📁 485单相电能表开发程序
💻 C
📖 第 1 页 / 共 5 页
字号:
		x5=jinwu(x4);
		x5=x5/3.05;
		x5=jinwu(x5);
		x5=x5+1;
		
	    if (x5>62){
        OSMessageBox("电表时钟频率","数据超过最大值!","任意键返回...");
        CloseSubWindow(w1);
					CloseSubWindow(w2);
				
					CloseSubWindow(w0);
				return;		
        }
		}
	//	a2bcd((UBYTE)x5,z)
	c1=x5;
     c1=(int)x5;
     U[0]=0;
    U[1]=0;
     U[2]=0;
inttohex(c1,U);
  
   
    
if 	(DLT645_Writeclock(4,nID,0xE010,U,3,1000,3)==0){
//if(DLT645_Write485(4,devID,0xC032,s,6,1000,3)==0) {
			OSMessageBox("时钟频率设置","设置时钟频率成功!","任意键返回...");
				CloseSubWindow(w1);
					CloseSubWindow(w2);
				
					CloseSubWindow(w0);
				return;		
		}
	

	}
	CloseSubWindow(w1);
					CloseSubWindow(w2);
					
					CloseSubWindow(w0);
						return;
	}
		
}		//else if(k==K_ENTER){
CloseSubWindow(w1);
					CloseSubWindow(w2);
					
					CloseSubWindow(w0);
						return;
							//	while(1){
}

//------------------------------------------


void SetMeter485(void) //485设置电表数据菜单
{
	OS_WIN 	*w0;
	UBYTE k;
	ULONG sele;
	ULLONG devID,a;
	
	w0 = OSCreatSubWindow(0,0,128,126,1,1,"设置电表数据");
	while(1){
		k = OSMenuInWin(w0,6,5,16,7,&sele,7,1,"[1]广播校时","[2]电表清零","[3]设置电表电量","[4]设置电表表号","[5]设置电表密码","[6]电表时钟频率","[7]设置初校电量");
		if(k==K_ESC) break;
		else if(k==K_HYPHEN){
			a = DLT645_InputID();
			if(a<0x1000000000000) devID = a;			
		
		}
	
		else if(k==K_ENTER){
	//	 devID=0x000000000000;
        	devID=0xAAAAAAAAAAAA;
			switch(sele){
			case 0:CorrectTime(); break;
			case 1: SetPower485(devID);    break;
			case 2:SetPowersz485(devID) ;break;
			case 3: SetIniID(devID);	break;
		    case 4:setPassword485(devID);break;
		   // case 5:SetPowertd(devID);break;
		    //case 6:SetPowerddY(devID);break;
		    case 5:setcolock(devID);break;
		    case 6:SetPowercx485(devID) ;break;
			default:	break;			
			}
			}	
	}
	CloseSubWindow(w0);			
}

//--------------------------------------------------------------
//--------------------------------------------------------------
void ComSele(void)
{
	OS_WIN 	*w0;
	UBYTE k;
	ULONG sele;
	
	w0 = OSCreatSubWindow(0,0,128,126,1,1,"选择串口");	
	if(Global_ComNum==4) sele = 1;
	else sele = 0;
	k = OSMenuInWin(w0,20,24,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,9600,1,0,1,8);
	}
	CloseSubWindow(w0);			
}


//--------------------------------------------------------------
//--------------------------------------------------------------
void rwdl(ULLONG devID)//读设电量
{
	UBYTE n[8];
    UBYTE n1[8];
   
	ULLONG cPswd;
	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==0xAAAAAAAAAAAA){
	    OSMessageBox("读取电量","没有输入表号!","任意键返回...");
	   CloseSubWindow(w0);
	   return;
	    }
	     
		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,"按ENTER 设电量",3,0);	
		k=OSWaitKey();
		if (k==K_ENTER)
		{
	
  
  	
   
	
	
    	n[0]='0';
	    n[1]='0';
	    n[2]='0';
	    n[3]='0';
	    n[4]='0';
	    n[5]='0';	    

			cPswd = (inpswd(n)<<8);


		
			   n1[0]=0;
			  n1[1]=153;
			  n1[2]=153;
		      n1[3]=153;
			  n1[4]=0;
			  n1[5]=16;
			  n1[6]=1;
			  n1[7]=19;
			  
			    
	
			  	if(DLT645_Write(4,nID,0xC119,cPswd,n1,0x0A,3000,3)==0){
					OSMessageBox("设置电量","设置电量成功!","任意键返回...");
		}
		}
		CloseSubWindow(w1);
		CloseSubWindow(w0);
		break;	
	}
	}
	CloseSubWindow(w1);
	CloseSubWindow(w0);
}
void rbhdl(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;
	   	if(DLT645_Read(4,devID,0x9010,d,20,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,36,"当前电量:",3,0);
		
		sprintf(s," %02X%02X%02X.%02X kWh",d[3],d[2],d[1],d[0]);	OSDrawInWin(w1,8,48,s,3,0);
	
		OSDrawInWin(w1,2,100,"任意键返回...",3,0);	
		OSWaitKey();
		CloseSubWindow(w1);
		CloseSubWindow(w0);
		break;	
	}
	}
	CloseSubWindow(w1);
	CloseSubWindow(w0);
}
void hzsc(void)
{
	OS_WIN 	*w0;
	UBYTE k;
	ULONG sele;

		ULLONG devID,a;
	
	w0 = OSCreatSubWindow(0,0,128,126,1,1,"后装抄设数据");
	while(1){
	//	k = OSMenuInWin(w0,1,15,19,7,&sele,7,1," [1]正向有功电量"," [2]正向有功数据块"," [3]联发电表日期"," [4]抄读电表日期"," [5]抄读电表时间"," [6]抄读电表表号"," [7]抄读脉冲常数");
		k = OSMenuInWin(w0,1,15,19,3,&sele,3,1," [1]设置表号"," [2]读设电量"," [3]读表号电量");

		if(k==K_ESC) break;
		else if(k==K_HYPHEN){
			a = DLT645_InputID();
			if(a<0x1000000000000) devID = a;			
		
		}
		else if(k==K_ENTER){
		// devID=0x000000000000;
		devID=0xAAAAAAAAAAAA;
			switch(sele){
				case 0: SetIniIDsc(devID);	break;
				case 1: rwdl(devID);break;
		    	case 2: rbhdl(devID); break;
		    	
		        //case 6:	Viewmccs485(devID); break;
		    	default:	break;			
			}
		}		
	}
	CloseSubWindow(w0);
}
void autot(devID)
{
CorrectTime();
ViewDatelfau(devID);
SetPowerddKau(devID);
SetPowertdau(devID);

setcolockau(devID);
}
void qzscau(void)
{
	OS_WIN 	*w0;
	UBYTE k;
	ULONG sele;

		ULLONG devID,a;
	
	w0 = OSCreatSubWindow(0,0,128,126,1,1,"后装抄设数据");
	while(1){
	//	k = OSMenuInWin(w0,1,15,19,7,&sele,7,1," [1]正向有功电量"," [2]正向有功数据块"," [3]联发电表日期"," [4]抄读电表日期"," [5]抄读电表时间"," [6]抄读电表表号"," [7]抄读脉冲常数");
		k = OSMenuInWin(w0,1,15,19,2,&sele,2,1," [1]自动设置");

		if(k==K_ESC) break;
		else if(k==K_HYPHEN){
			a = DLT645_InputID();
			if(a<0x1000000000000) devID = a;		
		}
		else if(k==K_ENTER){
		// devID=0x000000000000;
		devID=0xAAAAAAAAAAAA;
			switch(sele){
				case 0: autot(devID);	break;
				
		        //case 6:	Viewmccs485(devID); break;
		    	default:	break;			
			}
		}		
	}
	CloseSubWindow(w0);
}
void SetMetertdd(void) //485设置电表数据菜单
{
	OS_WIN 	*w0;
	UBYTE k;
	ULONG sele;
	ULLONG devID,a;
	
	w0 = OSCreatSubWindow(0,0,128,126,1,1,"设置电表数据");
	while(1){
		k = OSMenuInWin(w0,6,5,16,3,&sele,3,1,"[1]断电","[2]通电","[3]状态");
		if(k==K_ESC) break;
		else if(k==K_HYPHEN){
			a = DLT645_InputID();
			if(a<0x1000000000000) devID = a;			
		
		}
	
		else if(k==K_ENTER){
	//	 devID=0x000000000000;
        	devID=0xAAAAAAAAAAAA;
			switch(sele){
			//case 0:SetPowerddY(devID); break;
		//	case 1: SetPowerddC(devID);    break;
			case 0:SetPowerddKau(devID) ;break;
			case 1: SetPowertdau(devID);	break;
		  case 2: Viewzt(devID);	break;
			default:	break;			
			}
			}	
	}
	CloseSubWindow(w0);			
}
//--------------------------------------------------------------
//--------------------------------------------------------------
void ViewDatelfhau(ULLONG devID)  //联发读取电表日期
{
	OS_WIN 	*w0,*w1;
	UBYTE k;
	UBYTE d[4],c[3],s[20],d1[3],d2[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();     
   // if (nID=0xAAAAAAAAAAAA){OSMessageBox("信息","表号错误!","任意键返回...");CloseSubWindow(w0);	return;	}
     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,0x9010,d2,4,8000,3)<0) 	break;
		if(DLT645_Read(4,nID,0xC010,d,4,8000,3)<0) 	break;
		if(DLT645_Read(4,nID,0xC011,c,3,8000,3)<0) 	break;
		if(DLT645_Read(4,nID,0xC030,d1,3,8000,3)<0) 	break;
		OSDrawInWin(w1,2,2,"电表电量",3,0);
		sprintf(s,"%02X%02X%02X.%02X",d2[3],d2[2],d2[1],d2[0]);	OSDrawInWin(w1,8,14,s,3,0);
		OSDrawInWin(w1,2,26,"电表日期",3,0);
		sprintf(s,"%02X年%02X月%02X日",d[3],d[2],d[1]);	OSDrawInWin(w1,8,38,s,3,0);
		OSDrawInWin(w1,2,50,"电表时间",3,0);
		
    	sprintf(s,"%2X:%02X:%02X",c[2],c[1],c[0]);	OSDrawInWin(w1,8,62,s,3,0);
    	OSDrawInWin(w1,2,74,"电表脉冲",3,0);
    	sprintf(s," %02X%02X%",d1[1],d1[0]);	OSDrawInWin(w1,56,74,s,3,0);
		OSDrawInWin(w1,2,90,"任意键返回...",3,0);	
		OSWaitKey();
		CloseSubWindow(w1);
		break;	
	}
	}
	CloseSubWindow(w1);
	CloseSubWindow(w0);
}
void authz(devID)
{
SetIniID(devID);
ViewDatelfhau(devID);
SetPowerddKau(devID);
SetPowertdau(devID);
SethzPowersz485(devID);
}
void hzscau(void)
{
	OS_WIN 	*w0;
	UBYTE k;
	ULONG sele;

		ULLONG devID,a;
	
	w0 = OSCreatSubWindow(0,0,128,126,1,1,"后装抄设数据");
	while(1){
	//	k = OSMenuInWin(w0,1,15,19,7,&sele,7,1," [1]正向有功电量"," [2]正向有功数据块"," [3]联发电表日期"," [4]抄读电表日期"," [5]抄读电表时间"," [6]抄读电表表号"," [7]抄读脉冲常数");
		k = OSMenuInWin(w0,1,15,19,2,&sele,2,1," [1]自动设置");

		if(k==K_ESC) break;
		else if(k==K_HYPHEN){
			a = DLT645_InputID();
			if(a<0x1000000000000) devID = a;		
		}
		else if(k==K_ENTER){
		// devID=0x000000000000;
		devID=0xAAAAAAAAAAAA;
			switch(sele){
				case 0: authz(devID);	break;
				
		        //case 6:	Viewmccs485(devID); break;
		    	default:	break;			
			}
		}		
	}
	CloseSubWindow(w0);
}
void qzscsd(void)
{
	OS_WIN 	*w0;
	UBYTE k;
	ULONG sele;

		ULLONG devID,a;
	
	w0 = OSCreatSubWindow(0,0,128,126,1,1,"后装手动抄设数据");
	while(1){
	//	k = OSMenuInWin(w0,1,15,19,7,&sele,7,1," [1]正向有功电量"," [2]正向有功数据块"," [3]联发电表日期"," [4]抄读电表日期"," [5]抄读电表时间"," [6]抄读电表表号"," [7]抄读脉冲常数");
		k = OSMenuInWin(w0,1,15,19,5,&sele,5,1," [1]设置表号"," [2]设置电量"," [3]电量时间脉冲"," [4]断电"," [5]通电");

		if(k==K_ESC) break;
		else if(k==K_HYPHEN){
			a = DLT645_InputID();
			if(a<0x1000000000000) devID = a;		
		}
		else if(k==K_ENTER){
		// devID=0x000000000000;
		devID=0xAAAAAAAAAAAA;
			switch(sele){
				case 0: SetIniID(devID);	break;
				case 1: SetPowercx485hz(devID);	break;
				case 2:ViewDatelfhau(devID);break;
			    case 3:	SetPowerddK(devID);
			    case 4:	SetPowertd(devID);
		        //case 6:	Viewmccs485(devID); break;
		    	default:	break;			
			}
		}		
	}
	CloseSubWindow(w0);
}

/**************************************/
/*  主程序: 用户程序从此开始         */
/**************************************/
int main(void)
{ 
	OS_WIN 	*wnd_Main;
	UBYTE	k;
	LONG sele;
	ULLONG devID=0xAAAAAAAAAAAA,a;
	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;
	bt[0] = 0; bt[1] = 0; bt[2] = 1; bt[3] = 1;
	OSLCDClearPanel(0);	
	wnd_Main = OSCreatSubWindow(6,6,110,100,1,1,"棋港485单相电能表");	//创建子窗口
	OSComIni(Global_ComNum,1200,1,0,1,8);
	while(1){
	
	k = OSMenuInWin(wnd_Main,2,10,16,7,&sele,7,1,"[1]查看电表数据","[2]设置电表数据","[3]后装自动抄设数据","[4]后装抄设数据","[5]串口选择","[6]通断电","[7]返回系统");

		if(k==K_HYPHEN){
			a = DLT645_InputID();
			if(a<0x1000000000000) devID = a;			
		
		}
		else
		if(k==K_ENTER){
			switch(sele){
			case 0: ViewMeter(); break;
			case 1: SetMeter485(); break;
			//case 2: hzsc(); break;
			case 2:qzscau();break;
			//case 3:hzscau();break;
			case 3:qzscsd();break;
	        case 4: 	ComSele();break;
	        case 5:  SetMetertdd();break;
	    	case 6: OSExit(); 	break;
	     	default:	break;
			}
		}
	}
	CloseSubWindow(wnd_Main);	
}						

⌨️ 快捷键说明

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