📄 jizhong.c
字号:
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 + -