Files
rag_agent/RAG-TEST-TOOLS/PrjAttCtrlMng/AttCtrlMain.c

4828 lines
138 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* 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;
}
}
}