📄 ircomm.c
字号:
}
//事件记录块操作,则对 number 进行修正
if( (DI1DI0_Comm == 0xb22f)
|| (DI1DI0_Comm == 0xb24f)
|| (DI1DI0_Comm == 0xea3f)
|| (DI1DI0_Comm == 0xea4f)
|| (DI1DI0_Comm == 0xe21f)
|| (DI1DI0_Comm == 0xe22f)
)
{
switch( DI1DI0_Comm)
{
case 0xb22f:
/*
if(F_BlckRead_Eeprm(Prgrm_Tm_Pter,&Pointer,1))
{
RMtWd_Dtr[0] &= 0xfd; //存储芯片无错
}
else
{
RMtWd_Dtr[0] |= 0x02; //存储芯片出错
}
break;
*/
case 0xb24f:
if(F_BlckRead_Eeprm(Prgrm_Tm_Pter,&Pointer,1))
{
RMtWd_Dtr[0] &= 0xfd; //存储芯片无错
}
else
{
RMtWd_Dtr[0] |= 0x02; //存储芯片出错
}
break;
case 0xe21f:
if(F_BlckRead_Eeprm(CrntRvrs_Pter,&Pointer,1))
{
RMtWd_Dtr[0] &= 0xfd; //存储芯片无错
}
else
{
RMtWd_Dtr[0] |= 0x02; //存储芯片出错
}
break;
case 0xe22f:
if(F_BlckRead_Eeprm(PDRcd_Pter,&Pointer,1))
{
RMtWd_Dtr[0] &= 0xfd; //存储芯片无错
}
else
{
RMtWd_Dtr[0] |= 0x02; //存储芯片出错
}
break;
case 0xea3f:
case 0xea4f:
if(F_BlckRead_Eeprm(ClrPw_Tm_Pter,&Pointer,1))
{
RMtWd_Dtr[0] &= 0xfd; //存储芯片无错
}
else
{
RMtWd_Dtr[0] |= 0x02; //存储芯片出错
}
break;
default:
break;
}//switch end
CoutSign_Len = Pointer; //对 number 进行修正
}//if end
if((DI1DI0_Comm <= 0xb224) && (DI1DI0_Comm >= 0xb221))
{
if(F_BlckRead_Eeprm(Prgrm_Tm_Pter,&Pointer,1))//取出停电事件偏移量
{
RMtWd_Dtr[0] &= 0xfd; //存储芯片无错
}
else
{
RMtWd_Dtr[0] |= 0x02; //存储芯片出错
}
if((DI1DI0_Comm + Pointer) > 0xb224)
{
DI1DI0_Comm = DI1DI0_Comm + Pointer - 0x04;
}
else
{
DI1DI0_Comm = DI1DI0_Comm + Pointer;
}
}
if((DI1DI0_Comm <= 0xb244) && (DI1DI0_Comm >= 0xb241) ) //对编程事件标识进行修正
{
if(F_BlckRead_Eeprm(Prgrm_Tm_Pter,&Pointer,1))//取出停电事件偏移量
{
RMtWd_Dtr[0] &= 0xfd; //存储芯片无错
}
else
{
RMtWd_Dtr[0] |= 0x02; //存储芯片出错
}
if((DI1DI0_Comm + Pointer) > 0xb244)
{
DI1DI0_Comm = DI1DI0_Comm + Pointer - 0x04;
}
else
{
DI1DI0_Comm = DI1DI0_Comm + Pointer;
}
}
if((DI1DI0_Comm <= 0xea35) && (DI1DI0_Comm >= 0xea31)) //对清零事件标识进行修正
{
if(F_BlckRead_Eeprm(ClrPw_Tm_Pter,&Pointer,1))//取出清零事件偏移量
{
RMtWd_Dtr[0] &= 0xfd; //存储芯片无错
}
else
{
RMtWd_Dtr[0] |= 0x02; //存储芯片出错
}
if((DI1DI0_Comm + Pointer) > 0xea35)
{
DI1DI0_Comm = DI1DI0_Comm + Pointer - 0x05;
}
else
{
DI1DI0_Comm = DI1DI0_Comm + Pointer;
}
}
if((DI1DI0_Comm <= 0xea44) && (DI1DI0_Comm >= 0xea40)) //对清零事件标识进行修正
{
if(F_BlckRead_Eeprm(ClrPw_Tm_Pter,&Pointer,1))//取出清零事件偏移量
{
RMtWd_Dtr[0] &= 0xfd; //存储芯片无错
}
else
{
RMtWd_Dtr[0] |= 0x02; //存储芯片出错
}
if((DI1DI0_Comm + Pointer) > 0xea44)
{
DI1DI0_Comm = DI1DI0_Comm + Pointer - 0x05;
}
else
{
DI1DI0_Comm = DI1DI0_Comm + Pointer;
}
}
if((F_GetData_Sys(DI1DI0_Comm,0,&length)!=0) //**命令正常应答处理子程序
&& (DI1DI0_Comm!=0xe113))//电量底数不能读
{
RxTxState_Comm = AtTxState_Comm; //置待发送状态
Txd_Fe_Cnt = 1;
TempCs_Comm = SioHead_Sub_Comm(); //向通讯缓冲区内写入DLT/645 协议头,返回协议头的校验和
Put_To_SIOBuffer(0x81); //写入从站正常应答控制码
TempCs_Comm += 0x81;
SignData_Len = F_GetLength_Sys(DI1DI0_Comm);//2004.7.26添加,取标识数据长度,块操作准备
temp3 = SignData_Len+2; //F_GetLength_Sys(DI1DI0_Comm) + 2; //数据域长度
Put_To_SIOBuffer((unsigned char)temp3); //写入数据域长度
TempCs_Comm += (unsigned char)temp3;
Put_To_SIOBuffer((temp1+0x33)); //写入数据标识DI0
TempCs_Comm += (temp1+0x33);
Put_To_SIOBuffer((temp2+0x33)); //写入数据标识DI1
TempCs_Comm += (temp2+0x33);
NeedSign_Comm=1; //置续发标志
}
else//**异常应答处理子程序
{
ErrByte_Comm.BYTE |= 0x02; //数据标识错,置错误信息字
Abn_Answer();
}
}
//将需要发送的数据送入通讯缓冲区
void Put_To_SIOBuffer(unsigned char Data)
{
*BufferTail_Comm=Data;
BufferTail_Comm++;
BufferTail_Comm = Bufferl_Tail_OP(BufferTail_Comm);//绕尾处理
}
//向通讯缓冲区内写入DLT/645 协议头,返回协议头的校验和
unsigned char SioHead_Sub_Comm(void)
{
unsigned char temp[6],i;
for(i=0;i<6;i++) //get the system address
temp[i] = RMtNo_Dtr[i];
TempCs_Comm=0;
Put_To_SIOBuffer(0x68);
TempCs_Comm += 0x68;
for (i=0;i<6;i++) //写入用户号
{
Put_To_SIOBuffer(temp[i]);
TempCs_Comm += temp[i];
}
Put_To_SIOBuffer(0x68);
TempCs_Comm += 0x68;
return TempCs_Comm;
}
//续发态,向缓冲区继续塞数处理
void DataHold_Comm_DLT645(void) //
{
unsigned char *temp4;
unsigned int Length;
unsigned int taddr;
temp4 = F_GetData_Sys(DI1DI0_Comm,CoutSign_Len++,&Length); //取标识对应数据
// if(DI1DI0_Comm == 0xc010)
// {
// *temp4=GetDayofWeek( temp4+3,temp4+2,temp4+1); //计算周次
// }
taddr = (unsigned int)temp4;
if (temp4 == 0)
{
CoutSign_Len = 0;
temp4 = F_GetData_Sys(DI1DI0_Comm,CoutSign_Len++,&Length); //取标识对应数据
}
if(SignData_Len >= Length) //2005.1.6 何作修改
{
SignData_Len = SignData_Len - Length;
}
else
{
Length = SignData_Len;
SignData_Len = 0;
}
do //写入数据项
{
Put_To_SIOBuffer((*temp4+0x33));
TempCs_Comm += (*temp4+0x33);
temp4++;
Length--;
}while (Length>0);
if (SignData_Len == 0) //以长度减完为结束
{
Put_To_SIOBuffer(TempCs_Comm); //写入校验和CS
Put_To_SIOBuffer(0x16); //写入结束符0x16
NeedSign_Comm=0; //清续发标志
DI1DI0_Comm = 0;
CoutSign_Len = 0;
End_Flg = 0x38; //发送完 触发end 显示
return;
}
}/*2004.7.26添加块操作处理,*/
//异常应答处理子程序
void Abn_Answer(void)
{
RxTxState_Comm = AtTxState_Comm; //置待发送状态
Txd_Fe_Cnt = 1;
TempCs_Comm = SioHead_Sub_Comm(); //向通讯缓冲区内写入DLT/645 协议头,返回协议头的校验和
Put_To_SIOBuffer(0xc0|CommandByte_Comm); //写入从站异常应答控制码
TempCs_Comm += (0xc0 | CommandByte_Comm);
Put_To_SIOBuffer(0x01); //写入数据域长度
TempCs_Comm+=0x01;
Put_To_SIOBuffer(ErrByte_Comm.BYTE+0x33); //写入数据域数据,即错误信息字
TempCs_Comm += (ErrByte_Comm.BYTE+0x33);
Put_To_SIOBuffer(TempCs_Comm); //写入校验和CS
Put_To_SIOBuffer(0x16); //写入结束符0x16
Error_Flg = 0x38;
}
/**********************************************************
二、主站向从站请求设置数据(或编程)处理
***********************************************************/
void WriteOrder_Comm(void)
{
unsigned char temp1,temp2,temp3[4],i;
unsigned char *p;
Hello_Flg = 0x38; //通信协议解析成功;触发 Hello 显示
temp1 = *CommandDataPointer_Comm - 0x33; //将数据域数据进行减0x33操作
CommandDataPointer_Comm++;
CommandDataPointer_Comm = Bufferl_Tail_OP(CommandDataPointer_Comm);
temp2 = *CommandDataPointer_Comm - 0x33; //将数据域数据进行减0x33操作
DI1DI0_Comm = ((unsigned int)temp2*256) + ((unsigned int)temp1); //**得到标识
if(DI1DI0_Comm == 0xc030) //只读的电表常数不能由用户写
{
ErrByte_Comm.BYTE=0x02;
Abn_Answer();
return;
}
for(i=0;i<(CommandDataLength_Comm-2);i++) //取出数据域数据,为了比较密码,判断BCD码方便
{
CommandDataPointer_Comm++;
CommandDataPointer_Comm = Bufferl_Tail_OP(CommandDataPointer_Comm);
Temp_WrtDt_Comm[i] = *CommandDataPointer_Comm-0x33;
}
if(DI1DI0_Comm == 0xc119)
{
if(Compare_sub_code() == 1) //密码错
{
ErrByte_Comm.BYTE |= 0x04;
Abn_Answer(); //异常应答处理子程序
return;
}
if((RPPwrTtl_Dtr[3] == 0x00) && (RPPwrTtl_Dtr[2] == 0x00) && (RPPwrTtl_Dtr[1] < 0x10) )
{
if((Temp_WrtDt_Comm[4]!=0) || (Temp_WrtDt_Comm[5]!=0) || (Temp_WrtDt_Comm[6]!=0) || (Temp_WrtDt_Comm[7]!=0))//有功电能起始读数只能写0
{
ErrByte_Comm.BYTE |= 0x01; //非法数据
Abn_Answer(); //异常应答处理子程序
return;
}
else
{
F_BlckRead_Eeprm(ClrPw_Cnt,Databuf,0x01); //读取清零允许次数
if(Databuf[0] < 0x05)
{
ClrPw_Accdnt[0] = 0xe8; //清零标志置位
Databuf[0]++;
F_BlckWrt_Eeprm(ClrPw_Cnt,Databuf,0x01); //读取清零允许次数
Nor_Write_Answer();
return;
}
}
}
}
if( (DI1DI0_Comm == 0xc010) //2005.1.6 何作修改
|| (DI1DI0_Comm == 0xc011) //时间修改
|| (DI1DI0_Comm == 0xc07f) //电表常数
|| (DI1DI0_Comm == 0xc119) //有功电能起始读数
// || (DI1DI0_Comm == 0xc032) //表号
|| (DI1DI0_Comm == 0xc033) //用户号
|| (DI1DI0_Comm == 0xc034) //设备码
|| (DI1DI0_Comm == 0xc113) //轮显时间
|| (DI1DI0_Comm == 0xc114) //停显时间
|| (DI1DI0_Comm == 0xc117)) //自动抄表日
{
if (!Progrm_Disp) //**编程开关打在编程禁止
{
Hello_Flg = 0x00;
return;
}
}
if(Compare_sub_code() == 1) //密码错
{
ErrByte_Comm.BYTE |= 0x04;
Abn_Answer(); //异常应答处理子程序
return;
}
if(Judge_BCD() == 1) //非法数据
{
ErrByte_Comm.BYTE |= 0x01;
Abn_Answer(); //异常应答处理子程序
return;
}
switch (DI1DI0_Comm)
{
case 0xC010: //11、日期及周次;
if((Temp_WrtDt_Comm[5]>0x31) || (Temp_WrtDt_Comm[6]>0x12))
{
ErrByte_Comm.BYTE |= 0x01; //非法数据,置错误信息字
Abn_Answer(); //异常应答处理子程序
return;
}
// Temp_WrtDt_Comm[4] = GetDayofWeek(&Temp_WrtDt_Comm[7],&Temp_WrtDt_Comm[6],
// &Temp_WrtDt_Comm[5]); //计算周次
for (i=0;i<4;i++) //写数据,RAM
{
E2Buffer[3+i]= Temp_WrtDt_Comm[4+i]; //写日期时已计算出周
}
SetDate_Accdnt = 1;
Nor_Write_Answer(); //正常应答处理子程序
break;
case 0xC011: //12、时间;
if((Temp_WrtDt_Comm[4]>0x60) || (Temp_WrtDt_Comm[5]>0x60)||(Temp_WrtDt_Comm[6]>0x23))
{
ErrByte_Comm.BYTE |= 0x01; //非法数据,置错误信息字
Abn_Answer(); //异常应答处理子程序
return;
}
for (i=0;i<3;i++) //写数据,RAM
{
E2Buffer[i] = Temp_WrtDt_Comm[4+i];
}
SetTm_Accdnt = 1;
Nor_Write_Answer(); //正常应答处理子程序
break;
case 0xC032: //1、表号;
for (i=0;i<6;i++) //写数据,RAM
{
RMtNo_Dtr[i] = Temp_WrtDt_Comm[4+i];
}
if(F_BlckWrt_Eeprm(EMtNo_Dtr,&Temp_WrtDt_Comm[4],6))
{
RMtWd_Dtr[0] &= 0xfd; //存储芯片无错
}
else
{
RMtWd_Dtr[0] |= 0x02; //存储芯片出错
}
Nor_Write_Answer(); //正常应答处理子程序
break;
case 0xC033: //2、用户号(或局编号);
for (i=0;i<6;i++)
{
RUsrNo_Dtr[i] = Temp_WrtDt_Comm[4+i];
}
if(F_BlckWrt_Eeprm(EUsrNo_Dtr,&Temp_WrtDt_Comm[4],6))
{
RMtWd_Dtr[0] &= 0xfd; //存储芯片无错
}
else
{
RMtWd_Dtr[0] |= 0x02; //存储芯片出错
}
Nor_Write_Answer(); //正常应答处理子程序
break;
case 0xC034: //3、设备地址;
for (i=0;i<6;i++)
{
RDvcNo_Dtr[i] = Temp_WrtDt_Comm[4+i];
}
if(F_BlckWrt_Eeprm(EDvcNo_Dtr,&Temp_WrtDt_Comm[4],6))
{
RMtWd_Dtr[0] &= 0xfd; //存储芯片无错
}
else
{
RMtWd_Dtr[0] |= 0x02; //存储芯片出错
}
Nor_Write_Answer(); //正常应答处理子程序
break;
case 0xC07F: //10、电表脉冲常数;
for (i=0;i<3;i++)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -