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

📄 zhu1126_96.c

📁 动力环境监控系统 动力环境监控系统
💻 C
📖 第 1 页 / 共 3 页
字号:
		case ClockCom:	//时钟校正命令
			typeCom = ClockAns;
			TemLen = 20 + 12;
			for(i = 0;i < 12;)	//更新时钟
			{
				RTclock[i/2]=16 * toint(ReceSbuf1[15+i]) + toint(ReceSbuf1[16+i]);
				i+=2;
			}
			setup_write();		//设置实时时钟操作方式
			clock_write(RTclock);	//修改时钟命令
			for(i=0;i<6;i++)
			{
				RTclock[i]=0;
			}
			clock_read(RTclock);	//读修改后的时钟
			for(i=0;i<6;i++)	//读取修改后的实时时钟
			{
				hex2asc0(ReceSbuf1+15+2*i,RTclock[i]);
			}
			break;
		case BaudCom:			//串口设置命令
			typeCom = BaudAns;
			TemLen = 20 + 16;
			for( i = 27;i < 31;i++)	//保存参数
			{
				SendSbuf1[i] = ReceSbuf1[i];
			}
			BaudAnsFlag = 1;	//波特率修改标志位置一
			ReceCheck = 4096 * toint(ReceSbuf1[27]) + 256 * toint(ReceSbuf1[28]) + 16 * toint(ReceSbuf1[29]) + toint(ReceSbuf1[30]);
			switch( ReceCheck )	//是否是正确的波特率
			{
				case	1200:	NewBaud=1;break;
				case	2400:	NewBaud=2;break;
				case	4800:	NewBaud=3;break;
				case	9600:	NewBaud=4;break;
				case	19200:	NewBaud=5;break;
				default	:
					state= 06 ;
					NewBaud = 0;
					BaudAnsFlag = 0;
					break;
			}
			portBaud = 1 ;		//要修改波特率的串口
			break;
		case RTdataCom:			//实时数据命令
			if(DuanKaiTiao&&JiaoTiFlag)	//有断开历史记录,该发送断开历史记录
			{
				JiaoTiFlag = 0;		//实时历史记录交替发送标志位
				AddLed=(AddLed&0xF0)+DuanKaiZhi/64;	//确定扇区
				ledled = AddLed;	//选通扇区
				kk0=DuanKaiZhi%64*0x400;	//第几条,哪k
				if(DuanKaiZhi%64<8)
				{
					for(kk=0;kk<33+AIDIsum;kk++)//断开历史记录COPY到发送缓冲区
					{
						RamRom_Convert= 0;//切换为RAM628512操作
						RamIO_Convert = 0;
						data00=XBYTE[kk0+kk];//切换
						RamRom_Convert= 1;//切换为RAM628128及IO口操作
						RamIO_Convert = 1;
						SendSbuf1[kk]=data00;	//
					}
				}
				else
				{
					RamRom_Convert= 1;//切换为RAM628128及IO口操作
					RamIO_Convert = 0;
					for(kk=0;kk<33+AIDIsum;kk++)//断开历史记录COPY到发送缓冲区
					{
						SendSbuf1[kk]=XBYTE[kk0+kk];	//
					}
				}
				RamRom_Convert= 1;//切换为RAM628128及IO口操作
				RamIO_Convert = 1;
				SendSbuf1[32+AIDIsum]='\n';	//字符结束符
				DuanKaiTiao--;	//调整断开历史记录条数
				if(DuanKaiZhi)	//调整断开历史记录存放位置
				{
					DuanKaiZhi--;//
				}
				else
				{
					DuanKaiZhi=DuanKaiRongL-1;	//断开历史记录条数容量
				}
				bNeedSend1 = 1;				//启动发送
				ReceCount1 = 0;				//串口1接收计数器清零
				memset( ReceSbuf1, 0, 20 );		//串口1接收缓冲区清零
				return;
			}
			else	//没有断开历史记录,断开后第一次连上发送实时数据,一条实时,一条历史
			{
				JiaoTiFlag = 1;		//实时历史记录交替发送标志位
				TemLen=32+AIDIsum;	//
				typeCom = RTdataAns;
				memcpy( SendSbuf1+27,RealTimeData,AIDIsum+12 );//读取实时数据(包括AIDI标志字符)
			}
			break;
		case ControlCom:		//遥调遥控命令
			typeCom = ControlAns;
			ReceConFlag = 1;	//收到控制标志位(闪灯用)
			TemLen = 20 + 22;	//
			for( i = 27;i < 37;i++)	//保存参数
			{
				SendSbuf1[i] = ReceSbuf1[i];
			}
			DotType = 16*toint(ReceSbuf1[27]) + toint(ReceSbuf1[28]);	//测点类型
			DotChunnel = 16*toint(ReceSbuf1[31]) + toint(ReceSbuf1[32]);	//接收测点号(测点号不大0xFF)
			controlFlag = 1;		//要发控制标志位置一
			if( DotType == TypeAO )		//测点量测试
			{
				if(DotChunnel>AOsum-1)	//?????????是否减1
				{
					state=0x08;	//参数出错
					controlFlag = 0;
				}
				DotModule = 0x1F-B33ID;	//测点模块
			}
			else if( DotType == TypeDO )
			{
				if( DotChunnel>DOsum-1)	//?????????是否减1
				{
					state=0x08;	//参数出错
					controlFlag = 0;
				}
				for( j = 0;j < Broadsum;j++ )
				{
					if( DotChunnel < DOarr[j] )
					{
						DotModule=j;	//查找到模块地址
						break;
					}
					else
					{	DotChunnel-=DOarr[j];}
				}
			}	//测点号错
			else					//测点类型校验
			{
				state=0x07;			//测点类型出错
				controlFlag = 0;
			}
			Dotparam = 4096 * toint(ReceSbuf1[33])+256 * toint(ReceSbuf1[34]) + 16 * toint(ReceSbuf1[35]) + toint(ReceSbuf1[36]);
			break;
		case HistoryNuCom:	//查询历史记录条数
			typeCom = HistoryNuAns;
			TemLen= 20 + 12 + 4;	//数据包长度
			if(ZhengChTiao>ZhengChRongL)
			{
				memcpy(SendSbuf1+27,"0000",4);
				state = 6;		//参数出错
				ZhengChZhi=0;
				ZhengChTiao=0;
			}
			else
			{
				hex2asc1( SendSbuf1+27,ZhengChTiao);	//曲线历史记录条数
			}
			break;
		case HistoryNoCom:	//查询第n条曲线历史记录
			kk = 0;
			for(i=0;i<4;i++)//存放地址
			{
				kk=kk*16+toint(ReceSbuf1[27+i]);
			}
			if(kk>=ZhengChTiao)
			{
				TemLen= 20 + 12 + 4;	//数据包长度
				typeCom=HistoryNoAns;
				state=6;
				break;
			}
			AddLed=kk/64+4+(AddLed&0xF0);		//选通扇区
			ledled=AddLed;	//选通扇区
			kk0 = kk%64*0x400;	//第几条,哪k
			if(kk%64<8)
			{
				for(kk=0;kk<33+AIDIsum;kk++)//断开历史记录COPY到发送缓冲区
				{
					RamRom_Convert= 0;//切换为RAM628512操作
					RamIO_Convert = 0;
					data00=XBYTE[kk0+kk];//切换
					RamRom_Convert= 1;//切换为RAM628128及IO口操作
					RamIO_Convert = 1;
					SendSbuf1[kk]=data00;	//
				}
			}
			else
			{
				RamRom_Convert= 1;//切换为RAM628128及IO口操作
				RamIO_Convert = 0;
				for(kk=0;kk<33+AIDIsum;kk++)//断开历史记录COPY到发送缓冲区
				{
					SendSbuf1[kk]=XBYTE[kk0+kk];
				}
			}
			RamRom_Convert= 1;//切换为RAM628128及IO口操作
			RamIO_Convert = 1;
			SendSbuf1[32+AIDIsum]='\n';	//发送结束符
			bNeedSend1 = 1;				//启动发送
			ReceCount1 = 0;				//串口1接收计数器清零
			memset( ReceSbuf1, 0, 20 );		//串口1接收缓冲区清零
			return;					//切换取出曲线历史记录送发送缓冲区
		default :
			state = 3;		//命令类型有错
			break;
	}
	SendSbuf1[0] = 0x7E;			//起始符
	SendSbuf1[1] = VERh;			//版本号
	SendSbuf1[2] = VERl;			//版本号
	SendSbuf1[3] = 0x30;			//扩展地址(随意)
	SendSbuf1[4] = 0x30;
	hex2asc0( SendSbuf1 + 5, Read_ID() );	//采集箱地址
	hex2asc0( SendSbuf1 + 7, typeCom );	//命令类型
	hex2asc0( SendSbuf1 + 9, state );	//返回状态
	hex2asc1( SendSbuf1 + 11, TemLen-20 );	//数据块长度
	memcpy( SendSbuf1+15, ReceSbuf1+15, 12);//日期时间
	SumCheck=CrcCheck(SendSbuf1+1,TemLen-6);//计算CRC
	hex2asc1( SendSbuf1+TemLen-5,SumCheck);	//CRC校验
	SendSbuf1[TemLen-1] = '\r';		//结束符
	SendSbuf1[TemLen] = '\n';		//停止发送符
	bNeedSend1 = 1;				//启动发送
	ReceCount1 = 0;				//串口1接收计数器清零
	memset( ReceSbuf1, 0, 20 );		//串口1接收缓冲区清零
}

void Analyse2()
{
	uchar data j,i,data00;
	uint  data kk,TemLen,kk0;
	uchar length, readID, state, typeCom, ReceLen, RTclock[6];
	uint SumCheck, ReceCheck;
	ReceEndFlag2=0;

	if( ReceSbuf2[0] != 0x7E )		//没有数据包头
	{
		memset( ReceSbuf2, 0, 50 );	//串口2接收缓冲区清零
		ReceCount2 = 0;			//串口2接收计数器清零
		return;
	}

	for( i = 0;i < MaxRece2;i++ )		//计算包长度
	{
		if( ReceSbuf2[i] == '\r')
		{
			length = i+1;
			break;
		}
	}
	if( length < 10 && length > 60 )	//无效数据包
	{
		memset( ReceSbuf2, 0, 50 );	//串口2接收缓冲区清零
		ReceCount2 = 0;	//串口2接收计数器清零
		return;
	}
        readID = toint( ReceSbuf2[5] ) * 16 + toint( ReceSbuf2[6] );
	if( readID != Read_ID() )
	{
		memset( ReceSbuf2, 0, 50 );	//串口2接收缓冲区清零
		ReceCount2 = 0;			//串口2接收计数器清零
		return;	//采集箱的ID号校验
	}
	SendSbuf2[SendCount2++] = '\r';		//结束上次发送(最好发送)
	SendSbuf2[SendCount2] = '\n';		//结束上次发送(结束发送)
	state = 0;			//返回状态
	if( ReceSbuf2[0] != 0x7E ) state = 1;	//起始符校验
	if( ReceSbuf2[1] != VERh && ReceSbuf2[2] != VERl)
	{					//版本号校验
		state = 2;
	}
	/*
	if( ReceSbuf2[18] >0x36  ||  ReceSbuf2[19] >0x36 ||  ReceSbuf2[21] >0x36 ||  ReceSbuf2[23] >0x36 ||  ReceSbuf2[25] >0x36)
	{
		state = 10;			//日期时间错
		return;
	}*/
	SumCheck=CrcCheck( ReceSbuf2+1,length-6 );	//计算CRC	//接收CRC
	ReceCheck=4096 * toint( ReceSbuf2[length-5] )+256 * toint( ReceSbuf2[length-4] )+16 * toint( ReceSbuf2[length-3] )+toint( ReceSbuf2[length-2] );
	if( SumCheck != ReceCheck ) state=5;	//crc校验
	ReceLen = 0x10*toint( ReceSbuf2[13] ) + toint( ReceSbuf2[14] );
	if(ReceLen != length-20)    state=4;	//数据块长度
	typeCom = 16 * toint( ReceSbuf2[7] ) + toint( ReceSbuf2[8] );
	TemLen=0;
	if(KaiJiShZhFlag)	//开机时钟校正
	{
		for(i = 0;i < 12;)	//更新时钟
		{
			RTclock[i/2]=16 * toint(ReceSbuf2[15+i]) + toint(ReceSbuf2[16+i]);
                        i+=2;
		}
		setup_write();		//设置实时时钟操作方式
		clock_write(RTclock);	//修改时钟命令
		KaiJiShZhFlag=0;
	}
	switch( typeCom )
	{
		case ResetCom:			//系统复位命令
			typeCom = ResetAns;
			TemLen = 32;
			ResetAnsFlag = 1;	//复位标志位置一
			break;
		case ClockCom:	//时钟校正命令
			typeCom = ClockAns;
			TemLen = 32;
			for(i = 0;i < 12;)	//更新时钟
			{
				RTclock[i/2]=16 * toint(ReceSbuf2[15+i]) + toint(ReceSbuf2[16+i]);
				i+=2;
			}
			setup_write();		//设置实时时钟操作方式
			clock_write(RTclock);	//修改时钟命令
			for(i=0;i<6;i++)
			{
				RTclock[i]=0;
			}
			clock_read(RTclock);	//读修改后的时钟
			for(i=0;i<6;i++)	//读取修改后的实时时钟
			{
				hex2asc0(ReceSbuf2+15+2*i,RTclock[i]);
			}
			break;
		case BaudCom:			//串口设置命令
			typeCom = BaudAns;
			TemLen = 36;
			for( i = 27;i < 31;i++)	//保存参数
			{
				SendSbuf2[i] = ReceSbuf2[i];
			}
			BaudAnsFlag = 1;	//波特率修改标志位置一
			ReceCheck = 4096 * toint(ReceSbuf2[27]) + 256 * toint(ReceSbuf2[28]) + 16 * toint(ReceSbuf2[29]) + toint(ReceSbuf2[30]);
			switch( ReceCheck )	//是否是正确的波特率
			{
				case	1200:	NewBaud=1;break;
				case	2400:	NewBaud=2;break;
				case	4800:	NewBaud=3;break;
				case	9600:	NewBaud=4;break;
				case	19200:	NewBaud=5;break;
				default	:
					state = 06;
					NewBaud = 0;
					BaudAnsFlag = 0;
					break;
			}
			portBaud = 2 ;		//要修改波特率的串口
			break;
		case RTdataCom:			//实时数据命令
			if(DuanKaiTiao&&JiaoTiFlag)	//有断开历史记录,该发送断开历史记录
			{
				JiaoTiFlag = 0;		//实时历史记录交替发送标志位
				AddLed=(DuanKaiZhi/64)+(AddLed&0xF0);//确定扇区
				ledled = AddLed;	//选通扇区
				kk0=DuanKaiZhi%64*0x400;	//第几条,哪k
				if(DuanKaiZhi%64<8)
				{
					for(kk=0;kk<33+AIDIsum;kk++)//断开历史记录COPY到发送缓冲区
					{
						RamRom_Convert= 0;//切换为RAM628512操作
						RamIO_Convert = 0;
						data00=XBYTE[kk0+kk];//切换
						RamRom_Convert= 1;//切换为RAM628128及IO口操作
						RamIO_Convert = 1;
						SendSbuf2[kk]=data00;	//
					}
				}
				else
				{
					RamRom_Convert= 1;//切换为RAM628512操作
					RamIO_Convert = 0;
					for(kk=0;kk<33+AIDIsum;kk++)//断开历史记录COPY到发送缓冲区
					{
						SendSbuf2[kk]=XBYTE[kk0+kk];	//
					}
				}
				RamRom_Convert= 1;//切换为RAM628512操作
				RamIO_Convert = 1;
				SendSbuf2[32+AIDIsum]='\n';	//字符结束符
				DuanKaiTiao--;	//调整断开历史记录条数
				if(DuanKaiZhi)	//调整断开历史记录存放位置
				{
					DuanKaiZhi--;//
				}
				else
				{
					DuanKaiZhi=DuanKaiRongL-1;	//断开历史记录条数容量
				}
				bNeedSend2 = 1;				//启动发送
				ReceCount2 = 0;				//串口1接收计数器清零
				memset( ReceSbuf2, 0, 10 );		//串口1接收缓冲区清零
				return;
			}
			else	//没有断开历史记录,断开后第一次连上发送实时数据,一条实时,一条历史
			{
				JiaoTiFlag = 1;		//实时历史记录交替发送标志位
				TemLen= 32+AIDIsum;	//数据包长度
				typeCom = RTdataAns;
				memcpy( SendSbuf2+27,RealTimeData,AIDIsum+12 );//读取实时数据(包括AIDI标志字符)
			}
			break;
		case ControlCom:		//遥调遥控命令
			typeCom = ControlAns;
			ReceConFlag = 1;		//收到控制标志位(闪灯用)
			TemLen = 20 + 22;	//
			for( i = 27;i < 37;i++)	//保存参数
			{
				SendSbuf2[i] = ReceSbuf2[i];
			}
			DotType = 16 * toint(ReceSbuf2[27]) + toint(ReceSbuf2[28]);	//测点类型
			DotChunnel = 16 * toint(ReceSbuf2[31]) + toint(ReceSbuf2[32]);	//接收测点号(测点号不大0xFF)
			controlFlag = 1;		//要发控制标志位置一
			if( DotType == TypeAO )		//测点量测试
			{
				if(DotChunnel>AOsum-1)	//?????????是否减1
				{
					state=0x08;	//参数出错
					controlFlag = 0;
				}
				DotModule = 0x1F-B33ID;	//测点模块
			}
			else if( DotType == TypeDO )
			{
				if( DotChunnel>DOsum-1)	//?????????是否减1
				{
					state=0x08;	//参数出错
					controlFlag = 0;
				}
				for( j = 0;j < Broadsum;j++ )
				{
					if( DotChunnel < DOarr[j] )
					{
						DotModule=j;	//查找到模块地址
						break;
					}
					else
					{	DotChunnel-=DOarr[j];}
				}
			}	//测点号错
			else					//测点类型校验
			{
				state=0x07;			//测点类型出错
				controlFlag = 0;
			}
			Dotparam = 4096 * toint(ReceSbuf2[33])+256 * toint(ReceSbuf2[34]) + 16 * toint(ReceSbuf2[35]) + toint(ReceSbuf2[36]);
			break;
		case HistoryNuCom:	//查询历史记录条数
			typeCom = HistoryNuAns;
			TemLen= 20 + 12 + 4;	//数据包长度
			if(ZhengChTiao>ZhengChRongL)
			{
				memcpy(SendSbuf2+27,"0000",4);
				state = 6;		//参数出错
				ZhengChZhi=0;
				ZhengChTiao=0;
			}
			else
			{
				hex2asc1( SendSbuf2+27,ZhengChTiao);	//曲线历史记录条数
			}
			break;
		case HistoryNoCom:	//查询第n条曲线历史记录
			kk = 0;
			for(i=0;i<4;i++)//存放地址
			{
				kk=kk*16+toint(ReceSbuf2[27+i]);
			}
			if(kk>=ZhengChTiao)
			{
				TemLen= 36;	//数据包长度
				typeCom=HistoryNoAns;
				state=6;
				break;
			}
			AddLed = (AddLed&0xF0)+kk/64+4;		//选通扇区
			ledled = AddLed;	//选通扇区
			kk0 = kk%64*0x400;	//第几条,哪k
			if(kk%64<8)
			{
				for(kk=0;kk<AIDIsum+33;kk++)//断开历史记录COPY到发送缓冲区
				{
					RamRom_Convert= 0;//切换为RAM628512操作
					RamIO_Convert = 0;
					data00=XBYTE[kk0+kk];//切换
					RamRom_Convert= 1;//切换为RAM628128及IO口操作
					RamIO_Convert = 1;
					SendSbuf2[kk]=data00;	//
				}
			}
			else
			{
				RamRom_Convert= 1;//切换为RAM628128及IO口操作
				RamIO_Convert = 0;
				for(kk=0;kk<AIDIsum+33;kk++)//断开历史记录COPY到发送缓冲区
				{
					SendSbuf2[kk]=XBYTE[kk0+kk];	//
				}
			}
			RamRom_Convert= 1;//切换为RAM628512操作
			RamIO_Convert = 1;
			SendSbuf2[AIDIsum+32]='\n';
			bNeedSend2 = 1;				//启动发送
			ReceCount2 = 0;				//串口1接收计数器清零
			memset( ReceSbuf2, 0, 20 );		//串口1接收缓冲区清零
			return;					//切换取出曲线历史记录送发送缓冲区
		default :
			state = 3;		//命令类型有错
			break;
	}
	SendSbuf2[0] = 0x7E;			//起始符
	SendSbuf2[1] = VERh;			//版本号
	SendSbuf2[2] = VERl;			//版本号
	SendSbuf2[3] = 0x30;			//扩展地址(随意)
	SendSbuf2[4] = 0x30;
	hex2asc0( SendSbuf2 + 5, Read_ID() );	//采集箱地址
	hex2asc0( SendSbuf2 + 7, typeCom );	//命令类型
	hex2asc0( SendSbuf2 + 9, state );	//返回状态
	hex2asc1( SendSbuf2 + 11, TemLen-20 );	//数据块长度
	memcpy( SendSbuf2+15, ReceSbuf2+15, 12);	//日期时间
	SumCheck=CrcCheck(SendSbuf2+1,TemLen-6);//计算CRC
	hex2asc1( SendSbuf2+TemLen-5,SumCheck);	//CRC校验
	SendSbuf2[TemLen-1] = '\r';		//结束符
	SendSbuf2[TemLen] = '\n';		//停止发送符
	bNeedSend2 = 1;				//启动发送
	ReceCount2 = 0;				//串口0接收计数器清零
	memset( ReceSbuf2, 0, 20 );		//串口2接收缓冲区清零
}


void TurnOnCom(uchar call00)		//轮询点名,参数是板地址
{
	uchar leni=0;
	uint  crci;
	uchar xdata PreSbuf00[] = "04100000000\r\n";
	PreSbuf00[0] = 0x1F - call00;	//从模块地址
	crci = CrcCheck(PreSbuf00, 7);	//CRC校验
	hex2asc1( PreSbuf00+7, crci);	//crc校验高八bits
	memcpy( SendSbuf0, PreSbuf00, sizeof(PreSbuf00) );//送发送缓冲区
	SendCount0 = 0;
	ReceCount0 = 0;
	TB8 = 1;			//发送地址
	SBUF = SendSbuf0[SendCount0++];	//启动发送
	lockFlagDn = 1;			//下发上锁
}

void ControlComm()		//下发遥控遥调命令
{
	uchar leni=0;
	uint  crci;
	uchar xdata PreSbuf00[]="0430008HHHHGGGG0000\r\n";
	controlFlag = 0;
	PreSbuf00[0]=0x1F-DotModule;		//从模块地址
	hex2asc0( PreSbuf00 + 7, DotType );	//测点类型
	hex2asc0( PreSbuf00 + 9, DotChunnel );	//测点通道
	hex2asc1( PreSbuf00 + 11, Dotparam );	//测点参数
	crci=CrcCheck( PreSbuf00, 15 );		//CRC校验
	hex2asc1( PreSbuf00 + 15,crci );	//crc校验;
	memcpy( SendSbuf0, PreSbuf00, sizeof(PreSbuf00) );//送发送缓冲区
	ReceCount0 = 0;
	SendCount0 = 0;
	TB8 = 1;			//发送地址
	SBUF = SendSbuf0[SendCount0++];	//启动发送
	lockFlagDn = 1;			//下发上锁
}

void timeout0()	//超时,送FFFF无效数据
{
	FalseTime0=0;
	memset(RealTimeData+6,0x46,B00AI*4);		//AI量
	memset(RealTimeData+AIsum+12,0x46,B00DI/2);		//DI量
}

void timeout1()	//超时,送FFFF无效数据
{
	FalseTime1=0;
	memset(RealTimeData+6+B00AI*4,0x46,B11AI*4);	//AI量
}

⌨️ 快捷键说明

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