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