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

📄 zhu19200.lst

📁 动力环境监控系统 动力环境监控系统
💻 LST
📖 第 1 页 / 共 5 页
字号:
 600   3      			}
 601   2      			BaudAnsFlag = 1;	//波特率修改标志位置一
 602   2      			ReceCheck = 4096 * toint(ReceSbuf1[27]) + 256 * toint(ReceSbuf1[28]) + 16 * toint(ReceSbuf1[29]) + toin
             -t(ReceSbuf1[30]);
 603   2      			switch( ReceCheck )	//是否是正确的波特率
 604   2      			{
 605   3      				case	1200:	NewBaud=1;break;
 606   3      				case	2400:	NewBaud=2;break;
 607   3      				case	4800:	NewBaud=3;break;
 608   3      				case	9600:	NewBaud=4;break;
C51 COMPILER V6.02  ZHU19200                                                               07/05/2004 14:20:33 PAGE 11  

 609   3      				case	19200:	NewBaud=5;break;
 610   3      				default	:
 611   3      					state= 06 ;
 612   3      					NewBaud = 0;
 613   3      					BaudAnsFlag = 0;
 614   3      					break;
 615   3      			}
 616   2      			portBaud = 1 ;		//要修改波特率的串口
 617   2      			break;
 618   2      		case RTdataCom:			//实时数据命令
 619   2      			if(DuanKaiTiao&&JiaoTiFlag)	//有断开历史记录,该发送断开历史记录
 620   2      			{
 621   3      				JiaoTiFlag = 0;		//实时历史记录交替发送标志位
 622   3      				AddLed=(AddLed&0xF0)+DuanKaiZhi/64;	//确定扇区
 623   3      				ledled = AddLed;	//选通扇区
 624   3      				kk0=DuanKaiZhi%64*0x400;	//第几条,哪k
 625   3      				if(DuanKaiZhi%64<8)
 626   3      				{
 627   4      					for(kk=0;kk<33+AIDIsum;kk++)//断开历史记录COPY到发送缓冲区
 628   4      					{
 629   5      						RamRom_Convert= 0;//切换为RAM628512操作
 630   5      						RamIO_Convert = 0;
 631   5      						data00=XBYTE[kk0+kk];//切换
 632   5      						RamRom_Convert= 1;//切换为RAM628128及IO口操作
 633   5      						RamIO_Convert = 1;
 634   5      						SendSbuf1[kk]=data00;	//
 635   5      					}
 636   4      				}
 637   3      				else
 638   3      				{
 639   4      					RamRom_Convert= 1;//切换为RAM628128及IO口操作
 640   4      					RamIO_Convert = 0;
 641   4      					for(kk=0;kk<33+AIDIsum;kk++)//断开历史记录COPY到发送缓冲区
 642   4      					{
 643   5      						SendSbuf1[kk]=XBYTE[kk0+kk];	//
 644   5      					}
 645   4      				}
 646   3      				RamRom_Convert= 1;//切换为RAM628128及IO口操作
 647   3      				RamIO_Convert = 1;
 648   3      				SendSbuf1[32+AIDIsum]='\n';	//字符结束符
 649   3      				DuanKaiTiao--;	//调整断开历史记录条数
 650   3      				if(DuanKaiZhi)	//调整断开历史记录存放位置
 651   3      				{
 652   4      					DuanKaiZhi--;//
 653   4      				}
 654   3      				else
 655   3      				{
 656   4      					DuanKaiZhi=DuanKaiRongL-1;	//断开历史记录条数容量
 657   4      				}
 658   3      				bNeedSend1 = 1;				//启动发送
 659   3      				ReceCount1 = 0;				//串口1接收计数器清零
 660   3      				memset( ReceSbuf1, 0, 20 );		//串口1接收缓冲区清零
 661   3      				return;
 662   3      			}
 663   2      			else	//没有断开历史记录,断开后第一次连上发送实时数据,一条实时,一条历史
 664   2      			{
 665   3      				JiaoTiFlag = 1;		//实时历史记录交替发送标志位
 666   3      				TemLen=32+AIDIsum;	//
 667   3      				typeCom = RTdataAns;
 668   3      				memcpy( SendSbuf1+27,RealTimeData,AIDIsum+12 );//读取实时数据(包括AIDI标志字符)
 669   3      			}
 670   2      			break;
C51 COMPILER V6.02  ZHU19200                                                               07/05/2004 14:20:33 PAGE 12  

 671   2      		case ControlCom:		//遥调遥控命令
 672   2      			typeCom = ControlAns;
 673   2      			ReceConFlag = 1;	//收到控制标志位(闪灯用)
 674   2      			TemLen = 20 + 22;	//
 675   2      			for( i = 27;i < 37;i++)	//保存参数
 676   2      			{
 677   3      				SendSbuf1[i] = ReceSbuf1[i];
 678   3      			}
 679   2      			DotType = 16*toint(ReceSbuf1[27]) + toint(ReceSbuf1[28]);	//测点类型
 680   2      			DotChunnel = 16*toint(ReceSbuf1[31]) + toint(ReceSbuf1[32]);	//接收测点号(测点号不大0xFF)
 681   2      			controlFlag = 1;		//要发控制标志位置一
 682   2      			if( DotType == TypeAO )		//测点量测试
 683   2      			{
 684   3      				if(DotChunnel>AOsum-1)	//?????????是否减1
 685   3      				{
 686   4      					state=0x08;	//参数出错
 687   4      					controlFlag = 0;
 688   4      				}
 689   3      				DotModule = 0x1F-B33ID;	//测点模块
 690   3      			}
 691   2      			else if( DotType == TypeDO )
 692   2      			{
 693   3      				if( DotChunnel>DOsum-1)	//?????????是否减1
 694   3      				{
 695   4      					state=0x08;	//参数出错
 696   4      					controlFlag = 0;
 697   4      				}
 698   3      				for( j = 0;j < Broadsum;j++ )
 699   3      				{
 700   4      					if( DotChunnel < DOarr[j] )
 701   4      					{
 702   5      						DotModule=j;	//查找到模块地址
 703   5      						break;
 704   5      					}
 705   4      					else
 706   4      					{	DotChunnel-=DOarr[j];}
 707   4      				}
 708   3      			}	//测点号错
 709   2      			else					//测点类型校验
 710   2      			{
 711   3      				state=0x07;			//测点类型出错
 712   3      				controlFlag = 0;
 713   3      			}
 714   2      			Dotparam = 4096 * toint(ReceSbuf1[33])+256 * toint(ReceSbuf1[34]) + 16 * toint(ReceSbuf1[35]) + toint(R
             -eceSbuf1[36]);
 715   2      			break;
 716   2      		case HistoryNuCom:	//查询历史记录条数
 717   2      			typeCom = HistoryNuAns;
 718   2      			TemLen= 20 + 12 + 4;	//数据包长度
 719   2      			if(ZhengChTiao>ZhengChRongL)
 720   2      			{
 721   3      				memcpy(SendSbuf1+27,"0000",4);
 722   3      				state = 6;		//参数出错
 723   3      				ZhengChZhi=0;
 724   3      				ZhengChTiao=0;
 725   3      			}
 726   2      			else
 727   2      			{
 728   3      				hex2asc1( SendSbuf1+27,ZhengChTiao);	//曲线历史记录条数
 729   3      			}
 730   2      			break;
 731   2      		case HistoryNoCom:	//查询第n条曲线历史记录
C51 COMPILER V6.02  ZHU19200                                                               07/05/2004 14:20:33 PAGE 13  

 732   2      			kk = 0;
 733   2      			for(i=0;i<4;i++)//存放地址
 734   2      			{
 735   3      				kk=kk*16+toint(ReceSbuf1[27+i]);
 736   3      			}
 737   2      			if(kk>=ZhengChTiao)
 738   2      			{
 739   3      				TemLen= 20 + 12 + 4;	//数据包长度
 740   3      				typeCom=HistoryNoAns;
 741   3      				state=6;
 742   3      				break;
 743   3      			}
 744   2      			AddLed=kk/64+4+(AddLed&0xF0);		//选通扇区
 745   2      			ledled=AddLed;	//选通扇区
 746   2      			kk0 = kk%64*0x400;	//第几条,哪k
 747   2      			if(kk%64<8)
 748   2      			{
 749   3      				for(kk=0;kk<33+AIDIsum;kk++)//断开历史记录COPY到发送缓冲区
 750   3      				{
 751   4      					RamRom_Convert= 0;//切换为RAM628512操作
 752   4      					RamIO_Convert = 0;
 753   4      					data00=XBYTE[kk0+kk];//切换
 754   4      					RamRom_Convert= 1;//切换为RAM628128及IO口操作
 755   4      					RamIO_Convert = 1;
 756   4      					SendSbuf1[kk]=data00;	//
 757   4      				}
 758   3      			}
 759   2      			else
 760   2      			{
 761   3      				RamRom_Convert= 1;//切换为RAM628128及IO口操作
 762   3      				RamIO_Convert = 0;
 763   3      				for(kk=0;kk<33+AIDIsum;kk++)//断开历史记录COPY到发送缓冲区
 764   3      				{
 765   4      					SendSbuf1[kk]=XBYTE[kk0+kk];
 766   4      				}
 767   3      			}
 768   2      			RamRom_Convert= 1;//切换为RAM628128及IO口操作
 769   2      			RamIO_Convert = 1;
 770   2      			SendSbuf1[32+AIDIsum]='\n';	//发送结束符
 771   2      			bNeedSend1 = 1;				//启动发送
 772   2      			ReceCount1 = 0;				//串口1接收计数器清零
 773   2      			memset( ReceSbuf1, 0, 20 );		//串口1接收缓冲区清零
 774   2      			return;					//切换取出曲线历史记录送发送缓冲区
 775   2      		default :
 776   2      			state = 3;		//命令类型有错
 777   2      			break;
 778   2      	}
 779   1      	SendSbuf1[0] = 0x7E;			//起始符
 780   1      	SendSbuf1[1] = VERh;			//版本号
 781   1      	SendSbuf1[2] = VERl;			//版本号
 782   1      	SendSbuf1[3] = 0x30;			//扩展地址(随意)
 783   1      	SendSbuf1[4] = 0x30;
 784   1      	hex2asc0( SendSbuf1 + 5, Read_ID() );	//采集箱地址
 785   1      	hex2asc0( SendSbuf1 + 7, typeCom );	//命令类型
 786   1      	hex2asc0( SendSbuf1 + 9, state );	//返回状态
 787   1      	hex2asc1( SendSbuf1 + 11, TemLen-20 );	//数据块长度
 788   1      	memcpy( SendSbuf1+15, ReceSbuf1+15, 12);//日期时间
 789   1      	SumCheck=CrcCheck(SendSbuf1+1,TemLen-6);//计算CRC
 790   1      	hex2asc1( SendSbuf1+TemLen-5,SumCheck);	//CRC校验
 791   1      	SendSbuf1[TemLen-1] = '\r';		//结束符
 792   1      	SendSbuf1[TemLen] = '\n';		//停止发送符
 793   1      	bNeedSend1 = 1;				//启动发送
C51 COMPILER V6.02  ZHU19200                                                               07/05/2004 14:20:33 PAGE 14  

 794   1      	ReceCount1 = 0;				//串口1接收计数器清零
 795   1      	memset( ReceSbuf1, 0, 20 );		//串口1接收缓冲区清零
 796   1      }
 797          
 798          void Analyse2()
 799          {
 800   1      	uchar data j,i,data00;
 801   1      	uint  data kk,TemLen,kk0;
 802   1      	uchar length, readID, state, typeCom, ReceLen, RTclock[6];
 803   1      	uint SumCheck, ReceCheck;
 804   1      	ReceEndFlag2=0;
 805   1      
 806   1      	if( ReceSbuf2[0] != 0x7E )		//没有数据包头
 807   1      	{
 808   2      		memset( ReceSbuf2, 0, 50 );	//串口2接收缓冲区清零
 809   2      		ReceCount2 = 0;			//串口2接收计数器清零
 810   2      		return;
 811   2      	}
 812   1      
 813   1      	for( i = 0;i < MaxRece2;i++ )		//计算包长度
 814   1      	{
 815   2      		if( ReceSbuf2[i] == '\r')
 816   2      		{
 817   3      			length = i+1;
 818   3      			break;
 819   3      		}
 820   2      	}
 821   1      	if( length < 10 && length > 60 )	//无效数据包
 822   1      	{
 823   2      		memset( ReceSbuf2, 0, 50 );	//串口2接收缓冲区清零
 824   2      		ReceCount2 = 0;	//串口2接收计数器清零
 825   2      		return;
 826   2      	}
 827   1              readID = toint( ReceSbuf2[5] ) * 16 + toint( ReceSbuf2[6] );
 828   1      	if( readID != Read_ID() )
 829   1      	{
 830   2      		memset( ReceSbuf2, 0, 50 );	//串口2接收缓冲区清零
 831   2      		ReceCount2 = 0;			//串口2接收计数器清零
 832   2      		return;	//采集箱的ID号校验
 833   2      	}
 834   1      	SendSbuf2[SendCount2++] = '\r';		//结束上次发送(最好发送)
 835   1      	SendSbuf2[SendCount2] = '\n';		//结束上次发送(结束发送)
 836   1      	state = 0;			//返回状态
 837   1      	if( ReceSbuf2[0] != 0x7E ) state = 1;	//起始符校验
 838   1      	if( ReceSbuf2[1] != VERh && ReceSbuf2[2] != VERl)
 839   1      	{					//版本号校验
 840   2      		state = 2;
 841   2      	}
 842   1      	/*
 843   1      	if( ReceSbuf2[17] >0x31  ||  ReceSbuf2[19] >0x33 ||  ReceSbuf2[21] >0x36 ||  ReceSbuf2[23] >0x36 ||  Rece
             -Sbuf2[25] >0x36)
 844   1      	{
 845   1      		state = 10;			//日期时间错
 846   1      		return;
 847   1      	}
 848   1      	*/
 849   1      	SumCheck=CrcCheck( ReceSbuf2+1,length-6 );	//计算CRC	//接收CRC
 850   1      	ReceCheck=4096 * toint( ReceSbuf2[length-5] )+256 * toint( ReceSbuf2[length-4] )+16 * toint( ReceSbuf2[le
             -ngth-3] )+toint( ReceSbuf2[length-2] );
 851   1      	if( SumCheck != ReceCheck ) state=5;	//crc校验
 852   1      	ReceLen = 0x10*toint( ReceSbuf2[13] ) + toint( ReceSbuf2[14] );
 853   1      	if(ReceLen != length-20)    state=4;	//数据块长度
C51 COMPILER V6.02  ZHU19200                                                               07/05/2004 14:20:33 PAGE 15  

 854   1      	typeCom = 16 * toint( ReceSbuf2[7] ) + toint( ReceSbuf2[8] );
 855   1      	TemLen=0;
 856   1      	if(KaiJiShZhFlag)	//开机时钟校正
 857   1      	{
 858   2      		for(i = 0;i < 12;)	//更新时钟
 859   2      		{
 860   3      			RTclock[i/2]=16 * toint(ReceSbuf2[15+i]) + toint(ReceSbuf2[16+i]);
 861   3                              i+=2;
 862   3      		}
 863   2      		setup_write();		//设置实时时钟操作方式
 864   2      		clock_write(RTclock);	//修改时钟命令
 865   2      		KaiJiShZhFlag=0;
 866   2      	}
 867   1      	switch( typeCom )
 868   1      	{
 869   2      		case ResetCom:			//系统复位命令
 870   2      			typeCom = ResetAns;
 871   2      			TemLen = 32;
 872   2      			ResetAnsFlag = 1;	//复位标志位置一
 873   2      			break;
 874   2      		case ClockCom:	//时钟校正命令
 875   2      			typeCom = ClockAns;
 876   2      			TemLen = 32;
 877   2      			for(i = 0;i < 12;)	//更新时钟
 878   2      			{
 879   3      				RTclock[i/2]=16 * toint(ReceSbuf2[15+i]) + toint(ReceSbuf2[16+i]);
 880   3      				i+=2;
 881   3      			}
 882   2      			setup_write();		//设置实时时钟操作方式
 883   2      			clock_write(RTclock);	//修改时钟命令
 884   2      			for(i=0;i<6;i++)
 885   2      			{
 886   3      				RTclock[i]=0;
 887   3      			}
 888   2      			clock_read(RTclock);	//读修改后的时钟
 889   2      			for(i=0;i<6;i++)	//读取修改后的实时时钟
 890   2      			{
 891   3      				hex2asc0(ReceSbuf2+15+2*i,RTclock[i]);
 892   3      			}
 893   2      			break;
 894   2      		case BaudCom:			//串口设置命令
 895   2      			typeCom = BaudAns;
 896   2      			TemLen = 36;
 897   2      			for( i = 27;i < 31;i++)	//保存参数
 898   2      			{
 899   3      				SendSbuf2[i] = ReceSbuf2[i];
 900   3      			}

⌨️ 快捷键说明

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