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

📄 rscomm.lst

📁 江苏单相复费率电能表方案
💻 LST
📖 第 1 页 / 共 5 页
字号:
 849   1          
 850   1          Addr[0] = 0xA0;             
 851   1          Addr[1] = 0xF0;  //局编号地址 
 852   1              Len[1]  = 0x06;         
 853   1              ReadData(Address);
 854   1              
 855   1              if( RS_Addr0==0x99 && RS_Addr1==0x99 && RS_Addr2==0x99 &&
 856   1              RS_Addr3==0x99 && RS_Addr4==0x99 && RS_Addr5==0x99 )
 857   1              {
 858   2              if( RS_Ctrl==RS_CTRL_Time  )                                            return 0x10;    //广播校时
 859   2              else if( RS_Ctrl==RS_CTRL_MetID && Prog_Flag==1 )       return 0x11;    //广播设置电表号 
 860   2              
C51 COMPILER V7.50   RSCOMM                                                                04/13/2007 13:24:53 PAGE 15  

 861   2              //※※※※※※※※ 
 862   2              //else if( RS_Ctrl==0xAA && Prog_Flag==1 )              return 0x12;    //自定义命令集    
 863   2              //※※※※※※※※ 
 864   2              
 865   2              else                                                                                            return 0x00;    //广播命令码错误
 866   2              }
 867   1      
 868   1              //局号符合(包含缩位寻址)
 869   1              else if( (RS_Addr0==Address[0]||RS_Addr0==0xAA) && (RS_Addr1==Address[1]||RS_Addr1==0xAA) && 
 870   1                       (RS_Addr2==Address[2]||RS_Addr2==0xAA) && (RS_Addr3==Address[3]||RS_Addr3==0xAA) &&
 871   1                       (RS_Addr4==Address[4]||RS_Addr4==0xAA) && (RS_Addr5==Address[5]||RS_Addr5==0xAA) ) 
 872   1              {       
 873   2                      RS_Addr0 = Address[0];
 874   2                      RS_Addr1 = Address[1];
 875   2                      RS_Addr2 = Address[2];
 876   2                      RS_Addr3 = Address[3];
 877   2                      RS_Addr4 = Address[4];
 878   2                      RS_Addr5 = Address[5];
 879   2                      
 880   2                      if( RS_Ctrl==RS_CTRL_Pswd )       return 0x20;  //修改密码
 881   2                      
 882   2                      else if( RS_Ctrl==RS_CTRL_Read  ) return 0x21;  //读数据
 883   2                      
 884   2              else if( RS_Ctrl==RS_CTRL_Write ) return 0x22;  //写数据
 885   2              
 886   2              else                                                      return 0x00;
 887   2              }
 888   1              else return 0x00;                                                               //地址身份不符合,错误不响应
 889   1      }
 890          
 891          
 892          
 893          
 894          
 895          //**********************************************************
 896          //名称:
 897          //功能:
 898          //说明:
 899          //**********************************************************
 900          uchar PsWdCHK(uchar PsWdPtr)
 901          {
 902   1              uchar Temp;
 903   1              uchar PassWord[4];
 904   1       
 905   1          if(ComBuf[PsWdPtr]>0x01)            return 0x00;    //权限错误  
 906   1          else
 907   1          {   
 908   2              Addr[0] = 0xA0;         
 909   2              Addr[1] = 0xEC;                                                         //编程密码地址          
 910   2              if(ComBuf[PsWdPtr]==0x00)       Addr[1] = 0xE8; //清零密码地址          
 911   2              Len[1]  = 0x04;
 912   2                      
 913   2                      //密码读取和检查
 914   2              do
 915   2              {
 916   3                      ReadData(PassWord);
 917   3                              Temp = PassWord[0]+PassWord[1]+PassWord[2];//SumCHK(PassWord,3);
 918   3              }while((PassWord[3]!=~Temp)&&(Addr[0]<=0xA4));
 919   2              
 920   2              //默认密码
 921   2              if( PassWord[3]!=~Temp ) 
 922   2              { 
C51 COMPILER V7.50   RSCOMM                                                                04/13/2007 13:24:53 PAGE 16  

 923   3                      PassWord[0]=0x56;
 924   3                      PassWord[1]=0x34;
 925   3                      PassWord[2]=0x12;
 926   3                      PassWord[3]=0x63;
 927   3              }
 928   2              
 929   2              //密码出错修正
 930   2                      ErrorModify(0xA4,PassWord);
 931   2      
 932   2                      //密码比较
 933   2              if( ComBuf[PsWdPtr+1]==PassWord[0] && ComBuf[PsWdPtr+2]==PassWord[1] && ComBuf[PsWdPtr+3]==PassWord[2
             -] )
 934   2              {       
 935   3                      if(ComBuf[PsWdPtr]==0x00)       return 0x10;    //清零密码       
 936   3                      else                                            return 0x11;    //编程密码
 937   3              }
 938   2              else return 0x00;                                                               //密码错误 
 939   2          } 
 940   1      }
 941          
 942          
 943          
 944          
 945          
 946          //**********************************************************
 947          //名称:TimeTerm()
 948          //功能:时间条件检查
 949          //说明:
 950          //**********************************************************
 951          bit TimeTerm(void)
 952          {
 953   1              uchar MinSum1;
 954   1          uchar MinSum2;
 955   1                      
 956   1              //时间数据正确性检查    
 957   1              if( TimeCHK(&ComBuf[RS_CmdPtr+6])==0 )  return(0);
 958   1              
 959   1              //25天判断
 960   1              AdjDate = DateTerm();
 961   1      
 962   1              //编程条件检查
 963   1              if( Prog_Flag==1 )      return(1);      //编程允许
 964   1              else
 965   1              {       
 966   2                      if( AdjDate==1 )        //25天判断
 967   2              {               
 968   3                              //========================================
 969   3                      //不允许跨日校时
 970   3                      //========================================
 971   3                      if((Hour==0x00 && ComBuf[RS_CmdPtr+6+2]==0x23)|| 
 972   3                         (Hour==0x23 && ComBuf[RS_CmdPtr+6+2]==0x00))                 return(0);              
 973   3                              
 974   3                              //时间误差计算
 975   3                      if(abs(BCD2HEX(Hour)-BCD2HEX(ComBuf[RS_CmdPtr+6+2]))>1) //小时条件检查
 976   3                              {
 977   4                                      AdjTime = 1; //时钟异常
 978   4                                      return(0);
 979   4                      }
 980   3                              else
 981   3                      {       
 982   4                          //相差1小时之内     
 983   4                              MinSum1 = BCD2HEX(Min);
C51 COMPILER V7.50   RSCOMM                                                                04/13/2007 13:24:53 PAGE 17  

 984   4                                      MinSum2 = BCD2HEX(ComBuf[RS_CmdPtr+6+1]);
 985   4                                      
 986   4                              if(Hour>ComBuf[RS_CmdPtr+6+2]) MinSum1 += 60;
 987   4                              if(Hour<ComBuf[RS_CmdPtr+6+2]) MinSum2 += 60;
 988   4                      
 989   4                              if( abs(MinSum1-MinSum2)>=TimeErrorTerm )//大于时间条件
 990   4                                      {
 991   5                                              AdjTime = 1; //时钟异常
 992   5                                              return(0);
 993   5                                      }
 994   4                              else 
 995   4                                      {       
 996   5                                              AdjDate=0;      //?????????
 997   5                                              return(1);      //满足校时误差条件                      
 998   5                                      }
 999   4                      }
1000   3              }
1001   2              else return(0);
1002   2          }   
1003   1      }
1004          
1005          
1006          
1007          
1008          
1009          //**********************************************************
1010          //名称:ReadMeterData()
1011          //功能:从EEPROM中读取数据
1012          //说明:
1013          //**********************************************************
1014          void ReadMeterData(uchar addr,uchar saddr,uchar DataLen)
1015          {
1016   1              Addr[0] = addr;                //页地址
1017   1          Addr[1] = saddr;               //页内子地址 
1018   1          Len[1]  = DataLen;             //数据长度 
1019   1              
1020   1              ReadData(&ComBuf[RS_DataPtr]);  
1021   1      }
1022          
1023          
1024          
1025          
1026          
1027          //**********************************************************
1028          //名称:Proc33()
1029          //功能:加减0x33H处理
1030          //说明:
1031          //**********************************************************
1032          void Proc33(uchar procdata)
1033          {
1034   1              uchar i;        
1035   1         
1036   1          i=0x00;
1037   1          do
1038   1          {
1039   2              ComBuf[RS_CmdPtr+i] += procdata;
1040   2              i++;
1041   2          }while(i<RS_Len); 
1042   1      }
1043          


C51 COMPILER V7.50   RSCOMM                                                                04/13/2007 13:24:53 PAGE 18  

MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   2653    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----      22
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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