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

📄 main.c

📁 集中数据采集系统中
💻 C
📖 第 1 页 / 共 5 页
字号:
//ewq    int3=0;//qqqqqqqqqq
    //int2=0;    								// 设置为红外接收状态
	//buf_ptr=(HBUF xdata *)BUF_ADD;						// 指针指向接收绶冲首地址
	buf_ptr=(HBUF *)BUF_ADD;						// 指针指向接收绶冲首地址
	ysrxd=240;time=0;									// 初始化1分钟标识
	while(1)
	{
		//P1=0xF4;P1=0xF1;
	   	ledstm(0xf7);
		if(ysrxd==0){ysrxd=240;time++;}					// 12秒没有接收到信息 time标识加1
		if(time>=5) break;               				// 5个12秒(1分钟)退出红外接收程序
		//if(RI==0) continue;								// 没有接收信息,继续计时
		if((rUTRSTAT0&0x1)==0) continue;
		//buf_ptr=(HBUF xdata *)BUF_ADD;
		buf_ptr=(HBUF *)BUF_ADD;
       	begin_rev_flag=0;rev_falg_num=0;ysrxd=40;
		while(ysrxd)									// 开始接收信息包
		{
			//if(RI==1)
			if((rUTRSTAT0&0x1)==1)
			{
				//cush_char=SBUF;
				cush_char=rURXH0;
				if(begin_rev_flag)
				{
					buf_ptr->buf0[++rev_falg_num]=cush_char;
					if(cush_char==0xDD) break;
				}
				else
				{
					if(cush_char==0xEA)
					{
						buf_ptr->buf0[rev_falg_num]=cush_char;
						begin_rev_flag=1;
					}
				}
				//RI=0;
			 }
			 //P1=0xf4; P1=0xff;
			 //qwe
		}
		if(rev_falg_num<10){//RI=0;
		continue;}				// 接收数据超时
		if(buf_ptr->buf0[3]!=carr_svr_name[1] || 
		buf_ptr->buf0[4]!=carr_svr_name[0]){//RI=0;
		continue;}// 非本机指令
		info_check=0;
		for(cyc_flag=0;cyc_flag<=(7+buf_ptr->buf0[5]);cyc_flag++)
		{info_check+=buf_ptr->buf0[cyc_flag];}
		if((info_check%0x0100)!=buf_ptr->buf0[cyc_flag++] ||
		(info_check/0x0100)!=buf_ptr->buf0[cyc_flag]){//RI=0;
		continue;}// 校验出错
		ass_flag=buf_ptr->buf0[2];send_num=0;
		ledstm(0xe7);
		ys(0x01);
		ledstm(0xf7);
		switch(ass_flag)
		{
			case 0x01:									// <读取集中器设置>--震旦公司增加协议
				send_num=readsettings();break;
			case 0x02:									// 读取集中器时钟
				send_num=readclock();break;
			case 0x04:									// 指定某表号实时抄表(点抄)
				send_num=point_excerption();break;
			case 0x05:									// 设置集中器时钟
				send_num=setclock();break;
			case 0x06:									// 向集中器下载主控程序
				send_num=downpro();break;
			case 0x07:									// 清空集中器抄表数据
				send_num=clear_data();break;
			case 0x09:									// 读取集中器运行主控版本号
				send_num=readversion();break;
			case 0x0C:									// 向集中器下载电表局编号(*)<加载集中器抄表数据>
				send_num=loaddata();break;
			case 0x0D:									// <加载集中器设置>--震旦公司增加协议
				send_num=loadsettings();break;
			case 0x0E:									// 由集中器上装当月抄表数据(*)<抄录实时表底>
				send_num=realtime(0x8E);break;
			case 0x0F:									// 由集中器上装当日抄表数据(*)<抄录实时表底>
				send_num=realtime(0x8F);break;
			case 0x10:									// 集中器复位
				send_num=ser_reposition();
				ledstm(0xd7);
				for(cyc_flag=0;cyc_flag<=send_num;cyc_flag++)
				{txdbyte(buf_ptr->buf0[cyc_flag]);}
				while(1);break;
			case 0x2C:									// 向集中器下载电表局编号(*)<加载集中器抄表数据>--有后继帧
				send_num=loaddata();break;
			default:{//RI=0;
			continue;}					// 接收非法指令
		}
		ysrxd=240;time=0;								// 初始化1分钟标识
		if(send_num==0){//RI=0;
		continue;}
		ledstm(0xd7);
		for(cyc_flag=0;cyc_flag<=send_num;cyc_flag++)
		{txdbyte(buf_ptr->buf0[cyc_flag]);}
		//RI=0;
	}
	ledstm(led_data);
// 	int2=1;
//ewq	int3=1; // 设置显示状态//qqqqqqqqqqqqqq
}
// 红外接收==Test==End=====



// 月零抄 冻结
void frozen_all(void)
{
	//uint data j,dat_len;
	U16 j,dat_len;
  	//jzq_ptr=(JZQ_HEAD xdata *)JZQ_ADD;
  	jzq_ptr=(JZQ_HEAD *)JZQ_ADD;
  	//dat_ptr=(DAT_ITEM xdata *)(JZQ_ADD+DAT_ADD);
  	dat_ptr=(DAT_ITEM *)(JZQ_ADD+DAT_ADD);
  	//P1=0xf1;
  	dat_len=jzq_ptr->meter_num;
  	for(j=0;j<dat_len;j++,dat_ptr++)
  	{
		dat_ptr->r_base[0]=dat_ptr->s_base[0];   //总
    	dat_ptr->r_base[1]=dat_ptr->s_base[1];
    	dat_ptr->r_base[2]=dat_ptr->s_base[2];
    	dat_ptr->r_base[3]=dat_ptr->s_base[3];
    	dat_ptr->r_base2[0]=dat_ptr->s_base2[0];
    	dat_ptr->r_base2[1]=dat_ptr->s_base2[1];
    	dat_ptr->r_base2[2]=dat_ptr->s_base2[2];
    	dat_ptr->r_base2[3]=dat_ptr->s_base2[3];
    	dat_ptr->r_base3[0]=dat_ptr->s_base3[0];
    	dat_ptr->r_base3[1]=dat_ptr->s_base3[1];
    	dat_ptr->r_base3[2]=dat_ptr->s_base3[2];
    	dat_ptr->r_base3[3]=dat_ptr->s_base3[3];
    	dat_ptr->r_base4[0]=dat_ptr->s_base4[0];
    	dat_ptr->r_base4[1]=dat_ptr->s_base4[1];
    	dat_ptr->r_base4[2]=dat_ptr->s_base4[2];
    	dat_ptr->r_base4[3]=dat_ptr->s_base4[3];
    	dat_ptr->r_xq[0]=dat_ptr->s_xq[0];
    	dat_ptr->r_xq[1]=dat_ptr->s_xq[1];
    	dat_ptr->r_xq[2]=dat_ptr->s_xq[2];
    	dat_ptr->r_time[0]=dat_ptr->s_time[0];
    	dat_ptr->r_time[1]=dat_ptr->s_time[1];
    	dat_ptr->r_time[2]=dat_ptr->s_time[2];
    	dat_ptr->r_time[3]=dat_ptr->s_time[3];
    	dat_ptr->r_qdx=dat_ptr->s_qdx;
    	dat_ptr->r_mon=time_ptr->month;
	}
  	//P1=0xff;
}

// 日零抄 冻结
void frozen_day(void)
{
	//uint data j,dat_len;
	U16 j,dat_len;
  	//jzq_ptr=(JZQ_HEAD xdata *)JZQ_ADD;
  	jzq_ptr=(JZQ_HEAD *)JZQ_ADD;
  	//dat_ptr=(DAT_ITEM xdata *)(JZQ_ADD+DAT_ADD);
  	dat_ptr=(DAT_ITEM *)(JZQ_ADD+DAT_ADD);
  	//P1=0xf1;
  	dat_len=jzq_ptr->meter_num;
  	for(j=0;j<dat_len;j++,dat_ptr++)
  	{
		dat_ptr->z_base[0]=dat_ptr->s_base[0];   //总
    	dat_ptr->z_base[1]=dat_ptr->s_base[1];
		dat_ptr->z_base[2]=dat_ptr->s_base[2];
		dat_ptr->z_base[3]=dat_ptr->s_base[3];
		dat_ptr->z_base2[0]=dat_ptr->s_base2[0];
		dat_ptr->z_base2[1]=dat_ptr->s_base2[1];
		dat_ptr->z_base2[2]=dat_ptr->s_base2[2];
		dat_ptr->z_base2[3]=dat_ptr->s_base2[3];
		dat_ptr->z_base3[0]=dat_ptr->s_base3[0];
		dat_ptr->z_base3[1]=dat_ptr->s_base3[1];
		dat_ptr->z_base3[2]=dat_ptr->s_base3[2];
		dat_ptr->z_base3[3]=dat_ptr->s_base3[3];
		dat_ptr->z_base4[0]=dat_ptr->s_base4[0];
		dat_ptr->z_base4[1]=dat_ptr->s_base4[1];
		dat_ptr->z_base4[2]=dat_ptr->s_base4[2];
		dat_ptr->z_base4[3]=dat_ptr->s_base4[3];
		dat_ptr->z_xq[0]=dat_ptr->s_xq[0];
		dat_ptr->z_xq[1]=dat_ptr->s_xq[1];
		dat_ptr->z_xq[2]=dat_ptr->s_xq[2];
		dat_ptr->z_time[0]=dat_ptr->s_time[0];
		dat_ptr->z_time[1]=dat_ptr->s_time[1];
		dat_ptr->z_time[2]=dat_ptr->s_time[2];
		dat_ptr->z_time[3]=dat_ptr->s_time[3];
		dat_ptr->z_qdx=dat_ptr->s_qdx;
		dat_ptr->z_mon=time_ptr->day;
	}
	//P1=0xff;
}

void zbsnd(uchar lensnd,uchar lsnd)//qh 发命令帧
{
	//uchar idata j,t;
	uchar j,t;
	for(j=0;j<3;j++) if(wr_82502('S')) break;
	for(j=0;j<3;j++) if(wr_82502('N')) break;
	for(j=0;j<3;j++) if(wr_82502('D')) break;
	for(j=0;j<3;j++) if(wr_82502(lensnd)) break;         // 发长度
	for(t=0;t<6;t++)
		{for (j=0;j<3;j++) if(wr_82502(0xff)) break;}
	for(j=0;j<3;j++) if(wr_82502(0x09)) break;
	for(j=0;j<3;j++) if(wr_82502(0xaf)) break;
	for(t=0;t<lsnd;t++)
	{for(j=0;j<3;j++) if(wr_82502(buf_ptr->buf0[t])) break;}
	for(j=0;j<3;j++) if(wr_82502(0)) break;
}


void zbdat(uchar ys)
{
	//uchar idata i,j,t,w,sp1;
	uchar i,j,t,w,sp1;
  	//uchar xdata *pl;
  	uchar *pl;

  	yszb=ys;

	i=0;j=0;

  	//buf_ptr  = (HBUF xdata *)BUF_ADD;
  	buf_ptr  = (HBUF *)BUF_ADD;

	//qh 清缓冲区
  	buf_ptr->buf1[0]=buf_ptr->buf1[1]=buf_ptr->buf1[2]=buf_ptr->buf1[3]=buf_ptr->buf1[4]=0xff;
  	buf_ptr->buf1[5]=buf_ptr->buf1[6]=buf_ptr->buf1[7]=buf_ptr->buf1[8]=buf_ptr->buf1[9]=0xff;

    while (yszb)//qh 判断超时否
	{
		w=rd_82502();//qh 接收载波信息

	   	if(w=='D')
		{buf_ptr->buf1[0]=w; break;}
	   	datrxd=0;
	   	//sp1=P1;P1=0xf4;P1=sp1;  // 清狗
	   	//qwe
	}
	j=1;
	if(w=='D')
	{
		yszb=10;	//qh 
	   	while(yszb)
	    {
			w=rd_82502();//qh 接收载波信息
	      	if (datrxd==1)
			{
		  		datrxd=0;
		  		buf_ptr->buf1[j]=w; j++;
		  		if(j==4) t=buf_ptr->buf1[3];
		  		if(j>4){t--;if(t==0)return;}
			}
			//sp1=P1;P1=0xf4;P1=sp1;  // 清狗
			//qwe
		}
	}
}

// zbtype 接收命令类型
//bit dat_int (uchar zbtype)
U8 dat_int (uchar zbtype)
{
  //uint idata cc;
  U16 cc;
  //uchar sp1,d_type,dsh;
  U8 sp1,d_type,dsh;
  //uchar xdata *pl;
  U8 *pl;
  //buf_ptr = (HBUF xdata *)BUF_ADD;
  buf_ptr = (HBUF *)BUF_ADD;
  if (buf_ptr->buf1[0]=='D' && buf_ptr->buf1[1]=='A' && buf_ptr->buf1[2]=='T')
     { sp1=buf_ptr->buf1[3]; cc=0;
       if (sp1>100)  goto dat_end;   // 长度限制
       sp1=sp1-2;
       for (d_type=0;d_type<sp1;d_type++)
            cc=buf_ptr->buf1[d_type+4]+cc;
       sp1=(char)cc;  cc=cc>>8; dsh=(char)cc;   // 判断累加和
       if ((sp1==buf_ptr->buf1[d_type+4])&&(dsh==buf_ptr->buf1[d_type+5]))
           goto  dat_st;
       else goto dat_end;
       dat_st:
       if (buf_ptr->buf1[4]!=0xbb) goto dat_end;   // 集中器号判断
       if (buf_ptr->buf1[5]!=0xbb) goto dat_end;
       if (buf_ptr->buf1[6]!=0xbb) goto dat_end;
       if (buf_ptr->buf1[7]!=0x81) goto dat_end;  // 返回命令码 C 判断
       cc=comp(c_zb);
       //dat_ptr=(DAT_ITEM xdata *)(JZQ_ADD+cc*DAT_ADD) ;
       dat_ptr=(DAT_ITEM *)(JZQ_ADD+cc*DAT_ADD) ;
       if (dat_ptr->s_no[0]!=buf_ptr->buf1[11]) goto dat_end1; // 表号判断
       if (dat_ptr->s_no[1]!=buf_ptr->buf1[12]) goto dat_end1;
       if (dat_ptr->s_no[2]==buf_ptr->buf1[13])
		{ if ((buf_ptr->buf1[9]>=0x10)&&(buf_ptr->buf1[9]<=0x1f))
                      goto dat_r;
 dat_r:
       //pl=0x1fff; sp1=P1; P1=0xf6; *pl=led_data&0xef; P1=sp1;  // 置显示锁存状态
       ledstm(led_data&0xef);
		  if (( (rUTRSTAT0&0x01) == 1 ))//||(int3==0))
		    { //pl=0x1fff; sp1=P1; P1=0xf6; *pl=led_data; P1=sp1; 
		    ledstm(led_data);
		    return(0); } // 置显示锁存状态
		  d_type=dat_ptr->d_type;
		  //time_ptr = (TIME xdata *)TIME_ADD;
		  time_ptr = (TIME *)TIME_ADD;
		  if (zbtype==1)  goto zbs1;  // 抄当前总电能
		  if (zbtype==2)  goto zbs2;  // 抄昨日总电能
		  if (zbtype==3)  goto zbs3;  // 抄上月有总电能
		  if (zbtype==4)  goto zbs4;  // 抄当前有功最大需量
		  if (zbtype==5)  goto zbs5;  // 抄当前有功最大需量发生时间
		  if (zbtype==6)  goto zbs6;  // 抄上月有功最大需量
		  if (zbtype==7)  goto zbs7;  // 抄上月有功最大需量发生时间
		  if (zbtype==8)  goto zbs8;  // 抄昨日有功最大需量
		  if (zbtype==9)  goto zbs9;  // 抄昨日有功最大需量发生时间
		  goto    zbend;
		  zbs1:
		  dat_ptr->s_qdx=buf_ptr->buf1[14];
		  dat_ptr->s_base[0]=buf_ptr->buf1[15];     // 当前总电能
		  dat_ptr->s_base[1]=buf_ptr->buf1[16];
		  dat_ptr->s_base[2]=buf_ptr->buf1[17];
		  dat_ptr->s_base[3]=buf_ptr->buf1[18];
		  if ((d_type&0x0f)==0)  goto  zbs11;  // 单费率表 不抄峰平谷
                  if (buf_ptr->buf1[9]!=0x1f)
                    {  dat_ptr->s_base2[0]=0;    // 峰有功
		       dat_ptr->s_base2[1]=0;
		       dat_ptr->s_base2[2]=0;
		       dat_ptr->s_base2[3]=0;
		       dat_ptr->s_base3[0]=0;    // 平有功
		       dat_ptr->s_base3[1]=0;
		       dat_ptr->s_base3[2]=0;
		       dat_ptr->s_base3[3]=0;
		       dat_ptr->s_base4[0]=0;    // 谷有功
		       dat_ptr->s_base4[1]=0;
		       dat_ptr->s_base4[2]=0;
		       dat_ptr->s_base4[3]=0;
                       goto zbs11 ;  // 返回的数据为单费率型式
                    }
		  dat_ptr->s_base2[0]=buf_ptr->buf1[19];    // 峰有功
		  dat_ptr->s_base2[1]=buf_ptr->buf1[20];
		  dat_ptr->s_base2[2]=buf_ptr->buf1[21];
		  dat_ptr->s_base2[3]=buf_ptr->buf1[22];
		  dat_ptr->s_base3[0]=buf_ptr->buf1[23];    // 平有功
		  dat_ptr->s_base3[1]=buf_ptr->buf1[24];
		  dat_ptr->s_base3[2]=buf_ptr->buf1[25];
		  dat_ptr->s_base3[3]=buf_ptr->buf1[26];
		  dat_ptr->s_base4[0]=buf_ptr->buf1[27];    // 谷有功
		  dat_ptr->s_base4[1]=buf_ptr->buf1[28];
		  dat_ptr->s_base4[2]=buf_ptr->buf1[29];
		  dat_ptr->s_base4[3]=buf_ptr->buf1[30];
		  zbs11:
		  				rRTCCON=0x01;

		  time_ptr->min  =rBCDMIN;   time_ptr->hour =rBCDHOUR;
		  time_ptr->day =rBCDDAY;    time_ptr->month=rBCDMON;  // 读时钟
				rRTCCON=0x00;

		  dat_ptr->c_mon =time_ptr->month;
		  dat_ptr->c_day =time_ptr->day;
		  dat_ptr->c_hour=time_ptr->hour;
		  dat_ptr->c_min =time_ptr->min;
		  goto zbs12;
		  zbs2:
		  dat_ptr->z_qdx=buf_ptr->buf1[14];
		  dat_ptr->z_base[0]=buf_ptr->buf1[15];     // 日冻结总电能
		  dat_ptr->z_base[1]=buf_ptr->buf1[16];
		  dat_ptr->z_base[2]=buf_ptr->buf1[17];
		  dat_ptr->z_base[3]=buf_ptr->buf1[18];
		  if ((d_type&0x0f)==0)  goto  zbs21;  // 单费率表 不抄峰平谷
                  if (buf_ptr->buf1[9]!=0x1f)
                    {  dat_ptr->z_base2[0]=0;    // 日冻峰有功
		       dat_ptr->z_base2[1]=0;
		       dat_ptr->z_base2[2]=0;
		       dat_ptr->z_base2[3]=0;
		       dat_ptr->z_base3[0]=0;    // 日冻平有功
		       dat_ptr->z_base3[1]=0;
		       dat_ptr->z_base3[2]=0;
		       dat_ptr->z_base3[3]=0;
		       dat_ptr->z_base4[0]=0;    // 日冻谷有功
		       dat_ptr->z_base4[1]=0;
		       dat_ptr->z_base4[2]=0;
		       dat_ptr->z_base4[3]=0;
                       goto zbs21 ;  // 返回的数据为单费率型式
                    }
		  dat_ptr->z_base2[0]=buf_ptr->buf1[19];    // 日冻峰有功
		  dat_ptr->z_base2[1]=buf_ptr->buf1[20];
		  dat_ptr->z_base2[2]=buf_ptr->buf1[21];
		  dat_ptr->z_base2[3]=buf_ptr->buf1[22];
		  dat_ptr->z_base3[0]=buf_ptr->buf1[23];    // 日冻平有功
		  dat_ptr->z_base3[1]=buf_ptr->buf1[24];
		  dat_ptr->z_base3[2]=buf_ptr->buf1[25];
		  dat_ptr->z_base3[3]=buf_ptr->buf1[26];
		  dat_ptr->z_base4[0]=buf_ptr->buf1[27];    // 日冻谷有功
		  dat_ptr->z_base4[1]=buf_ptr->buf1[28];
		  dat_ptr->z_base4[2]=buf_ptr->buf1[29];
		  dat_ptr->z_base4[3]=buf_ptr->buf1[30];
		  zbs21:
		  dat_ptr->z_mon=dat_ptr->z_tt=rBCDDAY;
		  goto zbs12;
		  zbs3:
		  dat_ptr->r_qdx=buf_ptr->buf1[14];
		  dat_ptr->r_base[0]=buf_ptr->buf1[15];     // 月冻结总电能
		  dat_ptr->r_base[1]=buf_ptr->buf1[16];
		  dat_ptr->r_base[2]=buf_ptr->buf1[17];
		  dat_ptr->r_base[3]=buf_ptr->buf1[18];
		  if ((d_type&0x0f)==0)  goto  zbs31;  // 单费率表 不抄峰平谷
                  if (buf_ptr->buf1[9]!=0x1f)
                    {  dat_ptr->r_base2[0]=0;    // 月冻峰有功
		       dat_ptr->r_base2[1]=0;
		       dat_ptr->r_base2[2]=0;
		       dat_ptr->r_base2[3]=0;
		       dat_ptr->r_base3[0]=0;    // 月冻平有功
		       dat_ptr->r_base3[1]=0;
		       dat_ptr->r_base3[2]=0;
		       dat_ptr->r_base3[3]=0;
		       dat_ptr->r_base4[0]=0;    // 月冻谷有功
		       dat_ptr->r_base4[1]=0;
		       dat_ptr->r_base4[2]=0;
		       dat_ptr->r_base4[3]=0;
                       goto zbs31 ;              // 返回的数据为单费率型式
                    }
		  dat_ptr->r_base2[0]=buf_ptr->buf1[19];    // 月冻峰有功
		  dat_ptr->r_base2[1]=buf_ptr->buf1[20];
		  dat_ptr->r_base2[2]=buf_ptr->buf1[21];
		  dat_ptr->r_base2[3]=buf_ptr->buf1[22];
		  dat_ptr->r_base3[0]=buf_ptr->buf1[23];    

⌨️ 快捷键说明

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