📄 zhu1126_96.lst
字号:
901 2 ReceCheck = 4096 * toint(ReceSbuf2[27]) + 256 * toint(ReceSbuf2[28]) + 16 * toint(ReceSbuf2[29]) + toin
-t(ReceSbuf2[30]);
902 2 switch( ReceCheck ) //是否是正确的波特率
903 2 {
904 3 case 1200: NewBaud=1;break;
905 3 case 2400: NewBaud=2;break;
906 3 case 4800: NewBaud=3;break;
907 3 case 9600: NewBaud=4;break;
908 3 case 19200: NewBaud=5;break;
909 3 default :
910 3 state = 06;
911 3 NewBaud = 0;
912 3 BaudAnsFlag = 0;
913 3 break;
914 3 }
C51 COMPILER V6.02 ZHU1126_96 12/11/2003 11:17:47 PAGE 16
915 2 portBaud = 2 ; //要修改波特率的串口
916 2 break;
917 2 case RTdataCom: //实时数据命令
918 2 if(DuanKaiTiao&&JiaoTiFlag) //有断开历史记录,该发送断开历史记录
919 2 {
920 3 JiaoTiFlag = 0; //实时历史记录交替发送标志位
921 3 AddLed=(DuanKaiZhi/64)+(AddLed&0xF0);//确定扇区
922 3 ledled = AddLed; //选通扇区
923 3 kk0=DuanKaiZhi%64*0x400; //第几条,哪k
924 3 if(DuanKaiZhi%64<8)
925 3 {
926 4 for(kk=0;kk<33+AIDIsum;kk++)//断开历史记录COPY到发送缓冲区
927 4 {
928 5 RamRom_Convert= 0;//切换为RAM628512操作
929 5 RamIO_Convert = 0;
930 5 data00=XBYTE[kk0+kk];//切换
931 5 RamRom_Convert= 1;//切换为RAM628128及IO口操作
932 5 RamIO_Convert = 1;
933 5 SendSbuf2[kk]=data00; //
934 5 }
935 4 }
936 3 else
937 3 {
938 4 RamRom_Convert= 1;//切换为RAM628512操作
939 4 RamIO_Convert = 0;
940 4 for(kk=0;kk<33+AIDIsum;kk++)//断开历史记录COPY到发送缓冲区
941 4 {
942 5 SendSbuf2[kk]=XBYTE[kk0+kk]; //
943 5 }
944 4 }
945 3 RamRom_Convert= 1;//切换为RAM628512操作
946 3 RamIO_Convert = 1;
947 3 SendSbuf2[32+AIDIsum]='\n'; //字符结束符
948 3 DuanKaiTiao--; //调整断开历史记录条数
949 3 if(DuanKaiZhi) //调整断开历史记录存放位置
950 3 {
951 4 DuanKaiZhi--;//
952 4 }
953 3 else
954 3 {
955 4 DuanKaiZhi=DuanKaiRongL-1; //断开历史记录条数容量
956 4 }
957 3 bNeedSend2 = 1; //启动发送
958 3 ReceCount2 = 0; //串口1接收计数器清零
959 3 memset( ReceSbuf2, 0, 10 ); //串口1接收缓冲区清零
960 3 return;
961 3 }
962 2 else //没有断开历史记录,断开后第一次连上发送实时数据,一条实时,一条历史
963 2 {
964 3 JiaoTiFlag = 1; //实时历史记录交替发送标志位
965 3 TemLen= 32+AIDIsum; //数据包长度
966 3 typeCom = RTdataAns;
967 3 memcpy( SendSbuf2+27,RealTimeData,AIDIsum+12 );//读取实时数据(包括AIDI标志字符)
968 3 }
969 2 break;
970 2 case ControlCom: //遥调遥控命令
971 2 typeCom = ControlAns;
972 2 ReceConFlag = 1; //收到控制标志位(闪灯用)
973 2 TemLen = 20 + 22; //
974 2 for( i = 27;i < 37;i++) //保存参数
975 2 {
976 3 SendSbuf2[i] = ReceSbuf2[i];
C51 COMPILER V6.02 ZHU1126_96 12/11/2003 11:17:47 PAGE 17
977 3 }
978 2 DotType = 16 * toint(ReceSbuf2[27]) + toint(ReceSbuf2[28]); //测点类型
979 2 DotChunnel = 16 * toint(ReceSbuf2[31]) + toint(ReceSbuf2[32]); //接收测点号(测点号不大0xFF)
980 2 controlFlag = 1; //要发控制标志位置一
981 2 if( DotType == TypeAO ) //测点量测试
982 2 {
983 3 if(DotChunnel>AOsum-1) //?????????是否减1
984 3 {
985 4 state=0x08; //参数出错
986 4 controlFlag = 0;
987 4 }
988 3 DotModule = 0x1F-B33ID; //测点模块
989 3 }
990 2 else if( DotType == TypeDO )
991 2 {
992 3 if( DotChunnel>DOsum-1) //?????????是否减1
993 3 {
994 4 state=0x08; //参数出错
995 4 controlFlag = 0;
996 4 }
997 3 for( j = 0;j < Broadsum;j++ )
998 3 {
999 4 if( DotChunnel < DOarr[j] )
1000 4 {
1001 5 DotModule=j; //查找到模块地址
1002 5 break;
1003 5 }
1004 4 else
1005 4 { DotChunnel-=DOarr[j];}
1006 4 }
1007 3 } //测点号错
1008 2 else //测点类型校验
1009 2 {
1010 3 state=0x07; //测点类型出错
1011 3 controlFlag = 0;
1012 3 }
1013 2 Dotparam = 4096 * toint(ReceSbuf2[33])+256 * toint(ReceSbuf2[34]) + 16 * toint(ReceSbuf2[35]) + toint(R
-eceSbuf2[36]);
1014 2 break;
1015 2 case HistoryNuCom: //查询历史记录条数
1016 2 typeCom = HistoryNuAns;
1017 2 TemLen= 20 + 12 + 4; //数据包长度
1018 2 if(ZhengChTiao>ZhengChRongL)
1019 2 {
1020 3 memcpy(SendSbuf2+27,"0000",4);
1021 3 state = 6; //参数出错
1022 3 ZhengChZhi=0;
1023 3 ZhengChTiao=0;
1024 3 }
1025 2 else
1026 2 {
1027 3 hex2asc1( SendSbuf2+27,ZhengChTiao); //曲线历史记录条数
1028 3 }
1029 2 break;
1030 2 case HistoryNoCom: //查询第n条曲线历史记录
1031 2 kk = 0;
1032 2 for(i=0;i<4;i++)//存放地址
1033 2 {
1034 3 kk=kk*16+toint(ReceSbuf2[27+i]);
1035 3 }
1036 2 if(kk>=ZhengChTiao)
1037 2 {
C51 COMPILER V6.02 ZHU1126_96 12/11/2003 11:17:47 PAGE 18
1038 3 TemLen= 36; //数据包长度
1039 3 typeCom=HistoryNoAns;
1040 3 state=6;
1041 3 break;
1042 3 }
1043 2 AddLed = (AddLed&0xF0)+kk/64+4; //选通扇区
1044 2 ledled = AddLed; //选通扇区
1045 2 kk0 = kk%64*0x400; //第几条,哪k
1046 2 if(kk%64<8)
1047 2 {
1048 3 for(kk=0;kk<AIDIsum+33;kk++)//断开历史记录COPY到发送缓冲区
1049 3 {
1050 4 RamRom_Convert= 0;//切换为RAM628512操作
1051 4 RamIO_Convert = 0;
1052 4 data00=XBYTE[kk0+kk];//切换
1053 4 RamRom_Convert= 1;//切换为RAM628128及IO口操作
1054 4 RamIO_Convert = 1;
1055 4 SendSbuf2[kk]=data00; //
1056 4 }
1057 3 }
1058 2 else
1059 2 {
1060 3 RamRom_Convert= 1;//切换为RAM628128及IO口操作
1061 3 RamIO_Convert = 0;
1062 3 for(kk=0;kk<AIDIsum+33;kk++)//断开历史记录COPY到发送缓冲区
1063 3 {
1064 4 SendSbuf2[kk]=XBYTE[kk0+kk]; //
1065 4 }
1066 3 }
1067 2 RamRom_Convert= 1;//切换为RAM628512操作
1068 2 RamIO_Convert = 1;
1069 2 SendSbuf2[AIDIsum+32]='\n';
1070 2 bNeedSend2 = 1; //启动发送
1071 2 ReceCount2 = 0; //串口1接收计数器清零
1072 2 memset( ReceSbuf2, 0, 20 ); //串口1接收缓冲区清零
1073 2 return; //切换取出曲线历史记录送发送缓冲区
1074 2 default :
1075 2 state = 3; //命令类型有错
1076 2 break;
1077 2 }
1078 1 SendSbuf2[0] = 0x7E; //起始符
1079 1 SendSbuf2[1] = VERh; //版本号
1080 1 SendSbuf2[2] = VERl; //版本号
1081 1 SendSbuf2[3] = 0x30; //扩展地址(随意)
1082 1 SendSbuf2[4] = 0x30;
1083 1 hex2asc0( SendSbuf2 + 5, Read_ID() ); //采集箱地址
1084 1 hex2asc0( SendSbuf2 + 7, typeCom ); //命令类型
1085 1 hex2asc0( SendSbuf2 + 9, state ); //返回状态
1086 1 hex2asc1( SendSbuf2 + 11, TemLen-20 ); //数据块长度
1087 1 memcpy( SendSbuf2+15, ReceSbuf2+15, 12); //日期时间
1088 1 SumCheck=CrcCheck(SendSbuf2+1,TemLen-6);//计算CRC
1089 1 hex2asc1( SendSbuf2+TemLen-5,SumCheck); //CRC校验
1090 1 SendSbuf2[TemLen-1] = '\r'; //结束符
1091 1 SendSbuf2[TemLen] = '\n'; //停止发送符
1092 1 bNeedSend2 = 1; //启动发送
1093 1 ReceCount2 = 0; //串口0接收计数器清零
1094 1 memset( ReceSbuf2, 0, 20 ); //串口2接收缓冲区清零
1095 1 }
1096
1097
1098 void TurnOnCom(uchar call00) //轮询点名,参数是板地址
1099 {
C51 COMPILER V6.02 ZHU1126_96 12/11/2003 11:17:47 PAGE 19
1100 1 uchar leni=0;
1101 1 uint crci;
1102 1 uchar xdata PreSbuf00[] = "04100000000\r\n";
1103 1 PreSbuf00[0] = 0x1F - call00; //从模块地址
1104 1 crci = CrcCheck(PreSbuf00, 7); //CRC校验
1105 1 hex2asc1( PreSbuf00+7, crci); //crc校验高八bits
1106 1 memcpy( SendSbuf0, PreSbuf00, sizeof(PreSbuf00) );//送发送缓冲区
1107 1 SendCount0 = 0;
1108 1 ReceCount0 = 0;
1109 1 TB8 = 1; //发送地址
1110 1 SBUF = SendSbuf0[SendCount0++]; //启动发送
1111 1 lockFlagDn = 1; //下发上锁
1112 1 }
1113
1114 void ControlComm() //下发遥控遥调命令
1115 {
1116 1 uchar leni=0;
1117 1 uint crci;
1118 1 uchar xdata PreSbuf00[]="0430008HHHHGGGG0000\r\n";
1119 1 controlFlag = 0;
1120 1 PreSbuf00[0]=0x1F-DotModule; //从模块地址
1121 1 hex2asc0( PreSbuf00 + 7, DotType ); //测点类型
1122 1 hex2asc0( PreSbuf00 + 9, DotChunnel ); //测点通道
1123 1 hex2asc1( PreSbuf00 + 11, Dotparam ); //测点参数
1124 1 crci=CrcCheck( PreSbuf00, 15 ); //CRC校验
1125 1 hex2asc1( PreSbuf00 + 15,crci ); //crc校验;
1126 1 memcpy( SendSbuf0, PreSbuf00, sizeof(PreSbuf00) );//送发送缓冲区
1127 1 ReceCount0 = 0;
1128 1 SendCount0 = 0;
1129 1 TB8 = 1; //发送地址
1130 1 SBUF = SendSbuf0[SendCount0++]; //启动发送
1131 1 lockFlagDn = 1; //下发上锁
1132 1 }
1133
1134 void timeout0() //超时,送FFFF无效数据
1135 {
1136 1 FalseTime0=0;
1137 1 memset(RealTimeData+6,0x46,B00AI*4); //AI量
1138 1 memset(RealTimeData+AIsum+12,0x46,B00DI/2); //DI量
1139 1 }
1140
1141 void timeout1() //超时,送FFFF无效数据
1142 {
1143 1 FalseTime1=0;
1144 1 memset(RealTimeData+6+B00AI*4,0x46,B11AI*4); //AI量
1145 1 }
1146
1147 void timeout2() //超时,送FFFF无效数据
1148 {
1149 1 FalseTime2=0;
1150 1 memset(RealTimeData+6+B00AI*4+B11AI*4,0x46,B22AI*4); //AI量
1151 1 }
1152 void timeout3() //超时,送FFFF无效数据
1153 {
1154 1 FalseTime3=0;
1155 1 memset(RealTimeData+6+AIsum-B33AI*4,0x46,B33AI*4); //AI量
1156 1 memset(RealTimeData+12+AIsum+B00DI/2,0x46,B33DI/2); //DI量
1157 1 }
1158
1159 void SendPermit1()
1160 {
1161 1 #ifdef OpenEn
C51 COMPILER V6.02 ZHU1126_96 12/11/2003 11:17:47 PAGE 20
1162 1 SendEn |= 0x02;
1163 1 #else
SendEn |= 0x06;
#endif
1166 1 XBYTE[0xE000] = SendEn; //允许发送进中断1
1167 1 SendCount1 = 0; //串口1发送计数器清零
1168 1 SendingFlag1 = 1;
1169 1 if( ResetAnsFlag ) //系统复位(死循环)
1170 1 {
1171 2 ResetAnsFlag=0;
1172 2 while(1);
1173 2 }
1174 1 }
1175
1176 void SendPermit2()
1177 {
1178 1 #ifdef OpenEn
1179 1 #else
uchar xdata i=0;
#endif
1182 1 #ifdef OpenEn
1183 1 SendEn |= 0x20;
1184 1 #else
SendEn |= 0x28;
#endif
1187 1 XBYTE[0xE000] = SendEn; //允许发送进中断1
1188 1 #ifdef OpenEn
1189 1 #else
while(i++<100) _nop_(); //延时
#endif
1192 1 SendCount2 = 0; //串口2发送计数器清零
1193 1 SendingFlag2 = 1;
1194 1 if( ResetAnsFlag ) //系统复位(死循环)
1195 1 {
1196 2 ResetAnsFlag=0;
1197 2 while(1);
1198 2 }
1199 1 }
1200
1201 void testAODO()
1202 {
1203 1 #ifdef TestDO
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -