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

📄 czx167-145-v2.2.c

📁 代码实现了载波抄读电能表
💻 C
📖 第 1 页 / 共 5 页
字号:
void ZB_MOV_WR(uchar i,uchar j)
{
           HW_ZB=0;
           ZJ_SEND=0x55;                                         // 中继下发标志
           Send_Carrier_buf[4]=0x0A+j;     //长度为5个字节
		   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];
		   Send_Carrier_buf[10+j]=Carrier_buf_bak[13+i];  
           Send_Carrier_buf[11+j]=Carrier_buf_bak[14+i];
           Send_Carrier_buf[12+j]=Carrier_buf_bak[15+i];
		   Send_Carrier_buf[13+j]=Carrier_buf_bak[16+i];  
           Send_Carrier_buf[14+j]=Carrier_buf_bak[17+i];
           ZB_Glob_Len=15+j;
}

void   ZJ_addr_bak(uchar j)              //j=接收到的中继级数*3
{
       ZJ_Add_buf[0]=Carrier_buf_bak[7+j];                    // 备份上传地址
       ZJ_Add_buf[1]=Carrier_buf_bak[8+j];
       ZJ_Add_buf[2]=Carrier_buf_bak[9+j];
}


void  ZB_down_frame(uchar j)   //填写下行表地址;   
{

       Send_Carrier_buf[0]=Carrier_buf_bak[7+j];
       Send_Carrier_buf[1]=Carrier_buf_bak[8+j];
       Send_Carrier_buf[2]=Carrier_buf_bak[9+j];
}
void  ZB_ZJ1_frame(uchar j)   //1级中继中继表地址填写        
{
       Send_Carrier_buf[7]=Carrier_buf_bak[10+j];
       Send_Carrier_buf[8]=Carrier_buf_bak[11+j];
       Send_Carrier_buf[9]=Carrier_buf_bak[12+j];
}
void  ZB_ZJ2_frame(uchar j)   //2级中继中继表地址填写        
{

       ZB_ZJ1_frame(j);

       Send_Carrier_buf[10]=Carrier_buf_bak[13+j];
       Send_Carrier_buf[11]=Carrier_buf_bak[14+j];
       Send_Carrier_buf[12]=Carrier_buf_bak[15+j];

}
void  ZB_ZJ3_frame()        //3级中继中继表地址填写        
{
       ZB_ZJ2_frame(0);
        
       Send_Carrier_buf[13]=Carrier_buf_bak[16];
       Send_Carrier_buf[14]=Carrier_buf_bak[17];
       Send_Carrier_buf[15]=Carrier_buf_bak[18];
}
/**************************************************************************************
 *
 * FUNCTION:    ZB_Design_Prog
 *
 * DESCRIPTION: 载波规约数据处理
 *
 *
 * PARAMETERS:  addr_type:地址类型
 *
 * RETURNED:    none
 *
 *************************************************************************************/
void ZB_Design_Prog( )
{
   uchar    Data_Control_sign;                       // 控制码( "0x01" or "0x04"  or "0x51")
   uchar    Command_Sign_H;                          // 0x90
   uchar    Command_Sign_L;                          // 0x1F
   uchar    i;
   
   Data_Control_sign=Carrier_buf_bak[3];    //控制码
   Command_Sign_H=Carrier_buf_bak[6];       //功能码
   Command_Sign_L=Carrier_buf_bak[5];       //功能码
   if(Data_Control_sign==0x01)              // 无中继的读数据处理
   { 
       ZJ_addr_bak(0);
       ZB_485(Command_Sign_H,Command_Sign_L);       
   }
   else if(Data_Control_sign==0x41)   //有中继1
   {
       ZJ_addr_bak(3);                    // 备份中继上传地址
       if(Check_ZB_ZJ_ADD(7)==0)      //判断目标地址在16中否?
          ZB_485(Command_Sign_H,Command_Sign_L);      
       else
       {                                     
           ZB_down_frame(0);               //无中继下行数据组帧,填写下行表地址
           Send_Carrier_buf[3]=0x01;     //命令为读命令
           ZB_MOV_RE(0); 
           zb_send_c();
 	   }            
   }
   else if(Data_Control_sign==0x51)          //2级中继
   {
       ZJ_addr_bak(6);                    // 备份上传地址
       if(Check_ZB_ZJ_ADD(10)==0)            //目的地址在16个中
           ZB_485(Command_Sign_H,Command_Sign_L);       
	   else
	   {
            if(Check_ZB_ZJ_ADD(7)==0)             //2级地址在16个中
            {
               ZB_down_frame(3);                  //无中继下行数据组帧,填写下行表地址
               Send_Carrier_buf[3]=0x01;
               ZB_MOV_RE(0);
               zb_send_c();
           }
           else    //2级地址不在16个中
           {
               ZB_down_frame(0);                       //1级中继下行数据组帧,填写下行表地址;               
               Send_Carrier_buf[3]=0x41;
               ZB_ZJ1_frame(0);                     //1级中继下行数据组帧,填写中继表地址;
               ZB_MOV_RE(3);
               zb_send_c();
           }
       }
   }
   else if(Data_Control_sign==0x61)        //3级
   {
       ZJ_addr_bak(9);                    // 备份上传地址

       if(Check_ZB_ZJ_ADD(13)==0)
           ZB_485(Command_Sign_H,Command_Sign_L); 
       else
       {       	                
           if(Check_ZB_ZJ_ADD(10)==0)
           {
                ZB_down_frame(6);             //无级中继下行数据组帧,填写下行表地址;               
                Send_Carrier_buf[3]=0x01;
                ZB_MOV_RE(0);
                zb_send_c();
           }
           else
           {
                   if(Check_ZB_ZJ_ADD(7)==0)
                   {
                        ZB_down_frame(3);     //1级中继下行数据组帧,填写下行表地址;
                        Send_Carrier_buf[3]=0x41;
                        ZB_ZJ1_frame(3);    //1级中继下行数据组帧,填写中继表地址;
                        ZB_MOV_RE(3);
                        zb_send_c();
                    }
                    else
                    {
                        ZB_down_frame(0);           //2级中继下行数据组帧,填写下行表地址;
                        Send_Carrier_buf[3]=0x51;
                        ZB_ZJ2_frame(0);           //2级中继下行数据组帧,填写中继表地址;
                        ZB_MOV_RE(6);
                        zb_send_c();	
                    }
               }
       }
   }
   else if(Data_Control_sign==0x71)  //                四级中继
   {
       ZJ_addr_bak(12);                    // 备份上传地址
       if(Check_ZB_ZJ_ADD(16)==0)                                     // 目的表为本地表号
           ZB_485(Command_Sign_H,Command_Sign_L); 
       else                                                              // 目的表不是本地表号
       {
           if(Check_ZB_ZJ_ADD(13)==0)                                    // 第4级中继表是本地表号
           {
               ZB_down_frame(9);                     //无级中继下行数据组帧,填写下行表地址;
               Send_Carrier_buf[3]=0x01;
               ZB_MOV_RE(0);
               zb_send_c();
           }
           else
           {                                                             // 第4级中继表不是本地表号
               if(Check_ZB_ZJ_ADD(10)==0)                                // 第3级中继表是本地表号
               {
                   ZB_down_frame(6);                     //1级中继下行数据组帧,填写下行表地址;
                   Send_Carrier_buf[3]=0x41;
                   ZB_ZJ1_frame(6);                      //1级中继下行数据组帧,填写中继表表地址;
                   ZB_MOV_RE(3);
                   zb_send_c();
               }
               else
               {
                   if(Check_ZB_ZJ_ADD(7)==0)
                   {
                       ZB_down_frame(3);                     //2级中继下行数据组帧,填写下行表地址;
                       Send_Carrier_buf[3]=0x51;
                       ZB_ZJ2_frame(3);                      //2级中继下行数据组帧,填写中继表表地址;
                       ZB_MOV_RE(6);
                       zb_send_c();
                   }
                   else
                   {
                       ZB_down_frame(0);                     //3级中继下行数据组帧,填写下行表地址;
                       Send_Carrier_buf[3]=0x61;
                       ZB_ZJ3_frame();                      //3级中继下行数据组帧,填写中继表表地址;
                       ZB_MOV_RE(9);
                       zb_send_c();
                   }
               }
           }
       }
   }
   else if((Data_Control_sign==0x81)||(Data_Control_sign==0x84)||(Data_Control_sign==0xC4)||(Data_Control_sign==0xC1))          //由从站发出的应答帧
   {
       HW_ZB=0;

       if(ZJ_SEND==0x55)                      //判断是否本机有载波中继数据下发
       {
           ZJ_SEND=0x00;                                         // 中继下发标志

           Send_Carrier_buf[0]=ZJ_Add_buf[0];  //中继地址
           Send_Carrier_buf[1]=ZJ_Add_buf[1];
           Send_Carrier_buf[2]=ZJ_Add_buf[2];

           for(i=3; i<(Carrier_buf_bak[4]+5); i++)
           {
               Send_Carrier_buf[i]=Carrier_buf_bak[i];
           }
		   ZB_Glob_Len=Carrier_buf_bak[4]+5;
           zb_send_c();
       }
   }
   else if(Data_Control_sign==0x04)                        // 写数据处理
   {
       ZJ_addr_bak(0);                    // 备份中继上传地址
       write_meter(0);
   }
   else if(Data_Control_sign==0x44)   //有中继1
   {
       ZJ_addr_bak(3);                    // 备份中继上传地址
       if(Check_ZB_ZJ_ADD(7)==0)      //判断目标地址在16中否?
            write_meter(3);
       else
       {  

           ZB_down_frame(0);                     //无级中继下行数据组帧,填写下行表地址;
           Send_Carrier_buf[3]=0x04;     //命令为读命令
           ZB_MOV_WR(0,0);
           zb_send_c();
 	   }            
   }
   else if(Data_Control_sign==0x54)          //2级中继
   {
       ZJ_addr_bak(6);                    // 备份上传地址
       if(Check_ZB_ZJ_ADD(10)==0)            //目的地址在16个中
           write_meter(6);
       else
	   {
            if(Check_ZB_ZJ_ADD(7)==0)             //2级地址在16个中
            {
               ZB_down_frame(3);                     //无级中继下行数据组帧,填写下行表地址;
               Send_Carrier_buf[3]=0x04;
               ZB_MOV_WR(3,0);
               zb_send_c();
           }
           else    //2级地址不在16个中
           {
               ZB_down_frame(0);                     //1级中继下行数据组帧,填写下行表地址;
               Send_Carrier_buf[3]=0x44;
               ZB_ZJ1_frame(0);                      //1级中继下行数据组帧,填写中继表表地址;
               ZB_MOV_WR(3,3);
               zb_send_c();
           }
       }
   }
   else if(Data_Control_sign==0x64)        //3级
   {
      ZJ_addr_bak(9);                    // 备份上传地址
      if(Check_ZB_ZJ_ADD(13)==0)
            write_meter(9);
      else
      {       	                 
           if(Check_ZB_ZJ_ADD(10)==0)
           {
                ZB_down_frame(6);                     //无级中继下行数据组帧,填写下行表地址;
                Send_Carrier_buf[3]=0x04;
                ZB_MOV_WR(6,0);
                zb_send_c();
           }
           else
           {
                   if(Check_ZB_ZJ_ADD(7)==0)
                   {
                        ZB_down_frame(3);                     //1级中继下行数据组帧,填写下行表地址;
                        Send_Carrier_buf[3]=0x44;
                        ZB_ZJ1_frame(3);                      //1级中继下行数据组帧,填写中继表表地址;
                        ZB_MOV_WR(6,3);
                        zb_send_c();
                    }
                    else
                    {
                        ZB_down_frame(0);                     //2级中继下行数据组帧,填写下行表地址;
                        Send_Carrier_buf[3]=0x54;
                        ZB_ZJ2_frame(0);                      //2级中继下行数据组帧,填写中继表表地址;
                        ZB_MOV_WR(6,6);
                        zb_send_c();	
                    }
               }
       }
   }
   else if(Data_Control_sign==0x74)  //                四级中继
   {
       ZJ_addr_bak(12);                    // 备份上传地址
       if(Check_ZB_ZJ_ADD(16)==0)                                     // 目的表为本地表号
           write_meter(12);
       else                                                              // 目的表不是本地表号
       {
           if(Check_ZB_ZJ_ADD(13)==0)                                    // 第4级中继表是本地表号
           {
               ZB_down_frame(9);                     //无级中继下行数据组帧,填写下行表地址;
               Send_Carrier_buf[3]=0x04;
               ZB_MOV_WR(9,0);
               zb_send_c();
           }
           else
           {                                                             // 第4级中继表不是本地表号
               if(Check_ZB_ZJ_ADD(10)==0)                                // 第3级中继表是本地表号
               {
                   ZB_down_frame(6);                     //1级中继下行数据组帧,填写下行表地址;
                   Send_Carrier_buf[3]=0x44;
                   ZB_ZJ1_frame(6);                      //1级中继下行数据组帧,填写中继表表地址;
                   ZB_MOV_WR(9,3);
                   zb_send_c();
               }
               else
               {
                   if(Check_ZB_ZJ_ADD(7)==0)
                   {
                       ZB_down_frame(3);                     //2级中继下行数据组帧,填写下行表地址;
                       Send_Carrier_buf[3]=0x54;
                       ZB_ZJ2_frame(3);                      //2级中继下行数据组帧,填写中继表表地址;
                       ZB_MOV_WR(9,6);
                       zb_send_c();
                   }
                   else
                   {
				       ZB_down_frame(0);                     //3级中继下行数据组帧,填写下行表地址;
				       Send_Carrier_buf[3]=0x64;
					   ZB_ZJ3_frame();                       //3级中继下行数据组帧,填写中继表表地址;
                       ZB_MOV_WR(9,9);
                       zb_send_c();
                   }
               }

           }
       
       }
   }

}

/**************************************************************************************
 *
 * FUNCTION:    RS485_Design_Prog
 *
 * DESCRIPTION: RS485规约数据处理
 *
 *
 * PARAMETERS:  none
 *
 * RETURNED:    none
 *
 *************************************************************************************/
void RS485_Design_Prog()
{
   uchar    i;
   uchar    j;
                  
   if(HW_ZB=='H')       //红外读表数据
   {
       j=RS485_buf_bak[9]+12;

       for(i=0; i<j; i++)

⌨️ 快捷键说明

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