📄 gd485-08.c
字号:
{
if(LCDbuf[ucA]==0)
{
LCDbuf[ucA]=11;
}
else break;
}
}
/****************************************
** 函数原型: void checkpulseadd(void); **
** 功 能: . **
****************************************/
void checkpulseadd(void)
{
if(IncZZFlag==1) { E2Add(); IncZZFlag=0; }
}
unsigned char JY(uchar ucJ) //机偶位
{
uchar ucA,ucB;
ucB=0;
for(ucA=0;ucA<8;ucA++)
{ if(ucJ&0x01) ucB++;
ucJ>>=1;
}
if(ucB&0x01) return(1);
else return(0);
}
/****************************************
** 函数原型: void trxPkg(void); **
** 功 能: 串口发送数据成帧 **
****************************************/
void trxPkg(void)
{
uchar i,ucA,ucB;
SCON_bit.REN=0;
SR_STAT=0;
SRTIME=0; //由子程序末移到首,避免因再接受数据改变
for(ucA=0;ucA<6;ucA++)
{
recv[ucA+2]=MeterID[ucA];
}
// memmove(&recv[2],MeterID,6); //由子程序末移到首,避免因再接受数据改变
if((recv[9]==0xc1)||(recv[9]==0xc4)) {recv[10]=1;recv[11]=0x1; }
else
{
recv[10]=trxLong; // 数据域长度
if(trxLong!=0) { recv[10]=trxLong+2;} // 写数据回应不包含DI1,DI0
if(trxLong<21)
{
for(i=0;i<trxLong;i++) /** 数据域赋值并做余三码处理 **/
{
recv[13+i]=EEbuf[i];
}
}
else {
for(i=0;i<20;i++) /** 数据域赋值并做余三码处理 **/
{
recv[13+i]=EEbuf[i];
}
}
}
for(i=0;i<recv[10];i++) /** 数据域赋值并做余三码处理 **/
{
recv[11+i]+=0x33;
}
for(ucB=0,ucA=1;ucA<(11+recv[10]);ucA++) // 生成检验和
{
ucB+=recv[ucA];
}
recv[11+recv[10]]=ucB;
recv[12+recv[10]]=ETX;
recv[0]=12+recv[10]; // 要发送数据长度
trxLong=0;
Delay(10);
SCON_bit.REN=0;
// TXIE=1;
// if(SR485_bz) // 485通讯
RS485Trx;
// else // 红外通讯
// { TMR2IE=0;
// initT2();
// / Timefull=1;
// TMR2ON=1;
// }
// TXEN=1;
Delay(48);
SIOtrFlag=1;
SR485_bz=0;
SCON_bit.TB8=1;
SBUF=0xfe;
// _nop_();_nop_();
//TXEN=1;
// if(P) TB8=1;
// else TB8=0;
// SBUF=ACC;
}
/****************************************
** 函数原型: void trxPkg(void); **
** 功 能: 串口发送数据成帧 **
****************************************/
void trxPkgL(void)
{
uchar i,ucA,ucB;
SCON_bit.REN=0;
SR_STAT=0;
SRTIME=0; //由子程序末移到首,避免因再接受数据改变
for(ucA=0;ucA<6;ucA++)
{
recv[ucA+2]=MeterID[ucA];
}
// memmove(&recv[2],MeterID,6); //由子程序末移到首,避免因再接受数据改变
// 数据域长度
recv[10]=trxLong+2; //
for(i=0;i<18;i++) /** 数据域赋值并做余三码处理 **/
{
recv[13+i]=EEbuf[i];
}
for(i=0;i<20;i++) /** 数据域赋值并做余三码处理 **/
{
recv[11+i]+=0x33;
}
for(ucB=0,ucA=1;ucA<31;ucA++) // 生成检验和
{
ucB+=recv[ucA];
}
recv[31]=ucB;
recv[32]=ETX;
recv[0]=12+recv[10]; // 要发送数据长度
trxLong=0;
Delay(10);
SCON_bit.REN=0;
// TXIE=1;
// if(SR485_bz) // 485通讯
RS485Trx;
// else // 红外通讯
// { TMR2IE=0;
// initT2();
// / Timefull=1;
// TMR2ON=1;
// }
// TXEN=1;
Delay(48);
SIOtrFlag=1;
SR485_bz=0;
SCON_bit.TB8=1;
SBUF=0xfe;
// asm("nop");asm("nop");
// ES=1;
// if(P) TB8=1;
// else TB8=0;
// SBUF=ACC;
}
uchar zerostar(uchar SS) //上ss日0点电量地址
{
uchar ucB;
readEE24(0,NOWZEROADD,1);
ucB=EEbuf[0];
if(SS>ucB)
ucB=ucB+8;
return(ucB-SS);
}
void zerotake(uchar www,uchar weiz) //上www日0点电量
{
readEE24(1,ZEROADD+5*www,5);
EEbuf[15-5*weiz]=EEbuf[0];
EEbuf[16-5*weiz]=EEbuf[1];
EEbuf[17-5*weiz]=EEbuf[2];
EEbuf[18-5*weiz]=EEbuf[3];
EEbuf[19-5*weiz]=EEbuf[4];
}
void poweron(void)
{
OUTA=0;
OUTB=1;
LEDBJ=0;
}
void poweroff(void)
{
OUTA=1;
OUTB=0;
}
/********************************************
** 函数原型: void TakeCommunication(void); **
** 功 能: 串口处理程序 **
** 根据数据帧完成数据读写并 **
** 调用trxpag完成应答数据处理 **
********************************************/
void TakeCommunication(void)
{
uchar ucA,ucB;
trxLong=0;
switch(recv[9])
{
case 0x01: /** 读数据 **/
{
recv[9]=0x81;
if(recv[12]==0x90) /**当前电能**/
{
if(recv[11]==0x1f)
{
for(ucA=0;ucA<12;ucA++)
{EEbuf[4+ucA]=0;}
readEE24(0,NOWVALADD,4);
EEbuf[0]=PulseAdd[1];
EEbuf[8]=EEbuf[0];
EEbuf[9]=EEbuf[1];
EEbuf[10]=EEbuf[2];
EEbuf[11]=EEbuf[3];
trxLong=16;
// trxPkg();
}
else if(recv[11]==0x10) /**当前电能**/
{ for(ucA=0;ucA<4;ucA++)
{
EEbuf[ucA]=DL[ucA];
}
EEbuf[0]=PulseAdd[1];
trxLong=4;
// trxPkg();
}
else if(recv[11]==0x20) /**当前电能**/
{ for(ucA=0;ucA<4;ucA++)
{
EEbuf[ucA]=0;
}
trxLong=4;
// trxPkg();
}
else if((recv[11]&0xf0)==0x90)
{
if(recv[11]<=0x97)
{
ucA=zerostar(recv[11]&0x0f);
readEE24(1,ZEROADD+5*ucA,5);
trxLong=5;
}
else if(recv[11]==0x9f)
{
for(ucB=0;ucB<4;ucB++)
{
ucA=zerostar(4+ucB);
readEE24(1,ZEROADD+5*ucA,5);
recv[33+5*ucB]=EEbuf[0];
recv[34+5*ucB]=EEbuf[1];
recv[35+5*ucB]=EEbuf[2];
recv[36+5*ucB]=EEbuf[3];
recv[37+5*ucB]=EEbuf[4];
ucA=zerostar(3-ucB);
zerotake(ucA,ucB);
}
recv[53]=0xaa;
trxLong=41;
}
else if(recv[11]==0x9d)
{
for(ucB=0;ucB<4;ucB++)
{
ucA=zerostar(3-ucB);
zerotake(ucA,ucB);
}
trxLong=20;
}
else if(recv[11]==0x9e)
{
for(ucB=0;ucB<4;ucB++)
{ ucA=zerostar(7-ucB);
zerotake(ucA,ucB);
}
trxLong=20;
}
else {recv[9]=0xc1;}
}
else if((recv[11]&0xf0)==0xa0)
{
ucA=recv[11]&0x0f;
if(ucA<4)
{
for(ucB=0;ucB<18;ucB++)
{
// EEbuf[ucB]=zhval[ucA*18+ucB];
}
trxLong=18;
}
else if(ucA<8)
{
zhtake(recv[11]);
trxLong=18;
}
else
{ZH_x=0xa0;ZH_n=18;
for(ucB=0;ucB<18;ucB++)
{
// EEbuf[ucB]=zhval[ucB];
}
trxLong=144;
// trxPkgL();
}
}
else if((recv[11]&0xf0)==0xb0)
{ if(recv[11]!=0xbf)
{
zhtake(recv[11]);
trxLong=18;
}
else
{ ZH_x=0xb0;ZH_n=18;
zhtake(0xb0);
trxLong=144;
// trxPkgL();
}
}
else {recv[1]=0xc1;}
}
else if((recv[12]==0x94)&&(recv[11]==0x10)) /**当前电能**/
{ readEE(BYVALADD,4);
//readEE(NOWVALADD,5);
trxLong=4;
// trxPkg();
}
else if((recv[12]==0x98)&&(recv[11]==0x10)) /**当前电能**/
{ readEE(BYVALADD+4,4);
//readEE(NOWVALADD,5);
trxLong=4;
// trxPkg();
}
else if((recv[12]==0x9a)&&(recv[11]==0x10)) /**当前电能**/
{ readEE(BYVALADD+8,4);
//readEE(NOWVALADD,5);
trxLong=4;
// trxPkg();
}
else if(recv[12]==0xc0)
{if(recv[11]==0x30)
{
/**电表常数(有功)**/
// readEE(LOW,CONSTANTADD,2);
EEbuf[0]=0;
EEbuf[1]=0x16; //
EEbuf[2]=0;
trxLong=3;
// trxPkg();
}
else if(recv[11]==0x32) /**表号**/
{ readEE(YHIDADD,6);
trxLong=6;
// trxPkg();
}
else if(recv[11]==0x29) /**状态**/
{ EEbuf[0]=Db_S_Jdq&0x0f;
if(SetTimeFlag) EEbuf[0]|=0X10; //10-23
else EEbuf[0]&=0xef;
if((PulTime[0]>PulT_ib)&&(PulTime[1]>PulT_ib))
EEbuf[0]&=0xdf;
else EEbuf[0]|=0X20;
if(TimeErr_bz) EEbuf[0]|=0x08;
else EEbuf[0]&=0xf7;
trxLong=1;
}
else if(recv[11]==0x10)
{ EEbuf[0]=0;
EEbuf[1]=HEX2BCD(Time.day);
EEbuf[2]=HEX2BCD(Time.month);
EEbuf[3]=HEX2BCD(Time.year);
trxLong=4;
// trxPkg();
}
else if(recv[11]==0x11)
{ EEbuf[0]=HEX2BCD(Time.second*2);
EEbuf[1]=HEX2BCD(Time.minute);
EEbuf[2]=HEX2BCD(Time.hour);
trxLong=3;
// trxPkg();
}
else {
recv[9]=0xc1;
// trxPkg();
}
}
else if((recv[12]==0xc1)&&(recv[11]==0x19)) /**初值**/
{ readEE(INIVALADD,4);
trxLong=4;
// trxPkg();
}
else if((recv[12]==0xc1)&&(recv[11]==0x17)) /**chao biao ri**/
{ readEE(AUTOREADDAYADD,1);
if(EEbuf[0]>=0x31) EEbuf[0]=0x01;
EEbuf[1]=EEbuf[0];
EEbuf[0]=0;
trxLong=2;
// trxPkg();
}
else if((recv[12]==0x8e)&&(recv[11]==0xa2)) /**chao biao ri**/
{
EEbuf[0]=0x06; //带控制和485(06)
EEbuf[1]=0x18;
EEbuf[2]=0x17;
EEbuf[3]=0x10;
EEbuf[4]=0x01;
EEbuf[5]=0x00;
trxLong=6;
// trxPkg();
}
else
{
recv[9]=0xc1;
// trxPkg();
}
if(trxLong==144)
trxPkgL();
else trxPkg();
}
break;
case 0x04: /** 写数据 **/
{
if((recv[12]==0xc1)&&(recv[11]==0x19))
{ if(KRES_bz==1)
{ SetDL();
EEbuf[0]=0;
writeEE(CleanAdd,1);
S_timeFlag=1;
recv[9]=0x84;
trxPkg();
}
else
{
readEE(MIMAADD0,4);
if((recv[13]==0)&&(EEbuf[1]==recv[14])&&(EEbuf[2]==recv[15])&&(EEbuf[3]==recv[16]))
{
if((DL[1]<0x10)&&(DL[2]==0)&&(DL[3]==0))
{readEE(CleanAdd,1);
EEbuf[0]++;
if(EEbuf[0]<=5)
{ writeEE(CleanAdd,1);
recv[17]=0;
recv[18]=0;
recv[19]=0;
recv[20]=0;
SetDL();
S_timeFlag=1;
recv[9]=0x84;
trxPkg();
}
else
{
recv[9]=0xc4;
trxPkg();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -