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

📄 ircomm.c

📁 一个电表的程序
💻 C
📖 第 1 页 / 共 3 页
字号:
	}
	//事件记录块操作,则对 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 + -