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

📄 rscomm.c

📁 本代码为电子式单相多费率电能表的源程序
💻 C
📖 第 1 页 / 共 4 页
字号:
    case 0x9410://上月正向总有功(总)指数
    case 0x9412://上月正向总有功(峰)指数
    case 0x9413://上月正向总有功(平)指数
    case 0x9414://上月正向总有功(谷)指数
                {
                  addr1 = 0x02;
                  addr2 = LastMonthSN(0+LLastEryFlag); //上月
                  addr2 <<= 4;
                  if(RS_CmdL==0x12)  addr2 += 0x04;
                  if(RS_CmdL==0x13)  addr2 += 0x08;
                  if(RS_CmdL==0x14)  addr2 += 0x0C;
                  Read24C64(&ComBuf[12],addr1,addr2,4);
                  
                  RS_Len =2+4;
                  break;
                }    
    case 0x9810://上上月正向总有功(总)指数
    case 0x9812://上上月正向总有功(峰)指数
    case 0x9813://上上月正向总有功(平)指数
    case 0x9814://上上月正向总有功(谷)指数
                {
                  addr1 = 0x02;
                  addr2 = LastMonthSN(1+LLastEryFlag); //上上月
                  addr2 <<= 4;
                  if(RS_CmdL==0x12)  addr2 += 0x04;
                  if(RS_CmdL==0x13)  addr2 += 0x08;
                  if(RS_CmdL==0x14)  addr2 += 0x0C;
                  Read24C64(&ComBuf[12],addr1,addr2,4);

                  RS_Len =2+4;
                  break;
                }
    case 0xB210://最近一次编程时间
                {
                  Read24C64(Temp,0x08,0xFC,2); //读最近一次编程事件指针
                  //读编程事件指针失败的处理     
                  if(Temp[0]!=~Temp[1])
                  {
                    Temp[0] = 0x00;
                    Temp[1] = 0xFF;
                    Write24C64(Temp,0x08,0xFC,2);
                  }
                  Read24C64(&ComBuf[12],0x08,0xE0+Temp[0]*5,4);
                  
                  RS_Len =2+4;
                  break;
                }   
    case 0xB212://编程次数
                {
                  Read24C64(&ComBuf[12],0x08,0xF9,2);
                  RS_Len =2+2;
                  break;
                }
    case 0xB214://电池工作时间
                {
                  Read24C64(&ComBuf[12],0x00,0xE6,3);
                  RS_Len =2+3;
                  break;
                }
    ////////////////////////////////////////////////////////
    case 0xB216://温度
                { 
                  ComBuf[12] = Temp_Read();
                  RS_Len =2+1;
                  break;
                }    
    ////////////////////////////////////////////////////////  
    case 0xC010://当前日期(周次)数据块
                {
                  RTC_Read();
                  ComBuf[12] = Week;
    	          ComBuf[13] = Day;
    	          ComBuf[14] = Month;
    	          ComBuf[15] = Year;
                  RS_Len = 2+4;
                  break;
                }
    case 0xC011://当前时间数据块
                {
                  RTC_Read();
                  ComBuf[12] = Sec;
                  ComBuf[13] = Min;
                  ComBuf[14] = Hour;
                  RS_Len = 2+3;
                  break;
                }       
    case 0xC01F://当前日期(周次)、时间数据块
                {
    	          RTC_Read();
    	          ComBuf[12] = Week;
    	          ComBuf[13] = Day;
    	          ComBuf[14] = Month;
    	          ComBuf[15] = Year;
    	          ComBuf[16] = Sec;
    	          ComBuf[17] = Min;
    	          ComBuf[18] = Hour;
                  RS_Len = 2+7;
                  break;
                }
    case 0xC020://电表运行状态字
                {
    	          ComBuf[12] = MeterRunFlag;
                  RS_Len  = 2+1;
                  break;
                }          
    case 0xC030://电表有功常数:1600imp
                {
    	          ComBuf[12+0] = 0x00;
    	          ComBuf[12+1] = 0x16;
    	          ComBuf[12+2] = 0x00;
                  RS_Len = 2+3;
                  break;
                }              
    case 0xC032://表号(资产条形码号)
                {
                  Read24C64(&ComBuf[12],0x00,0xF7,6);
                  RS_Len = 2+6;
                  break;
                }                   
    case 0xC113://屏幕循显时间
                {
    	          Read24C64(&ComBuf[12],0x00,0x54,1);
                  RS_Len =2+1;
                  break;
                }
    case 0xC117://自动抄表日期
                {
                  Read24C64(&ComBuf[12],0x08,0x88,2);
                  RS_Len =2+2;
                  break;
                }                  
    case 0xC211://输出脉冲宽度:80mS
                { 	
                  //此处需注意数据上传先后顺序
                  ComBuf[12+0] = 0x80;
                  ComBuf[12+1] = 0x00;
                  RS_Len  = 2+2;
                  break;
                } 
    case 0xC311://日时段表数
                {
  	          ComBuf[12] = 0x02;
                  RS_Len  = 2+1;
                  break;
                }         
    case 0xC312://日时段数
                {
      	          ComBuf[12] = 0x08;
                  RS_Len  = 2+1;
                  break;
                }     
    case 0xC313://费率数
                {
      	          ComBuf[12] = 0x03;
                  RS_Len  = 2+1;
                  break;
                }       
    case 0xC32F://时区起始日期及日时段表号数据块
                {
  	          Read24C64(&ComBuf[12],0x09,0x47,6);
                  RS_Len =2+6;
                  break;
                }
    case 0xC33F://时段表1时段起始日期及费率号数据块
                {
  	          Read24C64(&ComBuf[12],0x00,0x60,24);
                  RS_Len =2+24;
                  break;
                }
    case 0xC34F://时段表2时段起始日期及费率号数据块
                {
  	          Read24C64(&ComBuf[12],0x00,0x80,24);
                  RS_Len =2+24;
                  break;
                }
    case 0xD400://自动显示数据域
                {
    	          Read24C64(&ComBuf[12],0x00,0x50,3);
                  RS_Len =2+3;
                  break;
                }
    case 0xD403://电表管理状态
                {
    	          Read24C64(&ComBuf[12],0x00,0xEE,1);
                  RS_Len =2+1;
                  break;
                }
    case 0xD404://检定人代码和检定时间:NNNNNN+YYMMDD
                {
                  Read24C64(&ComBuf[12],0x00,0xF0,6);
                  RS_Len =2+6;
                  break;
                }           
    case 0xD406://产品条形码号
                { 
                  //产品条形码号(低30字节)
                  Read24C64(&ComBuf[12],0x09,0xC0,30);
                  //产品条形码号(高30字节)
                  Read24C64(&ComBuf[42],0x09,0xE0,30);
                  RS_Len =2+60;
                  break;
                }         
    case 0xD407://电池报警时间:YYMMDDhhmm
                {
                  Read24C64(&ComBuf[12],0x00,0xE0,5);
                  RS_Len =2+5;
                  break;
                }          
    case 0xD40B://最近一次开表盖、端钮盒时间:MMDDhhmm
    case 0xD40C://最近上一次开表盖、端钮盒时间:MMDDhhmm
                {
                  i = 0; //最近一次
                  if(RS_CmdL==0x0C)  i = 10; //最近上一次
                  //读取最近一次开表盖时间
                  Read24C64(&ComBuf[12],0x09,0x00+i,5);
                  Temp[0] = ~SumCHK(&ComBuf[12],4);
                  if(ComBuf[16]!=Temp[0])  ArrayInit(&ComBuf[12],4);                
                  //读取最近一次开端钮盒时间
                  Read24C64(&ComBuf[16],0x09,0x05+i,5);
                  Temp[0] = ~SumCHK(&ComBuf[16],4);
                  if(ComBuf[20]!=Temp[0])  ArrayInit(&ComBuf[16],4);                
                  RS_Len =2+8;
                  break;
                }          
    case 0xD40D://累计开表盖、端钮盒次数
                {
                  //读取开表盖累计次数
                  Read24C64(&ComBuf[12],0x09,0x1C,3);
                  Temp[0] = ComBuf[12]+ComBuf[13];
                  if(ComBuf[14]!=~Temp[0])  
                  {
                    ComBuf[12] = 0x00;
                    ComBuf[13] = 0x00;
                  }
                  //读取开端钮盒累计次数
                  Read24C64(&ComBuf[14],0x09,0x1F,3);
                  Temp[0] = ComBuf[14]+ComBuf[15];
                  if(ComBuf[16]!=~Temp[0])  
                  {
                    ComBuf[14] = 0x00;
                    ComBuf[15] = 0x00;
                  }
                  RS_Len =2+4;
                  break;
                }          
    case 0xD40E://累计开表盖、端钮盒时间
                {
                  //读取累计开表盖时间
                  Read24C64(&ComBuf[12],0x09,0x14,4);
                  Temp[0] = ~SumCHK(&ComBuf[12],3);
                  if(ComBuf[15]!=Temp[0])  ArrayInit(&ComBuf[12],3);               
                  //读取累计开端钮盒时间
                  Read24C64(&ComBuf[15],0x09,0x18,4);
                  Temp[0] = ~SumCHK(&ComBuf[15],3);
                  if(ComBuf[18]!=Temp[0])  ArrayInit(&ComBuf[15],3);                
                  RS_Len =2+6;
                  break;
                }
    case 0xD413://最近5次编程日期:MMDDhhmm
                {
                  //读最近一次编程事件指针
                  Read24C64(Temp,0x08,0xFC,2);
                  //读编程事件指针失败的处理     
                  if(Temp[0]!=~Temp[1])
                  {
                    Temp[0] = 0x00;
                    Temp[1] = 0xFF;
                    Write24C64(Temp,0x08,0xFC,2);
                  }
                  for(i=0;i<5;++i)
                  {
                    Temp[1] = Temp[0]-i;
                    if(Temp[1]<0)  Temp[1] += 5;
                    addr2 = 0xE0+Temp[1]*5; //最近第i次编程事件指针
                    Read24C64(&ComBuf[12+i*4],0x08,addr2,4);
                  }
                  RS_Len =2+20;
                  break;
                } 
    case 0xD414://有功反向累计总时间
                {
                  Read24C64(&ComBuf[12],0x04,0xD0,3);
                  RS_Len =2+3;
                  break;
                }
    case 0xD415://时段表切换及标志
                {
                  Read24C64(&ComBuf[12],0x09,0x40,6);
                  RS_Len =2+6;
                  break;
                }
    case 0xD416://现在执行时段表编号
                {
                  Read24C64(&ComBuf[12],0x09,0x4F,1);
                  RS_Len =2+1;
                  break;
                }
    case 0xD40F://日时段费率切换时间、电量记录
                {
                  Read24C64(&ComBuf[12],0x09,0x6A,38);
                  RS_Len =2+38;
                  break;
                }                                 
    case 0xD41F://最近上1次清零记录
    case 0xD42F://最近上2次清零记录
    case 0xD43F://最近上3次清零记录
    case 0xD44F://最近上4次清零记录
    case 0xD45F://最近上5次清零记录
                {
                  RS_CmdL >>= 4;
                  //读取清零事件指针
                  Read24C64(Temp,0x05,0xE7,2);
                  //读编清零事件指针失败的处理    
                  if(Temp[0]!=~Temp[1])  Temp[0] = 0x00;
                  Temp[0] &= 0x07;
                  Temp[0] -= (RS_CmdL-1);
                  if(Temp[0]<0)  Temp[0] += 5;
                  //只保留5次清零记录
                  if((Temp[0]<0)||(Temp[0]>4))  { TxdFlag = 0; }//命令不在服务范围
                  addr2 = (Temp[0]*3)<<4;
                  Read24C64(&ComBuf[12],0x05,addr2,38);
                  RS_Len =2+38;
                  break;
 	        }
    case 0xD730://当前月总有功总指数
    case 0xD732://当前月总有功峰指数
    case 0xD733://当前月总有功平指数
    case 0xD734://当前月总有功谷指数
                {
                  if(RS_CmdL==0x30)  i = 0;
                  else  i = RS_CmdL-0x31;
                  CreateRealTimeEry();
                  for(j=0;j<4;j++)
                  {
                    ComBuf[RS_DataPtr+j] = CommVariant[0+i*4+j];
                  }
        
                  RS_Len =2+4;
                  break;             
                }
    case 0xD73F://当前月总有功指数数据块
               {  
               	 CreateRealTimeEry();
                  for(j=0;j<16;j++)
                  {
                    ComBuf[RS_DataPtr+j] = CommVariant[0+j];
                  }
                  //RS_Len =2+16;
                  break;             
               }  
    case 0xD74F://当前月总累计反向时间、最后一次反向起、止时间
                {
                  Read24C64(&ComBuf[12],0x04,0xC0,11);
                  RS_Len =2+11;
                  break;
                }
    case 0xD750:
    case 0xD752:

⌨️ 快捷键说明

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