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

📄 rscomm.c

📁 本代码为电子式单相多费率电能表的源程序
💻 C
📖 第 1 页 / 共 4 页
字号:
    case 0xD753:
    case 0xD754://上月总有功(总、峰、平、谷)指数 
                {
                  addr1 = 0x01;
                  addr2 = LastMonthSN(0+LLastEryFlag); //上月
                  addr2 <<= 4;
                  if(RS_CmdL==0x52)  addr2 += 0x04;
                  if(RS_CmdL==0x53)  addr2 += 0x08;
                  if(RS_CmdL==0x54)  addr2 += 0x0C;
                  Read24C64(&ComBuf[12],addr1,addr2,4);
                  
                  RS_Len =2+4;
                  break;
                }
    case 0xD770:
    case 0xD772:
    case 0xD773:
    case 0xD774://上上月总有功(总、峰、平、谷)指数 
                {
                  addr1 = 0x01;
                  addr2 = LastMonthSN(1+LLastEryFlag); //上上月
                  addr2 <<= 4;
                  if(RS_CmdL==0x72)  addr2 += 0x04;
                  if(RS_CmdL==0x73)  addr2 += 0x08;
                  if(RS_CmdL==0x74)  addr2 += 0x0C;
                  Read24C64(&ComBuf[12],addr1,addr2,4);
                  
                  RS_Len =2+4;
                  break;
                } 
    //历史电量
    case 0xD75F://上1月总有功指数数据块                
    case 0xD77F://上2月总有功指数数据块
    case 0xD79F://上3月总有功指数数据块
    case 0xD7DF://上4月总有功指数数据块             
    case 0xD82F://上5月总有功指数数据块
    case 0xD86F://上6月总有功指数数据块
    case 0xD8AF://上7月总有功指数数据块
    case 0xD8EF://上8月总有功指数数据块  
    case 0xD93F://上9月总有功指数数据块
    case 0xD97F://上10月总有功指数数据块
    case 0xD9BF://上11月总有功指数数据块    
    /////////////////////////////////////////          
    case 0x941F://上1月正向有功指数数据块
    case 0x981F://上2月正向有功指数数据块
    case 0xD7AF://上3月正向有功指数数据块
    case 0xD7EF://上4月正向有功指数数据块
    case 0xD83F://上5月正向有功指数数据块    
    case 0xD87F://上6月正向有功指数数据块    
    case 0xD8BF://上7月正向有功指数数据块
    case 0xD90F://上8月正向有功指数数据块    
    case 0xD94F://上9月正向有功指数数据块
    case 0xD98F://上10月正向有功指数数据块    
    case 0xD9CF://上11月正向有功指数数据块
    ///////////////////////////////////////// 
    case 0x942F://上1月反向有功指数数据块 
    case 0x982F://上2月反向有功指数数据块
    case 0xD7BF://上3月反向有功指数数据块
    case 0xD80F://上4月反向有功指数数据块
    case 0xD84F://上5月反向有功指数数据块
    case 0xD88F://上6月反向有功指数数据块
    case 0xD8CF://上7月反向有功指数数据块
    case 0xD91F://上8月反向有功指数数据块
    case 0xD95F://上9月反向有功指数数据块
    case 0xD99F://上10月反向有功指数数据块
    case 0xD9DF://上11月反向有功指数数据块               
                { ////////////////////////////////////////////////////////
                  if     (RSCommand==0xD75F)  { addr1 = 0x01; j = 0x00; }
                  else if(RSCommand==0xD77F)  { addr1 = 0x01; j = 0x01; }
                  else if(RSCommand==0xD79F)  { addr1 = 0x01; j = 0x02; }
                  else if(RSCommand==0xD7DF)  { addr1 = 0x01; j = 0x03; }
                  else if(RSCommand==0xD82F)  { addr1 = 0x01; j = 0x04; }
                  else if(RSCommand==0xD86F)  { addr1 = 0x01; j = 0x05; }
                  else if(RSCommand==0xD8AF)  { addr1 = 0x01; j = 0x06; }
                  else if(RSCommand==0xD8EF)  { addr1 = 0x01; j = 0x07; }
                  else if(RSCommand==0xD93F)  { addr1 = 0x01; j = 0x08; }
                  else if(RSCommand==0xD97F)  { addr1 = 0x01; j = 0x09; }
                  else if(RSCommand==0xD9BF)  { addr1 = 0x01; j = 0x0A; }
                  ////////////////////////////////////////////////////////
                  else if(RSCommand==0x941F)  { addr1 = 0x02; j = 0x00; }
                  else if(RSCommand==0x981F)  { addr1 = 0x02; j = 0x01; }
                  else if(RSCommand==0xD7AF)  { addr1 = 0x02; j = 0x02; }
                  else if(RSCommand==0xD7EF)  { addr1 = 0x02; j = 0x03; }
                  else if(RSCommand==0xD83F)  { addr1 = 0x02; j = 0x04; }
                  else if(RSCommand==0xD87F)  { addr1 = 0x02; j = 0x05; }              
                  else if(RSCommand==0xD8BF)  { addr1 = 0x02; j = 0x06; }
                  else if(RSCommand==0xD90F)  { addr1 = 0x02; j = 0x07; }
                  else if(RSCommand==0xD94F)  { addr1 = 0x02; j = 0x08; }
                  else if(RSCommand==0xD98F)  { addr1 = 0x02; j = 0x09; }
                  else if(RSCommand==0xD9CF)  { addr1 = 0x02; j = 0x0A; }
                  ////////////////////////////////////////////////////////
                  else if(RSCommand==0x942F)  { addr1 = 0x03; j = 0x00; }
                  else if(RSCommand==0x982F)  { addr1 = 0x03; j = 0x01; }
                  else if(RSCommand==0xD7BF)  { addr1 = 0x03; j = 0x02; }
                  else if(RSCommand==0xD80F)  { addr1 = 0x03; j = 0x03; }
                  else if(RSCommand==0xD84F)  { addr1 = 0x03; j = 0x04; }
                  else if(RSCommand==0xD88F)  { addr1 = 0x03; j = 0x05; }              
                  else if(RSCommand==0xD8CF)  { addr1 = 0x03; j = 0x06; }
                  else if(RSCommand==0xD91F)  { addr1 = 0x03; j = 0x07; }
                  else if(RSCommand==0xD95F)  { addr1 = 0x03; j = 0x08; }
                  else if(RSCommand==0xD99F)  { addr1 = 0x03; j = 0x09; }
                  else                        { addr1 = 0x03; j = 0x0A; }
                  ////////////////////////////////////////////////////////    	
                  addr2 = LastMonthSN(j+LLastEryFlag);
                  addr2 <<= 4; //上j+1月(总/正/反)总有功电量数据块首地址
                  Read24C64(&ComBuf[12],addr1,addr2,16); 
                  //RS_Len =2+16;       
                  break;           
                }
    case 0xD76F://上1月反向数据块 
    case 0xD78F://上2月反向数据块
    case 0xD7CF://上3月反向数据块
    case 0xD81F://上4月反向数据块
    case 0xD85F://上5月反向数据块
    case 0xD89F://上6月反向数据块
    case 0xD8DF://上7月反向数据块
    case 0xD92F://上8月反向数据块
    case 0xD96F://上9月反向数据块
    case 0xD9AF://上10月反向数据块
    case 0xD9EF://上11月反向数据块               
                { ////////////////////////////////////////////////////////
                  if     (RSCommand==0xD76F)  { j = 0x00; }
                  else if(RSCommand==0xD78F)  { j = 0x01; }
                  else if(RSCommand==0xD7CF)  { j = 0x02; }
                  else if(RSCommand==0xD81F)  { j = 0x03; }
                  else if(RSCommand==0xD85F)  { j = 0x04; }
                  else if(RSCommand==0xD89F)  { j = 0x05; }              
                  else if(RSCommand==0xD8DF)  { j = 0x06; }
                  else if(RSCommand==0xD92F)  { j = 0x07; }
                  else if(RSCommand==0xD96F)  { j = 0x08; }
                  else if(RSCommand==0xD9AF)  { j = 0x09; }
                  else                        { j = 0x0A; }
                  ////////////////////////////////////////////////////////   
                  addr1 = 0x04;
                  addr2 = LastMonthSN(j+LLastEryFlag);
                  addr2 <<= 4;
                  Read24C64(&ComBuf[12],addr1,addr2,11); //读取反向数据块
                  RS_Len =2+11;       
                  break;  
                }
        default://数据项标识错
                {
                  ErrInfFlag = 0xAA; //通讯错误信息标志
                  ErrInfStat = 0x02;
                  RS_Len = 0x01;
                }
  }
}

//**********************************************************
//名称:void WriteMeter(void)
//功能:
//说明:
//**********************************************************
void WriteMeter(void)
{
  uchar i,j;
  uint  RSCommand;
  uchar addr1,addr2,TFlag,Temp[4];
  
  Watchdog_feed(); //喂狗
  Flag |= 0x0A;
  //TxdFlag = 1; //回应
  //TimeProg= 1; //编程事件
  RS_Len = 0x00;	
  NoProgFlag = 0x00;
  RSCommand = (RS_CmdH<<8)+RS_CmdL;
    
  TFlag = PsWdCHK(RS_DataPtr); //密码检查
	
  if(TFlag==0x00) //密码错误
  {
    ErrInfFlag = 0xAA; //通讯错误信息标志
    ErrInfStat = 0x04;
    RS_Len =0x01;
    TimeProg= 0; //无编程事件
  }
  	
  else if(((TFlag==0x10)||(TFlag==0x11))&&(RSCommand==0xD410)) //(清零密码或编程密码)+电量清零指令
  {	
    //读取清零事件指针+1次保留清零机会标志
    Read24C64(Temp,0x05,0xE7,2);
    if(Temp[0]!=~Temp[1])
    {
      Temp[0] = 0xA0; //默认清零事件指针为0
      Temp[1] = 0x5F;
    }
    if(Prog_Flag==1) //处于编程状态
    {
      //读取电表管理状态,为“运行”态时不允许清零
      Read24C64(&ComBuf[20],0x00,0xEE,2);
      ComBuf[20] &= 0x03;
      if(ComBuf[20]==0x02) //为“运行”态时不允许清零,但允许保留清零机会
      {
        Temp[2] = Temp[0]&0xF0; //读取1次保留清零机会标志
        if(Temp[2]==0xA0)
        {
          TFlag = 0xA5;
          Temp[0] &= 0x07; //清除一次保留清零机会标志
        }
        else  TFlag = 0x00;
      }
      else  TFlag = 0xA5; //未处于“运行”态时允许清零
    }
    else //不处于编程状态
    {	
      Temp[2] = Temp[0]&0xF0; //读取1次保留清零机会标志
      if(Temp[2]==0xA0)
      {
        TFlag = 0xA5;
        Temp[0] &= 0x07; //清除一次保留清零机会标志
      }
      else  TFlag = 0x00;
    } 
      
    if(TFlag==0x00)
    {
      Flag &= ~0x0A;
      //TxdFlag = 0; //不回应
      //TimeProg= 0; //无编程事件
    }
    else //TFlag==0xA5
    {
      ///////////////////////////////////////////////
      ePowerDownCheckFlag = DISABLE; //关闭掉电检测
      /////////////////////////////////////////////// 	
      Temp[2] = Temp[0]&0x07; //读取清零事件指针
      ++Temp[2]; //清零事件指针+1,即最近一次清零事件的指针
      if(Temp[2]==5)  Temp[2] = 0;
      //回写最近一次清零事件的指针,并清除一次保留清零机会标志
      Temp[0] &= 0xF0;
      Temp[0] += Temp[2];
      Temp[1]  = ~Temp[0];
      Write24C64(Temp,0x05,0xE7,2); 
      //形成(正/反)向有功指数数据块
      CreateRealTimeEry();
      //读取当前时间
      RTC_Read();
      CommVariant[10] = RTC[0]; //Sec
      CommVariant[11] = RTC[1]; //Min
      CommVariant[12] = RTC[2]; //Hour
      CommVariant[13] = RTC[4]; //Day
      CommVariant[14] = RTC[5]; //Month
      CommVariant[15] = RTC[6]; //Year
      //写清零事件,注意跨页写问题
      Write24C64(&CommVariant[10],0x05,((Temp[2]*3)<<4)+0x00,0x10);
      Write24C64(&CommVariant[26],0x05,((Temp[2]*3)<<4)+0x10,0x10);
      Write24C64(&CommVariant[42],0x05,((Temp[2]*3)<<4)+0x20,0x06);
      //读取清零次数
      Read24C64(Temp,0x05,0xE9,2);
      if(Temp[1]!=~Temp[0])  Temp[0] = 0x00; //默认清零次数为0
      BCDINC(Temp,1); //清零次数+1
      Temp[1] = ~Temp[0];
      Write24C64(Temp,0x05,0xE9,2);
      //清除内存所有剩余脉冲数、所有电量小数
      ArrayInit(&Energy.PulseTmp1[0],16);
      //清除eeprom所有当前电量和历史记录
      ArrayInit(CommVariant,32);
      //清除eeprom所有电量小数
      Write24C64(CommVariant,0x00,0x00,16);
      //////////////////////////////////////////////////////////////////
      //清除eeprom所有当前电量
      for(i=0;i<8;i++)
      { Write24C64(CommVariant,0x06,i*0x20,32); }
      //////////////////////////////////////////////////////////////////
      //清除eeprom所有历史电量记录
      for(i=1;i<4;i++)
      {
        for(j=0;j<6;j++)
        {
          addr1 = i;
          addr2 = (j*2)<<4;
          Write24C64(CommVariant,addr1,addr2,32);
        }
      }
      //////////////////////////////////////////////
      ePowerDownCheckFlag = ENABLE; //打开掉电检测
      //////////////////////////////////////////////
    }
  }
     	
  else //编程(清零)密码正确
  {
    if( (RSCommand==0xC117) || (RSCommand==0xC113) || (RSCommand==0xC212) || (RSCommand==0xD400) )
    { NoProgFlag = 0xAA; } //此4条命令无需编程开关按下 
    
    if((Prog_Flag==1)||(NoProgFlag==0xAA))
    {
      NoProgFlag = 0x00;
      switch(RSCommand)
      {
        case 0xC010://当前日期(周次)
                    {
                      //周日月年
                      if((ComBuf[RS_CmdPtr+6]<0x07)&&(DateCHK(&ComBuf[RS_CmdPtr+7])==1))
                      {
                        RTC_Set(0x30,&ComBuf[RS_CmdPtr+6],0x04);  //周日月年
                        Fee_Flag = 1; //置位费率检查标志
	                EryBln_Flag = 1; //电能结算
                      }
                      else //非法数据
                      {
                        ErrInfFlag = 0xAA; //通讯错误信息标志
                        ErrInfStat = 0x01;
                        RS_Len =0x01;
                        TimeProg= 0; //无编程事件
                      }
                      break;
                    } 
        case 0xC011://当前时间
                    {
    	              //秒分时
                      if((TimeCHK(&ComBuf[RS_CmdPtr+6])==1))
                      { 
                        RTC_Set(0x00,&ComBuf[RS_CmdPtr+6],0x03); //秒分时
	                Fee_Flag = 1; //置位费率检查标志
	                EryBln_Flag = 1; //电能结算
                      }
                      else //非法数据
                      {
                        ErrInfFlag = 0xAA; //通讯错误信息标志
                        ErrInfStat = 0x01;
                        RS_Len =0x01;
                        TimeProg= 0; //无编程事件
                      }
                      break;  
                    }
        case 0xC01F://当前日期(周次)、时间数据块
                    { 
                      //周日月年、秒分时
                      if((ComBuf[RS_CmdPtr+6]<0x07)&&(DateCHK(&ComBuf[RS_CmdPtr+7])==1)
                       &&(TimeCHK(&ComBuf[RS_CmdPtr+10])==1))
                      {
                        //秒分时周日月年
                        RTC_Set(0x00,&ComBuf[RS_CmdPtr+10],0x03); //秒分时
   	                RTC_Set(0x30,&ComBuf[RS_CmdPtr+6],0x04);  //周日月年
	                Fee_Flag = 1; //置位费率检查标志
	                EryBln_Flag = 1; //电能结算
                      }
                      else //非法数据
                      {
                        ErrInfFlag = 0xAA; //通讯错误信息标志
                        ErrInfStat = 0x01;
                        RS_Len =0x01;
                        TimeProg= 0; //无编程事件
                      }
                      break;   
                    }
        case 0xC113://屏幕循显时间
                    {
    	              ComBuf[RS_CmdPtr+6+1]=~ComBuf[RS_CmdPtr+6+0];
                      Write24C64(&ComBuf[RS_CmdPtr+6],0x00,0x54,2);
                      DspDataReadFlag = 1; //读显示控制参数标志置位
                      break;
                    }         
        case 0xC117://自动抄表日期
                    {
                      ComBuf[RS_CmdPtr+6+2] = ~(ComBuf[RS_CmdPtr+6+0]+ComBuf[RS_CmdPtr+6+1]);

⌨️ 快捷键说明

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