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

📄 czx167-145-v2.2.c

📁 代码实现了载波抄读电能表
💻 C
📖 第 1 页 / 共 5 页
字号:
   if(Data_Control_sign==0x01)                // 读数据处理
   {   
        if((Command_Sign_H==0xC0)&&(Command_Sign_L>=0x40)&&(Command_Sign_L<=0x4F))
        {
		     HW_ZB=0;
             if((Addcheck==0)||(Addcheck==0x55))
             {                 
                 k=Command_Sign_L&0x0F;
                 HW_Answer_MeterNO(k);
             }
        } 
        else if(Addcheck==0)
        {   
 	         j=Infrared_buf_bak[9]+12;
		     for(i=0; i<j; i++)
                Send_RS485_buf0[i]=Infrared_buf_bak[i];
             RS485_Txd_OK='O';
        }
        else HW_ZB=0;
   }
   else if(Data_Control_sign==0x04)                   // 写数据处理
   {
       HW_ZB=0;
       switch(Command_Sign_H)
       {
           case 0xC0:    //写表号
		               if((Command_Sign_L>=0x40)&&(Command_Sign_L<=0x4F))
                       {
						        CS ='X';
                                for(j=0; j<6; j++)
							    {
							         Write_buf[j]=Infrared_buf_bak[(j+16)]-0x33;
                                     CS +=Write_buf[j];
    							}
                                Write_buf[6] = CS;
                                if( Compare_HW_ADD()==0 )
                                    return;
                           	    
                          	    k=Command_Sign_L&0x0F;
                          	    Add_FM24=8*k + first_Son_addr;   
								xiaodou();
                         	    i=WR_ADDR(WR_2404,Add_FM24);
								Add_FM24=8*k + first_Son_addr_bak;
                                xiaodou();
                                j=WR_ADDR(WR_2404,Add_FM24);
								if((i=='O')||(j =='O'))
								{
   						           HW_Answer_Success();
								   for(i=0;i<7;i++)
								      Son_Add_buf[k][i]=Write_buf[i];
                                   HW_auto='H';
                                   start_j_f_meter();          //启动判拆表
								}								                          
                       }
					   else if(Command_Sign_L==0x32)
					   {
					        if(Addcheck==0x99)
                            {    
                                wp24=1;
						        write_add_terminal(16);
                            }
					   }                       
					   break;
           default:   
                       break;
       }
   }
   else if((Data_Control_sign==0x0A)&&(Addcheck==0x99))                   // 写设备地址
   {
        wp24=1;
        write_add_terminal(10);
   }
}
/**************************************************************************************
 *
 * FUNCTION:    Read_ymd_frame
 *
 * DESCRIPTION: 读年月日   载波规约数据转换成485数据
 *            载波规约中C0 12是在645规约中扩展的抄读时钟的标识符,而645规约中只有C0 10抄读
 *            年月日,C0  11抄读时分秒两条,故载波须分两次抄读,即先读年月日,再读时分秒
 * PARAMETERS:  none
 *
 * RETURNED:    none
 *
 *************************************************************************************/
void  Read_ymd_frame()           //读取年月日
{
    uchar  i,j;
    Send_RS485_buf0[0]=0x68;

    for(i=1; i<7; i++)
         Send_RS485_buf0[i]=Add_buf[(i-1)];      //取目的表号

    Send_RS485_buf0[7]=0x68;
    Send_RS485_buf0[8]=0x01; //功能码
    Send_RS485_buf0[9]=0x02; //长度
    Send_RS485_buf0[10]=0x43;
    Send_RS485_buf0[11]=0xF3;
    j=0;
    for(i=0; i<12; i++)
        j+=Send_RS485_buf0[i];
    Send_RS485_buf0[12]=j;
    Send_RS485_buf0[13]=0x16;
    RS485_Txd_OK='O';
}
/**************************************************************************************
 *
 * FUNCTION:    Read_hms_frame
 *
 * DESCRIPTION: 读时分秒   载波规约数据转换成485数据
 *            载波规约中C0 12是在645规约中扩展的抄读时钟的标识符,而645规约中只有C0 10抄读
 *            年月日,C0  11抄读时分秒两条,故载波须分两次抄读,即先读年月日,再读时分秒
 * PARAMETERS:  none
 *
 * RETURNED:    none
 *
 *************************************************************************************/
void  read_hms_frame()
{
     uchar  i,j;
     for(i=0; i<250; i++)             //0.6*250*200+0.8*200=30.16ms
     {
		   WDT_RST=0xa1;
	       for(j=0; j<250; j++);
     }

     Send_RS485_buf0[0]=0x68;

     for(i=1; i<7; i++)
         Send_RS485_buf0[i]=Add_buf[(i-1)];      //取目的表号
     Send_RS485_buf0[7]=0x68;
     Send_RS485_buf0[8]=0x01;
     Send_RS485_buf0[9]=0x02;
     Send_RS485_buf0[10]=0x44;
     Send_RS485_buf0[11]=0xF3;

     j=0;
     for(i=0; i<12; i++)
        j+=Send_RS485_buf0[i];

     Send_RS485_buf0[12]=j;
     Send_RS485_buf0[13]=0x16;
     RS485_Txd_OK='O';
}
/**************************************************************************************
 *
 * FUNCTION:    ZB_485
 *
 * DESCRIPTION: 载波规约数据转换成485数据
 *
 *
 * PARAMETERS:  none
 *
 * RETURNED:    none
 *
 *************************************************************************************/
void ZB_485(uchar Command_Sign_H,uchar Command_Sign_L)
{
       uchar  i,j,k,m,SN;
	   uchar    RS_CRC=0;
       if(Command_Sign_H==0x4E)   
       {
           if(Command_Sign_L==0x4F)
           {
		       for(i=0;i<3;i++)  
		          Send_Carrier_buf[0]=0x99;
               Send_Carrier_buf[3]=0x01;
               Send_Carrier_buf[4]=0x02;
               Send_Carrier_buf[5]=0x4F;
               Send_Carrier_buf[6]=0x4E;		        
			   ZB_Glob_Len=7;
			   zb_send_c();        //转为载波广播启动自动寻表
               start_j_f_meter();  //启动自动找表

	           Send_Carrier_buf[0]=ZJ_Add_buf[0];
               Send_Carrier_buf[1]=ZJ_Add_buf[1];
               Send_Carrier_buf[2]=ZJ_Add_buf[2];
		       Send_Carrier_buf[3]=0x81;
	           Send_Carrier_buf[4]=0x05;
		       Send_Carrier_buf[5]=0x4F;
	           Send_Carrier_buf[6]=0x4E;
               Send_Carrier_buf[7]=Add_buf[0];                           
               Send_Carrier_buf[8]=Add_buf[1];
               Send_Carrier_buf[9]=Add_buf[2];
			   ZB_Glob_Len=10;
			   zb_send_c();			   
		  }
		  HW_ZB=0;
       }

       if(Command_Sign_H==0xC0)
       {
           if(Command_Sign_L==0x12)   //读时间
           {
		       ZB_Read_Time='Y';     //置读时间标志
               Read_ymd_frame();      //先读年月日
               return;
           }
           if (Command_Sign_L==0x32)
		   {
		       SN=Carrier_buf_bak[10];
	           Send_Carrier_buf[0]=ZJ_Add_buf[0];
               Send_Carrier_buf[1]=ZJ_Add_buf[1];
               Send_Carrier_buf[2]=ZJ_Add_buf[2];
		       Send_Carrier_buf[3]=0x81;
		       Send_Carrier_buf[5]=0x32;
	           Send_Carrier_buf[6]=0xC0;
               Send_Carrier_buf[7]=Add_buf[0];                           
               Send_Carrier_buf[8]=Add_buf[1];
               Send_Carrier_buf[9]=Add_buf[2];
               k=0;
               j=0;
               m=0;
               if(SN<=5)
               {
                   for(i=0;i<16;i++)
                   {
                       if((Son_Add_buf[i][0]!=0)||(Son_Add_buf[i][1]!=0)||(Son_Add_buf[i][2]!=0))
                           k++;
                       if(k>3*SN) 
                       {
                           for(j=0;j<6;j++)
                               Send_Carrier_buf[11+m*6+j]=Son_Add_buf[i][j];
                           m++;
                       }
                       if(m==3)
                           break;
                   }
               }
               if(m<3)
                  Send_Carrier_buf[10]=0xFF;
               else  
                  Send_Carrier_buf[10]=SN;
	           Send_Carrier_buf[4]=6+m*6;
			   ZB_Glob_Len=11+m*6;
			   zb_send_c();
               HW_ZB=0;
		   }
       }
       ZB_Read_Time=0;
       Send_RS485_buf0[0]=0x68;                     //填充数据到485发送缓冲区
       for(i=1; i<7; i++)
            Send_RS485_buf0[i]=Add_buf[(i-1)];      //取目的表号

       Send_RS485_buf0[7]=0x68;
       Send_RS485_buf0[8]=0x01;
       Send_RS485_buf0[9]=0x02;
       Send_RS485_buf0[10]=Command_Sign_L+0x33; //
       Send_RS485_buf0[11]=Command_Sign_H+0x33; //

       for(i=0; i<12; i++)  //计算校验和
           RS_CRC+=Send_RS485_buf0[i];

       Send_RS485_buf0[12]=RS_CRC;
       Send_RS485_buf0[13]=0x16;
       RS485_Txd_OK='O';              //置485可以发送标志
}
/**************************************************************************************
 *
 * FUNCTION:    write_meter
 *
 * DESCRIPTION: 对表进行写操作(校时、通断继电器(需根据用户要求修改)、修改密码、
 *              欠费显示/清除(需根据用户要求添加或修改)、用户无此要求时应将通断电
 *              和欠费显示/清除功能屏蔽
 * PARAMETERS:  中继级数K*3=k
 *
 * RETURNED:    none
 *
 *************************************************************************************/
void   write_meter (uchar k)
{
       uchar   i,RS485_CRC;
       if(Carrier_buf_bak[6]==0xC0)
       {
           if(Carrier_buf_bak[5]==0x12)          ///校时,转为广播校时
           {
               Send_RS485_buf0[0]=0x68;

               for(i=1; i<7; i++)
                   Send_RS485_buf0[i]=0x99;
               Send_RS485_buf0[7]=0x68;
               Send_RS485_buf0[8]=0x08;
               Send_RS485_buf0[9]=0x06;
               Send_RS485_buf0[10]=Carrier_buf_bak[10+k]+0x33;
               Send_RS485_buf0[11]=Carrier_buf_bak[11+k]+0x33;
               Send_RS485_buf0[12]=Carrier_buf_bak[12+k]+0x33;
               Send_RS485_buf0[13]=Carrier_buf_bak[14+k]+0x33;
               Send_RS485_buf0[14]=Carrier_buf_bak[15+k]+0x33;
               Send_RS485_buf0[15]=Carrier_buf_bak[16+k]+0x33;
               RS485_CRC=0;
               for(i=0; i<16; i++)
                   RS485_CRC+=Send_RS485_buf0[i];

               Send_RS485_buf0[16]=RS485_CRC;
               Send_RS485_buf0[17]=0x16;
               HW_ZB=0;
               RS485_Txd_OK='O';
           }
	   }
       if(Carrier_buf_bak[6]==0xC0)
       {
           if(Carrier_buf_bak[5]==0x35)          //通断继电器
           {
		        if(Carrier_buf_bak[14+k]==0x50)      //断继电器
				{
				    Send_RS485_buf0[16]=0x88;////0x55+0x33; 
                    Send_RS485_buf0[17]=0x66;//0x33+0x33;
				}
				if(Carrier_buf_bak[14+k]==0x5F)      //合继电器
				{
				    Send_RS485_buf0[16]=0x99;//0x66+0x33; 
                    Send_RS485_buf0[17]=0xCC;//0x99+0x33; 
				}
       	    	Send_RS485_buf0[0]=0x68;                     //填充数据到485发送缓冲区
                for(i=1; i<7; i++)
                     Send_RS485_buf0[i]=Add_buf[(i-1)];      //取目的表号
			    Send_RS485_buf0[7]=0x68;
                Send_RS485_buf0[8]=0x04;
                Send_RS485_buf0[9]=0x08;
                Send_RS485_buf0[10]=0x5B;//0x28+0x33; 
                Send_RS485_buf0[11]=0xF3;//0xC0+0x33; //
                for(i=12; i<16; i++)
                     Send_RS485_buf0[i]=Carrier_buf_bak[i-2]+0x33;      //填写密码
                RS485_CRC=0;
                for(i=0;i<18;i++)
			        RS485_CRC+=Send_RS485_buf0[i];
                Send_RS485_buf0[18]=RS485_CRC;
                Send_RS485_buf0[19]=0x16;
                RS485_Txd_OK='O';
		   }
	   }
}

/**************************************************************************************
 *
 * FUNCTION:    ZB_MOV_RE
 *
 * DESCRIPTION:  载波读中继下发时,数据移动程序
 *               j=(下发的中继级数-1)*3
 *              
 * PARAMETERS:  none
 *
 * RETURNED:    none
 *
 *************************************************************************************/
void ZB_MOV_RE(uchar j)
{      
       HW_ZB=0;
       ZJ_SEND=0x55;           // 中继下发标志         

       Send_Carrier_buf[4]=0x05+j;
       Send_Carrier_buf[5]=Carrier_buf_bak[5];
       Send_Carrier_buf[6]=Carrier_buf_bak[6];

       Send_Carrier_buf[7+j]=Carrier_buf_bak[0];
       Send_Carrier_buf[8+j]=Carrier_buf_bak[1];
       Send_Carrier_buf[9+j]=Carrier_buf_bak[2];

	   ZB_Glob_Len=10+j;
}


/**************************************************************************************
 *
 * FUNCTION:    ZB_MOV_WR
 *
 * DESCRIPTION:  载波写中继下发时,数据移动程序
 *               i=(接收到的中继级数-1)*3
 *               j=(下发的中继级数-1)*3
 * PARAMETERS:  none
 *
 * RETURNED:    none
 *
 *************************************************************************************/

⌨️ 快捷键说明

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