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

📄 sl.c

📁 7941916tc35i-SMS_Mcu_Program.rar
💻 C
📖 第 1 页 / 共 5 页
字号:

	// 停止向采集板命令重传
	CAIJI_Resend_Flag = 0;					
	CAIJI_Timer = 0;
	if(WAVE_Resend_Flag == 0)
	{
		TMR3CN &=0xFB;	// 关闭定时器3					
	}
	
	// 设置向监控中心发送的命令报文
	WAVE_Comm_Len = 0;

	if(WAVECOM_Gather == 1)				
	{
		// 发送被动上传数据命令
		{
			// 命令头
			WAVE_Command_Buf[WAVE_Comm_Len++] = WAVE_Send_SeqNr++;			// 命令序列号
			WAVE_Command_Buf[WAVE_Comm_Len++] = 0x00;						// 命令标识
			WAVE_Command_Buf[WAVE_Comm_Len++] = 0x00;						// command [0]
			WAVE_Command_Buf[WAVE_Comm_Len++] = 0x00;						// command [1]
			WAVE_Command_Buf[WAVE_Comm_Len++] = 0x03+CAIJI_Data_Len-0x06;	// 数据长度

			// 中心序号
			WAVE_Command_Buf[WAVE_Comm_Len++] = WAVE_Receive_SeqNr;
			// 尾帧标识			
			WAVE_Command_Buf[WAVE_Comm_Len++] = CAIJI_Data_Buffer[4];			
			// 帧序号
			WAVE_Command_Buf[WAVE_Comm_Len++] = Frame_Num;
			// 送入采集数据
			for(i=0;i<CAIJI_Data_Len - 6;i++)
			{
				WAVE_Command_Buf[WAVE_Comm_Len++] = CAIJI_Data_Buffer[6+i];
			}
		}
	}
	else								
	{
		// 现场定时上传采集数据
		{
			// 命令头
			WAVE_Command_Buf[WAVE_Comm_Len++] = WAVE_Send_SeqNr++;			// 命令报文序列号
			WAVE_Command_Buf[WAVE_Comm_Len++] = 0x00;						// 发送命令标识
			WAVE_Command_Buf[WAVE_Comm_Len++] = 0x00;						// Command[0]
			WAVE_Command_Buf[WAVE_Comm_Len++] = 0x01;						// Command[1]
			WAVE_Command_Buf[WAVE_Comm_Len++] = CAIJI_Data_Len + 3;			// 数据长度

			// 尾帧标识
			WAVE_Command_Buf[WAVE_Comm_Len++] = CAIJI_Data_Buffer[4];
			// 帧序号
			WAVE_Command_Buf[WAVE_Comm_Len++] = Frame_Num;
			// 设置时间
			{
				
				WAVE_Command_Buf[WAVE_Comm_Len++] = 0x14;					// 年(高位)
				CS_RTC = 0;													// 从时间芯片读取时间
				while(RegA & 0x80 != 0x00);
				WAVE_Command_Buf[WAVE_Comm_Len++] = Year;
				WAVE_Command_Buf[WAVE_Comm_Len++] = Month;
				WAVE_Command_Buf[WAVE_Comm_Len++] = Day;
				WAVE_Command_Buf[WAVE_Comm_Len++] = Hour;
				WAVE_Command_Buf[WAVE_Comm_Len++] = Minute;
				WAVE_Command_Buf[WAVE_Comm_Len++] = Second;
				CS_RTC = 1;
				
			}
			// 送入采集数据
			for(i=0;i<CAIJI_Data_Len - 6;i++)
			{
				WAVE_Command_Buf[WAVE_Comm_Len++] = CAIJI_Data_Buffer[6+i];
			}

			// 备份数据
			{
				// 备份长度
				Write_Byte(Current_Add,CAIJI_Data_Len+1);
				Current_Add++;
				// 备份数据
				for(i=0;i<CAIJI_Data_Len+1;i++)
				{
					Write_Byte(Current_Add,WAVE_Command_Buf[7+i]);
					Current_Add++;
				}
			}
		}
	}

	// 向中心发命令
	SEND_DATA_WAVECOM(WAVE_Comm_Len);								// 向监控中心发送数据

	// 设置重传标识
	WAVE_Resend_Flag = 1;										// 设置命令重传标识								
	WAVE_Resend_Num = 0;
	WAVE_Timer = 10;
	TMR3CN |= 0x04;		// 开启定时器3

	// ----------------------------------------------------------
	// 设置后续重发帧
	Frame_Num++;
	if(CAIJI_Data_Buffer[4] == 0)
	{
		// 帧传输结束

		// 清数据采集好标识
		Data_Ready_Flag = 0;
		if(WAVECOM_Gather == 1)
		{
			WAVECOM_Gather = 0;
			if(Time_Gather == 1)
			{
				// 向采集板发送采集命令(类型为定时发送规定的)
				// 命令头
				CAIJI_Comm_Len = 0;
				CAIJI_Command_Buf[CAIJI_Comm_Len++] = CAIJI_Send_SeqNr++;
				CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x55;
				CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x05;
				CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x04;

				// 冲次数
				CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x01;

				// 参量类型
				CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x03;
				CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x08;
				CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x10;
				
				// 发送数据
				SEND_DATA_CAIJI(CAIJI_Comm_Len);

				// 设置命令重传标识	
				CAIJI_Resend_Flag = 1;																	
				CAIJI_Resend_Num = 0;
				CAIJI_Timer = 1;
				TMR3CN |= 0x04;		// 开启定时器3

				// 设置初始帧序号
				Frame_Num = 1;
			}
			else
			{
				Data_Gather_Comm = 0;
			}
		}
		else
		{
			// 清除数据采集标识
			Time_Gather = 0;
			Data_Gather_Comm = 0;
			
			// 设置备份项数和备份数据发送标识
			address = Backup_Index*0x1000;
//			Write_Byte(address,0xAA);				// 标识该帧已发送
			Write_Byte(address,Frame_Num-1);

			// 修改记录号
			if(Backup_Index == 4)
			{
				Backup_Index = 2;
				CS_RTC = 0;
				Record_Ind = 2;
				CS_RTC = 1;
			}
			else
			{
				Backup_Index++;
				CS_RTC = 0;
				Record_Ind = Backup_Index;
				CS_RTC = 1;
			}
		}
	}
}

// 故障通知命令处理
void Trouble_Inform_Comm(void)
{	
	CAIJI_Receive_SeqNr = CAIJI_Data_Buffer[0];							// 保存接收序列号	
	// 停止其它一切的命令及应答
	WAVE_Resend_Flag = 0;												
	WAVE_Timer = 0;
	CAIJI_Resend_Flag = 0;												
	CAIJI_Timer = 0;
	TMR3CN &=0xFB;				// 关闭定时器3

	WAVECOM_Gather = 0;
	Time_Gather = 0;
	Data_Gather_Comm = 0;


	// 向采集板回送应答代码
	CAIJI_Comm_Len = 0;
	CAIJI_Command_Buf[CAIJI_Comm_Len++] = CAIJI_Receive_SeqNr;
	CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0xAA;
	CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x10;
	CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x00;
	SEND_DATA_CAIJI(CAIJI_Comm_Len);

	// 向监控中心发命令代码
	WAVE_Comm_Len = 0;
	WAVE_Command_Buf[WAVE_Comm_Len++] = WAVE_Send_SeqNr++;		// 命令报文序列号
	WAVE_Command_Buf[WAVE_Comm_Len++] = 0x00;					// 发送命令标识
	WAVE_Command_Buf[WAVE_Comm_Len++] = 0x00;					// Command[0]
	WAVE_Command_Buf[WAVE_Comm_Len++] = 0x02;					// Command[1]
	WAVE_Command_Buf[WAVE_Comm_Len++] = 0x08+0x03;				// 数据长度
	WAVE_Command_Buf[WAVE_Comm_Len++] = 0x14;					// 年(高位)

	CS_RTC = 0;													// 从时间芯片读取时间
	while(RegA & 0x80 != 0x00);
	WAVE_Command_Buf[WAVE_Comm_Len++] = Year;
	WAVE_Command_Buf[WAVE_Comm_Len++] = Month;
	WAVE_Command_Buf[WAVE_Comm_Len++] = Day;
	WAVE_Command_Buf[WAVE_Comm_Len++] = Hour;
	WAVE_Command_Buf[WAVE_Comm_Len++] = Minute;
	WAVE_Command_Buf[WAVE_Comm_Len++] = Second;
	CS_RTC = 1;

	WAVE_Command_Buf[WAVE_Comm_Len++] = 0xAA;					// 故障标识
	WAVE_Command_Buf[WAVE_Comm_Len++] = CAIJI_Data_Buffer[4];	// 故障信息
	WAVE_Command_Buf[WAVE_Comm_Len++] = CAIJI_Data_Buffer[5];
	WAVE_Command_Buf[WAVE_Comm_Len++] = CAIJI_Data_Buffer[6];

	WAVE_Resend_Flag = 1;										// 设置命令重传标识								
	WAVE_Resend_Num = 0;
	WAVE_Timer = 10;
	TMR3CN |= 0x04;		// 开启定时器3
}

// 数据准备好命令处理
void Data_Ready_Comm()
{
	if(WAVE_Resend_Flag == 1 || CAIJI_Resend_Flag == 1)
	{
		return;			// 如有数据重发,不作处理
	}

	CAIJI_Receive_SeqNr = CAIJI_Data_Buffer[0];							// 保存接收序列号

	// 向采集板回送应答代码
	CAIJI_Comm_Len = 0;
	CAIJI_Command_Buf[CAIJI_Comm_Len++] = CAIJI_Receive_SeqNr;
	CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0xAA;
	CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x10;
	CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x00;
	SEND_DATA_CAIJI(CAIJI_Comm_Len);

	// 设置数据准备好标识
	Data_Ready_Flag = 1;
}
 
// 向采集板取数据命令
void Get_Data_Comm(void)
{
	CAIJI_Comm_Len = 0;
	CAIJI_Command_Buf[CAIJI_Comm_Len++] = CAIJI_Send_SeqNr++;
	CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x55;
	CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x06;
	CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x01;
	CAIJI_Command_Buf[CAIJI_Comm_Len++] = Frame_Num;

	// 发送数据
	SEND_DATA_CAIJI(CAIJI_Comm_Len);

	// 设置命令重传标识	
	CAIJI_Resend_Flag = 1;																	
	CAIJI_Resend_Num = 0;
	CAIJI_Timer = 1;
	TMR3CN |= 0x04;		// 开启定时器3
}



// --------------------------------------------------------------------------------------------------
// 处理监控中心发来的UDP信息
void WAVE_Rec_Ack(void)
{
	unsigned char i;

	for(i=0;i<WAVE_Receive_Num - 31;i++)
	{
		WAVE_Data_Buffer[i] = RECEIVEBUFFER[29+i];
	}

	switch(WAVE_Data_Buffer[1])			// 命令代码和应答代码分类
	{
		case	0x00:						// 命令代码

			if(WAVE_Resend_Flag == 1 || CAIJI_Resend_Flag == 1 || Data_Gather_Comm == 1)
			{
				return;		// 当前有数据重传或者正在进行数据采集,不应答
			}

			switch(WAVE_Data_Buffer[2])		// 命令类型分类
			{
				case	0x00:						// 参数设置命令	
					
					switch(WAVE_Data_Buffer[3])		
					{	
						case	0x00:				// 设置油井编号和油井冲次
							Machine_Message_Set();
							break;

						case	0x01:				// 设置油管回压超限值
							Pressure_Limit_Set();
							break;

						case	0x02:				// 设置电动机功率超限值
							Power_Limit_Set();
							break;

						case	0x03:				// 设置上传时间
							UP_Timer_Set();
							break;

						case	0x04:				// 设置时间间隔
							Time_Interval_Set();
							break;

						default:
							break;
					}
					
				case	0x01:						// 数据采集命令
					Data_Gather_Set();
					break;

				case	0x02:						// 控制命令
					switch(WAVE_Data_Buffer[3])
					{
						case	0x00:				// 开机命令
							Open_Machine_Comm();
							break;

						case	0x01:				// 关机命令
							Close_Machine_Comm();
							break;

						default:
							break;
					}

				default:
					break;
			}

		case	0x01:		// 应答报文
			if(WAVE_Data_Buffer[0] != WAVE_Send_SeqNr-1)
			{
				return;
			}
			// 清除重发标识
			WAVE_Resend_Flag = 0;
			WAVE_Timer = 0;
			Test_Frame_Answer = 0;

			if(CAIJI_Resend_Flag == 0)
			{
				TMR3CN &=0xFB;         //Stop   Timer3
			}
			break;

		default:
			break;
	}
}

// 油井信息设置命令
void Machine_Message_Set(void)
{
	unsigned char i;
	unsigned char xdata temp[19];

	// 校验长度
	if(WAVE_Data_Buffer[4] != 3)
	{
		return;
	}

	// 备份数据
	for(i=1;i<17;i++)
	{
		temp[i-1] = XBYTE[StartAddress+i];
	}
	// 擦除扇区
	CS_RTC = 1;
	Erase_Sector(StartAddress);

	// 保存发来的序列号
	WAVE_Receive_SeqNr = WAVE_Data_Buffer[0];

	// 恢复前面的数据
	for(i=0;i<6;i++)
	{
		Write_Byte(StartAddress+1+i,temp[i]);
	}
	// 写入修改的数据
	for(i=0;i<2;i++)
	{
		Write_Byte(StartAddress+Machine_Num+i,WAVE_Data_Buffer[5+i]); // 油井编号
	}
	Write_Byte(StartAddress+Machine_Cycle,WAVE_Data_Buffer[7]);		  // 油井冲次
	// 恢复后面的数据
	for(i=9;i<16;i++)
	{
		Write_Byte(StartAddress+1+i,temp[i]);
	}
	Write_Byte(StartAddress,0xAA);								// 设置FLASH设置标识位

	// 向监控中心发应答信息
	WAVE_Comm_Len = 0;
	WAVE_Command_Buf[WAVE_Comm_Len++] = WAVE_Receive_SeqNr;		// 应答序列号
	WAVE_Command_Buf[WAVE_Comm_Len++] = 0x01;					// 应答命令标识
	WAVE_Command_Buf[WAVE_Comm_Len++] = 0x00;					// 状态
	WAVE_Command_Buf[WAVE_Comm_Len++] = 0x00;					// 长度
	SEND_DATA_WAVECOM(WAVE_Comm_Len);							// 向监控中心发送数据

	// 向采集板发送设置参数
	CAIJI_Comm_Len = 0;
	CAIJI_Command_Buf[CAIJI_Comm_Len++] = CAIJI_Send_SeqNr++;
	CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x55;
	CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x00;
	CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x01;
	CAIJI_Command_Buf[CAIJI_Comm_Len++] = WAVE_Data_Buffer[7];
	SEND_DATA_CAIJI(CAIJI_Comm_Len);

	// 设置重发标识
	CAIJI_Resend_Flag = 1;
	CAIJI_Timer = 1;
	CAIJI_Resend_Num =0 ;
	TMR3CN |= 0x04;		// 开启定时器3
}


// 油管回压超限值设置命令
void Pressure_Limit_Set(void)
{
	unsigned char i;
	unsigned char xdata temp[19];

	// 校验长度
	if(WAVE_Data_Buffer[4] != 0x02)
	{
		return;
	}
	
	// 备份数据
	for(i=1;i<17;i++)
	{
		temp[i-1] = XBYTE[StartAddress+i];
	}
	// 擦除扇区
	CS_RTC = 1;
	Erase_Sector(StartAddress);

	// 保存发来底序列号
	WAVE_Receive_SeqNr = WAVE_Data_Buffer[0];

	// 恢复前面的数据
	for(i=0;i<9;i++)
	{
		Write_Byte(StartAddress+1+i,temp[i]);
	}
	// 写入修改的数据
	for(i=0;i<2;i++)
	{
		Write_Byte(StartAddress+Pressure_Limit+i,WAVE_Data_Buffer[5+i]);		 //	油管回压超限值
	}
	// 恢复后面的数据
	for(i=11;i<16;i++)
	{
		Write_Byte(StartAddress+1+i,temp[i]);
	}
	Write_Byte(StartAddress,0xAA);								// 设置FLASH设置标识

⌨️ 快捷键说明

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