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

📄 js520a.c

📁 用于F3200掌机抄表设表
💻 C
📖 第 1 页 / 共 3 页
字号:
/********************************************************
	FACILITY 3200 样例程序[v1.000]
	深圳市康卓电子技术有限公司
*********************************************************/
#include "F3200.h"			// F3200库函数头文件
/*********************************************************/
#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=1;		//串口号(TVIR)
UBYTE tr[12][3];		//时段表
ULONG ClrPswd = 0x12345600, PgmPswd = 0x12345601;
ULLONG devID = 0;

/**************************************/
/*  子函数                            */
/**************************************/
void bcd2ascii(UBYTE *bcd,UBYTE *a,UBYTE l)
{
	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);
}


UBYTE hex2bcd(UBYTE hex)
{
	return (hex%10)+(((hex/10)%10) <<4);
}

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_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!=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; }
		}
		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!=K_ENTER) { 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==K_ESC) a=0x1000000000000;
	else if(k==K_ENTER){
		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 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==K_ESC) break;
		else if(k==K_ENTER){
			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)

⌨️ 快捷键说明

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