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

📄 cbcx.c

📁 485单相电能表开发程序
💻 C
📖 第 1 页 / 共 5 页
字号:

#include "F3200.h"			// F3200库函数头文件
#include "STDLIB.h"
#include "math.h"
/*********************************************************/
#define pCTS_O		asm("	bset #7,0xFFFFF423 			bset #7,0xFFFFF420	")
#define pCTS_H		asm("	bset #7,0xFFFFF421")
#define pCTS_L		asm("	bclr #7,0xFFFFF421")
/*********** 定义全局变量 ***************/
UBYTE Global_ComNum=4;		//串口号(TVIR)
UBYTE tr[12][3];		//时段表
UBYTE bt[4];		//备用时段启动时间:月日时分
ULONG ClrPswd = 0x12345600, PgmPswd = 0x12345601;

/**************************************/
/*  子函数                            */
/**************************************/
double jinwu(double i)//四舍五入
{
int j;
j=(int)(i*1000)%10;
if(j>4)
i=((int)(i*100+0.5))/100.0;
else
i=((int)(i*100))/100.0;
return i;
}

void inttohex(int k,UBYTE *d)//整数转化十六进制
 {int zs,ys,c;
    
    UBYTE a[2];
    c=k;
    a[0]=0x00;
    a[1]=0x00;
   if (c<=255)
   {
     if (c<16)
       {
          if (c==15)
          {a[0]=0x0F;}
          if (c==14)
          {a[0]=0x0E;}
          if (c==13)
          {a[0]=0x0D;}
          if (c==12)
          {a[0]=0x0C;}
          if (c==11)
          {a[0]=0x0B;}
          if (c==10)
          {a[0]=0x0A;}
          if (c==9)
          {a[0]=0x09;}
          if (c==8)
          {a[0]=0x08;}
          if (c==7)
          {a[0]=0x07;}
          if (c==6)
          {a[0]=0x06;}
          if (c==5)
          {a[0]=0x05;}
          if (c==4)
          {a[0]=0x04;}
          if (c==3)
          {a[0]=0x03;}
          if (c==2)
          {a[0]=0x02;}
          if (c==1)
          {a[0]=0x01;}
          if (c==0)
          {a[0]=0x00;}
        }
     if (c>=16) 
       { zs=c/16;         
              if (zs==15)
              {a[0]=0x0F;}
              if (zs==14)
              {a[0]=0x0E;}
              if (zs==13)
              {a[0]=0x0D;}
              if (zs==12)
              {a[0]=0x0C;}
              if (zs==11)
              {a[0]=0x0B;}
              if (zs==10)
              {a[0]=0x0A;}
              if (zs==9)
              {a[0]=0x09;}
              if (zs==8)
              {a[0]=0x08;}
              if (zs==7)
              {a[0]=0x07;}
              if (zs==6)
              {a[0]=0x06;}
              if (zs==5)
              {a[0]=0x05;}
              if (zs==4)
              {a[0]=0x04;}
              if (zs==3)
              {a[0]=0x03;}
              if (zs==2)
              {a[0]=0x02;}
              if (zs==1)
              {a[0]=0x01;}
              if (zs==0)
              {a[0]=0x00;}
         ys=c%16;
              if (ys==15)
              {a[1]=0x0F;}
              if (ys==14)
              {a[1]=0x0E;}
              if (ys==13)
              {a[1]=0x0D;}
              if (ys==12)
              {a[1]=0x0C;}
              if (ys==11)
              {a[1]=0x0B;}
              if (ys==10)
              {a[1]=0x0A;}
              if (ys==9)
              {a[1]=0x09;}
              if (ys==8)
              {a[1]=0x08;}
              if (ys==7)
              {a[1]=0x07;}
              if (ys==6)
              {a[1]=0x06;}
              if (ys==5)
              {a[1]=0x05;}
              if (ys==4)
              {a[1]=0x04;}
              if (ys==3)
              {a[1]=0x03;}
              if (ys==2)
              {a[1]=0x02;}
              if (ys==1)
              {a[1]=0x01;}
              if (ys==0)
              {a[1]=0x00;}  
              a[0]=a[0]<<4;
              a[0]=a[0]+a[1];
         
       }
       d[0]=a[0];
   
   }  
    
}
void bcd2ascii(UBYTE *bcd,UBYTE *a,UBYTE l)//BCD码转ASCII码
{
	UBYTE i;
	for(i=0;i<l;i++){
		a[i*2] = (bcd[i]>>4)+0x30;
		a[i*2+1] = (bcd[i]&0xF) + 0x30;
	}
	for(i=0;i<l*2;i++){
		if(a[i]>0x39) a[i]+=7;
	}
}

void a2bcd(UBYTE *a,UBYTE *bcd)
{
	UBYTE i,s[10];
	ULONG ul;
	
	bcd[0]=0;
	for(i=0;i<9;i++){
		if(a[i]=='.'){
			if((i+1)<9)	bcd[0] += (a[i+1]<<4);
			if((i+2)<9) bcd[0] += (a[i+2]&0xF);
			break;
		}
	}
	a[i]=0;
	ul = atol(a);
	bcd[1] = (ul%10) + (((ul/10)%10)<<4);
	bcd[2] = ((ul/100)%10) + (((ul/1000)%10)<<4);
	bcd[3] = ((ul/10000)%10) + (((ul/100000)%10)<<4);
}

void a2bcd2(UBYTE *a,UBYTE *bcd)
{
	UBYTE i,s[10];
	ULONG ul;
	
	bcd[0]=0;
//	for(i=0;i<9;i++){
//		if(a[i]=='.'){
//			if((i+1)<9)	bcd[0] += (a[i+1]<<4);
//			if((i+2)<9) bcd[0] += (a[i+2]&0xF);
//			break;
//		}
//	}
//	a[i]=0;
	ul = atol(a);
  
  //ul=sizeof(a);
	bcd[0] =(ul%10) + (((ul/10)%10)<<4);
	bcd[1] =((ul/100)%10) + (((ul/1000)%10)<<4);
	bcd[2] = ((ul/10000)%10) + (((ul/100000)%10)<<4);
	bcd[3] =((ul/1000000)%10)+(((ul/10000000)%10)<<4);
}

UBYTE hex2bcd(UBYTE hex)
{
	return (hex%10)+(((hex/10)%10) <<4);
}
double hex2bcd2(UBYTE hex)
{
	return (hex%10)+(((hex/10)%10) <<4);
}
ULLONG hex2bcd3(UBYTE *hex)
{
  
	return ((int)hex[0]-48)*1000000000+((int)hex[1]-48)*100000000+((int)hex[2]-48)*10000000+((int)hex[3]-48)*1000000+((int)hex[4]-48)*100000+((int)hex[5]-48)*10000+((int)hex[6]-48)*1000+((int)hex[7]-48)*100+((int)hex[8]-48)*10+((int)hex[9]-48)*1;
}
ULLONG hex2bcd4(UBYTE *hex)//整数转十六进制
{ ULLONG C1,K,C2,C3,C4,C5,C6,C7,C8,C9;
int i;
C1=0;C2=0;C3=0;C4=0;C5=0;C6=0;C7=0;C8=0,C9=0;
 K=((int)hex[0]-48);
   C1=K;
 	for(i=0;i<9;i++) C1=C1*16;
 	K=((int)hex[1]-48);
 	C2=K;
 	for(i=0;i<8;i++) C2=C2*16;
 	K=((int)hex[2]-48);
 	C3=K;
 	for(i=0;i<7;i++) C3=C3*16;
 	K=((int)hex[3]-48);
 	C4=K;
 	for(i=0;i<6;i++) C4=C4*16;
 	K=((int)hex[4]-48);
 	C5=K;
 	for(i=0;i<5;i++) C5=C5*16;
 	K=((int)hex[5]-48);
 	C6=K;
 	for(i=0;i<4;i++) C6=C6*16;
 	K=((int)hex[6]-48);
 	C7=K;
 	for(i=0;i<3;i++) C7=C7*16;
 	K=((int)hex[7]-48);
 	C8=K;
 	for(i=0;i<2;i++) C8=C8*16;
 		
 	K=((int)hex[8]-48);
 	C9=K;
 	for(i=0;i<1;i++) C9=C9*16;
 	K=((int)hex[9]-48);
 	return C1+C2+C3+C4+C5+C6+C7+C8+C9+K;
 	
 

	}
void ID2bcd(ULLONG id,UBYTE *d)		//表号-->BCD
{
	d[0] = (UBYTE)id;
	d[1] = (UBYTE)(id>>8);
	d[2] = (UBYTE)(id>>16);
	d[3] = (UBYTE)(id>>24);
	d[4] = (UBYTE)(id>>32);
	d[5] = (UBYTE)(id>>40);
	d[6] = (UBYTE)(id>>48);
}

/******************************************************************************/
LONG DLT645(UBYTE Index,ULLONG DevID,UBYTE Cmd,UBYTE *s,UBYTE sl,UBYTE *r,UBYTE rl,UWORD Dly)
{
	UBYTE i,l;
	UBYTE ChkSum=(0x68+0x68);
	ULONG DlyCnt,RcvPro;
	
	//--- 发送 ---
	pCTS_H;

	
	for(i=0;i<Index;i++) OSCOMSChar(0xFE);
	OSCOMSChar(0x68);		 
	for(i=0;i<6;i++){ 
	 OSCOMSChar((UBYTE)DevID);  
	ChkSum += (UBYTE)DevID; 
	 DevID>>=8; }
	OSCOMSChar(0x68);
	OSCOMSChar(Cmd); ChkSum += Cmd;
	OSCOMSChar(sl); ChkSum += sl;
	for(i=0;i<sl;i++){ 
	OSCOMSChar(s[i]+0x33);
	 ChkSum += (s[i]+0x33); 
	 }
	OSCOMSChar(ChkSum);
	OSCOMSChar(0x16);
	//--- 等待发送完成 ---
	while(OSCOMSCheck()!=0);		
	//--- 接收 ---
	pCTS_L;
	while(OSCOMRChar(r)==0);	//清接收缓冲	
	if(Dly == 0) return 0;		//不需要接收数据
	DlyCnt = OSTMRGet();		//开始延时
	RcvPro = 0;
	while(OSTMRGet()<(DlyCnt+Dly)){
		if(OSCOMRChar(&i)==0){
			ChkSum += i;
			switch(RcvPro){
			case 0: 		//wait 0x68
				if(i==0x68){ ChkSum = 0x68; RcvPro++; }
				break;
			case 1 ... 6:		//接收表号
				r[RcvPro-1] = i;
				RcvPro++; 
				break;
			case 7:			//0x68 again
				if(i==0x68) RcvPro++; 
				else RcvPro = 0; 
				break;
			case 8: 		//cmd
				if(i==(Cmd|0x80)) RcvPro++;
				else RcvPro = 0;
				break;
			case 9:
				if(i<=(rl+2)){  l=i;  RcvPro++; }
				else RcvPro = 0;
				break;
			default:
				if(RcvPro==(l+10)) {		//check sum
					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;
}


//--- 返回: 收到的数据(不含帧信息)的字节数, <0出错 ---
// len 接收的最大长度
LONG DLT645_Read(UBYTE Index, ULLONG DevID, UWORD ID, UBYTE *d, UBYTE Len, UWORD Dly, UBYTE Retry)		//前导码,通讯号,ID0ID1,接收数据,接收数据最大长度,延时(ms),出错重试次数
{
	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];		//don't need ID
				break;
			}
		}
		if(i>=Retry) {
			k = OSMessageBox("DLT645","通讯失败!","[ENTER]重试");	//消息框
			if(k!=K_ENTER) { a = -1; break; }
		}
		else break;
	}
	CloseSubWindow(w0);
	return a;
}

LONG DLT645_Write485(UBYTE Index,ULLONG DevID,UWORD id, 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+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(i>=Retry) {
			k = OSMessageBox("DLT645","通讯失败!","[ENTER]重试");	//消息框
			if(k!=K_ENTER) { a = -1; break; }
		}
		else break;
	}
	CloseSubWindow(w0);
	return a;

}
//时钟频率
LONG DLT645_Writeclock(UBYTE Index,ULLONG DevID,UWORD id, 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] = d[0];
		
		for(i=0;i<Retry;i++){
			a = DLT645(Index,DevID,0x04,s,Len,r,0,Dly);
		//	if(a>=0) break;
		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_Write485td(UBYTE Index,ULLONG DevID,UWORD id, 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] = 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_Write485ql(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[0] = (UBYTE)oPswd; s[1] = (UBYTE)(oPswd>>8); s[2] = (UBYTE)(oPswd>>16); s[3] = (UBYTE)(oPswd>>24); 
	//	for(i=0;i<Len;i++) s[i+2] = d[i];
		for(i=0;i<Retry;i++){
			a = DLT645(Index,DevID,0x09,s,Len+2,r,0,Dly);
			if(a>=0) break;
			if (a=-1)
			{OSMessageBox("DLT645","电表清零超时","按任一键返回主菜单");
			 break;
			 } 

⌨️ 快捷键说明

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