/*  Created: 2022/11/4 11:02:40
 *  Author:  wangzk zhengmengxing
 */ 

#include 	"AttCtrlMain.h"
#include	"..\PrjTelmMng\TelmMng.h"		/* 载荷异步包通知指令相关 */

/***********************************************************************/
sTaskInfo	*m_pZKTaskInfo;					/*任务结构指针,已经初始化完毕为未用*/

//安装矩阵
static const TYPE_CAL M_SSA[3][3] = {{0.3420F,-0.2114F,-0.9156F},{-0.9397F,-0.0769F,-0.3333F},{-0.0000F,0.9744F,-0.2250F}};
static const TYPE_CAL M_SSB[3][3] = {{1.0000F,0.0F, 0.0F},{0.0F,-0.2250F,-0.9744F},{0.0F,0.9744F,-0.2250F}};
//static const TYPE_CAL M_SSC[3][3] ={{0.3214F,-0.3420F,0.8830F},{-0.1170F,-0.9397F,-0.3214F},{0.9397F, 0.0000F,-0.3420F}};
static const TYPE_CAL M_SSC[3][3] ={{0.2962F,-0.5F,0.8138F},{-0.1710F,-0.8660F,-0.4698F},{0.9397F, 0.0000F,-0.3420F}};
//static const TYPE_CAL M_GYROA[3][3] = {{-0.0000F,1.0000F,-0.0000F} , {1.0000F,0.0000F,0.0000F},{0.0000F,0.0F,-1.0000F}};
//static const TYPE_CAL M_GYROB[3][3] = {{-0.0000F,1.0000F, -0.0000F},{1.0000F,0.0000F,0.0000F},{0.0000F,0.0F,-1.0000F}};
static const TYPE_CAL M_GYROA[3][3] = {{-1.0000F,0.0000F,0.0000F}, {0.0000F,1.0000F,0.0000F},{0.0000F,0.0F,-1.0000F}};
static const TYPE_CAL M_GYROB[3][3] = {{-1.0000F,0.0000F,0.0000F}, {0.0000F,1.0000F,0.0000F},{0.0000F,0.0F,-1.0000F}};

static const TYPE_CAL M_GYROC[3][3] = {{0.0000F,-1.0000F,0.0F},{1.0000F,0.0000F,0.0F},{0.0F,0.0F,1.0000F}};
static const TYPE_CAL M_aSSA[3][3] = { { 0.0F, -0.6427876F, 0.7660444F },{ 0.0F, -0.7660444F ,-0.6427876F },{ 1.0F, 0.0F ,0.0F } };			//模拟太敏A
static const TYPE_CAL M_aSSB[3][3] = { { 0.0F, -0.6427876F, -0.7660444F },{ 0.0F, 0.7660444F ,-0.6427876F },{ 1.0F, 0.0F ,0.0F } };			//模拟太敏B
static const TYPE_CAL M_aSSC[3][3] = { {-0.8660254F ,0.0F, 0.5F },{ 0.5F, 0.0F ,0.8660254F },{ 0.0F ,1.0F ,0.0F } };						//模拟太敏C
static const TYPE_CAL M_aSSD[3][3] = { {0.0F,0.8660254F, -0.5F },{ 0.0F, 0.5F ,0.8660254F },{ 1.0F ,0.0F ,0.0F } };							//模拟太敏D
static const TYPE_CAL M_aSSE[3][3] = { { 0.0F,1.0F, 0.0F },{ 1.0F,0.0F,0.0F },{ 0.0F, 0.0F ,-1.0F } };										//模拟太敏E
static const TYPE_CAL M_aSSF[3][3] = { { -1.0F,0.0F,0.0F },{ 0.0F,0.0F,1.0F},{ 0.0F,1.0F,0.0F } };
static const TYPE_CAL M_MAG1[3][3] = { { 1.0F,0.0F,0.0F },{ 0.0F,-1.0F,0.0F },{ 0.0F,0.0F,-1.0F } };										//磁强计安装矩阵
static const TYPE_CAL M_MAG2[3][3] = { { 1.0F,0.0F,0.0F },{ 0.0F,-1.0F,0.0F },{ 0.0F,0.0F,-1.0F } };										//磁强计安装矩阵
static const TYPE_CAL M_MAGCtrl[3][4] = { { 1.0F,0.0F,0.0F,0.0F },{ 0.0F,1.0F,0.0F,0.0F},{ 0.0F,0.0F,1.0F,1.0F} };							//磁力矩器安装矩阵
static const TYPE_CAL M_Wheel[3][4] = { { -1.0F,0.0F,0.0F,0.4912F },{ 0.0F,-1.0F,0.0F,-0.4912F},{ 0.0F,0.0F,-1.0F,-0.7193F} };	

/***********************************************
说明：用于星箭分离后 姿控敏感器和执行器加电
注意:
***********************************************/
void	ZKDptPowerOnPrc(void)
{
	sAttPriData *tmpAtt = NULL;	
	sTaskMngDataRecord   *tmpTaskMngDataRcd = NULL;
	
	tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR;
	tmpTaskMngDataRcd = (sTaskMngDataRecord *)ST_TASKMNG_ADDR;
	
	if((NULL == tmpAtt) || (NULL == tmpTaskMngDataRcd))
	{
		return;
	}
	
	/*分离后加电，星务模块中连续判硬件分离标志5s后，设置软件分离标志为分离0x55， 此处判软分离标志连续5s*/
	if(0x55 != tmpTaskMngDataRcd->bSHDepart)
	{
		//ZKModDoSet(ATTMOD_BREAKPRE);
		tmpAtt->sModePara.ZKPowOnFirst = 0x55;
		tmpAtt->sModePara.WModCnt1 = 0;
	}
	else
	{
		if(tmpAtt->sModePara.WModCnt1 <= 60000)
			tmpAtt->sModePara.WModCnt1++;
	}
	
	/*卫星分离，加电电机：星敏感器A1/A2/B、磁强计A/B、陀螺A/B/C、GNSS、反作用轮X/Y/Z/S、SADA主份、电推*/
	if((0x55 == tmpTaskMngDataRcd->bSHDepart) /*分离 */
		&& (tmpAtt->sModePara.WModCnt1 >= 5)			  /*且 切判软件分离标志连续5s有效*/
		&& (0x55 == tmpAtt->sModePara.ZKPowOnFirst)      /*且 由未分离 到 分离 */
		)
	{
		if (0x00 == tmpAtt->sModePara.ZKPowOnStep)
		{
			//星敏A/B/C加电
			OCOut(OC74_STA_ON, 0, 16);
			OCOut(OC76_STB_ON, 0, 16);
			OCOut(OC78_STC_ON, 0, 16);
					
			//陀螺
			OCOut(OC66_GYROA_ON, 0, 16);
			OCOut(OC69_GYROB_ON, 0, 16);
			OCOut(OC71_GYROC_ON, 0, 16);
					
			//磁强计
			OCOut(OC94_CQJA_ON, 0, 16);
			OCOut(OC96_CQJB_ON, 0, 16);
			//GNS
			//OCOut(OC79_GNSSA_ON, 0, 16);
			//ZKModDoSet(ATTMOD_NOCOLL);
			tmpAtt->sModePara.ZKPowOnStep = 0x11;
		} 
		else if (0x11 == tmpAtt->sModePara.ZKPowOnStep)
		{
			//飞轮A加电
			OCOut(OC58_WHLX_ON, 0, 16);
			tmpAtt->sModePara.ZKPowOnStep = 0x22;
		}
		else if (0x22 == tmpAtt->sModePara.ZKPowOnStep)
		{
			//飞轮B加电
			OCOut(OC60_WHLY_ON, 0, 16);
			tmpAtt->sModePara.ZKPowOnStep = 0x33;
		}
		else if (0x33 == tmpAtt->sModePara.ZKPowOnStep)
		{
			//飞轮C加电
			OCOut(OC62_WHLZ_ON, 0, 16);	
			tmpAtt->sModePara.ZKPowOnStep = 0x44;		
		}
		else if (0x44 == tmpAtt->sModePara.ZKPowOnStep)
		{
			//飞轮D加电
			OCOut(OC64_WHLS_ON, 0, 16);
			tmpAtt->sModePara.ZKPowOnStep = 0x55;
			tmpAtt->sModePara.ZKPowOnFirst = 0x00;
		}
	}
}

/***********************************************
说明：初始化采集进程需要的硬件和软件
输入：无
输出：TRUE / FALSE
返回：初始化结果
注意：仅仅初始化各设备连接的数据采集部分
***********************************************/
BOOL	AttCtrlInit(UINT8 taskID)
{
	UINT8	i = 0x00;
	UINT8	j = 0x00;
	UINT8	k = 0x00;
	UINT8	PPUOff[8] = {0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
	BOOL	result = TRUE;

	#ifndef  MINMODULE_TYPE
		m_pZKTaskInfo = (sTaskInfo *)GetTaskInfoBT(taskID);
		if(NULL == m_pZKTaskInfo)
		{
			return FALSE;
		}    
	#endif

	sAttPriData *tmpAtt = NULL;	
	AttCtrlConst_t *tmpConst= NULL;		
	
	
	SsPara_t *PStar[STAR_NUM]= {NULL};	
	GyroPara_t *PGyro[GYRO_NUM]= {NULL};	
	MagPara_t *PMag = NULL;
	WhlPara_t *PWhl= NULL;
	MtPara_t *pMt= NULL;
	
	sAttErrCtlPara_t *pREcheck= NULL;
	sAttCtlPara_t *pCtrl= NULL;	
	sAttDeterPara_t *pDeter= NULL;
	sAttOrbitGetPara_t *pOrbitIn= NULL;
	AttIMPTPara_t *pImpt= NULL;
	sAttModPara_t *pWMod= NULL;
	sAttGuidLawPara_t *pGuide= NULL;	
	sAttOrbitCtlInfo_t *pOrb= NULL;	
	sAttOrbitCtlData_t *tmpOrbCmd= NULL;
	sAttTARCCtlData_t *tmpTARCmd= NULL;	
	sAttTARCCtlInfo_t *pTAR= NULL;
	PPUPara_t *PPPU= NULL;
	AttCmdDsp_t  *pCmdDsp= NULL;

	tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR;
	tmpConst=(AttCtrlConst_t *)ATTCLT_DATA2_ADDR;
	tmpOrbCmd=(sAttOrbitCtlData_t *)ATTCLT_DATA3_ADDR;
	tmpTARCmd=(sAttTARCCtlData_t *)ATTCLT_DATA6_ADDR;	
	if(NULL == tmpAtt || NULL ==tmpConst || NULL ==tmpOrbCmd || NULL ==tmpTARCmd)
		return FALSE;			
	memset(tmpAtt, 0, sizeof(sAttPriData));	
	memset(tmpOrbCmd, 0, sizeof(sAttOrbitCtlData_t));	
	memset(tmpTARCmd, 0, sizeof(sAttTARCCtlData_t));	

	PStar[0] = &tmpAtt->sPerPara.SsPara[0];
	PStar[1] = &tmpAtt->sPerPara.SsPara[1];
	PStar[2] = &tmpAtt->sPerPara.SsPara[2];

	PGyro[0] = &tmpAtt->sPerPara.GyroPara[0];
	PGyro[1] = &tmpAtt->sPerPara.GyroPara[1];
	PGyro[2] = &tmpAtt->sPerPara.GyroPara[2];
	
	PMag = &tmpAtt->sPerPara.MagPara;
	PWhl = &tmpAtt->sPerPara.WhlPara;
	pREcheck = &tmpAtt->sErrCtlPara;
	pCtrl = &tmpAtt->sCtlPara;
	pMt = &tmpAtt->sPerPara.MtPara;
	pDeter = &tmpAtt->sDeterPara;
	pOrbitIn = &tmpAtt->sOrbitPara;
	pImpt = &tmpAtt->sIMPTPara;
	pWMod = &tmpAtt->sModePara;
	pGuide = &tmpAtt->sGuidLawPara;
	pOrb = &tmpAtt->sOrbitInp;
	pTAR = &tmpAtt->sTARCInp;
	PPPU = &tmpAtt->sPerPara.PPUPara;	
	pCmdDsp = &tmpAtt->sCmdDspPara;

	/*所有模块初始化*/
	ZKModInit();
	ZKEnvInit();
	ZKDPInit();
	ZKREInit();
	ZKDYInit();
	ZKPosCtlInit();

	memcpy(&(tmpConst->AttCmdFlashPara.M_SSA[0][0]), &M_SSA[0][0], 9*sizeof(TYPE_CAL));
	memcpy(&(tmpConst->AttCmdFlashPara.M_SSB[0][0]), &M_SSB[0][0], 9*sizeof(TYPE_CAL));
	memcpy(&(tmpConst->AttCmdFlashPara.M_SSC[0][0]), &M_SSC[0][0], 9*sizeof(TYPE_CAL));

	memcpy(&(tmpConst->AttCmdFlashPara.M_GYRO[0][0][0]), &M_GYROA[0][0], 9*sizeof(TYPE_CAL));
	memcpy(&(tmpConst->AttCmdFlashPara.M_GYRO[1][0][0]), &M_GYROB[0][0], 9*sizeof(TYPE_CAL));
	memcpy(&(tmpConst->AttCmdFlashPara.M_GYRO[2][0][0]), &M_GYROC[0][0], 9*sizeof(TYPE_CAL));
	
	memcpy(&(tmpConst->AttCmdFlashPara.M_aSSA[0][0]), &M_aSSA[0][0], 9*sizeof(TYPE_CAL));
	memcpy(&(tmpConst->AttCmdFlashPara.M_aSSB[0][0]), &M_aSSB[0][0], 9*sizeof(TYPE_CAL));
	memcpy(&(tmpConst->AttCmdFlashPara.M_aSSC[0][0]), &M_aSSC[0][0], 9*sizeof(TYPE_CAL));
	memcpy(&(tmpConst->AttCmdFlashPara.M_aSSD[0][0]), &M_aSSD[0][0], 9*sizeof(TYPE_CAL));
	memcpy(&(tmpConst->AttCmdFlashPara.M_aSSE[0][0]), &M_aSSE[0][0], 9*sizeof(TYPE_CAL));
	memcpy(&(tmpConst->AttCmdFlashPara.M_aSSF[0][0]), &M_aSSF[0][0], 9*sizeof(TYPE_CAL));
	memcpy(&(tmpConst->AttCmdFlashPara.M_MAG[0]),  &M_MAG1[0][0],  9*sizeof(TYPE_CAL));
	memcpy(&(tmpConst->AttCmdFlashPara.M_MAG[1]),  &M_MAG2[0][0],  9*sizeof(TYPE_CAL));
	memcpy(&(tmpConst->AttCmdFlashPara.M_Wheel[0][0]), &M_Wheel[0][0], 12*sizeof(TYPE_CAL));
	memcpy(&(tmpConst->AttCmdFlashPara.M_MAGCtrl[0][0]), &M_MAGCtrl[0][0], 12*sizeof(TYPE_CAL));
	
	//互校验阈值(可上注修改)
	tmpConst->Allow_Sensor_CThr = 0x55;//0;20240630
	tmpConst->SS_SS_CThr = 2.0*ANG2RADIAN;
	tmpConst->SS_ASS_CThr = 10.0*ANG2RADIAN;
	tmpConst->SS_ASS_CCThr = 10.0*ANG2RADIAN;
	tmpConst->SS_GYRO_CThr = 0.2*ANG2RADIAN;
	//tmpConst->SS_MAG_CThr = 3*ANG2RADIAN;
	tmpConst->AttCmdFlashPara.SS_MAG_CThr = 30*ANG2RADIAN;
	//tmpConst->MAG_MAG_CThr = 1000;
	tmpConst->MAG_MAG_CThr = 3000;      //200t230
	tmpConst->GYRO_GYRO_CThr = 0.1*ANG2RADIAN;
	
	//整星转动惯量
	tmpConst->SAT_J[0][0]=497.35;
	tmpConst->SAT_J[0][1]=0.0;
	tmpConst->SAT_J[0][2]=0.0;
	tmpConst->SAT_J[1][0]=0.0;
	tmpConst->SAT_J[1][1]=585.45;
	tmpConst->SAT_J[1][2]=0.0;
	tmpConst->SAT_J[2][0]=0.0;
	tmpConst->SAT_J[2][1]=0.0;
	tmpConst->SAT_J[2][2]=154.56;
	
	//模拟太敏D:
	for (i = 0; i < ASS_NUM; ++i)
	{
		pImpt->AssUseState[i]= POSE_OK;								//单个太敏可用标志 	
	}
	tmpConst->Ass_MinFour_limt[0] = 3.5;						//4片模拟太敏电压阈值
	tmpConst->Ass_MaxFour_limt[0] = 12.0;						//4片模拟太敏电压阈值
	tmpConst->Ass_MinFour_limt[1] = 3.5;						//EF片模拟太敏电压阈值
	tmpConst->Ass_MaxFour_limt[1] = 7.0;						//EF片模拟太敏电压阈值	
	//陀螺
	for (i = 0; i < GYRO_NUM; i++)
	{	
		PGyro[i]->Gyro_AvailableFlg=POSE_OK;
		for (k = 0; k < 3; k++)
		{
			PGyro[i]->Gyro_ComCnt[k] = 0;							//陀螺上下拍数据比较有效计数
			tmpConst->AttCmdFlashPara.Gyro_Comd_Bias[i][k] =0;						//陀螺零偏
			for (j = 0; j < 3; j++)
			{
				tmpConst->AttCmdFlashPara.Gyro_Comd_K[i][k][j] =0; 
			}
			tmpConst->AttCmdFlashPara.Gyro_Comd_K[i][k][k] =1; 
		}
		memset(PGyro[i]->GyroIn_SpeedPre, 0, 3*sizeof(TYPE_CAL));
		memset(PGyro[i]->GyroIn_Speed, 0, 3*sizeof(TYPE_CAL));
	}
		
	//星敏
	for (i = 0; i < 3; i++)
	{
		PStar[i]->ssAvailableFlg=POSE_OK;							//星敏可用标志
		PStar[i]->ssExpose_cnt=0;
		memset(PStar[i]->ssIn_Qpre, 0.0, 4*sizeof(TYPE_CAL));
		memset(PStar[i]->ssIn_Q, 0.0, 4*sizeof(TYPE_CAL));
	}
	
	//磁强计
	PMag->Mag_Use  = POSE_OK;
	PMag->Mag_UsePre = POSE_OK;
	pImpt->MagUseState[0] = POSE_OK;
	pImpt->MagUseState[1] = POSE_OK;

	memset(PMag->Mag_Bb,0.0,3*sizeof(TYPE_CAL));
	memset(PMag->Mag_BbPre,0.0,3*sizeof(TYPE_CAL));

	for (i = 0; i < MAG_NUM; i++)
	{								
		//PMag->MagIn_Valid[i]= POSE_OK;								//模拟磁强计A/B有效标志
		//输出量
		memset(PMag->Mag_Bc_MeaAB[i],0.0,3*sizeof(TYPE_CAL));
		memset(PMag->Mag_Bb_MeaAB[i],0.0,3*sizeof(TYPE_CAL));	
	}
		PMag->MagIn_DataSta= 0;		
	
	//飞轮相关注数
	for (i = 0; i < WHEEL_NUM; ++i)
	{
		tmpConst->Whl_J[i] = 0.0064;
		pImpt->Whl_Use[i]=POSE_OK;	
	}
	tmpConst->Whl_HCent[0]=0.5 * 0.7;
	tmpConst->Whl_HCent[1]=-0.5 * 0.7;
	tmpConst->Whl_HCent[2]=-0.732 * 0.7;
	tmpConst->Whl_HCent[3]=1.018 * 0.7;
	memset(PWhl->Whl_Rate,0,4*sizeof(TYPE_CAL));
	memset(PWhl->Whl_RatePre,0,4*sizeof(TYPE_CAL));
	memset(PWhl->Whl_Time,0,4*sizeof(UINT32));
	memset(PWhl->Whl_TimePRE,0,4*sizeof(UINT32));
	pCmdDsp->Wheel_Cmd_Cnt = 0;
	pREcheck->WhlUseState= 0x0f;
	PWhl->Whl_UseCnt=4;
	tmpConst->WheelD_NomSpeed = 2000;								//rpm
	tmpConst->WheelD_SpeedErrThr = 100;     //20230104
	tmpConst->WheelD_Default = 0.03;
	tmpConst->WheelD_AllDefault = 0.04;
	memset(PWhl->Whl_WorkMode, WHL_CMD_CODE_RATE, 4*sizeof(UINT8));
	tmpConst->Whl_ID[0]=0x01;
	tmpConst->Whl_ID[1]=0x01;
	tmpConst->Whl_ID[2]=0x01;
	tmpConst->Whl_ID[3]=0x01;	
		
#ifndef  MINMODULE_TYPE
	//PPU
	//tmpAtt->sErrCtlPara.AttPPUOnReq = POSE_NO;
	//tmpAtt->sErrCtlPara.AttPPUOffReq = POSE_NO;
	pImpt->PPUUseStatus=POSE_OK;
	pImpt->PPUSafeStatus=POSE_OK;
	PPPU->PPUOUT_Sta = POSE_IN;					//PPU 数据无效原因
	PPPU->PPUIn_ReCnt= 0;						//PPU遥测请求计数
	PPPU->PPUNoUse_Cnt= 0;
	PPPU->PPUIn_ReCntPre= 0;					//PPU上一拍遥测请求计数
	for (i = 0; i < 50; ++i)
	{
		PPPU->PPUT_FIR_Start[i] =i;
		PPPU->PPUT_FIR_End[i] = i;
	}	
	tmpConst->AttCmdFlashPara.PPUT_FIR_EndLast = 0;
		
	PPPU->PPUT_FIR_Sum = 0;	
	PPPU->PPUT_FIR_Cnt = 0;	
	PPPU->PPUT_FIR_CntS = 0;	
	PPPU->PPUT_FIR_SumCnt = 0;
	tmpConst->AttCmdFlashPara.WorkModeChangeAuto=POSE_NO;       //二次电话允许标准
	//tmpConst->AttCmdFlashPara.PPUPVK = 0.1065;
	//tmpConst->AttCmdFlashPara.PPUPAK = 0.000605;
	//tmpConst->AttCmdFlashPara.PPUPVB = -1.4477;
	//tmpConst->AttCmdFlashPara.PPUPAB = -0.0107;	
	tmpConst->AttCmdFlashPara.PPUPVK = 0.1;
	tmpConst->AttCmdFlashPara.PPUPAK = 0.001;
	tmpConst->AttCmdFlashPara.PPUPVB = 0.0;
	tmpConst->AttCmdFlashPara.PPUPAB = 0.0;
	PPPU->PPUIn_FIREOK = 0;					//点火成功标志
	PPPU->PPUIn_FIREOKPre = 0;				//点火成功标志	
	
	PPPU->PPU_OrbitCtl_Quit_OK_Flag = POSE_NO;		/*轨控正常退出标志*/
	PPPU->PPU_OrbitCtl_Quit_OK_Cnt = 0;		/*轨控正常退出节拍计数*/
	
	PPPU->PPU_OrbitCtl_Quit_Err_Flag = POSE_NO;		/*轨控异常退出标志*/
	PPPU->PPU_OrbitCtl_Quit_Err_Cnt = 0;		/*轨控正常异常节拍计数*/

#endif
	//磁力矩器
	tmpConst->Mag_Bb_CtrlMax=100.0;                                 //磁力矩器最大输出磁矩  50
	tmpConst->Mag_Kp[0]=0.001;										//比例微分系数为
	tmpConst->Mag_Kp[1]=0.001;										//比例微分系数为
	tmpConst->Mag_Kp[2]=0.001;										//比例微分系数为
	tmpConst->Mag_Kd[0]=2.4;
	tmpConst->Mag_Kd[1]=2.4;
	tmpConst->Mag_Kd[2]=2.4;	
	
	tmpConst->Mag_KpFBZK[0]=0.001;									//比例微分系数为
	tmpConst->Mag_KpFBZK[1]=0.001;									//比例微分系数为
	tmpConst->Mag_KpFBZK[2]=0.001;									//比例微分系数为
	tmpConst->Mag_KdFBZK[0]=2.4;
	tmpConst->Mag_KdFBZK[1]=2.4;
	tmpConst->Mag_KdFBZK[2]=2.4;	

	tmpConst->Mag_WTOSUN =-0.5*ANG2RADIAN;
	tmpConst->Mag_FBZKWTOSUN =0.3*ANG2RADIAN;
	tmpConst->Mag_ATTTOSUN =30.0 * ANG2RADIAN;
	tmpConst->Mag_DampBdotMin=10.0;                                 //磁控阻尼死区  10
	for (i = 0; i < MAG_NUM; ++i)
	{
		for (j = 0; j< 3; j++)
		{
			tmpConst->AttCmdFlashPara.MAG_LK[i][j]=28000.0;
			tmpConst->AttCmdFlashPara.MAG_LB[i][j]=-70000.0; 
		}
	}
	pMt->MTCtrlTime = 0;											//磁力矩器控制时间计数
	pMt->MTStatus = 0;	
	tmpConst->MTCtrlTIME=8;
	tmpConst->AttCmdFlashPara.Mag_ComRESW[0]=0x00;			    					//磁强计表头重构状态字
	tmpConst->AttCmdFlashPara.Mag_ComRESW[1]=0x00;			    					//磁强计表头重构状态字
	tmpConst->AttCmdFlashPara.Mag_ComRESW[2]=0x00;			    					//磁强计表头重构状态字
	pImpt->MTUseStatus[0]=POSE_OK;
	pImpt->MTUseStatus[1]=POSE_OK;
	pImpt->MTUseStatus[2]=POSE_OK;
	pImpt->MTUseStatus[3]=POSE_OK;
	tmpConst->MTOutXYZLimit[0] = 100.0;
	tmpConst->MTOutXYZLimit[1] = 100.0;
	tmpConst->MTOutXYZLimit[2] = 50.0;
	tmpConst->MTOutXYZLimit[3] = 50.0;

	//帆板
	pWMod->WModSadaOpen=POSE_NO;
	pWMod->MiniDataSet =POSE_OK;
	pWMod->WModSadaOpenPre=POSE_NO;	
	pWMod->ZKSadaOpen=POSE_NO;
	
	//磁卸载
	tmpConst->k1_dump = 0.5;
	tmpConst->k2_dump = 0.3;
	//tmpConst->ku_dump = 400000.0;
	tmpConst->ku_dump = 500000.0;
	tmpConst->MTAtt_dump = 45.0 *ANG2RADIAN ;
    //轨道计算
    pOrbitIn->OrbitVld=POSE_OK;
	memset(pOrbitIn->JPos,0,3*sizeof(TYPE_CAL));
	memset(pOrbitIn->JVel,0,3*sizeof(TYPE_CAL));
	pOrbitIn->MJC=0;		   											//儒略世纪
	pOrbitIn->MJCLv=POSE_NO;
	pOrbitIn->GAST=0;													//格林尼治恒星时角
     
	//PD控制
	memset(pDeter->CLPAttAngRat,0,3*sizeof(TYPE_CAL));
	memset(pDeter->CLPAttAngRatPre,0,3*sizeof(TYPE_CAL));
	
	//PID控制器相关参数清零
	memset(tmpAtt->sCtlPara.SumAerrPre, 0, 3*sizeof(TYPE_CAL));			//PID积分器清零
	memset(tmpAtt->sCtlPara.WheelCtrlResultPre, 0, 3*sizeof(TYPE_CAL));	//前次控制器指令记录结果清零
	tmpAtt->sCtlPara.PD2PIDCnt = 0;
	tmpAtt->sCtlPara.CtrlPD2PID =0;

#ifndef  MINMODULE_TYPE
	//轨道控制
	pOrb->CurOrbCtrlPcak_ID = 0x00;
	pOrb->CurOrbCtrlPcak_PreID =0xFF;
	pOrb->OrbDataIn_OK = POSE_NO;
	pOrb->OrbDataIn_OKCnt = 0x00;
	for (i = 0; i < 50; ++i)
	{	
		pOrb->OrbCtrlPcak_ReceiveFlg[i]= 0x00;
		memset(&tmpOrbCmd->OrbCtrlPack[i],0,sizeof(AttOrbCtrlPara_t));
	}
	memset(&pOrb->OrbCtrlPackCur,0,sizeof(AttOrbCtrlPara_t));
	//目标定向
	pTAR->CurTARCtrlPcak_ID = 0;
	pTAR->CurTARCtrlPcak_PreID = 0xFF;
	pTAR->TARDataIn_OK = POSE_NO;
	pTAR->TARDataIn_OKCnt = 0;
	for (i = 0; i < 30; ++i)
	{	
		pTAR->TARCtrlPcak_ReceiveFlg[i]= 0x00;
		memset(&tmpTARCmd->TARCtrlPack[i],0,sizeof(sAttTARCCtlPara_t));
	}	
#endif
		
	//定姿初始化
	memset(pDeter->Qi,0,4*sizeof(TYPE_CAL));
	memset(pDeter->Wi,0,3*sizeof(TYPE_CAL));
	memset(pDeter->QiPre,0,4*sizeof(TYPE_CAL));
	memset(pDeter->WiPre,0,3*sizeof(TYPE_CAL));
	pDeter->Qi_Vld = POSE_NO;							//卫星惯性系四元数有效标志
	pDeter->QiPre_Vld = POSE_NO;
	pDeter->PPUVld = POSE_NO;
	pDeter->Wi_Vld = POSE_OK;							//卫星惯性系角速度有效标志	
	tmpConst->GyroINT_TLimt = 2400;
	pDeter->GyroINT_Time= 0;

	//导引律初始化
	pGuide->CaptureSunCnt=0;

	//姿控初始化
	tmpConst->AccThru_Up[0]= 0;
	tmpConst->AccThru_Up[1]= 0;
	tmpConst->AccThru_Up[2]= -8.0E-5;	
	//姿态确定参数初始化
	tmpAtt->sCtlPara.IsDump = POSE_NO;
	
	//磁力矩器输出
	pCtrl->MagCtrlResult[0] =0.0;
	pCtrl->MagCtrlResult[1] =0.0;
	pCtrl->MagCtrlResult[2] =0.0;	
	pCtrl->MagCtrlXYZZ[0] =0.0;
	pCtrl->MagCtrlXYZZ[1] =0.0;	
	pCtrl->MagCtrlXYZZ[2] =0.0;	
	pCtrl->MagCtrlXYZZ[3] =0.0;		
	//tmpAtt->AttData3T2Para.AttCtlBKFlag = POSE_NO;
	//帆板flash数据初始化
	tmpAtt->ATSFlashPara.SHDepartCntlimt1 =0;  
	/*读取flash区间数据*/
	ATTRestoreFromFlash();
	
	/*三取二设置*/
	ATTImportDataBackup();
	
	/*重启/切机/复位 发送异常PPU关动作，不关电源只关点火*/
	dev_can_write(DEV_NO_CAN0, PPUOff, 8);
	PPPU->PPUOUT_Sta = POSE_NO;/*电推指令开关标志为关*/
	tmpAtt->sCtlPara.ZK_Ctrl_Reserver111 = POSE_NO;	
	///*重启/切机/复位 飞轮转速电流给0*/
	//SetWheel(1,0,WHL_CMD_CODE_CURR);
	//SetWheel(2,0,WHL_CMD_CODE_CURR);
	//SetWheel(3,0,WHL_CMD_CODE_CURR);
	//SetWheel(4,0,WHL_CMD_CODE_CURR);
	
	/*重启/切机/复位 输出磁力矩占控比为0*/
	magnetic_out(0x11, 0, 0, 0);
	magnetic_out(0x22, 0, 0, 0);
	magnetic_out(0x33, 0, 0, 0);
	magnetic_out(0x44, 0, 0, 0);

	
	return result;
}


/***********************************************
说明：姿控指令处理
***********************************************/
void ZKCmdResolve(void)
{
	UINT8		i= 0x00;
	UINT8		j= 0x00;
	UINT8		k= 0x00;
	UINT8		tmpCmd[MOD_REQ_MAXLEN]= {0x00};
	UINT8		tmpWhlCmd[MOD_REQ_MAXLEN]= {0x00};
	UINT16		tmpCmdCode = 0;			            //指令码
	UINT8		tmpOffset = 0x02;					//指令码偏移
	UINT8		*tmpData= 0x00;
	UINT8		tmpDevNO = 0x00;

	UINT32		tmpiDataLength= 0x00;				/*数据长度*/
	UINT32		tmpiDataLength1= 0x00;				/*数据长度*/
	UINT16		tmpiDataType =0;					/*数据类型*/
	UINT16		tmpiDataCheck=0;					/*数据校验和*/
	UINT16		tmpiDataCheck1=0;					/*数据校验和*/

	TYPE_CAL	tmpWlimit=0.0;
	TYPE_CAL	tmpAlimit=0.0;
	TYPE_CAL	tmpAngm=0.0;
	UINT16		tmpTimeLmt=0;
	UINT16      tmpTimeLmt1=0;
	UINT8		tmpWorkMod= 0x00;
	UINT8		tmpWorkModPre= 0x00;
	UINT8		tmpCOMDCHOICE= 0x00;
	UINT32		SatTime[2]= {0x00,0x00};
	TYPE_CAL	DETLTime1= 0.0;
	TYPE_CAL	DETLTime2= 0.0;
	UINT8 PPUOff[8]	= {0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00};

	sTaskMngDataRecord * tmpTaskMngDataRcd = NULL;
	sAttPriData *tmpAtt= NULL;	
	AttCtrlConst_t *tmpConst= NULL;	
	sAttOrbitCtlData_t *tmpOrbCmd= NULL;
	sAttTARCCtlData_t *tmpTARCCmd= NULL;	
	sAttOrbitCtlInfo_t *pOrb= NULL;	
	sAttTARCCtlInfo_t *pTARC= NULL;	
	sAttModPara_t *pWMod= NULL;	
	AttIMPTPara_t *pIMU= NULL;
	PPUPara_t *PPPU= NULL;		
	sTaskInfo *tmpCollectInfo = (sTaskInfo *)GetTaskInfoBT(TASK_COLLECT);	
	tmpTaskMngDataRcd = (sTaskMngDataRecord *)ST_TASKMNG_ADDR;
	tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR;
	tmpConst=(AttCtrlConst_t *)ATTCLT_DATA2_ADDR;
	tmpOrbCmd=(sAttOrbitCtlData_t *)ATTCLT_DATA3_ADDR;
	tmpTARCCmd=(sAttTARCCtlData_t *)ATTCLT_DATA6_ADDR;
	if((NULL == tmpAtt) || (NULL ==tmpConst) || (NULL ==tmpOrbCmd) || (NULL ==tmpTARCCmd)|| (NULL ==tmpCollectInfo)|| (NULL ==tmpTaskMngDataRcd))
	{
		return ;
	}
	pOrb=&tmpAtt->sOrbitInp;
	pTARC=&tmpAtt->sTARCInp;
	pIMU=&tmpAtt->sIMPTPara;
	pWMod=&tmpAtt->sModePara;	
	PPPU = &tmpAtt->sPerPara.PPUPara;

	while(BlockRingGet(&(m_pZKTaskInfo->sCmdBuffer), tmpCmd, TRUE))
	{
		/*处理每个命令*/
		tmpCmdCode = DoGetInt16From8(tmpCmd + tmpOffset);
		m_pZKTaskInfo->iCmdLast = tmpCmdCode;
		m_pZKTaskInfo->iCmdRes = ERR_CODE_NOERR;
		m_pZKTaskInfo->iCmdCount++;
		//获取注数缓存地址
		tmpData=(UINT8*)(tmpCmd + tmpOffset +2);
		
		switch(tmpCmdCode)
		{
			/****************安全模式软指令*************************/			
			case ATT_SAFEMODE_SAFE1://整星安全模式1
			{			
				pOrb->CurOrbCtrlPcak_ID = 0x00;
				pOrb->CurOrbCtrlPcak_PreID =0xFF;
				PPPU->PPUT_FIR_Cnt = 0;
				pOrb->OrbDataIn_OK = POSE_NO;
				for (i = 0; i < 50; ++i)
				{
					pOrb->OrbCtrlPcak_ReceiveFlg[i]= 0x00;
					memset(&tmpOrbCmd->OrbCtrlPack[i],0,sizeof(AttOrbCtrlPara_t));
				}
				memset(&pOrb->OrbCtrlPackCur,0,sizeof(AttOrbCtrlPara_t));
					
				pIMU->PPUUseStatus=POSE_NO;
				pIMU->PPUSafeStatus=POSE_NO;
				PPPU->PPUOUT_Sta = POSE_NO;/*电推指令开关标志为关*/				
				tmpAtt->sCtlPara.ZK_Ctrl_Reserver111 = POSE_NO;	
				if ((ATTMOD_ATTAJUSTPRE == pWMod->WorkMode)||(ATTMOD_ORBITCTL == pWMod->WorkMode))
				{
					/*设置工作模式 速率阻尼*/					
					ZKModDoSet(ATTMOD_RATEDMP);			
				}
				break;
			}

			case ATT_SAFEMODE_SAFE2://整星安全模式2
			{
				/*设置工作模式 速率阻尼*/
				ZKModDoSet(ATTMOD_RATEDMP);
				pOrb->CurOrbCtrlPcak_ID = 0x00;
				pOrb->CurOrbCtrlPcak_PreID =0xFF;
				PPPU->PPUT_FIR_Cnt = 0;	
				pOrb->OrbDataIn_OK = POSE_NO;
				for (i = 0; i < 50; ++i)
				{	
					pOrb->OrbCtrlPcak_ReceiveFlg[i]= 0x00;
					memset(&tmpOrbCmd->OrbCtrlPack[i],0,sizeof(AttOrbCtrlPara_t));
				}
				memset(&pOrb->OrbCtrlPackCur,0,sizeof(AttOrbCtrlPara_t));
				
				pIMU->PPUUseStatus=POSE_NO;	
				pIMU->PPUSafeStatus=POSE_NO;
				PPPU->PPUOUT_Sta = POSE_NO;/*电推指令开关标志为关*/
				tmpAtt->sCtlPara.ZK_Ctrl_Reserver111 = POSE_NO;	
				break;
			}

			case ATT_SAFEMODE_SAFE3://整星安全模式3
			{
				/*设置工作模式 磁控对日*/
				ZKModDoSet(ATTMOD_MagTOSUN);		
				pOrb->CurOrbCtrlPcak_ID = 0x00;
				pOrb->CurOrbCtrlPcak_PreID =0xFF;
				PPPU->PPUT_FIR_Cnt = 0;
				pOrb->OrbDataIn_OK = POSE_NO;	
				for (i = 0; i < 50; ++i)
				{	
					pOrb->OrbCtrlPcak_ReceiveFlg[i]= 0x00;
					memset(&tmpOrbCmd->OrbCtrlPack[i],0,sizeof(AttOrbCtrlPara_t));
				}
				memset(&pOrb->OrbCtrlPackCur,0,sizeof(AttOrbCtrlPara_t));
				
				pIMU->PPUUseStatus=POSE_NO;	
				pIMU->PPUSafeStatus=POSE_NO;
				PPPU->PPUOUT_Sta = POSE_NO;/*电推指令开关标志为关*/
				tmpAtt->sCtlPara.ZK_Ctrl_Reserver111 = POSE_NO;	
				break;
			}			
			
			/**********************************模式控制指令*********************************/
			//速率阻尼 0X22  
			case ATT_CMDMODE_MODSUNCAP:
			{
				if(0x55 == tmpTaskMngDataRcd->bSHDepart)
				{
					/*设置工作模式 速率阻尼*/
					ZKModDoSet(ATTMOD_RATEDMP);
					if(0xAA55 == DoGetInt16From8(tmpData))
					{
						pOrb->CurOrbCtrlPcak_ID = 0;
						pOrb->CurOrbCtrlPcak_PreID =0xFF;
						PPPU->PPUT_FIR_Cnt = 0;
						memset(&tmpAtt->sOrbitInp.OrbCtrlPackCur, 0, sizeof(AttOrbCtrlPara_t));
						memset(&tmpOrbCmd->OrbCtrlPack, 0, 50*sizeof(AttOrbCtrlPara_t));
						pOrb->OrbDataIn_OK = POSE_NO;
						/*清轨道包，当前拍的关PPU动作*/
						dev_can_write(DEV_NO_CAN0, PPUOff, 8);
						PPPU->PPUOUT_Sta = POSE_NO;/*电推指令开关标志为关*/
						tmpAtt->sCtlPara.ZK_Ctrl_Reserver111 = POSE_NO;							
						pTARC->CurTARCtrlPcak_ID=0;
						pTARC->CurTARCtrlPcak_PreID =0xFF;
						memset(&tmpAtt->sTARCInp.TARCtrlPackCur, 0, sizeof(sAttTARCCtlPara_t));
						memset(&tmpTARCCmd->TARCtrlPack, 0, 30*sizeof(sAttTARCCtlPara_t));
						pTARC->TARDataIn_OK = POSE_NO;
					}
				}
				else
				{
					m_pZKTaskInfo->iCmdRes = ERR_CODE_CMDCODE;	/*指令失败*/
				}
				break;
			}
			//轮控对日定向0X33
			case ATT_CMDMODE_WhlTOSUN:
			{
				if(0x55 == tmpTaskMngDataRcd->bSHDepart)
				{
					/*设置工作模式 轮控对日*/
					ZKModDoSet(ATTMOD_WhlTOSUN);
				}
				else
				{
					m_pZKTaskInfo->iCmdRes = ERR_CODE_CMDCODE;	/*指令失败*/
				}
				break;
			}
			//磁控对日定向0X44
			case ATT_CMDMODE_MagTOSUN:
			{
				if(0x55 == tmpTaskMngDataRcd->bSHDepart)
				{
					/*设置工作模式 磁控对日*/
					ZKModDoSet(ATTMOD_MagTOSUN);
				}
				else
				{
					m_pZKTaskInfo->iCmdRes = ERR_CODE_CMDCODE;	/*指令失败*/
				}
				break;
			}
			//对地定向0X55
			case ATT_CMDMODE_ONLTOEARTH:
			{
				if(0x55 == tmpTaskMngDataRcd->bSHDepart)
				{
					if((ATTMOD_RATEDMP == pWMod->WorkMode)
					    ||(ATTMOD_WhlTOSUN == pWMod->WorkMode)
						||(ATTMOD_MagTOSUN == pWMod->WorkMode)
						||(ATTMOD_ATTAJUSTPRE == pWMod->WorkMode)
						||(ATTMOD_ORBITCTL == pWMod->WorkMode)
						||(ATTMOD_ATTAJUST == pWMod->WorkMode)
						||(ATTMOD_ONLTOTAR == pWMod->WorkMode)
						)
					{
						/*设置工作模式 对地定向*/
						ZKModDoSet(ATTMOD_ONLTOEARTH);
					}
					else
					{
						m_pZKTaskInfo->iCmdRes = ERR_CODE_CMDCODE;	/*指令失败*/
					}
				}
				else
				{
					m_pZKTaskInfo->iCmdRes = ERR_CODE_CMDCODE;	/*指令失败*/
				}
				break;
			}
			//稳态对地0X66
			case ATT_CMDMODE_WHEELTOEARTH:
			{
				if(0x55 == tmpTaskMngDataRcd->bSHDepart)
				{
					if((ATTMOD_ONLTOEARTH == pWMod->WorkMode)
						||(ATTMOD_ORBITCTL == pWMod->WorkMode)
						||(ATTMOD_ONLTOTAR == pWMod->WorkMode)
						)
					{
						/*设置工作模式 稳态对地*/
						ZKModDoSet(ATTMOD_WHEELTOEARTH);
					}
					else
					{
						m_pZKTaskInfo->iCmdRes = ERR_CODE_CMDCODE;	/*指令失败*/
					}
				}
				else
				{
					m_pZKTaskInfo->iCmdRes = ERR_CODE_CMDCODE;	/*指令失败*/
				}
				break;
			}
			//无控模式0XBB
			case ATT_CMDMODE_UNCTL:
			{
				if(0x55 == tmpTaskMngDataRcd->bSHDepart)
				{					
					if((ATTMOD_WhlTOSUN == pWMod->WorkMode)
						||(ATTMOD_MagTOSUN == pWMod->WorkMode)
						||(ATTMOD_RATEDMP == pWMod->WorkMode)
						)
					{
						/*设置工作模式 无控*/
						ZKModDoSet(ATTMOD_UNCTL);
					}
					else
					{
						m_pZKTaskInfo->iCmdRes = ERR_CODE_CMDCODE;	/*指令失败*/
					}
				}
				else
				{
					m_pZKTaskInfo->iCmdRes = ERR_CODE_CMDCODE;	/*指令失败*/
				}
				break;
			}
			case ATT_WORKMODE_ORBITCTLPRE:			//轨控前调姿(0x3606
				if((ATTMOD_WhlTOSUN == pWMod->WorkMode)/*当前模式为轮控对日*/
					||(ATTMOD_WHEELTOEARTH == pWMod->WorkMode)/*当前模式为稳定对地*/
					||(ATTMOD_ORBITCTL == pWMod->WorkMode)
				)
				{
					/*设置工作模式 轨控前调姿*/
					ZKModDoSet(ATTMOD_ATTAJUSTPRE);
				}
				else
				{
					m_pZKTaskInfo->iCmdRes = ERR_CODE_CMDCODE;	/*指令失败*/
				}
			break;
			case ATT_WORKMODE_ORBITCTL	:	    	//轨控(0x3607)
				if(ATTMOD_ATTAJUSTPRE == pWMod->WorkMode)/*当前模式为轨控前调姿*/
				{
					/*设置工作模式 轨控*/
					ZKModDoSet(ATTMOD_ORBITCTL);
				}
				else
				{
					m_pZKTaskInfo->iCmdRes = ERR_CODE_CMDCODE;	/*指令失败*/
				}
			break;
			case ATT_WORKMODE_ATTAJUST			:	/*(0x3611)	定向调姿*/
				if((ATTMOD_WhlTOSUN == pWMod->WorkMode)/*当前模式为轮控对日*/
				||(ATTMOD_WHEELTOEARTH == pWMod->WorkMode)/*当前模式为稳定对地*/
				||(ATTMOD_ONLTOTAR == pWMod->WorkMode)
				)
				{
					/*设置工作模式 定向前调姿*/
					ZKModDoSet(ATTMOD_ATTAJUST);
				}
				else
				{
					m_pZKTaskInfo->iCmdRes = ERR_CODE_CMDCODE;	/*指令失败*/
				}
			break;
			case ATT_WORKMODE_ONLTOTAR		    :	/*(0x3612)	目标定向*/
				if(ATTMOD_ATTAJUST == pWMod->WorkMode)/*当前模式为定向前调姿*/
				{
					/*设置工作模式 对目标定向*/
					ZKModDoSet(ATTMOD_ONLTOTAR);
				}
				else
				{
					m_pZKTaskInfo->iCmdRes = ERR_CODE_CMDCODE;	/*指令失败*/
				}
			break;
			
			//轨道控制数据包上注
			case ATT_CMDMODE_ORBITCTL:
			{
				tmpData=(UINT8*)(ATTCLT_DATA5_ADDR);
				GetTime(SatTime);	 
                memcpy(&(tmpiDataLength), tmpData, 4);
                memcpy(&(tmpiDataType), tmpData+ 4, 2);
                memcpy(&(tmpiDataCheck), tmpData+ 6, 2);

				for (i = 0; i < 50; ++i)
				{
					pOrb->OrbCtrlPcak_ReceiveFlg[i]= 0x00;
					memset(&tmpOrbCmd->OrbCtrlPack[i],0,sizeof(AttOrbCtrlPara_t));
				}
				tmpiDataLength1 = 1200;
				if ( tmpiDataLength1 != tmpiDataLength)
				{
					pOrb->OrbDataIn_OK = 0x01;
					PPPU->PPUT_FIR_Cnt = 0;
					return ;					
				}
				
                tmpiDataCheck1 =DoGetCheckSum(tmpData + sizeof(sSaveDataHead), tmpiDataLength);				
				
				if ((0x26==tmpiDataType)&&(tmpiDataCheck == tmpiDataCheck1))
				{
					pOrb->CurOrbCtrlPcak_ID = 0x00;
					pOrb->CurOrbCtrlPcak_PreID = 0xFF ;
					PPPU->PPUT_FIR_Cnt = 0;
					pOrb->OrbDataIn_OK = 0x55;
					for (i = 0; i < 50; ++i)
					{
						PPPU->PPUT_FIR_Start[i] =0;
						PPPU->PPUT_FIR_End[i] = 0;
					}
					tmpConst->AttCmdFlashPara.PPUT_FIR_EndLast = 0;
					pWMod->ATTFlashSwitch = POSE_OK;
					PPPU->PPUT_FIR_Cnt = 0;	
					PPPU->PPUT_FIR_CntS = 0;					

							
					for (i = 0; i < 50; i++)
					{   
						memcpy(&(tmpDevNO), tmpData + i * 24 + sizeof(sSaveDataHead) , sizeof(UINT8));
						if ((tmpDevNO>=1)&&(tmpDevNO<=50)&&(i +1==tmpDevNO))
						{
							//拷贝数据
							memcpy(&(tmpOrbCmd->OrbCtrlPack[tmpDevNO-1].OrbCtrlPcak_ID), (UINT8*)(tmpData + i * 24+ sizeof(sSaveDataHead)), sizeof(UINT8));
							tmpOrbCmd->OrbCtrlPack[tmpDevNO-1].OrbAttAjustTime=DoGetInt32From8(tmpData + i * 24 + sizeof(sSaveDataHead) +1);
							tmpOrbCmd->OrbCtrlPack[tmpDevNO-1].OrbCtrAng[0]= DoGetFloatFrom8(tmpData + i * 24 + sizeof(sSaveDataHead) +5);
							tmpOrbCmd->OrbCtrlPack[tmpDevNO-1].OrbCtrAng[1]= DoGetFloatFrom8(tmpData + i * 24 + sizeof(sSaveDataHead) +9);
							tmpOrbCmd->OrbCtrlPack[tmpDevNO-1].OrbCtrAng[2]= DoGetFloatFrom8(tmpData + i * 24 + sizeof(sSaveDataHead) +13);
							tmpOrbCmd->OrbCtrlPack[tmpDevNO-1].OrbCtrl_StartTime=DoGetInt32From8(tmpData + i * 24 + sizeof(sSaveDataHead) +17);
							tmpOrbCmd->OrbCtrlPack[tmpDevNO-1].OrbCtrl_TimeLength=DoGetInt16From8(tmpData + i * 24 + sizeof(sSaveDataHead) +21);
							memcpy(&(tmpOrbCmd->OrbCtrlPack[tmpDevNO-1].OrbCtrl_Mod), (UINT8*)(tmpData + i * 24 + sizeof(sSaveDataHead) +23), sizeof(UINT8));
							
							tmpOrbCmd->OrbCtrlPack[tmpDevNO-1].OrbDateSum =DoGetCheckSum(&(tmpOrbCmd->OrbCtrlPack[tmpDevNO-1].OrbCtrlPcak_ID), 24);
							pOrb->OrbCtrlPcak_ReceiveFlg[tmpDevNO-1]=0x55 ;
							
						}
					}
					
					if ((tmpOrbCmd->OrbCtrlPack[0].OrbAttAjustTime > SatTime[0])&&(tmpOrbCmd->OrbCtrlPack[0].OrbCtrl_StartTime > SatTime[0]))
					{
						PPPU->PPUT_FIR_Cnt = 1;
						for (i = 1; i < 50; i++)
						{
							if (0x55 == pOrb->OrbCtrlPcak_ReceiveFlg[i])
							{
								PPPU->PPUT_FIR_Cnt = i +1;
								DETLTime1 = (TYPE_CAL)tmpOrbCmd->OrbCtrlPack[i].OrbAttAjustTime - (TYPE_CAL)tmpOrbCmd->OrbCtrlPack[i -1].OrbCtrl_StartTime - (TYPE_CAL)tmpOrbCmd->OrbCtrlPack[i -1].OrbCtrl_TimeLength;
								DETLTime2 = (TYPE_CAL)tmpOrbCmd->OrbCtrlPack[i].OrbCtrl_StartTime - (TYPE_CAL)tmpOrbCmd->OrbCtrlPack[i].OrbAttAjustTime;
								if ((DETLTime1 < 0.0)|| (DETLTime2 < 0.0))
								{
									pOrb->OrbDataIn_OK = 0x02;
									PPPU->PPUT_FIR_Cnt = 0;
									PPPU->PPUT_FIR_CntS = 0;
									break;
								}
							}
							else
							{
								break;
							}
						}							
					}
					else
					{
						PPPU->PPUT_FIR_Cnt = 0;
						PPPU->PPUT_FIR_CntS = 0;
						pOrb->OrbDataIn_OK = 0x02;
					}
					
					if ((PPPU->PPUT_FIR_Cnt  >= 1)&&(PPPU->PPUT_FIR_Cnt  <= 50)&&(0x55 == pOrb->OrbDataIn_OK))
					{
						if ((tmpOrbCmd->OrbCtrlPack[PPPU->PPUT_FIR_Cnt-1].OrbCtrl_Mod == 0x55) ||(tmpOrbCmd->OrbCtrlPack[PPPU->PPUT_FIR_Cnt-1].OrbCtrl_Mod == 0x44))
						{
							pOrb->OrbDataIn_OK = 0x55;	
							PPPU->PPUT_FIR_CntS =PPPU->PPUT_FIR_Cnt;
							
							/*设置下一拍关PPU电源*/
							PPPU->PPU_OrbitCtl_Quit_Err_Flag = POSE_OK;/*正常退出轨控标志使能*/
							PPPU->PPU_OrbitCtl_Quit_Err_Cnt = 0;/*退出轨控后节拍计数清零*/
			
							PPPU->PPU_OrbitCtl_Quit_OK_Flag = POSE_OK;/*正常退出轨控标志使能*/
							PPPU->PPU_OrbitCtl_Quit_OK_Cnt = 0;/*退出轨控后节拍计数清零*/							
							PPPU->PPUOUT_Sta = POSE_NO;/*电推指令开关标志为关*/
							tmpAtt->sCtlPara.ZK_Ctrl_Reserver111 = POSE_NO;	
							//PPU关机指令
							dev_can_write(DEV_NO_CAN0, PPUOff, 8);/*轨控正常退出，电推关机操作，需要5秒后给电推供电*/								
						}
						else
						{
							PPPU->PPUT_FIR_Cnt = 0;
							PPPU->PPUT_FIR_CntS = 0;
							pOrb->OrbDataIn_OK = 0x04;				
						}
					}
				} 
				else
				{
					for (i = 0; i < 50; i++)
					{
						pOrb->OrbCtrlPcak_ReceiveFlg[i]=0x00 ;			
					}
					pOrb->OrbDataIn_OK = 0x01;
					PPPU->PPUT_FIR_Cnt = 0;
				}
				if (POSE_OK == pOrb->OrbDataIn_OK )
				{
					if(pOrb->OrbDataIn_OKCnt<60000)
					{
						pOrb->OrbDataIn_OKCnt++;							
					}
					else
					{
						pOrb->OrbDataIn_OKCnt = 0;
					}
				}
				break;
			}

			//对目标定向数据包上注
			case ATT_CMDMODE_ONLTOTAR:
			{		
				tmpData=(UINT8*)(ATTCLT_DATA4_ADDR);		
				GetTime(SatTime);						
                memcpy(&(tmpiDataLength), tmpData, 4);
                memcpy(&(tmpiDataType), tmpData+ 4, 2);
                memcpy(&(tmpiDataCheck), tmpData+ 6, 2);
                tmpiDataCheck1 =DoGetCheckSum(tmpData + sizeof(sSaveDataHead), tmpiDataLength);						
				pTARC->TARDataIn_OK = POSE_OK;		
				for (i = 0; i < 30; ++i)
				{
					pTARC->TARCtrlPcak_ReceiveFlg[i]= 0x00;
					memset(&tmpTARCCmd->TARCtrlPack[i],0,sizeof(sAttTARCCtlPara_t));
				}
				
				tmpiDataLength1 = 690;
				if ( tmpiDataLength1 != tmpiDataLength)
				{
					pTARC->TARDataIn_OK = 0x02 ;
					return ;
				}				
				if ((0x25==tmpiDataType)&&(tmpiDataCheck == tmpiDataCheck1))
				{
					pTARC->CurTARCtrlPcak_ID = 0;
					pTARC->CurTARCtrlPcak_PreID = 0xFF ;
					for (i = 0; i < 30; i++)
					{   
						memcpy(&(tmpDevNO), tmpData + i * 23 + sizeof(sSaveDataHead) , sizeof(UINT8));
						if ((tmpDevNO>0)&&(tmpDevNO<=30)&&(i +1==tmpDevNO))
						{
							//拷贝数据
							memcpy(&(tmpTARCCmd->TARCtrlPack[tmpDevNO-1].TARCtrlPcak_ID), (UINT8*)(tmpData + i * 23+ sizeof(sSaveDataHead)), sizeof(UINT8));
							tmpTARCCmd->TARCtrlPack[tmpDevNO-1].TARCtrl_JustTime= DoGetInt32From8(tmpData + i * 23 + sizeof(sSaveDataHead) +1);
							tmpTARCCmd->TARCtrlPack[tmpDevNO-1].TARCtrAng[0]= DoGetFloatFrom8(tmpData + i * 23 + sizeof(sSaveDataHead) +5);
							tmpTARCCmd->TARCtrlPack[tmpDevNO-1].TARCtrAng[1]= DoGetFloatFrom8(tmpData + i * 23 + sizeof(sSaveDataHead) +9);
							tmpTARCCmd->TARCtrlPack[tmpDevNO-1].TARCtrAng[2]= DoGetFloatFrom8(tmpData + i * 23 + sizeof(sSaveDataHead) +13);
							tmpTARCCmd->TARCtrlPack[tmpDevNO-1].TARCtrl_StartTime= DoGetInt32From8(tmpData + i * 23 + sizeof(sSaveDataHead) +17);
							tmpTARCCmd->TARCtrlPack[tmpDevNO-1].TARCtrl_TimeLength= DoGetInt16From8(tmpData + i * 23 + sizeof(sSaveDataHead) +21);
							
							tmpTARCCmd->TARCtrlPack[tmpDevNO-1].TARCtrlDateSum=DoGetCheckSum(&(tmpTARCCmd->TARCtrlPack[tmpDevNO-1].TARCtrlPcak_ID), 23);
							pTARC->TARCtrlPcak_ReceiveFlg[tmpDevNO-1]=0x55 ;
						}
					}

					if ((tmpTARCCmd->TARCtrlPack[0].TARCtrl_JustTime > SatTime[0])&&(tmpTARCCmd->TARCtrlPack[0].TARCtrl_StartTime > SatTime[0]))
					{
						for (i = 1; i < 30; i++)
						{
							if (pTARC->TARCtrlPcak_ReceiveFlg[i])
							{
								DETLTime1 = (TYPE_CAL)tmpTARCCmd->TARCtrlPack[i].TARCtrl_JustTime - (TYPE_CAL)tmpTARCCmd->TARCtrlPack[i -1].TARCtrl_JustTime - (TYPE_CAL)tmpTARCCmd->TARCtrlPack[i -1].TARCtrl_TimeLength;
								DETLTime2 = (TYPE_CAL)tmpTARCCmd->TARCtrlPack[i].TARCtrl_StartTime - (TYPE_CAL)tmpTARCCmd->TARCtrlPack[i].TARCtrl_JustTime;
								if ((DETLTime1 < 0.0)|| (DETLTime2 < 0.0))
								{
									pTARC->TARDataIn_OK = 0x01;
									break;
								}
							}
							else
							{
								break;
							}
						}
					}
					else
					{
						pTARC->TARDataIn_OK = 0x01;
					}
				}
				else
				{
					for (i = 0; i < 30; i++)
					{
						pTARC->TARCtrlPcak_ReceiveFlg[i]=0x00 ;
					}
					pTARC->TARDataIn_OK = 0x02 ;
				}
				
				if (POSE_OK == pTARC->TARDataIn_OK )
				{
					if(pTARC->TARDataIn_OKCnt<60000)
					{
						pTARC->TARDataIn_OKCnt++;							
					}
					else
					{
						pTARC->TARDataIn_OKCnt = 0;
					}
				}				
				break;						
			}	

			case ATT_CMDMODE_ORBITCTLREQ:			/* 载荷异步包请求 */
			{
				/* 遥测进程下发异步包 */
				((sYaoCePackege*)GETPKGSTRUCT(TM_PKGNO_YB_32))->iCollectTime = 1;//自动开始组包,组包函数清除标识
				break;
			}
				
			//模式自主切换
			case ATT_CMDMODE_MODECHANG:
			{
				if(0x55 == tmpTaskMngDataRcd->bSHDepart)
				{
					tmpConst->AttCmdFlashPara.WorkModeChangeAuto=POSE_NO;
					tmpAtt->sCtlPara.ZK_Ctrl_Reserver111 = POSE_NO;
					pWMod->ATTFlashSwitch = POSE_OK;
				}
				else
				{
					m_pZKTaskInfo->iCmdRes = ERR_CODE_CMDCODE;	/*指令失败*/
				}
				break;
			}

			case ATT_CMDMODE_NOMODECHANG:
			{
				if(0x55 == tmpTaskMngDataRcd->bSHDepart)
				{
					tmpConst->AttCmdFlashPara.WorkModeChangeAuto=POSE_OK;
					pWMod->ATTFlashSwitch = POSE_OK;
				}
				else
				{
					m_pZKTaskInfo->iCmdRes = ERR_CODE_CMDCODE;	/*指令失败*/
				}
				break;
			}
			//单机间互校验
			case ATT_CMDMODE_AllowCThr:
			{
				if(0x55 == tmpTaskMngDataRcd->bSHDepart)
				{
					tmpConst->Allow_Sensor_CThr=0x55;
				}
				else
				{
					m_pZKTaskInfo->iCmdRes = ERR_CODE_CMDCODE;	/*指令失败*/
				}
				break;
			}
			case ATT_CMDMODE_NOAllowCThr:
			{
				if(0x55 == tmpTaskMngDataRcd->bSHDepart)
				{
					tmpConst->Allow_Sensor_CThr=0x00;
				}
				else
				{
					m_pZKTaskInfo->iCmdRes = ERR_CODE_CMDCODE;	/*指令失败*/
				}
				break;
			}

			//清轨道包
			case ATT_CMDOBITRESET:
			{
				pOrb->CurOrbCtrlPcak_ID = 0;
				pOrb->CurOrbCtrlPcak_PreID =0xFF;
				PPPU->PPUT_FIR_Cnt = 0;
				memset(&tmpAtt->sOrbitInp.OrbCtrlPackCur, 0, sizeof(AttOrbCtrlPara_t));
				memset(&tmpOrbCmd->OrbCtrlPack, 0, 50*sizeof(AttOrbCtrlPara_t));
				ZKModDoSet(ATTMOD_ONLTOEARTH);
				pOrb->OrbDataIn_OK = POSE_NO;
				/*清轨道包，当前拍的关PPU动作*/
				dev_can_write(DEV_NO_CAN0, PPUOff, 8);
				PPPU->PPUOUT_Sta = POSE_NO;/*电推指令开关标志为关*/
				tmpAtt->sCtlPara.ZK_Ctrl_Reserver111 = POSE_NO;	
				/*设置下一拍关PPU电源*/
				PPPU->PPU_OrbitCtl_Quit_Err_Flag = POSE_OK;/*正常退出轨控标志使能*/
				PPPU->PPU_OrbitCtl_Quit_Err_Cnt = 0;/*退出轨控后节拍计数清零*/
					
				PPPU->PPU_OrbitCtl_Quit_OK_Flag = POSE_NO;/*正常退出轨控标志使能*/
				PPPU->PPU_OrbitCtl_Quit_OK_Cnt = 0;/*退出轨控后节拍计数清零*/				
				break;		
			}

			//清目标定向包
			case ATT_CMDATTRESET:
			{
				pTARC->CurTARCtrlPcak_ID=0;
				pTARC->CurTARCtrlPcak_PreID =0xFF;
				memset(&tmpAtt->sTARCInp.TARCtrlPackCur, 0, sizeof(sAttTARCCtlPara_t));
				memset(&tmpTARCCmd->TARCtrlPack, 0, 30*sizeof(sAttTARCCtlPara_t));
				ZKModDoSet(ATTMOD_RATEDMP);
				pTARC->TARDataIn_OK = POSE_NO;
				break;
			}

			//姿态基准丢失
			case ATT_CMDMODE_ATTLOSE:
			{
				if(0x55 == tmpTaskMngDataRcd->bSHDepart)
				{
					tmpConst->AllowAttLoseDiagFlg = 0x55;
				}
				else
				{
					m_pZKTaskInfo->iCmdRes = ERR_CODE_CMDCODE;	/*指令失败*/
				}
				break;
			}
			case ATT_CMDMODE_NOATTLOSE:
			{
				if(0x55 == tmpTaskMngDataRcd->bSHDepart)
				{
					tmpConst->AllowAttLoseDiagFlg = 0;
				}
				else
				{
					m_pZKTaskInfo->iCmdRes = ERR_CODE_CMDCODE;	/*指令失败*/
				}
				break;
			}
		
			//姿态超差
			case ATT_CMDMODE_ATTEx:
			{
				if(0x55 == tmpTaskMngDataRcd->bSHDepart)
				{
					tmpConst->AllowAttExDiagFlg = 0x55;
				}
				else
				{
					m_pZKTaskInfo->iCmdRes = ERR_CODE_CMDCODE;	/*指令失败*/
				}
				break;
			}
			case ATT_CMDMODE_NOATTEx:
			{
				if(0x55 == tmpTaskMngDataRcd->bSHDepart)
				{
					tmpConst->AllowAttExDiagFlg = 0;
				}
				else
				{
					m_pZKTaskInfo->iCmdRes = ERR_CODE_CMDCODE;	/*指令失败*/
				}
				break;
			}

			//姿态不稳定
			case ATT_CMDMODE_AttUnSta:
			{
				if(0x55 == tmpTaskMngDataRcd->bSHDepart)
				{
					tmpConst->AllowAttStaDiagFlg = 0x55;
				}
				else
				{
					m_pZKTaskInfo->iCmdRes = ERR_CODE_CMDCODE;	/*指令失败*/
				}
				break;
			}
			case ATT_CMDMODE_NOAttUnSta:
			{
				if(0x55 == tmpTaskMngDataRcd->bSHDepart)
				{
					tmpConst->AllowAttStaDiagFlg = 0;
				}
				else
				{
					m_pZKTaskInfo->iCmdRes = ERR_CODE_CMDCODE;	/*指令失败*/
				}
				break;
			}
				
			//模式切换相关参数
			case ATT_CMDCODE_MODPARAM:
			{
				tmpWorkModPre = *tmpData;
				tmpWorkMod = *(tmpData + 1);
				tmpWlimit = DoGetFloatFrom8(tmpData+2)*ANG2RADIAN;
				tmpAlimit = DoGetFloatFrom8(tmpData+6) *ANG2RADIAN;
				tmpTimeLmt = DoGetInt16From8(tmpData+10);
				tmpTimeLmt1 = DoGetInt16From8(tmpData+12);
				tmpAngm = DoGetFloatFrom8(tmpData+14);
							
				if((tmpWorkMod & 0x0F) > 0x0B)
				{
					m_pZKTaskInfo->iCmdRes = ERR_CODE_CMDCODE;
					break;
				}
				if(ATTMOD_NOCOLL == tmpWorkModPre)       //1、碰撞规避模式
				{
					tmpConst->judge_time1=tmpTimeLmt;
				}
				else if(ATTMOD_RATEDMP == tmpWorkModPre)
				{
					tmpConst->judge_time2 = tmpTimeLmt;
					tmpConst->RateThr_2T3	=tmpWlimit;
					tmpConst->HWHLThr_2T3 = tmpAngm;
				}
				else if(ATTMOD_WhlTOSUN == tmpWorkModPre)
				{
					tmpConst->judge_time3 = tmpTimeLmt;
					tmpConst->AttCmdFlashPara.judgeWait_time = tmpTimeLmt1;
					tmpConst->AngThr_3TB = tmpAlimit;
					tmpConst->RateThr_3TB = tmpWlimit;
					pWMod->ATTFlashSwitch = POSE_OK;
				}
				else if(ATTMOD_MagTOSUN == tmpWorkModPre)
				{
					tmpConst->judge_time4 = tmpTimeLmt;
					tmpConst->AngThr_3TB = tmpAlimit;
					tmpConst->RateThr_3TB = tmpWlimit;
				}
				else if(ATTMOD_ONLTOEARTH == tmpWorkModPre)
				{
					tmpConst->judge_time5 = tmpTimeLmt;
					tmpConst->AngThr_5T6 = tmpAlimit;
					tmpConst->RateThr_5T6 = tmpWlimit;
				}
				else if(ATTMOD_WHEELTOEARTH == tmpWorkModPre)
				{
					tmpConst->judge_time6 = tmpTimeLmt;
				}
				else if(ATTMOD_ATTAJUSTPRE == tmpWorkModPre)
				{
					tmpConst->judge_time7 = tmpTimeLmt;
				}
				else if(ATTMOD_ORBITCTL == tmpWorkModPre)
				{
					tmpConst->judge_time8 = tmpTimeLmt;
				}
				else if(ATTMOD_ATTAJUST == tmpWorkModPre)
				{
					tmpConst->judge_time9 = tmpTimeLmt;
					tmpConst->AngThr_9TA = tmpAlimit;
					tmpConst->RateThr_9TA = tmpWlimit;
				}
				else if(ATTMOD_ONLTOTAR == tmpWorkModPre)
				{
					tmpConst->judge_timeA = tmpTimeLmt;
				}
				else if(ATTMOD_UNCTL == tmpWorkModPre)
				{
					tmpConst->judge_timeB = tmpTimeLmt;
				}
				else
				{
					m_pZKTaskInfo->iCmdRes = ERR_CODE_CMDCODE; 	/*指令失败*/
				}
				break;
			}
					
			//太敏
			case ATT_CMDCODE_ASS:
			{
                tmpCOMDCHOICE =*(tmpData) ; 
				
				switch (tmpCOMDCHOICE)
				{
					case    0x11 :		
					{
						tmpConst->Ass_MinFour_limt[0] = DoGetFloatFrom8(tmpData+1 +0);						//4片模拟太敏电压阈值
						tmpConst->Ass_MaxFour_limt[0] = DoGetFloatFrom8(tmpData+1 +4);						//4片模拟太敏电压阈值
						break;						
					}
					case	0x22:		
					{
						tmpConst->Ass_MinFour_limt[1] = DoGetFloatFrom8(tmpData+1 +0);						//4片模拟太敏电压阈值
						tmpConst->Ass_MaxFour_limt[1] = DoGetFloatFrom8(tmpData+1 +4);						//4片模拟太敏电压阈值
						break;
					}
					default:
					break;				
				}
				break;	
			}

			//互校验阈值上注
			case ATT_CMDCROSSCHECKTHR:
			{
				tmpConst->SS_SS_CThr = DoGetFloatFrom8(tmpData)*ANG2RADIAN;
				tmpConst->SS_ASS_CCThr = DoGetFloatFrom8(tmpData + 4)*ANG2RADIAN;
				tmpConst->SS_ASS_CThr = DoGetFloatFrom8(tmpData + 8)*ANG2RADIAN;
				tmpConst->AttCmdFlashPara.SS_MAG_CThr = DoGetFloatFrom8(tmpData + 12)*ANG2RADIAN;
				tmpConst->SS_GYRO_CThr = DoGetFloatFrom8(tmpData + 16)*ANG2RADIAN;
				tmpConst->GYRO_GYRO_CThr = DoGetFloatFrom8(tmpData + 20)*ANG2RADIAN;
				tmpConst->MAG_MAG_CThr = DoGetFloatFrom8(tmpData + 24);
				pWMod->ATTFlashSwitch = POSE_OK;
				break;
			}
			
			//单机异常状态
			case ATT_CMDCROSSERR:
			{
				tmpConst->AllowssONOFF[0] = *(tmpData );
				tmpConst->AllowssONOFF[1] = *(tmpData +1);
				tmpConst->AllowssONOFF[2] = *(tmpData +2);
				tmpConst->AllowMagONOFF[0] = *(tmpData+3);
				tmpConst->AllowMagONOFF[1] = *(tmpData +4);
				tmpConst->AllowGyroONOFF[0] = *(tmpData +5);
				tmpConst->AllowGyroONOFF[1] = *(tmpData +6);
				tmpConst->AllowGyroONOFF[2] = *(tmpData +7);
				tmpConst->AllowWhlONOFF[0] = *(tmpData +8);
				tmpConst->AllowWhlONOFF[1] = *(tmpData +9);
				tmpConst->AllowWhlONOFF[2] = *(tmpData +10);
				tmpConst->AllowWhlONOFF[3] = *(tmpData +11);
				tmpConst->AllowPPUONOFF = *(tmpData +12);			
				break;
			}			

			//单机使用状态
			case ATT_CMDCROSSUSE:
			{
				pIMU->SSUseState[0] = *(tmpData);
				pIMU->SSUseState[1] = *(tmpData + 1);
				pIMU->SSUseState[2] = *(tmpData + 2);
				pIMU->AssUseState[0] = *(tmpData + 3);
				pIMU->AssUseState[1] = *(tmpData + 4);
				pIMU->AssUseState[2] = *(tmpData + 5);
				pIMU->AssUseState[3] = *(tmpData + 6);
				pIMU->AssUseState[4] = *(tmpData + 7);
				pIMU->AssUseState[5] = *(tmpData + 8);
				pIMU->MagUseState[0] = *(tmpData + 9);
				pIMU->MagUseState[1] = *(tmpData + 10);
				pIMU->GyroUseState[0] = *(tmpData + 11);
				pIMU->GyroUseState[1] = *(tmpData + 12);
				pIMU->GyroUseState[2] = *(tmpData + 13);
				pIMU->Whl_Use[0] = *(tmpData + 14);
				pIMU->Whl_Use[1] = *(tmpData + 15);
				pIMU->Whl_Use[2] = *(tmpData + 16);
				pIMU->Whl_Use[3] = *(tmpData + 17);
				pIMU->MTUseStatus[0] = *(tmpData + 18);
				pIMU->MTUseStatus[1] = *(tmpData + 19);
				pIMU->MTUseStatus[2] = *(tmpData + 20);
				pIMU->MTUseStatus[3] = *(tmpData + 21);
				pIMU->PPUUseStatus= *(tmpData + 22);
				break;
			}			

			//单机重构状态注入
			case ATT_CMDCROSS:
			{
				//星敏优先级
				if (*(tmpData+0) != *(tmpData +1))
				{
					if (*(tmpData+0) != *(tmpData +2))
					{
						tmpConst->SSUsePrior[0]= *(tmpData) ;
						tmpConst->SSUsePrior[1]= *(tmpData +1) ;
						tmpConst->SSUsePrior[2]= *(tmpData +2) ;						
					}
				}

				//陀螺优先级
				if (*(tmpData+3) != *(tmpData +4))
				{
					if (*(tmpData+3) != *(tmpData +5))
					{
						tmpConst->GyroUsePrior[0]= *(tmpData +3) ;
						tmpConst->GyroUsePrior[1]= *(tmpData +4) ;
						tmpConst->GyroUsePrior[2]= *(tmpData +5) ;
					}
				}
				break;
			}
			case ATT_CMDCREUSE:
			{
				tmpConst->AttCmdFlashPara.Mag_ComRESW[0] = *(tmpData);
				tmpConst->AttCmdFlashPara.Mag_ComRESW[1] = *(tmpData+1);
				tmpConst->AttCmdFlashPara.Mag_ComRESW[2] = *(tmpData+2);
				
				tmpConst->AttCmdFlashPara.Gyro_ComRESW[0] = *(tmpData+3);
				tmpConst->AttCmdFlashPara.Gyro_ComRESW[1] = *(tmpData+4);
				tmpConst->AttCmdFlashPara.Gyro_ComRESW[2] = *(tmpData+5);
				pWMod->ATTFlashSwitch = POSE_OK;
				break;
			}

			//单机故障诊断条件
			case ATT_CMDCROSSDIG:
			{
				tmpConst->ssDiagThr = DoGetInt16From8(tmpData) ;
				tmpConst->MagDiagThr= DoGetInt16From8(tmpData +2) ;
				tmpConst->GyroDiagThr= DoGetInt16From8(tmpData +4) ;
				tmpConst->WhlDiag_ErrThr= DoGetInt16From8(tmpData +6) ;					//判断时间阈值,单位,可上注
				tmpConst->WhlDiag_TimeThr= DoGetInt16From8(tmpData +8) ;				//判断时间阈值,单位,可上注
				tmpConst->WhlTemperDiagThr= DoGetInt16From8(tmpData +10) ;				//判断时间阈值,单位,可上注
				break;
			}

			//PPU故障诊断条件
			case ATT_CMDCPPUDIG:
			{
				tmpConst->PPUTXTimeLimit=DoGetInt16From8(tmpData );					//电推通信故障时间阈值30
				tmpConst->PPUTATimeLimit=DoGetInt16From8(tmpData+2);					//电推过流故障时间阈值60
				tmpConst->AttCmdFlashPara.PPUTALimit=DoGetInt16From8(tmpData+4);						//电推过流故障阈值  1.6
				tmpConst->PPUTVTimeLimit=DoGetInt16From8(tmpData+6);					//电推过压故障时间阈值60
				tmpConst->AttCmdFlashPara.PPUTVLimit=DoGetInt16From8(tmpData+8);						//电推过压故障阈值260
				tmpConst->AttCmdFlashPara.PPUTFireLimit=DoGetInt16From8(tmpData+10);					//电推点火故障阈值300
				tmpConst->PPUTemperTimeLimit=DoGetInt16From8(tmpData+12);				//电推温度故障时间阈值 10
				tmpConst->AttCmdFlashPara.PPUHTemperLimit=DoGetInt16From8(tmpData+14);				//电推温度故障上限阈值   30
				tmpConst->AttCmdFlashPara.PPULTemperLimit=DoGetInt16From8(tmpData+16);				//电推温度故障下限阈值   10
				pWMod->ATTFlashSwitch = POSE_OK;
				break;
			}

			//单机故障诊断时间
			case ATT_CMDCDIGTIME:
			{
                tmpCOMDCHOICE =*(tmpData) ;
                switch (tmpCOMDCHOICE)
                {
	                case    0x11 :
	                {
		                tmpConst->Ss_Delay_CntLimt =DoGetInt16From8(tmpData + 1) ;						//星敏开机异常延迟判断计数
		                tmpConst->Ss_OK_CntLimt= DoGetInt16From8(tmpData+2+ 1) ;						//星敏正常判断计数
		                tmpConst->Ss_Err_CntLimt= DoGetInt16From8(tmpData+4+ 1) ;						//星敏异常判断计数						
		                tmpConst->Ss_ReSet_CntLimt=DoGetInt16From8(tmpData+6+ 1) ;						//星敏重启总次数
		                tmpConst->Ss_ReSetGAP_CntLimt=DoGetInt16From8(tmpData+8+ 1) ;					//星敏重启间隔拍数
		                break;
	                }
	                case    0x22 :
	                {
		                tmpConst->Mag_Delay_CntLimt =DoGetInt16From8(tmpData+ 1) ;						//磁强计开机异常延迟判断计数
		                tmpConst->Mag_OK_CntLimt= DoGetInt16From8(tmpData+2+ 1) ;						//磁强计正常判断计数
		                tmpConst->Mag_Err_CntLimt= DoGetInt16From8(tmpData+4+ 1) ;						//磁强计异常判断计数
		                tmpConst->Mag_ReSet_CntLimt=DoGetInt16From8(tmpData+6+ 1) ;						//磁强计重启总次数
		                tmpConst->Mag_ReSetGAP_CntLimt=DoGetInt16From8(tmpData+8+ 1) ;					//磁强计重启间隔拍数
		                break;
	                }
	                case    0x33 :
	                {
		                tmpConst->Gyro_Delay_CntLimt =DoGetInt16From8(tmpData+ 1) ;						//陀螺开机异常延迟判断计数
		                tmpConst->Gyro_OK_CntLimt= DoGetInt16From8(tmpData+2+ 1) ;						//陀螺正常判断计数
		                tmpConst->Gyro_Err_CntLimt= DoGetInt16From8(tmpData+4+ 1) ;						//陀螺异常判断计数
		                tmpConst->Gyro_ReSet_CntLimt=DoGetInt16From8(tmpData+6+ 1) ;					//陀螺重启总次数
		                tmpConst->Gyro_ReSetGAP_CntLimt=DoGetInt16From8(tmpData+8+ 1) ;					//陀螺重启间隔拍数
		                break;
	                }
	                case    0x44 :
	                {
		                tmpConst->Whl_Delay_CntLimt =DoGetInt16From8(tmpData+ 1) ;						//飞轮开机异常延迟判断计数
		                tmpConst->Whl_OK_CntLimt= DoGetInt16From8(tmpData+2+ 1) ;						//飞轮正常判断计数
		                tmpConst->Whl_Err_CntLimt= DoGetInt16From8(tmpData+4+ 1) ;						//飞轮异常判断计数
		                tmpConst->Whl_ReSet_CntLimt=DoGetInt16From8(tmpData+6+ 1) ;						//飞轮重启总次数
		                tmpConst->Whl_ReSetGAP_CntLimt=DoGetInt16From8(tmpData+8+ 1) ;					//飞轮重启间隔拍数
		                break;
	                }
	                case    0x55 :
	                {
		                tmpConst->PPU_Delay_CntLimt =DoGetInt16From8(tmpData+ 1) ;						//飞轮开机异常延迟判断计数
		                tmpConst->PPU_OK_CntLimt= DoGetInt16From8(tmpData+2+ 1) ;						//飞轮正常判断计数
		                tmpConst->PPU_Err_CntLimt= DoGetInt16From8(tmpData+4+ 1) ;						//飞轮异常判断计数
		                tmpConst->PPU_ReSet_CntLimt=DoGetInt16From8(tmpData+6+ 1) ;						//飞轮重启总次数
		                tmpConst->PPU_ReSetGAP_CntLimt=DoGetInt16From8(tmpData+8+ 1) ;					//飞轮重启间隔拍数
		                break;
	                }
	                default:
	                break;
                }
                break;
			}

			//基准丢失故障诊断条件
			case ATT_CMDCDIGLOSE:
			{
                tmpCOMDCHOICE =*(tmpData) ;               
                switch (tmpCOMDCHOICE)
                {
	                case	ATTMOD_RATEDMP :			
	                {
		                tmpConst->TimeThr_AttLoseDiag[0] = DoGetInt16From8(tmpData+1 );	
		                break;
	                }
					case	ATTMOD_WhlTOSUN:
	                {
		                tmpConst->TimeThr_AttLoseDiag[1] = DoGetInt16From8(tmpData+1 );
		                break;
	                }
	                case    ATTMOD_MagTOSUN :
	                {
		                tmpConst->TimeThr_AttLoseDiag[2] = DoGetInt16From8(tmpData+1 );
		                break;
	                }
	                case    ATTMOD_ONLTOEARTH :
	                {
		                tmpConst->TimeThr_AttLoseDiag[3] = DoGetInt16From8(tmpData+1 );
		                break;
	                }
	                case    ATTMOD_WHEELTOEARTH :
	                {
		                tmpConst->TimeThr_AttLoseDiag[4] = DoGetInt16From8(tmpData+1 );
		                break;
	                }
	                case    ATTMOD_ATTAJUSTPRE :
	                {
		                tmpConst->TimeThr_AttLoseDiag[5] = DoGetInt16From8(tmpData+1 );
		                break;
	                }					
	                case    ATTMOD_ORBITCTL :
	                {
		                tmpConst->TimeThr_AttLoseDiag[6] = DoGetInt16From8(tmpData+1 );
		                break;
	                }
	                case    ATTMOD_ATTAJUST :
	                {
		                tmpConst->TimeThr_AttLoseDiag[7] = DoGetInt16From8(tmpData+1 );
		                break;
	                }
	                case    ATTMOD_ONLTOTAR :
	                {
		                tmpConst->TimeThr_AttLoseDiag[8] = DoGetInt16From8(tmpData+1 );
		                break;
	                }																			                
	                default:
	                break;
                }
				break;
			}
			
			//超差故障诊断条件
			case ATT_CMDCDIGEX:
			{
                tmpCOMDCHOICE =*(tmpData) ;
                switch (tmpCOMDCHOICE)
                {
	                case	ATTMOD_RATEDMP :
	                {
		                tmpConst->TimeThr_AttEx[0] = DoGetInt16From8(tmpData+1 );
		                tmpConst->RateThr_AttEx[0] = DoGetFloatFrom8(tmpData+1 +2) *ANG2RADIAN;
		                tmpConst->AngThr_AttEx[0] = DoGetFloatFrom8(tmpData+1 +6)*ANG2RADIAN;
		                break;
	                }
	                case	ATTMOD_WhlTOSUN:
	                {
		                tmpConst->TimeThr_AttEx[1] = DoGetInt16From8(tmpData+1 );
		                tmpConst->RateThr_AttEx[1] = DoGetFloatFrom8(tmpData+1 +2)*ANG2RADIAN;
		                tmpConst->AngThr_AttEx[1] = DoGetFloatFrom8(tmpData+1 +6)*ANG2RADIAN;
		                break;
	                }
	                case    ATTMOD_MagTOSUN :
	                {
		                tmpConst->TimeThr_AttEx[2] = DoGetInt16From8(tmpData+1 );
		                tmpConst->RateThr_AttEx[2] = DoGetFloatFrom8(tmpData+1 +2)*ANG2RADIAN;
		                tmpConst->AngThr_AttEx[2] = DoGetFloatFrom8(tmpData+1 +6)*ANG2RADIAN;
		                break;
	                }

	                case    ATTMOD_ONLTOEARTH :
	                {
		                tmpConst->TimeThr_AttEx[3] = DoGetInt16From8(tmpData+1 );
		                tmpConst->RateThr_AttEx[3] = DoGetFloatFrom8(tmpData+1 +2)*ANG2RADIAN;
		                tmpConst->AngThr_AttEx[3] = DoGetFloatFrom8(tmpData+1 +6)*ANG2RADIAN;
		                break;
	                }

	                case    ATTMOD_WHEELTOEARTH :
	                {
		                tmpConst->TimeThr_AttEx[4] = DoGetInt16From8(tmpData+1 );
		                tmpConst->RateThr_AttEx[4] = DoGetFloatFrom8(tmpData+1 +2)*ANG2RADIAN;
		                tmpConst->AngThr_AttEx[4] = DoGetFloatFrom8(tmpData+1 +6)*ANG2RADIAN;
						tmpConst->YawCntLimit = DoGetInt16From8(tmpData+1+10 );
		                break;
	                }
	                
	                case    ATTMOD_ATTAJUSTPRE :
					{
		                tmpConst->TimeThr_AttEx[5] = DoGetInt16From8(tmpData+1 );
		                tmpConst->RateThr_AttEx[5] = DoGetFloatFrom8(tmpData+1 +2)*ANG2RADIAN;
		                tmpConst->AngThr_AttEx[5] = DoGetFloatFrom8(tmpData+1 +6)*ANG2RADIAN;
		                break;
	                }

	                case    ATTMOD_ORBITCTL :
	                {
		                tmpConst->TimeThr_AttEx[6] = DoGetInt16From8(tmpData+1 );
		                tmpConst->RateThr_AttEx[6] = DoGetFloatFrom8(tmpData+1 +2)*ANG2RADIAN;
		                tmpConst->AngThr_AttEx[6] = DoGetFloatFrom8(tmpData+1 +6)*ANG2RADIAN;
		                break;
	                }

	                case    ATTMOD_ATTAJUST :
	                {
		                tmpConst->TimeThr_AttEx[7] = DoGetInt16From8(tmpData+1 );
		                tmpConst->RateThr_AttEx[7] = DoGetFloatFrom8(tmpData+1 +2)*ANG2RADIAN;
		                tmpConst->AngThr_AttEx[7] = DoGetFloatFrom8(tmpData+1 +6)*ANG2RADIAN;
		                break;
	                }

	                case    ATTMOD_ONLTOTAR :
	                {
		                tmpConst->TimeThr_AttEx[8] = DoGetInt16From8(tmpData+1 );
		                tmpConst->RateThr_AttEx[8] = DoGetFloatFrom8(tmpData+1 +2)*ANG2RADIAN;
		                tmpConst->AngThr_AttEx[8] = DoGetFloatFrom8(tmpData+1 +6)*ANG2RADIAN;
		                break;
	                }
	                default:
	                break;
                }
				break;
			}

			//姿态不稳定故障诊断条件
			case ATT_CMDCDIGNOSTATE:
			{
                tmpCOMDCHOICE =*(tmpData) ;
                switch (tmpCOMDCHOICE)
                {
	                case    ATTMOD_RATEDMP :
	                {
		                tmpConst->TimeThr_AttUnSta[0] = DoGetInt16From8(tmpData+1 );
						tmpConst->TimeMod_AttUnSta[0] = DoGetInt16From8(tmpData+1 +2 );
		                tmpConst->RateThr_AttUnSta[0] = DoGetFloatFrom8(tmpData+1 +2 +2)*ANG2RADIAN;
		                tmpConst->AngThr_AttUnSta[0] = DoGetFloatFrom8(tmpData+1 +4 +4)*ANG2RADIAN;
		                break;
	                }
	                case ATTMOD_WhlTOSUN:
	                {
		                tmpConst->TimeThr_AttUnSta[1] = DoGetInt16From8(tmpData+1 );
		                tmpConst->TimeMod_AttUnSta[1] = DoGetInt16From8(tmpData+1 +2 );
		                tmpConst->RateThr_AttUnSta[1] = DoGetFloatFrom8(tmpData+1 +2 +2)*ANG2RADIAN;
		                tmpConst->AngThr_AttUnSta[1] = DoGetFloatFrom8(tmpData+1 +4 +4)*ANG2RADIAN;
		                break;
	                }
	                case    ATTMOD_MagTOSUN :
	                {
		                tmpConst->TimeThr_AttUnSta[2] = DoGetInt16From8(tmpData+1 );
		                tmpConst->TimeMod_AttUnSta[2] = DoGetInt16From8(tmpData+1 +2 );
		                tmpConst->RateThr_AttUnSta[2] = DoGetFloatFrom8(tmpData+1 +2 +2)*ANG2RADIAN;
		                tmpConst->AngThr_AttUnSta[2] = DoGetFloatFrom8(tmpData+1 +4 +4)*ANG2RADIAN;
		                break;
	                }

	                case    ATTMOD_ONLTOEARTH :
	                {
		                tmpConst->TimeThr_AttUnSta[3] = DoGetInt16From8(tmpData+1 );
		                tmpConst->TimeMod_AttUnSta[3] = DoGetInt16From8(tmpData+1 +2 );
		                tmpConst->RateThr_AttUnSta[3] = DoGetFloatFrom8(tmpData+1 +2 +2)*ANG2RADIAN;
		                tmpConst->AngThr_AttUnSta[3] = DoGetFloatFrom8(tmpData+1 +4 +4)*ANG2RADIAN;
		                break;
	                }
               
	                case    ATTMOD_ATTAJUSTPRE :
	                {
		                tmpConst->TimeThr_AttUnSta[4] = DoGetInt16From8(tmpData+1 );
		                tmpConst->TimeMod_AttUnSta[4] = DoGetInt16From8(tmpData+1 +2 );
		                tmpConst->RateThr_AttUnSta[4] = DoGetFloatFrom8(tmpData+1 +2 +2)*ANG2RADIAN;
		                tmpConst->AngThr_AttUnSta[4] = DoGetFloatFrom8(tmpData+1 +4+4)*ANG2RADIAN;
		                break;
	                }
	                case    ATTMOD_ATTAJUST :
	                {
		                tmpConst->TimeThr_AttUnSta[5] = DoGetInt16From8(tmpData+1 );
		                tmpConst->TimeMod_AttUnSta[5] = DoGetInt16From8(tmpData+1 +2 );
		                tmpConst->RateThr_AttUnSta[5] = DoGetFloatFrom8(tmpData+1 +2 +2)*ANG2RADIAN;
		                tmpConst->AngThr_AttUnSta[5] = DoGetFloatFrom8(tmpData+1 +4 +4)*ANG2RADIAN;
		                break;
	                }
	                default:
	                break;
                }
                break;
			}
			
			//配平轮转速力矩阈值
			case ATT_CMDWHLSLIMT:
			{
				tmpConst->WheelD_NomSpeed = DoGetFloatFrom8(tmpData);   //rpm
				tmpConst->WheelD_SpeedErrThr =  DoGetFloatFrom8(tmpData+4);
				tmpConst->WheelD_Default =  DoGetFloatFrom8(tmpData+8);
				tmpConst->WheelD_AllDefault =  DoGetFloatFrom8(tmpData+12);
				break;
			}	
						
			/**********************************安装矩阵*********************************/
			//星敏安装矩阵注入
			case ATT_CMDCODE_SSMAT:
			{
                tmpCOMDCHOICE =*(tmpData) ;
                switch (tmpCOMDCHOICE)
				{
					case    0x11 :
					{
						for(i=0; i<3; i++)
						{
							for (k=0; k<3; k++)
							{
								tmpConst->AttCmdFlashPara.M_SSA[i][k] = DoGetFloatFrom8(tmpData+i*12+k*4 + 1);
							}
						}
						break;
					}					
					case    0x22 :
					{
						for(i=0; i<3; i++)
						{
							for (k=0; k<3; k++)
							{
								tmpConst->AttCmdFlashPara.M_SSB[i][k] = DoGetFloatFrom8(tmpData+i*12+k*4 + 1);
							}
						}
						break;
					}
					case    0x44 :
					{
						for(i=0; i<3; i++)
						{
							for (k=0; k<3; k++)
							{
								tmpConst->AttCmdFlashPara.M_SSC[i][k] = DoGetFloatFrom8(tmpData+i*12+k*4 + 1);
							}
						}
						break;
					}
	                default:
	                break;					
				}
				pWMod->ATTFlashSwitch = POSE_OK;
				break;
			}
			
			//太敏安装矩阵注入
			case ATT_CMDCODE_ASSMAT:
			{
				tmpDevNO = *tmpData;   //太敏选择
				if(0x11 == tmpDevNO)
				{
					for(i=0; i<3; i++)
					{
						for (k=0; k<3; k++)
						{
							tmpConst->AttCmdFlashPara.M_aSSA[i][k] =  DoGetFloatFrom8(tmpData+i*12+k*4+1);
						}
					}
				}
				else if(0x22 == tmpDevNO)
				{
					for(i=0; i<3; i++)
					{
						for (k=0; k<3; k++)
						{
							tmpConst->AttCmdFlashPara.M_aSSB[i][k] =  DoGetFloatFrom8(tmpData+i*12+k*4+1);
						}
					}
				}
				else if(0x33 == tmpDevNO)
				{
					for(i=0; i<3; i++)
					{
						for (k=0; k<3; k++)
						{
							tmpConst->AttCmdFlashPara.M_aSSC[i][k] =  DoGetFloatFrom8(tmpData+i*12+k*4+1);
						}
					}
				}
				else if(0x44 == tmpDevNO)
				{
					for(i=0; i<3; i++)
					{
						for (k=0; k<3; k++)
						{
							tmpConst->AttCmdFlashPara.M_aSSD[i][k] =  DoGetFloatFrom8(tmpData+i*12+k*4+1);
						}
					}
				}
				else if(0x55 == tmpDevNO)
				{
					for(i=0; i<3; i++)
					{
						for (k=0; k<3; k++)
						{
							tmpConst->AttCmdFlashPara.M_aSSE[i][k] =  DoGetFloatFrom8(tmpData+i*12+k*4+1);
						}
					}
				}
				else if(0x66 == tmpDevNO)
				{
					for(i=0; i<3; i++)
					{
						for (k=0; k<3; k++)
						{
							tmpConst->AttCmdFlashPara.M_aSSF[i][k] =  DoGetFloatFrom8(tmpData+i*12+k*4+1);
						}
					}
				}
				else
				{
					m_pZKTaskInfo->iCmdRes = ERR_CODE_CMDCODE;
				}
				pWMod->ATTFlashSwitch = POSE_OK;
				break;
			}

			//磁强计安装矩阵注入
			case ATT_CMDCODE_MAGMAT:
			{
                tmpCOMDCHOICE =*(tmpData) ;
                switch (tmpCOMDCHOICE)
                {
	                case    0x11 :
	                {
						for(i=0; i<3; i++)
						{
							for(k=0; k<3; k++)
							{
								tmpConst->AttCmdFlashPara.M_MAG[0][i][k] =  DoGetFloatFrom8(tmpData+i*12+k*4 +1);
							}
						}
						break;
	                }
	                case    0x22 :
	                {
						for(i=0; i<3; i++)
						{
							for(k=0; k<3; k++)
							{
								tmpConst->AttCmdFlashPara.M_MAG[1][i][k] =  DoGetFloatFrom8(tmpData+i*12+k*4 +1);
							}
						}
						break;
	                }
	                default:
	                break;
                }
				pWMod->ATTFlashSwitch = POSE_OK;
                break;
			}

			//陀螺安装矩阵注入
			case ATT_CMDCODE_GyroMAT:
			{
                tmpCOMDCHOICE =*(tmpData) ;
                switch (tmpCOMDCHOICE)
                {
	                case    0x11 :
	                {
						for(i=0; i<3; i++)
						{
							for (k=0; k<3; k++)
							{
								tmpConst->AttCmdFlashPara.M_GYRO[0][i][k] = DoGetFloatFrom8(tmpData+i*12+k*4 +1);
							}
						}
						break;
	                }
	                case    0x22 :
	                {
						for(i=0; i<3; i++)
						{
							for (k=0; k<3; k++)
							{
								tmpConst->AttCmdFlashPara.M_GYRO[1][i][k] = DoGetFloatFrom8(tmpData+i*12+k*4 +1);
							}
						}
						break;
	                }
	                case    0x44 :
	                {
						for(i=0; i<3; i++)
						{
							for (k=0; k<3; k++)
							{
								tmpConst->AttCmdFlashPara.M_GYRO[2][i][k] = DoGetFloatFrom8(tmpData+i*12+k*4 +1);
							}
						}
						break;
	                }
	                default:
	                break;
                }
				pWMod->ATTFlashSwitch = POSE_OK;
                break;
			}

			//反作用轮安装矩阵注入
			case ATT_CMDCODE_WHLMAT:
			{
                tmpCOMDCHOICE =*(tmpData) ;
                switch (tmpCOMDCHOICE)
                {
	                case    0x11 :
	                {
						for(i=0; i<3; i++)
						{
							tmpConst->AttCmdFlashPara.M_Wheel[i][0] = DoGetFloatFrom8(tmpData+i*4 +1);
						}
						break;
	                }
	                case    0x22 :
	                {
						for(i=0; i<3; i++)
						{
							tmpConst->AttCmdFlashPara.M_Wheel[i][1] = DoGetFloatFrom8(tmpData+i*4 +1);
						}
						break;
	                }
	                case    0x44 :
	                {
						for(i=0; i<3; i++)
						{
							tmpConst->AttCmdFlashPara.M_Wheel[i][2] = DoGetFloatFrom8(tmpData+i*4 +1);
						}
						break;
	                }
					
	                case    0x88 :
	                {
						for(i=0; i<3; i++)
						{
							tmpConst->AttCmdFlashPara.M_Wheel[i][3] = DoGetFloatFrom8(tmpData+i*4 +1);
						}
						break;
	                }					
	                default:
	                break;
				}
				pWMod->ATTFlashSwitch = POSE_OK;
				break;
			}

			//磁力矩器安装矩阵注入
			case ATT_CMDCODE_MTMAT:
			{
                tmpCOMDCHOICE =*(tmpData) ;
                switch (tmpCOMDCHOICE)
                {
	                case    0x11 :
	                {
		                for(i=0; i<3; i++)
		                {
			                tmpConst->AttCmdFlashPara.M_MAGCtrl[i][0] =  DoGetFloatFrom8(tmpData+i*4 +1);
		                }
		                break;
	                }
	                case    0x22 :
	                {
		                for(i=0; i<4; i++)
		                {
							tmpConst->AttCmdFlashPara.M_MAGCtrl[i][1] =  DoGetFloatFrom8(tmpData+i*4 +1);
		                }
		                break;
	                }
	                case    0x44 :
	                {
		                for(i=0; i<4; i++)
		                {
			                tmpConst->AttCmdFlashPara.M_MAGCtrl[i][2] =  DoGetFloatFrom8(tmpData+i*4 +1);
		                }
		                break;
	                }
	                
	                case    0x88 :
	                {
		                for(i=0; i<4; i++)
		                {
			                tmpConst->AttCmdFlashPara.M_MAGCtrl[i][3] =  DoGetFloatFrom8(tmpData+i*4 +1);
		                }
		                break;
	                }
	                default:
	                break;
                }
				pWMod->ATTFlashSwitch = POSE_OK;
                break;
			}

			//磁阻尼控制器注入
			case ATT_CMDCODE_DMPPARA:
			{
				tmpConst->Mag_Bb_CtrlMax = DoGetFloatFrom8(tmpData);
				tmpConst->Mag_DampBdotMin = DoGetFloatFrom8(tmpData+4);
				tmpConst->MTCtrlTIME= DoGetInt16From8(tmpData+ 8);	
				break;
			}
			
			//磁控对日控制器参数注入
			case ATT_CMDCODE_TOSUNPARA:
			{
                tmpCOMDCHOICE =*(tmpData) ;
                switch (tmpCOMDCHOICE)
				{
					case    0x55 :
					{
						for (i = 0; i < 3; i++)
						{
							tmpConst->Mag_Kp[i] = DoGetFloatFrom8(tmpData+i*4 +1);  
						}
						for (i = 0; i < 3; i++)
						{
							tmpConst->Mag_Kd[i] = DoGetFloatFrom8(tmpData+i*4+12+1);
						}
						tmpConst->Mag_WTOSUN=DoGetFloatFrom8(tmpData + 12 + 12 +1) *ANG2RADIAN ;	
						break;					
					}

					case    0xAA :
					{
						for (i = 0; i < 3; i++)
						{
							tmpConst->Mag_KpFBZK[i] = DoGetFloatFrom8(tmpData+i*4+1); 
						}
						for (i = 0; i < 3; i++)
						{
							tmpConst->Mag_KdFBZK[i] = DoGetFloatFrom8(tmpData+i*4+ 12+1);
						}
						tmpConst->Mag_FBZKWTOSUN=DoGetFloatFrom8(tmpData + 12 + 12 +1) *ANG2RADIAN ;						
						break;				
					}
					default:
					break;	
				}
				tmpConst->Mag_ATTTOSUN=DoGetFloatFrom8(tmpData + 12 + 12 + 4+1) *ANG2RADIAN ;	
				break;
			}

			//磁卸载控制器参数注入
			case ATT_CMDCODE_MTCTRLPARA:
			{
				tmpConst->k1_dump		= DoGetFloatFrom8(tmpData);
				tmpConst->k2_dump		= DoGetFloatFrom8(tmpData+4);
				tmpConst->MTAtt_dump	= DoGetFloatFrom8(tmpData+8) *ANG2RADIAN ;
				tmpConst->ku_dump		= DoGetFloatFrom8(tmpData+12);
				break;
			}

			//飞轮PD控制器参数注入
			case ATT_CMDCODE_PDCTRLPARA:
			{
				tmpWorkMod =*tmpData;
				if (tmpWorkMod == 0xAA)
				{
					for(i=0; i<3; i++)
					{
						tmpConst->AttCmdFlashPara.kp_ToSun_PD[i] = DoGetFloatFrom8(tmpData+1+i*4);
						tmpConst->AttCmdFlashPara.kd_ToSun_PD[i]  = DoGetFloatFrom8(tmpData+13+i*4);
					}
					tmpConst->AttCmdFlashPara.w0max_PD = DoGetFloatFrom8(tmpData+13+12) * ANG2RADIAN;
					tmpConst->AttCmdFlashPara.PD_Ts = DoGetFloatFrom8(tmpData+13+12 +4);
				}
				else if (tmpWorkMod == 0x55)
				{
					for(i=0; i<3; i++)
					{
						tmpConst->kp_NoToSun_PD[i] = DoGetFloatFrom8(tmpData+1+i*4);
						tmpConst->kd_NoToSun_PD[i]  = DoGetFloatFrom8(tmpData+13+i*4);
					}
					tmpConst->w0max_NoPD = DoGetFloatFrom8(tmpData+13+12) * ANG2RADIAN;
					tmpConst->PDNo_Ts = DoGetFloatFrom8(tmpData+13+12 +4);
				}		

				pWMod->ATTFlashSwitch = POSE_OK;
				break;
			}

			//PID控制器参数注入
			case ATT_CMDCODE_PIDCTRLPARA:
			{
				//tmpData = tmpCmd + tmpOffset;
				tmpWorkMod =*tmpData;
				if (tmpWorkMod == 0xAA)
				{
					for(i=0; i<3; i++)
					{
						tmpConst->AttCmdFlashPara.kp_PID[i]	= DoGetFloatFrom8(tmpData+i*4 +1);
						tmpConst->AttCmdFlashPara.ki_PID[i]	= DoGetFloatFrom8(tmpData+12+i*4+1);
						tmpConst->AttCmdFlashPara.kd_PID[i]	= DoGetFloatFrom8(tmpData+24+i*4+1);
					}
					tmpConst->AttCmdFlashPara.w0max_PID = DoGetFloatFrom8(tmpData+36+1) * ANG2RADIAN;
					tmpConst->AttCmdFlashPara.PID_Ts = DoGetFloatFrom8(tmpData+40+1);
					pWMod->ATTFlashSwitch = POSE_OK;
				}
				else if (tmpWorkMod == 0x55)
				{
					for(i=0; i<3; i++)
					{
						tmpConst->kp_NoPID[i]	= DoGetFloatFrom8(tmpData+i*4 +1);
						tmpConst->ki_NoPID[i]	= DoGetFloatFrom8(tmpData+12+i*4+1);
						tmpConst->kd_NoPID[i]	= DoGetFloatFrom8(tmpData+24+i*4+1);
					}
					tmpConst->w0max_NoPID = DoGetFloatFrom8(tmpData+36+1) * ANG2RADIAN;	
					tmpConst->PIDNo_Ts = DoGetFloatFrom8(tmpData+40+1);	
				}


				break;
			}

			//陀螺零偏注入
			case ATT_CMDCODE_GyroBIAS:
			{
				tmpWorkMod =*tmpData;
				if (0x11==tmpWorkMod)
				{
					for (k = 0; k < 3; k++)
					{
						tmpConst->AttCmdFlashPara.Gyro_Comd_Bias[0][k] =DoGetFloatFrom8(tmpData+k*4 +1) * ANG2RADIAN;     //陀螺零偏
					}
				} 
				else if (0x22==tmpWorkMod)
				{
					for (k = 0; k < 3; k++)
					{
						tmpConst->AttCmdFlashPara.Gyro_Comd_Bias[1][k] =DoGetFloatFrom8(tmpData+k*4 +1) * ANG2RADIAN;     //陀螺零偏
					}
				}
				else if (0x44==tmpWorkMod)
				{
					for (k = 0; k < 3; k++)
					{
						tmpConst->AttCmdFlashPara.Gyro_Comd_Bias[2][k] =DoGetFloatFrom8(tmpData+k*4 +1) * ANG2RADIAN;     //陀螺零偏
					}
				}
				pWMod->ATTFlashSwitch = POSE_OK;
				break;
			}

			//陀螺标度因数注入
			case ATT_CMDCODE_GyroPH:
			{

				tmpWorkMod =*tmpData;
				if (0x11==tmpWorkMod)
				{
					for (i = 0; i < 3; i++)
					{
						for (j = 0; j< 3; j++)
						{
							tmpConst->AttCmdFlashPara.Gyro_Comd_K[0][i][j] =DoGetFloatFrom8(tmpData+i*12+j*4+1);     //陀螺标度因数
						}
					}
				}
				else if (0x22==tmpWorkMod)
				{
					for (i = 0; i < 3; i++)
					{
						for (j = 0; j< 3; j++)
						{
							tmpConst->AttCmdFlashPara.Gyro_Comd_K[1][i][j] =DoGetFloatFrom8(tmpData+i*12+j*4+1);     //陀螺标度因数
						}
					}
				}
				else if (0x44==tmpWorkMod)
				{
					for (i = 0; i < 3; i++)
					{
						for (j = 0; j< 3; j++)
						{
							tmpConst->AttCmdFlashPara.Gyro_Comd_K[2][i][j] =DoGetFloatFrom8(tmpData+i*12+j*4+1);     //陀螺标度因数
						}
					}
				}
				pWMod->ATTFlashSwitch = POSE_OK;
				break;
			}
	
			//卫星进出影判断值参数注入
			case ATT_CMDCODE_BetaAng:
			{
				tmpConst->BetaAngLimit = DoGetFloatFrom8(tmpData) *ANG2RADIAN ;
				break;
			}
			
			//飞轮ID选择参数注入
			case ATT_CMDCODE_WhlID:
			{
				memset(tmpWhlCmd,0x00,5*sizeof(UINT8));
				
				tmpWorkMod =*tmpData;
				if (0x11==tmpWorkMod)
				{
					tmpConst->Whl_ID[0] =*(tmpData +1);
					tmpWhlCmd[0] = 0x00;
					tmpWhlCmd[1] = 0x03;
					tmpWhlCmd[2] = tmpWorkMod ;
					tmpWhlCmd[3] = tmpWorkMod ;
					tmpWhlCmd[4] =tmpConst->Whl_ID[0];
				}
				else if (0x22==tmpWorkMod)
				{
					tmpConst->Whl_ID[1] =*(tmpData +1);
					tmpWhlCmd[0] = 0x00;
					tmpWhlCmd[1] = 0x03;
					tmpWhlCmd[2] = tmpWorkMod ;
					tmpWhlCmd[3] = tmpWorkMod ;
					tmpWhlCmd[4] =tmpConst->Whl_ID[1];
				}
				else if (0x33==tmpWorkMod)
				{
					tmpConst->Whl_ID[2] =*(tmpData +1);
					tmpWhlCmd[0] = 0x00;
					tmpWhlCmd[1] = 0x03;
					tmpWhlCmd[2] = tmpWorkMod ;
					tmpWhlCmd[3] = tmpWorkMod ;
					tmpWhlCmd[4] =tmpConst->Whl_ID[2];
				}
				else if (0x44==tmpWorkMod)
				{
					tmpConst->Whl_ID[3] =*(tmpData +1);
					tmpWhlCmd[0] = 0x00;
					tmpWhlCmd[1] = 0x03;
					tmpWhlCmd[2] = tmpWorkMod ;
					tmpWhlCmd[3] = tmpWorkMod ;
					tmpWhlCmd[4] =tmpConst->Whl_ID[3];
				}			
				BlockRingAdd(&tmpCollectInfo->sCmdBuffer,tmpWhlCmd,TRUE);
				break;					
			}
			
			//磁力矩器分配-磁矩限值
			case ATT_CMDCODE_MTCTRL:
			{
				tmpConst->MTOutXYZLimit[0] = DoGetFloatFrom8(tmpData);
				tmpConst->MTOutXYZLimit[1] = DoGetFloatFrom8(tmpData +4);
				tmpConst->MTOutXYZLimit[2] = DoGetFloatFrom8(tmpData +8);
				tmpConst->MTOutXYZLimit[3] = DoGetFloatFrom8(tmpData +12);
				break;
			}			
			
			//磁强计标定系数注入
			case ATT_CMDCODE_MTBD:
			{
				memset(&tmpCOMDCHOICE,0x00,sizeof(UINT8));
				tmpCOMDCHOICE =*tmpData;
				if (0x11==tmpCOMDCHOICE)
				{
					for (i = 0; i< 3; i++)
					{
						tmpConst->AttCmdFlashPara.MAG_LK[0][i]=DoGetFloatFrom8(tmpData+i*4+1);
						tmpConst->AttCmdFlashPara.MAG_LB[0][i]=DoGetFloatFrom8(tmpData+12+i*4+1);
					}				
				}
				else if (0x22==tmpCOMDCHOICE)
				{
					for (i = 0; i< 3; i++)
					{
						tmpConst->AttCmdFlashPara.MAG_LK[1][i]=DoGetFloatFrom8(tmpData+i*4+1);
						tmpConst->AttCmdFlashPara.MAG_LB[1][i]=DoGetFloatFrom8(tmpData+12+i*4+1);
					}
				}
				pWMod->ATTFlashSwitch = POSE_OK;
				break;		
			}

			//加速度
			case ATT_CMDMODE_PPUAB:
			{
				for (i = 0; i < 3; i++)
				{
					tmpConst->AccThru_Up[i] = DoGetFloatFrom8(tmpData+i*4) * 0.001f;
				}
				break;
			}
			
			case ATT_CMDCODE_PPUBD:
			{
				tmpConst->AttCmdFlashPara.PPUPVK = DoGetFloatFrom8(tmpData);
				tmpConst->AttCmdFlashPara.PPUPVB = DoGetFloatFrom8(tmpData +4);
				tmpConst->AttCmdFlashPara.PPUPAK = DoGetFloatFrom8(tmpData +8);
				tmpConst->AttCmdFlashPara.PPUPAB = DoGetFloatFrom8(tmpData +12);
				pWMod->ATTFlashSwitch = POSE_OK;
				break;	
			}
					
			//姿态确定
			case ATT_CMDCODE_GyroINTTLimt:
			{
				tmpConst->GyroINT_TLimt	= DoGetInt16From8(tmpData);
				break;
			}
						
			//安全模式PPU单机使用状态
			case ATT_CMDCODE_SafePPU:
			{
				pIMU->PPUSafeStatus= *(tmpData);
				break;
			}

			//安全模式PPU单机使用状态
			case ATT_CMDCODE_WHLCENT:
			{
				tmpConst->Whl_HCent[0] = DoGetFloatFrom8(tmpData);
				tmpConst->Whl_HCent[1] = DoGetFloatFrom8(tmpData +4);
				tmpConst->Whl_HCent[2] = DoGetFloatFrom8(tmpData +8);
				tmpConst->Whl_HCent[3] = DoGetFloatFrom8(tmpData +12);
				break;
			}	
						
			default:
			{
				m_pZKTaskInfo->iCmdRes = ERR_CODE_CMDCODE;
				break;
			}					
		}
	}
}



/***********************************************
说明：姿控指令处理
***********************************************/
void ZKMINICmdResolve(UINT8 *tmpCmd)
{
#ifdef  MINMODULE_TYPE
	UINT8		i= 0x00;
	UINT8		j= 0x00;
	UINT8		k= 0x00;
	//UINT8		tmpCmd[MOD_REQ_MAXLEN]= {0x00};
	//UINT8		tmpWhlCmd[MOD_REQ_MAXLEN]= {0x00};
	UINT16		tmpCmdCode = 0;			            //指令码
	UINT8		tmpOffset = 0x02;					//指令码偏移
	UINT8		*tmpData= 0x00;
	UINT8		tmpDevNO = 0x00;

	UINT32		tmpiDataLength= 0x00;					/*数据长度*/
	UINT16		tmpiDataType =0;					/*数据类型*/
	UINT16		tmpiDataCheck=0;					/*数据校验和*/
	UINT16		tmpiDataCheck1=0;					/*数据校验和*/

	TYPE_CAL	tmpWlimit=0.0;
	TYPE_CAL	tmpAlimit=0.0;
	TYPE_CAL	tmpAngm=0.0;
	UINT16		tmpTimeLmt=0;
	UINT16      tmpTimeLmt1=0;
	UINT8		tmpWorkMod= 0x00;
	UINT8		tmpWorkModPre= 0x00;
	UINT8		tmpCOMDCHOICE= 0x00;

	sTaskMngDataRecord * tmpTaskMngDataRcd = NULL;
	sAttPriData *tmpAtt= NULL;
	AttCtrlConst_t *tmpConst= NULL;
	sAttOrbitCtlData_t *tmpOrbCmd= NULL;
	sAttTARCCtlData_t *tmpTARCCmd= NULL;
	sAttOrbitCtlInfo_t *pOrb= NULL;
	sAttTARCCtlInfo_t *pTARC= NULL;
	sAttModPara_t *pWMod= NULL;
	sAttErrCtlPara_t *pREcheck= NULL;
	AttIMPTPara_t *pIMU= NULL;
	tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR;
	tmpConst=(AttCtrlConst_t *)ATTCLT_DATA2_ADDR;
	tmpOrbCmd=(sAttOrbitCtlData_t *)ATTCLT_DATA3_ADDR;
	tmpTARCCmd=(sAttTARCCtlData_t *)ATTCLT_DATA6_ADDR;
	tmpTaskMngDataRcd = (sTaskMngDataRecord *)ST_TASKMNG_ADDR;	
	if((NULL == tmpAtt) || (NULL ==tmpConst) || (NULL ==tmpOrbCmd) || (NULL ==tmpTARCCmd)|| (NULL ==tmpTaskMngDataRcd))
	{
		return ;
	}
	pOrb=&tmpAtt->sOrbitInp;
	pTARC=&tmpAtt->sTARCInp;
	pREcheck=&tmpAtt->sErrCtlPara;
	pIMU=&tmpAtt->sIMPTPara;
	pWMod=&tmpAtt->sModePara;
	
	/*处理每个命令*/
	tmpCmdCode = DoGetInt16From8(tmpCmd + tmpOffset);
	m_pZKTaskInfo->iCmdLast = tmpCmdCode;
	m_pZKTaskInfo->iCmdRes = ERR_CODE_NOERR;
	m_pZKTaskInfo->iCmdCount++;
	//获取注数缓存地址
	tmpData=(UINT8*)(tmpCmd + tmpOffset +2);
			
	switch(tmpCmdCode)
	{
		/**********************************模式控制指令*********************************/
		//速率阻尼 0X22
		case ATT_CMDMODE_MODSUNCAP:
		{
			//tmpConst->WorkModeUp = ATTMOD_RATEDMP;
			//tmpConst->WorkModeChange=0x55;
			/*设置工作模式 速率阻尼*/
			ZKModDoSet(ATTMOD_RATEDMP);
			break;
		}

		//磁控对日定向0X44
		case ATT_CMDMODE_MagTOSUN:
		{
			//tmpConst->WorkModeUp = ATTMOD_MagTOSUN;
			//tmpConst->WorkModeChange=0x55;
			/*设置工作模式 速率阻尼*/
			ZKModDoSet(ATTMOD_MagTOSUN);
			break;
		}
		//模式自主切换
		case ATT_CMDMODE_MODECHANG:
		{
			tmpConst->AttCmdFlashPara.WorkModeChangeAuto=POSE_NO;
			pWMod->ATTFlashSwitch = POSE_OK;
			break;
		}

		case ATT_CMDMODE_NOMODECHANG:
		{
			tmpConst->AttCmdFlashPara.WorkModeChangeAuto=POSE_OK;
			pWMod->ATTFlashSwitch = POSE_OK;
			break;
		}
		//模式切换相关参数
		case ATT_CMDCODE_MODPARAM:
		{
			tmpWorkModPre = *tmpData;
			tmpWorkMod = *(tmpData + 1);
			tmpWlimit = DoGetFloatFrom8(tmpData+2) *ANG2RADIAN;
			tmpAlimit = DoGetFloatFrom8(tmpData+6) *ANG2RADIAN;
			tmpTimeLmt = DoGetInt16From8(tmpData+10);
			tmpTimeLmt1 = DoGetInt16From8(tmpData+12);
			tmpAngm = DoGetFloatFrom8(tmpData+14);
			if((tmpWorkMod & 0x0F) > 0x0B)
			{
				m_pZKTaskInfo->iCmdRes = ERR_CODE_CMDCODE;
				break;
			}

			if(ATTMOD_RATEDMP == tmpWorkModPre)
			{
				tmpConst->judge_time2 = tmpTimeLmt;
				tmpConst->RateThr_2T3	=tmpWlimit;
				tmpConst->HWHLThr_2T3 = tmpAngm;
			}

			else if(ATTMOD_MagTOSUN == tmpWorkModPre)
			{
				tmpConst->judge_time4 = tmpTimeLmt;
				tmpConst->AngThr_3TB = tmpAlimit;
				tmpConst->RateThr_3TB = tmpWlimit;
			}
			break;
		}
			
		//太敏
		case ATT_CMDCODE_ASS:
		{
			tmpCOMDCHOICE =*(tmpData) ;
				
			switch (tmpCOMDCHOICE)
			{
				case    0x11 :
				{
					tmpConst->Ass_MinFour_limt[0] = DoGetFloatFrom8(tmpData+1 +0);						//4片模拟太敏电压阈值
					tmpConst->Ass_MaxFour_limt[0] = DoGetFloatFrom8(tmpData+1 +4);						//4片模拟太敏电压阈值
					break;
				}
				case	0x22:
				{
					tmpConst->Ass_MinFour_limt[1] = DoGetFloatFrom8(tmpData+1 +0);						//4片模拟太敏电压阈值
					tmpConst->Ass_MaxFour_limt[1] = DoGetFloatFrom8(tmpData+1 +4);						//4片模拟太敏电压阈值
					break;
				}
				default:
				break;
			}
			break;
		}

		//单机使用状态
		case ATT_CMDCROSSUSE:
		{
			pIMU->SSUseState[0] = *(tmpData);
			pIMU->SSUseState[1] = *(tmpData + 1);
			pIMU->SSUseState[2] = *(tmpData + 2);
			pIMU->AssUseState[0] = *(tmpData + 3);
			pIMU->AssUseState[1] = *(tmpData + 4);
			pIMU->AssUseState[2] = *(tmpData + 5);
			pIMU->AssUseState[3] = *(tmpData + 6);
			pIMU->AssUseState[4] = *(tmpData + 7);
			pIMU->AssUseState[5] = *(tmpData + 8);
			pIMU->MagUseState[0] = *(tmpData + 9);
			pIMU->MagUseState[1] = *(tmpData + 10);
			pIMU->GyroUseState[0] = *(tmpData + 11);
			pIMU->GyroUseState[1] = *(tmpData + 12);
			pIMU->GyroUseState[2] = *(tmpData + 13);
			pIMU->Whl_Use[0] = *(tmpData + 14);
			pIMU->Whl_Use[1] = *(tmpData + 15);
			pIMU->Whl_Use[2] = *(tmpData + 16);
			pIMU->Whl_Use[3] = *(tmpData + 17);
			pIMU->MTUseStatus[0] = *(tmpData + 18);
			pIMU->MTUseStatus[1] = *(tmpData + 19);
			pIMU->MTUseStatus[2] = *(tmpData + 20);
			pIMU->MTUseStatus[3] = *(tmpData + 21);
			pIMU->PPUUseStatus= *(tmpData + 22);
			break;
		}

		//单机重构状态注入
		case ATT_CMDCROSS:
		{
			//星敏优先级
			if (*(tmpData+0) != *(tmpData +1))
			{
				if (*(tmpData+0) != *(tmpData +2))
				{
					tmpConst->SSUsePrior[0]= *(tmpData) ;
					tmpConst->SSUsePrior[1]= *(tmpData +1) ;
					tmpConst->SSUsePrior[2]= *(tmpData +2) ;
				}
			}

			//陀螺优先级
			if (*(tmpData+3) != *(tmpData +4))
			{
				if (*(tmpData+3) != *(tmpData +5))
				{
					tmpConst->GyroUsePrior[0]= *(tmpData +3) ;
					tmpConst->GyroUsePrior[1]= *(tmpData +4) ;
					tmpConst->GyroUsePrior[2]= *(tmpData +5) ;
				}
			}
			break;
		}
		case ATT_CMDCREUSE:
		{
			tmpConst->AttCmdFlashPara.Mag_ComRESW[0] = *(tmpData);
			tmpConst->AttCmdFlashPara.Mag_ComRESW[1] = *(tmpData+1);
			tmpConst->AttCmdFlashPara.Mag_ComRESW[2] = *(tmpData+2);
				
			tmpConst->AttCmdFlashPara.Gyro_ComRESW[0] = *(tmpData+3);
			tmpConst->AttCmdFlashPara.Gyro_ComRESW[1] = *(tmpData+4);
			tmpConst->AttCmdFlashPara.Gyro_ComRESW[2] = *(tmpData+5);
			pWMod->ATTFlashSwitch = POSE_OK;
			break;		
		}

		/**********************************安装矩阵*********************************/
		//星敏安装矩阵注入
		case ATT_CMDCODE_SSMAT:
		{
			tmpCOMDCHOICE =*(tmpData) ;
			switch (tmpCOMDCHOICE)
			{
				case    0x11 :
				{
					for(i=0; i<3; i++)
					{
						for (k=0; k<3; k++)
						{
							tmpConst->AttCmdFlashPara.M_SSA[i][k] = DoGetFloatFrom8(tmpData+i*12+k*4 + 1);
						}
					}
					break;
				}
				case    0x22 :
				{
					for(i=0; i<3; i++)
					{
						for (k=0; k<3; k++)
						{
							tmpConst->AttCmdFlashPara.M_SSB[i][k] = DoGetFloatFrom8(tmpData+i*12+k*4 + 1);
						}
					}
					break;
				}
				case    0x44 :
				{
					for(i=0; i<3; i++)
					{
						for (k=0; k<3; k++)
						{
							tmpConst->AttCmdFlashPara.M_SSC[i][k] = DoGetFloatFrom8(tmpData+i*12+k*4 + 1);
						}
					}
					break;
				}
				default:
				break;
			}
			pWMod->ATTFlashSwitch = POSE_OK;
			break;
		}
			
		//太敏安装矩阵注入
		case ATT_CMDCODE_ASSMAT:
		{
			tmpDevNO = *tmpData;   //太敏选择
			if(0x11 == tmpDevNO)
			{
				for(i=0; i<3; i++)
				{
					for (k=0; k<3; k++)
					{
						tmpConst->AttCmdFlashPara.M_aSSA[i][k] =  DoGetFloatFrom8(tmpData+i*12+k*4+1);
					}
				}
			}
			else if(0x22 == tmpDevNO)
			{
				for(i=0; i<3; i++)
				{
					for (k=0; k<3; k++)
					{
						tmpConst->AttCmdFlashPara.M_aSSB[i][k] =  DoGetFloatFrom8(tmpData+i*12+k*4+1);
					}
				}
			}
			else if(0x33 == tmpDevNO)
			{
				for(i=0; i<3; i++)
				{
					for (k=0; k<3; k++)
					{
						tmpConst->AttCmdFlashPara.M_aSSC[i][k] =  DoGetFloatFrom8(tmpData+i*12+k*4+1);
					}
				}
			}
			else if(0x44 == tmpDevNO)
			{
				for(i=0; i<3; i++)
				{
					for (k=0; k<3; k++)
					{
						tmpConst->AttCmdFlashPara.M_aSSD[i][k] =  DoGetFloatFrom8(tmpData+i*12+k*4+1);
					}
				}
			}
			else if(0x55 == tmpDevNO)
			{
				for(i=0; i<3; i++)
				{
					for (k=0; k<3; k++)
					{
						tmpConst->AttCmdFlashPara.M_aSSE[i][k] =  DoGetFloatFrom8(tmpData+i*12+k*4+1);
					}
				}
			}
			else if(0x66 == tmpDevNO)
			{
				for(i=0; i<3; i++)
				{
					for (k=0; k<3; k++)
					{
						tmpConst->AttCmdFlashPara.M_aSSF[i][k] =  DoGetFloatFrom8(tmpData+i*12+k*4+1);
					}
				}
			}
			else
			{
				//m_pZKTaskInfo->iCmdRes = ERR_CODE_CMDCODE;
			}
			pWMod->ATTFlashSwitch = POSE_OK;
			break;
		}

		//磁强计安装矩阵注入
		case ATT_CMDCODE_MAGMAT:
		{
			tmpCOMDCHOICE =*(tmpData) ;
			switch (tmpCOMDCHOICE)
			{
				case    0x11 :
				{
					for(i=0; i<3; i++)
					{
						for(k=0; k<3; k++)
						{
							tmpConst->AttCmdFlashPara.M_MAG[0][i][k] =  DoGetFloatFrom8(tmpData+i*12+k*4 +1);
						}
					}
					break;
				}
				case    0x22 :
				{
					for(i=0; i<3; i++)
					{
						for(k=0; k<3; k++)
						{
							tmpConst->AttCmdFlashPara.M_MAG[1][i][k] =  DoGetFloatFrom8(tmpData+i*12+k*4 +1);
						}
					}
					break;
				}
				default:
				break;
			}
			pWMod->ATTFlashSwitch = POSE_OK;
			break;
		}

		//陀螺安装矩阵注入
		case ATT_CMDCODE_GyroMAT:
		{
			tmpCOMDCHOICE =*(tmpData) ;
			switch (tmpCOMDCHOICE)
			{
				case    0x11 :
				{
					for(i=0; i<3; i++)
					{
						for (k=0; k<3; k++)
						{
							tmpConst->AttCmdFlashPara.M_GYRO[0][i][k] = DoGetFloatFrom8(tmpData+i*12+k*4 +1);
						}
					}
					break;
				}
				case    0x22 :
				{
					for(i=0; i<3; i++)
					{
						for (k=0; k<3; k++)
						{
							tmpConst->AttCmdFlashPara.M_GYRO[1][i][k] = DoGetFloatFrom8(tmpData+i*12+k*4 +1);
						}
					}
					break;
				}
				case    0x44 :
				{
					for(i=0; i<3; i++)
					{
						for (k=0; k<3; k++)
						{
							tmpConst->AttCmdFlashPara.M_GYRO[2][i][k] = DoGetFloatFrom8(tmpData+i*12+k*4 +1);
						}
					}
					break;
				}
				default:
				break;
			}
			pWMod->ATTFlashSwitch = POSE_OK;
			break;
		}

		//反作用轮安装矩阵注入
		case ATT_CMDCODE_WHLMAT:
		{
			tmpCOMDCHOICE =*(tmpData) ;
			switch (tmpCOMDCHOICE)
			{
				case    0x11 :
				{
					for(i=0; i<3; i++)
					{
						tmpConst->AttCmdFlashPara.M_Wheel[i][0] = DoGetFloatFrom8(tmpData+i*4 +1);
					}
					break;
				}
				case    0x22 :
				{
					for(i=0; i<3; i++)
					{
						tmpConst->AttCmdFlashPara.M_Wheel[i][1] = DoGetFloatFrom8(tmpData+i*4 +1);
					}
					break;
				}
				case    0x44 :
				{
					for(i=0; i<3; i++)
					{
						tmpConst->AttCmdFlashPara.M_Wheel[i][2] = DoGetFloatFrom8(tmpData+i*4 +1);
					}
					break;
				}
					
				case    0x88 :
				{
					for(i=0; i<3; i++)
					{
						tmpConst->AttCmdFlashPara.M_Wheel[i][3] = DoGetFloatFrom8(tmpData+i*4 +1);
					}
					break;
				}
				default:
				break;
			}
			pWMod->ATTFlashSwitch = POSE_OK;
			break;
		}

		//磁力矩器安装矩阵注入
		case ATT_CMDCODE_MTMAT:
		{
			tmpCOMDCHOICE =*(tmpData) ;
			switch (tmpCOMDCHOICE)
			{
				case    0x11 :
				{
					for(i=0; i<3; i++)
					{
						tmpConst->AttCmdFlashPara.M_MAGCtrl[i][0] =  DoGetFloatFrom8(tmpData+i*4 +1);
					}
					break;
				}
				case    0x22 :
				{
					for(i=0; i<4; i++)
					{
						tmpConst->AttCmdFlashPara.M_MAGCtrl[i][1] =  DoGetFloatFrom8(tmpData+i*4 +1);
					}
					break;
				}
				case    0x44 :
				{
					for(i=0; i<4; i++)
					{
						tmpConst->AttCmdFlashPara.M_MAGCtrl[i][2] =  DoGetFloatFrom8(tmpData+i*4 +1);
					}
					break;
				}
					
				case    0x88 :
				{
					for(i=0; i<4; i++)
					{
						tmpConst->AttCmdFlashPara.M_MAGCtrl[i][3] =  DoGetFloatFrom8(tmpData+i*4 +1);
					}
					break;
				}
				default:
				break;
			}
			pWMod->ATTFlashSwitch = POSE_OK;
			break;
		}

		//磁阻尼控制器注入
		case ATT_CMDCODE_DMPPARA:
		{
			tmpConst->Mag_Bb_CtrlMax = DoGetFloatFrom8(tmpData);
			tmpConst->Mag_DampBdotMin = DoGetFloatFrom8(tmpData+4);
			tmpConst->MTCtrlTIME= DoGetInt16From8(tmpData+ 8);
			break;
		}
			
		//磁控对日控制器参数注入
		case ATT_CMDCODE_TOSUNPARA:
		{
			tmpCOMDCHOICE =*(tmpData) ;
			switch (tmpCOMDCHOICE)
			{
				case    0x55 :
				{
					for (i = 0; i < 3; i++)
					{
						tmpConst->Mag_Kd[i] = DoGetFloatFrom8(tmpData+i*4 +1);
					}
					for (i = 0; i < 3; i++)
					{
						tmpConst->Mag_Kp[i] = DoGetFloatFrom8(tmpData+i*4+ 12+1);
					}
					tmpConst->Mag_WTOSUN=DoGetFloatFrom8(tmpData + 12 + 12 +1) *ANG2RADIAN ;	
					break;
				}

				case    0xAA :
				{
					for (i = 0; i < 3; i++)
					{
						tmpConst->Mag_KpFBZK[i] = DoGetFloatFrom8(tmpData+i*4+1);
					}
					for (i = 0; i < 3; i++)
					{
						tmpConst->Mag_KdFBZK[i] = DoGetFloatFrom8(tmpData+i*4+ 12+1);
					}
					tmpConst->Mag_FBZKWTOSUN=DoGetFloatFrom8(tmpData + 12 + 12 +1) *ANG2RADIAN ;	
					break;
				}
				default:
				break;
			}
			tmpConst->Mag_ATTTOSUN=DoGetFloatFrom8(tmpData + 12 + 12 + 4+1) *ANG2RADIAN;
				
			break;
		}

		//陀螺零偏注入
		case ATT_CMDCODE_GyroBIAS:
		{
			tmpWorkMod =*tmpData;
			if (0x11==tmpWorkMod)
			{
				for (k = 0; k < 3; k++)
				{
					tmpConst->AttCmdFlashPara.Gyro_Comd_Bias[0][k] =DoGetFloatFrom8(tmpData+k*4 +1)* ANG2RADIAN;     //陀螺零偏
				}
			}
			else if (0x22==tmpWorkMod)
			{
				for (k = 0; k < 3; k++)
				{
					tmpConst->AttCmdFlashPara.Gyro_Comd_Bias[1][k] =DoGetFloatFrom8(tmpData+k*4 +1)* ANG2RADIAN;     //陀螺零偏
				}
			}
			else if (0x44==tmpWorkMod)
			{
				for (k = 0; k < 3; k++)
				{
					tmpConst->AttCmdFlashPara.Gyro_Comd_Bias[2][k] =DoGetFloatFrom8(tmpData+k*4 +1)* ANG2RADIAN;     //陀螺零偏
				}
			}
			pWMod->ATTFlashSwitch = POSE_OK;
			break;
		}

		//陀螺标度因数注入
		case ATT_CMDCODE_GyroPH:
		{
			tmpWorkMod =*tmpData;
			if (0x11==tmpWorkMod)
			{
				for (i = 0; i < 3; i++)
				{
					for (j = 0; j< 3; j++)
					{
						tmpConst->AttCmdFlashPara.Gyro_Comd_K[0][i][j] =DoGetFloatFrom8(tmpData+i*12+j*4+1);     //陀螺标度因数
					}
				}
			}
			else if (0x22==tmpWorkMod)
			{
				for (i = 0; i < 3; i++)
				{
					for (j = 0; j< 3; j++)
					{
						tmpConst->AttCmdFlashPara.Gyro_Comd_K[1][i][j] =DoGetFloatFrom8(tmpData+i*12+j*4+1);     //陀螺标度因数
					}
				}
			}
			else if (0x44==tmpWorkMod)
			{
				for (i = 0; i < 3; i++)
				{
					for (j = 0; j< 3; j++)
					{
						tmpConst->AttCmdFlashPara.Gyro_Comd_K[2][i][j] =DoGetFloatFrom8(tmpData+i*12+j*4+1);     //陀螺标度因数
					}
				}
			}
			pWMod->ATTFlashSwitch = POSE_OK;
			break;
		}	
		//磁强计标定系数注入
		case ATT_CMDCODE_MTBD:
		{
			memset(tmpCOMDCHOICE,0x00,sizeof(UINT8));
			tmpCOMDCHOICE =*tmpData;
			if (0x11==tmpCOMDCHOICE)
			{
				for (i = 0; i< 3; i++)
				{
					tmpConst->AttCmdFlashPara.MAG_LK[0][i]=DoGetFloatFrom8(tmpData+i*4+1);
					tmpConst->AttCmdFlashPara.MAG_LB[0][i]=DoGetFloatFrom8(tmpData+12+i*4+1);
				}
			}
			else if (0x22==tmpCOMDCHOICE)
			{
				for (i = 0; i< 3; i++)
				{
					tmpConst->AttCmdFlashPara.MAG_LK[1][i]=DoGetFloatFrom8(tmpData+i*4+1);
					tmpConst->AttCmdFlashPara.MAG_LB[1][i]=DoGetFloatFrom8(tmpData+12+i*4+1);
				}
			}
			break;
		}
			
		//磁力矩器分配-磁矩限值
		case ATT_CMDCODE_MTCTRL:
		{
			tmpConst->MTOutXYZLimit[0] = DoGetFloatFrom8(tmpData);
			tmpConst->MTOutXYZLimit[1] = DoGetFloatFrom8(tmpData +4);
			tmpConst->MTOutXYZLimit[2] = DoGetFloatFrom8(tmpData +8);
			tmpConst->MTOutXYZLimit[3] = DoGetFloatFrom8(tmpData +12);
			break;
		}
		default:
		{
			//m_pZKTaskInfo->iCmdRes = ERR_CODE_CMDCODE;
			break;
		}			
	}
#endif
}


//姿控单机加电状态获取
void ZKPowerState(void)
{
	UINT8	i= 0x00;
	sAttPriData *tmpAtt = NULL;
	sAttErrCtlPara_t 	*pREcheck= NULL;	
	sDevInfo  *tmpDevInfo= NULL;	
	tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR;
	if(NULL ==tmpAtt)
	return;
	pREcheck=&tmpAtt->sErrCtlPara;	
	
	//初始化\星敏
	//陀螺
	for(i=0; i<3; i++)
	{
		pREcheck->ssIn_PowerOn[i] = POSE_NO;
		pREcheck->GyroIn_PowerOn[i] = POSE_NO;	
	}
	
	//飞轮
	for(i=0; i<4; i++)
	{
		pREcheck->WhlIn_PowerOn[i] = POSE_NO;
	}
	
	//磁强计
	for(i=0; i<2; i++)
	{
		pREcheck->MagIn_PowerOn[i] = POSE_NO;	
	}
	//电推
	pREcheck->PPUIn_PowerOn = POSE_NO;
	
	//星敏A
	tmpDevInfo = GETDEVINFO(DEV_NO_UART15);	
	if(0x10 == (tmpDevInfo->sPowerInfo.bStart & 0x10))
	{
		pREcheck->ssIn_PowerOn[0] = POSE_OK;
		if(pREcheck->ss_PowerOnCnt[0]<60000)
		pREcheck->ss_PowerOnCnt[0]++;     		//星敏加电状态计数		
	}
	else
	{
		pREcheck->ss_PowerOnCnt[0] = 0;		
	}

	//星敏B
	tmpDevInfo = GETDEVINFO(DEV_NO_UART16);
	if(0x10 == (tmpDevInfo->sPowerInfo.bStart & 0x10))
	{
		pREcheck->ssIn_PowerOn[1] = POSE_OK;
		if(pREcheck->ss_PowerOnCnt[1]<60000)
		pREcheck->ss_PowerOnCnt[1]++;     		//星敏加电状态计数
	}
	else
	{
		pREcheck->ss_PowerOnCnt[1] = 0;
	}

	//星敏C
	tmpDevInfo = GETDEVINFO(DEV_NO_UART4);
	if(0x10 == (tmpDevInfo->sPowerInfo.bStart & 0x10))
	{
		pREcheck->ssIn_PowerOn[2] = POSE_OK;
		if(pREcheck->ss_PowerOnCnt[2]<60000)
		pREcheck->ss_PowerOnCnt[2]++;     		//星敏加电状态计数
	}
	else
	{
		pREcheck->ss_PowerOnCnt[2] = 0;
	}	
	//陀螺A
	tmpDevInfo = GETDEVINFO(DEV_NO_UART5);
	if(0x10 == (tmpDevInfo->sPowerInfo.bStart & 0x10))
	{
		pREcheck->GyroIn_PowerOn[0] = POSE_OK;
		if(pREcheck->Gyro_PowerOnCnt[0]<60000)
		   pREcheck->Gyro_PowerOnCnt[0]++;     		//陀螺加电状态计数		
	}
	else
	{
		pREcheck->Gyro_PowerOnCnt[0] =0;
	}
	//陀螺B
	tmpDevInfo = GETDEVINFO(DEV_NO_UART6);
	if(0x10 == (tmpDevInfo->sPowerInfo.bStart & 0x10))
	{
		pREcheck->GyroIn_PowerOn[1] = POSE_OK;
		if(pREcheck->Gyro_PowerOnCnt[1]<60000)
		pREcheck->Gyro_PowerOnCnt[1]++;     		//陀螺加电状态计数
	}
	else
	{
		pREcheck->Gyro_PowerOnCnt[1] =0;
	}
	//陀螺C
	tmpDevInfo = GETDEVINFO(DEV_NO_UART7);
	if(0x10 == (tmpDevInfo->sPowerInfo.bStart & 0x10))
	{
		pREcheck->GyroIn_PowerOn[2] = POSE_OK;
		if(pREcheck->Gyro_PowerOnCnt[2]<60000)
		pREcheck->Gyro_PowerOnCnt[2]++;     		//陀螺加电状态计数
	}
	else
	{
		pREcheck->Gyro_PowerOnCnt[2] =0;
	}
	//飞轮A
	tmpDevInfo = GETDEVINFO(DEV_NO_UART8);
	if(0x10 == (tmpDevInfo->sPowerInfo.bStart & 0x10))         
	{
		pREcheck->WhlIn_PowerOn[0] = POSE_OK;
		if(pREcheck->Whl_PowerOnCnt[0]<60000)
		pREcheck->Whl_PowerOnCnt[0]++;     		//陀螺加电状态计数
	}
	else
	{
		pREcheck->Whl_PowerOnCnt[0] =0;
	}
	//飞轮B
	tmpDevInfo = GETDEVINFO(DEV_NO_UART9);
	if(0x10 == (tmpDevInfo->sPowerInfo.bStart & 0x10))
	{
		pREcheck->WhlIn_PowerOn[1] = POSE_OK;
		if(pREcheck->Whl_PowerOnCnt[1]<60000)
		pREcheck->Whl_PowerOnCnt[1]++;     		//陀螺加电状态计数
	}
	else
	{
		pREcheck->Whl_PowerOnCnt[1] =0;
	}
	//飞轮C
	tmpDevInfo = GETDEVINFO(DEV_NO_UART10);
	if(0x10 == (tmpDevInfo->sPowerInfo.bStart & 0x10))
	{
		pREcheck->WhlIn_PowerOn[2] = POSE_OK;
		if(pREcheck->Whl_PowerOnCnt[2]<60000)
		pREcheck->Whl_PowerOnCnt[2]++;     		//陀螺加电状态计数
	}
	else
	{
		pREcheck->Whl_PowerOnCnt[2] =0;
	}
	//飞轮D
	tmpDevInfo = GETDEVINFO(DEV_NO_UART11);
	if(0x10 == (tmpDevInfo->sPowerInfo.bStart & 0x10))
	{
		pREcheck->WhlIn_PowerOn[3] = POSE_OK;
		if(pREcheck->Whl_PowerOnCnt[3]<60000)
		pREcheck->Whl_PowerOnCnt[3]++;     		//陀螺加电状态计数
	}
	else
	{
		pREcheck->Whl_PowerOnCnt[3] =0;
	}

	//磁强计A
	tmpDevInfo = GETDEVINFO(DEV_NO_CQJ);
	if(0x10 == (tmpDevInfo->sPowerInfo.bStart & 0x10))
	{
		pREcheck->MagIn_PowerOn[0] = POSE_OK;
		if(pREcheck->Mag_PowerOnCnt[0]<60000)
		pREcheck->Mag_PowerOnCnt[0]++;     		
	}
	else
	{
		pREcheck->Mag_PowerOnCnt[0] =0;
	}

	//磁强计B
	tmpDevInfo = GETDEVINFO(DEV_NO_CQJ);
	if(0x20 == (tmpDevInfo->sPowerInfo.bStart & 0x20))
	{
		pREcheck->MagIn_PowerOn[1] = POSE_OK;
		if(pREcheck->Mag_PowerOnCnt[1]<60000)
		pREcheck->Mag_PowerOnCnt[1]++;
	}
	else
	{
		pREcheck->Mag_PowerOnCnt[1] =0;
	}
	
	//电推
	tmpDevInfo = GETDEVINFO(DEV_NO_CAN0);
	if(0x10 == (tmpDevInfo->sPowerInfo.bStart & 0x10))
	{
		pREcheck->PPUIn_PowerOn = POSE_OK;
		if(pREcheck->PPU_PowerOnCnt<60000)
		pREcheck->PPU_PowerOnCnt++;     		//星敏加电状态计数
	}
	else
	{
		pREcheck->PPU_PowerOnCnt = 0;
	}		
}



/**************************************
**说明：存储数据恢复模式切换
**输入：@index标志位，
***************************************/
void	ZKReModBK(void)
{
	UINT8 	tmpNewMod = ATTMOD_RATEDMP ;
	
	sAttPriData *tmpAtt = NULL;
	OrbitPriData_t *tmpOrbit= NULL;
		
	tmpOrbit = (OrbitPriData_t *)ORBIT_BASE_ADDR;
	tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR;

	if((NULL == tmpAtt) || (NULL == tmpOrbit))
	{
		return ;
	}
	
	tmpNewMod = tmpAtt->sModePara.WorkMode;	
	
	switch(tmpAtt->sModePara.WorkMode)
	{
		case ATTMOD_BREAKPRE:              /*星箭分离前 0x00*/
		{
			tmpNewMod = ATTMOD_NOCOLL;
			break;
		}
		case ATTMOD_UNCTL:				   /*无控模式   0xBB*/
		{
			tmpNewMod = ATTMOD_RATEDMP;
			break;
		}
		case ATTMOD_ONLTOTAR:			   /*对目标定向 0xAA*/
		case ATTMOD_ATTAJUST:			   /*定向前调姿 0x99*/
		case ATTMOD_ONLTOEARTH:			   /*对地定向   0x55*/
		case ATTMOD_WHEELTOEARTH:		   /*稳态对地   0x66*/
		{
			if (POSE_OK ==	tmpOrbit->sCalOutData.ObtOutVldLast)
			{
				tmpNewMod = tmpAtt->sModePara.WorkMode;
			} 
			else
			{
				tmpNewMod = ATTMOD_RATEDMP;
			}
			break;
		}
		case ATTMOD_ATTAJUSTPRE:		  /*轨控前调姿 0x77*/
		case ATTMOD_ORBITCTL:			  /*轨道控制   0x88*/
		{
			/*2.5S后关PPU电源*/
			tmpAtt->sPerPara.PPUPara.PPU_OrbitCtl_Quit_Err_Flag = POSE_OK;
			tmpAtt->sPerPara.PPUPara.PPU_OrbitCtl_Quit_Err_Cnt = 0;
			
			tmpAtt->sPerPara.PPUPara.PPU_OrbitCtl_Quit_OK_Flag = POSE_NO;
			tmpAtt->sPerPara.PPUPara.PPU_OrbitCtl_Quit_OK_Cnt = 0;
			
			if (POSE_OK ==tmpOrbit->sCalOutData.ObtOutVldLast)
			{
				tmpNewMod = ATTMOD_ONLTOEARTH;
			}
			else
			{
				tmpNewMod = ATTMOD_RATEDMP;
			}
			break;
		}
		case ATTMOD_NOCOLL:				 /*碰撞规避模式  0x11 */
		case ATTMOD_RATEDMP:			 /*速率阻尼      0x22 */
		case ATTMOD_WhlTOSUN:			 /*轮控对日定向  0x33 */  
		case ATTMOD_MagTOSUN:			 /*磁控对日定向  0x44 */  
		{
			tmpNewMod = tmpAtt->sModePara.WorkMode;
			break;		
		}
		default:                         /*非姿控的工作模式，初始化为 速率阻尼*/
		{
			tmpNewMod = ATTMOD_RATEDMP;
			break;
		}
	}
	/*切换到新模式后，将相关计数器清零*/
	ZKModDoSet(tmpNewMod);
}

/************************************************FLASH********************************************************************/
/**************************************
**说明：读取FLASH数据
**输入：
***************************************/
void	ZKREFlashBK(void)
{
	AttCtrlConst_t *tmpConst = (AttCtrlConst_t *)ATTCLT_DATA2_ADDR;
	sWheelIdArray		*tmpBKStr	=	(sWheelIdArray *)ST_WHEEL_ID_ARRAY_ADDR;
	if((NULL == tmpConst) ||(NULL == tmpBKStr))
	{
		return ;
	}
	if(tmpBKStr->WHEEL_ID_ARRAY[0][0] == 0X11)
	{
		tmpConst->Whl_ID[0]= tmpBKStr->WHEEL_ID_ARRAY[0][1];
	}

	if(tmpBKStr->WHEEL_ID_ARRAY[1][0] == 0X22)
	{
		tmpConst->Whl_ID[1]= tmpBKStr->WHEEL_ID_ARRAY[1][1];
	}

	if(tmpBKStr->WHEEL_ID_ARRAY[2][0] == 0X33)
	{
		tmpConst->Whl_ID[2]= tmpBKStr->WHEEL_ID_ARRAY[2][1];
	}
	if(tmpBKStr->WHEEL_ID_ARRAY[3][0] == 0X44)
	{
		tmpConst->Whl_ID[3]= tmpBKStr->WHEEL_ID_ARRAY[3][1];
	}	
	
}

/************************************************三取二********************************************************************/
/***********************************************
说明：用于重要变量三取二
输入：pTDATA , pSDATA
输出：
返回:
注意:输入、输出变量均为UINT8类型
***********************************************/
void ATTGet2Base3FromBuff(UINT8 *pTDATA, UINT8 *pSDATA)
{
	if((NULL == pSDATA) || (NULL == pTDATA)) 
	{
		return;
	}

	if(!(pSDATA[0]^pSDATA[1])) 
	{
		*pTDATA = pSDATA[0];
	}
	else if(!(pSDATA[0]^pSDATA[2])) 
	{
		*pTDATA = pSDATA[2];
	}
	else if(!(pSDATA[1]^pSDATA[2])) 
	{
		*pTDATA = pSDATA[1];
	}
	else 
	{
		;                                                                                                               /*不做处理*/
	}
}

/***********************************************
说明：用于对重要数据备份，备三份，便于每周期进行更新
输入：pTDATA , pSDATA
输出：
返回:
注意:输入、输出变量均为UINT8类型
***********************************************/
void ATTSetBase3ToBuff(UINT8 *pTDATA, UINT8 *pSDATA)
{
	if((NULL == pSDATA) || (NULL == pTDATA)) 
	{
		return;
	}

	pSDATA[0] = *pTDATA;
	pSDATA[1] = *pTDATA;
	pSDATA[2] = *pTDATA;
}

/***********************************************
说明：每周期对重要数据进行更新
注意:输入、输出变量均为UINT8类型
***********************************************/
void ATTGetImportDataFromBuff(void)
{
	UINT8 i = 0X00;
	sAttPriData *tmpAtt = NULL;
	AttCtrlConst_t *tmpConst = NULL;

	tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR;
	tmpConst=(AttCtrlConst_t *)ATTCLT_DATA2_ADDR;
	if((NULL == tmpAtt) || (NULL == tmpConst))
	{
		return;
	}

	//if(POSE_OK == tmpAtt->AttData3T2Para.AttCtlBKFlag)
	//{
		//tmpAtt->AttData3T2Para.AttCtlBKFlag = POSE_NO;
		ATTGet2Base3FromBuff(&tmpAtt->sModePara.WorkMode, &tmpAtt->AttData3T2Para.WorkModeBK[0]);
		ATTGet2Base3FromBuff(&tmpConst->AttCmdFlashPara.WorkModeChangeAuto, &tmpAtt->AttData3T2Para.WorkModeChangeAutoBK[0]);
		for (i = 0; i < STAR_NUM; ++i)
		{
			ATTGet2Base3FromBuff(&tmpAtt->sErrCtlPara.SS_err[i], &tmpAtt->AttData3T2Para.SS_errBK[i][0]);
		}
		for (i = 0; i < MAG_NUM; ++i)
		{
			ATTGet2Base3FromBuff(&tmpAtt->sErrCtlPara.Mag_err[i], &tmpAtt->AttData3T2Para.Mag_errBK[i][0]);
		}
		for (i = 0; i < GYRO_NUM; ++i)
		{
			ATTGet2Base3FromBuff(&tmpAtt->sErrCtlPara.Gyro_err[i], &tmpAtt->AttData3T2Para.Gyro_errBK[i][0]);
		}
		for (i = 0; i < WHEEL_NUM; ++i)
		{
			ATTGet2Base3FromBuff(&tmpAtt->sErrCtlPara.Whl_Err[i], &tmpAtt->AttData3T2Para.Whl_ErrBK[i][0]);
		}
		ATTGet2Base3FromBuff(&tmpAtt->sErrCtlPara.PPU_Err, &tmpAtt->AttData3T2Para.PPU_ErrBK[0]);
		for (i = 0; i < STAR_NUM; ++i)
		{
			ATTGet2Base3FromBuff(&tmpAtt->sIMPTPara.SSUseState[i], &tmpAtt->AttData3T2Para.SSUseStateBK[i][0]);
		}
		for (i = 0; i < ASS_NUM; ++i)
		{
			ATTGet2Base3FromBuff(&tmpAtt->sIMPTPara.AssUseState[i], &tmpAtt->AttData3T2Para.AssUseStateBK[i][0]);
		}
		for (i = 0; i < MAG_NUM; ++i)
		{
			ATTGet2Base3FromBuff(&tmpAtt->sIMPTPara.MagUseState[i], &tmpAtt->AttData3T2Para.MagUseStateBK[i][0]);
		}
		for (i = 0; i < GYRO_NUM; ++i)
		{
			ATTGet2Base3FromBuff(&tmpAtt->sIMPTPara.GyroUseState[i], &tmpAtt->AttData3T2Para.GyroUseStateBK[i][0]);
		}
		for (i = 0; i < WHEEL_NUM; ++i)
		{
			ATTGet2Base3FromBuff(&tmpAtt->sIMPTPara.Whl_Use[i], &tmpAtt->AttData3T2Para.Whl_UseBK[i][0]);
		}
		for (i = 0; i < MT_NUM; ++i)
		{
			ATTGet2Base3FromBuff(&tmpAtt->sIMPTPara.MTUseStatus[i], &tmpAtt->AttData3T2Para.MTUseStatusBK[i][0]);
		}
		ATTGet2Base3FromBuff(&tmpAtt->sIMPTPara.PPUUseStatus, &tmpAtt->AttData3T2Para.PPUUseStatusBK[0]);
		for (i = 0; i < 3; ++i)
		{
			ATTGet2Base3FromBuff(&tmpConst->AttCmdFlashPara.Gyro_ComRESW[i], &tmpAtt->AttData3T2Para.Gyro_ComRESWBK[i][0]);
		}
		for (i = 0; i < 3; ++i)
		{
			ATTGet2Base3FromBuff(&tmpConst->AttCmdFlashPara.Mag_ComRESW[i], &tmpAtt->AttData3T2Para.Mag_ComRESWBK[i][0]);
		}
		for (i = 0; i < STAR_NUM; ++i)
		{
			ATTGet2Base3FromBuff(&tmpAtt->sPerPara.SsPara[i].ssPrior, &tmpAtt->AttData3T2Para.ssPriorBK[i][0]);
		}
		for (i = 0; i < GYRO_NUM; ++i)
		{
			ATTGet2Base3FromBuff(&tmpAtt->sPerPara.GyroPara[i].GyroPrior, &tmpAtt->AttData3T2Para.GyroPriorBK[i][0]);
		}
		
		for (i = 0; i < STAR_NUM; ++i)
		{
			ATTGet2Base3FromBuff(&tmpConst->AllowssONOFF[i], &tmpAtt->AttData3T2Para.AllowssONOFFBK[i][0]);
		}

		for (i = 0; i < GYRO_NUM; ++i)
		{
			ATTGet2Base3FromBuff(&tmpConst->AllowGyroONOFF[i], &tmpAtt->AttData3T2Para.AllowGyroONOFFBK[i][0]);
		}

		for (i = 0; i < MAG_NUM; ++i)
		{
			ATTGet2Base3FromBuff(&tmpConst->AllowMagONOFF[i], &tmpAtt->AttData3T2Para.AllowMagONOFFBK[i][0]);
		}

		for (i = 0; i < WHEEL_NUM; ++i)
		{
			ATTGet2Base3FromBuff(&tmpConst->AllowWhlONOFF[i], &tmpAtt->AttData3T2Para.AllowWhlONOFFBK[i][0]);
		}
		
		ATTGet2Base3FromBuff(&tmpConst->AllowPPUONOFF, &tmpAtt->AttData3T2Para.AllowPPUONOFFBK[0]);
			
		ATTGet2Base3FromBuff(&tmpConst->Allow_Sensor_CThr, &tmpAtt->AttData3T2Para.Allow_Sensor_CThrBK[0]);
		ATTGet2Base3FromBuff(&tmpConst->AllowAttLoseDiagFlg, &tmpAtt->AttData3T2Para.AllowAttLoseDiagFlgBK[0]);
		ATTGet2Base3FromBuff(&tmpConst->AllowAttExDiagFlg,	&tmpAtt->AttData3T2Para.AllowAttExDiagFlgBK[0]);
		ATTGet2Base3FromBuff(&tmpConst->AllowAttStaDiagFlg, &tmpAtt->AttData3T2Para.AllowAttStaDiagFlgBK[0]);
		
	//}
}

/*****************************************************************************
*名称:
*描述:
******************************************************************************/
void ATTImportDataBackup(void)
{
	UINT8 i = 0X00;
	sAttPriData *tmpAtt = NULL;
	AttCtrlConst_t *tmpConst = NULL;

	tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR;
	tmpConst=(AttCtrlConst_t *)ATTCLT_DATA2_ADDR;
	if((NULL == tmpAtt) || (NULL == tmpConst))
	{
		return;
	}
	
	//tmpAtt->AttData3T2Para.AttCtlBKFlag = POSE_OK;
	ATTSetBase3ToBuff(&tmpAtt->sModePara.WorkMode, &tmpAtt->AttData3T2Para.WorkModeBK[0]);
	ATTSetBase3ToBuff(&tmpConst->AttCmdFlashPara.WorkModeChangeAuto, &tmpAtt->AttData3T2Para.WorkModeChangeAutoBK[0]);
	for (i = 0; i < STAR_NUM; ++i)
	{
		ATTSetBase3ToBuff(&tmpAtt->sErrCtlPara.SS_err[i], &tmpAtt->AttData3T2Para.SS_errBK[i][0]);
	}
	for (i = 0; i < MAG_NUM; ++i)
	{
		ATTSetBase3ToBuff(&tmpAtt->sErrCtlPara.Mag_err[i], &tmpAtt->AttData3T2Para.Mag_errBK[i][0]);
	}
	for (i = 0; i < GYRO_NUM; ++i)
	{
		ATTSetBase3ToBuff(&tmpAtt->sErrCtlPara.Gyro_err[i], &tmpAtt->AttData3T2Para.Gyro_errBK[i][0]);
	}
	for (i = 0; i < WHEEL_NUM; ++i)
	{
		ATTSetBase3ToBuff(&tmpAtt->sErrCtlPara.Whl_Err[i], &tmpAtt->AttData3T2Para.Whl_ErrBK[i][0]);
	}
	ATTSetBase3ToBuff(&tmpAtt->sErrCtlPara.PPU_Err, &tmpAtt->AttData3T2Para.PPU_ErrBK[0]);
	for (i = 0; i < STAR_NUM; ++i)
	{
		ATTSetBase3ToBuff(&tmpAtt->sIMPTPara.SSUseState[i], &tmpAtt->AttData3T2Para.SSUseStateBK[i][0]);
	}
	for (i = 0; i < ASS_NUM; ++i)
	{
		ATTSetBase3ToBuff(&tmpAtt->sIMPTPara.AssUseState[i], &tmpAtt->AttData3T2Para.AssUseStateBK[i][0]);
	}
	for (i = 0; i < MAG_NUM; ++i)
	{
		ATTSetBase3ToBuff(&tmpAtt->sIMPTPara.MagUseState[i], &tmpAtt->AttData3T2Para.MagUseStateBK[i][0]);
	}
	for (i = 0; i < GYRO_NUM; ++i)
	{
		ATTSetBase3ToBuff(&tmpAtt->sIMPTPara.GyroUseState[i], &tmpAtt->AttData3T2Para.GyroUseStateBK[i][0]);
	}
	for (i = 0; i < WHEEL_NUM; ++i)
	{
		ATTSetBase3ToBuff(&tmpAtt->sIMPTPara.Whl_Use[i], &tmpAtt->AttData3T2Para.Whl_UseBK[i][0]);
	}
	for (i = 0; i < MT_NUM; ++i)
	{
		ATTSetBase3ToBuff(&tmpAtt->sIMPTPara.MTUseStatus[i], &tmpAtt->AttData3T2Para.MTUseStatusBK[i][0]);
	}
	ATTSetBase3ToBuff(&tmpAtt->sIMPTPara.PPUUseStatus, &tmpAtt->AttData3T2Para.PPUUseStatusBK[0]);
	for (i = 0; i < 3; ++i)
	{
		ATTSetBase3ToBuff(&tmpConst->AttCmdFlashPara.Gyro_ComRESW[i], &tmpAtt->AttData3T2Para.Gyro_ComRESWBK[i][0]);
	}
	for (i = 0; i < 3; ++i)
	{
		ATTSetBase3ToBuff(&tmpConst->AttCmdFlashPara.Mag_ComRESW[i], &tmpAtt->AttData3T2Para.Mag_ComRESWBK[i][0]);
	}
	for (i = 0; i < STAR_NUM; ++i)
	{
		ATTSetBase3ToBuff(&tmpAtt->sPerPara.SsPara[i].ssPrior, &tmpAtt->AttData3T2Para.ssPriorBK[i][0]);
	}
	for (i = 0; i < GYRO_NUM; ++i)
	{
		ATTSetBase3ToBuff(&tmpAtt->sPerPara.GyroPara[i].GyroPrior, &tmpAtt->AttData3T2Para.GyroPriorBK[i][0]);
	}
	
	for (i = 0; i < STAR_NUM; ++i)
	{
		ATTSetBase3ToBuff(&tmpConst->AllowssONOFF[i], &tmpAtt->AttData3T2Para.AllowssONOFFBK[i][0]);
	}

	for (i = 0; i < GYRO_NUM; ++i)
	{
		ATTSetBase3ToBuff(&tmpConst->AllowGyroONOFF[i], &tmpAtt->AttData3T2Para.AllowGyroONOFFBK[i][0]);
	}

	for (i = 0; i < MAG_NUM; ++i)
	{
		ATTSetBase3ToBuff(&tmpConst->AllowMagONOFF[i], &tmpAtt->AttData3T2Para.AllowMagONOFFBK[i][0]);
	}

	for (i = 0; i < WHEEL_NUM; ++i)
	{
		ATTSetBase3ToBuff(&tmpConst->AllowWhlONOFF[i], &tmpAtt->AttData3T2Para.AllowWhlONOFFBK[i][0]);
	}
		
	ATTSetBase3ToBuff(&tmpConst->AllowPPUONOFF, &tmpAtt->AttData3T2Para.AllowPPUONOFFBK[0]);	
	
	ATTSetBase3ToBuff(&tmpConst->Allow_Sensor_CThr, &tmpAtt->AttData3T2Para.Allow_Sensor_CThrBK[0]);
	ATTSetBase3ToBuff(&tmpConst->AllowAttLoseDiagFlg, &tmpAtt->AttData3T2Para.AllowAttLoseDiagFlgBK[0]);
	ATTSetBase3ToBuff(&tmpConst->AllowAttExDiagFlg, &tmpAtt->AttData3T2Para.AllowAttExDiagFlgBK[0]);
	ATTSetBase3ToBuff(&tmpConst->AllowAttStaDiagFlg, &tmpAtt->AttData3T2Para.AllowAttStaDiagFlgBK[0]);
}


/************************************************双机FIFO********************************************************************/
/***********************************************
说明：姿控数据备份准备

***********************************************/
void    ZKDataBackUp(void)
{
	UINT8	i =  0X00;
	sAttPriData *tmpAtt = NULL;
	AttCtrlConst_t *tmpConst = NULL;
	sAttModPara_t *pWMod = NULL;
	AttBKPara_t   *pBK = NULL;
	sAttErrCtlPara_t 	*pREcheck = NULL;
	AttIMPTPara_t *pImpt = NULL;
	
	tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR;	
	tmpConst=(AttCtrlConst_t *)ATTCLT_DATA2_ADDR;
	if((NULL == tmpAtt) || (NULL == tmpConst))
	{
		return;
	}
	pWMod =&tmpAtt->sModePara;
	pBK   =&tmpAtt->AttBKPara;
	pREcheck=&tmpAtt->sErrCtlPara;
	pImpt=&tmpAtt->sIMPTPara;
	//PGyro[0] = &tmpAtt->sPerPara.GyroPara[0];
	//PGyro[1] = &tmpAtt->sPerPara.GyroPara[1];
	//PGyro[2] = &tmpAtt->sPerPara.GyroPara[2];

	pBK->BK_WorkMode  = pWMod->WorkMode;
	pBK->BK_WorkModeChangeAuto = tmpConst->AttCmdFlashPara.WorkModeChangeAuto;
	for(i = 0;i<STAR_NUM;i++)
	{
		pBK->BK_SS_err[i] = pREcheck->SS_err[i];
	}
	for(i = 0;i<MAG_NUM;i++)
	{
		pBK->BK_Mag_err[i] = pREcheck->Mag_err[i];
	}
	for(i = 0;i<GYRO_NUM;i++)
	{
		pBK->BK_Gyro_err[i] = pREcheck->Gyro_err[i];
	}
	for(i = 0;i<WHEEL_NUM;i++)
	{
		pBK->BK_Whl_Err[i] = pREcheck->Whl_Err[i];
	}
	
	pBK->BK_PPU_Err = pREcheck->PPU_Err;
	
	for(i = 0;i<STAR_NUM;i++)
	{
		pBK->BK_SSUseState[i] = pImpt->SSUseState[i];
	}

	for(i = 0;i<GYRO_NUM;i++)
	{
		pBK->BK_GyroUseState[i] = pImpt->GyroUseState[i];
	}

	for(i = 0;i<WHEEL_NUM;i++)
	{
		pBK->BK_Whl_Use[i] = pImpt->Whl_Use[i];
	}
	
	for(i = 0;i<MAG_NUM;i++)
	{
		pBK->BK_MagUseState[i] = pImpt->MagUseState[i];
	}
	
	for(i = 0;i<ASS_NUM;i++)
	{
		pBK->BK_AssUseState[i] = pImpt->AssUseState[i];
	}

	for(i = 0;i<MT_NUM;i++)
	{
		pBK->BK_MTUseStatus[i] = pImpt->MTUseStatus[i];
	}
	
	pBK->BK_PPUUseStatus= 0;
	if (POSE_OK == pImpt->PPUUseStatus)
	{
		pBK->BK_PPUUseStatus= pBK->BK_PPUUseStatus | 0x05;
	}
	else
	{
		pBK->BK_PPUUseStatus= pBK->BK_PPUUseStatus & 0xF0;
	}

	if (POSE_OK == pImpt->PPUSafeStatus)
	{
		pBK->BK_PPUUseStatus= pBK->BK_PPUUseStatus | 0x50;
	}
	else
	{
		pBK->BK_PPUUseStatus= pBK->BK_PPUUseStatus & 0x0F;
	}
	
	for(i = 0;i<MT_NUM;i++)
	{
		pBK->BK_MTUseStatus[i]= pImpt->MTUseStatus[i];
	}

	for (i = 0;i<3;i++)
	{
		pBK->BK_Gyro_ComRESW[i] = tmpConst->AttCmdFlashPara.Gyro_ComRESW[i];
	}

	for (i = 0;i<3;i++)
	{
		pBK->BK_Mag_ComRESW[i] = tmpConst->AttCmdFlashPara.Mag_ComRESW[i];
	}

	for (i = 0;i<STAR_NUM;i++)
	{
		pBK->BK_ssPrior[i] = tmpConst->SSUsePrior[i];
	}
	
	for (i = 0;i<GYRO_NUM;i++)
	{
		pBK->BK_GyroPrior[i] = tmpConst->GyroUsePrior[i];
	}
	
	for (i = 0;i<STAR_NUM;i++)
	{
		pBK->BK_ss_Diag[i] = pREcheck->ss_Diag[i];
	}

	for (i = 0;i<MAG_NUM;i++)
	{
		pBK->BK_Mag_Diag[i] = pREcheck->Mag_Diag[i];
	}

	for (i = 0;i<GYRO_NUM;i++)
	{
		pBK->BK_Gyro_Diag[i] = pREcheck->Gyro_Diag[i];
	}

	for (i = 0;i<WHEEL_NUM;i++)
	{
		pBK->BK_Whl_Diag[i]= pREcheck->Whl_Diag[i];
	}

	for (i = 0;i<STAR_NUM;i++)
	{
		pBK->BK_AllowssONOFF[i]= tmpConst->AllowssONOFF[i];
	}

	for (i = 0;i<GYRO_NUM;i++)
	{
		pBK->BK_AllowGyroONOFF[i]= tmpConst->AllowGyroONOFF[i];
	}

	for (i = 0;i<MAG_NUM;i++)
	{
		pBK->BK_AllowMagONOFF[i]= tmpConst->AllowMagONOFF[i];
	}

	for (i = 0;i<WHEEL_NUM;i++)
	{
		pBK->BK_AllowWhlONOFF[i]= tmpConst->AllowWhlONOFF[i];
	}

	pBK->BK_AllowPPUONOFF= tmpConst->AllowPPUONOFF;

	pBK->BK_Allow_Sensor_CThr	= tmpConst->Allow_Sensor_CThr;
	pBK->BK_AllowAttLoseDiagFlg	= tmpConst->AllowAttLoseDiagFlg;
	pBK->BK_AllowAttExDiagFlg	= tmpConst->AllowAttExDiagFlg;
	pBK->BK_AllowAttStaDiagFlg	= tmpConst->AllowAttStaDiagFlg;
}


/**************************************
**说明：数据备份
***************************************/
void ZKDoActDataTer(void)
{
    UINT8 *tmpAddr =  0X00;
	AttBKPara_t *tmpPCInfo = NULL;
	sAttPriData *tmpAtt = NULL;
	tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR;
	if(NULL == tmpAtt)
	{
		return;
	}
	tmpPCInfo =&tmpAtt->AttBKPara;
    AttBKPara_t	*tmpBKStr = NULL;
    tmpAddr = (UINT8 *)(ST_IMPDATA_ADDR + ST_IMPDATA_HEAD + ST_IMPDATA_ATTMNG_OFFSET * 64);	/*电源备份数据存储区域，第9块*/
	if(tmpAddr==NULL)
	return;    
    tmpBKStr = (AttBKPara_t *)tmpAddr;
 
    /*保存数据:备份数据结构与能源结构体前几个成员保持一致，直接数据拷贝*/
	//memset(((UINT8 *)tmpBKStr + sizeof(sSaveDataHead)), 0, 64*ST_IMPDATA_ATTMNG_BLOCKS);
    //memcpy(((UINT8 *)tmpBKStr + sizeof(sSaveDataHead)),(UINT8 *)tmpPCInfo,(sizeof(AttBKPara_t)-sizeof(sSaveDataHead) - 4));
	memcpy(((UINT8 *)tmpBKStr),(UINT8 *)tmpPCInfo,(sizeof(AttBKPara_t)));

    /*设定校验*/
    //tmpBKStr->sBKHead.iDataLength = 64*ST_IMPDATA_ATTMNG_BLOCKS - sizeof(sSaveDataHead);
    tmpBKStr->sBKHead.iDataLength = sizeof(AttBKPara_t) - sizeof(sSaveDataHead);
	tmpBKStr->sBKHead.iDataType = BACKUP_TYPE_ATTFIFO;
    tmpBKStr->iVldFlag = 0x55555555;
    tmpBKStr->sBKHead.iDataCheck = DoGetCheckSum(tmpAddr + sizeof(sSaveDataHead), tmpBKStr->sBKHead.iDataLength );

    /*设置更新标志*/
    tmpAddr = (UINT8 *)ST_IMPDATA_ADDR;
    tmpAddr[ST_IMPDATA_ATTMNG_OFFSET] = 0x55;
}


/***********************************************
说明：备份数据恢复
输入：
输出：
***********************************************/
void	ZKCtrlReinitBK(void)
{
	UINT8	i = 0;
	//UINT8   bChkOK = POSE_NO;
	UINT8	*tmpAddr =  0X00;
	UINT16  *tmpData16 = NULL;
	UINT16	tmpDA1 = 0U;
	TYPE_CAL fData1 = 0.0F;
	
	sAttPriData *tmpAtt = NULL;
	AttCtrlConst_t *tmpConst = NULL;
	AttBKPara_t	*tmpBKStr = NULL;
	//sTaskMngDataRecord   *tmpTaskMngDataRcd = NULL;
	sDevInfo	*tmpDevInfo = NULL;
	
	//tmpTaskMngDataRcd = (sTaskMngDataRecord *)ST_TASKMNG_ADDR;
	tmpAtt = (sAttPriData *)ATTCLT_DATA1_ADDR;
	tmpConst = (AttCtrlConst_t *)ATTCLT_DATA2_ADDR;

	if((NULL == tmpAtt) || (NULL == tmpConst))
	{
		return;
	}
	
	/*获取双机FIFO数据地址*/
	tmpAddr = (UINT8 *)(ST_IMPDATA_ADDR + ST_IMPDATA_HEAD + ST_IMPDATA_ATTMNG_OFFSET * 64);
	tmpBKStr = (AttBKPara_t *)tmpAddr;
	
	/*对关键变量进行三取二，每周期都获取*/
	ATTGetImportDataFromBuff();
	
	/*首次卫星加电操作*/
	ZKDptPowerOnPrc();
	
	/*做重新初始化动作*/
	if(0x55U == m_pZKTaskInfo->iReInit)
	{
		m_pZKTaskInfo->iReInit= 0;
		
		tmpAtt->sModePara.ReDataBK = POSE_NO;
				
		/*获取本地FLASH 飞轮ID的装订参数*/
		ZKREFlashBK();

		/*重启/切机/复位 飞轮转速电流给0*/
		SetWheel(1,0,WHL_CMD_CODE_CURR);
		SetWheel(2,0,WHL_CMD_CODE_CURR);
		SetWheel(3,0,WHL_CMD_CODE_CURR);
		SetWheel(4,0,WHL_CMD_CODE_CURR);

		/*校验备份区数据有效性，若校验一次无效，再校验一次*/
		if(DoCheckSaveData(tmpAddr, 64*ST_IMPDATA_ATTMNG_BLOCKS) && (0x55555555 == tmpBKStr->iVldFlag)&&(BACKUP_TYPE_ATTFIFO == tmpBKStr->sBKHead.iDataType ))
		{
			tmpAtt->sModePara.ReDataBK= POSE_OK;
		}
		else if(DoCheckSaveData(tmpAddr, 64*ST_IMPDATA_ATTMNG_BLOCKS) && (0x55555555 == tmpBKStr->iVldFlag)&&(BACKUP_TYPE_ATTFIFO == tmpBKStr->sBKHead.iDataType ))
		{	
			tmpAtt->sModePara.ReDataBK= POSE_OK;
		}
		else
		{
			/*两次数据校验均无效，数据认为数据恢复无效；若帆板展开进入-速率阻尼，未展开进入-碰撞规避*/
			tmpDevInfo = GETDEVINFO(DEV_NO_AD);
			tmpData16 = (UINT16 *)(tmpDevInfo->cDevYCBuffer + INFO_ADDR_OFF);
			tmpDA1	 =	*(tmpData16 + SW47 - 1);	/*太阳翼展开机构展开到位正线*/
			fData1	 =	0.002442F * tmpDA1 - 5.0F;     /*(idata * 10.0 / 4095 - 5)*/
			
			if(POSE_ABSF(fData1) < 0.1)//0.1V以下
			{
				/*展开*/
				ZKModDoSet(ATTMOD_RATEDMP);
			}
			else
			{
				/*未展开*/
				ZKModDoSet(ATTMOD_NOCOLL);
			}
			return;
		}
		if (POSE_OK == tmpAtt->sModePara.ReDataBK)
		{
			/*数据校验通过，进行数据恢复*/
			tmpAtt->sModePara.WorkMode = tmpBKStr->BK_WorkMode;
			tmpConst->AttCmdFlashPara.WorkModeChangeAuto= tmpBKStr->BK_WorkModeChangeAuto;
		
			for(i = 0;i<STAR_NUM;i++)
			{
				tmpAtt->sErrCtlPara.SS_err[i]= tmpBKStr->BK_SS_err[i];
				tmpConst->SSUsePrior[i]=tmpBKStr->BK_ssPrior[i];
				tmpAtt->sErrCtlPara.ss_Diag[i]= tmpBKStr->BK_ss_Diag[i];
				tmpConst->AllowssONOFF[i]= tmpBKStr->BK_AllowssONOFF[i];
				tmpAtt->sIMPTPara.SSUseState[i]= tmpBKStr->BK_SSUseState[i];
			}
		
			for(i = 0;i<MAG_NUM;i++)
			{
				tmpAtt->sIMPTPara.MagUseState[i]= tmpBKStr->BK_MagUseState[i];
				tmpAtt->sErrCtlPara.Mag_err[i]= tmpBKStr->BK_Mag_err[i];
				tmpAtt->sErrCtlPara.Mag_Diag[i]= tmpBKStr->BK_Mag_Diag[i];
				tmpConst->AllowMagONOFF[i]= tmpBKStr->BK_AllowMagONOFF[i];
				tmpConst->AttCmdFlashPara.Mag_ComRESW[i]=tmpBKStr->BK_Mag_ComRESW[i];
			}
		
			for(i = 0;i<GYRO_NUM;i++)
			{
				tmpAtt->sErrCtlPara.Gyro_err[i]= tmpBKStr->BK_Gyro_err[i];
				tmpAtt->sIMPTPara.GyroUseState[i]= tmpBKStr->BK_GyroUseState[i];
				tmpConst->AttCmdFlashPara.Gyro_ComRESW[i]=tmpBKStr->BK_Gyro_ComRESW[i];
				tmpConst->GyroUsePrior[i]=tmpBKStr->BK_GyroPrior[i];
				tmpAtt->sErrCtlPara.Gyro_Diag[i]= tmpBKStr->BK_Gyro_Diag[i];
				tmpConst->AllowGyroONOFF[i]= tmpBKStr->BK_AllowGyroONOFF[i];
			}
		
			for(i = 0;i<WHEEL_NUM;i++)
			{
				tmpAtt->sErrCtlPara.Whl_Err[i]= tmpBKStr->BK_Whl_Err[i];
				tmpAtt->sIMPTPara.Whl_Use[i]= tmpBKStr->BK_Whl_Use[i];
				tmpAtt->sErrCtlPara.Whl_Diag[i]= tmpBKStr->BK_Whl_Diag[i];
				tmpConst->AllowWhlONOFF[i]= tmpBKStr->BK_AllowWhlONOFF[i];
			}
		
			tmpAtt->sErrCtlPara.PPU_Err= tmpBKStr->BK_PPU_Err;
		
			for(i = 0;i<ASS_NUM;i++)
			{
				tmpAtt->sIMPTPara.AssUseState[i]= tmpBKStr->BK_AssUseState[i];
			}

			for(i = 0;i<MT_NUM;i++)
			{
				tmpAtt->sIMPTPara.MTUseStatus[i]= tmpBKStr->BK_MTUseStatus[i];
				tmpAtt->sIMPTPara.MTUseStatus[i]= tmpBKStr->BK_MTUseStatus[i];
			}

			if (0x05 == (tmpBKStr->BK_PPUUseStatus & 0x0F))
			{
				tmpAtt->sIMPTPara.PPUUseStatus= POSE_OK;
			}
			else
			{
				tmpAtt->sIMPTPara.PPUUseStatus= POSE_NO;
			}

			if (0x50 == (tmpBKStr->BK_PPUUseStatus & 0xF0))
			{
				tmpAtt->sIMPTPara.PPUSafeStatus= POSE_OK;
			}
			else
			{
				tmpAtt->sIMPTPara.PPUSafeStatus= POSE_NO;
			}

			tmpConst->AllowPPUONOFF= tmpBKStr->BK_AllowPPUONOFF;
			tmpConst->Allow_Sensor_CThr= tmpBKStr->BK_Allow_Sensor_CThr;
			tmpConst->AllowAttLoseDiagFlg= tmpBKStr->BK_AllowAttLoseDiagFlg;
			tmpConst->AllowAttExDiagFlg= tmpBKStr->BK_AllowAttExDiagFlg;
			tmpConst->AllowAttStaDiagFlg= tmpBKStr->BK_AllowAttStaDiagFlg;
			if (ATTMOD_BREAKPRE == tmpAtt->sModePara.WorkMode)
			{
				tmpAtt->sModePara.WorkMode = ATTMOD_NOCOLL;
			}
			/*判断恢复后的工作模式，以及根据相应模式进行处理*/
			ZKReModBK();
		}
	
		///*重启、切机、复位恢复关键参数后，写入三取二数据存储区*/
		//ATTImportDataBackup();
	}
}

/***********************************************
说明：数据备份
输入：
输出：
***********************************************/
void	ZKCtrlDataBackUp(void)
{
	if(POSE_OK != m_pZKTaskInfo->iReInit)
	{
		ZKDataBackUp();
		ZKDoActDataTer();
	}
}

/************************************************Flash********************************************************************/
/***********************************************
说明：从Flash恢复数据
注意:
***********************************************/
void ATTRestoreFromFlash(void)
{
	AttBackupFlash_t  AttBackupFlashPara;
	UINT8 *tmpAddr = (UINT8 *)(ST_FIXDATA_ATTSADA_ADDR);
	AttBackupFlash_t *tmpBackup = (AttBackupFlash_t *)(ST_FIXDATA_ATTSADA_ADDR);	/*固定数据区*/
	sAttPriData *tmpAtt = NULL;
	AttCtrlConst_t *tmpConst = NULL;
	AttCmdFlash_t *PFlash = NULL;

	tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR;	
	tmpConst=(AttCtrlConst_t *)ATTCLT_DATA2_ADDR;
	PFlash = &tmpConst->AttCmdFlashPara;

	if ( NULL == tmpBackup || NULL == tmpConst  || NULL == tmpAtt)
	{
		return;
	}
	
	/* 若固定数据区数据（星务从测控单机Flash备份过来的数据）有效 */
	if ( BACKUP_TYPE_ATTFLASH == tmpBackup->sBKHead.iDataType && TRUE == DoCheckSaveData(tmpAddr, tmpBackup->sBKHead.iDataLength) && 0x55555555 == tmpBackup->iVldFlag )
	{
		FixDataStorFlashByType(FIXDATA_TYPE_ATTSADA, (UINT8*)tmpAddr, sizeof(AttBackupFlash_t));		/* 将固定数据区数据存到本地Flash */
	}
	/* 若测控单机数据无效，则从本地Flash读取数据到固定数据区 */
	else
	{
		/* 读取Flash备份数据 */
		memset((UINT8 *)tmpAddr, 0, ST_FIXDATA_ATTSADA_SIZE);
		FixDataLoadFlashByType(FIXDATA_TYPE_ATTSADA, (UINT8 *)tmpAddr, sizeof(AttBackupFlash_t));

		/* 检查类型和长度，若非法则不从Flash恢复 */
		if ( BACKUP_TYPE_ATTFLASH != tmpBackup->sBKHead.iDataType || 0 == tmpBackup->sBKHead.iDataLength || 0xFFFFFFFF == tmpBackup->sBKHead.iDataLength )
		{
			return;
		}

		/* 检查和校验和有效标志位，若非法则不从Flash恢复 */
		if ( TRUE != DoCheckSaveData(tmpAddr, tmpBackup->sBKHead.iDataLength) || 0x55555555 != tmpBackup->iVldFlag )
		{
			return;
		}
	}
	memcpy((UINT8 *)(&AttBackupFlashPara),((UINT8 *)tmpBackup ),sizeof(AttBackupFlash_t));
	//姿控Flash数据读取	
	memcpy((UINT8 *)PFlash,((UINT8 *)(&AttBackupFlashPara.AttFlashPara) ),sizeof(AttCmdFlash_t));
	//帆板Flash数据读取
	memcpy((UINT8 *)(&tmpAtt->ATSFlashPara),((UINT8 *)(&AttBackupFlashPara.SadaFlashPara) ),sizeof(SadaCmdFlash_t));
	
}


/***********************************************
说明：备份到Flash
注意:
***********************************************/
void ATTBackupToFlash(void)
{
	AttBackupFlash_t  AttBackupFlashPara;
	UINT8 *tmpAddr = (UINT8 *)(ST_FIXDATA_ATTSADA_ADDR);
	AttBackupFlash_t *tmpBackup = (AttBackupFlash_t *)(ST_FIXDATA_ATTSADA_ADDR);	/*固定数据区*/
	sAttPriData *tmpAtt = NULL;
	AttCtrlConst_t *tmpConst = NULL;
	AttCmdFlash_t *PFlash = NULL;
	tmpConst=(AttCtrlConst_t *)ATTCLT_DATA2_ADDR;
	tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR;
	PFlash = &tmpConst->AttCmdFlashPara;
	
	//QSPI轮询状态(0x55:擦除使能)执行FLASH数据备份写操作
	//QspiFlashWriteProcess(FIXDATA_TYPE_ATTSADA, sizeof(AttBackupFlash_t));
	
	if ( NULL == tmpBackup || NULL == tmpConst || NULL == tmpAtt )
	{
		return;
	}
	
	/* 若固定数据区没有更新，则直接退出 */
	if ( POSE_OK != tmpAtt->sModePara.ATTFlashSwitch )
	{
		return;
	}
	
	//姿控Flash数据写
	memcpy((UINT8 *)(&AttBackupFlashPara.AttFlashPara),((UINT8 *)PFlash),sizeof(AttCmdFlash_t));
	//SADA数据写
	memcpy((UINT8 *)(&AttBackupFlashPara.SadaFlashPara),(UINT8 *)(&tmpAtt->ATSFlashPara),sizeof(SadaCmdFlash_t));	
	//写入Flash缓存		
	memcpy((UINT8 *)tmpBackup,((UINT8 *)(&AttBackupFlashPara) ),sizeof(AttBackupFlash_t));	

	/* 设定有效标志位 */
	tmpBackup->iVldFlag = 0x55555555;
	
	/* 设定Flash头的长度、类型、校验和 */
	tmpBackup->sBKHead.iDataLength = sizeof(AttBackupFlash_t) - sizeof(sSaveDataHead);
	tmpBackup->sBKHead.iDataType = (UINT16)BACKUP_TYPE_ATTFLASH;
	tmpBackup->sBKHead.iDataCheck = DoGetCheckSum(tmpAddr+sizeof(sSaveDataHead), tmpBackup->sBKHead.iDataLength);
	
	/* 写入Flash */
	FixDataStorFlashByType(FIXDATA_TYPE_ATTSADA, (UINT8*)tmpAddr, sizeof(AttBackupFlash_t));
	
	/* 清除更新标志位 */
	tmpAtt->sModePara.ATTFlashSwitch = POSE_NO;
}


/***********************************************
说明：姿控的动作前准备，获取轨道数据
注意:	
***********************************************/
void ZKPreAction(void)
{
	UINT8		i = 0x00;
	UINT16 *tmpAddr = (UINT16 *)MAG_BASE_ADDR;

	sAttPriData *tmpAtt = NULL;
	sAttOrbitGetPara_t *pOrbit = NULL;
	OrbitPriData_t *tmpOrbit = NULL;		
	sAttModPara_t *pWMod = NULL;
	MtPara_t	*pMt = NULL;
	sSadaCtrlInfo* tmpSadaCtlInfo = (sSadaCtrlInfo *)SADACTR_BASE_ADDR;
	tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR;
	if ((NULL == tmpSadaCtlInfo) || (NULL == tmpAtt ))
	{
		return;
	}
	pOrbit = &tmpAtt->sOrbitPara;
	pWMod =&tmpAtt->sModePara;	
	pMt=&tmpAtt->sPerPara.MtPara;
	
	/*获取轨道数据*/
	tmpOrbit = (OrbitPriData_t *)ORBIT_BASE_ADDR;
	for(i = 0; i< 3; ++i)
	{	
		pOrbit->JPos[i] = (TYPE_CAL)tmpOrbit->sPoseUseOrbit.Rj[i];
		pOrbit->JVel[i] = (TYPE_CAL)tmpOrbit->sPoseUseOrbit.Vj[i];
	}
	pOrbit->GAST = (TYPE_CAL)tmpOrbit->sPoseUseOrbit.GAST;
	pOrbit->MJC = (TYPE_CAL)tmpOrbit->sPoseUseOrbit.MJC;
	pOrbit->MJCLv = tmpOrbit->sPoseUseOrbit.MJCLv;
	pOrbit->OrbitVld = tmpOrbit->sPoseUseOrbit.ObtTZKVld;
	
	//获取帆板数据
	pWMod->WModSadaOpenPre= pWMod->WModSadaOpen;
	pWMod->WModSadaOpen=tmpSadaCtlInfo->sSadaDataUP.SadaOpenFlag; //帆板展开信号
	pMt->MTStatus = 0xFF & ReadReg(tmpAddr,MAG_REG_SATUS);
	//单机加电状态量获取
	ZKPowerState();
}


/***********************************************
说明：轨道控制模块，轨控主函数.
输入：上注轨控数据，当前模式
输出：PPU开关
***********************************************/
void    ZKOCOrbitCtl(void)
{
	UINT16		tmpiDataCheck = 0;		/*数据校验和*/	
	UINT8		cmdDataBuff[50] = {0};
	UINT32		SatTime[2] ={0,0};	
	UINT8 PPUOn[8]	= {0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
	UINT8 PPUOff[8]	= {0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
	PPUPara_t *PPPU = NULL;
	
	sTaskInfo* tmpTaskInfo = NULL;
	sAttPriData *tmpAtt = NULL;
	sAttOrbitCtlData_t *tmpOrbCmd = NULL;		
	sAttOrbitCtlInfo_t *pOrb = NULL;	
	sAttModPara_t *pWMod =NULL;	
	AttIMPTPara_t *pImpt = NULL;
		
	tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR;
	tmpOrbCmd=(sAttOrbitCtlData_t *)ATTCLT_DATA3_ADDR;
	tmpTaskInfo = GetTaskInfoBT(TASK_ATTCTL);
	if ((NULL == tmpOrbCmd) || (NULL == tmpAtt))
	{
		return;
	}			
	pWMod=&tmpAtt->sModePara;
	pOrb=&tmpAtt->sOrbitInp;
	PPPU = &tmpAtt->sPerPara.PPUPara;
	pImpt= &tmpAtt->sIMPTPara;
	memset(cmdDataBuff, 0x00, 50);
	
	GetTime(SatTime);		//获取当前星上时
	
	if (POSE_OK != pOrb->OrbDataIn_OK)/*轨控数据包无效，直接退出*/
	{
		return;
	}

	if (pOrb->CurOrbCtrlPcak_ID >= 50)
	{
		DoSetInt32To8(ATT_CMDMODE_MODSUNCAP, cmdDataBuff);
		pOrb->CurOrbCtrlPcak_ID = 0;
		pOrb->CurOrbCtrlPcak_PreID =0xFF;
		pOrb->OrbCtrlPcak_ReceiveFlg[pOrb->CurOrbCtrlPcak_ID]= 0x00;
		PPPU->PPUT_FIR_Cnt = 0;
		pOrb->OrbDataIn_OK = POSE_NO;
		if(CheckBlockRing(&tmpTaskInfo->sCmdBuffer, tmpTaskInfo->sCmdDataBuff, MOD_REQ_MAXLEN, MOD_MAX_REQUEST))
		{
			/* 在姿控的指令处理中 进行 ZKModDoSet(ATT_CMDMODE_MODSUNCAP);*/
			BlockRingAdd(&tmpTaskInfo->sCmdBuffer, cmdDataBuff, TRUE);
		}
		return;
	}
	
	//轨道控制数据选择
	if (POSE_OK == pOrb->OrbDataIn_OK)
	{
		if  ((pOrb->CurOrbCtrlPcak_ID == (tmpOrbCmd->OrbCtrlPack[pOrb->CurOrbCtrlPcak_ID].OrbCtrlPcak_ID -1))&&(pOrb->CurOrbCtrlPcak_PreID != pOrb->CurOrbCtrlPcak_ID))
		{
			pOrb->CurOrbCtrlPcak_PreID = pOrb->CurOrbCtrlPcak_ID;
			tmpiDataCheck =DoGetCheckSum(&tmpOrbCmd->OrbCtrlPack[pOrb->CurOrbCtrlPcak_ID].OrbCtrlPcak_ID , 24);
			if ((pOrb->OrbCtrlPcak_ReceiveFlg[pOrb->CurOrbCtrlPcak_ID]== 0x55)&&(tmpiDataCheck == tmpOrbCmd->OrbCtrlPack[pOrb->CurOrbCtrlPcak_ID].OrbDateSum))
			{
				memcpy(&(pOrb->OrbCtrlPackCur), &(tmpOrbCmd->OrbCtrlPack[pOrb->CurOrbCtrlPcak_ID]), sizeof(AttOrbCtrlPara_t));
			}
			else
			{
				DoSetInt32To8(ATT_CMDMODE_MODSUNCAP, cmdDataBuff);
				pOrb->CurOrbCtrlPcak_ID = 0;
				pOrb->CurOrbCtrlPcak_PreID =0xFF;
				pOrb->OrbCtrlPcak_ReceiveFlg[pOrb->CurOrbCtrlPcak_ID]= 0x00;
				PPPU->PPUT_FIR_Cnt = 0;
				pOrb->OrbDataIn_OK = POSE_NO;
				if(CheckBlockRing(&tmpTaskInfo->sCmdBuffer, tmpTaskInfo->sCmdDataBuff, MOD_REQ_MAXLEN, MOD_MAX_REQUEST))
				{
					/* 在姿控的指令处理中 进行 ZKModDoSet(ATT_CMDMODE_MODSUNCAP);*/
					BlockRingAdd(&tmpTaskInfo->sCmdBuffer, cmdDataBuff, TRUE);
				}
				return;
			}
		}
	}
	
	if((POSE_OK == pOrb->OrbDataIn_OK)
		&&(0x55 == pOrb->OrbCtrlPcak_ReceiveFlg[pOrb->CurOrbCtrlPcak_ID])
		)
	{
		if(((ATTMOD_WhlTOSUN == pWMod->WorkMode) ||(ATTMOD_WHEELTOEARTH == pWMod->WorkMode))
			&&(SatTime[0]>=pOrb->OrbCtrlPackCur.OrbAttAjustTime)
			&&(SatTime[0]<pOrb->OrbCtrlPackCur.OrbCtrl_StartTime)
			)
		{	
			 DoSetInt32To8(ATT_WORKMODE_ORBITCTLPRE, cmdDataBuff);
			 if(CheckBlockRing(&tmpTaskInfo->sCmdBuffer, tmpTaskInfo->sCmdDataBuff, MOD_REQ_MAXLEN, MOD_MAX_REQUEST)) 
			 {
				 /* 在姿控的指令处理中 进行 ZKModDoSet(ATTMOD_ATTAJUSTPRE);*/
				 BlockRingAdd(&tmpTaskInfo->sCmdBuffer, cmdDataBuff, TRUE);     
			 }
		}
		else if((ATTMOD_ATTAJUSTPRE == pWMod->WorkMode)
			&&((SatTime[0]>=pOrb->OrbCtrlPackCur.OrbCtrl_StartTime)
			&&(SatTime[0]<= (pOrb->OrbCtrlPackCur.OrbCtrl_StartTime+pOrb->OrbCtrlPackCur.OrbCtrl_TimeLength)))
			)
		{
			DoSetInt32To8(ATT_WORKMODE_ORBITCTL, cmdDataBuff);
			if(CheckBlockRing(&tmpTaskInfo->sCmdBuffer, tmpTaskInfo->sCmdDataBuff, MOD_REQ_MAXLEN, MOD_MAX_REQUEST))
			{
				/* 在姿控的指令处理中 进行 ZKModDoSet(ATTMOD_ORBITCTL);*/
				BlockRingAdd(&tmpTaskInfo->sCmdBuffer, cmdDataBuff, TRUE);
				if (POSE_OK == pImpt->PPUUseStatus)
				{
					//PPU开机指令
					dev_can_write(DEV_NO_CAN0,PPUOn,8);
					PPPU->PPUOUT_Sta = POSE_OK;
					tmpAtt->sCtlPara.ZK_Ctrl_Reserver111 = POSE_NO;	
				}
			}
		}
		else if((ATTMOD_ORBITCTL == pWMod->WorkMode)
		&&((SatTime[0]>=(pOrb->OrbCtrlPackCur.OrbCtrl_StartTime+pOrb->OrbCtrlPackCur.OrbCtrl_TimeLength))&&
		(SatTime[0]<= (pOrb->OrbCtrlPackCur.OrbCtrl_StartTime+pOrb->OrbCtrlPackCur.OrbCtrl_TimeLength + 1))))
		{
			/*进入到这里，说明一组轨控流程正常退出*/
			switch(pOrb->OrbCtrlPackCur.OrbCtrl_Mod)
			{
				case	0x11:
					DoSetInt32To8(ATT_CMDMODE_WHEELTOEARTH, cmdDataBuff);
					pOrb->CurOrbCtrlPcak_ID ++;
					/*设置下一拍关PPU电源*/
					PPPU->PPU_OrbitCtl_Quit_Err_Flag = POSE_OK;/*正常退出轨控标志使能*/
					PPPU->PPU_OrbitCtl_Quit_Err_Cnt = 0;/*退出轨控后节拍计数清零*/
			
					PPPU->PPU_OrbitCtl_Quit_OK_Flag = POSE_OK;/*正常退出轨控标志使能*/
					PPPU->PPU_OrbitCtl_Quit_OK_Cnt = 0;/*退出轨控后节拍计数清零*/
				break;
				case	0x22:
					DoSetInt32To8(ATT_CMDMODE_WhlTOSUN, cmdDataBuff);
					pOrb->CurOrbCtrlPcak_ID ++;
					/*设置下一拍关PPU电源*/
					PPPU->PPU_OrbitCtl_Quit_Err_Flag = POSE_OK;/*正常退出轨控标志使能*/
					PPPU->PPU_OrbitCtl_Quit_Err_Cnt = 0;/*退出轨控后节拍计数清零*/
			
					PPPU->PPU_OrbitCtl_Quit_OK_Flag = POSE_OK;/*正常退出轨控标志使能*/
					PPPU->PPU_OrbitCtl_Quit_OK_Cnt = 0;/*退出轨控后节拍计数清零*/
				break;
				case	0x33:
					DoSetInt32To8(ATT_WORKMODE_ORBITCTLPRE, cmdDataBuff);
					pOrb->CurOrbCtrlPcak_ID ++;
					/*设置下一拍关PPU电源*/
					PPPU->PPU_OrbitCtl_Quit_Err_Flag = POSE_OK;/*正常退出轨控标志使能*/
					PPPU->PPU_OrbitCtl_Quit_Err_Cnt = 0;/*退出轨控后节拍计数清零*/
			
					PPPU->PPU_OrbitCtl_Quit_OK_Flag = POSE_OK;/*正常退出轨控标志使能*/
					PPPU->PPU_OrbitCtl_Quit_OK_Cnt = 0;/*退出轨控后节拍计数清零*/
				break;
				case	0x44:
					DoSetInt32To8(ATT_CMDMODE_ONLTOEARTH, cmdDataBuff);
					pOrb->CurOrbCtrlPcak_ID = 0;
					pOrb->CurOrbCtrlPcak_PreID =0xFF;
					pOrb->OrbCtrlPcak_ReceiveFlg[pOrb->CurOrbCtrlPcak_ID]= 0x00;
					PPPU->PPUT_FIR_Cnt = 0;
					pOrb->OrbDataIn_OK = POSE_NO;				
					/*设置下一拍关PPU电源*/
					PPPU->PPU_OrbitCtl_Quit_Err_Flag = POSE_OK;/*正常退出轨控标志使能*/
					PPPU->PPU_OrbitCtl_Quit_Err_Cnt = 0;/*退出轨控后节拍计数清零*/
							
					PPPU->PPU_OrbitCtl_Quit_OK_Flag = POSE_NO;/*正常退出轨控标志使能*/
					PPPU->PPU_OrbitCtl_Quit_OK_Cnt = 0;/*退出轨控后节拍计数清零*/
				break;
				case	0x55:
					DoSetInt32To8(ATT_CMDMODE_WhlTOSUN, cmdDataBuff);
					pOrb->CurOrbCtrlPcak_ID = 0;
					pOrb->CurOrbCtrlPcak_PreID =0xFF;
					pOrb->OrbCtrlPcak_ReceiveFlg[pOrb->CurOrbCtrlPcak_ID]= 0x00;
					PPPU->PPUT_FIR_Cnt = 0;
					pOrb->OrbDataIn_OK = POSE_NO;

					/*设置下一拍关PPU电源*/
					PPPU->PPU_OrbitCtl_Quit_Err_Flag = POSE_OK;/*正常退出轨控标志使能*/
					PPPU->PPU_OrbitCtl_Quit_Err_Cnt = 0;/*退出轨控后节拍计数清零*/
					
					PPPU->PPU_OrbitCtl_Quit_OK_Flag = POSE_NO;/*正常退出轨控标志使能*/
					PPPU->PPU_OrbitCtl_Quit_OK_Cnt = 0;/*退出轨控后节拍计数清零*/
				break;
				default:
					DoSetInt32To8(ATT_CMDMODE_MODSUNCAP, cmdDataBuff);
					pOrb->CurOrbCtrlPcak_ID = 0;
					pOrb->CurOrbCtrlPcak_PreID =0xFF;
					pOrb->OrbCtrlPcak_ReceiveFlg[pOrb->CurOrbCtrlPcak_ID]= 0x00;
					PPPU->PPUT_FIR_Cnt = 0;
					pOrb->OrbDataIn_OK = POSE_NO;

					/*设置下一拍关PPU电源*/
					PPPU->PPU_OrbitCtl_Quit_Err_Flag = POSE_OK;/*正常退出轨控标志使能*/
					PPPU->PPU_OrbitCtl_Quit_Err_Cnt = 0;/*退出轨控后节拍计数清零*/
					
					PPPU->PPU_OrbitCtl_Quit_OK_Flag = POSE_NO;/*正常退出轨控标志使能*/
					PPPU->PPU_OrbitCtl_Quit_OK_Cnt = 0;/*退出轨控后节拍计数清零*/
				break;
			}
			
			if(CheckBlockRing(&tmpTaskInfo->sCmdBuffer, tmpTaskInfo->sCmdDataBuff, MOD_REQ_MAXLEN, MOD_MAX_REQUEST))
			{
				/* 在姿控的指令处理中 ;*/
				BlockRingAdd(&tmpTaskInfo->sCmdBuffer, cmdDataBuff, TRUE);
				
			}
			
			PPPU->PPUOUT_Sta = POSE_NO;/*电推指令开关标志为关*/
			tmpAtt->sCtlPara.ZK_Ctrl_Reserver111 = POSE_NO;	
			//PPU关机指令
			dev_can_write(DEV_NO_CAN0, PPUOff, 8);/*轨控正常退出，电推关机操作，需要5秒后给电推供电*/
		}
	}

}

/***********************************************
说明：姿控的动作前准备，获取目标定向数据
注意:
***********************************************/
void ZKOCTarCtl(void)
{
	UINT16		tmpiDataCheck =0;		/*数据校验和*/
	UINT8		cmdDataBuff[50] = {0};
	UINT32		SatTime[2] ={0,0};
	sAttPriData *tmpAtt = NULL;
	AttCtrlConst_t *tmpConst = NULL;	
	sAttTARCCtlData_t *tmpTARCmd = NULL;
	sAttTARCCtlInfo_t *pTARC = NULL;	
	sAttModPara_t *pWMod =NULL;		
	sTaskInfo* tmpTaskInfo = NULL;
	
	tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR;
	tmpConst=(AttCtrlConst_t *)ATTCLT_DATA2_ADDR;	
	tmpTARCmd=(sAttTARCCtlData_t *)ATTCLT_DATA6_ADDR;
	if (NULL == tmpTARCmd || NULL == tmpAtt  || NULL == tmpConst)
	{
		return;
	}	
	
	tmpTaskInfo = GetTaskInfoBT(TASK_ATTCTL);
	
	pWMod=&tmpAtt->sModePara;
	pTARC=&tmpAtt->sTARCInp;
	
	if (POSE_OK != pTARC->TARDataIn_OK)/*目标定向数据包无效，直接退出*/
	{
		return;
	}
	
	if (pTARC->CurTARCtrlPcak_ID >= 30)
	{
		pTARC->CurTARCtrlPcak_ID = 0;
		return;
	}
	
	memset(cmdDataBuff, 0x00, 50);
	
	GetTime(SatTime);		//获取当前星上时

	if (POSE_OK==pTARC->TARDataIn_OK)
	{
		if  ((pTARC->CurTARCtrlPcak_ID == (tmpTARCmd->TARCtrlPack[pTARC->CurTARCtrlPcak_ID].TARCtrlPcak_ID -1)) &&(pTARC->CurTARCtrlPcak_ID != pTARC->CurTARCtrlPcak_PreID))
		{
			pTARC->CurTARCtrlPcak_PreID = pTARC->CurTARCtrlPcak_ID;
			tmpiDataCheck=DoGetCheckSum(&(tmpTARCmd->TARCtrlPack[pTARC->CurTARCtrlPcak_ID].TARCtrlPcak_ID), 23);
			if ((pTARC->TARCtrlPcak_ReceiveFlg[pTARC->CurTARCtrlPcak_ID]== 0x55)&&(tmpiDataCheck == tmpTARCmd->TARCtrlPack[pTARC->CurTARCtrlPcak_ID].TARCtrlDateSum))
			{
				memcpy(&(pTARC->TARCtrlPackCur), &(tmpTARCmd->TARCtrlPack[pTARC->CurTARCtrlPcak_ID]), sizeof(sAttTARCCtlPara_t));
			}
			else
			{
				pTARC->TARCtrlPcak_ReceiveFlg[pTARC->CurTARCtrlPcak_ID] = 0x00;
				DoSetInt32To8(ATT_CMDMODE_ONLTOEARTH, cmdDataBuff);
				pTARC->CurTARCtrlPcak_ID=0;
				pTARC->CurTARCtrlPcak_PreID =0xFF;
				pTARC->TARDataIn_OK = POSE_NO;
				if(CheckBlockRing(&tmpTaskInfo->sCmdBuffer, tmpTaskInfo->sCmdDataBuff, MOD_REQ_MAXLEN, MOD_MAX_REQUEST))
				{
					BlockRingAdd(&tmpTaskInfo->sCmdBuffer, cmdDataBuff, TRUE);
				}
				return ;
			}
		}
	}

	if((POSE_OK == pTARC->TARDataIn_OK)
			&&(0x55 == pTARC->TARCtrlPcak_ReceiveFlg[pTARC->CurTARCtrlPcak_ID])
	)
	{
		if(((ATTMOD_WhlTOSUN == pWMod->WorkMode) ||(ATTMOD_WHEELTOEARTH == pWMod->WorkMode))
				&&(SatTime[0]>=pTARC->TARCtrlPackCur.TARCtrl_JustTime)
				&&(SatTime[0]<pTARC->TARCtrlPackCur.TARCtrl_StartTime)
		)
		{
			DoSetInt32To8(ATT_WORKMODE_ATTAJUST, cmdDataBuff);
			if(CheckBlockRing(&tmpTaskInfo->sCmdBuffer, tmpTaskInfo->sCmdDataBuff, MOD_REQ_MAXLEN, MOD_MAX_REQUEST))
			{
				/* 在姿控的指令处理中 进行 ZKModDoSet(ATTMOD_ATTAJUSTPRE);*/
				BlockRingAdd(&tmpTaskInfo->sCmdBuffer, cmdDataBuff, TRUE);
			}
		}
		else if((ATTMOD_ATTAJUST == pWMod->WorkMode)
				&&((SatTime[0]>=pTARC->TARCtrlPackCur.TARCtrl_StartTime)
				&&(SatTime[0]<= (pTARC->TARCtrlPackCur.TARCtrl_StartTime+pTARC->TARCtrlPackCur.TARCtrl_TimeLength)))
		)
		{
			DoSetInt32To8(ATT_WORKMODE_ONLTOTAR, cmdDataBuff);
			if(CheckBlockRing(&tmpTaskInfo->sCmdBuffer, tmpTaskInfo->sCmdDataBuff, MOD_REQ_MAXLEN, MOD_MAX_REQUEST))
			{
				/* 在姿控的指令处理中 进行 ZKModDoSet(ATTMOD_ORBITCTL);*/
				BlockRingAdd(&tmpTaskInfo->sCmdBuffer, cmdDataBuff, TRUE);
			}
		}
		else if((ATTMOD_ONLTOTAR == pWMod->WorkMode)
				&&((SatTime[0]>=(pTARC->TARCtrlPackCur.TARCtrl_StartTime+pTARC->TARCtrlPackCur.TARCtrl_TimeLength))&&
				(SatTime[0]<= (pTARC->TARCtrlPackCur.TARCtrl_StartTime+pTARC->TARCtrlPackCur.TARCtrl_TimeLength + 1))))
		{
			if (pTARC->CurTARCtrlPcak_ID < 29)
			{
				pTARC->CurTARCtrlPcak_ID ++;
				if(0 == tmpTARCmd->TARCtrlPack[pTARC->CurTARCtrlPcak_ID].TARCtrlPcak_ID)/*下一包ID为0，认为目标定向结束*/
				{
					pTARC->TARCtrlPcak_ReceiveFlg[pTARC->CurTARCtrlPcak_ID] = 0x00;
					DoSetInt32To8(ATT_CMDMODE_ONLTOEARTH, cmdDataBuff);
					pTARC->CurTARCtrlPcak_ID=0;
					pTARC->CurTARCtrlPcak_PreID =0xFF;
					pTARC->TARDataIn_OK = POSE_NO;
				}
				else
				{
					DoSetInt32To8(ATT_WORKMODE_ATTAJUST, cmdDataBuff);
				}
				
			}
			else
			{
				DoSetInt32To8(ATT_CMDMODE_ONLTOEARTH, cmdDataBuff);
				pTARC->CurTARCtrlPcak_ID=0;
				pTARC->CurTARCtrlPcak_PreID =0xFF;
				pTARC->TARCtrlPcak_ReceiveFlg[pTARC->CurTARCtrlPcak_ID]= 0x00;
				pTARC->TARDataIn_OK = POSE_NO;
			}
			
			if(CheckBlockRing(&tmpTaskInfo->sCmdBuffer, tmpTaskInfo->sCmdDataBuff, MOD_REQ_MAXLEN, MOD_MAX_REQUEST))
			{
				/* 在姿控的指令处理中 进行 ZKModDoSet(ATTMOD_ORBITCTL);*/
				BlockRingAdd(&tmpTaskInfo->sCmdBuffer, cmdDataBuff, TRUE);
			}
			
		}
	}
	
	if((POSE_OK == pTARC->TARDataIn_OK) && (ATTMOD_ONLTOTAR == pWMod->WorkMode))
	{
		/*判断当前时间，是否在目标定向时间段内*/
		if (!(
				(SatTime[0]>=(pTARC->TARCtrlPackCur.TARCtrl_StartTime-2)) &&
				(SatTime[0]<= (pTARC->TARCtrlPackCur.TARCtrl_StartTime + pTARC->TARCtrlPackCur.TARCtrl_TimeLength+2))
			))
		{
			/*不在的话退出,进入对地定向模式*/
			DoSetInt32To8(ATT_CMDMODE_ONLTOEARTH, cmdDataBuff);
			pTARC->CurTARCtrlPcak_ID=0;
			pTARC->CurTARCtrlPcak_PreID =0xFF;
			pTARC->TARCtrlPcak_ReceiveFlg[pTARC->CurTARCtrlPcak_ID]= 0x00;
			pTARC->TARDataIn_OK = POSE_NO;
			if(CheckBlockRing(&tmpTaskInfo->sCmdBuffer, tmpTaskInfo->sCmdDataBuff, MOD_REQ_MAXLEN, MOD_MAX_REQUEST))
			{
				/* 在姿控的指令处理中*/
				BlockRingAdd(&tmpTaskInfo->sCmdBuffer, cmdDataBuff, TRUE);
			}
			return;
		}
	}		
}

///***********************************************
//说明：最小模式单机加电
//注意: 每0.5秒调用一次
//***********************************************/
void ZKMiniPowerOn(void)
{
//	UINT8	i = 0;
	UINT8	*tmpAddr =  0X00;	
	sAttPriData *tmpAtt = NULL;
	AttCtrlConst_t *tmpConst = NULL;
//	AttBKPara_t	*tmpBKStr = NULL;
	tmpAtt = (sAttPriData *)ATTCLT_DATA1_ADDR;
	tmpConst = (AttCtrlConst_t *)ATTCLT_DATA2_ADDR;

	if((NULL == tmpAtt) || (NULL == tmpConst))
	{
		return;
	}
	
	/*获取双机FIFO数据地址*/
	tmpAddr = (UINT8 *)(ST_IMPDATA_ADDR + ST_IMPDATA_HEAD + ST_IMPDATA_ATTMNG_OFFSET * 64);
//	tmpBKStr = (AttBKPara_t *)tmpAddr;
	
	/*首次卫星加电操作*/
	ZKDptPowerOnPrc();

	/*做重新初始化动作*/
	if(POSE_OK == tmpAtt->sModePara.MiniDataSet)
	{
		m_pZKTaskInfo->iReInit= 0;
		tmpAtt->sModePara.MiniDataSet =POSE_NO;
		tmpAtt->sModePara.ReDataBK = POSE_NO;

		/*获取本地FLASH 飞轮ID的装订参数*/
		ZKREFlashBK();
		
		/*读取flash区间数据*/
		ATTRestoreFromFlash();
		
		/*重启/切机/复位 飞轮转速电流给0*/
		SetWheel(1,0,WHL_CMD_CODE_CURR);
		SetWheel(2,0,WHL_CMD_CODE_CURR);
		SetWheel(3,0,WHL_CMD_CODE_CURR);
		SetWheel(4,0,WHL_CMD_CODE_CURR);		

		ZKModDoSet(ATTMOD_RATEDMP);
	}
}


/***********************************************
说明：姿控的所有动作，每周期一次调度
输入：	
输出：	
返回:	
注意:	
***********************************************/
void ZKAction(void)
{
	sAttPriData *tmpAtt = NULL;
	MtPara_t	*pMt = NULL;	
	//sAttModPara_t *pWMod;
	sTaskMngDataRecord   *tmpTaskMngDataRcd = NULL;
	tmpTaskMngDataRcd = (sTaskMngDataRecord *)ST_TASKMNG_ADDR;		
	tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR;
	if((NULL == tmpAtt)||(NULL == tmpTaskMngDataRcd))
	return;
	pMt=&tmpAtt->sPerPara.MtPara;
	
	if (POSE_OK == tmpAtt->sModePara.ModeSwitchFlg)
	{
		ZKModChgInit();
	}
	
	/*准备原始轨道数据*/
	ZKPreAction();
	m_pZKTaskInfo->iRunPos++;
#ifdef  MINMODULE_TYPE
		
	ZKMiniPowerOn();
	m_pZKTaskInfo->iRunPos++;	
	/*模式管理*/
	ZKDoModeAct();
	m_pZKTaskInfo->iRunPos++;

	/*环境模型计算*/
	ZKEnvAct();
	m_pZKTaskInfo->iRunPos++;
		
	if (0xFFFFFFFE > pMt-> MTCtrlTime)
	{
		pMt-> MTCtrlTime ++;   //此计数应该放在此强计和此模块前面
	} 
	else
	{
		pMt-> MTCtrlTime = 0;
	}

	//数据预处理
	ZKDPAction();
	m_pZKTaskInfo->iRunPos++;
	
	//*姿态确定*/
	ZKPGAct();
	m_pZKTaskInfo->iRunPos++;

	//*姿态控制
	ZKPosCtlAct(&tmpAtt->sDeterPara, &tmpAtt->sGuidLawPara, &tmpAtt->sCtlPara);
	m_pZKTaskInfo->iRunPos++;

	/*指令分配*/
	ZKCmdDspAct();
	tmpAtt->sModePara.WorkModePre = tmpAtt->sModePara.WorkMode;
	m_pZKTaskInfo->iRunPos++;
#else
	/*模式管理*/
	ZKDoModeAct();
	m_pZKTaskInfo->iRunPos++;

	/*环境模型计算*/
	ZKEnvAct();
	m_pZKTaskInfo->iRunPos++;
	
	if (0xFFFFFFFE > pMt-> MTCtrlTime)
	{
		pMt-> MTCtrlTime ++;   //此计数应该放在此强计和此模块前面
	}
	else
	{
		pMt-> MTCtrlTime = 0;
	}
	
	/*数据预处理*/
	ZKDPAction();
	m_pZKTaskInfo->iRunPos++;
	
	/*故障诊断与重构*/
	ZKREAction();
	m_pZKTaskInfo->iRunPos++;
	
	///*姿态确定*/
	ZKPGAct();
	m_pZKTaskInfo->iRunPos++;

	///*导引率计算*/
	ZKDYAction();
	m_pZKTaskInfo->iRunPos++;

	///*姿态控制*/
	ZKPosCtlAct(&tmpAtt->sDeterPara, &tmpAtt->sGuidLawPara, &tmpAtt->sCtlPara);
	m_pZKTaskInfo->iRunPos++;
	
	//目标定向控制处理
	ZKOCTarCtl();
	m_pZKTaskInfo->iRunPos++;
	
	//轨道控制处理
	ZKOCOrbitCtl();
	m_pZKTaskInfo->iRunPos++;

	/*指令分配*/
	ZKCmdDspAct();
	m_pZKTaskInfo->iRunPos++;
#endif
}
/***********************************************
说明：主任务函数
输入：taskID: 任务编号，与任务信息表中的编号一致
输出：
返回：
注意：
***********************************************/

void	AttCtrlMng(UINT8 taskID)
{	
	sTaskMngDataRecord   *tmpTaskMngDataRcd = NULL;
	tmpTaskMngDataRcd = (sTaskMngDataRecord *)ST_TASKMNG_ADDR;
	
    /*初始化模块*/
	if(!AttCtrlInit(taskID))
	{
		m_pZKTaskInfo->iErrCode = ERR_CODE_INIT;
		m_pZKTaskInfo->iStatus = TASK_STATUS_FAIL;
		return;
	}
	
	/*任务主循环*/
	while(TRUE)
	{
		/*等待唤醒，永久等待*/
		OSSemPend(&m_pZKTaskInfo->sMngSem, 0, OS_OPT_PEND_BLOCKING,
				&m_pZKTaskInfo->sMngTs,
				&m_pZKTaskInfo->sMngErr);

		StartTaskAction(m_pZKTaskInfo);
		

		ZKCtrlReinitBK();
		m_pZKTaskInfo->iRunPos++;
	
		//分离标志
        if(0x55 == tmpTaskMngDataRcd->bSHDepart) 
		{
			//姿轨控控制
			ZKAction();
			m_pZKTaskInfo->iRunPos++;
        }

		//处理指令
		ZKCmdResolve();
		m_pZKTaskInfo->iRunPos++;

		//*数据备份*/
		ZKCtrlDataBackUp();
		m_pZKTaskInfo->iRunPos++;
		
		//flash数据备份
		ATTBackupToFlash();
		m_pZKTaskInfo->iRunPos++;
		
		ATTImportDataBackup();
		m_pZKTaskInfo->iRunPos++;
		
		//m_pZKTaskInfo->iRunPos++;
		StopTaskAction(m_pZKTaskInfo);
		
		/*退出进程*/
		if(TASK_PERMIT_STOP == m_pZKTaskInfo->iPermit)
		{
			m_pZKTaskInfo->iTaskID = 0;
			m_pZKTaskInfo->iStatus = TASK_STATUS_STOP;
			break;
		}
	}
}



