📄 rscomm.lst
字号:
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 + -