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

📄 jizhong.c

📁 完整的远程抄表系统程序.包含电量采集(分峰时
💻 C
📖 第 1 页 / 共 5 页
字号:
  	c1=0;                                 // 为 0 时 不在数据库中
  	return(c1);
}

void zbdatpc(unsigned char ys)
{
	unsigned char idata i,j,t,w,sp1;
  	yszb=ys;i=0;j=0;
  	buf_ptr  = (HBUF xdata *)BUF_ADD;
	while (yszb)
	{
		w=rd_82502();
	   	if(w=='D')
		{
			datrxd=0;
	       	buf_ptr->buf0[0]=w; break;
		}
	   	datrxd=0;
	   	sp1=P1;P1=0xf4;P1=sp1;  // 清狗
		if(yszb==0) break;
	}
	j=1;
	if(w=='D')
	{
		yszb=20;
	   	while(yszb)
	    {
			w=rd_82502();
	      	if(datrxd==1)
			{
				datrxd=0;
		  		buf_ptr->buf0[j]=w;j++;
		  		if(j==4)t=buf_ptr->buf0[3];
		  		if(j>4)
		    	{
					t--;
		      		if(t==0){return;}  // 设置显示状态
		    	}
	       	}
			if(yszb==0)break;
		}
	}
}

int comp(unsigned int c_zbxx)
{
	unsigned int data ccxx ;
  	if((c_zbxx>0)&&(c_zbxx<=447)){ccxx=c_zbxx;P1=0xf1;goto zbend;}
  	if((c_zbxx>447)&&(c_zbxx<=894)){ccxx=c_zbxx-447;P1=0xf9;goto zbend;}
  	if((c_zbxx>894)&&(c_zbxx<=1341)){ccxx=c_zbxx-894;P1=0xf2;}
zbend:
  	return(ccxx);
}

int comp1(unsigned int czx)
{
	if((czx>=0)&&(czx<=447)){P1=0xf1;goto comp1end;}
   	if((czx>447)&&(czx<895)){P1=0xf9;czx=czx-447;goto comp1end;}
   	if((czx>894)&&(czx<1342)){P1=0xf2;czx=czx-894;}
comp1end:
	return(czx);
}

void fsnd(void)
{
	unsigned char data i;
  	for(i=0;i<3;i++) if (wr_82502(0xff)) break ;
  	for(i=0;i<3;i++) if (wr_82502('S')) break ;
  	for(i=0;i<3;i++) if (wr_82502('N')) break ;
  	for(i=0;i<3;i++) if (wr_82502('D')) break ;
}

// 在MODEM连通的情况下执行点抄,用内存的中继
bit PLM_snd_rcv1()
{
	unsigned char xdata a012[15];
  	unsigned char xdata ac[20];
  	unsigned char xdata a123[6];
  	unsigned int  xdata see;
  	unsigned int data  c;
  	unsigned char xdata i,j,bb,h,tt,t2;
  	P1=0xf1;
  	dat_ptr=(DAT_ITEM xdata *)JZQ_ADD;				// 电表数据库地址
  	buf_ptr=(HBUF xdata *)BUF_ADD;					// 接收、发送缓存区 起始地址
  	j=0;
  	tt=buf_ptr->buf0[0];t2=buf_ptr->buf0[15];h=buf_ptr->buf0[15];
	//a123[3]=buf_ptr->buf0[8] ;a123[4]=buf_ptr->buf0[9];	a123[5]=buf_ptr->buf0[10]; //hqf add
  	a123[0]=buf_ptr->buf0[11];a123[1]=buf_ptr->buf0[12];a123[2]=buf_ptr->buf0[13];
  	a012[9]=buf_ptr->buf0[11];a012[10]=buf_ptr->buf0[12];a012[11]=buf_ptr->buf0[13];  // 存目的电表地址
  	a012[12]=buf_ptr->buf0[18];a012[13]=buf_ptr->buf0[19];a012[14]=buf_ptr->buf0[20];  // 存集中器地址
  	c=get_sno(&buf_ptr->buf0[11]);
  	if(c==0) goto PLMEND;
  	c=comp1(c);
  	dat_ptr=(DAT_ITEM xdata *)JZQ_ADD;
   	if(dat_ptr[c].s_xh)
    {
		j++;
      	c=dat_ptr[c].s_xh;
      	c=comp1(c);
      	buf_ptr->buf0[11]=dat_ptr[c].s_no[0];a012[6]=buf_ptr->buf0[11];  // 一级中继 00
      	buf_ptr->buf0[12]=dat_ptr[c].s_no[1];a012[7]=buf_ptr->buf0[12];
      	buf_ptr->buf0[13]=dat_ptr[c].s_no[2];a012[8]=buf_ptr->buf0[13];
      	buf_ptr->buf0[14]=(buf_ptr->buf0[14]&0x0f)+0x40;
	}
    else {buf_ptr->buf0[14]=buf_ptr->buf0[14]&0x0f;goto cqq; }  		// 变成无中继
  	c=get_sno(&buf_ptr->buf0[11]);P1=0xf1;
  	c=comp1(c);
  	if(dat_ptr[c].s_xh)
    {
		j++;
      	c=dat_ptr[c].s_xh;
      	c=comp1(c);
      	buf_ptr->buf0[11]=dat_ptr[c].s_no[0];a012[3]=buf_ptr->buf0[11];  // 二级中继   01
      	buf_ptr->buf0[12]=dat_ptr[c].s_no[1];a012[4]=buf_ptr->buf0[12];
      	buf_ptr->buf0[13]=dat_ptr[c].s_no[2];a012[5]=buf_ptr->buf0[13];
      	buf_ptr->buf0[14]=(buf_ptr->buf0[14]&0x0f)+0x50;
    }
    else { buf_ptr->buf0[14]=(buf_ptr->buf0[14] &0x0f)+0x40; goto DZZZ; }   // 变成一级中继
  	c=get_sno(&buf_ptr->buf0[11]);  P1=0xf1;
  	c=comp1(c);
  	if(dat_ptr[c].s_xh)
    {
		j++;
      	c=dat_ptr[c].s_xh;
      	c=comp1(c);
      	buf_ptr->buf0[11]=dat_ptr[c].s_no[0];    a012[0]=buf_ptr->buf0[11];  // 三级中继   10
      	buf_ptr->buf0[12]=dat_ptr[c].s_no[1];    a012[1]=buf_ptr->buf0[12];
      	buf_ptr->buf0[13]=dat_ptr[c].s_no[2];    a012[2]=buf_ptr->buf0[13];
      	buf_ptr->buf0[14]=(buf_ptr->buf0[14]&0x0f)+0x60;
    }
    else { buf_ptr->buf0[14]=(buf_ptr->buf0[14]&0x5f)+0x50; goto DZZZ; }   	// 变成二级中继
  	c=get_sno(&buf_ptr->buf0[11]);  P1=0xf1;
 	c=comp1(c);
  	if(dat_ptr[c].s_xh)
    {
		j++;
      	c=dat_ptr[c].s_xh;
      	c=comp1(c);
      	buf_ptr->buf0[11]=dat_ptr[c].s_no[0];                   // 四级中继      11
      	buf_ptr->buf0[12]=dat_ptr[c].s_no[1];
      	buf_ptr->buf0[13]=dat_ptr[c].s_no[2];
      	buf_ptr->buf0[14]=(buf_ptr->buf0[14]&0x0f)+0x70;
    }
    else buf_ptr->buf0[14]=(buf_ptr->buf0[14]&0x0f)+0x6f;        // 变成三级中继
DZZZ:
	if(j==4){j=0;t2=t2+12;goto czzz;}
	if(j==3){j=3;t2=t2+9;goto czzz;}
	if(j==2){j=6;t2=t2+6;goto czzz;}
	if(j==1){j=9;t2=t2+3;goto czzz;}
	if(j==0){j=12;t2=t2;}
czzz:
	i=17;buf_ptr->buf0[15]=t2;
	bb=0;
	while(1)
    {
		if(i>19)
	    {ac[bb]=buf_ptr->buf0[i];bb++;}
	  	if(j<15){buf_ptr->buf0[i]=a012[j];i++;j++;}
	  	if(j==15){h=h-5;bb=0;j=16;}
	  	if(j==16)
	    while (h!=0)
		{
			buf_ptr->buf0[i]=ac[bb];
		 	bb++;i++;h--;
		}
	  	if((j==16)&&(h==0)) break;
	}
	buf_ptr->buf0[15]=t2;
    P1=0xf1;see=0;                                    /*  SIO=2; ram_page=1;  */
    for(i=10;i<t2+5+10;i++)
	{see=see+buf_ptr->buf0[i];}
    buf_ptr->buf0[i]=(unsigned char)see;  i++; buf_ptr->buf0[i]=(unsigned char)(see>>8);
    P1=0xf1;
   	fsnd();
  	for(i=0;i<3;i++) if(wr_82502(t2+15)) break ;      //  后面所有的长度
   	for(j=0;j<t2+15;j++)
	{
		for(i=0;i<3;i++)
	  		if(wr_82502(buf_ptr->buf0[j+3])) break ;
	}
   	for(i=0;i<3;i++) if(wr_82502(0)) break ;
   	goto cww;
cqq:
  	P1=0xf1;
  	fsnd();
  	buf_ptr = (HBUF xdata *)BUF_ADD;
  	buf_ptr->buf0[0] = buf_ptr->buf0[0]-4;
  	for(i=0;i<3;i++) if(wr_82502(buf_ptr->buf0[0])) break ;
  	for(j=0;j<buf_ptr->buf0[0];j++)
	{
		for(i=0;i<3;i++)
	  		if(wr_82502(buf_ptr->buf0[j+3])) break ;
	}
  	for(i=0;i<3;i++) if(wr_82502(0)) break ;
cww:
  	i=buf_ptr->buf0[14]&0x30;
  	if(i==0x30) yszb=130;
    else if(i==0x20) yszb=100;
	else if (i==0x10) yszb=80;
	else yszb=65;
  	zbdatpc(yszb);
PLMEND:
  	P1=0xf1;ysrxd=80;
  	if(buf_ptr->buf0[0]=='D' && buf_ptr->buf0[1]=='A' && buf_ptr->buf0[2]=='T')
	{
		if(buf_ptr->buf0[4]!=0xbb) goto rcv1end;   // 集中器号判断
        if(buf_ptr->buf0[5]!=0xbb) goto rcv1end;
        if(buf_ptr->buf0[6]!=0xbb) goto rcv1end;
        if(buf_ptr->buf0[7]!=0x81) goto rcv1end;  // 返回命令码 C 判断
        if(a123[0]!=buf_ptr->buf0[11]) goto rcv1end;
        if(a123[1]!=buf_ptr->buf0[12]) goto rcv1end;
        if(a123[2]!=buf_ptr->buf0[13]) goto rcv1end;
        if(int3==0)ledst(0xef);
	    return(1);
	}
    else
	{
    	rcv1end:
        return(0);
	}
}
//点抄  用上位机下发的中继
bit PLM_snd_rcv2()
{
	unsigned char data j,w;
  	fsnd();
  	buf_ptr = (HBUF xdata *)BUF_ADD;
  	buf_ptr->buf0[0] = buf_ptr->buf0[0]-4;
  	for(w=0;w<3;w++) if (wr_82502(buf_ptr->buf0[0])) break ;
  	for(j=0;j<buf_ptr->buf0[0];j++)
	{
		for(w=0;w<3;w++)
	  		if(wr_82502(buf_ptr->buf0[j+3])) break ;
	}
  	w=buf_ptr->buf0[14]&0x30;
  	if(w==0x30) yszb=130;
    else if (w==0x20) yszb=100;
	else if (w==0x10) yszb=80;
	else yszb=65;
  	zbdatpc(yszb);
  	if(buf_ptr->buf0[0]=='D' && buf_ptr->buf0[1]=='A' && buf_ptr->buf0[2]=='T')
	{
		if(buf_ptr->buf0[4]!=0xbb) goto rcv2end;   // 集中器号判断
        if(buf_ptr->buf0[5]!=0xbb) goto rcv2end;
        if(buf_ptr->buf0[6]!=0xbb) goto rcv2end;
        if(buf_ptr->buf0[7]!=0x81) goto rcv2end;  // 返回命令码 C 判断
        if(int3==0)ledst(0xef);
	    return(1);
	}
    else
    {
rcv2end:
        return(0);
	}
}
// 与上位机通讯
void pcrxd(void)
{
	unsigned char data  i,j,s,len,h,ma;
  	unsigned char data  x_data;
  	unsigned char xdata *pm;
  	unsigned int  data  c,cj,n,cc;
  	P1=0xf4;  P1=0xff; x_data=0;
  	ledst(0xef);
	    	
	RI=0;					           		
	for(ysrxd=5;ysrxd;)                    	
	{
		P1=0xf4;P1=0xff;                   	
  		if(ysrxd==0) break;                 
	}                                      	
		led_data=led_data&0xcf;        		
        pm=0x1fff;  P1=0xf6;           		
        *pm=led_data;  P1=0xff;        		
        ysrxd=180; i=0;                		
		while(1)                       		
  		{
			if(RI)                    		
      		{
				if(SBUF=='R') break; 		
				RI=0;                  		
      		}                        		
    		P1=0xf4;P1=0xff;         		
    		if (ysrxd==0) break;       		
  		}                            		
		goto int2rxd;                  		
int2rxd:
	led_data=led_data&0xcf;pm=0x1fff;P1=0xf6;*pm=led_data;P1=0xff;   // 设置显示状态
	buf_ptr = (HBUF xdata *)BUF_ADD;
	x_data=0;ma=0;
	for (ysrxd=100; ysrxd;)                // 延时5秒
	{
		P1=0xf4;P1=0xf1;
   		if(ysrxd==0) break;
   		if(x_data>120) break;
   		if(!RI) continue;
   		RI=0;
   		if(SBUF!='R')
    	{x_data++; continue;}
   		x_data=0;
  		buf_ptr->buf0[0]=buf_ptr->buf0[1]=buf_ptr->buf0[2]=0xff;
  		ysrxd=40;
   		while(ysrxd)
 		{
			if(RI){ RI=0;buf_ptr->buf0[0]=SBUF;len=SBUF;break;} // 接收长度
   			else if(ysrxd==0) break;
       		P1=0xf4;P1=0xff;
     	}
   		if(!ysrxd) continue;     // 延时到 退出
   		if(len==0)
     	{ysrxd=100;continue;}    // 长度为0 继续等待接收
   		if(len>=0x60)
      	{ysrxd=100;continue;}    // 长度超界 继续等待接收
   		len--;
   		for(i=1;i<=len;i++)
  		{
			for(ysrxd=20;ysrxd;)
      		{
				if(RI)
				{
					RI=0;buf_ptr->buf0[i]=SBUF;  // 接收数据
	      			ysrxd=10;
	     			break;
	    		}
	 			P1=0xf4;P1=0xf1;  // 清狗
	 			if(ysrxd==0) break;
      		}
    		if(!ysrxd){i=0;goto RETFOR;}
  		}
   		P1=0xf4; P1=0xff;
   		s=0;
   		for(i=0;i<len;i++)
   		s=s+buf_ptr->buf0[i];    // 判校验和
   		if(s==buf_ptr->buf0[i])
   		{ysrxd=80; i=1;}
  		else i=0;
RETFOR:
   		ysrxd=100;								 //开延时,开始判断接受的数据是否是正确的数据 HQF
   		if(i==0){i=0;continue;}
   		buf_ptr = (HBUF xdata *)BUF_ADD;
   		if(buf_ptr->buf0[1]==3) break;			 //请求下位集中器结束本次通信并主动挂机 HQF
   		if(buf_ptr->buf0[1]==1)					 //协议配置请求  HQF
   		{
			P1=0xf1;buf_ptr  = (HBUF xdata *)BUF_ADD;
     		len=buf_ptr->buf0[0]-3; s=0;
       		for(i=0;i<len;i++)
	 		{
				h=0;
	   			for(j=1;j<0x0e;j++)
		 			if(buf_ptr->buf0[i+2]==j){h=1;break;}			 
	   			if(h==0){buf_ptr->buf0[s]=buf_ptr->buf0[i+2];s++;}
	 		}
     		j=0;
     		if(s!=0)
       		{
				txdbyte('A');txdbyte(s+3);txdbyte(0);j=s+3;
	  			for(i=0;i<s;i++)
	    		{txdbyte(buf_ptr->buf0[i]);j=j+buf_ptr->buf0[i];}
	  			txdbyte(j);
       		}
       		else
			{
				txdbyte('A');txdbyte(13);    // 长度
		 		txdbyte(2);
		 		txdbyte(4);txdbyte(5);txdbyte(6);txdbyte(7);
		 		txdbyte(8);txdbyte(9);txdbyte(0x0a);txdbyte(0x0b);
                txdbyte(0x0c);txdbyte(0x0d);
		 		txdbyte(13+2+4+5+6+7+8+9+0x0a+0x0b+0x0c+0x0d);   // 累加和
	      	}
     		ysrxd=100; continue;
   		}
	    if(buf_ptr->buf0[1]>0x0d)
       	{
			txdbyte('A');txdbyte(4);txdbyte(0);
         	txdbyte(buf_ptr->buf0[1]);
         	P1=0xf1;
         	s=buf_ptr->buf0[1]+4;
         	txdbyte(s);
         	P1=0xff;
         	ysrxd=100; continue;
       	}
   		if(buf_ptr->buf0[1]==0x0d)
       	{
			for (i=0;i<9;i++)
            	if(buf_ptr->buf0[i+6]!=mima[i]) goto mimaer1;
            ma=1;
            txdbyte('A');txdbyte(0);
            ysrxd=100; continue;
mimaer1:
         	for(i=0;i<9;i++)
           		if(buf_ptr->buf0[i+6]!=buf_ptr->buf3[i]) goto mimaer2;
         	ma=1;
         	for(i=0;i<9;i++)
           		mima[i]=buf_ptr->buf0[i+6];
         	txdbyte('A');txdbyte(0);
         	ysrxd=100; continue;
mimaer2:
         	for(i=0;i<9;i++)
           		if(buf_ptr->buf0[i+6]!=buf_ptr->buf3[i+100]) goto mimaer;
         	ma=1;
         	for(i=0;i<9;i++)
           	{
				mima[i]=buf_ptr->buf0[i+6];
             	buf_ptr->buf3[i]=buf_ptr->buf0[i+6];
           	}
         	txdbyte('A');  txdbyte(0);
         	ysrxd=100; continue;
mimaer:

⌨️ 快捷键说明

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