diff --git a/.gitattributes b/.gitattributes index 486a232..40b2b8d 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1 +1,3 @@ *.zip filter=lfs diff=lfs merge=lfs -text +*.rar filter=lfs diff=lfs merge=lfs -text +*.7z filter=lfs diff=lfs merge=lfs -text diff --git a/TSCP/.cproject b/TSCP/.cproject new file mode 100644 index 0000000..5053f35 --- /dev/null +++ b/TSCP/.cproject @@ -0,0 +1,814 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/TSCP/.project b/TSCP/.project new file mode 100644 index 0000000..c985bbc --- /dev/null +++ b/TSCP/.project @@ -0,0 +1,26 @@ + + + TIOC + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + diff --git a/TSCP/src/APP/APP_API.c b/TSCP/src/APP/APP_API.c index dfbd8fa..2a1bd25 100644 --- a/TSCP/src/APP/APP_API.c +++ b/TSCP/src/APP/APP_API.c @@ -244,7 +244,7 @@ void APP_API_Data_Init() cDevType = (UINT8)((locTypeId >> 8U) & 0x00FFU); /*RC/CI绫诲瀷*/ - cRetVal = CiPatternInit((const)DataPath); /*鍒濆鍖栧綋鍓嶈仈閿佺被鍨嬮厤缃暟鎹*/ + cRetVal = RciCommonConfigDataInit((const)DataPath); /*鍒濆鍖栧綋鍓嶈仈閿佺被鍨嬮厤缃暟鎹*/ if ((CI_SUCCESS == cRetVal) && (CI_SUCCESS == funcRetVal)) /*鍒濆鍖栧綋鍓嶈仈閿佺被鍨嬮厤缃暟鎹*/ { cSystemWorkType = GetSystemWorkType(); @@ -717,46 +717,23 @@ ENUM_CM_RECCUSEB Is_Send_ExtendBoard(IN const CM_UINT16 dstDevTypeId) { ENUM_CM_RECCUSEB retVal = ENUM_CM_CC; /*杩斿洖鍊*/ CM_UINT8 devType = 0U; /*璁惧绫诲瀷*/ - CM_UINT8 devId = 0U; /*璁惧ID*/ CM_UINT16 wAtsGtWayDevTypeId = 0U; - UINT8 chLocalCiType = 0U; /*鏈仈閿佸睘鎬*/ - UINT8 chDstCiType = 0U; /*鏈仈閿佸睘鎬*/ - UINT8 chCldScxCommMode = 0U; UINT8 chWorkType = 0U; /*鍙岀郴宸ヤ綔妯″紡*/ UINT8 cControlState = 0U;/*涓诲鐢ㄦā寮*/ UINT8 cRcWorkMode = 0u;/*RC宸ヤ綔妯″紡*/ UINT8 chResult = CI_ERROR; /*鑱旈攣灞炴ф鏌ョ粨鏋*/ + UINT8 serialGroup = 0U; /*涓插彛閫氫俊缁勭储寮*/ wAtsGtWayDevTypeId = GetTiocTrnsmtGtwyDevTypeId(); /**浣跨敤閫氭帶鏉夸笌ATS缃戝叧閫氫俊*/ if (dstDevTypeId != wAtsGtWayDevTypeId) { devType = (CM_UINT8)((dstDevTypeId >> 8) & 0xFF); - devId = (CM_UINT8)(dstDevTypeId & 0xFF); - - chLocalCiType = GetLocalCiType(); - chDstCiType = GetCiType(devId); - chCldScxCommMode = GetCiFunctionSwitchConfig(SCX_CLD_INTERFACE_TYPE); chWorkType = GetSystemWorkType(); cControlState = GetLocalCiBackUpPattern(); cRcWorkMode = GetLocalRcWorkMode(); - if ((SCX_CLD_SERIAL_PORT_COMM == chCldScxCommMode) && (CI_SYSTEM_TYPE_RCI == devType)) - { - if (((CI_TYPE_CLD == chLocalCiType) && (CI_TYPE_SCX == chDstCiType)) || ((CI_TYPE_SCX == chLocalCiType) && (CI_TYPE_CLD == chDstCiType))) - { - /*涓插彛閫氫俊瑕佹眰鍙屾柟涓涓负杞﹁締娈典竴涓负璇曡溅绾*/ - chResult = CI_SUCCESS; - } - else - { - ; /*CI绫诲瀷閿欒锛岃繑鍥炲け璐*/ - } - } - else - { - ; /*涓嶄负涓插彛閫氫俊锛屾鏃朵笉瀵规湰鍦癈I绫诲瀷鍙婂鏂笴I绫诲瀷杩涜鍒ゆ柇*/ - } + chResult = IsSerialDevice(dstDevTypeId, &serialGroup); if ((CI_SYSTEM_TYPE_XIANDI == devType) || (CI_SYSTEM_TYPE_ATS == devType) || (CI_SUCCESS == chResult) diff --git a/TSCP/src/APP/PU13_integration_config/ci_integrate_config.h b/TSCP/src/APP/PU13_integration_config/ci_integrate_config.h index cae2711..0837b44 100644 --- a/TSCP/src/APP/PU13_integration_config/ci_integrate_config.h +++ b/TSCP/src/APP/PU13_integration_config/ci_integrate_config.h @@ -30,6 +30,6 @@ #define VER_INTE_PROJECT 220 /*项目编号*/ #define VER_INTE_PRODUCT 40 /*产品编号*/ #define VER_INTE_EXE 1 /*可执行编号*/ -#define VER_INTE_TIME 116 /*集成次数编号*/ +#define VER_INTE_TIME 131 /*集成次数编号*/ #endif/*endif of #define _CI_INTEGRATE_CONFIG_H*/ \ No newline at end of file diff --git a/TSCP/src/APP/ciapp/2oo2/2oo2DataTransferManage.c b/TSCP/src/APP/ciapp/2oo2/2oo2DataTransferManage.c index 5e9fbfe..bce22ab 100644 --- a/TSCP/src/APP/ciapp/2oo2/2oo2DataTransferManage.c +++ b/TSCP/src/APP/ciapp/2oo2/2oo2DataTransferManage.c @@ -1629,11 +1629,31 @@ UINT32 GetCiAppData(UINT8 *pCiAppDataPointer) pCiAppDataPointer[curIndex] = gCbtcCrossStructZc[ii].wTrainId; curIndex += 1u; } - + /*ATS/锟街碉拷/锟斤拷锟斤拷一锟斤拷锟斤拷锟筋及确锟斤拷锟斤拷息同锟斤拷*/ + /*锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷*/ + (void)CommonMemCpy((void *)(pCiAppDataPointer + curIndex), (UINT32)sizeof(AtsFollowUpCmdFstStru), (const void *)(&gDansuoCancleMsgFst), (UINT32)sizeof(AtsFollowUpCmdFstStru)); + curIndex = curIndex + (UINT32)sizeof(AtsFollowUpCmdFstStru); + (void)CommonMemCpy((void *)(pCiAppDataPointer + curIndex), (UINT32)sizeof(RCIFollowUpReplyStru), (const void *)(&gDansuoCancleReplyFst), (UINT32)sizeof(RCIFollowUpReplyStru)); + curIndex = curIndex + (UINT32)sizeof(RCIFollowUpReplyStru); + /*锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟*/ + (void)CommonMemCpy((void *)(pCiAppDataPointer + curIndex), (UINT32)sizeof(AtsFollowUpCmdFstStru), (const void *)(&gSwitchUnflockMsgFst), (UINT32)sizeof(AtsFollowUpCmdFstStru)); + curIndex = curIndex + (UINT32)sizeof(AtsFollowUpCmdFstStru); + (void)CommonMemCpy((void *)(pCiAppDataPointer + curIndex), (UINT32)sizeof(RCIFollowUpReplyStru), (const void *)(&gSwitchUnflockReplyFst), (UINT32)sizeof(RCIFollowUpReplyStru)); + curIndex = curIndex + (UINT32)sizeof(RCIFollowUpReplyStru); + /*锟斤拷锟轿斤拷锟斤拷锟斤拷锟*/ + (void)CommonMemCpy((void *)(pCiAppDataPointer + curIndex), (UINT32)sizeof(AtsFollowUpCmdFstStru), (const void *)(&gSecUnflockMsgFst), (UINT32)sizeof(AtsFollowUpCmdFstStru)); + curIndex = curIndex + (UINT32)sizeof(AtsFollowUpCmdFstStru); + (void)CommonMemCpy((void *)(pCiAppDataPointer + curIndex), (UINT32)sizeof(RCIFollowUpReplyStru), (const void *)(&gSecUnflockReplyFst), (UINT32)sizeof(RCIFollowUpReplyStru)); + curIndex = curIndex + (UINT32)sizeof(RCIFollowUpReplyStru); + /*锟脚号伙拷锟斤拷锟斤拷锟斤拷锟*/ + (void)CommonMemCpy((void *)(pCiAppDataPointer + curIndex), (UINT32)sizeof(AtsFollowUpCmdFstStru), (const void *)(&gSignalUnflockMsgFst), (UINT32)sizeof(AtsFollowUpCmdFstStru)); + curIndex = curIndex + (UINT32)sizeof(AtsFollowUpCmdFstStru); + (void)CommonMemCpy((void *)(pCiAppDataPointer + curIndex), (UINT32)sizeof(RCIFollowUpReplyStru), (const void *)(&gSignalUnflockReplyFst), (UINT32)sizeof(RCIFollowUpReplyStru)); + curIndex = curIndex + (UINT32)sizeof(RCIFollowUpReplyStru); /*锟斤拷锟斤拷一锟斤拷CRC*/ crcLength = curIndex - crcIndex; crcResult = Tioc_CommonCrc32(pCiAppDataPointer + crcIndex, crcLength); - debug_infor_printf((const)"2oo2 RecvCiCmdDataStruCurSum-gDyTestNum CRC:%x, Length:%d\n", crcResult, crcLength); + debug_infor_printf((const)"2oo2 RecvCiCmdDataStruCurSum-FollowUpCmd CRC:%x, Length:%d\n", crcResult, crcLength); } return curIndex; } @@ -2477,7 +2497,27 @@ UINT8 SetCiAppData(const UINT8 *pCiAppDataPointer,const UINT32 len) gCbtcCrossStructZc[ii].wTrainId = pCiAppDataPointer[curIndex]; curIndex += 1u; } - + /*同锟斤拷一锟斤拷锟斤拷锟筋及锟斤拷锟斤拷*/ + /*锟斤拷锟斤拷锟斤拷锟斤拷*/ + (void)CommonMemCpy((void *)(&gDansuoCancleMsgFst), (UINT32)sizeof(AtsFollowUpCmdFstStru), (const void *)(pCiAppDataPointer + curIndex), (UINT32)sizeof(AtsFollowUpCmdFstStru)); + curIndex = curIndex + (UINT32)sizeof(AtsFollowUpCmdFstStru); + (void)CommonMemCpy((void *)(&gDansuoCancleReplyFst), (UINT32)sizeof(RCIFollowUpReplyStru), (const void *)(pCiAppDataPointer + curIndex), (UINT32)sizeof(RCIFollowUpReplyStru)); + curIndex = curIndex + (UINT32)sizeof(RCIFollowUpReplyStru); + /*锟斤拷锟斤拷锟斤拷锟*/ + (void)CommonMemCpy((void *)(&gSwitchUnflockMsgFst), (UINT32)sizeof(AtsFollowUpCmdFstStru), (const void *)(pCiAppDataPointer + curIndex), (UINT32)sizeof(AtsFollowUpCmdFstStru)); + curIndex = curIndex + (UINT32)sizeof(AtsFollowUpCmdFstStru); + (void)CommonMemCpy((void *)(&gSwitchUnflockReplyFst), (UINT32)sizeof(RCIFollowUpReplyStru), (const void *)(pCiAppDataPointer + curIndex), (UINT32)sizeof(RCIFollowUpReplyStru)); + curIndex = curIndex + (UINT32)sizeof(RCIFollowUpReplyStru); + /*锟斤拷锟轿斤拷锟*/ + (void)CommonMemCpy((void *)(&gSecUnflockMsgFst), (UINT32)sizeof(AtsFollowUpCmdFstStru), (const void *)(pCiAppDataPointer + curIndex), (UINT32)sizeof(AtsFollowUpCmdFstStru)); + curIndex = curIndex + (UINT32)sizeof(AtsFollowUpCmdFstStru); + (void)CommonMemCpy((void *)(&gSecUnflockReplyFst), (UINT32)sizeof(RCIFollowUpReplyStru), (const void *)(pCiAppDataPointer + curIndex), (UINT32)sizeof(RCIFollowUpReplyStru)); + curIndex = curIndex + (UINT32)sizeof(RCIFollowUpReplyStru); + /*锟脚号伙拷锟斤拷锟*/ + (void)CommonMemCpy((void *)(&gSignalUnflockMsgFst), (UINT32)sizeof(AtsFollowUpCmdFstStru), (const void *)(pCiAppDataPointer + curIndex), (UINT32)sizeof(AtsFollowUpCmdFstStru)); + curIndex = curIndex + (UINT32)sizeof(AtsFollowUpCmdFstStru); + (void)CommonMemCpy((void *)(&gSignalUnflockReplyFst), (UINT32)sizeof(RCIFollowUpReplyStru), (const void *)(pCiAppDataPointer + curIndex), (UINT32)sizeof(RCIFollowUpReplyStru)); + curIndex = curIndex + (UINT32)sizeof(RCIFollowUpReplyStru); rtn = 1U; } } @@ -3800,11 +3840,11 @@ UINT32 CopyValidGetLogicSecDataCC(UINT8* pCurCiAppDataPointer, UINT16 struNum,Lo curIndex++; for (j = 0U; j < pstLogSecDataStruCC[i].chLogSecLockBelLogRouteSum; j++) { - ShortToChar(pstLogSecDataStruCC[i].szLogSecLockBelLogRouteData->wLogSecLockBelLogRouteId, (pCurCiAppDataPointer + curIndex)); + ShortToChar(pstLogSecDataStruCC[i].szLogSecLockBelLogRouteData[j].wLogSecLockBelLogRouteId, (pCurCiAppDataPointer + curIndex)); curIndex += 2U; - *(pCurCiAppDataPointer + curIndex) = pstLogSecDataStruCC[i].szLogSecLockBelLogRouteData->chLogSecLockBelLogRouteState; + *(pCurCiAppDataPointer + curIndex) = pstLogSecDataStruCC[i].szLogSecLockBelLogRouteData[j].chLogSecLockBelLogRouteState; curIndex++; - *(pCurCiAppDataPointer + curIndex) = pstLogSecDataStruCC[i].szLogSecLockBelLogRouteData->wLogSecLockBelLogRouteDir; + *(pCurCiAppDataPointer + curIndex) = pstLogSecDataStruCC[i].szLogSecLockBelLogRouteData[j].wLogSecLockBelLogRouteDir; curIndex++; } *(pCurCiAppDataPointer + curIndex) = pstLogSecDataStruCC[i].LogSecLogLockState; @@ -4701,7 +4741,7 @@ UINT32 CopyValidSetOcOrginData(UINT8* pCurCiAppDataPointer, UINT16 struNum, OcTo { m_OcToCiOrginDataNum = (UINT8)ValidIdNum; /*锟斤拷锟斤拷*/ - //printf("m_OcToCiOrginDataNum = %d\n", m_OcToCiOrginDataNum); + debug_infor_printf((char*)"m_OcToCiOrginDataNum = %d\n", m_OcToCiOrginDataNum); (void)CommonMemSet(OcRecvData, (UINT32)((OC_SUM_MAX)* sizeof(OcToCiOriginDataStruct)), 0U, (UINT32)((OC_SUM_MAX)* sizeof(OcToCiOriginDataStruct))); /*锟斤拷锟斤拷战峁癸拷锟斤拷止锟斤拷锟斤拷锟斤拷*/ for (i = 0U; i < ValidIdNum; i++) { @@ -4884,7 +4924,6 @@ UINT32 CopyValidSetOcOrginData(UINT8* pCurCiAppDataPointer, UINT16 struNum, OcTo UINT32 CopyValidGetOcOrginData(UINT8* pCurCiAppDataPointer, UINT16 struNum, OcToCiOriginDataStruct OcRecvData[]) { UINT32 curIndex = 0U; - UINT16 ValidIdNum = 0U; UINT16 i = 0U; UINT16 k = 0U; UINT8 j = 0U; @@ -4905,9 +4944,8 @@ UINT32 CopyValidGetOcOrginData(UINT8* pCurCiAppDataPointer, UINT16 struNum, OcTo ShortToChar(m_OcToCiOrginDataNum, pCurCiAppDataPointer); curIndex += (UINT32)sizeof(UINT16); /*锟斤拷锟斤拷锟斤拷锟街斤拷锟借备锟斤拷锟斤拷*/ //printf("m_OcToCiOrginDataNum = %d\n", m_OcToCiOrginDataNum); - if (struNum > ValidIdNum) - { - for (i = 0U; i < m_OcToCiOrginDataNum; i++) + + for (i = 0U; i < m_OcToCiOrginDataNum; i++) { ShortToChar(OcRecvData[i].OcId, (pCurCiAppDataPointer + curIndex)); curIndex += 2U; @@ -5056,7 +5094,7 @@ UINT32 CopyValidGetOcOrginData(UINT8* pCurCiAppDataPointer, UINT16 struNum, OcTo LongToChar(OcRecvData[i].ComStartCycle, (pCurCiAppDataPointer + curIndex)); curIndex += 4U; } - } + } else { diff --git a/TSCP/src/APP/ciapp/2oo2/2oo2DataTransferManage.h b/TSCP/src/APP/ciapp/2oo2/2oo2DataTransferManage.h index f5b1d34..d7c2f6c 100644 --- a/TSCP/src/APP/ciapp/2oo2/2oo2DataTransferManage.h +++ b/TSCP/src/APP/ciapp/2oo2/2oo2DataTransferManage.h @@ -56,6 +56,7 @@ #include "../Route/LogicalRouteDataManage.h" #include "../Route/LongRouteDataManage.h" #include "../ReverseCut/ReverseCutDataManage.h" +#include "../AxisSort/AxisSort.h" #ifdef __cplusplus extern "C" { diff --git a/TSCP/src/APP/ciapp/AxisAssert/AxisAssertManageAPI.c b/TSCP/src/APP/ciapp/AxisAssert/AxisAssertManageAPI.c index 0676797..6fdd440 100644 --- a/TSCP/src/APP/ciapp/AxisAssert/AxisAssertManageAPI.c +++ b/TSCP/src/APP/ciapp/AxisAssert/AxisAssertManageAPI.c @@ -394,7 +394,7 @@ static UINT8 aam_AxisErrorJudge(UINT16 acID,UINT16 acIndex) ; /*继续处理*/ } /** 判断相邻范围内计轴坏车最近占用时间检查通过 */ - if ((CI_ERROR == chNearbyCheck)) + if (CI_ERROR == chNearbyCheck) { /*有 坏车接近 或左右相邻计轴均无车接近 立即清除冗余计时*/ if ((AAM_BAD_NEAR == sameTrainType) || (AAM_BAD_NEAR == convertTrainType)) @@ -423,7 +423,6 @@ static UINT8 aam_AxisErrorJudge(UINT16 acID,UINT16 acIndex) /** 冗余计时位加1*/ aam_AddRedunTime(acIndex, maxRedunTimes); } - /** 计轴故障的判断 */ tmpRedunTime = aam_GetRedunTime(acIndex); tmppassTrainType = aam_GetPassTrainFlag(acIndex); @@ -2111,7 +2110,7 @@ UINT8 aam_ArbContinuousOccCheck(UINT16 wAcId, UINT8 cNearAcNum, UINT16 pNearAcId UINT8 cRetVal = CI_ERROR; UINT16 wBufIndex = 0U; UINT16 wCurRelPhySecId = 0U; /*本计轴区段所属物理区段ID*/ - UINT8 dwCiAndAxleTransBadEnsureCnt = 0U; /*判断与计轴通信中断周期数*/ + UINT32 dwCiAndAxleTransBadEnsureCnt = 0U; /*判断与计轴通信中断周期数*/ UINT32 dwCurAxleOccStartCycNum = 0U; /*本计轴区段占用起始周期*/ UINT8 ii = 0U; UINT16 wNearRelPhySecId = 0U; /*相邻计轴区段所属物理区段ID*/ diff --git a/TSCP/src/APP/ciapp/AxisSort/AxisSort.c b/TSCP/src/APP/ciapp/AxisSort/AxisSort.c index 80e5898..7b62a01 100644 --- a/TSCP/src/APP/ciapp/AxisSort/AxisSort.c +++ b/TSCP/src/APP/ciapp/AxisSort/AxisSort.c @@ -16,7 +16,7 @@ static UINT16 g_pSortLinkNum; /* 本控区的Link数量 */ static UINT16 g_pSortLinkIndex[AS_LINK_MAX + 1U]; /* 本控区的Link索引 */ -static AS_SORT_INFO_s g_pSortLinkInfo[AS_LINK_MAX + 1U]; /*link排序*/ +AS_SORT_INFO_s g_pSortLinkInfo[AS_LINK_MAX + 1U]; /*link排序*/ /* 通信车序列,在SortCT阶段完成CT车排序 */ static UINT16 s_pCTSortIndex[SIZE_MAX_LINE_TRAIN_NUM]; /*本信息不周期清空*/ @@ -2188,12 +2188,34 @@ UINT32 as_GetTransferData(OUT UINT8 * pDataBuff, IN UINT32 curIndex) { UINT32 ret = curIndex; UINT32 copyIndex = curIndex; + UINT16 wLinkNum = 0U; + UINT16 u16Index = 0U; + UINT16 wTmpLinkId = 0U; + UINT8 chLocalId = GetSystemParaLocalCiId(); + UINT8 chLinkCIId = 0U;/*link所属联锁*/ + UINT32 dwLinkNumIndex =0U;/*数量位置 */ if (NULL != pDataBuff) { (void)CommonMemCpy(&pDataBuff[copyIndex], (UINT32)(sizeof(UINT16) * SIZE_MAX_LINE_TRAIN_NUM), s_pCTSortIndex, (UINT32)(sizeof(UINT16) * SIZE_MAX_LINE_TRAIN_NUM)); copyIndex += (UINT32)(sizeof(UINT16) * SIZE_MAX_LINE_TRAIN_NUM); - (void)CommonMemCpy(&pDataBuff[copyIndex], (UINT32)(sizeof(CT_SORT_INFO_s) * SIZE_MAX_COM_VOBC_NUM + 1u), s_pCTSortInfo, (UINT32)(sizeof(CT_SORT_INFO_s) * SIZE_MAX_COM_VOBC_NUM + 1u)); - copyIndex += (UINT32)(sizeof(CT_SORT_INFO_s) * SIZE_MAX_COM_VOBC_NUM + 1u); + (void)CommonMemCpy(&pDataBuff[copyIndex], (UINT32)(sizeof(CT_SORT_INFO_s) * (SIZE_MAX_COM_VOBC_NUM + 1U)), s_pCTSortInfo, (UINT32)(sizeof(CT_SORT_INFO_s) * (SIZE_MAX_COM_VOBC_NUM + 1U))); + copyIndex += (UINT32)(sizeof(CT_SORT_INFO_s) * (SIZE_MAX_COM_VOBC_NUM + 1U)); + /*拷贝link列车排序*/ + dwLinkNumIndex = copyIndex; + copyIndex += 2U; + for (u16Index = 1U; u16Index <= g_pSortLinkNum; u16Index++) + { + wTmpLinkId = g_pSortLinkInfo[u16Index].u16ID; + chLinkCIId = (UINT8)GetLinkManageTiocById(wTmpLinkId); + if ((0U != chLocalId) && (chLinkCIId == chLocalId)) + { + /*仅拷贝本联锁*/ + (void)CommonMemCpy(&pDataBuff[copyIndex],(UINT32)(sizeof(AS_SORT_INFO_s)), &g_pSortLinkInfo[u16Index], (UINT32)(sizeof(AS_SORT_INFO_s))); + copyIndex += (UINT32)(sizeof(AS_SORT_INFO_s)); + wLinkNum++; + } + } + ShortToChar(wLinkNum, &pDataBuff[dwLinkNumIndex]); /* 写入有车占用的计轴区段数量 */ ret = copyIndex; } else @@ -2215,12 +2237,29 @@ UINT32 as_SetTransferData(IN UINT8 * pDataBuff, IN UINT32 curIndex) { UINT32 ret = curIndex; UINT32 copyIndex = curIndex; + UINT16 wLinkNum = 0U; + UINT16 jj = 0U; + UINT16 wTmpLinkId =0U; + UINT16 wLinkIndex = 0U; if (NULL != pDataBuff) { (void)CommonMemCpy(s_pCTSortIndex, (UINT32)(sizeof(UINT16) * SIZE_MAX_LINE_TRAIN_NUM), &pDataBuff[copyIndex], (UINT32)(sizeof(UINT16) * SIZE_MAX_LINE_TRAIN_NUM)); copyIndex += (UINT32)(sizeof(UINT16) * SIZE_MAX_LINE_TRAIN_NUM); - (void)CommonMemCpy(s_pCTSortInfo, (UINT32)(sizeof(CT_SORT_INFO_s) * SIZE_MAX_COM_VOBC_NUM + 1u), &pDataBuff[copyIndex], (UINT32)(sizeof(CT_SORT_INFO_s) * SIZE_MAX_COM_VOBC_NUM + 1u)); - copyIndex += (UINT32)(sizeof(CT_SORT_INFO_s) * SIZE_MAX_COM_VOBC_NUM + 1u); + (void)CommonMemCpy(s_pCTSortInfo, (UINT32)(sizeof(CT_SORT_INFO_s) * (SIZE_MAX_COM_VOBC_NUM + 1U)), &pDataBuff[copyIndex], (UINT32)(sizeof(CT_SORT_INFO_s) * (SIZE_MAX_COM_VOBC_NUM + 1U))); + copyIndex += (UINT32)(sizeof(CT_SORT_INFO_s) * (SIZE_MAX_COM_VOBC_NUM + 1U)); + /*拷贝列车排序*/ + wLinkNum = ShortFromChar(&pDataBuff[copyIndex]); + copyIndex += 2u; + for (jj = 0U; jj < wLinkNum; jj++) + { + wTmpLinkId = ShortFromCharLE(&pDataBuff[copyIndex]); + wLinkIndex = g_pSortLinkIndex[wTmpLinkId]; + if ((DEFAULT_ZERO < wLinkIndex) && (wLinkIndex < AS_LINK_MAX+1U)) + { + (void)CommonMemCpy(&g_pSortLinkInfo[wLinkIndex], (UINT32)(sizeof(AS_SORT_INFO_s)), &pDataBuff[copyIndex], (UINT32)(sizeof(AS_SORT_INFO_s))); + copyIndex += (UINT32)(sizeof(AS_SORT_INFO_s)); + } + } ret = copyIndex; } else diff --git a/TSCP/src/APP/ciapp/AxisSort/AxisSort.h b/TSCP/src/APP/ciapp/AxisSort/AxisSort.h index 9c8a49b..27d180a 100644 --- a/TSCP/src/APP/ciapp/AxisSort/AxisSort.h +++ b/TSCP/src/APP/ciapp/AxisSort/AxisSort.h @@ -48,5 +48,5 @@ typedef struct UINT16 TrainEnveLopeID[ENVELOPE_SUM_MAX]; /*所有包络ID信息*/ }s_TRAIN_ENVELOPE_ID; - +extern AS_SORT_INFO_s g_pSortLinkInfo[AS_LINK_MAX + 1U]; /*link排序*/ #endif /* INC_AXIS_SORT_INC */ \ No newline at end of file diff --git a/TSCP/src/APP/ciapp/DataManage/DeviceConfigDataManage.c b/TSCP/src/APP/ciapp/DataManage/DeviceConfigDataManage.c index e227eb9..1f3b8ec 100644 --- a/TSCP/src/APP/ciapp/DataManage/DeviceConfigDataManage.c +++ b/TSCP/src/APP/ciapp/DataManage/DeviceConfigDataManage.c @@ -105,37 +105,34 @@ SAME_LINE_ERR, */ UINT8 IsSameLineCI(const UINT8 ciA, const UINT8 ciB) { - UINT32 etcsIdA, etcsIdB; - UINT16 u16CiA, u16CiB; + UINT32 etcsIdA = 0U; + UINT32 etcsIdB = 0U; + UINT16 u16CiA = 0U; + UINT16 u16CiB = 0U; UINT8 retVal = SAME_LINE_ERR; - UINT8 cbtcSysType = DQU_CBTC_FAO; UINT8 dquDevNameA = CI_ERROR; UINT8 dquDevNameB = CI_ERROR; + UINT8 chCiAFactoryType = 0U; + UINT8 chCiBFactoryType = 0U; - u16CiA = (UINT16)((CI_SYSTEM_TYPE_RCI * 256u) + ciA); - u16CiB = (UINT16)((CI_SYSTEM_TYPE_RCI * 256u) + ciB); + u16CiA = (UINT16)((CI_SYSTEM_TYPE_RCI * 256U) + ciA); + u16CiB = (UINT16)((CI_SYSTEM_TYPE_RCI * 256U) + ciB); - cbtcSysType = GetCbtcSysType(); + dquDevNameA = dquDevName2HlhtId(u16CiA,0U,&etcsIdA); + dquDevNameB = dquDevName2HlhtId(u16CiB,0U,&etcsIdB); - dquDevNameA = dquDevName2HlhtId(u16CiA,0u,&etcsIdA); - - dquDevNameB = dquDevName2HlhtId(u16CiB,0u,&etcsIdB); - - if(DQU_CBTC_CPK == cbtcSysType) + /*需要增加互联互通的判断*/ + if ((CI_SUCCESS == dquDevNameA) && (CI_SUCCESS == dquDevNameB)) { - retVal = SAME_LINE_YES; - } - else if(DQU_CBTC_FAO == cbtcSysType) - { - retVal = SAME_LINE_YES; - } - else if(DQU_CBTC_HLT == cbtcSysType) - { - /*需要增加互联互通的判断*/ - if ((CI_SUCCESS == dquDevNameA) && (CI_SUCCESS == dquDevNameB)) + /*根据互联互通ETCS编号的定义,从低到高第三个字节为线路编号*/ + if ((etcsIdA & ((UINT32)0x00ff0000)) == (etcsIdB & ((UINT32)0x00ff0000))) { - /*根据互联互通ETCS编号的定义,从低到高第三个字节为线路编号*/ - if ((etcsIdA&((UINT32)0x00ff0000)) == (etcsIdB & ((UINT32)0x00ff0000))) + retVal = SAME_LINE_YES; + + /*同一条线路,一期二期使用不同厂家联锁,也判为不同线路,接口走互联互通*/ + chCiAFactoryType = GetCiFactoryType(ciA); + chCiBFactoryType = GetCiFactoryType(ciB); + if (chCiAFactoryType == chCiBFactoryType) { retVal = SAME_LINE_YES; } @@ -146,17 +143,14 @@ UINT8 IsSameLineCI(const UINT8 ciA, const UINT8 ciB) } else { - retVal = SAME_LINE_ERR; + retVal = SAME_LINE_NO; } - }/* zt 删除单轨相关代码 2022-02-15 */ - else if (DQU_CBTC_CC == cbtcSysType) - { - retVal = SAME_LINE_YES; } else - { + { retVal = SAME_LINE_ERR; } + return retVal; } /* diff --git a/TSCP/src/APP/ciapp/DataManage/DeviceDataManage.c b/TSCP/src/APP/ciapp/DataManage/DeviceDataManage.c index 595d022..c4666fc 100644 --- a/TSCP/src/APP/ciapp/DataManage/DeviceDataManage.c +++ b/TSCP/src/APP/ciapp/DataManage/DeviceDataManage.c @@ -4997,15 +4997,15 @@ void SetPhySecSpksFLockBySpksId(UINT16 spksId,UINT8 spksStatus) */ UINT8 GetOtherCiDevStatus(UINT16 const devType,UINT16 const devId,UINT16 const chkDevStatus) { - UINT8 devState = 0u; - UINT8 tmpDevState = 0u; - UINT8 tmpPsdVobcCmd = 0u; - UINT8 tmpColor = 0u; - UINT8 ttmpDevState = 0u; - UINT8 psdMutualLockState = 0u; - UINT16 tempdevId = 0u; /*临时设备ID*/ - UINT8 tempdevState = 0u; /*临时设备状态*/ - + UINT8 devState = 0U; + UINT8 tmpDevState = 0U; + UINT8 tmpPsdVobcCmd = 0U; + UINT8 tmpColor = 0U; + UINT8 ttmpDevState = 0U; + UINT8 psdMutualLockState = 0U; + UINT16 tempdevId = 0U; /*临时设备ID*/ + UINT8 tempdevState = 0U; /*临时设备状态*/ + UINT8 chPsdExceptState = 0U; switch(devType) { case CI_DEVICE_TYPE_SWITCH: /*道岔*/ @@ -5020,12 +5020,12 @@ UINT8 GetOtherCiDevStatus(UINT16 const devType,UINT16 const devId,UINT16 const c } else { - devState = 0u; + devState = 0U; } break; case CI_DEVICE_TYPE_SIGNAL: /*信号机*/ tmpColor = GetSignalCurColor(devId); - if (tmpColor > 0u) + if (0U < tmpColor) { tmpDevState = GetSignalOpenCloseState(tmpColor); if (SIGNAL_OPEN == tmpDevState) @@ -5039,7 +5039,7 @@ UINT8 GetOtherCiDevStatus(UINT16 const devType,UINT16 const devId,UINT16 const c } else { - devState = 0u; + devState = 0U; } break; case CI_DEVICE_TYPE_ROUTE: /*进路*/ @@ -5073,41 +5073,51 @@ UINT8 GetOtherCiDevStatus(UINT16 const devType,UINT16 const devId,UINT16 const c } else { - devState = 0u; + devState = 0U; } break; case CI_DEVICE_TYPE_PSD: /*站台屏蔽门*/ tmpDevState = GetPsdState(devId); tmpPsdVobcCmd = GetPsdVobcCmd(devId); psdMutualLockState = GetPsdMutualLockRemoveState(devId); - if ((PSD_MUTUALLOCK_REMOVE_YES == psdMutualLockState) || (PSD_ATS_MUTUALLOCK_REMOVE_YES == psdMutualLockState) - || (PSD_ATS_AND_JD_MUTUALLOCK_REMOVE_YES == psdMutualLockState)) + chPsdExceptState = GePsdExceptState(devId); + + if (PSD_EXCEPT_NO != chPsdExceptState) { - /* 采集到互锁解除,则直接认为屏蔽门关闭 */ - devState = OTHER_CI_PSD_STATUS_CLOSE; - } - else if (PSD_STATE_OPEN == tmpDevState) - { - if (tmpPsdVobcCmd == VOBCTOCI_COMMAND_TYPE_PSDOPEN) - { - /* 收到VOBCToCI打开屏蔽门命令,则直接认为屏蔽门占用打开 */ - devState = OTHER_CI_PSD_STATUS_OCCUPY_OPEN; - } - else - { - /* 未收到VOBCToCI打开屏蔽门命令,则直接认为屏蔽门打开 */ - devState = OTHER_CI_PSD_STATUS_OPEN; - } - } - else if (PSD_STATE_CLOSE == tmpDevState) - { - /* 未采集到互锁解除,则直接认为屏蔽门关闭 */ - devState = OTHER_CI_PSD_STATUS_CLOSE; + devState = OTHER_CI_PSD_STATUS_OPEN; /* 屏蔽门异常状态,则认为打开 */ } else { - devState = 0u; + if ((PSD_MUTUALLOCK_REMOVE_YES == psdMutualLockState) || (PSD_ATS_MUTUALLOCK_REMOVE_YES == psdMutualLockState) + || (PSD_ATS_AND_JD_MUTUALLOCK_REMOVE_YES == psdMutualLockState)) + { + /* 采集到互锁解除,则直接认为屏蔽门关闭 */ + devState = OTHER_CI_PSD_STATUS_CLOSE; + } + else if (PSD_STATE_OPEN == tmpDevState) + { + if (VOBCTOCI_COMMAND_TYPE_PSDOPEN == tmpPsdVobcCmd) + { + /* 收到VOBCToCI打开屏蔽门命令,则直接认为屏蔽门占用打开 */ + devState = OTHER_CI_PSD_STATUS_OCCUPY_OPEN; + } + else + { + /* 未收到VOBCToCI打开屏蔽门命令,则直接认为屏蔽门打开 */ + devState = OTHER_CI_PSD_STATUS_OPEN; + } + } + else if (PSD_STATE_CLOSE == tmpDevState) + { + /* 未采集到互锁解除,则直接认为屏蔽门关闭 */ + devState = OTHER_CI_PSD_STATUS_CLOSE; + } + else + { + devState = 0U; + } } + break; case CI_DEVICE_TYPE_PSD_EXCEPT_OPEN: /*站台屏蔽门(异常)*/ devState = GePsdExceptState(devId); @@ -5125,7 +5135,7 @@ UINT8 GetOtherCiDevStatus(UINT16 const devType,UINT16 const devId,UINT16 const c } else { - devState = 0u; + devState = 0U; } break; case CI_DEVICE_TYPE_WASHMACHINE: /* 洗车机 */ @@ -5148,7 +5158,7 @@ UINT8 GetOtherCiDevStatus(UINT16 const devType,UINT16 const devId,UINT16 const c } else { - if (ttmpDevState == SPKS_CUT_NO) + if (SPKS_CUT_NO == ttmpDevState) { devState = OTHER_CI_SPKS_YES; } @@ -6200,7 +6210,8 @@ UINT8 CheckLogJumpLockApply(UINT16 logSectionId) UINT8 logSecLockState = 0U; UINT8 logSecLockRouteNum = 0U; UINT8 chFailStep = 0U; - + UINT8 cYLockAlarmFlag = FLAG_UNSET; /*引导总锁报警标志*/ + bufIndex = GetlogSectionBufIndex(logSectionId); /*获取区段数组下标*/ /**区段下标合法*/ if (LOGIC_SECTION_SUM_MAX > bufIndex) @@ -6470,13 +6481,21 @@ UINT8 CheckLogJumpLockApply(UINT16 logSectionId) {/*防护道岔封锁状态检查*/ devId = 0u; /*设备ID*/ devState = 0u; /*设备状态*/ - reVal = LogicSecRltvPrtctSwFlockCheck(logSectionId, &devId, &devState);/*封锁检查*/ + reVal = LogicSecRltvPrtctSwFLockCheck(logSectionId, &devId, &devState, &cYLockAlarmFlag);/*封锁检查*/ + if (CI_SUCCESS != reVal) + { + chFailStep = 13U; + } } if (CI_SUCCESS == reVal) {/*防护道岔位置检查*/ devId = 0u; /*设备ID*/ devState = 0u; /*设备状态*/ reVal = LogicSecRltvPrtctSwPosCheck(logSectionId, &devId, &devState);/*位置检查*/ + if (CI_SUCCESS != reVal) + { + chFailStep = 14U; + } } } @@ -6863,7 +6882,7 @@ UINT8 JumpLockDriveSwitch(const UINT16 axisSecId) /* -功能描述: 驱动计轴区段内道岔处理 +功能描述: 驱动计轴区段内道岔,计轴区段关联防护道岔处理 输入参数: const UINT16 axisSecId 计轴区段ID 输出参数: const UINT8 DrivFlag 道岔驱动标志 返回值: 无 @@ -6875,7 +6894,6 @@ void AxisSecDrvInnerSwitch(const UINT16 axisSecId, const UINT8 DrivFlag) UINT8 switchExpPos = 0u; /*道岔期望位置*/ AxisSwitchStruct* pAxisSecSwitchStru = NULL; /*道岔数据*/ UINT8 ii = 0u; /*循环变量*/ - UINT8 funRtn = CI_ERROR; AxisSwitchStruct* pProtectSwitchStru = NULL; /*防护道岔数据结构指针*/ UINT8 protectSwitchSum = 0u; @@ -6895,7 +6913,7 @@ void AxisSecDrvInnerSwitch(const UINT16 axisSecId, const UINT8 DrivFlag) { switchId = pAxisSecSwitchStru[ii].SwitchId; switchExpPos = pAxisSecSwitchStru[ii].SwitchPosition; - funRtn = SwitchDriveProcess(switchId, switchExpPos); /*设置计轴区段内道岔的驱动状态为驱动中*/ + (void)SwitchDriveProcess(switchId, switchExpPos); /*设置计轴区段内道岔的驱动状态为驱动中*/ } for (ii = 0u; ii < protectSwitchSum; ii++) @@ -11657,21 +11675,19 @@ UINT8 GetLocalVirCiType(UINT8 chVirCiId) /* * 功能描述:判断本联锁临时限速状态 * 参数说明:无 -* 返 回 值:临时限速有效返回失败,清除或与ZC通信正常返回成功 +* 返 回 值:临时限速有效返回失败,清除或与限速确认返回成功 * Created :LYJ */ UINT8 CheckLocalCiLSXSStata(void) { - UINT8 cLocalCiId = 0U; UINT8 chRet = 0U; UINT8 chVirCINum = 0U; UINT8 i = 0U; UINT8 chXiansuState = 0U; UINT8 chVirtualCIid = 0U; UINT8 chTsrSureFlag = 0U; - cLocalCiId = GetSystemParaLocalCiId(); - chVirCINum = GetVirtualCINum(); + chTsrSureFlag = GetTsrSureFlag(); /*获取临时限速确认标志*/ if (CI_TSR_SURE_YES == chTsrSureFlag) { @@ -11679,7 +11695,9 @@ UINT8 CheckLocalCiLSXSStata(void) } else { - /*临时限速未确认,判断是否做了限速确认*/ + /*临时限速未确认,判断是否做了限速清除*/ + + chVirCINum = GetVirtualCINum(); for (i = 0U; i < chVirCINum; i++) { chVirtualCIid = GetVirtualCIid(i); @@ -11697,4 +11715,85 @@ UINT8 CheckLocalCiLSXSStata(void) } return chRet; +} + +/* +功能描述: + 清除逻辑区段关联道岔单操位置 +输入参数: + const UINT16 逻辑区段ID +输出参数: + 无. +返回值: + 无 +add by mpt 20260403 +*/ +void ClearLogSeceSwitchDanCaoPos(const UINT16 logicSecId) +{ + UINT8 switchSum = 0u; /*道岔数目*/ + UINT16 switchId = 0u; /*道岔ID*/ + UINT8 ii = 0u; /*循环变量*/ + UINT8 checkSum = 0u; + LogsecSwitchStruct* dataIdBuf = NULL; + + UINT8 chLogicSecSwitchSum = 0U;/*逻辑区段道岔数目*/ + LogsecSwitchStruct* pLogicSecSwitchIdData = NULL;/*逻辑区段道岔ID数据*/ + + chLogicSecSwitchSum = GetLogicSecSwitchSum(logicSecId);/*逻辑区段道岔数目*/ + pLogicSecSwitchIdData = GetLogicSecSwitchIdStru(logicSecId);/*逻辑区段道岔ID数据*/ + + checkSum = GetLgcRelateProSwSum(logicSecId);/*获取指定ID逻辑区段关联防护道岔数目*/ + dataIdBuf = GetLgcRelateProSwStru(logicSecId); + + + + if (NULL != pLogicSecSwitchIdData) + { + for (ii = 0u; ii < chLogicSecSwitchSum; ii++) + { + switchId = pLogicSecSwitchIdData[ii].SwitchId; + /*设置该道岔期望驱动位置为无效*/ + (void)SetSwitchDanCaoPosition(switchId, SWITCH_POSITION_INVALID); + } + } + + if (NULL != dataIdBuf) + { + for (ii = 0u; ii < checkSum; ii++) + { + switchId = dataIdBuf[ii].SwitchId; + /*设置该道岔期望驱动位置为无效*/ + (void) SetSwitchDanCaoPosition(switchId, SWITCH_POSITION_INVALID); + } + } +} + +/* +功能描述: + 清除计轴区段关联道岔单操位置 +输入参数: + const UINT16 计轴区段ID +输出参数: + 无. +返回值: + 无 +add by mpt 20260403 +*/ +void ClearAxisSeceSwitchDanCaoPos(const UINT16 axisSecId) +{ + UINT16* pLogSectionIdBuf = NULL; + UINT8 chLogSectionSum = 0U; + UINT8 ii = 0U; + + pLogSectionIdBuf = GetAxisSecLogSectionIdBuf(axisSecId); + chLogSectionSum = GetAxisSecLogSectionSum(axisSecId); + + if (NULL != pLogSectionIdBuf) + { + for (ii = 0U; ii < chLogSectionSum; ii++) + { + /*清除逻辑区段道岔道岔标志*/ + ClearLogSeceSwitchDanCaoPos(pLogSectionIdBuf[ii]); + } + } } \ No newline at end of file diff --git a/TSCP/src/APP/ciapp/DataManage/DeviceDataManage.h b/TSCP/src/APP/ciapp/DataManage/DeviceDataManage.h index 8bfe439..f2179fa 100644 --- a/TSCP/src/APP/ciapp/DataManage/DeviceDataManage.h +++ b/TSCP/src/APP/ciapp/DataManage/DeviceDataManage.h @@ -76,7 +76,7 @@ typedef struct S_AreaSnowInfoStruct #define ALL_AREA_SNOW_SUM_MAX ((UINT8)254) /*TMC发送的全线区间雨雪站台数量*/ #define ALL_CBTC_CROSS_SUM_MAX ((UINT8)253) /*CBTC跨压最大数量*/ #define ALL_TACS_CROSS_SUM_MAX ((UINT8)253) /*TACS跨压最大数量*/ -#define CROSS_SIGNAL_ID_MAX ((UINT8)1499) /*跨压信号机ID最大值*/ +#define CROSS_SIGNAL_ID_MAX ((UINT16)1499) /*跨压信号机ID最大值*/ #define CBTC_CROSS_ID_MAX ((UINT8)253) /*CBTC跨压最大列车ID*/ #define TACS_CROSS_ID_MAX ((UINT8)253) /*TACS跨压最大列车ID*/ @@ -226,8 +226,6 @@ extern UINT8 comm_Train_Test_YSKJ_SCX_State; /* extern UINT8 comm_Train_Test_SQJ_CLD_State; /*试车线与车辆段采用通信接口时车辆段SQJ状态*/ extern UINT8 comm_Train_Test_TYSJ_CLD_State; /*试车线与车辆段采用通信接口时车辆段TYSJ状态*/ -extern UINT8 ZCToCIAutoRtnIndict_Flash_Sta; /*ZC给CI的无人折返灯闪灯状态*/ -extern UINT8 ZCToCIAutoRtnIndict_Steady_Sta; /*ZC给CI的无人折返灯稳灯状态*/ extern UINT8 AutoTriggerFlag; /*自动触发标志初始化为未设置*/ extern UINT8 CiCiRelayInterfaceConfirmFlag;/*继电接口确认标志*/ @@ -1988,4 +1986,28 @@ UINT8 GetLocalVirCiType(UINT8 chVirCiId); */ UINT8 CheckLocalCiLSXSStata(void); +/* +功能描述: + 清除逻辑区段关联道岔单操位置 +输入参数: + const UINT16 逻辑区段ID +输出参数: + 无. +返回值: + 无 +add by mpt 20260403 +*/ +void ClearLogSeceSwitchDanCaoPos(const UINT16 logicSecId); +/* +功能描述: + 清除计轴区段关联道岔单操位置 +输入参数: + const UINT16 计轴区段ID +输出参数: + 无. +返回值: + 无 +add by mpt 20260403 +*/ +void ClearAxisSeceSwitchDanCaoPos(const UINT16 axisSecId); #endif diff --git a/TSCP/src/APP/ciapp/ERROR/ErrorDefine.h b/TSCP/src/APP/ciapp/ERROR/ErrorDefine.h index a77aafe..894ef75 100644 --- a/TSCP/src/APP/ciapp/ERROR/ErrorDefine.h +++ b/TSCP/src/APP/ciapp/ERROR/ErrorDefine.h @@ -111,6 +111,10 @@ #define EFUNC_OVERLAP_VALIDMASK_CHECK ((UINT8)0x4A) /*函数:OverlapValidMaskCheck 计算保护区段有效码位检查*/ #define EFUNC_ROUTE_LOCK_DRIVE_SWITCH ((UINT8)0xD2) /*RouteLockDriveSwitch 锁闭道岔*/ #define EFUNC_ROUTE_COUPLINK_SET ((UINT8)0xD7) /*SetCouplinkRouteLogicManage 办理联挂进路逻辑管理*/ +#define EFUNC_FOLLOWUP_SWITCH_DANSUO_CANCLE ((UINT8)0xD8) /*FollowUpSwitchUnFlockCheck 一二次道岔单解命令*/ +#define EFUNC_FOLLOWUP_SWITCH_UNFLOCK ((UINT8)0xD9) /*FollowUpSwitchUnFlockCheck 一二次道岔解封命令*/ +#define EFUNC_FOLLOWUP_SEC_UNFLOCK ((UINT8)0xDA) /*FollowUpSecUnFlockCheck 一二次区段解封命令*/ +#define EFUNC_FOLLOWUP_SIGNAL_UNFLOCK ((UINT8)0xDB) /*FollowUpSwitchUnFlockCheck 一二次信号解封命令*/ /*车辆段联锁逻辑检查*/ #define EFUNC_SET_LEAD_ROUTE_CHECK ((UINT8)0x4B) /*办理引导进路检查*/ @@ -219,7 +223,8 @@ #define EFUNC_PARSE_LOCAL_RC2CI_DATA ((UINT8)0xD5U) /*函数:ParseRcToLocalCiDataFrame*/ #define EFUNC_PARSE_LOCAL_CI2CI_DATA ((UINT8)0xD6U) /*函数:ParseCiToCiDataFrame*/ #define EFUNC_PARSE_LOCAL_OC2CI_DATA ((UINT8)0xD7U) /*函数:ParseOcToCiDataFrame*/ - +#define EFUNC_CONNECT_ROUTE_RELEASE ((UINT8)0xD8U) /*函数:ConnectRouteReleaseManage*/ +#define EFUNC_PARSE_GATEWAY2CI_DATA ((UINT8)0xD9U) /*函数:ParseGateWayToCiDataProc*/ /*************************************************分界线******************************************************************************/ /*************************************************分界线******************************************************************************/ @@ -242,6 +247,7 @@ #define ETYPE_GROUP_AUTO_ROUTE_STATE ((UINT8)0x16) /*组合自动进路*/ #define ETYPE_ROUTE_APPLY_SWITCH_MOVE ((UINT8)0xA4) /*进路道岔单操中*/ #define ETYPE_COUPLINK_ROUTE_IDLE ((UINT8)0xA5) /*联挂进路内无被联挂车*/ +#define ETYPE_CONNECT_ROUTE_RELEASE ((UINT8)0xA6) /*联络线接车进路解锁条件不满足*/ #define ETYPE_COMM_WITH_VOBC ((UINT8)0x11) /*与VOBC通信*/ @@ -254,6 +260,7 @@ #define ETYPE_COMM_WITH_TMC ((UINT8)0x17) /*与TMC通信*/ #define ETYPE_COMM_WITH_RC ((UINT8)0x18U) /*与RC通信*/ #define ETYPE_COMM_WITH_OC ((UINT8)0x19U) /*与OC通信*/ +#define ETYPE_COMM_WITH_GATEWAY ((UINT8)0x1AU) /*与网关通信*/ /* 信号机故障类型编码 (UINT8)0x21-(UINT8)0x3f */ /* 设备类型 CI_DEVICE_TYPE_SIGNAL */ diff --git a/TSCP/src/APP/ciapp/IO/DeviceRelayDataProcess.c b/TSCP/src/APP/ciapp/IO/DeviceRelayDataProcess.c index 469a7cf..6fa4bff 100644 --- a/TSCP/src/APP/ciapp/IO/DeviceRelayDataProcess.c +++ b/TSCP/src/APP/ciapp/IO/DeviceRelayDataProcess.c @@ -22,6 +22,7 @@ #include "AxisAssertManage.h" #include "AxisAssertDataPrepare.h" #include "dquCIInit.h" +#include "ReverseCutConfigDataManage.h" /*信号机继电器延时驱动时间(周期)*/ #define SIG_RELAY_DRV_DELAY_TIME ((UINT32)3) @@ -39,6 +40,17 @@ static void IsOccPhyHasOccAc(void); * 返回值 : 无 */ static void DriveSwitchRelayState(const UINT16 switchId, const UINT8 driveSwitchPos); + +/*道岔冗余采集相关函数声明*/ +static UINT8 SwitchRedunFusionHunXianProc(UINT8 cMainOcPos, const UINT8 *pRedunPos, INOUT UINT8 *pHunXianStt); +static UINT8 CalcRedunSwitchFinalFusionPos(UINT8 cMainOcPos, const UINT8 *pRedunPosForFusion, UINT8 cConflictTag); +static UINT8 GetSwitchRedunFusionPos(UINT16 switchId, UINT8 cMainOcPos, UINT8 *pRedunPos, UINT8 *pHunXianStt); +static UINT8 GetMainOcSwitchColPos(UINT16 switchId); +static UINT8 GetRedunSwitchColPos(UINT16 switchId, UINT8 ocIndex, UINT8 *pHunXianStt, UINT8 *pCombineStt); +static void SwitchRedunFaultProc(UINT16 switchId, UINT8 ocIndex, UINT8 cCombineState); +static void SwitchRedunHunXianProc(UINT16 switchId, UINT8 ocIndex, UINT8 cCurrHunXianState, UINT8 cCombineState); +static UINT8 SwitchRedunCombineProc(UINT8 cDBJ1State, UINT8 cDBJ2State, UINT8 cFBJ1State, UINT8 cFBJ2State); + /* zt 删除单轨相关代码 2022-02-15 */ /******************************信号机相关继电器处理****************************/ @@ -79,6 +91,8 @@ void OcSwitchDeviceOutput(void) UINT8 mainOcId = 0u;/*主控OCId*/ UINT8 chLocalCiOCSswitch = 0U; UINT8 chSwitchLastValidDrvPos = 0U; + UINT16 wReverseBoardId = 0U; + UINT8 chReverseState = 0U; chLocalCiOCSswitch = GetLocalCiOCSswitch(); @@ -142,6 +156,26 @@ void OcSwitchDeviceOutput(void) }/*for*/ + /*更新倒切状态*/ + for (ii = 0u; ii < switchCurSum; ii++) + { + switchId = GetSwitchId(ii); + wReverseBoardId = GetSwitchRelateReverseBoardId(switchId); + if (0U != wReverseBoardId) + { + /*配置倒切*/ + chReverseState = GetReverseBoardState(wReverseBoardId); + if (REVERSE_STATE_NEW_SYSTEM != chReverseState) + { + (void)SetSwitchExpDrvPosition(switchId, SWITCH_DRIVE_POS_INVALID);/*非新建系统侧 ,设置期望驱动位置为无效,接口处转为0x55aa道岔位置保持*/ + } + } + else + { + ;/*未配置倒切,正常输出驱动,认为在新建系统侧*/ + } + } + /*道岔驱动状态更新*/ for (ii = 0u; ii < switchCurSum; ii++) { @@ -368,7 +402,8 @@ void OcSwitchDeviceOutput(void) if (0u < mainOcId) {/*有主控OC*/ (void)SetSwitchLastValidDrvPos(switchId, driveSwitchPos); - (void)SetSwitchLastValidPosDrivCycNum(switchId, curNum); + (void)SetSwitchLastValidPosDrivCycNum(switchId, curNum);/*能向OC发驱动时设置输出起始周期,不会被清0*/ + SetSwitchOutputDrvCmdCycNum(switchId, curNum);/*能向OC发驱动时设置输出起始周期,在驱动位置等于采集位置时清除*/ } else { @@ -379,6 +414,7 @@ void OcSwitchDeviceOutput(void) { (void)SetSwitchLastValidDrvPos(switchId, driveSwitchPos); (void)SetSwitchLastValidPosDrivCycNum(switchId, curNum); + SetSwitchOutputDrvCmdCycNum(switchId, curNum);/*能向OC发驱动时设置输出起始周期,在驱动位置等于采集位置时清除*/ } } @@ -502,7 +538,7 @@ UINT8 GetOcSwitchState(UINT16 switchId,UINT8 mainControlOCId) rtnSwitchState = OC_SWITCH_POSITION_SIKAI; /*设置道岔故障标志*/ - SetSwitchFaultState(m_Switches[indexFind].DeviceId, SWITCH_FAULT_STATE_YES); + (void)SetSwitchFaultState(m_Switches[indexFind].DeviceId, SWITCH_FAULT_STATE_YES); /*获取取消封连状态*/ switchBlockLinkState = GetCancelOrRcvrBlockLinkSta(); @@ -535,7 +571,7 @@ UINT8 GetOcSwitchState(UINT16 switchId,UINT8 mainControlOCId) else { /*设置道岔故障标志*/ - SetSwitchFaultState(m_Switches[indexFind].DeviceId, SWITCH_FAULT_STATE_NO); + (void)SetSwitchFaultState(m_Switches[indexFind].DeviceId, SWITCH_FAULT_STATE_NO); } } switch (rtnSwitchState) @@ -814,7 +850,7 @@ UINT8 GetOcSignalColor(UINT16 signalId) /*清亮灯OC全灭容忍计时*/ SetOcSignalStartCycNum(m_Signals[indexFind].DeviceId, 0); /*信号机颜色为灭灯才这么处理*/ - if (SIGNAL_SHOWCOLOUR_INVALID == sigPreDriveColor) + if (SIGNAL_DRIVECOLOUR_NULL == sigPreDriveColor) { rtnSigColor = SIGNAL_SHOWCOLOUR_REDCLOSE; } @@ -865,7 +901,7 @@ UINT8 GetOcSignalColor(UINT16 signalId) if (SIGNAL_LIGHT_EXTICT_STATE_NO == sigColorLevel) { /*信号机颜色为灭灯才这么处理*/ - if (SIGNAL_SHOWCOLOUR_INVALID == sigPreDriveColor) + if (SIGNAL_DRIVECOLOUR_NULL == sigPreDriveColor) { rtnSigColor = SIGNAL_SHOWCOLOUR_RED; } @@ -1117,15 +1153,9 @@ UINT8 SetSignalColorOcAllOff(const UINT16 signalId) case SIGNAL_DRIVECOLOUR_GREENCLOSE: case SIGNAL_DRIVECOLOUR_YELLOWCLOSE: /*绿黄全灭设置 绿黄灯开关打开或杭德时设置蓝断 获取之前驱动颜色*/ - if ((FUNC_SWITCH_ON == funSwitchGreenYellow) || (FUNC_SWITCH_ON == funSwitchALLCloseUseBlue)) - { - rtnSigColor = preDriveColor; - SignalDataStru[bufIndex].BlueDsBreakFlag = SIGNAL_DS_BREAK_YES; - } - else - { - rtnSigColor = SIGNAL_SHOWCOLOUR_REDBREAK; - } + /*进入此时已判断 非(之前驱动灭灯且开关均关闭)*/ + rtnSigColor = preDriveColor; + SignalDataStru[bufIndex].BlueDsBreakFlag = SIGNAL_DS_BREAK_YES; break; case SIGNAL_DRIVECOLOUR_GREENYELLOWCLOSE: /*绿黄全灭设置 绿黄灯开关打开时设置蓝断*/ @@ -5275,7 +5305,7 @@ void SwitchRelayToDeviceStateProc(void) switchId = GetSwitchId(ii); /*获取道岔ID*/ - if ((0u != switchId) && (switchId < SWITCH_SUM_MAX)) + if ((0u != switchId) && (SWITCH_SUM_MAX > switchId)) { belongCiId = GetSwitchBelongCiId(switchId); /*获取道岔所属联锁ID*/ @@ -5290,15 +5320,6 @@ void SwitchRelayToDeviceStateProc(void) ZFbRelayId = GetSwitchZFbRelayId(switchId); /*获取道岔总反位表示继电器ID*/ DFHRelayId = GetSwitchDFHRelayId(switchId); /*获取道岔DFH继电器ID*/ - if (REVERSE_MODE_SHADOW == chTiocSysMode) - { - /*影子模式下使用影子模式继电器*/ - DbRelayId = GetSwitchShadowDbRelayId(switchId); - FbRelayId = GetSwitchShadowFbRelayId(switchId); - ZDbRelayId = DbRelayId; - ZFbRelayId = FbRelayId; - DFHRelayId = 0u; - } /*更新道岔位置*/ YcRelayState = GetRelayCollState(YcRelayId); /*道岔允操继电器状态*/ DbRelayState = GetRelayCollState(DbRelayId); /*道岔定表继电器状态*/ @@ -7129,7 +7150,6 @@ void PsdRelayToDeviceStateProc(void) { ; } - } } @@ -7299,6 +7319,8 @@ UINT8 PsdDeviceToRelayStateProc(void) UINT16 psdId = 0u; /*屏蔽门ID*/ UINT16 psdKMRelayId = 0u;/*开门继电器ID*/ UINT16 tmpPsdKMRelayId = 0u;/*开门继电器ID*/ + UINT8 ctmpPsdKMRelayState = RELAY_DRIVE_STATE_DOWN;/*开门继电器驱动状态*/ + UINT8 ctmpPsdGMRelayState = RELAY_DRIVE_STATE_DOWN;/*关门继电器驱动状态*/ UINT16 psdGMRelayId = 0u;/*关门继电器ID*/ UINT16 psdEditGroupInfo = 0u;/*屏蔽门编组信息*/ UINT8 vobcInterFlag = 0u;/*vobc接口标识*/ @@ -7313,7 +7335,13 @@ UINT8 PsdDeviceToRelayStateProc(void) UINT8 JXTCStopState = 0u; UINT8 psdVirtualState = 0u; UINT8 relayFlag = CI_ERROR; - + UINT8 chKeepCloseType = FUNC_SWITCH_OFF; + UINT8 cFuncRet = 0u; + UINT16 trainZeroSpeedRelayId = 0U; /*列车非零速继电器ID*/ + UINT8 chTrainZeroSpeedState = 0U; /*非零速状态*/ + UINT32 curCycle = 0U; + UINT16 wReverseBoard = 0U; + UINT8 chReverseState = 0U; vobcInterFlag = GetCiFunctionSwitchConfig(VOBC_INTERFACE_IDENTITY);/*获取VOBC接口标识*/ @@ -7324,229 +7352,302 @@ UINT8 PsdDeviceToRelayStateProc(void) psdVirtualState = GetPsdVirtualAttribute(psdId); if (PSD_VIRTUAL_ATTR_NO == psdVirtualState) {/*非虚拟屏蔽门才驱动相关继电器*/ - psdEditGroupInfo = GetPsdEditGroupInfoFromPsdData(psdId); - /*编组定义统一化处理*/ - if ((LINE_HLHT == vobcInterFlag) || (LINE_FAOHLHT == vobcInterFlag) || (LINE_FAOHLHT_ONESELF == vobcInterFlag) || (LINE_FAOHLHT_ONESELFSECOND == vobcInterFlag)) + wReverseBoard = GetPsdRelateReverseBoardId(psdId); + chReverseState = GetReverseBoardState(wReverseBoard); + if((0U == wReverseBoard)||(REVERSE_STATE_NEW_SYSTEM == chReverseState)) { - /*互联互通和FAO互联互通的编组信息由VOBC发送*/ - } - else if (LINE_FAO == vobcInterFlag) - { - if (PSD_FOUR_EDIT_GROUP_FAO_YF == psdEditGroupInfo)/*燕房线4编组*/ + psdEditGroupInfo = GetPsdEditGroupInfoFromPsdData(psdId); + /*编组定义统一化处理*/ + if ((LINE_HLHT == vobcInterFlag) || (LINE_FAOHLHT == vobcInterFlag) || (LINE_FAOHLHT_ONESELF == vobcInterFlag) || (LINE_FAOHLHT_ONESELFSECOND == vobcInterFlag)) { - psdEditGroupInfo = PSD_FOUR_EDIT_GROUP; + /*互联互通和FAO互联互通的编组信息由VOBC发送*/ } - else if (PSD_SIX_EDIT_GROUP_FAO_YF == psdEditGroupInfo)/*燕房线6编组*/ + else if (LINE_FAO == vobcInterFlag) { - psdEditGroupInfo = PSD_SIX_EDIT_GROUP; + if (PSD_FOUR_EDIT_GROUP_FAO_YF == psdEditGroupInfo)/*燕房线4编组*/ + { + psdEditGroupInfo = PSD_FOUR_EDIT_GROUP; + } + else if (PSD_SIX_EDIT_GROUP_FAO_YF == psdEditGroupInfo)/*燕房线6编组*/ + { + psdEditGroupInfo = PSD_SIX_EDIT_GROUP; + } + else + { + /*编组信息错误*/ + } } else { - /*编组信息错误*/ + /*线路信息错误,do nothing*/ } - } - else - { - /*线路信息错误,do nothing*/ - } - if (PSD_FOUR_EDIT_GROUP == psdEditGroupInfo) - {/*四编组屏蔽门*/ - psdKMRelayId = GetFourGroupPsdOpenDrvRelayId(psdId); - } - else if (PSD_SIX_EDIT_GROUP == psdEditGroupInfo) - {/*六编组屏蔽门*/ - psdKMRelayId = GetSixGroupPsdOpenDrvRelayId(psdId); - } - else if (PSD_EIGHT_EDIT_GROUP == psdEditGroupInfo) - {/*八编组屏蔽门*/ - psdKMRelayId = GetEightGroupPsdOpenDrvRelayId(psdId); - } - else if (PSD_THREE_EDIT_GROUP == psdEditGroupInfo) - { - /*三编组屏蔽门*/ - psdKMRelayId = GetThreeGroupPsdOpenDrvRelayId(psdId); - } - else - {/*编组无效*/ - psdKMRelayId = 0u; - } - psdGMRelayId = GetPsdCloseDriveRelayId(psdId); - psdDriveState = GetPsdDriveState(psdId); - - if (PSD_DRIVE_STATE_CLOSE == psdDriveState)/*驱动为关门*/ - { - relayFlag = SetRelayDriveState(psdGMRelayId, RELAY_DRIVE_STATE_UP); - if (CI_ERROR == relayFlag) - {/*关门继电器*/ - reVal = CI_ERROR; + if (PSD_FOUR_EDIT_GROUP == psdEditGroupInfo) + {/*四编组屏蔽门*/ + psdKMRelayId = GetFourGroupPsdOpenDrvRelayId(psdId); + } + else if (PSD_SIX_EDIT_GROUP == psdEditGroupInfo) + {/*六编组屏蔽门*/ + psdKMRelayId = GetSixGroupPsdOpenDrvRelayId(psdId); + } + else if (PSD_EIGHT_EDIT_GROUP == psdEditGroupInfo) + {/*八编组屏蔽门*/ + psdKMRelayId = GetEightGroupPsdOpenDrvRelayId(psdId); + } + else if (PSD_THREE_EDIT_GROUP == psdEditGroupInfo) + { + /*三编组屏蔽门*/ + psdKMRelayId = GetThreeGroupPsdOpenDrvRelayId(psdId); } else - { - tmpPsdKMRelayId = GetFourGroupPsdOpenDrvRelayId(psdId); - if (tmpPsdKMRelayId > 0u) - { - relayFlag = SetRelayDriveState(tmpPsdKMRelayId, RELAY_DRIVE_STATE_DOWN); - /*所有开门继电器驱落下*/ - if (CI_ERROR == relayFlag) - {/*开门继电器*/ - reVal = CI_ERROR; - } - - } - tmpPsdKMRelayId = GetSixGroupPsdOpenDrvRelayId(psdId); - if (tmpPsdKMRelayId > 0u) - { - relayFlag = SetRelayDriveState(tmpPsdKMRelayId, RELAY_DRIVE_STATE_DOWN); - /*所有开门继电器驱落下*/ - if (CI_ERROR == relayFlag) - {/*开门继电器*/ - reVal = CI_ERROR; - } - } - - - tmpPsdKMRelayId = GetEightGroupPsdOpenDrvRelayId(psdId); - if (tmpPsdKMRelayId > 0u) - { - /*所有开门继电器驱落下*/ - relayFlag = SetRelayDriveState(tmpPsdKMRelayId, RELAY_DRIVE_STATE_DOWN); - if (CI_ERROR == relayFlag) - {/*开门继电器*/ - reVal = CI_ERROR; - } - } - tmpPsdKMRelayId = GetThreeGroupPsdOpenDrvRelayId(psdId); - if (tmpPsdKMRelayId > 0u) - { - /*所有开门继电器驱落下*/ - relayFlag = SetRelayDriveState(tmpPsdKMRelayId, RELAY_DRIVE_STATE_DOWN); - if (CI_ERROR == relayFlag) - {/*开门继电器*/ - reVal = CI_ERROR; - } - } - + {/*编组无效*/ + psdKMRelayId = 0u; } - } - else if (PSD_DRIVE_STATE_OPEN == psdDriveState)/*驱动为开门*/ - { - if (0u != psdKMRelayId) - {/*获取继电器有效*/ - /*修改前:互锁解除时不响应VOBC的开关PSD命令,对外驱动无效*/ - /*修改后:对外输出时不再判断是否互锁解除状态(需求变化)*/ - relayFlag = SetRelayDriveState(psdGMRelayId, RELAY_DRIVE_STATE_DOWN); + psdGMRelayId = GetPsdCloseDriveRelayId(psdId); + psdDriveState = GetPsdDriveState(psdId); + if (PSD_DRIVE_STATE_CLOSE == psdDriveState)/*驱动为关门*/ + { + relayFlag = SetRelayDriveState(psdGMRelayId, RELAY_DRIVE_STATE_UP); if (CI_ERROR == relayFlag) {/*关门继电器*/ reVal = CI_ERROR; } else { - relayFlag = SetRelayDriveState(psdKMRelayId, RELAY_DRIVE_STATE_UP); - if (CI_ERROR == relayFlag) - {/*开门继电器*/ - reVal = CI_ERROR; + tmpPsdKMRelayId = GetFourGroupPsdOpenDrvRelayId(psdId); + if (tmpPsdKMRelayId > 0u) + { + relayFlag = SetRelayDriveState(tmpPsdKMRelayId, RELAY_DRIVE_STATE_DOWN); + /*所有开门继电器驱落下*/ + if (CI_ERROR == relayFlag) + {/*开门继电器*/ + reVal = CI_ERROR; + } + } + tmpPsdKMRelayId = GetSixGroupPsdOpenDrvRelayId(psdId); + if (tmpPsdKMRelayId > 0u) + { + relayFlag = SetRelayDriveState(tmpPsdKMRelayId, RELAY_DRIVE_STATE_DOWN); + /*所有开门继电器驱落下*/ + if (CI_ERROR == relayFlag) + {/*开门继电器*/ + reVal = CI_ERROR; + } + } + + + tmpPsdKMRelayId = GetEightGroupPsdOpenDrvRelayId(psdId); + if (tmpPsdKMRelayId > 0u) + { + /*所有开门继电器驱落下*/ + relayFlag = SetRelayDriveState(tmpPsdKMRelayId, RELAY_DRIVE_STATE_DOWN); + if (CI_ERROR == relayFlag) + {/*开门继电器*/ + reVal = CI_ERROR; + } + } + tmpPsdKMRelayId = GetThreeGroupPsdOpenDrvRelayId(psdId); + if (tmpPsdKMRelayId > 0u) + { + /*所有开门继电器驱落下*/ + relayFlag = SetRelayDriveState(tmpPsdKMRelayId, RELAY_DRIVE_STATE_DOWN); + if (CI_ERROR == relayFlag) + {/*开门继电器*/ + reVal = CI_ERROR; + } + } + } - - } - } - else if (PSD_DRIVE_STATE_INVALID == psdDriveState) - {/*驱动无效*/ - relayFlag = SetRelayDriveState(psdGMRelayId, RELAY_DRIVE_STATE_DOWN); - if (CI_ERROR == relayFlag) - {/*关门继电器*/ - reVal = CI_ERROR; - } - else + else if (PSD_DRIVE_STATE_OPEN == psdDriveState)/*驱动为开门*/ { - tmpPsdKMRelayId = GetFourGroupPsdOpenDrvRelayId(psdId); - if (tmpPsdKMRelayId > 0u) - { - /*所有开门继电器驱落下*/ - relayFlag = SetRelayDriveState(tmpPsdKMRelayId, RELAY_DRIVE_STATE_DOWN); + if (0u != psdKMRelayId) + {/*获取继电器有效*/ + /*修改前:互锁解除时不响应VOBC的开关PSD命令,对外驱动无效*/ + /*修改后:对外输出时不再判断是否互锁解除状态(需求变化)*/ + relayFlag = SetRelayDriveState(psdGMRelayId, RELAY_DRIVE_STATE_DOWN); if (CI_ERROR == relayFlag) - {/*开门继电器*/ + {/*关门继电器*/ reVal = CI_ERROR; } + else + { + relayFlag = SetRelayDriveState(psdKMRelayId, RELAY_DRIVE_STATE_UP); + if (CI_ERROR == relayFlag) + {/*开门继电器*/ + reVal = CI_ERROR; + } + } - } - tmpPsdKMRelayId = GetSixGroupPsdOpenDrvRelayId(psdId); - if (tmpPsdKMRelayId > 0u) - { - /*所有开门继电器驱落下*/ - relayFlag = SetRelayDriveState(tmpPsdKMRelayId, RELAY_DRIVE_STATE_DOWN); - if (CI_ERROR == relayFlag) - {/*开门继电器*/ - reVal = CI_ERROR; - } - } - - tmpPsdKMRelayId = GetEightGroupPsdOpenDrvRelayId(psdId); - if (tmpPsdKMRelayId > 0u) - { - /*所有开门继电器驱落下*/ - relayFlag = SetRelayDriveState(tmpPsdKMRelayId, RELAY_DRIVE_STATE_DOWN); - if (CI_ERROR == relayFlag) - {/*开门继电器*/ - reVal = CI_ERROR; - } - } - tmpPsdKMRelayId = GetThreeGroupPsdOpenDrvRelayId(psdId); - if (tmpPsdKMRelayId > 0u) - { - /*所有开门继电器驱落下*/ - relayFlag = SetRelayDriveState(tmpPsdKMRelayId, RELAY_DRIVE_STATE_DOWN); - if (CI_ERROR == relayFlag) - {/*开门继电器*/ - reVal = CI_ERROR; - } } } - } - else - {/*不应出现的值*/ - reVal = CI_ERROR; - } - - if ((LINE_FAOHLHT == vobcInterFlag)||(LINE_CC == vobcInterFlag) || (LINE_FAOHLHT_ONESELF == vobcInterFlag) || (LINE_FAOHLHT_ONESELFSECOND == vobcInterFlag)) - {/*当前只有互联互通FAO线路有间隙探测功能*/ - /*联锁根据VOBC启动间隙探测命令和停止间隙探测命令来驱动相应继电器*/ - startJXTCRelayId = GetPsdDetStartRelayId(psdId); /*获取启动间隙探测继电器ID*/ - stopJXTCRelayId = GetPsdDetStopRelayId(psdId); /*获取停止间隙探测继电器ID*/ - JXCTInterfaceType = GetCiFunctionSwitchConfig(FUNC_JXTC_INTERFACE_MODE);/*获取接口方式*/ - /*启动间隙探测继电器ID有效*/ - if ((0u != startJXTCRelayId) && (0u != stopJXTCRelayId)) - { - /*采用脉冲*/ - if (FUNC_SWITCH_ON == JXCTInterfaceType) + else if (PSD_DRIVE_STATE_INVALID == psdDriveState) + {/*驱动无效*/ + chKeepCloseType = GetCiFunctionSwitchConfig(FUNC_PSD_KEEP_CLOSE_TYPE); + if (FUNC_SWITCH_ON == chKeepCloseType) { - /*处理启动和停止驱动*/ - ProcessJXTCPulseInterfStartDrv(startJXTCRelayId, stopJXTCRelayId, psdId); - ProcessJXTCPulseInterfStopDrv(startJXTCRelayId, stopJXTCRelayId, psdId); - + /*获取PSD打开关闭状态*/ + cFuncRet = GetPsdState(psdId); + if (PSD_STATE_OPEN == cFuncRet) + { + ctmpPsdGMRelayState = RELAY_DRIVE_STATE_DOWN; + ctmpPsdKMRelayState = RELAY_DRIVE_STATE_UP; + } + else + { + ctmpPsdGMRelayState = RELAY_DRIVE_STATE_UP ; + ctmpPsdKMRelayState = RELAY_DRIVE_STATE_DOWN; + } + + } + relayFlag = SetRelayDriveState(psdGMRelayId, ctmpPsdGMRelayState); + + if (CI_ERROR == relayFlag) + {/*关门继电器*/ + reVal = CI_ERROR; } - /*电平模式*/ else { - /* Vobc给联锁发的启动、停止命令,联锁去驱动对应继电器。*/ - JXTCStartState = GetStartDetectionState(psdId); - JXTCStopState = GetStopDetectionState(psdId); - if (JXTC_START_DETECTION_YES == JXTCStartState) + tmpPsdKMRelayId = GetFourGroupPsdOpenDrvRelayId(psdId); + if (tmpPsdKMRelayId > 0u) { - if (0u == GetStartDetectionCycNum(psdId)) - {/*若未计时,则设置驱动启动探测继电器周期*/ - SetStartDetectionCycNum(psdId, Get2oo2CurCycleNum()); - } - relayFlag = SetRelayDriveState(startJXTCRelayId, RELAY_DRIVE_STATE_UP); + /*所有开门继电器驱落下*/ + relayFlag = SetRelayDriveState(tmpPsdKMRelayId, ctmpPsdKMRelayState); if (CI_ERROR == relayFlag) - {/*启动探测继电器吸起*/ + {/*开门继电器*/ reVal = CI_ERROR; } + + } + tmpPsdKMRelayId = GetSixGroupPsdOpenDrvRelayId(psdId); + if (tmpPsdKMRelayId > 0u) + { + /*所有开门继电器驱落下*/ + relayFlag = SetRelayDriveState(tmpPsdKMRelayId, ctmpPsdKMRelayState); + if (CI_ERROR == relayFlag) + {/*开门继电器*/ + reVal = CI_ERROR; + } + } + + + tmpPsdKMRelayId = GetEightGroupPsdOpenDrvRelayId(psdId); + if (tmpPsdKMRelayId > 0u) + { + /*所有开门继电器驱落下*/ + relayFlag = SetRelayDriveState(tmpPsdKMRelayId, ctmpPsdKMRelayState); + if (CI_ERROR == relayFlag) + {/*开门继电器*/ + reVal = CI_ERROR; + } + } + tmpPsdKMRelayId = GetThreeGroupPsdOpenDrvRelayId(psdId); + if (tmpPsdKMRelayId > 0u) + { + /*所有开门继电器驱落下*/ + relayFlag = SetRelayDriveState(tmpPsdKMRelayId, ctmpPsdKMRelayState); + if (CI_ERROR == relayFlag) + {/*开门继电器*/ + reVal = CI_ERROR; + } + } + } + } + else + {/*不应出现的值*/ + reVal = CI_ERROR; + } + + if ((LINE_FAOHLHT == vobcInterFlag)||(LINE_CC == vobcInterFlag) || (LINE_FAOHLHT_ONESELF == vobcInterFlag) || (LINE_FAOHLHT_ONESELFSECOND == vobcInterFlag)) + {/*当前只有互联互通FAO线路有间隙探测功能*/ + /*联锁根据VOBC启动间隙探测命令和停止间隙探测命令来驱动相应继电器*/ + startJXTCRelayId = GetPsdDetStartRelayId(psdId); /*获取启动间隙探测继电器ID*/ + stopJXTCRelayId = GetPsdDetStopRelayId(psdId); /*获取停止间隙探测继电器ID*/ + JXCTInterfaceType = GetCiFunctionSwitchConfig(FUNC_JXTC_INTERFACE_MODE);/*获取接口方式*/ + /*启动间隙探测继电器ID有效*/ + if ((0u != startJXTCRelayId) && (0u != stopJXTCRelayId)) + { + /*采用脉冲*/ + if (FUNC_SWITCH_ON == JXCTInterfaceType) + { + /*处理启动和停止驱动*/ + ProcessJXTCPulseInterfStartDrv(startJXTCRelayId, stopJXTCRelayId, psdId); + ProcessJXTCPulseInterfStopDrv(startJXTCRelayId, stopJXTCRelayId, psdId); + + } + /*电平模式*/ + else + { + /* Vobc给联锁发的启动、停止命令,联锁去驱动对应继电器。*/ + JXTCStartState = GetStartDetectionState(psdId); + JXTCStopState = GetStopDetectionState(psdId); + if (JXTC_START_DETECTION_YES == JXTCStartState) + { + if (0u == GetStartDetectionCycNum(psdId)) + {/*若未计时,则设置驱动启动探测继电器周期*/ + SetStartDetectionCycNum(psdId, Get2oo2CurCycleNum()); + } + relayFlag = SetRelayDriveState(startJXTCRelayId, RELAY_DRIVE_STATE_UP); + if (CI_ERROR == relayFlag) + {/*启动探测继电器吸起*/ + reVal = CI_ERROR; + } + else + { + relayFlag = SetRelayDriveState(stopJXTCRelayId, RELAY_DRIVE_STATE_DOWN); + if (CI_ERROR == relayFlag) + {/*停止探测继电器落下*/ + reVal = CI_ERROR; + } + } + } else { + SetStartDetectionCycNum(psdId, 0u); /*清除间隙探测开始时间*/ + relayFlag = SetRelayDriveState(startJXTCRelayId, RELAY_DRIVE_STATE_DOWN); + if (CI_ERROR == relayFlag) + {/*启动探测继电器落下*/ + reVal = CI_ERROR; + } + } + + /*停止间隙探测继电器ID有效*/ + if (JXTC_STOP_DETECTION_YES == JXTCStopState) + { /*停止探测状态时,设置停止探测继电器吸起*/ + if (0u == GetStopDetectionCycNum(psdId)) + {/*若未计时,则设置驱动停止探测继电器周期*/ + SetStopDetectionCycNum(psdId, Get2oo2CurCycleNum()); + } + else + { + + } + relayFlag = SetRelayDriveState(stopJXTCRelayId, RELAY_DRIVE_STATE_UP); + if (CI_ERROR == relayFlag) + {/*停止探测继电器吸起*/ + reVal = CI_ERROR; + } + else + { + relayFlag = SetRelayDriveState(startJXTCRelayId, RELAY_DRIVE_STATE_DOWN); + if (CI_ERROR == relayFlag) + {/*启动探测继电器落下*/ + reVal = CI_ERROR; + } + } + } + else + { + if (CI_TIME_OUT == SystemOverTimeCheck(GetStopDetectionCycNum(psdId), GetwJXTCStopDetectTime())) + { + SetStopDetectionCycNum(psdId, 0u); /*清除间隙探测停止时间*/ + } + else + { + /*未到时间不处理*/ + } relayFlag = SetRelayDriveState(stopJXTCRelayId, RELAY_DRIVE_STATE_DOWN); if (CI_ERROR == relayFlag) {/*停止探测继电器落下*/ @@ -7554,93 +7655,121 @@ UINT8 PsdDeviceToRelayStateProc(void) } } } - else - { - SetStartDetectionCycNum(psdId, 0u); /*清除间隙探测开始时间*/ - relayFlag = SetRelayDriveState(startJXTCRelayId, RELAY_DRIVE_STATE_DOWN); + } + + vobcDoorStateRelayId = GetPsdDoorStateRelayId(psdId); /*获取车门关门状态继电器ID*/ + if (0u != vobcDoorStateRelayId) + {/*获取车门关门状态继电器ID有效*/ + doorState = GetVOBCDoorState(psdId); + if (PSD_DOOR_CLOSEDANDLOCKED_VALID == doorState) + {/*车门关门状态为关闭且锁闭*/ + relayFlag = SetRelayDriveState(vobcDoorStateRelayId, RELAY_DRIVE_STATE_UP); if (CI_ERROR == relayFlag) - {/*启动探测继电器落下*/ + {/*启动车门关门继电器*/ reVal = CI_ERROR; } } - - /*停止间隙探测继电器ID有效*/ - if (JXTC_STOP_DETECTION_YES == JXTCStopState) - { /*停止探测状态时,设置停止探测继电器吸起*/ - if (0u == GetStopDetectionCycNum(psdId)) - {/*若未计时,则设置驱动停止探测继电器周期*/ - SetStopDetectionCycNum(psdId, Get2oo2CurCycleNum()); - } - else - { - - } - relayFlag = SetRelayDriveState(stopJXTCRelayId, RELAY_DRIVE_STATE_UP); + else if (PSD_DOOR_CLOSEDANDLOCKED_INVALID == doorState) + {/*车门关门状态为非关闭且锁闭*/ + relayFlag = SetRelayDriveState(vobcDoorStateRelayId, RELAY_DRIVE_STATE_DOWN); if (CI_ERROR == relayFlag) - {/*停止探测继电器吸起*/ + {/*停止车门关门继电器*/ reVal = CI_ERROR; } - else - { - relayFlag = SetRelayDriveState(startJXTCRelayId, RELAY_DRIVE_STATE_DOWN); + } + else + { + /*车门关门状态无效无操作继电器*/ + } + } + /*站台清客,闪灯稳灯处理*/ + StationCearPassenagerProcess(psdId); + /*by cgh 成都四线清客需求--清客确认箱发车按钮指示灯闪灯处理*/ + PsdCleFarePDBFlashProcess(psdId); + /*成都13、27、30三线再开门/再关门按钮表示灯处理*/ + PsdOpenAndCloseBsdProc(psdId); + /*by cgh 屏蔽门视频清客处理*/ + PsdVideoQkDriveStateProc(psdId); + } + else if (LINE_HLHT == vobcInterFlag) + {/*厦门3 间隙探测继电器处理*/ + trainZeroSpeedRelayId = GetPsdDetStartRelayId(psdId); /*获取列车非零零速继电器ID,复用启动探测继电器*/ + stopJXTCRelayId = GetPsdDetStopRelayId(psdId); /*获取停止间隙探测继电器ID*/ + JXCTInterfaceType = GetCiFunctionSwitchConfig(FUNC_JXTC_INTERFACE_MODE);/*获取接口方式*/ + /*启动间隙探测继电器ID有效*/ + if ((0u != trainZeroSpeedRelayId) && (0u != stopJXTCRelayId)) + { + /*采用脉冲*/ + if (FUNC_SWITCH_ON == JXCTInterfaceType) + { + /*厦门3 间隙探测相关继电器电平式*/ + } + /*电平模式*/ + else + { + chTrainZeroSpeedState = GetTrainZeroSpeedState(psdId); + JXTCStopState = GetStopDetectionState(psdId); + if (PSD_TRAIN_ZERO_SPEED_NO == chTrainZeroSpeedState) + {/*列车非零速*/ + relayFlag = SetRelayDriveState(trainZeroSpeedRelayId, RELAY_DRIVE_STATE_UP); /*非零速继电器吸起*/ if (CI_ERROR == relayFlag) - {/*启动探测继电器落下*/ + { reVal = CI_ERROR; } + else + { + /*不处理*/ + } + } + else + {/*列车零速*/ + relayFlag = SetRelayDriveState(trainZeroSpeedRelayId, RELAY_DRIVE_STATE_DOWN); /*非零速继电器落下*/ + if (CI_ERROR == relayFlag) + { + reVal = CI_ERROR; + } + else + { + /*不处理*/ + } + } + + /*停止间隙探测继电器ID有效*/ + if (JXTC_STOP_DETECTION_YES == JXTCStopState) + { /*停止探测状态时,设置停止探测继电器吸起*/ + relayFlag = SetRelayDriveState(stopJXTCRelayId, RELAY_DRIVE_STATE_UP); /*停止探测继电器吸起*/ + if (CI_ERROR == relayFlag) + { + reVal = CI_ERROR; + } + else + { + /*不处理*/ + } + } + else + { + relayFlag = SetRelayDriveState(stopJXTCRelayId, RELAY_DRIVE_STATE_DOWN); /*停止探测继电器落下*/ + if (CI_ERROR == relayFlag) + { + reVal = CI_ERROR; + } + else + { + /*不处理*/ + } } } - else - { - if (CI_TIME_OUT == SystemOverTimeCheck(GetStopDetectionCycNum(psdId), GetwJXTCStopDetectTime())) - { - SetStopDetectionCycNum(psdId, 0u); /*清除间隙探测停止时间*/ - } - else - { - /*未到时间不处理*/ - } - relayFlag = SetRelayDriveState(stopJXTCRelayId, RELAY_DRIVE_STATE_DOWN); - if (CI_ERROR == relayFlag) - {/*停止探测继电器落下*/ - reVal = CI_ERROR; - } - } } } - - vobcDoorStateRelayId = GetPsdDoorStateRelayId(psdId); /*获取车门关门状态继电器ID*/ - if (0u != vobcDoorStateRelayId) - {/*获取车门关门状态继电器ID有效*/ - doorState = GetVOBCDoorState(psdId); - if (PSD_DOOR_CLOSEDANDLOCKED_VALID == doorState) - {/*车门关门状态为关闭且锁闭*/ - relayFlag = SetRelayDriveState(vobcDoorStateRelayId, RELAY_DRIVE_STATE_UP); - if (CI_ERROR == relayFlag) - {/*启动车门关门继电器*/ - reVal = CI_ERROR; - } - } - else if (PSD_DOOR_CLOSEDANDLOCKED_INVALID == doorState) - {/*车门关门状态为非关闭且锁闭*/ - relayFlag = SetRelayDriveState(vobcDoorStateRelayId, RELAY_DRIVE_STATE_DOWN); - if (CI_ERROR == relayFlag) - {/*停止车门关门继电器*/ - reVal = CI_ERROR; - } - } - else - { - /*车门关门状态无效无操作继电器*/ - } + else + { + /*不处理*/ } - /*站台清客,闪灯稳灯处理*/ - StationCearPassenagerProcess(psdId); - /*by cgh 成都四线清客需求--清客确认箱发车按钮指示灯闪灯处理*/ - PsdCleFarePDBFlashProcess(psdId); - /*成都13、27、30三线再开门/再关门按钮表示灯处理*/ - PsdOpenAndCloseBsdProc(psdId); - /*by cgh 屏蔽门视频清客处理*/ - PsdVideoQkDriveStateProc(psdId); + } + else + { + ;/*配置有倒切且非新设系统:输出驱动无效,周期已设置所有继电器驱动无效*/ } } else @@ -7893,10 +8022,9 @@ void ProcessJXTCPulseInterfStopDrv(UINT16 startJXTCRelayId, UINT16 stopJXTCRelay /* * 功能描述: 更新洗车机继电器状态 * 参数说明: void -* 返回值 : 0u: 更新失败 -* 1: 更新成功 +* 返回值 : void */ -UINT8 WashMachineDevToRelayStaProc(void) +void WashMachineDevToRelayStaProc(void) { UINT16 ii = 0u; /*游标*/ UINT16 washMachineSum = 0u; /*洗车机总数*/ @@ -7907,7 +8035,7 @@ UINT8 WashMachineDevToRelayStaProc(void) UINT16 wCoupingStopSteadyRelayId = 0u; /*联挂端停稳继电器*/ UINT16 pauseTrainWashRelayId = 0u; /*暂停洗车继电器*/ UINT16 passRequestRelayId = 0u; /*通过请求继电器*/ - UINT8 retVal = CI_SUCCESS; + UINT8 stpVal = CI_SUCCESS; UINT8 lineIdentity = 0u; /*CI-VOBC接口标识*/ lineIdentity = GetCiFunctionSwitchConfig(VOBC_INTERFACE_IDENTITY);/*获取CI-VOBC接口标识*/ @@ -7920,9 +8048,9 @@ UINT8 WashMachineDevToRelayStaProc(void) washMachineId = GetWashMachineId(ii); if (CI_ERROR == washMachineId) { - retVal = CI_ERROR; + stpVal = CI_ERROR; } - if (CI_SUCCESS == retVal) + if (CI_SUCCESS == stpVal) { WashTrainRequestRelayId = GetWashTrainRequestRelayId(washMachineId); /*获取洗车请求继电器,合肥为洗车同意状态继电器*/ @@ -7933,21 +8061,21 @@ UINT8 WashMachineDevToRelayStaProc(void) { if (CI_ERROR == SetRelayDriveState(WashTrainRequestRelayId, RELAY_STATE_UP)) {/*洗车请求继电器*/ - retVal = CI_ERROR; + stpVal = CI_ERROR; } } else if (WASHMACHINE_DRVSTATE_REQ_FALSE == GetWashTrainRequestDrvState(washMachineId)) { if (CI_ERROR == SetRelayDriveState(WashTrainRequestRelayId, RELAY_STATE_DOWN)) {/*洗车请求继电器*/ - retVal = CI_ERROR; + stpVal = CI_ERROR; } } else { if (CI_ERROR == SetRelayDriveState(WashTrainRequestRelayId, RELAY_STATE_DOWN)) {/*洗车请求继电器*/ - retVal = CI_ERROR; + stpVal = CI_ERROR; } } } @@ -7957,7 +8085,7 @@ UINT8 WashMachineDevToRelayStaProc(void) } } - if (CI_SUCCESS == retVal) + if (CI_SUCCESS == stpVal) { TrainHeadStopSteadyRelayId = GetTrainHeadStopSteadyRelayId(washMachineId); /*获取头部洗位停稳继电器*/ @@ -7967,14 +8095,14 @@ UINT8 WashMachineDevToRelayStaProc(void) { if (CI_ERROR == SetRelayDriveState(TrainHeadStopSteadyRelayId, RELAY_STATE_UP)) {/*头端停稳继电器*/ - retVal = CI_ERROR; + stpVal = CI_ERROR; } } else if (WASHMACHINE_HEAD_STEADY_NO == GetTrainHeadStopSteadyDrvState(washMachineId)) { if (CI_ERROR == SetRelayDriveState(TrainHeadStopSteadyRelayId, RELAY_STATE_DOWN)) {/*头端停稳继电器**/ - retVal = CI_ERROR; + stpVal = CI_ERROR; } } @@ -7982,7 +8110,7 @@ UINT8 WashMachineDevToRelayStaProc(void) { if (CI_ERROR == SetRelayDriveState(TrainHeadStopSteadyRelayId, RELAY_STATE_DOWN)) {/*头端停稳继电器**/ - retVal = CI_ERROR; + stpVal = CI_ERROR; } } @@ -7993,7 +8121,7 @@ UINT8 WashMachineDevToRelayStaProc(void) } } - if (CI_SUCCESS == retVal) + if (CI_SUCCESS == stpVal) { TrainTailStopSteadyRelayId = GetTrainTailStopSteadyRelayId(washMachineId); /*获取尾部洗位停稳继电器*/ @@ -8003,14 +8131,14 @@ UINT8 WashMachineDevToRelayStaProc(void) { if (CI_ERROR == SetRelayDriveState(TrainTailStopSteadyRelayId, RELAY_STATE_UP)) {/*尾端停稳继电器*/ - retVal = CI_ERROR; + stpVal = CI_ERROR; } } else if (WASHMACHINE_TAIL_STEADY_NO == GetTrainTailStopSteadyDrvState(washMachineId)) { if (CI_ERROR == SetRelayDriveState(TrainTailStopSteadyRelayId, RELAY_STATE_DOWN)) {/*尾端停稳继电器*/ - retVal = CI_ERROR; + stpVal = CI_ERROR; } } @@ -8018,7 +8146,7 @@ UINT8 WashMachineDevToRelayStaProc(void) { if (CI_ERROR == SetRelayDriveState(TrainTailStopSteadyRelayId, RELAY_STATE_DOWN)) {/*尾端停稳继电器*/ - retVal = CI_ERROR; + stpVal = CI_ERROR; } } } @@ -8028,7 +8156,7 @@ UINT8 WashMachineDevToRelayStaProc(void) } } - if (CI_SUCCESS == retVal) + if (CI_SUCCESS == stpVal) { wCoupingStopSteadyRelayId = GetCoupingStopSteadyRelayId(washMachineId); /*获取联挂端停稳继电器*/ @@ -8038,14 +8166,14 @@ UINT8 WashMachineDevToRelayStaProc(void) { if (CI_ERROR == SetRelayDriveState(wCoupingStopSteadyRelayId, RELAY_STATE_UP)) {/*联挂端停稳继电器*/ - retVal = CI_ERROR; + stpVal = CI_ERROR; } } else if (WASHMACHINE_TAIL_STEADY_NO == GetCoupingStopSteadyDrvState(washMachineId)) { if (CI_ERROR == SetRelayDriveState(wCoupingStopSteadyRelayId, RELAY_STATE_DOWN)) {/*联挂端停稳继电器*/ - retVal = CI_ERROR; + stpVal = CI_ERROR; } } @@ -8053,7 +8181,7 @@ UINT8 WashMachineDevToRelayStaProc(void) { if (CI_ERROR == SetRelayDriveState(wCoupingStopSteadyRelayId, RELAY_STATE_DOWN)) {/*联挂端停稳继电器*/ - retVal = CI_ERROR; + stpVal = CI_ERROR; } } } @@ -8063,7 +8191,7 @@ UINT8 WashMachineDevToRelayStaProc(void) } } - if (CI_SUCCESS == retVal) + if (CI_SUCCESS == stpVal) { pauseTrainWashRelayId = GetPauseTrainWashRelayId(washMachineId); /*获取暂停洗车请求继电器*/ @@ -8073,21 +8201,21 @@ UINT8 WashMachineDevToRelayStaProc(void) { if (CI_ERROR == SetRelayDriveState(pauseTrainWashRelayId, RELAY_STATE_UP)) {/*暂停洗车请求继电器*/ - retVal = CI_ERROR; + stpVal = CI_ERROR; } } else if (WASHMACHINE_PAUSE_DRVREQ_FALSE == GetPauseTrainWashRequestDrvSta(washMachineId)) { if (CI_ERROR == SetRelayDriveState(pauseTrainWashRelayId, RELAY_STATE_DOWN)) {/*暂停洗车请求继电器*/ - retVal = CI_ERROR; + stpVal = CI_ERROR; } } else { if (CI_ERROR == SetRelayDriveState(pauseTrainWashRelayId, RELAY_STATE_DOWN)) {/*暂停洗车请求继电器*/ - retVal = CI_ERROR; + stpVal = CI_ERROR; } } } @@ -8097,7 +8225,7 @@ UINT8 WashMachineDevToRelayStaProc(void) } } - if (CI_SUCCESS == retVal) + if (CI_SUCCESS == stpVal) { passRequestRelayId = GetPassRequestRelayId(washMachineId); /*获取通过请求继电器*/ @@ -8107,21 +8235,21 @@ UINT8 WashMachineDevToRelayStaProc(void) { if (CI_ERROR == SetRelayDriveState(passRequestRelayId, RELAY_STATE_UP)) {/*通过请求继电器*/ - retVal = CI_ERROR; + stpVal = CI_ERROR; } } else if (PASS_WASHMACHINE_DRVREQ_FALSE == GetPassWashMachineReqDrvSta(washMachineId)) { if (CI_ERROR == SetRelayDriveState(passRequestRelayId, RELAY_STATE_DOWN)) {/*通过请求继电器*/ - retVal = CI_ERROR; + stpVal = CI_ERROR; } } else { if (CI_ERROR == SetRelayDriveState(passRequestRelayId, RELAY_STATE_DOWN)) {/*通过请求继电器*/ - retVal = CI_ERROR; + stpVal = CI_ERROR; } } } @@ -8131,20 +8259,19 @@ UINT8 WashMachineDevToRelayStaProc(void) } } - if (CI_SUCCESS == retVal) + if (CI_SUCCESS == stpVal) { /*洗车模式继电器驱动处理*/ - retVal = WashMachineWorkModeRelayProc(washMachineId); + stpVal = WashMachineWorkModeRelayProc(washMachineId); } - if (CI_SUCCESS == retVal) + if (CI_SUCCESS == stpVal) { /*降级洗车对应继电器驱动处理*/ DownWashDevToRelayStaProc(washMachineId); } } - return retVal; } /* @@ -9259,6 +9386,7 @@ void WashMachineButtonUpdate(const UINT16 washMachineId) UINT8 chRouteState = 0U;/*进路状态*/ UINT32 dwRouteIdleCycNum = 0U; /*进路空闲起始周期号*/ UINT8 chDownWashAllowErrState = WASH_BUTTON_STATE_ERR_YES; /*降级模式洗车线洗车同意粘连状态*/ + UINT8 wRouteInOutSecOccupy = CI_ERROR; /*获取进路始端信号机内外区段是否同时占压过*/ curCycle = Get2oo2CurCycleNum(); if ((washMachineId > 0U) && (washMachineId < WASHMACHINE_SUM_MAX)) @@ -9318,16 +9446,22 @@ void WashMachineButtonUpdate(const UINT16 washMachineId) dwRouteIdleCycNum = GetRouteIdleCycNum(wDownWashRelateRouteId); wDownWashAllowColState = GetDownWashAllowColState(washMachineId); dwDownWashAllowVadCycle = GetDownWashBtVadCycle(washMachineId); + wRouteInOutSecOccupy = RouteInOutSecOccupy(wDownWashRelateRouteId); + if ((CI_START_FLOCK_NO == GetStartFLockFlag()) && CI_SUCCESS == wRouteInOutSecOccupy) + { + RouteDriveIntoResult = CI_SUCCESS; /*有车驶入过*/ + } if ((ROUTE_STATE_IDLE == chRouteState) && (WASH_COL_STATE_ALLOW_YES == wDownWashAllowColState) && - (0U != dwDownWashAllowVadCycle) && (dwDownWashAllowVadCycle < dwRouteIdleCycNum)) + (0U != dwDownWashAllowVadCycle) && (dwDownWashAllowVadCycle < dwRouteIdleCycNum) && (CI_SUCCESS == RouteDriveIntoResult)) { - /*进路是在最近一次请求加同意后解锁的*/ + /*进路是在最近一次请求加同意后解锁的才这个逻辑,就是洗车结束后,为了修复工程缺陷:取消洗车时,车未驶入过进路,需要先取消进路再执行取消洗车操作*/ SetDownWashAllowColState(washMachineId, WASH_COL_STATE_ALLOW_NO); SetDownWashBtVadCycle(washMachineId, 0U); /*进路解锁,洗车请求状态和周期号也清除*/ SetDownWashReqState(washMachineId, WASH_REQ_STATE_ALLOW_NO); SetDownWashReqCycle(washMachineId, 0U); + RouteDriveIntoResult = CI_ERROR; } else { @@ -9363,7 +9497,8 @@ void WashMachineDCCButtonUpdate(const UINT16 washMachineId) UINT8 chRouteState = 0U;/*进路状态*/ UINT32 dwRouteIdleCycNum = 0U; /*进路空闲起始周期号*/ UINT8 chDownDccWashAllowErrState = WASH_BUTTON_STATE_ERR_YES; /*降级模式DCC洗车同意粘连状态*/ - + UINT8 wRouteInOutSecOccupy = CI_ERROR; /*获取进路始端信号机内外区段是否同时占压过*/ + curCycle = Get2oo2CurCycleNum(); if ((washMachineId > 0U) && (washMachineId < WASHMACHINE_SUM_MAX)) { @@ -9423,15 +9558,22 @@ void WashMachineDCCButtonUpdate(const UINT16 washMachineId) dwRouteIdleCycNum = GetRouteIdleCycNum(wDownWashRelateRouteId); wDownDccWashAllowColState = GetDownDccWashAllowColState(washMachineId); dwDownWashDccBtVadCycle = GetDownWashDccBtVadCycle(washMachineId); - if ((ROUTE_STATE_IDLE == chRouteState) && (WASH_COL_STATE_ALLOW_YES == wDownDccWashAllowColState) && - (0U != dwDownWashDccBtVadCycle) && (dwDownWashDccBtVadCycle < dwRouteIdleCycNum)) + wRouteInOutSecOccupy = RouteInOutSecOccupy(wDownWashRelateRouteId); + if ((CI_START_FLOCK_NO == GetStartFLockFlag()) && CI_SUCCESS == wRouteInOutSecOccupy) { - /*进路是在最近一次请求加同意后解锁的*/ + RouteDriveIntoResult = CI_SUCCESS; /*有车驶入过*/ + } + + if ((ROUTE_STATE_IDLE == chRouteState) && (WASH_COL_STATE_ALLOW_YES == wDownDccWashAllowColState) && + (0U != dwDownWashDccBtVadCycle) && (dwDownWashDccBtVadCycle < dwRouteIdleCycNum) && (CI_SUCCESS == RouteDriveIntoResult)) + { + /*进路是在最近一次请求加同意后解锁的才这个分支,就是洗车结束后,为了修复工程缺陷:取消洗车时,车未驶入过进路,需要先取消进路再执行取消洗车操作*/ SetDownDccWashAllowColState(washMachineId, WASH_COL_STATE_ALLOW_NO); SetDownWashDccBtVadCycle(washMachineId, 0U); /*进路解锁,洗车请求状态和周期号也清除*/ SetDownWashReqState(washMachineId, WASH_REQ_STATE_ALLOW_NO); SetDownWashReqCycle(washMachineId, 0U); + RouteDriveIntoResult = CI_ERROR; } else { @@ -9507,6 +9649,7 @@ void WashMachinePassButtonUpdate(const UINT16 washMachineId) UINT32 dwRouteIdleCycNum = 0U; /*进路空闲起始周期号*/ UINT8 chDownWashAllowPassErrState = WASH_BUTTON_STATE_ERR_YES; /*降级模式洗车线洗车同意反向通过粘连状态*/ UINT32 dwDownWashBtVadPassCycle = 0U; /*降级模式洗车线反向通过洗车同意按钮有效周期*/ + UINT8 wRouteInOutSecOccupy = CI_ERROR; curCycle = Get2oo2CurCycleNum(); if ((washMachineId > 0U) && (washMachineId < WASHMACHINE_SUM_MAX)) @@ -9562,8 +9705,13 @@ void WashMachinePassButtonUpdate(const UINT16 washMachineId) dwRouteIdleCycNum = GetRouteIdleCycNum(wDownWashRelateRouteId); wDownWashAllowPassColState = GetDownWashAllowPassColState(washMachineId); dwDownWashBtVadPassCycle = GetDownWashBtVadPassCycle(washMachineId); + wRouteInOutSecOccupy = RouteInOutSecOccupy(wDownWashRelateRouteId); + if ((CI_START_FLOCK_NO == GetStartFLockFlag()) && (CI_SUCCESS == wRouteInOutSecOccupy)) + { + RouteDriveIntoResult = CI_SUCCESS; /*有车驶入过*/ + } if ((ROUTE_STATE_IDLE == chRouteState) && (WASH_COL_STATE_ALLOW_YES == wDownWashAllowPassColState) && - (0U != dwDownWashBtVadPassCycle) && (dwDownWashBtVadPassCycle < dwRouteIdleCycNum)) + (0U != dwDownWashBtVadPassCycle) && (dwDownWashBtVadPassCycle < dwRouteIdleCycNum) && (CI_SUCCESS == RouteDriveIntoResult)) { /*进路是在最近一次请求加同意后解锁的*/ SetDownWashAllowPassColState(washMachineId, WASH_COL_STATE_ALLOW_NO); @@ -9571,6 +9719,7 @@ void WashMachinePassButtonUpdate(const UINT16 washMachineId) /*进路解锁,洗车反向通过请求状态和周期号也清除*/ SetDownWashPassReqState(washMachineId, WASH_REQ_STATE_ALLOW_NO); SetDownWashPassReqCycle(washMachineId, 0U); + RouteDriveIntoResult = CI_ERROR; } else { @@ -9610,7 +9759,7 @@ void WashMachineDCCPassButtonUpdate(const UINT16 washMachineId) UINT32 dwRouteIdleCycNum = 0U; /*进路空闲起始周期号*/ UINT8 chDownDccWashAllowPassErrState = WASH_BUTTON_STATE_ERR_YES; /*降级模式DCC洗车同意反向通过粘连状态(动态字段:采集)*/ UINT32 dwDownWashDccBtVadPassCycle = 0U; /*降级模式DCC反向通过洗车同意按钮有效周期*/ - + UINT8 wRouteInOutSecOccupy = CI_ERROR; curCycle = Get2oo2CurCycleNum(); if ((washMachineId > 0U) && (washMachineId < WASHMACHINE_SUM_MAX)) @@ -9667,8 +9816,13 @@ void WashMachineDCCPassButtonUpdate(const UINT16 washMachineId) dwRouteIdleCycNum = GetRouteIdleCycNum(wDownWashRelateRouteId); wDownDccWashAllowPassColState = GetDownDccWashAllowPassColState(washMachineId); dwDownWashDccBtVadPassCycle = GetDownWashDccBtVadPassCycle(washMachineId); + wRouteInOutSecOccupy = RouteInOutSecOccupy(wDownWashRelateRouteId); + if ((CI_START_FLOCK_NO == GetStartFLockFlag()) && (CI_SUCCESS == wRouteInOutSecOccupy)) + { + RouteDriveIntoResult = CI_SUCCESS; /*有车驶入过*/ + } if ((ROUTE_STATE_IDLE == chRouteState) && (WASH_COL_STATE_ALLOW_YES == wDownDccWashAllowPassColState) && - (0U != dwDownWashDccBtVadPassCycle) && (dwDownWashDccBtVadPassCycle < dwRouteIdleCycNum)) + (0U != dwDownWashDccBtVadPassCycle) && (dwDownWashDccBtVadPassCycle < dwRouteIdleCycNum) && (CI_SUCCESS == RouteDriveIntoResult)) { /*进路是在最近一次请求加同意后解锁的*/ SetDownDccWashAllowPassColState(washMachineId, WASH_COL_STATE_ALLOW_NO); @@ -9676,6 +9830,7 @@ void WashMachineDCCPassButtonUpdate(const UINT16 washMachineId) /*进路解锁,洗车反向通过请求状态和周期号也清除*/ SetDownWashPassReqState(washMachineId, WASH_REQ_STATE_ALLOW_NO); SetDownWashPassReqCycle(washMachineId, 0U); + RouteDriveIntoResult = CI_ERROR; } else { @@ -9978,10 +10133,9 @@ void WashMachineApplyStateProc(const UINT16 washMachineId) /* * 功能描述: 更新洗车机的逻辑状态 * 参数说明: void -* 返回值 : 0u: 更新失败 -* 1: 更新成功 +* 返回值 : void */ -UINT8 WashMachineToDeviceStateProc(void) +void WashMachineToDeviceStateProc(void) { UINT16 ii = 0u; /*游标*/ UINT16 washMachineSum = 0u; /*洗车机总数*/ @@ -9993,7 +10147,7 @@ UINT8 WashMachineToDeviceStateProc(void) UINT16 tailWashAllowRelayId = 0u; /*洗车机允许车尾清洗继电器ID*/ UINT16 coupingWashAllowRelayId = 0u; /*洗车机允许联挂端清洗继电器ID*/ UINT16 outWashTrainPortAllowRelayId = 0u; /*洗车机允许出洗车库继电器ID*/ - UINT8 ret = CI_SUCCESS; + UINT8 stp = CI_SUCCESS; UINT8 lineIdentity = 0u; /*CI-VOBC接口标识*/ UINT16 washModeBackRelayId = 0U; UINT8 washModeState = 0U; @@ -10007,10 +10161,10 @@ UINT8 WashMachineToDeviceStateProc(void) washMachineId = GetWashMachineId(ii); if (CI_ERROR == washMachineId) { - ret = CI_ERROR; + stp = CI_ERROR; } - if (CI_SUCCESS == ret) + if (CI_SUCCESS == stp) { /*洗车请求确认状态更新*/ washMachineReVeriRelayId = GetWashMachineReqVerifyRelayId(washMachineId); @@ -10022,7 +10176,7 @@ UINT8 WashMachineToDeviceStateProc(void) retRsult = SetWashMachineRequestVerifySta(washMachineId, WASHMACHINE_COL_REQUEST_VALID); if (CI_ERROR == retRsult) { - ret = CI_ERROR; + stp = CI_ERROR; } } else if (RELAY_STATE_DOWN == relayCollState) @@ -10030,12 +10184,12 @@ UINT8 WashMachineToDeviceStateProc(void) retRsult = SetWashMachineRequestVerifySta(washMachineId, WASHMACHINE_COL_REQUEST_INVALID); if (CI_ERROR == retRsult) { - ret = CI_ERROR; + stp = CI_ERROR; } } else { - ret = CI_ERROR; + stp = CI_ERROR; } } else @@ -10044,7 +10198,7 @@ UINT8 WashMachineToDeviceStateProc(void) } } - if (CI_SUCCESS == ret) + if (CI_SUCCESS == stp) { /*头部洗车允许状态更新*/ headWashAllowRelayId = GetHeadWashAllowRelayId(washMachineId); @@ -10057,7 +10211,7 @@ UINT8 WashMachineToDeviceStateProc(void) retRsult = SetHeadWashAllowState(washMachineId, WASHMACHINE_COL_HEADWASH_YES); if (CI_ERROR == retRsult) { - ret = CI_ERROR; + stp = CI_ERROR; } } else if (RELAY_STATE_DOWN == relayCollState) @@ -10065,12 +10219,12 @@ UINT8 WashMachineToDeviceStateProc(void) retRsult = SetHeadWashAllowState(washMachineId, WASHMACHINE_COL_HEADWASH_NO); if (CI_ERROR == retRsult) { - ret = CI_ERROR; + stp = CI_ERROR; } } else { - ret = CI_ERROR; + stp = CI_ERROR; } } else @@ -10079,7 +10233,7 @@ UINT8 WashMachineToDeviceStateProc(void) } } - if (CI_SUCCESS == ret) + if (CI_SUCCESS == stp) { /*尾部洗车允许状态更新*/ tailWashAllowRelayId = GetTailWashAllowRelayId(washMachineId); @@ -10092,7 +10246,7 @@ UINT8 WashMachineToDeviceStateProc(void) retRsult = SetTailWashAllowState(washMachineId, WASHMACHINE_COL_TAILWASH_YES); if (CI_ERROR == retRsult) { - ret = CI_ERROR; + stp = CI_ERROR; } } else if (RELAY_STATE_DOWN == relayCollState) @@ -10100,12 +10254,12 @@ UINT8 WashMachineToDeviceStateProc(void) retRsult = SetTailWashAllowState(washMachineId, WASHMACHINE_COL_TAILWASH_NO); if (CI_ERROR == retRsult) { - ret = CI_ERROR; + stp = CI_ERROR; } } else { - ret = CI_ERROR; + stp = CI_ERROR; } } else @@ -10114,7 +10268,7 @@ UINT8 WashMachineToDeviceStateProc(void) } } - if (CI_SUCCESS == ret) + if (CI_SUCCESS == stp) { /*联挂端洗车允许状态更新*/ coupingWashAllowRelayId = GetCoupingWashAllowRelayId(washMachineId); @@ -10127,7 +10281,7 @@ UINT8 WashMachineToDeviceStateProc(void) retRsult = SetCoupingWashAllowState(washMachineId, WASHMACHINE_COL_COUPINGWASH_YES); if (CI_ERROR == retRsult) { - ret = CI_ERROR; + stp = CI_ERROR; } } else if (RELAY_STATE_DOWN == relayCollState) @@ -10135,12 +10289,12 @@ UINT8 WashMachineToDeviceStateProc(void) retRsult = SetCoupingWashAllowState(washMachineId, WASHMACHINE_COL_COUPINGWASH_NO); if (CI_ERROR == retRsult) { - ret = CI_ERROR; + stp = CI_ERROR; } } else { - ret = CI_ERROR; + stp = CI_ERROR; } } else @@ -10149,7 +10303,7 @@ UINT8 WashMachineToDeviceStateProc(void) } } - if (CI_SUCCESS == ret) + if (CI_SUCCESS == stp) { /*洗车机故障状态更新*/ emergencyStopRelayId = GetTrainEmergencyStopRelayId(washMachineId); @@ -10164,7 +10318,7 @@ UINT8 WashMachineToDeviceStateProc(void) retRsult = SetTrainEmergencyStopState(washMachineId, WASHMACHINE_COL_FALUT_NO); if (CI_ERROR == retRsult) { - ret = CI_ERROR; + stp = CI_ERROR; } } else if ((LINE_FAOHLHT == lineIdentity) || (LINE_FAOHLHT_ONESELF == lineIdentity) || (LINE_FAOHLHT_ONESELFSECOND == lineIdentity) @@ -10173,12 +10327,12 @@ UINT8 WashMachineToDeviceStateProc(void) retRsult = SetTrainEmergencyStopState(washMachineId, WASHMACHINE_COL_FALUT_NO_2); if (CI_ERROR == retRsult) { - ret = CI_ERROR; + stp = CI_ERROR; } } else {/*其他线路类型*/ - ret = CI_ERROR; + stp = CI_ERROR; } } @@ -10189,7 +10343,7 @@ UINT8 WashMachineToDeviceStateProc(void) retRsult = SetTrainEmergencyStopState(washMachineId, WASHMACHINE_COL_FALUT_YES); if (CI_ERROR == retRsult) { - ret = CI_ERROR; + stp = CI_ERROR; } } else if ((LINE_FAOHLHT == lineIdentity) || (LINE_FAOHLHT_ONESELF == lineIdentity) || (LINE_FAOHLHT_ONESELFSECOND == lineIdentity) @@ -10198,18 +10352,18 @@ UINT8 WashMachineToDeviceStateProc(void) retRsult = SetTrainEmergencyStopState(washMachineId, WASHMACHINE_COL_FALUT_YES_2); if (CI_ERROR == retRsult) { - ret = CI_ERROR; + stp = CI_ERROR; } } else {/*其他线路类型*/ - ret = CI_ERROR; + stp = CI_ERROR; } } else { - ret = CI_ERROR; + stp = CI_ERROR; } } else @@ -10217,7 +10371,7 @@ UINT8 WashMachineToDeviceStateProc(void) /*若不配置该继电器,继续执行*/ } } - if (CI_SUCCESS == ret) + if (CI_SUCCESS == stp) { /*洗车机就绪状态更新*/ washMachineReadyRelayId = GetWashMachineReadyRelayId(washMachineId); @@ -10229,7 +10383,7 @@ UINT8 WashMachineToDeviceStateProc(void) retRsult = SetWashMachineReadyState(washMachineId, WASHMACHINE_COL_READY_YES); if (CI_ERROR == retRsult) { - ret = CI_ERROR; + stp = CI_ERROR; } } else if (RELAY_STATE_DOWN == relayCollState) @@ -10237,12 +10391,12 @@ UINT8 WashMachineToDeviceStateProc(void) retRsult = SetWashMachineReadyState(washMachineId, WASHMACHINE_COL_READY_NO); if (CI_ERROR == retRsult) { - ret = CI_ERROR; + stp = CI_ERROR; } } else { - ret = CI_ERROR; + stp = CI_ERROR; } } else @@ -10251,7 +10405,7 @@ UINT8 WashMachineToDeviceStateProc(void) } } - if (CI_SUCCESS == ret) + if (CI_SUCCESS == stp) { /*洗车机允许出库状态更新*/ outWashTrainPortAllowRelayId = GetTrainOutWashPortAllowRelay(washMachineId); @@ -10266,7 +10420,7 @@ UINT8 WashMachineToDeviceStateProc(void) retRsult = SetTrainOutWashPortAllowSta(washMachineId, WASHMACHINE_COL_OUT_YES); if (CI_ERROR == retRsult) { - ret = CI_ERROR; + stp = CI_ERROR; } } else if ((LINE_FAOHLHT == lineIdentity) || (LINE_FAOHLHT_ONESELF == lineIdentity) || (LINE_FAOHLHT_ONESELFSECOND == lineIdentity) @@ -10275,12 +10429,12 @@ UINT8 WashMachineToDeviceStateProc(void) retRsult = SetTrainOutWashPortAllowSta(washMachineId, WASHMACHINE_COL_OUT_YES_2); if (CI_ERROR == retRsult) { - ret = CI_ERROR; + stp = CI_ERROR; } } else {/*其他线路类型*/ - ret = CI_ERROR; + stp = CI_ERROR; } } else if (RELAY_STATE_DOWN == relayCollState) @@ -10290,7 +10444,7 @@ UINT8 WashMachineToDeviceStateProc(void) retRsult = SetTrainOutWashPortAllowSta(washMachineId, WASHMACHINE_COL_OUT_NO); if (CI_ERROR == retRsult) { - ret = CI_ERROR; + stp = CI_ERROR; } } else if ((LINE_FAOHLHT == lineIdentity) || (LINE_FAOHLHT_ONESELF == lineIdentity) || (LINE_FAOHLHT_ONESELFSECOND == lineIdentity) @@ -10299,17 +10453,17 @@ UINT8 WashMachineToDeviceStateProc(void) retRsult = SetTrainOutWashPortAllowSta(washMachineId, WASHMACHINE_COL_OUT_NO_2); if (CI_ERROR == retRsult) { - ret = CI_ERROR; + stp = CI_ERROR; } } else {/*其他线路类型*/ - ret = CI_ERROR; + stp = CI_ERROR; } } else { - ret = CI_ERROR; + stp = CI_ERROR; } } else @@ -10318,7 +10472,7 @@ UINT8 WashMachineToDeviceStateProc(void) } } - if (CI_SUCCESS == ret) + if (CI_SUCCESS == stp) { washModeBackRelayId = GetWashModeBackRelayId(washMachineId); if ((0U != washModeBackRelayId) && (UINT16_MAX != washModeBackRelayId)) @@ -10344,18 +10498,16 @@ UINT8 WashMachineToDeviceStateProc(void) } /*降级模式洗车按钮状态更新*/ - if (CI_SUCCESS == ret) + if (CI_SUCCESS == stp) { WashMachineButtonStateProc(washMachineId); } /*降级模式请求信息处理*/ - if (CI_SUCCESS == ret) + if (CI_SUCCESS == stp) { WashMachineApplyStateProc(washMachineId); } } - - return ret; } @@ -11489,6 +11641,8 @@ void ConnectLineRelayToDevStateProc(void) UINT8 DxrelayColleState = 0u; OcConnetDataCfgStruct* pOcConnetDataCfgStru = NULL; UINT8 chBlocOpenColor = 0U; + UINT16 wFirstDsRealy = 0U; + UINT8 chFirstDsColleState = 0U; /*获取配置信息*/ ocConnetDataDevNum = GetOcConnetDataDevNum(); @@ -11515,67 +11669,85 @@ void ConnectLineRelayToDevStateProc(void) LxrelayId = GetSignalLxRelayId(devId); YxrelayId = GetSignalYxRelayId(devId); DxrelayId = GetSignalDxRelayId(devId); - + wFirstDsRealy = GetSignalFirstDsRelayId(devId); + LxrelayColleState = GetRelayCollState(LxrelayId); YxrelayColleState = GetRelayCollState(YxrelayId); DxrelayColleState = GetRelayCollState(DxrelayId); - - if (RELAY_STATE_UP == LxrelayColleState) + if ((0U < wFirstDsRealy) && (RELAY_SUM_MAX > wFirstDsRealy)) { - /*对两个继电器都吸起的异常情况做防护*/ - if ((RELAY_STATE_UP == YxrelayColleState) || (RELAY_STATE_UP == DxrelayColleState)) + chFirstDsColleState = GetRelayCollState(wFirstDsRealy); + } + else + { + chFirstDsColleState = RELAY_STATE_UP; /*邻线未配置DJ,依据其他继电器显示颜色*/ + } + + if (RELAY_STATE_UP == chFirstDsColleState) + { + if (RELAY_STATE_UP == LxrelayColleState) { - /*设置红灯*/ - (void)SetSignalCurColor(devId, SIGNAL_SHOWCOLOUR_RED); - } - else - { - /*若配置后备开放颜色按照后备开放显示*/ - chBlocOpenColor = GetSignalBlockOpenColorValue(devId); - if (0U != chBlocOpenColor) + /*对两个继电器都吸起的异常情况做防护*/ + if ((RELAY_STATE_UP == YxrelayColleState) || (RELAY_STATE_UP == DxrelayColleState)) { - (void)SetSignalCurColor(devId, chBlocOpenColor); + /*设置红灯*/ + (void)SetSignalCurColor(devId, SIGNAL_SHOWCOLOUR_RED); } else { - /*设置黄灯*/ - (void)SetSignalCurColor(devId, SIGNAL_SHOWCOLOUR_YELLOW); + /*若配置后备开放颜色按照后备开放显示*/ + chBlocOpenColor = GetSignalBlockOpenColorValue(devId); + if (0U != chBlocOpenColor) + { + (void)SetSignalCurColor(devId, chBlocOpenColor); + } + else + { + /*设置黄灯*/ + (void)SetSignalCurColor(devId, SIGNAL_SHOWCOLOUR_YELLOW); + } } } - } - else if (RELAY_STATE_UP == YxrelayColleState) - { - /*对两个继电器都吸起的异常情况做防护*/ - if ((RELAY_STATE_UP == LxrelayColleState) || (RELAY_STATE_UP == DxrelayColleState)) + else if (RELAY_STATE_UP == YxrelayColleState) { - /*设置红灯*/ - (void)SetSignalCurColor(devId, SIGNAL_SHOWCOLOUR_RED); + /*对两个继电器都吸起的异常情况做防护*/ + if ((RELAY_STATE_UP == LxrelayColleState) || (RELAY_STATE_UP == DxrelayColleState)) + { + /*设置红灯*/ + (void)SetSignalCurColor(devId, SIGNAL_SHOWCOLOUR_RED); + } + else + { + /*设置红黄灯*/ + (void)SetSignalCurColor(devId, SIGNAL_SHOWCOLOUR_REDYELLOW); + } + } + else if (RELAY_STATE_UP == DxrelayColleState) + { + /*对两个继电器都吸起的异常情况做防护*/ + if ((RELAY_STATE_UP == LxrelayColleState) || (RELAY_STATE_UP == YxrelayColleState)) + { + /*设置红灯*/ + (void)SetSignalCurColor(devId, SIGNAL_SHOWCOLOUR_RED); + } + else + { + /*设置白灯*/ + (void)SetSignalCurColor(devId, SIGNAL_SHOWCOLOUR_WHITE); + } } else - { - /*设置红黄灯*/ - (void)SetSignalCurColor(devId, SIGNAL_SHOWCOLOUR_REDYELLOW); - } - } - else if (RELAY_STATE_UP == DxrelayColleState) - { - /*对两个继电器都吸起的异常情况做防护*/ - if ((RELAY_STATE_UP == LxrelayColleState) || (RELAY_STATE_UP == YxrelayColleState)) { /*设置红灯*/ (void)SetSignalCurColor(devId, SIGNAL_SHOWCOLOUR_RED); } - else - { - /*设置白灯*/ - (void)SetSignalCurColor(devId, SIGNAL_SHOWCOLOUR_WHITE); - } } else { - /*设置红灯*/ - (void)SetSignalCurColor(devId, SIGNAL_SHOWCOLOUR_RED); + /*设置红断*/ + (void)SetSignalCurColor(devId, SIGNAL_SHOWCOLOUR_REDBREAK); } + } } } @@ -11785,6 +11957,13 @@ void UpdateConnectDriveRelayOutput(void) UINT8 checkTimeState = CI_TIME_NO; OcConnetDataCfgStruct* pOcConnetDataCfgStru = NULL; UINT8 ciToAtsSendFlag = 0U; + UINT16 wMainRelay = 0U; + UINT16 wAckRelay = 0U; + UINT16 wCMainRelay = 0U; + UINT8 chCheckFlag = 0U; + UINT8 chSigState = 0U; + UINT16 wFirseDsRelay = 0U; + /*获取配置信息*/ ocConnetDataDevNum = GetOcConnetDataDevNum(); @@ -11817,16 +11996,22 @@ void UpdateConnectDriveRelayOutput(void) LxrelayId = GetSignalLxDrvRelayId(devId); YxrelayId = GetSignalYxDrvRelayId(devId); DxrelayId = GetSignalDxDrvRelayId(devId); - + wMainRelay = GetSignalMainDrvRelayId(devId); + wAckRelay = GetSignalAckDrvRelayId(devId); + wCMainRelay = GetSignalCMainDrvRelayId(devId); + wFirseDsRelay = GetSignalFirstDsDrvRelayId(devId); /*信号开放*/ if (SIGNAL_OPEN == devState) { if (SIGNAL_SHOWCOLOUR_REDYELLOW == signalColor) { - /*驱动YXJ吸起*/ + /*驱动YXJ吸起/次控继电器吸起*/ (void)SetRelayDriveState(YxrelayId, RELAY_DRIVE_STATE_UP); (void)SetRelayDriveState(LxrelayId, RELAY_DRIVE_STATE_DOWN); (void)SetRelayDriveState(DxrelayId, RELAY_DRIVE_STATE_DOWN); + (void)SetRelayDriveState(wAckRelay, RELAY_DRIVE_STATE_UP); + (void)SetRelayDriveState(wMainRelay, RELAY_DRIVE_STATE_DOWN); + (void)SetRelayDriveState(wCMainRelay, RELAY_DRIVE_STATE_DOWN); } else if ((SIGNAL_SHOWCOLOUR_WHITE == signalColor) || (SIGNAL_SHOWCOLOUR_RED_WHITE == signalColor)) { @@ -11834,23 +12019,55 @@ void UpdateConnectDriveRelayOutput(void) (void)SetRelayDriveState(DxrelayId, RELAY_DRIVE_STATE_UP); (void)SetRelayDriveState(LxrelayId, RELAY_DRIVE_STATE_DOWN); (void)SetRelayDriveState(YxrelayId, RELAY_DRIVE_STATE_DOWN); + (void)SetRelayDriveState(wMainRelay, RELAY_DRIVE_STATE_DOWN); + (void)SetRelayDriveState(wAckRelay, RELAY_DRIVE_STATE_DOWN); + (void)SetRelayDriveState(wCMainRelay, RELAY_DRIVE_STATE_DOWN); } else { - /*驱动LXJ吸起*/ + /*驱动LXJ吸起/次控继电器吸起/主控继电器吸起*/ (void)SetRelayDriveState(LxrelayId, RELAY_DRIVE_STATE_UP); (void)SetRelayDriveState(YxrelayId, RELAY_DRIVE_STATE_DOWN); (void)SetRelayDriveState(DxrelayId, RELAY_DRIVE_STATE_DOWN); + (void)SetRelayDriveState(wMainRelay, RELAY_DRIVE_STATE_UP); + (void)SetRelayDriveState(wAckRelay, RELAY_DRIVE_STATE_UP); + + /*复杂主控继电器驱动*/ + chCheckFlag = GetCMainRelayDriveState(wCMainRelay,devId); + if (CI_SUCCESS == chCheckFlag) + { + (void)SetRelayDriveState(wCMainRelay, RELAY_DRIVE_STATE_UP); + } + else + { + (void)SetRelayDriveState(wCMainRelay, RELAY_DRIVE_STATE_DOWN); + } } } else { - /*驱动LXJ,YXJ,DXJ落下*/ + /*驱动落下*/ (void)SetRelayDriveState(LxrelayId, RELAY_DRIVE_STATE_DOWN); (void)SetRelayDriveState(YxrelayId, RELAY_DRIVE_STATE_DOWN); (void)SetRelayDriveState(DxrelayId, RELAY_DRIVE_STATE_DOWN); + (void)SetRelayDriveState(wMainRelay, RELAY_DRIVE_STATE_DOWN); + (void)SetRelayDriveState(wAckRelay, RELAY_DRIVE_STATE_DOWN); + (void)SetRelayDriveState(wCMainRelay, RELAY_DRIVE_STATE_DOWN); } + /*驱动 1DJ 状态*/ + chSigState = GetSignalCurColor(devId); + + if (SIGNAL_SHOWCOLOUR_REDBREAK == chSigState) + { + (void)SetRelayDriveState(wFirseDsRelay, RELAY_DRIVE_STATE_DOWN); + } + else + { + (void)SetRelayDriveState(wFirseDsRelay, RELAY_DRIVE_STATE_UP); + } + + /*检查驱采是否一致,不一致报混线*/ LxCollerelayId = GetSignalLxRelayId(devId); ProcessCoupleRelayHunXianState(LxrelayId, LxCollerelayId); @@ -15246,10 +15463,24 @@ void SetAllSingleSwitchCurPosition(UINT16 switchCurSum) UINT16 switchId = 0U; /*道岔ID*/ UINT8 belongCiId = 0U; /*道岔所属联锁ID*/ UINT16 ii = 0U; /*循环索引*/ + UINT8 jj = 0U; /*循环索引*/ UINT8 chSwitchColPos = SWITCH_POSITION_INVALID; /*道岔当前位置*/ UINT8 chSwitchTolPos = SWITCH_POSITION_INVALID; /*道岔容忍后位置*/ UINT8 ocId = 0u; UINT8 chLocalCiOCSswitch = 0u; + UINT8 RedunCollCfg = 0u; + UINT8 chMainOcCollPos = SWITCH_POSITION_INVALID; /*(道岔冗余采集)主控转辙机板的道岔位置*/ + UINT8 chRedunOcCollPos[SWITCH_REDUN_COLL_MAX] = { 0u }; /*(道岔冗余采集)OC采集自动开闭器的道岔位置*/ + UINT8 chRedunOcHunXianStt[SWITCH_REDUN_COLL_MAX] = { 0u }; /*(道岔冗余采集)OC采集自动开闭器混线状态*/ + UINT8 chRedunCollCombineStt[SWITCH_REDUN_COLL_MAX] = { 0u }; /*(道岔冗余采集)OC采集自动开闭器继电器状态组合*/ + + for (jj = 0u; jj < SWITCH_REDUN_COLL_MAX; jj++) + { + /*道岔冗余采集位置初始化成无效、未混线*/ + chRedunOcCollPos[jj] = SWITCH_POSITION_INVALID; + chRedunOcHunXianStt[jj] = RELAY_HUNXIAN_STATE_NO; + } + chLocalCiOCSswitch = GetLocalCiOCSswitch(); localCiId = GetSystemParaLocalCiId(); /*获取本机联锁ID*/ for (ii = 0U; ii < switchCurSum; ii++) @@ -15265,26 +15496,653 @@ void SetAllSingleSwitchCurPosition(UINT16 switchCurSum) if ((belongCiId == localCiId) && (0U != localCiId)) { - /*通过主控OC找到采集状态*/ - ocId = GetSwitchMainCotrolOCId(switchId); - if ((0u < ocId)|| (OC_S_OFF == chLocalCiOCSswitch)) - {/*当前有主控或OC-S开关关闭*/ - chSwitchColPos = GetOcSwitchState(switchId, ocId); - SetSwitchCollPos(switchId, chSwitchColPos); + /*冗余采集处理*/ + RedunCollCfg = GetSwitchRedunCollCfg(switchId); + if (REDUN_COLL_YES == RedunCollCfg) + { + /*具备道岔冗余采集*/ + /*获取主控转辙机板的采集位置*/ + chMainOcCollPos = GetMainOcSwitchColPos(switchId); + /*记录*/ + SetSwitchMainCollPos(switchId, chMainOcCollPos); + /*获取OC采集的自动开闭器接点位置*/ + for (jj = 0u; jj < SWITCH_REDUN_COLL_MAX; jj++) + { + chRedunOcCollPos[jj] = GetRedunSwitchColPos(switchId, jj, &chRedunOcHunXianStt[jj], &chRedunCollCombineStt[jj]); + } + + /*冗余采集融合处理*/ + chSwitchColPos = GetSwitchRedunFusionPos(switchId, chMainOcCollPos, chRedunOcCollPos, chRedunOcHunXianStt); + + /*冗余采集故障和混线处理*/ + for (jj = 0u; jj < SWITCH_REDUN_COLL_MAX; jj++) + { + SwitchRedunFaultProc(switchId, jj, chRedunOcCollPos[jj]); + SwitchRedunHunXianProc(switchId, jj, chRedunOcHunXianStt[jj], chRedunCollCombineStt[jj]); + /*记录*/ + SetSwitchRedunCurrHunXianStt(switchId, jj, chRedunOcHunXianStt[jj]); + } + + /*设置道岔采集位置*/ + SetSwitchCollPos(switchId, chSwitchColPos); + /*对锁闭道岔容忍,设置道岔单独位置*/ chSwitchTolPos = GetSwitchCollToleratePos(switchId); - SetSingleSwitchCurPosition(switchId, chSwitchTolPos);/*设置道岔单独位置*/ + SetSingleSwitchCurPosition(switchId, chSwitchTolPos); } else - {/*OCS开关打开且道岔当前无主控状态,则设置四开*/ - SetSwitchCollPos(switchId, SWITCH_POSITION_SIKAI);/*置采集位置为四开*/ - SetSingleSwitchCurPosition(switchId, SWITCH_POSITION_SIKAI);/*设置道岔单独位置*/ + { + /*不具备道岔冗余采集,直接从主控转辙机板获取*/ + /*通过主控OC找到采集状态*/ + ocId = GetSwitchMainCotrolOCId(switchId); + if ((0u < ocId) || (OC_S_OFF == chLocalCiOCSswitch)) + { + /*当前有主控或OC-S开关关闭*/ + chSwitchColPos = GetOcSwitchState(switchId, ocId); + SetSwitchCollPos(switchId, chSwitchColPos); + + chSwitchTolPos = GetSwitchCollToleratePos(switchId); + SetSingleSwitchCurPosition(switchId, chSwitchTolPos);/*设置道岔单独位置*/ + } + else + { + /*OCS开关打开且道岔当前无主控状态,则设置四开*/ + SetSwitchCollPos(switchId, SWITCH_POSITION_SIKAI);/*置采集位置为四开*/ + SetSingleSwitchCurPosition(switchId, SWITCH_POSITION_SIKAI);/*设置道岔单独位置*/ + } } } } } } +/* +* 功能描述:道岔冗余采集道岔位置当前混线判断 +* 参数说明:UINT8 cMainOcPos 主控转辙机板位置 +* UINT8 *pRedunPos OC/OC-S冗余采集位置 +* UINT8 *pHunXianStt OC/OC-S冗余采集混线状态 +* 返回值 :两路冗余采集是否定反位冲突 CI_ERROR有冲突 CI_SUCCESS无冲突 +* 注意事项:本函数暂只支持SWITCH_REDUN_COLL_MAX为2,若修改宏值需重写 +*/ +static UINT8 SwitchRedunFusionHunXianProc(UINT8 cMainOcPos, const UINT8 *pRedunPos, INOUT UINT8 *pHunXianStt) +{ + UINT8 cConflictTag = CI_ERROR; + + if ((NULL == pRedunPos) || (NULL == pHunXianStt)) + { + /*入参非法*/ + } + else + { + cConflictTag = CI_SUCCESS; + + /*融合混线判断(用动表一致性判断前的位置)*/ + if (((SWITCH_POSITION_DINGWEI == cMainOcPos) && (SWITCH_POSITION_FANWEI == pRedunPos[0])) + || ((SWITCH_POSITION_FANWEI == cMainOcPos) && (SWITCH_POSITION_DINGWEI == pRedunPos[0]))) + { + /*主控转辙机板与道岔冗余采集存在定反表冲突,判冗余采集混线*/ + pHunXianStt[0] = RELAY_HUNXIAN_STATE_YES; + } + else + { + /*nothing*/ + } + + if (((SWITCH_POSITION_DINGWEI == cMainOcPos) && (SWITCH_POSITION_FANWEI == pRedunPos[1])) + || ((SWITCH_POSITION_FANWEI == cMainOcPos) && (SWITCH_POSITION_DINGWEI == pRedunPos[1]))) + { + /*主控转辙机板与道岔冗余采集存在定反表冲突,判冗余采集混线*/ + pHunXianStt[1] = RELAY_HUNXIAN_STATE_YES; + } + else + { + /*nothing*/ + } + + if (((SWITCH_POSITION_DINGWEI == pRedunPos[0]) && (SWITCH_POSITION_FANWEI == pRedunPos[1])) + || ((SWITCH_POSITION_FANWEI == pRedunPos[0]) && (SWITCH_POSITION_DINGWEI == pRedunPos[1]))) + { + /*记录冗余采集定反位冲突标志有效*/ + cConflictTag = CI_ERROR; + if ((SWITCH_POSITION_DINGWEI == cMainOcPos) || (SWITCH_POSITION_FANWEI == cMainOcPos)) + { + /*和主控转辙机板冲突的采集判混线,上面已处理*/ + } + else + { + /*两路道岔冗余采集之间存在定反位冲突,且主控转辙机板无表示,判两路冗余采集均混线*/ + pHunXianStt[0] = RELAY_HUNXIAN_STATE_YES; + pHunXianStt[1] = RELAY_HUNXIAN_STATE_YES; + } + } + else + { + /*nothing*/ + } + } + + return cConflictTag; +} + +/* +* 功能描述:道岔冗余采集道岔位置融合 +* 参数说明:UINT8 cMainOcPos 主控转辙机板位置 +* UINT8 *pRedunPos OC/OC-S冗余采集位置 +* UINT8 *pHunXianStt OC/OC-S冗余采集混线状态 +* 返回值 :融合位置 +* 注意事项:本函数暂只支持SWITCH_REDUN_COLL_MAX为2,若修改宏值需重写 +*/ +static UINT8 GetSwitchRedunFusionPos(UINT16 switchId, UINT8 cMainOcPos, INOUT UINT8 *pRedunPos, INOUT UINT8 *pHunXianStt) +{ + UINT8 cFusionPos = SWITCH_POSITION_INVALID; + UINT8 cConflictTag = CI_ERROR; + UINT8 cSwitchLastDrvPos = 0u; + UINT32 dwDrvStartCyc = 0u; + UINT8 i = 0u; + UINT8 cHunXianRecovStt = 0u; + UINT8 RedunPosForFusion[SWITCH_REDUN_COLL_MAX] = { 0u }; + + if ((NULL == pRedunPos) || (NULL == pHunXianStt)) + { + /*入参非法*/ + } + else + { + /*冗余采集混线判断(定反互斥)*/ + cConflictTag = SwitchRedunFusionHunXianProc(cMainOcPos, pRedunPos, pHunXianStt); + + /*动表一致性判断*/ + cSwitchLastDrvPos = GetSwitchLastValidDrvPos(switchId); + dwDrvStartCyc = GetSwitchDriveStartCycNum(switchId); + for (i = 0u; i < SWITCH_REDUN_COLL_MAX; i++) + { + if (((SWITCH_POSITION_DINGWEI == pRedunPos[i]) && (SWITCH_DRIVE_POS_FANWEI == cSwitchLastDrvPos)) + || ((SWITCH_POSITION_FANWEI == pRedunPos[i]) && (SWITCH_DRIVE_POS_DINGWEI == cSwitchLastDrvPos))) + { + /*动表不一致*/ + if (0u < dwDrvStartCyc) + { + /*有驱动命令,移动中*/ + pRedunPos[i] = SWITCH_POSITION_MOVE; + } + else + { + /*无驱动命令,四开*/ + pRedunPos[i] = SWITCH_POSITION_SIKAI; + } + } + else + { + /*未发生动表不一致*/ + } + } + + /*混线的道岔以四开参与融合,这里用局部变量处理,是为了避免混线恢复当周期,无法将采集故障周期号清空,会多报一周期采集故障报警*/ + for (i = 0u; i < SWITCH_REDUN_COLL_MAX; i++) + { + cHunXianRecovStt = GetSwitchRedunHunXianRecovStt(switchId, i); + if (REDUN_HX_RECOV_ALL != cHunXianRecovStt) + { + RedunPosForFusion[i] = SWITCH_POSITION_SIKAI; + } + else + { + RedunPosForFusion[i] = pRedunPos[i]; + } + /*记录道岔位置*/ + SetSwitchRedunCollPos(switchId, i, RedunPosForFusion[i]); + } + + /*计算最终融合道岔位置*/ + cFusionPos = CalcRedunSwitchFinalFusionPos(cMainOcPos, RedunPosForFusion, cConflictTag); + } + + return cFusionPos; +} + +/* +* 功能描述:计算道岔冗余采集最终融合道岔位置 +* 参数说明:UINT8 cMainOcPos 主控转辙机板位置 +* UINT8 *pRedunPosForFusion OC/OC-S冗余采集位置 +* UINT8 cConflictTag 两路冗余采集是否定反位冲突 CI_ERROR有冲突 CI_SUCCESS无冲突 +* 返回值 :最终融合道岔位置 +* 注意事项:本函数暂只支持SWITCH_REDUN_COLL_MAX为2,若修改宏值需重写 +*/ +static UINT8 CalcRedunSwitchFinalFusionPos(UINT8 cMainOcPos, const UINT8 *pRedunPosForFusion, UINT8 cConflictTag) +{ + UINT8 cFusionPos = SWITCH_POSITION_INVALID; /*融合道岔位置*/ + + if (NULL == pRedunPosForFusion) + { + /*入参非法*/ + } + else + { + if ((SWITCH_POSITION_DINGWEI == cMainOcPos) + || (SWITCH_POSITION_FANWEI == cMainOcPos) + || (SWITCH_POSITION_MOVE == cMainOcPos)) + { + /*主控转辙机板位置有效,融合位置使用主控转辙机板的位置*/ + cFusionPos = cMainOcPos; + } + else + { + /*否则检查是否存在冲突,先赋值为四开*/ + cFusionPos = SWITCH_POSITION_SIKAI; + if (CI_SUCCESS == cConflictTag) + { + /*无冲突,任一冗余采集有效位置即最终位置*/ + if ((SWITCH_POSITION_DINGWEI == pRedunPosForFusion[0]) || (SWITCH_POSITION_DINGWEI == pRedunPosForFusion[1])) + { + cFusionPos = SWITCH_POSITION_DINGWEI; + } + else if ((SWITCH_POSITION_FANWEI == pRedunPosForFusion[0]) || (SWITCH_POSITION_FANWEI == pRedunPosForFusion[1])) + { + cFusionPos = SWITCH_POSITION_FANWEI; + } + else if ((SWITCH_POSITION_MOVE == pRedunPosForFusion[0]) || (SWITCH_POSITION_MOVE == pRedunPosForFusion[1])) + { + cFusionPos = SWITCH_POSITION_MOVE; + } + else + { + /*道岔四开*/ + } + } + else + { + /*有冲突,道岔四开*/ + } + } + } + + return cFusionPos; +} + +/* +* 功能描述: 从主控转辙机板获取道岔位置 +* 参数说明: UINT16 switchId 道岔ID +* 返回值 : 道岔位置 +*/ +static UINT8 GetMainOcSwitchColPos(UINT16 switchId) +{ + UINT8 ocId = 0u; + UINT8 chLocalCiOCSswitch = 0u; + UINT8 chSwitchColPos = SWITCH_POSITION_INVALID; /*道岔当前位置*/ + + chLocalCiOCSswitch = GetLocalCiOCSswitch(); + ocId = GetSwitchMainCotrolOCId(switchId); + if ((0u < ocId) || (OC_S_OFF == chLocalCiOCSswitch)) + { + /*当前有主控或OC-S开关关闭*/ + chSwitchColPos = GetOcSwitchState(switchId, ocId); + } + else + { + /*OCS开关打开且道岔当前无主控状态,则设置四开*/ + chSwitchColPos = SWITCH_POSITION_SIKAI; + } + + return chSwitchColPos; +} + +/* +* 功能描述:从冗余采集获取道岔位置 +* 参数说明:UINT16 switchId 道岔ID +* UINT8 ocIndex 下标 +* UINT8 *pHunXianStt 混线状态 +* 返回值 :道岔位置 +*/ +static UINT8 GetRedunSwitchColPos(UINT16 switchId, UINT8 ocIndex, UINT8 *pHunXianStt, UINT8 *pCombineStt) +{ + UINT8 chSwitchColPos = SWITCH_POSITION_INVALID; /*道岔当前位置*/ + UINT16 wDBJ1RelayId = 0u; /*DBJ1继电器ID*/ + UINT16 wDBJ2RelayId = 0u; /*DBJ2继电器ID*/ + UINT16 wFBJ1RelayId = 0u; /*FBJ1继电器ID*/ + UINT16 wFBJ2RelayId = 0u; /*FBJ2继电器ID*/ + UINT8 cDBJ1CollState = 0u; /*DBJ1继电器状态*/ + UINT8 cDBJ2CollState = 0u; /*DBJ2继电器状态*/ + UINT8 cFBJ1CollState = 0u; /*FBJ1继电器状态*/ + UINT8 cFBJ2CollState = 0u; /*FBJ2继电器状态*/ + UINT8 cCombineCollState = 0u; /*DBJ1/2/FBJ1/2结合状态*/ + UINT32 dwSwitchDrvStartCyc = 0u; /*道岔驱动起始周期*/ + UINT8 cHunXianState = RELAY_HUNXIAN_STATE_NO; /*混线状态*/ + + /*获取冗余采集继电器ID和状态*/ + wDBJ1RelayId = GetSwitchRedunDBJ1RelayId(switchId, ocIndex); + wDBJ2RelayId = GetSwitchRedunDBJ2RelayId(switchId, ocIndex); + wFBJ1RelayId = GetSwitchRedunFBJ1RelayId(switchId, ocIndex); + wFBJ2RelayId = GetSwitchRedunFBJ2RelayId(switchId, ocIndex); + cDBJ1CollState = GetRelayCollState(wDBJ1RelayId); + cDBJ2CollState = GetRelayCollState(wDBJ2RelayId); + cFBJ1CollState = GetRelayCollState(wFBJ1RelayId); + cFBJ2CollState = GetRelayCollState(wFBJ2RelayId); + cCombineCollState = SwitchRedunCombineProc(cDBJ1CollState, cDBJ2CollState, cFBJ1CollState, cFBJ2CollState); + dwSwitchDrvStartCyc = GetSwitchDriveStartCycNum(switchId); + /*记录采集状态*/ + SetSwitchRedunCombineStt(switchId, ocIndex, cCombineCollState); + + switch (cCombineCollState) + { + case 0b00000011u: + /*反位(混线、动表一致性在后面处理)*/ + chSwitchColPos = SWITCH_POSITION_FANWEI; + break; + + case 0b00001010u: + /*有驱动命令时,移动中*/ + if (0u < dwSwitchDrvStartCyc) + { + chSwitchColPos = SWITCH_POSITION_MOVE; + } + else + { + chSwitchColPos = SWITCH_POSITION_SIKAI; + } + break; + + case 0b00001100u: + /*定位(混线、动表一致性在后面处理)*/ + chSwitchColPos = SWITCH_POSITION_DINGWEI; + break; + + case 0b00000000u: + case 0b00000010u: + case 0b00001000u: + /*故障*/ + chSwitchColPos = SWITCH_POSITION_SIKAI; + break; + + case 0b00000001u: + case 0b00000100u: + /*道岔转动中判混线,否则判故障*/ + chSwitchColPos = SWITCH_POSITION_SIKAI; + if (0u < dwSwitchDrvStartCyc) + { + cHunXianState = RELAY_HUNXIAN_STATE_YES; + } + else + { + /*nothing*/ + } + break; + + /*case 0b00000101u: + case 0b00000110u: + case 0b00000111u: + case 0b00001001u: + case 0b00001011u: + case 0b00001101u: + case 0b00001110u: + case 0b00001111u:*/ + default: + /*混线*/ + chSwitchColPos = SWITCH_POSITION_SIKAI; + cHunXianState = RELAY_HUNXIAN_STATE_YES; + break; + } + + if ((NULL == pHunXianStt) || (NULL == pCombineStt)) + { + /*入参异常*/ + } + else + { + /*赋值混线输出*/ + *pHunXianStt = cHunXianState; + *pCombineStt = cCombineCollState; + } + + return chSwitchColPos; +} + +/* +* 功能描述:道岔冗余采集故障处理 +* 参数说明:UINT16 switchId 道岔ID +* UINT8 ocIndex 下标 +* UINT8 cCombineState 当周期冗余采集状态 +* 返回值 :无 +*/ +static void SwitchRedunFaultProc(UINT16 switchId, UINT8 ocIndex, UINT8 cCombineState) +{ + UINT32 dwRedunFaultStCyc = 0u; /*冗余采集故障起始周期号*/ + UINT32 dwCurrCycleNum = 0u; /*当前周期号*/ + + dwRedunFaultStCyc = GetSwitchRedunFaultStCyc(switchId, ocIndex); + if (0u < dwRedunFaultStCyc) + { + /*之前已经采集故障*/ + if ((SWITCH_POSITION_DINGWEI == cCombineState) + || (SWITCH_POSITION_FANWEI == cCombineState) + || (SWITCH_POSITION_MOVE == cCombineState)) + { + /*故障恢复,清空周期号*/ + SetSwitchRedunFaultStCyc(switchId, ocIndex, 0u); + } + else + { + /*维持故障记录*/ + } + } + else + { + /*之前未采集故障*/ + if ((SWITCH_POSITION_DINGWEI == cCombineState) + || (SWITCH_POSITION_FANWEI == cCombineState) + || (SWITCH_POSITION_MOVE == cCombineState)) + { + /*未发生故障*/ + } + else + { + /*发生故障,记录周期号*/ + dwCurrCycleNum = Get2oo2CurCycleNum(); + SetSwitchRedunFaultStCyc(switchId, ocIndex, dwCurrCycleNum); + } + } +} + +/* +* 功能描述:道岔冗余采集混线处理 +* 参数说明:UINT16 switchId 道岔ID +* UINT8 ocIndex 下标 +* UINT8 cCurrHunXianState 当周期混线状态 +* UINT8 cCombineState 当周期冗余采集状态 +* 返回值 :无 +*/ +static void SwitchRedunHunXianProc(UINT16 switchId, UINT8 ocIndex, UINT8 cCurrHunXianState, UINT8 cCombineState) +{ + UINT32 dwJudgHunXianCycleNum = 0u; /*判断混线起始周期号*/ + UINT32 dwRealHunXianCycleNum = 0u; /*真实混线起始周期号*/ + UINT32 dwCurrCycleNum = 0u; /*当前周期号*/ + UINT32 dwRedunCollHunXianCycCfg = 0u; /*道岔冗余采集报警容忍时间*/ + UINT8 cTimeCount = 0u; /*超时判断*/ + UINT8 cLastHunXianRecovStt = 0u; /*之前混线状态*/ + UINT8 cHunXianRecovStt = 0u; /*混线(恢复)状态*/ + UINT32 dwSwitchDrvStartCyc = 0u; /*道岔驱动起始周期号*/ + + dwCurrCycleNum = Get2oo2CurCycleNum(); + dwRedunCollHunXianCycCfg = GetSwitchRedunCollHunXianCycCfg(); + dwSwitchDrvStartCyc = GetSwitchDriveStartCycNum(switchId); + cLastHunXianRecovStt = GetSwitchRedunHunXianRecovStt(switchId, ocIndex); + + /*判断混线判断*/ + if (RELAY_HUNXIAN_STATE_YES == cCurrHunXianState) + { + /*当前周期混线*/ + dwJudgHunXianCycleNum = GetSwitchRedunJudgHunXianStCyc(switchId, ocIndex); + if (0u == dwJudgHunXianCycleNum) + { + /*本周期混线且之前未混线,记录混线起始周期号*/ + SetSwitchRedunJudgHunXianStCyc(switchId, ocIndex, dwCurrCycleNum); + } + else + { + /*nothing*/ + } + + if (0u == dwSwitchDrvStartCyc) + { + /*没有驱动命令,直接判混线*/ + SetSwitchRedunHunXianRecovStt(switchId, ocIndex, 0u); + } + else + { + /*有驱动命令,超时后判混线*/ + cTimeCount = SystemOverTimeCheck(dwJudgHunXianCycleNum, dwRedunCollHunXianCycCfg); + if (CI_TIME_OUT == cTimeCount) + { + SetSwitchRedunHunXianRecovStt(switchId, ocIndex, 0u); + } + else + { + /*nothing*/ + } + } + } + + /*真实混线判断*/ + dwRealHunXianCycleNum = GetSwitchRedunRealHunXianStCyc(switchId, ocIndex); + if ((RELAY_HUNXIAN_STATE_YES == cCurrHunXianState) && (0u == dwRealHunXianCycleNum)) + { + /*本周期混线且之前未混线,记录混线起始周期号*/ + SetSwitchRedunRealHunXianStCyc(switchId, ocIndex, dwCurrCycleNum); + } + else if (RELAY_HUNXIAN_STATE_NO == cCurrHunXianState) + { + /*本周期未混线,清空混线起始周期号*/ + SetSwitchRedunRealHunXianStCyc(switchId, ocIndex, 0u); + } + else + { + /*nothing*/ + } + + /*判断混线状态清空时机: + ①之前没混线,有驱动命令,容忍时间内混线恢复(只清空周期号); + ②采集到过1100、0011、1010,且未连续容忍时间发生真实混线*/ + /*条件①*/ + if ((RELAY_HUNXIAN_STATE_NO == cCurrHunXianState) && (0u < dwSwitchDrvStartCyc) && (REDUN_HX_RECOV_ALL == cLastHunXianRecovStt)) + { + dwJudgHunXianCycleNum = GetSwitchRedunJudgHunXianStCyc(switchId, ocIndex); + cTimeCount = SystemOverTimeCheck(dwJudgHunXianCycleNum, dwRedunCollHunXianCycCfg); + if (CI_TIME_OUT == cTimeCount) + { + /*已经超过容忍时间,混线还没恢复,不能直接恢复*/ + } + else + { + /*还没到容忍时间,清空混线周期号*/ + SetSwitchRedunJudgHunXianStCyc(switchId, ocIndex, 0u); + } + } + else + { + /*nothing*/ + } + + /*条件②*/ + cHunXianRecovStt = GetSwitchRedunHunXianRecovStt(switchId, ocIndex); + if (REDUN_HX_RECOV_ALL == cHunXianRecovStt) + { + /*未判断混线*/ + } + else + { + /*判断混线有效,检查是否真实混线超时*/ + dwRealHunXianCycleNum = GetSwitchRedunRealHunXianStCyc(switchId, ocIndex); + cTimeCount = SystemOverTimeCheck(dwRealHunXianCycleNum, dwRedunCollHunXianCycCfg); + if (CI_TIME_OUT == cTimeCount) + { + /*真实混线超时,清空混线恢复状态*/ + SetSwitchRedunHunXianRecovStt(switchId, ocIndex, 0u); + } + else if (0b00001100u == cCombineState) + { + /*采集到定位(1100)*/ + SetSwitchRedunHunXianRecovStt(switchId, ocIndex, REDUN_HX_RECOV_1100); + } + else if (0b00001010u == cCombineState) + { + /*采集到移动中(1010)*/ + SetSwitchRedunHunXianRecovStt(switchId, ocIndex, REDUN_HX_RECOV_1010); + } + else if (0b00000011u == cCombineState) + { + /*采集到反位(0011)*/ + SetSwitchRedunHunXianRecovStt(switchId, ocIndex, REDUN_HX_RECOV_0011); + } + else + { + /*nothing*/ + } + + /*检查全部混线恢复状态是否都采集到过*/ + cHunXianRecovStt = GetSwitchRedunHunXianRecovStt(switchId, ocIndex); + if (REDUN_HX_RECOV_ALL == cHunXianRecovStt) + { + /*采集到过全部混线恢复状态,恢复判断混线*/ + SetSwitchRedunJudgHunXianStCyc(switchId, ocIndex, 0u); + } + else + { + /*nothing*/ + } + } +} + +/* +* 功能描述:道岔冗余采集继电器组合处理 +* 参数说明:UINT16 cDBJ1State DBJ1状态 +* UINT16 cDBJ1State DBJ2状态 +* UINT16 cDBJ1State FBJ1状态 +* UINT16 cDBJ1State FBJ2状态 +* 返回值 :继电器组合(0000|DBJ1|DBJ2|FBJ1|FBJ2) +*/ +static UINT8 SwitchRedunCombineProc(UINT8 cDBJ1State, UINT8 cDBJ2State, UINT8 cFBJ1State, UINT8 cFBJ2State) +{ + UINT8 cCombineCollState = 0u; + + /*将继电器状态转为bit位,便于后续判断*/ + if (RELAY_STATE_UP == cDBJ1State) + { + cCombineCollState |= 0b00001000u; + } + else + { + /*nothing*/ + } + + if (RELAY_STATE_UP == cDBJ2State) + { + cCombineCollState |= 0b00000100u; + } + else + { + /*nothing*/ + } + + if (RELAY_STATE_UP == cFBJ1State) + { + cCombineCollState |= 0b00000010u; + } + else + { + /*nothing*/ + } + + if (RELAY_STATE_UP == cFBJ2State) + { + cCombineCollState |= 0b00000001u; + } + else + { + /*nothing*/ + } + + return cCombineCollState; +} + /* * 功能描述: 设置所有道岔转辙机位置 * 参数说明: UINT16 switchCurSum 道岔总数 @@ -16389,6 +17247,7 @@ UINT8 GetSwitchCollToleratePos(const UINT16 switchId) UINT8 switchCurPosition = 0u; UINT8 faultFlag = GetSwitchFaultState(switchId); /*获取道岔是否板卡均故障*/ UINT16 switch2ndId = GetDSwitchOtherId(switchId); /*双动道岔*/ + UINT8 cRedunCollCfg = GetSwitchRedunCollCfg(switchId); /*获取是否冗余采集*/ curCycNum = Get2oo2CurCycleNum(); chSwitchColPos = GetSwitchCollPos(switchId); @@ -16398,7 +17257,7 @@ UINT8 GetSwitchCollToleratePos(const UINT16 switchId) { if (SWITCH_POSITION_SIKAI == chSwitchColPos) { - if (SWITCH_FAULT_STATE_NO == faultFlag) /*板卡无故障*/ + if ((SWITCH_FAULT_STATE_NO == faultFlag) || (REDUN_COLL_YES == cRedunCollCfg)) /*板卡无故障,或具备冗余采集*/ { chSwitch1CollTolerateState = CheckSwitchCollTolerateState(switchId); chSwitch2CollTolerateState = CheckSwitchCollTolerateState(switch2ndId); @@ -18255,6 +19114,7 @@ void SwitchMainControlCmdOut(UINT16 switchId,UINT8 ocId) UINT8 timeCheckRet = 0u; UINT32 chCurCycleNum = 0u; UINT8 ret = CI_ERROR; + UINT16 wThisOcOtherSwitchId = 0u; chCurCycleNum = Get2oo2CurCycleNum(); @@ -18309,6 +19169,36 @@ void SwitchMainControlCmdOut(UINT16 switchId,UINT8 ocId) ret = CI_SUCCESS; } } + if (CI_SUCCESS == ret) + {/*检查和本道岔属于同OC的同块板卡的道岔是否在驱动期间*/ + wThisOcOtherSwitchId = GetSwitchThisOcOtherSwitchId(switchId, ocId); + if (SWITCH_SUM_MAX > wThisOcOtherSwitchId) + {/*可以是0*/ + dwSwitchOutputDrvCmdCycNum = GetSwitchOutputDrvCmdCycNum(wThisOcOtherSwitchId); + if (0U < dwSwitchOutputDrvCmdCycNum) + {/*当前道岔有驱动操作*/ + dwDrvCutMaxCycNum = GetSwitchMachineDrvCutInterval();/*道岔在驱动期间的主控切换间隔时间*/ + timeCheckRet = SystemOverTimeCheck(dwSwitchOutputDrvCmdCycNum, dwDrvCutMaxCycNum); + + if ((CI_TIME_OUT == timeCheckRet) && (0u < dwDrvCutMaxCycNum)) + {/*超时*/ + ret = CI_SUCCESS; + } + else + { + ret = CI_ERROR; + } + } + else + { + ret = CI_SUCCESS; + } + } + else + {/*获取到非法值了*/ + ret = CI_ERROR; + } + } if (CI_SUCCESS == ret) { @@ -18341,8 +19231,6 @@ void SwitchMainControlCmdOut(UINT16 switchId,UINT8 ocId) */ void SwitchDoubleMainProtect(UINT16 switchId) { - UINT8 chSwitchIncludeOcNum = 0U; - UINT8 i = 0U; UINT8 ocId = 0u; UINT8 otherOcId = 0U; UINT8 chOcCotrolMode = 0U; @@ -18350,45 +19238,43 @@ void SwitchDoubleMainProtect(UINT16 switchId) UINT8 chThisOcCmd = 0u; UINT8 chOtherOcCmd = 0u; - chSwitchIncludeOcNum = GetSwitchIncludeOcNum(switchId); - for (i = 0u; i < chSwitchIncludeOcNum; i++) - { - ocId = GetSwitchIncludeOCId(switchId, i); - otherOcId = GetSwitchThisOcOtherOCId(switchId, ocId); - /*获取OC主控状态*/ - chOcCotrolMode = GetSwitchThisOcCotrolMode(switchId, ocId); - chOtherOcCotrolMode = GetSwitchThisOcCotrolMode(switchId, otherOcId); + + ocId = GetSwitchIncludeOCId(switchId, 0u); + otherOcId = GetSwitchThisOcOtherOCId(switchId, ocId); + /*获取OC主控状态*/ + chOcCotrolMode = GetSwitchThisOcCotrolMode(switchId, ocId); + chOtherOcCotrolMode = GetSwitchThisOcCotrolMode(switchId, otherOcId); - if ((MAIN_CONTROL == chOcCotrolMode) || (ERR_MODE_CONTROL == chOcCotrolMode)) - {/*本OC有任意板卡主控*/ - if ((MAIN_CONTROL == chOtherOcCotrolMode) || (ERR_MODE_CONTROL == chOtherOcCotrolMode)) - {/*另一OC任意板卡主控*/ + if ((MAIN_CONTROL == chOcCotrolMode) || (ERR_MODE_CONTROL == chOcCotrolMode)) + {/*本OC有任意板卡主控*/ + if ((MAIN_CONTROL == chOtherOcCotrolMode) || (ERR_MODE_CONTROL == chOtherOcCotrolMode)) + {/*另一OC任意板卡主控*/ - /*输出本OC备控、另一OC备控*/ - SetSwitchThisOcOutControlCmd(switchId, ocId, STANDBY_CONTROL); - SetSwitchThisOcOutControlCmd(switchId, otherOcId, STANDBY_CONTROL); - } - else - { - /*无处理*/ - } + /*输出本OC备控、另一OC备控*/ + SetSwitchThisOcOutControlCmd(switchId, ocId, STANDBY_CONTROL); + SetSwitchThisOcOutControlCmd(switchId, otherOcId, STANDBY_CONTROL); } else { /*无处理*/ } - - /*本OC和另一OC均输出双主,则输出备控命令*/ - chThisOcCmd = GetSwitchThisOcOutControlCmd(switchId, ocId); - chOtherOcCmd = GetSwitchThisOcOutControlCmd(switchId, otherOcId); - if ((MAIN_CONTROL == chThisOcCmd) && (MAIN_CONTROL == chOtherOcCmd)) - { - /*输出本OC备控、另一OC备控*/ - SetSwitchThisOcOutControlCmd(switchId, ocId, STANDBY_CONTROL); - SetSwitchThisOcOutControlCmd(switchId, otherOcId, STANDBY_CONTROL); - } - } + else + { + /*无处理*/ + } + + /*本OC和另一OC均输出双主,则输出备控命令*/ + chThisOcCmd = GetSwitchThisOcOutControlCmd(switchId, ocId); + chOtherOcCmd = GetSwitchThisOcOutControlCmd(switchId, otherOcId); + if ((MAIN_CONTROL == chThisOcCmd) && (MAIN_CONTROL == chOtherOcCmd)) + { + /*输出本OC备控、另一OC备控*/ + SetSwitchThisOcOutControlCmd(switchId, ocId, STANDBY_CONTROL); + SetSwitchThisOcOutControlCmd(switchId, otherOcId, STANDBY_CONTROL); + } + + } @@ -18415,7 +19301,7 @@ void FindSwitchPostionCmdOut(UINT16 switchId) mainOcId = GetSwitchMainCotrolOCId(switchId);/*获取主控OCID*/ chSwitchIncludeOcNum = GetSwitchIncludeOcNum(switchId); - chSwitchColPos = GetSwitchCollPos(switchId); + chSwitchColPos = GetSingleSwitchCurPosition(switchId); if (0u == mainOcId) {/*当前无主控*/ if ((SWITCH_POSITION_DINGWEI != chSwitchColPos) && (SWITCH_POSITION_FANWEI != chSwitchColPos)) @@ -18463,58 +19349,80 @@ void FindSwitchPostionCmdOut(UINT16 switchId) } } else - {/*有主控*/ - if ((SWITCH_POSITION_DINGWEI == chSwitchColPos) || (SWITCH_POSITION_FANWEI == chSwitchColPos)) - {/*定位或反位*/ - SetSwitchThisOcFindPostionCmd(switchId, mainOcId, NO_FIND_CMD); - SetSwitchThisOcFindCmdCycNum(switchId, mainOcId, 0u); + {/*有主控,不寻表示了*/ + + SetSwitchThisOcFindPostionCmd(switchId, mainOcId, NO_FIND_CMD); + SetSwitchThisOcFindCmdCycNum(switchId, mainOcId, 0u); - otherOcId = GetSwitchThisOcOtherOCId(switchId, mainOcId); - SetSwitchThisOcFindPostionCmd(switchId, otherOcId, NO_FIND_CMD); - SetSwitchThisOcFindCmdCycNum(switchId, otherOcId, 0u); - } - else - {/*保持之前的输出*/ - } + otherOcId = GetSwitchThisOcOtherOCId(switchId, mainOcId); + SetSwitchThisOcFindPostionCmd(switchId, otherOcId, NO_FIND_CMD); + SetSwitchThisOcFindCmdCycNum(switchId, otherOcId, 0u); + } - - /*寻表示超时检测模块*/ - FindSwitchPostionCmdTimeOutCheck(switchId); - } /* -* 功能描述:道岔寻表超时检测模块 -* 参数说明: UINT16 switchId 道岔ID -* 返回值 : void -* add by mpt 20260330 +* 功能描述: 更新倒切柜状态 +* 参数说明: void +* 返回值 : 无 +* Create Fan 20260608 */ -void FindSwitchPostionCmdTimeOutCheck(UINT16 switchId) +void ReverseStateUpdateProc(void) { - UINT32 dwOcFindCmdCycNum = 0u; - UINT8 chSwitchIncludeOcNum = 0u; - UINT8 i = 0u; - UINT8 ocId = 0u; - UINT8 chThisOcFindPostionCmd = 0u; - UINT32 dwSwitchDriveCyc = 0u; - UINT8 timeCheckRet = 0u; - - dwSwitchDriveCyc = GetSystemParaSwitchDriveCyc(); - chSwitchIncludeOcNum = GetSwitchIncludeOcNum(switchId); - - for (i = 0u; i < chSwitchIncludeOcNum; i++) + UINT16 ii = 0u; /*游标*/ + UINT16 wOpenRelay = 0U;/*常开采集继电器*/ + UINT16 wCloseRelay = 0U; /*常闭采集继电器*/ + UINT8 chReverseOpenState = 0U;/*常开采集结果*/ + UINT8 chReverseCloseState = 0U;/*常闭采集结果*/ + UINT16 wBoardNum = 0U;/*板卡个数*/ + wOpenRelay = GetReverseSwitchOpenRelay(); + wCloseRelay = GetReverseSwitchCloseRelay(); + if ((0U == wOpenRelay) || (0U == wCloseRelay)) { - ocId = GetSwitchIncludeOCId(switchId, i); - chThisOcFindPostionCmd = GetSwitchThisOcFindPostionCmd(switchId, ocId); - if (NO_FIND_CMD != chThisOcFindPostionCmd) - {/*当前有寻表命令*/ - dwOcFindCmdCycNum = GetSwitchThisOcFindCmdCycNum(switchId, ocId); + /*认为未配置倒切继电器 设置状态为本联锁控*/ + SetReverseSwitchState(REVERSE_STATE_NEW_SYSTEM); + for (ii = 0U; ii < REVERSE_BOARD_SUM_MAX ; ii++) + { + SetReverseBoardState(REVERSE_STATE_NEW_SYSTEM, ii); + } + } + else + { + chReverseOpenState = GetRelayCollState(wOpenRelay); + chReverseCloseState = GetRelayCollState(wCloseRelay); + if ((RELAY_STATE_UP == chReverseOpenState)&&(RELAY_STATE_DOWN == chReverseCloseState)) + { + SetReverseSwitchState(REVERSE_STATE_NEW_SYSTEM); + } + else if ((RELAY_STATE_DOWN == chReverseOpenState) && (RELAY_STATE_UP == chReverseCloseState)) + { + SetReverseSwitchState(REVERSE_STATE_OLD_SYSTEM); + } + else + { + SetReverseSwitchState(REVERSE_STATE_ABNORMAL);/*异常状态*/ + } - timeCheckRet = SystemOverTimeCheck(dwOcFindCmdCycNum, dwSwitchDriveCyc); - if ((CI_TIME_OUT == timeCheckRet)&&(0uOcDevices[jj].szSwitchIncldeZzjState[chSwitchZzjIndex] = OC_SWITCH_POSITION_SIKAI; } - for (kk = 0u; kk < MAX_OC_SWITCH_INCLUDE_BOARD_NUM; kk++) + for (mm = 0u; mm < MAX_OC_SWITCH_INCLUDE_BOARD_NUM; mm++) { - pTempOc->OcDevices[jj].MainStandbyState[kk] = STANDBY_CONTROL;/*备控制权*/ + pTempOc->OcDevices[jj].MainStandbyState[mm] = STANDBY_CONTROL;/*备控制权*/ } } @@ -1071,20 +1076,20 @@ void ProcessOcToCiData(void) m_Switches[jj].MainStandbyState[j] = STANDBY_CONTROL;/*备控*/ } - SetSwitchOcPlusBoxSateState(m_Switches[jj].DeviceId, pTempOc->OcId, SWITCH_BOX_FAULT);/*道岔插箱故障*/ + SetSwitchOcPlusBoxSateState(m_Switches[jj].DeviceId, (UINT8)pTempOc->OcId, SWITCH_BOX_FAULT);/*道岔插箱故障*/ /*重置板卡为故障状态*/ for (j = 0U; j < MAX_OC_SWITCH_INCLUDE_BOARD_NUM; j++) { - SetSwitchThisOCBoardState(m_Switches[jj].DeviceId, m_Switches[jj].OcId, m_Switches[jj].BoardAddr[j], 0xffU); + SetSwitchThisOCBoardState(m_Switches[jj].DeviceId, (UINT8)m_Switches[jj].OcId, m_Switches[jj].BoardAddr[j], 0xffU); } /*通信中断降状态为备控并设置周期号*/ - chThisOcCotrolMode = GetSwitchThisOcCotrolMode(m_Switches[jj].DeviceId, pTempOc->OcId); + chThisOcCotrolMode = GetSwitchThisOcCotrolMode(m_Switches[jj].DeviceId, (UINT8)pTempOc->OcId); if ((MAIN_CONTROL == chThisOcCotrolMode) || (ERR_MODE_CONTROL == chThisOcCotrolMode)) {/*主控或异常控*/ - SetSwitchThisOcCotrolMode(m_Switches[jj].DeviceId, pTempOc->OcId, STANDBY_CONTROL); - SetSwitchOutMainContrCmdCycNum(m_Switches[jj].DeviceId, pTempOc->OcId, curCycle);/*在通信中断当周期设置OC备控,并刷新周期号,其他OC做升主控操作时需延时一定时间*/ + SetSwitchThisOcCotrolMode(m_Switches[jj].DeviceId, (UINT8)pTempOc->OcId, STANDBY_CONTROL); + SetSwitchOutMainContrCmdCycNum(m_Switches[jj].DeviceId, (UINT8)pTempOc->OcId, curCycle);/*在通信中断当周期设置OC备控,并刷新周期号,其他OC做升主控操作时需延时一定时间*/ } } @@ -1382,7 +1387,7 @@ void ProcessZcToCiData(void) sourceIdBuf = GetCiTransmitSpecifySysDevBuf(CI_SYSTEM_TYPE_ZC);/*获取与本联锁通信的ZC的ID,目前一个联锁最多只与一个ZC通信*/ - if (sourceIdBuf != NULL) + if (NULL != sourceIdBuf) { /*更新与ZC通信状态*/ (void)UpdateCiTransmitState(localCiId, CI_SYSTEM_TYPE_ZC, sourceIdBuf[0]); @@ -1391,11 +1396,11 @@ void ProcessZcToCiData(void) hLHTHeadCtxValid = GetHLHTHeadCtxValid(CI_SYSTEM_TYPE_ZC, sourceIdBuf[0]); if (CI_ERROR == hLHTHeadCtxValid) /*不使用GetZcMaskZcId()来获取ZC ID,因为组包完给ZC数据就清空了*/ { - dataValidFlag = 0u; + dataValidFlag = 0U; } else {/*消息有效*/ - dataValidFlag = 1u; + dataValidFlag = 1U; } debug_infor_printf((const)"\n CurCycle:%d ZcCiValidFlag:%d \n",curCycle,dataValidFlag); @@ -1405,7 +1410,7 @@ void ProcessZcToCiData(void) secJumpLockDelayUnlockCount = GetSysParaSecJLokDelayUnlockCyc();/*获取区段跳跃延时解锁周期数*/ - if ((0u == zcMaskValueLen) || (NULL == pZcMaskValueBuf)) + if ((0U == zcMaskValueLen) || (NULL == pZcMaskValueBuf)) {/*未收到zc发送过来的码位数据*/ /*if (GetCiTransmitState(CI_SYSTEM_TYPE_ZC, 0u) != TRANSMIT_STATE_GOOD)*/ @@ -1573,7 +1578,7 @@ void ProcessZcToCiData(void) } } - if (reVal == CI_SUCCESS) + if (CI_SUCCESS == reVal) { /*与ZC通信恢复后,倒计时立即结束,维持动态测试防护锁闭状态*/ phySecCurSum = GetPhySecCurSum(); @@ -1603,7 +1608,7 @@ void ProcessZcToCiData(void) } /*处理ZC发送的临时限速信息*/ - if (reVal == CI_SUCCESS) + if (CI_SUCCESS == reVal) { cTsrSureFlag = GetTsrSureFlag(); pZcToCiDataStru = GetZcToCiDataStru(); @@ -1627,7 +1632,7 @@ void ProcessZcToCiData(void) } /*处理ZC发送的紧急制动信息*/ - if (reVal == CI_SUCCESS) + if (CI_SUCCESS == reVal) { if (NULL != pZcToCiDataStru) { @@ -1647,12 +1652,10 @@ void ProcessZcToCiData(void) } } - /*此处不再处理ZC发送的雨雪信息,转至融合处处理*/ - /*处理ZC发送的雨雪模式信息*/ - if (reVal == CI_SUCCESS) + if (CI_SUCCESS == reVal) { - if ((1u == dataValidFlag)&&(ZC_TSR_VALID == pZcToCiDataStru->tsrInputInfoStru.cTsrValidFlag)) + if (1U == dataValidFlag) { if ((CI_ALL_SNOW_VALID == pZcToCiDataStru->cSnowValidFlag) || (CI_ALL_SNOW_UNVALID == pZcToCiDataStru->cSnowValidFlag)) { @@ -1674,7 +1677,7 @@ void ProcessZcToCiData(void) /*处理ZC发送的ITE全线切除信息*/ - if (reVal == CI_SUCCESS) + if (CI_SUCCESS == reVal) { if ((1u == dataValidFlag) && (ZC_TSR_VALID == pZcToCiDataStru->tsrInputInfoStru.cTsrValidFlag) && ((CI_ITE_LINE_CUT_VALID == pZcToCiDataStru->cIteLineCutState) || (CI_ITE_LINE_CUT_INVALID == pZcToCiDataStru->cIteLineCutState) || (CI_ITE_LINE_CUT_DEFAULT == pZcToCiDataStru->cIteLineCutState))) @@ -1699,9 +1702,16 @@ void ProcessZcToCiData(void) { if ((1u == dataValidFlag) && (ALL_CBTC_CROSS_SUM_MAX >= pZcToCiDataStru->wCbtcCrossNum)) { - /*设置*/ - SetCbtcCrossInfo(pZcToCiDataStru->wCbtcCrossNum, - pZcToCiDataStru->wCbtcCrossSignalId, pZcToCiDataStru->wCbtcCrossTrainId); + /*当周期收到CBTC跨压帧时,设置CBTC跨压全局变量*/ + if (CI_SUCCESS == pZcToCiDataStru->cRecvCbtcCrossFrameTag) + { + SetCbtcCrossInfo(pZcToCiDataStru->wCbtcCrossNum, + pZcToCiDataStru->wCbtcCrossSignalId, pZcToCiDataStru->wCbtcCrossTrainId); + } + else + { + /*nothing*/ + } } else { @@ -1731,7 +1741,11 @@ void ProcessTmcToTiocData(void) UINT8* deviceIdBuf = NULL; UINT8 ii = 0u; UINT8 cTransState = 0U; /*与TMC通信状态*/ + UINT8 chWorkType = 0U; /*双系工作模式*/ + UINT8 cRcWorkMode = 0u;/*RC工作模式*/ + chWorkType = GetSystemWorkType(); + cRcWorkMode = GetLocalRcWorkMode(); /*手动更新TMC通信状态*/ cLocalTiocId = GetSystemParaLocalCiId(); deviceSum = GetCiTransmitSpecifySysDevSum(CI_SYSTEM_TYPE_TMC); /*获取通信TMC设备总数*/ @@ -1754,6 +1768,10 @@ void ProcessTmcToTiocData(void) else { ClearLineCommTrainData(); /*与TMC通信中断,清除本地存储的全线通信车信息*/ + if ((SYSTEM_WORK_MODE_ALL == chWorkType) && (RC_WORK_MODE_TIOC == cRcWorkMode)) + { + SetTsrSureFlag(CI_TSR_SURE_NO); + } } } else @@ -1858,7 +1876,6 @@ void ProcessVobcToCiData(void) { UINT8 ii = 0u; UINT8 jj = 0u; - UINT8 kk = 0u; UINT8 vobcToCiDataSum = GetVobcToCiSum(); VobcToCiDataStruct* vobcToCiDataStru = GetVobcToCiDataStru(); UINT8 chLineIdentity = GetCiFunctionSwitchConfig(VOBC_INTERFACE_IDENTITY);/*获取线路标识*/ @@ -1917,7 +1934,7 @@ void ProcessVobcToCiData(void) for (jj = 0u; ((jj < vobcToCiDataStru[ii].PsdSum) && (jj < VOBC_TO_CI_TRAIN_PSD_MAX)); jj++) { /*由于新机场线VOBC和CI一直通信,导致故障隔离信息无法清除,故在此检查收到最后一次VOBC的控制命令是否超时*/ - if ((dwCurCycNum - vobcToCiDataStru[ii].PsdData[kk].CmdStartCycNum) > dwTransmitBadEnsureCount) + if ((dwCurCycNum - vobcToCiDataStru[ii].PsdData[jj].CmdStartCycNum) > dwTransmitBadEnsureCount) { ClearPsdVobcContext(vobcToCiDataStru[ii].VobcId); break; @@ -2002,6 +2019,22 @@ void ProcessVobcToCiData(void) } else if ((LINE_HLHT == chLineIdentity) || (LINE_FAO == chLineIdentity)) { + /*厦门3处理列车非零速信息*/ + if (CI_VOBC_TRAIN_ZERO_SPEED_NO == VobcToCiDataStru[ii].chTrainZeroState) + {/*列车非零速*/ + SetTrainZeroSpeedState(vobcToCiDataStru[ii].PsdData[jj].PsdId, PSD_TRAIN_ZERO_SPEED_NO); /*设置列车非零速*/ + SetStopDetectionState(vobcToCiDataStru[ii].PsdData[jj].PsdId, JXTC_STOP_DETECTION_NO); /*设置屏蔽门未停止间隙探测*/ + } + else if (CI_VOBC_TRAIN_ZERO_SPEED_YES == VobcToCiDataStru[ii].chTrainZeroState) + {/*列车零速*/ + SetTrainZeroSpeedState(vobcToCiDataStru[ii].PsdData[jj].PsdId, PSD_TRAIN_ZERO_SPEED_YES); /*设置列车零速*/ + SetStopDetectionState(vobcToCiDataStru[ii].PsdData[jj].PsdId, JXTC_STOP_DETECTION_NO); /*设置屏蔽门未停止间隙探测*/ + } + else + { + /*没有非零速信息时,不处理*/ + } + switch (vobcToCiDataStru[ii].PsdData[jj].CmdType) { case VOBCTOCI_COMMAND_TYPE_PSDOPEN: @@ -2037,7 +2070,7 @@ void ProcessVobcToCiData(void) default: /*查询命令或错误命令*/ break; - } + } } else { @@ -4533,6 +4566,42 @@ UINT8 ProcessAtsOrXianDiToCiData(void) (void)CancelPsdExceptState(CmdDeviceId); } break; + case ATS_CMD_CONNECT_ROUTE_RELEASE_ONE: /*联络线接车进路解锁一次*/ + belongVirCIid = GetRouteBelongVirCiId(CmdDeviceId); + OrderCheckReVal = CheckOrderWhetherDoing(virCiID, belongVirCIid, cmdType, CmdDeviceId); + if (CI_SUCCESS == OrderCheckReVal) + { + checkRetVal = AFFIRM_SUCCESS; + } + else + { + checkRetVal = AFFIRM_FAIL; + } + SetCiSendCmdBackData_OrderBack(commandId, CmdDeviceId, cmdDevType, terminalId, AtsOrXianDiToCiCmdStru[ii].CommandType, RESPONSE_FIRST, checkRetVal, virCiID); + break; + case ATS_CMD_CONNECT_ROUTE_RELEASE_TWO: /*联络线接车进路解锁二次*/ + checkRetVal = CheckSecondOrderValid(commandId, CmdDeviceId, cmdDevType, terminalId, AtsOrXianDiToCiCmdStru[ii].CommandType, virCiID); + if (CI_SUCCESS == checkRetVal) + { + belongVirCIid = GetRouteBelongVirCiId(CmdDeviceId); + OrderCheckReVal = CheckOrderWhetherDoing(virCiID, belongVirCIid, cmdType, CmdDeviceId); + if (CI_SUCCESS == OrderCheckReVal) + { + checkRetVal = AFFIRM_SUCCESS; + /*联络线接车进路解锁处理*/ + ConnectRouteReleaseManage(CmdDeviceId); + } + else + { + checkRetVal = AFFIRM_FAIL; + } + } + else + { + checkRetVal = AFFIRM_FAIL; + } + SetCiSendCmdBackData_OrderBack(commandId, CmdDeviceId, cmdDevType, terminalId, AtsOrXianDiToCiCmdStru[ii].CommandType, RESPONSE_SECOND, checkRetVal, virCiID); + break; default: localVirCiType = GetLocalVirCiType(virCiID); if (CI_TYPE_SCX == localVirCiType) @@ -4890,7 +4959,7 @@ void ProcessDeviceLogicState(void) (void)GaragedoorRelayToDevStaProc(); /*洗车机处理*/ - (void)WashMachineToDeviceStateProc(); + WashMachineToDeviceStateProc(); /*防淹门处理*/ FloodGateRelayToDeviceStateProc(); @@ -4903,6 +4972,9 @@ void ProcessDeviceLogicState(void) /*倒切设备继电器处理*/ RvrsCutRlyToDvicSttPrc(); } + + /*倒切柜的倒切开关/板卡采集状态更新*/ + ReverseStateUpdateProc(); } @@ -5224,6 +5296,7 @@ UINT8 MaskDataProcess(const UINT8 systemType,const UINT8* maskBuf, const UINT16 /*不设置无效,进路状态处理设置*/ } break; + } break; @@ -5318,7 +5391,7 @@ UINT8 MaskDataProcess(const UINT8 systemType,const UINT8* maskBuf, const UINT16 */ void ProcessCiToCiData(void) { - UINT8 localCiId = GetSystemParaLocalCiId(); /*本地联锁ID*/ + UINT8 chLocalCiId = 0U; /*本地联锁ID*/ UINT8 jj = 0U; UINT8 tranCiNum = 0U; UINT8* tranCiIdBuf = NULL; @@ -5327,7 +5400,7 @@ void ProcessCiToCiData(void) UINT8 chMainMode = CI_SYSTEM_TYPE_RCI;/*主用模式*/ UINT8 chSystemType = GetSystemWorkType(); UINT8 chRcTransState = 0U;/*只判断Rc通信*/ - + chLocalCiId = GetSystemParaLocalCiId(); /*如果相邻联锁通信中断则重置数据 通信关闭*/ if (SYSTEM_WORK_MODE_ALL == chSystemType) { @@ -5341,17 +5414,17 @@ void ProcessCiToCiData(void) tranCiIdBuf = GetCiTransmitSpecifySysDevBuf(CI_SYSTEM_TYPE_RCI); } - - for (jj = 0u;jjheadWashStopSteadyInfo) && (WASHMACHINE_TAIL_STEADY_NO == vobcToCiDataStru->tailWashStopSteadyInfo) && (PASS_WASHMACHINE_REQUEST_INVALID == vobcToCiDataStru->passWashMachineRequest) - && (PAUSE_TRAIN_WASH_REQUEST_INVALID == vobcToCiDataStru->washPauseRequest)) + && (PAUSE_TRAIN_WASH_REQUEST_INVALID == vobcToCiDataStru->washPauseRequest) + && (WASHMACHINE_COUPING_STEADY_NO == vobcToCiDataStru->couplingWashStopSteadyInfo)) {/*所有洗车命令均无效认为无洗车请求或洗车作业完毕*/ SetWashMachineCurVobcID(washMachineId, 0u);/*清除当前洗车的VOBC ID*/ /*清除洗车机的相关驱动状态*/ @@ -8389,6 +8483,7 @@ static void HLHTFAOVOBCDataProc(VobcToCiDataStruct* vobcToCiDataStru) SetPauseTrainWashRequestDrvSta(washMachineId, WASHMACHINE_PAUSE_DRVREQ_FALSE); SetPassWashMachineReqtDrvSta(washMachineId, PASS_WASHMACHINE_DRVREQ_FALSE); SetWashMachineWorkModeDrvState(washMachineId, WASHMACHINE_WORKMODE_INVALID_DRV); + SetCoupingStopSteadyDrvState(washMachineId, WASHMACHINE_COUPING_STEADY_NO); } else { @@ -8434,6 +8529,21 @@ static void HLHTFAOVOBCDataProc(VobcToCiDataStruct* vobcToCiDataStru) } } + if (WASHMACHINE_COUPING_STEADY_YES == vobcToCiDataStru->couplingWashStopSteadyInfo) + {/*联挂端停稳请求有效*/ + if (1U == washMachineCurSum) + { + SetCoupingStopSteadyDrvState(washMachineId, WASHMACHINE_COUPING_STEADY_YES); + } + } + else + { + if (1U == washMachineCurSum) + { + SetCoupingStopSteadyDrvState(washMachineId, WASHMACHINE_COUPING_STEADY_NO); + } + } + if (WASHMACHINE_TAIL_STEADY_YES == vobcToCiDataStru->tailWashStopSteadyInfo) {/*尾端停稳请求有效*/ if (1U == washMachineCurSum) @@ -8493,6 +8603,7 @@ static void HLHTFAOVOBCDataProc(VobcToCiDataStruct* vobcToCiDataStru) SetPauseTrainWashRequestDrvSta(washMachineId, WASHMACHINE_PAUSE_DRVREQ_FALSE); SetPassWashMachineReqtDrvSta(washMachineId, PASS_WASHMACHINE_DRVREQ_FALSE); SetWashMachineWorkModeDrvState(washMachineId, WASHMACHINE_WORKMODE_INVALID_DRV); + SetCoupingStopSteadyDrvState(washMachineId, WASHMACHINE_COUPING_STEADY_NO); } } } @@ -10004,17 +10115,7 @@ static void SetIvocWashDriveState(VobcToCiDataStruct* vobcToCiDataStru,const UIN { SetTrainTailStopSteadyDrvState(washMachineId, WASHMACHINE_TAIL_STEADY_NO); } - - if (WASHMACHINE_COUPING_STEADY_YES == vobcToCiDataStru->couplingWashStopSteadyInfo) - { - /*尾端停稳请求有效*/ - SetCoupingStopSteadyDrvState(washMachineId, WASHMACHINE_TAIL_STEADY_YES); - } - else - { - SetCoupingStopSteadyDrvState(washMachineId, WASHMACHINE_TAIL_STEADY_NO); - } - + if (WASHMACHINE_PAUSE_DRVREQ_TRUE == vobcToCiDataStru->washPauseRequest) { /*暂停洗车请求有效*/ @@ -11036,7 +11137,7 @@ void RouteSecLockApplyCmdProc(const UINT16 wCurRLockRouteId, const UINT16 wPreRL pstLgcResInfo = GetLogSecTrainInfo(pLogIdBuff[ii]); if (NULL != pstLgcResInfo) { - (void)ComMemCopy(pstLgcResInfo, stTmpResInfo, (UINT16)(sizeof(LogicTrainResStruct) * LOGIC_SECTION_RES_SUM_MAX)); + (void)CommonMemCpy(pstLgcResInfo, (UINT32)((sizeof(LogicTrainResStruct)) * LOGIC_SECTION_RES_SUM_MAX),stTmpResInfo, (UINT32)((sizeof(LogicTrainResStruct)) * LOGIC_SECTION_RES_SUM_MAX)); SetLogSecLockState(pLogIdBuff[ii], LOG_SECTION_LOCK_NO, validRouteId, 0U);/*设置区段锁闭所属之前进路未锁闭*/ /*设置区段属于当前进路锁闭*/ SetLogSecLockState(pLogIdBuff[ii], LOG_SECTION_LOCK_NORMAL, wCurRLockRouteId, chRouteDir); @@ -11116,7 +11217,7 @@ void LogRouteCleanOldLogSecLockProc(const UINT16 wPreRouteId) pstLgcResInfo = GetLogSecTrainInfo(pLogSecIdBuff[ii]); if (NULL != pstLgcResInfo) { - (void)ComMemCopy(pstLgcResInfo, stTmpResInfo, (UINT16)(sizeof(LogicTrainResStruct) * LOGIC_SECTION_RES_SUM_MAX)); + (void)CommonMemCpy(pstLgcResInfo, (UINT32)(sizeof(LogicTrainResStruct) * LOGIC_SECTION_RES_SUM_MAX), stTmpResInfo, (UINT32)(sizeof(LogicTrainResStruct) * LOGIC_SECTION_RES_SUM_MAX)); SetLogSecLockState(pLogSecIdBuff[ii], LOG_SECTION_LOCK_NO, wValidRouteId, 0U); /*设置区段锁闭所属之前进路未锁闭*/ CpyLgcSecResTrain(pLogSecIdBuff[ii], cResTrainSum, stTmpResInfo); /*拷贝逻辑区段列车资源信息*/ @@ -11781,17 +11882,23 @@ void OverlapUnlockApplyDeal(void) } else { - ; /*最接近的车获取失败,不向IVOC申请保护区段解锁*/ + /*最接近的车获取失败,不向IVOC申请保护区段解锁*/ + SetOverlapUnlockApplyTrainId(wOverlapId, 0U); + SetReqIvocUnlockStartCycNum(wOverlapId, 0U); } } else { - ; /*保护区段无锁闭所属进路不处理向IVOC申请保护区段解锁*/ + /*保护区段无锁闭所属进路不处理向IVOC申请保护区段解锁*/ + SetOverlapUnlockApplyTrainId(wOverlapId, 0U); + SetReqIvocUnlockStartCycNum(wOverlapId, 0U); } } else { - ; /*未申请保护区段解锁,RC不向IVOC申请保护区段解锁*/ + /*未申请保护区段解锁,RC不向IVOC申请保护区段解锁*/ + SetOverlapUnlockApplyTrainId(wOverlapId, 0U); + SetReqIvocUnlockStartCycNum(wOverlapId, 0U); } } else @@ -12498,7 +12605,8 @@ void SignalTrainCrossPro(void) } else { - /*非TACS主控,不记录列车ID*/ + /*非TACS主控,不设置跨压和列车ID*/ + cSignalCrossState = SIGNAL_CROSS_STATE_NO; } } else @@ -12751,10 +12859,13 @@ void ProcessIvocToRCData(void) { /*不处于MMI本地湿轨,不处理*/ } + + SetPbtacsTrainTransState(pIvocToRcDataStru[ii].VobcId, TRAIN_COMM_STATE_GOOD); /*设置与PBTACS车通信正常*/ } else { - + SetPbtacsTrainTransState(pIvocToRcDataStru[ii].VobcId, TRAIN_COMM_STATE_BAD); /*设置与PBTACS车通信中断(暂不考虑分界点列车的通信状态)*/ + /*从PSD数据中删除该VOBC产生的上下文信息*/ ClearPsdVobcContext(pIvocToRcDataStru[ii].VobcId); ProcessIvocLoseCom(pIvocToRcDataStru[ii]); @@ -12803,8 +12914,6 @@ static void ClearPsdData(const UINT16 psdId) UINT8 psdSum = 0u; UINT16 platformPsdId = 0u; UINT8 chRcWorkMode = 0u; - - chRcWorkMode = GetLocalRcWorkMode(); bufIndex = GetPsdConfigBufIndex(psdId); if ((0u != psdId) && (PSD_INVALID_ID != psdId)&&(PSD_SUM_MAX > bufIndex)) @@ -12815,8 +12924,7 @@ static void ClearPsdData(const UINT16 psdId) PsdDataStru[bufIndex].PsdCmd = PSD_DEFAULT_CONTROL_CMD; PsdDataStru[bufIndex].VOBCDoorState = PSD_DOOR_CLOSEDANDLOCKED_INVALID; PsdDataStru[bufIndex].psdEditGroupInfo = 0u;/*清除编组信息*/ - - + if (RC_WORK_MODE_TIOC == chRcWorkMode) { SetPsdEditGroupInfoDataCC(psdId, PSD_EDIT_GROUP_DEFAULT); /*设置RC的PSD编组信息为默认值*/ diff --git a/TSCP/src/APP/ciapp/IO/OutputDataProcess.c b/TSCP/src/APP/ciapp/IO/OutputDataProcess.c index a133410..d37fbb8 100644 --- a/TSCP/src/APP/ciapp/IO/OutputDataProcess.c +++ b/TSCP/src/APP/ciapp/IO/OutputDataProcess.c @@ -160,7 +160,7 @@ void OutputDataProcess(void) (void)PsdDeviceToRelayStateProc(); /*更新洗车机继电器状态*/ - (void)WashMachineDevToRelayStaProc(); + WashMachineDevToRelayStaProc(); /*更新计轴复位继电器状态*/ /*虚拟联锁兼容*/ @@ -400,6 +400,10 @@ UINT8 GetAtsBackInfoParam(const UINT8 functionId,const UINT8 deviceStateType, co case ETYPE_COUPLINK_ROUTE_IDLE: returnValue = CI_BACK_COUPLINK_ROUTE_IDLE; /*联挂进路内无被联挂车*/ break; + case ETYPE_CONNECT_ROUTE_RELEASE: + returnValue = CI_BACK_CONNECT_ROUTE_RELEASE; /*联络线接车进路解锁条件不满足*/ + break; + /*信号机故障反馈*/ case ETYPE_SIG_START_OPEN_STATE: @@ -1890,6 +1894,30 @@ void IndicatorStateProc(void) } } + else if (INDICATOR_TYPE_XDC_DCGDJ == devType) + { /*蓄电池电池供电*/ + + devRelaySum = GetIndicatorRelaySum(devId); /*获取相关继电器总数*/ + devRelayIdBuf = GetIndicatorRelayIdBuf(devId); /*获取相关继电器ID buf*/ + + if ((0U == devRelaySum) || (NULL == devRelayIdBuf)) + { + SetIndicatorState(devId, INDICATOR_SHOW_YES); /*设置红灯报警*/ + } + else + { + relayCollState = GetRelayCollState(devRelayIdBuf[0]); + if (RELAY_STATE_DOWN == relayCollState) + { /*继电器落下*/ + + SetIndicatorState(devId, INDICATOR_SHOW_NO); /*设置绿灯*/ + } + else + { + SetIndicatorState(devId, INDICATOR_SHOW_YES); /*设置红灯*/ + } + } + } else if (INDICATOR_TYPE_PORT_RONGSI == devType) { devRelaySum = GetIndicatorRelaySum(devId); /*获取相关继电器总数*/ @@ -3549,7 +3577,7 @@ void NonRouteRelayStateProc(void) UINT8 interfaceType = FUNC_SWITCH_UNDEF;/*试车线与车辆段接口类型*/ UINT8 i = 0u; UINT16 agreeTryTrainRelayId = 0u;/*同意试车继电器ID*/ - UINT16 wColWaysideTryTrainIndRelayId = 0u;/*轨旁试车指示器继电器ID*/ + UINT16 wColWaysideTryTrainIndRelayId = 0U;/*轨旁试车指示器继电器ID*/ NonRouteDataStruct* pNonRoute = NULL; UINT8 localCiId = 0U; /*本联锁ID*/ UINT8 nonRouteBelongCiId = 0U; /*非进路所属联锁ID*/ @@ -3591,7 +3619,7 @@ void NonRouteRelayStateProc(void) /*不处理*/ } wColWaysideTryTrainIndRelayId = GetWaysideTryTrainIndRelayId(pNonRoute->NonRouteId); - if (0 != wColWaysideTryTrainIndRelayId) + if (0U != wColWaysideTryTrainIndRelayId) { /*设置轨旁试车指示器继电器吸起*/ (void)SetRelayDriveState(wColWaysideTryTrainIndRelayId, RELAY_DRIVE_STATE_UP); @@ -3621,7 +3649,7 @@ void NonRouteRelayStateProc(void) ; /*不处理*/ } wColWaysideTryTrainIndRelayId = GetWaysideTryTrainIndRelayId(pNonRoute->NonRouteId); - if (0 != wColWaysideTryTrainIndRelayId) + if (0U != wColWaysideTryTrainIndRelayId) { /*设置轨旁试车指示器继电器落下*/ (void)SetRelayDriveState(wColWaysideTryTrainIndRelayId, RELAY_DRIVE_STATE_DOWN); @@ -4965,7 +4993,7 @@ UINT16 GetOverlapUnlockBackTime(const UINT16 overlapId, UINT16 OverlapUnLockCoun /*自动解锁倒计时*/ deltCount = (INT32)(curCycleNum - startCycNum); - if((deltCount >= 0) && (deltCount <= (INT32)OverlapUnLockCount))/*倒计时数值在合理范围内*/ + if((deltCount >= 0U) && (deltCount <= (INT32)OverlapUnLockCount))/*倒计时数值在合理范围内*/ { autotimeData = (UINT16)(((OverlapUnLockCount + startCycNum - curCycleNum)* appCycTime)/1000U) ; } @@ -4979,7 +5007,7 @@ UINT16 GetOverlapUnlockBackTime(const UINT16 overlapId, UINT16 OverlapUnLockCoun { deltCount = (INT32)(curCycleNum - laborUnlockStartCycNum); laborUnlockOverlapTimeCount =GetlabarUnlockOverlapTimeCount(); - if((deltCount >= 0) && (deltCount <= (INT32)laborUnlockOverlapTimeCount))/*倒计时数值在合理范围内*/ + if((deltCount >= 0U) && (deltCount <= (INT32)laborUnlockOverlapTimeCount))/*倒计时数值在合理范围内*/ { labortimeData = (UINT16)(((laborUnlockOverlapTimeCount + laborUnlockStartCycNum- curCycleNum)* appCycTime)/1000U) ; @@ -8254,7 +8282,6 @@ void SetSCApplyIndicator(const UINT16 wIndicatorId) UINT8 chRtuCiType = 0U; /*虚拟联锁类型*/ UINT8 chIndicatorRtuId = 0U; /*虚拟联锁ID*/ UINT8 chinterfaceType = 0U; /*试车线与车辆段接口方式*/ - UINT16 wApplyId = 0U; /*申请试车灯ID*/ UINT16 wApplyRelayId = 0U; /*申请试车继电器ID*/ UINT16 wAllowRelayId = 0U; /*允许试车灯ID*/ UINT8 chNonRouteState = 0U; /*非进路状态*/ diff --git a/TSCP/src/APP/ciapp/Indicator/IndicatorDefine.h b/TSCP/src/APP/ciapp/Indicator/IndicatorDefine.h index 4fa2358..30f818f 100644 --- a/TSCP/src/APP/ciapp/Indicator/IndicatorDefine.h +++ b/TSCP/src/APP/ciapp/Indicator/IndicatorDefine.h @@ -67,6 +67,7 @@ #define INDICATOR_TYPE_DOWNWASH_ALLOW_PASS ((UINT8)0x29) /* 降级模式洗车同意通过指示灯 */ #define INDICATOR_TYPE_DOWNWASH_APPLY ((UINT8)0x63) /* 降级模式洗车请求指示灯 */ #define INDICATOR_TYPE_DOWNWASH_PASS_APPLY ((UINT8)0x64) /* 降级模式反向通过请求指示灯 */ +#define INDICATOR_TYPE_XDC_DCGDJ ((UINT8)0x65) /* 蓄电池供电报警指示灯 */ #define INDICATOR_TYPE_ATS_CONFIRM_RELAY_INTERFACE ((UINT8)0x27) /*相邻联锁继电接口确认状态指示灯*/ diff --git a/TSCP/src/APP/ciapp/Initial/ConfigDataReadManage.c b/TSCP/src/APP/ciapp/Initial/ConfigDataReadManage.c index 71fc38d..6448b8c 100644 --- a/TSCP/src/APP/ciapp/Initial/ConfigDataReadManage.c +++ b/TSCP/src/APP/ciapp/Initial/ConfigDataReadManage.c @@ -531,7 +531,7 @@ UINT8 ReadConfigureData(void) g_ret = ReadReverseCutConfigData(LocalCiId, gstReverseCutCfgData); if (-1 == g_ret) { - rtnVal = 28u;/*读保护区段配置数据失败*/ + rtnVal = 28u;/*读倒切配置数据失败-OC配置数据表单30*/ debug_infor_printf((const)"ReadReverseCutConfigData fail."); } else if (0 < g_ret) @@ -810,6 +810,25 @@ UINT8 ReadConfigureData(void) ; /*不处理*/ } + + if (0u == rtnVal) + { + g_ret = ReadReverseSwitchConfigData(LocalCiId, &gLocalReverseData); + if (-1 == g_ret) + { + rtnVal = 39u;/*读板卡配置数据失败-OC配置数据表单40、41*/ + debug_infor_printf((const)"ReadReverseSwitchConfigData fail."); + } + else + { + /*无操作*/ + } + } + else + { + ; /*不处理*/ + } + if (0u == rtnVal) { /*读系统参数配置数据*/ @@ -2011,6 +2030,23 @@ INT8 OcConnectConfigDataToDevStruct(SignalConfigDataStruct* pSignalCfgData, Phys pSignalCfgData[j].DxRelayId = pConnectCfgData[i].OcConnetRelayDataBuf[k].RelayId; pSignalCfgData[j].DxDrvRelayId = pConnectCfgData[i].OcConnetRelayDataBuf[k].DrvRelayId; } + else if (SIGNAL_DJ_TYPE == pConnectCfgData[i].OcConnetRelayDataBuf[k].RelayType) + { + pSignalCfgData[j].FirDsRelayId = pConnectCfgData[i].OcConnetRelayDataBuf[k].RelayId; + pSignalCfgData[j].wFirstDsDrvRelayId = pConnectCfgData[i].OcConnetRelayDataBuf[k].DrvRelayId; + } + else if (SIGNAL_MAINJ_TYPE == pConnectCfgData[i].OcConnetRelayDataBuf[k].RelayType) + { + pSignalCfgData[j].wMainDrvRelayId = pConnectCfgData[i].OcConnetRelayDataBuf[k].DrvRelayId; + } + else if (SIGNAL_ACKJ_TYPE == pConnectCfgData[i].OcConnetRelayDataBuf[k].RelayType) + { + pSignalCfgData[j].wAckDrvRelayId = pConnectCfgData[i].OcConnetRelayDataBuf[k].DrvRelayId; + } + else if (SINNAL_CMAINJ_TYPE == pConnectCfgData[i].OcConnetRelayDataBuf[k].RelayType) + { + pSignalCfgData[j].wCMainDrvRelayId = pConnectCfgData[i].OcConnetRelayDataBuf[k].DrvRelayId; + } else { ; /*不处理*/ diff --git a/TSCP/src/APP/ciapp/Initial/InitialProcess.c b/TSCP/src/APP/ciapp/Initial/InitialProcess.c index f95dafa..85ef212 100644 --- a/TSCP/src/APP/ciapp/Initial/InitialProcess.c +++ b/TSCP/src/APP/ciapp/Initial/InitialProcess.c @@ -871,6 +871,17 @@ UINT8 InitialSwitchData(void) SwitchDataStru[switchId].belongOCData[jj].FindPostionCmd = NO_FIND_CMD; SwitchDataStru[switchId].belongOCData[jj].OutMainControlCmdCycNum = 0u; } + + for (jj = 0u; jj < SWITCH_REDUN_COLL_MAX; jj++) + { + SwitchDataStru[switchId].RedunCollData[jj].dwRedunJudgHunXianStCyc = 0u; + SwitchDataStru[switchId].RedunCollData[jj].dwRedunRealHunXianStCyc = 0u; + SwitchDataStru[switchId].RedunCollData[jj].cHunXianRecovStt = REDUN_HX_RECOV_ALL; + SwitchDataStru[switchId].RedunCollData[jj].dwRedunFaultStCyc = 0u; + SwitchDataStru[switchId].RedunCollData[jj].cCollPos = SWITCH_POSITION_INVALID; + SwitchDataStru[switchId].RedunCollData[jj].cCombineStt = 0u; + SwitchDataStru[switchId].RedunCollData[jj].cCurrHunxianStt = RELAY_HUNXIAN_STATE_NO; + } } reVal = CI_SUCCESS; return reVal; @@ -1068,6 +1079,7 @@ UINT8 InitialLogicSectionData(void) UINT16 ii = 0u; /*游标*/ UINT16 jj = 0u; /*游标*/ UINT8 kk = 0u; /*游标*/ + UINT8 mm = 0u; /*游标*/ UINT16 zcToCiMaskSum = 0u; /*ZC-CI码位总数*/ UINT8 reVal = CI_ERROR; UINT8 chTmcSwitch = 0u; @@ -1126,14 +1138,10 @@ UINT8 InitialLogicSectionData(void) LogicSectionDataStruCC[logicSectionId].LogErrlockStartCycNum = 0U; LogicSectionDataStruCC[logicSectionId].chAblRelLogSecUsableFlag = LOGIC_ABLNEAR_USE_FLAG_NO; /*初始化ABL接近逻辑区段可用标志*/ LogicSectionDataStruCC[logicSectionId].cRouteLeaveLogFlag = LOGSEC_LEAVE_LOGSEC_REPLY_NO; /*离去区段ABL列车检查不通过*/ - for (jj = 0U; jj < LOGIC_SECTION_RES_SUM_MAX; jj++) + for (mm = 0U; mm < LOGIC_SECTION_RES_SUM_MAX; mm++) { - LogicSectionDataStruCC[logicSectionId].szTrainResData[jj].wTrainId = 0U; - LogicSectionDataStruCC[logicSectionId].szTrainResData[jj].chLogicResUsable = LOGIC_SECTION_RES_UNUSABLE; - LogicSectionDataStruCC[logicSectionId].szTrainResData[jj].chLogicReturnState = LOGIC_SECTION_TRAIN_RETURN_NO; - LogicSectionDataStruCC[logicSectionId].szTrainResData[jj].chTrainApplyState = LOGIC_SECTION_TRAIN_APPLY_NO; - LogicSectionDataStruCC[logicSectionId].szTrainResData[jj].chLogicUnlockState = LOGIC_SECTION_TRAIN_UNLOCK_NO; - LogicSectionDataStruCC[logicSectionId].szTrainResData[jj].dwRcvUnlockCmdCyc = 0U; + /*重置资源信息结构体*/ + ResetResInfoStruct(logicSectionId, mm); } LogicSectionDataStruCC[logicSectionId].chLogSecLockBelLogRouteSum = 0U; for (jj = 0U; jj < LOGSEC_RELATE_ROUTE_SUM_MAX; jj++) @@ -1518,6 +1526,8 @@ UINT8 InitialPsdData(void) { PsdDataStru[psdId].ibpButtonState = PSD_RELATED_BUTTON_STATE_DEFAULT; /*IBP盘发车按钮状态初始化*/ } + /*初始化零速状态*/ + PsdDataStru[psdId].chTrainZeroSpeedState = PSD_TRAIN_ZERO_SPEED_YES; /*零速*/ } reVal = CI_SUCCESS; return reVal; @@ -1720,6 +1730,8 @@ UINT8 InitialRouteData(void) RouteDataStru[routeId].chCouplinkSuccessFlag = ROUTE_COUPLINK_RESULT_NOT; /*初始化联挂成功标志为未收到*/ RouteDataStru[routeId].chCouplinkErrorFlag = ROUTE_COUPLINK_RESULT_NOT; /*初始化联挂失败标志为未收到*/ RouteDataStru[routeId].dwRouteIdleCycNum = 0U; /*进路空闲起始周期号*/ + RouteDataStru[routeId].chRouteConnReleaseFlag = ROUTE_CONNECT_RELEASE_NO; /*进路联络线解锁标志*/ + /*初始化车车结构体成员*/ RouteDataStruCC[routeId].RouteId = routeId; diff --git a/TSCP/src/APP/ciapp/InvadeSection/InvadeSectionDefine.h b/TSCP/src/APP/ciapp/InvadeSection/InvadeSectionDefine.h index fe9bee3..a895734 100644 --- a/TSCP/src/APP/ciapp/InvadeSection/InvadeSectionDefine.h +++ b/TSCP/src/APP/ciapp/InvadeSection/InvadeSectionDefine.h @@ -14,7 +14,7 @@ #ifndef __INVADESECTION_DEFINE_H_ #define __INVADESECTION_DEFINE_H_ -#define INVA_SECT_N_COND_SWIT_SUM_MAX ((UINT16)400) /*侵限区段与相关条件道岔数据条目最大数量*/ +#define INVA_SECT_N_COND_SWIT_SUM_MAX ((UINT16)800) /*侵限区段与相关条件道岔数据条目最大数量*/ #define COND_SWITCH_SUM_MAX ((UINT16)16) /*单一侵限区段与相关条件道岔数据条目内,条件道岔最大数量*/ diff --git a/TSCP/src/APP/ciapp/LightTestButtonManage/LightTestButtonDefine.h b/TSCP/src/APP/ciapp/LightTestButtonManage/LightTestButtonDefine.h index b3fb543..2c73d2d 100644 --- a/TSCP/src/APP/ciapp/LightTestButtonManage/LightTestButtonDefine.h +++ b/TSCP/src/APP/ciapp/LightTestButtonManage/LightTestButtonDefine.h @@ -20,7 +20,7 @@ #define LIGHTTESTBUTTON_LIGHT_MAX_NUM ((UINT8)13U) /* 试灯表示灯支持最大数 */ -#define LIGHTTESTBUTTON_LIGHT_SUPPORT_MAX_NUM ((UINT8)39U) +#define LIGHTTESTBUTTON_LIGHT_SUPPORT_MAX_NUM ((UINT8)208U) /* 试灯按钮可配置最大数量 */ #define LIGHTTESTBUTTON_BUTTON_MAX_NUM ((UINT16)70U) diff --git a/TSCP/src/APP/ciapp/LogRecord/LogRecord.c b/TSCP/src/APP/ciapp/LogRecord/LogRecord.c index 49b5a67..4bd4c45 100644 --- a/TSCP/src/APP/ciapp/LogRecord/LogRecord.c +++ b/TSCP/src/APP/ciapp/LogRecord/LogRecord.c @@ -13,6 +13,7 @@ #include "LogRecord.h" #include "../ParsePack/ParsePackVobcData.h" +#include "../ParsePack/ParsePackZcData.h" #include @@ -497,6 +498,7 @@ UINT8 RecordDeviceDataLog(UINT8 Flag) OCStationIndicDataStru* pNewOCStationIndicData = GetOCStationIndicDataStru(); EsbDataStruct* pNewEsbData = GetEsbData(); LogicalRouteDataStruct* pNewLogicalRouteDataStru = GetLogicalRouteStr(); + CbtcCrossStructZC* pCbtcCrossStructZCStru = GetCbtcCrossStructZc(); UINT16 wCfpId = 0u; UINT8 chEnIndex = 0u; UINT8 chTrainIndex = 0u; @@ -702,6 +704,7 @@ UINT8 RecordDeviceDataLog(UINT8 Flag) outString[outStringLength++] = newSignalData[deviceId].DoubleGreenDsBreakFlag;/*双绿灯丝断丝标志状态*/ outString[outStringLength++] = newSignalData[deviceId].DoubleYellowDsBreakFlag;/*双黄灯丝断丝标志状态*/ outString[outStringLength++] = newSignalData[deviceId].MaintainLightState;/*信号机维修点灯状态*/ + outString[outStringLength++] = pSignalDataCC[deviceId].wCrossTacsTrainId;/*TACS跨压列车ID*/ if (MAX_SIGNAL_LIGHTUPLINK_NUM < pSignalDataCC[deviceId].wSignalLightUpLinkIdSum) { @@ -985,7 +988,27 @@ UINT8 RecordDeviceDataLog(UINT8 Flag) ShortToChar(newSwitchData[deviceId].PLockedAxisSecIdArr[jj], &outString[outStringLength]); outStringLength += 2u; } - + + outString[outStringLength] = newSwitchData[deviceId].cMainOcCollPos; + outStringLength += 1u; + + for (jj = 0u; jj < SWITCH_REDUN_COLL_MAX; jj++) + { + LongToChar(newSwitchData[deviceId].RedunCollData[jj].dwRedunJudgHunXianStCyc, &outString[outStringLength]); + outStringLength += 4u; + LongToChar(newSwitchData[deviceId].RedunCollData[jj].dwRedunRealHunXianStCyc, &outString[outStringLength]); + outStringLength += 4u; + outString[outStringLength] = newSwitchData[deviceId].RedunCollData[jj].cHunXianRecovStt; + outStringLength += 1u; + LongToChar(newSwitchData[deviceId].RedunCollData[jj].dwRedunFaultStCyc, &outString[outStringLength]); + outStringLength += 4u; + outString[outStringLength] = newSwitchData[deviceId].RedunCollData[jj].cCombineStt; + outStringLength += 1u; + outString[outStringLength] = newSwitchData[deviceId].RedunCollData[jj].cCollPos; + outStringLength += 1u; + outString[outStringLength] = newSwitchData[deviceId].RedunCollData[jj].cCurrHunxianStt; + outStringLength += 1u; + } } } else @@ -1204,6 +1227,7 @@ UINT8 RecordDeviceDataLog(UINT8 Flag) outString[outStringLength++] = newRouteData[deviceId].chRoutCouplinkFlag; /*进路联挂标志*/ outString[outStringLength++] = newRouteData[deviceId].chCouplinkSuccessFlag; /*进路联挂成功*/ outString[outStringLength++] = newRouteData[deviceId].chCouplinkErrorFlag; /*进路联挂失败*/ + outString[outStringLength++] = newRouteData[deviceId].chRouteConnReleaseFlag; /*进路联络线解锁标志*/ } } else @@ -1519,9 +1543,12 @@ UINT8 RecordDeviceDataLog(UINT8 Flag) outString[outStringLength++] = newWashMachineData[deviceId].TrainEmergencyStopState;/*列车紧急停车状态*/ outString[outStringLength++] = newWashMachineData[deviceId].HeadWashAllowState;/*允许车头清洗状态*/ outString[outStringLength++] = newWashMachineData[deviceId].TailWashAllowState;/*允许车尾清洗状态*/ + outString[outStringLength++] = newWashMachineData[deviceId].chCoupingWashAllowState;/*允许联挂端清洗状态*/ outString[outStringLength++] = newWashMachineData[deviceId].WashTrainRequestDrvState;/*洗车请求驱动状态*/ outString[outStringLength++] = newWashMachineData[deviceId].TrainHeadStopSteadyDrvState;/*车头停稳驱动状态*/ outString[outStringLength++] = newWashMachineData[deviceId].TrainTailStopSteadyDrvState;/*车尾停稳驱动状态*/ + outString[outStringLength++] = newWashMachineData[deviceId].chCoupingStopSteadyDrvState; /*联挂端停稳驱动状态*/ + outString[outStringLength++] = newWashMachineData[deviceId].TrainOutWashTrainPortAllowState;/*允许出洗车库状态*/ ShortToChar(newWashMachineData[deviceId].CurVobcId, &outString[outStringLength]);/*当前洗车的VOBC ID*/ outStringLength += 2u; @@ -1701,6 +1728,8 @@ UINT8 RecordDeviceDataLog(UINT8 Flag) outString[outStringLength++] = newPsdData[deviceId].ibpButtonState;/*IBP盘发车按钮状态*/ LongToChar(newPsdData[deviceId].IBPPressCycNum, &outString[outStringLength]); /*IBP盘发车按钮按下周期*/ outStringLength += 4U; + outString[outStringLength] = newPsdData[deviceId].chTrainZeroSpeedState; /*非零速状态*/ + outStringLength++; } } else @@ -2445,6 +2474,17 @@ UINT8 RecordDeviceDataLog(UINT8 Flag) outString[outStringLength++] = pNewTrainInfoData[deviceId].chtrainControlMode;/*当前控车模式*/ outString[outStringLength++] = pNewTrainInfoData[deviceId].chTrainPostionMode; /*列车位置模式,0无位置,1使用IVOC位置,2使用VOBC位置*/ + ShortToChar(pNewTrainInfoData[deviceId].wMinSafeHeadLink, &outString[outStringLength]);/*延时小前所处link*/ + outStringLength += 2u; + LongToChar(pNewTrainInfoData[deviceId].dwMinSafeHeadOffset, &outString[outStringLength]);/*延时小前所处link偏移量*/ + outStringLength += 4u; + outString[outStringLength++] = pNewTrainInfoData[deviceId].chMinSafeHeadDir;/* 延时小前方向 */ + + outString[outStringLength] = pNewTrainInfoData[deviceId].chPbtacsTransState; /*RC与PBTACS列车通信状态:0x55-通信正常,0xAA-通信中断,0xFF-未知*/ + outStringLength++; + + LongToChar(pNewTrainInfoData[deviceId].dwPbtacsTransBadCyc, &outString[outStringLength]); /*RC与PBTACS列车通信中断周期*/ + outStringLength += 4U; } @@ -2913,10 +2953,46 @@ UINT8 RecordDeviceDataLog(UINT8 Flag) else { #ifdef PLATFORM_2OO2 - debug_infor_printf((const)"\nNonAutoReturnData:%d", (UINT16)sizeof(NonAutoReturnDataStruct), outStringLength); + debug_infor_printf((const)"\nNonAutoReturnData:%d, length:%d", (UINT16)sizeof(NonAutoReturnDataStruct), outStringLength); debug_out_array(0xAA, outString, outStringLength); +#endif + + /*清空打印数据*/ + CleanString(outString); + outStringLength = 0u; + } + + /*************************************打印CBTC跨压数据********************************************/ + /*打印CBTC跨压数据*/ + deviceNum = GetCbtcCrossNumZc();/* 获取边界点数量 */ + + for (ii = 0U; ii < deviceNum; ii++) + { + if ((CI_SUCCESS != returnValue) || (NULL == pCbtcCrossStructZCStru)) + { + returnValue = CI_ERROR; + break; + } + + ShortToChar(pCbtcCrossStructZCStru[ii].wSignalId, &outString[outStringLength]);/*CBTC跨压信号机ID*/ + outStringLength += 2u; + outString[outStringLength] = pCbtcCrossStructZCStru[ii].wTrainId; /*CBTC跨压列车ID*/ + outStringLength++; + } + + if (0u == outStringLength) + { + /*nothing*/ + debug_infor_printf((const)"\nCbtcCrossData:0u"); + } + else + { +#ifdef PLATFORM_2OO2 + debug_infor_printf((const)"\nCbtcCrossData:%d:", outStringLength); + + debug_out_array(0xAA, outString, outStringLength); #endif /*清空打印数据*/ diff --git a/TSCP/src/APP/ciapp/LogicManage/InterlockCommonManage.c b/TSCP/src/APP/ciapp/LogicManage/InterlockCommonManage.c index f44d4c6..cf7004f 100644 --- a/TSCP/src/APP/ciapp/LogicManage/InterlockCommonManage.c +++ b/TSCP/src/APP/ciapp/LogicManage/InterlockCommonManage.c @@ -1875,8 +1875,9 @@ void SetRouteOvlpOtherCiShrFlg(const UINT16 wRouteId, const UINT16 wOverlapId,co void ClearSomeFlagDependRouteState(const UINT16 routeId) { UINT8 routeState = GetRouteState(routeId); - UINT16 startSignalId = 0u; - UINT16 EnginVehicCroCloBelongRoute = 0u; + UINT16 startSignalId = 0U; + UINT16 EnginVehicCroCloBelongRoute = 0U; + UINT8 chZrenjieFlag = 0U; /*清理工程车跨压关信号所属进路,清理工程车跨压状态*/ if ((ROUTE_STATE_YUXIAN_LOCK != routeState) @@ -1925,6 +1926,17 @@ void ClearSomeFlagDependRouteState(const UINT16 routeId) { /*不处理*/ } + /*无总人解标志且不处于延时解锁状态,清除联络线解锁标志*/ + chZrenjieFlag = GetRouteZongRenJieFlag(routeId); + if ((ROUTE_ZONGRENJIE_SET_NO == chZrenjieFlag) && (ROUTE_STATE_DELAY_UNLOCK != routeState)) + { + SetRouteConnectReleaseFlag(routeId, ROUTE_CONNECT_RELEASE_NO); /*清除联络线解锁标志*/ + } + else + { + /*不处理*/ + } + } /* diff --git a/TSCP/src/APP/ciapp/LogicManage/InterlockLogicManage.c b/TSCP/src/APP/ciapp/LogicManage/InterlockLogicManage.c index 807e4fb..77c1032 100644 --- a/TSCP/src/APP/ciapp/LogicManage/InterlockLogicManage.c +++ b/TSCP/src/APP/ciapp/LogicManage/InterlockLogicManage.c @@ -21,6 +21,7 @@ #include "LogicalRouteDataManage.h" #include "../LogicProcess/LogicalRouteLogicCheck.h" #include "../LogicManage/TradInterlockLogicManage.h" +#include "../ParsePack/ParsePackAtsData.h" #include "ParsePackZcData.h" @@ -145,6 +146,7 @@ void InterlockLogicMainProc(void) UINT8 localCiType = GetLocalCiType(); UINT8 cRcWorkMode = GetLocalRcWorkMode(); UINT8 cControlState = GetLocalCiBackUpPattern(); + signed long long cost[20] = {0U}; cost[0] = MSCP_GetTick(); if (SYSTEM_WORK_MODE_MAIN == cControlState) @@ -221,16 +223,30 @@ void InterlockLogicMainProc(void) /*跳跃锁闭逻辑处理*/ JumpLockManage(); } + else + { + if ((RC_WORK_MODE_TIOC == cRcWorkMode) && (SYSTEM_WORK_MODE_BACKUP == cControlState)) + { + /*信号已开放进路的共享资源处理*/ + OpenedRouteShareResPro(); + } + else + { + /*不处理*/ + } + } + cost[3] = MSCP_GetTick(); + /*进路列车释放解锁逻辑管理*/ RouteTrainResUnlockManage(); + /*逻辑区段资源管理*/ LogicSecResManage(); cost[4] = MSCP_GetTick(); debug_infor_printf((const)"\n JKJRelayLogicProcess :%dms RouteLogicManage:%dms LogicSecResManage:%dms JumpLockManage:%dms \n",(cost[1]-cost[0])/1000,(cost[2]-cost[1])/1000,(cost[3]-cost[2])/1000,(cost[4]-cost[3])/1000); - } @@ -3386,7 +3402,18 @@ UINT8 LockRouteOverlapProc(const UINT16 routeId) UINT8 cTimeCheckFlag = CI_TIME_OUT; UINT8 cKeepWorkFlag = CI_ERROR; UINT8 cSwitchPosCheckRet = CI_ERROR; + UINT8 cOverlapCiId = 0U; /*保护区段所属联锁ID*/ + UINT16 wRouteLeavePhySecId = 0U;/*进路离去物理区段ID*/ + UINT8 cPhySecLockState = 0U; /*物理区段锁闭状态*/ + UINT8 cLocalCiId = 0U; /*本机联锁ID*/ + UINT8 cRouteBlongCiId = 0U; /*进路所属联锁ID*/ + UINT8 cProSecDelayLockFlag = 0U; /*保护区段延时锁闭标志*/ + UINT32 dwPhySecDelayLockStartCyc = 0U; /*物理区段延时锁闭起始周期*/ + UINT32 dwBadEnsureCount = 0U; /*联锁通信中断确认周期数*/ + cLocalCiId = GetSystemParaLocalCiId(); + dwBadEnsureCount = GetCiAndCiTransBadEnsureCnt(); + cRouteBlongCiId = GetRouteBelongCiId(routeId); overlapSum = GetRouteOverlapSum(routeId); /*获取Overlap总数*/ overlapIdBuf = GetRouteOverlapIdBuf(routeId); /*获取Overlap ID BUF*/ dwCurCycNum = Get2oo2CurCycleNum(); @@ -3401,7 +3428,8 @@ UINT8 LockRouteOverlapProc(const UINT16 routeId) cKeepWorkFlag = CI_SUCCESS; for (ii = 0u; ii < overlapSum; ii++) { - if (GetOverlapBelongCiId(overlapIdBuf[ii]) == localCiId) + cOverlapCiId = GetOverlapBelongCiId(overlapIdBuf[ii]); + if (cOverlapCiId == localCiId) { /*属于本联锁保护区段*/ @@ -3428,31 +3456,35 @@ UINT8 LockRouteOverlapProc(const UINT16 routeId) devId = GetRouteLastPhySectionId(routeId); devState = GetPhySecCurOccupyState(devId); devPreState = GetPhySecPreOccupyState(devId); - overlapState = GetPhySecCurOccupyState(GetRouteLeavePhySecId(routeId)); + cPhySecLockState = GetPhySecLockState(devId); + wRouteLeavePhySecId = GetRouteLeavePhySecId(routeId); + overlapState = GetPhySecCurOccupyState(wRouteLeavePhySecId); routeState = GetRouteState(routeId); if ((SECTION_OCCUPY_NO == devState) && (SECTION_OCCUPY_YES == devPreState) && (SECTION_OCCUPY_NO == overlapState) && - (PHYSICAL_SECTION_LOCK_NORMAL == GetPhySecLockState(devId)) && + (PHYSICAL_SECTION_LOCK_NORMAL == cPhySecLockState) && (ROUTE_STATE_AUTO_UNLOCK == routeState) && - (GetSystemParaLocalCiId() != GetRouteBelongCiId(routeId)) + (cLocalCiId != cRouteBlongCiId) ) { SetProtectSecLockDelayTimeFlag(devId, PROTECTSECLOCKDELAY_YES); - SetPhySecLockDelayStartCycNum(devId, Get2oo2CurCycleNum()); /*设置物理区段延时锁闭周期号*/ + SetPhySecLockDelayStartCycNum(devId, dwCurCycNum); /*设置物理区段延时锁闭周期号*/ } else { ; } - if (PROTECTSECLOCKDELAY_NO == GetProtectSecLockDelayTimeFlag(devId)) + cProSecDelayLockFlag = GetProtectSecLockDelayTimeFlag(devId); + dwPhySecDelayLockStartCyc = GetPhySecLockDelayStartCycNum(devId); + if (PROTECTSECLOCKDELAY_NO == cProSecDelayLockFlag) { /*锁闭进路Overlap管理*/ returnValue = LockRouteOverlapLogicProcess(routeId, overlapIdBuf[ii], CI_LOCK_OVERLAP); } - else if (((Get2oo2CurCycleNum() - GetPhySecLockDelayStartCycNum(devId)) > GetCiAndCiTransBadEnsureCnt()) - && (PROTECTSECLOCKDELAY_YES == GetProtectSecLockDelayTimeFlag(devId))) + else if (((dwCurCycNum - dwPhySecDelayLockStartCyc) > dwBadEnsureCount) + && (PROTECTSECLOCKDELAY_YES == cProSecDelayLockFlag)) { /*标志设置超时则清除标志*/ SetProtectSecLockDelayTimeFlag(devId, PROTECTSECLOCKDELAY_NO); SetPhySecLockDelayStartCycNum(devId, 0); /*清物理区段延时锁闭周期号*/ @@ -4138,105 +4170,109 @@ UINT8 KeepOpenRouteSignalProc(const UINT16 routeId) */ void RouteZongQuXiaoProc(const UINT16 routeId) { - UINT8 routeState = 0u; /*进路状态*/ - UINT16 startSignalId = 0u; + UINT8 routeState = 0U; /*进路状态*/ + UINT16 startSignalId = 0U; UINT8 sigCurColor = SIGNAL_SHOWCOLOUR_INVALID; - UINT8 routeDelayUnlockflag = 0u; /* 进路延时解锁属性*/ - UINT8 checkRouteCancel = 0u; + UINT8 routeDelayUnlockflag = 0U; /* 进路延时解锁属性*/ + UINT8 checkRouteCancel = 0U; UINT8 cSignalInHumidRailFlag = PHYSEC_IN_HUMID_RAIL_NO; /*信号机湿轨标志*/ - + UINT8 chCiType = 0U; + UINT8 chRouteVirCiId = 0U; + UINT8 chOpenClose = 0U; /*获取进路动态字段*/ routeState = GetRouteState(routeId); /*获取进路状态*/ startSignalId = GetRouteStartSignalId(routeId); sigCurColor = GetSignalCurColor(startSignalId); - - if (GetSignalOpenCloseState(sigCurColor) == SIGNAL_OPEN) + + chOpenClose = GetSignalOpenCloseState(sigCurColor); + if (SIGNAL_OPEN == chOpenClose) { /*信号未关闭*/ - (void)DriveSignalClose(startSignalId); /*驱动信号关闭*/ - - return; } else { /*信号已关闭*/ - SetRouteZongQuXiaoFlag(routeId, ROUTE_ZONGQUXIAO_SET_NO); /*取消进路总取消标志*/ - } - cSignalInHumidRailFlag = GetSignalInHumidRailFlag(startSignalId); - if (PHYSEC_IN_HUMID_RAIL_NO == cSignalInHumidRailFlag) - { - /*总取消进路处理*/ - if ((ROUTE_STATE_XUANPAI == routeState) || (ROUTE_STATE_FIRST_XUANPAI == routeState)) + cSignalInHumidRailFlag = GetSignalInHumidRailFlag(startSignalId); + chRouteVirCiId = GetRouteBelongVirCiId(routeId); /*获取进路虚拟联锁ID*/ + chCiType = GetLocalVirCiType(chRouteVirCiId); /*获取联锁类型*/ + /*信号机湿轨标志无效或者进路属于车辆段,则执行总取消*/ + if ((PHYSEC_IN_HUMID_RAIL_NO == cSignalInHumidRailFlag) || (CI_TYPE_CLD == chCiType)) { - /*进路选排或初选*/ - - /*取消进路选排*/ - SetRouteStateManage(routeId, ROUTE_STATE_IDLE); /*-->设置进路空闲*/ - - } - /*进路初锁||进路初锁异常||进路预先锁闭*/ - else if ((ROUTE_STATE_FIRST_LOCK == routeState) || - (ROUTE_STATE_FIRST_LOCKERR == routeState) || - (ROUTE_STATE_YUXIAN_LOCK == routeState)) - { - /* 检查取消检查条件*/ - checkRouteCancel = RouteCancelLogicProcess(routeId); - /* 获取进路延时解锁属性*/ - routeDelayUnlockflag = GetRouteNeedDelayUnlock(routeId); - if (CI_SUCCESS == checkRouteCancel) + /*总取消进路处理*/ + if ((ROUTE_STATE_XUANPAI == routeState) || (ROUTE_STATE_FIRST_XUANPAI == routeState)) { - /*需要延时解锁*/ - if (ROUTE_NEED_DELAY_UNLOCK == routeDelayUnlockflag) + /*进路选排或初选*/ + + /*取消进路选排*/ + SetRouteStateManage(routeId, ROUTE_STATE_IDLE); /*-->设置进路空闲*/ + + } + /*进路初锁||进路初锁异常||进路预先锁闭*/ + else if ((ROUTE_STATE_FIRST_LOCK == routeState) || + (ROUTE_STATE_FIRST_LOCKERR == routeState) || + (ROUTE_STATE_YUXIAN_LOCK == routeState)) + { + /* 检查取消检查条件*/ + checkRouteCancel = RouteCancelLogicProcess(routeId); + /* 获取进路延时解锁属性*/ + routeDelayUnlockflag = GetRouteNeedDelayUnlock(routeId); + if (CI_SUCCESS == checkRouteCancel) { - /*设置进路延时解锁状态*/ - SetRouteStateManage(routeId, ROUTE_STATE_DELAY_UNLOCK); - /*设置延时解锁*/ - SetRouteZongQuXiaoDelayFlag(routeId, ROUTE_ZQX_DELAY_YES); + /*需要延时解锁*/ + if (ROUTE_NEED_DELAY_UNLOCK == routeDelayUnlockflag) + { + /*设置进路延时解锁状态*/ + SetRouteStateManage(routeId, ROUTE_STATE_DELAY_UNLOCK); + /*设置延时解锁*/ + SetRouteZongQuXiaoDelayFlag(routeId, ROUTE_ZQX_DELAY_YES); + } + else + { + /*-->设置进路空闲*/ + SetRouteStateManage(routeId, ROUTE_STATE_IDLE); + } } else { - /*-->设置进路空闲*/ - SetRouteStateManage(routeId, ROUTE_STATE_IDLE); + /*进路不能取消*/ } } + else if ((ROUTE_STATE_NEAR_LOCK == routeState) || + (ROUTE_STATE_NEAR_LOCKERR == routeState)) + { + /*反馈接近锁闭*/ + SetCiSendCmdBackInfoData(CI_BACK_ROUTE_NEAR_LOCK_YES, CI_DEVICE_TYPE_ROUTE, routeId, 0u, 0u); + } + else if ((ROUTE_STATE_LEAD_LOCK == routeState) || + (ROUTE_STATE_LEAD_LOCKERR == routeState) || + (ROUTE_STATE_LEAD_FIRST_XUANPAI == routeState) || + (ROUTE_STATE_LEAD_OPEN == routeState) || + (ROUTE_STATE_LEAD_XUANPAI == routeState)) + { + /*引导进路总取消新增报警信息*/ + SetCiSendCmdBackInfoData(CI_BACK_LEAD_ROUTE_CANCEL, CI_DEVICE_TYPE_ROUTE, routeId, 0u, 0u); + } + else if (ROUTE_STATE_IDLE == routeState) + { + CancelLongRouteXuanPai(routeId); /*修复缺陷YF0083-2370:总取消时若进路空闲,则取消长调进路选排*/ + } else { - /*进路不能取消*/ + /*反馈未完整锁闭*/ + SetCiSendCmdBackInfoData(CI_BACK_ROUTE_LOCK_NOTALL, CI_DEVICE_TYPE_ROUTE, routeId, 0u, 0u); } } - else if ((ROUTE_STATE_NEAR_LOCK == routeState) || - (ROUTE_STATE_NEAR_LOCKERR == routeState)) - { - /*反馈接近锁闭*/ - SetCiSendCmdBackInfoData(CI_BACK_ROUTE_NEAR_LOCK_YES, CI_DEVICE_TYPE_ROUTE, routeId, 0u, 0u); - } - else if ((ROUTE_STATE_LEAD_LOCK == routeState) || - (ROUTE_STATE_LEAD_LOCKERR == routeState) || - (ROUTE_STATE_LEAD_FIRST_XUANPAI == routeState) || - (ROUTE_STATE_LEAD_OPEN == routeState) || - (ROUTE_STATE_LEAD_XUANPAI == routeState)) - { - /*引导进路总取消新增报警信息*/ - SetCiSendCmdBackInfoData(CI_BACK_LEAD_ROUTE_CANCEL, CI_DEVICE_TYPE_ROUTE, routeId, 0u, 0u); - } - else if (ROUTE_STATE_IDLE == routeState) - { - CancelLongRouteXuanPai(routeId); /*修复缺陷YF0083-2370:总取消时若进路空闲,则取消长调进路选排*/ - } else { - /*反馈未完整锁闭*/ - SetCiSendCmdBackInfoData(CI_BACK_ROUTE_LOCK_NOTALL, CI_DEVICE_TYPE_ROUTE, routeId, 0u, 0u); + /*进路始端信号机处于湿轨范围,不解锁进路*/ + debug_infor_printf((const)"\n SignalInHumidRailFlag Valid,Not RouteZongQuXiaoProc \n"); } } - else - { - /*进路始端信号机处于湿轨范围,不解锁进路*/ - debug_infor_printf((const)"\n SignalInHumidRailFlag Valid,Not RouteZongQuXiaoProc \n"); - } + + } /* @@ -4377,17 +4413,18 @@ UINT8 AutoSigRouteQuXiaoProc(const UINT16 routeId) */ void RouteZongRenJieProc(const UINT16 routeId) { - UINT8 routeState = 0u; /*进路状态*/ - UINT16 startSignalId = 0u; + UINT8 routeState = 0U; /*进路状态*/ + UINT16 startSignalId = 0U; UINT8 checkResult = CI_ERROR;/*区段是否有车占用*/ - UINT16 firstOccuSecId = 0u;/*进路内方第一个占用的物理区段ID*/ - UINT8 devState = 0u; - UINT8 trainEnterSta = 0u;/*进路列车驶入标志*/ - UINT8 checkZongRenJieResult = 0u; - UINT8 routeDelayUnlockflag = 0u; - UINT8 checkResultSecAndQXZC = 0u; /*RouteExceptLastSecOccuClrCheck此函数的检查结果*/ - UINT8 cSignalColor = 0u; - UINT8 cSignalOpenState = 0u; + UINT16 firstOccuSecId = 0U;/*进路内方第一个占用的物理区段ID*/ + UINT8 devState = 0U; + UINT8 trainEnterSta = 0U;/*进路列车驶入标志*/ + UINT8 checkZongRenJieResult = 0U; + UINT8 routeDelayUnlockflag = 0U; + UINT8 checkResultSecAndQXZC = 0U; /*RouteExceptLastSecOccuClrCheck此函数的检查结果*/ + UINT8 cSignalColor = 0U; + UINT8 cSignalOpenState = 0U; + UINT8 chRouteConnectFlag = 0U; /*获取进路动态字段*/ routeState = GetRouteState(routeId); /*获取进路状态*/ @@ -4399,143 +4436,145 @@ void RouteZongRenJieProc(const UINT16 routeId) if (SIGNAL_OPEN == cSignalOpenState) { /*信号未关闭*/ - (void)DriveSignalClose(startSignalId); /*驱动信号关闭*/ -#if 0 - SetRouteZongRenJieCloseFlag(routeId, ROUTE_ZRJ_CLOSE_FLAG_YES); /*进路信号关闭是总人解导致*/ -#endif - return; } else { /*信号已关闭*/ (void)SetRouteZongRenJieFlag(routeId, ROUTE_ZONGRENJIE_SET_NO); /*取消进路总人解标志*/ -#if 0 - zrjCloseSigFlag = GetRouteZongRenJieCloseFlag(routeId); /*或取进路的总人解关信号标志*/ - SetRouteZongRenJieCloseFlag(routeId, ROUTE_ZRJ_CLOSE_FLAG_NO); /*用完清除*/ -#endif - } - checkResult = RouteAllSecOccuClearCheck(routeId, &firstOccuSecId, &devState); - trainEnterSta = GetRouteTrainEnterFlag(routeId); - - /*总人解进路处理*/ - if ((ROUTE_STATE_XUANPAI == routeState) || (ROUTE_STATE_FIRST_XUANPAI == routeState)) - { - /*进路选排或初选*/ - - /*取消进路选排*/ - SetRouteStateManage(routeId, ROUTE_STATE_IDLE); /*-->设置进路空闲*/ - - } - else if ((ROUTE_STATE_FIRST_LOCK == routeState) || - (ROUTE_STATE_FIRST_LOCKERR == routeState) || - (ROUTE_STATE_YUXIAN_LOCK == routeState)) - { - /*进路初锁||进路初锁异常||进路预先锁闭*/ - /*总人解逻辑处理*/ - checkZongRenJieResult = CheckRouteZongRenJieFeasibility(routeId); - /* 获取进路延时解锁属性*/ - routeDelayUnlockflag = GetRouteNeedDelayUnlock(routeId); - if (CI_SUCCESS == checkZongRenJieResult) + /*是否联络线接车进路解锁*/ + chRouteConnectFlag = GetRouteConnectReleaseFlag(routeId); + if (ROUTE_CONNECT_RELEASE_YES == chRouteConnectFlag) { - /*进路需要延时解锁*/ - if (ROUTE_NEED_DELAY_UNLOCK == routeDelayUnlockflag) - { - /*进路内无占用*/ - if (CI_SUCCESS == checkResult) - { - /*-->设置进路延时解锁*/ - SetRouteStateManage(routeId, ROUTE_STATE_DELAY_UNLOCK); - /*进路内无占压,延时后全部解锁*/ - SetRouteZongRenJieDelayType(routeId, ROUTE_ZRJ_DELAY_TYPE_IDLE); - } - else - { - /*车身后变绿光带*/ - SetRoutePhySecExpLockToOccupy(routeId); - SetRouteStateManage(routeId, ROUTE_STATE_AUTO_UNLOCKERR); - } - } - else - { - - if (CI_SUCCESS == checkResult) - {/*已无占用*/ - SetRouteStateManage(routeId, ROUTE_STATE_IDLE); /*-->设置进路空闲*/ - } - else - { - /*车身后变绿光带*/ - SetRoutePhySecExpLockToOccupy(routeId); - - SetRouteStateManage(routeId, ROUTE_STATE_AUTO_UNLOCKERR); - } - } + /*执行联络线接车进路解锁*/ + ConnectRouteReleaseProc(routeId); } else { - /*进路不能取消*/ - } - } - else if (ROUTE_STATE_NEAR_LOCKERR == routeState) - { - /*总人解逻辑处理*/ - checkZongRenJieResult = CheckRouteZongRenJieFeasibility(routeId); - if (CI_SUCCESS == checkZongRenJieResult) - { - SetRouteStateManage(routeId, ROUTE_STATE_DELAY_UNLOCK); /*-->设置进路延时解锁*/ + checkResult = RouteAllSecOccuClearCheck(routeId, &firstOccuSecId, &devState); + trainEnterSta = GetRouteTrainEnterFlag(routeId); - if (CI_SUCCESS == checkResult) + /*总人解进路处理*/ + if ((ROUTE_STATE_XUANPAI == routeState) || (ROUTE_STATE_FIRST_XUANPAI == routeState)) { - /*进路内无占压,延时后全部解锁*/ - SetRouteZongRenJieDelayType(routeId, ROUTE_ZRJ_DELAY_TYPE_IDLE); + /*进路选排或初选*/ + + /*取消进路选排*/ + SetRouteStateManage(routeId, ROUTE_STATE_IDLE); /*-->设置进路空闲*/ + + } + else if ((ROUTE_STATE_FIRST_LOCK == routeState) || + (ROUTE_STATE_FIRST_LOCKERR == routeState) || + (ROUTE_STATE_YUXIAN_LOCK == routeState)) + { + /*进路初锁||进路初锁异常||进路预先锁闭*/ + /*总人解逻辑处理*/ + checkZongRenJieResult = CheckRouteZongRenJieFeasibility(routeId); + /* 获取进路延时解锁属性*/ + routeDelayUnlockflag = GetRouteNeedDelayUnlock(routeId); + if (CI_SUCCESS == checkZongRenJieResult) + { + /*进路需要延时解锁*/ + if (ROUTE_NEED_DELAY_UNLOCK == routeDelayUnlockflag) + { + /*进路内无占用*/ + if (CI_SUCCESS == checkResult) + { + /*-->设置进路延时解锁*/ + SetRouteStateManage(routeId, ROUTE_STATE_DELAY_UNLOCK); + /*进路内无占压,延时后全部解锁*/ + SetRouteZongRenJieDelayType(routeId, ROUTE_ZRJ_DELAY_TYPE_IDLE); + } + else + { + /*车身后变绿光带*/ + SetRoutePhySecExpLockToOccupy(routeId); + SetRouteStateManage(routeId, ROUTE_STATE_AUTO_UNLOCKERR); + } + } + else + { + + if (CI_SUCCESS == checkResult) + {/*已无占用*/ + SetRouteStateManage(routeId, ROUTE_STATE_IDLE); /*-->设置进路空闲*/ + } + else + { + /*车身后变绿光带*/ + SetRoutePhySecExpLockToOccupy(routeId); + + SetRouteStateManage(routeId, ROUTE_STATE_AUTO_UNLOCKERR); + } + } + } + else + { + /*进路不能取消*/ + } + } + else if (ROUTE_STATE_NEAR_LOCKERR == routeState) + { + /*总人解逻辑处理*/ + checkZongRenJieResult = CheckRouteZongRenJieFeasibility(routeId); + if (CI_SUCCESS == checkZongRenJieResult) + { + SetRouteStateManage(routeId, ROUTE_STATE_DELAY_UNLOCK); /*-->设置进路延时解锁*/ + + if (CI_SUCCESS == checkResult) + { + /*进路内无占压,延时后全部解锁*/ + SetRouteZongRenJieDelayType(routeId, ROUTE_ZRJ_DELAY_TYPE_IDLE); + } + else + { + + /*延时后部分绿光带,即一个占压的物理区段之前的物理区段变绿光带*/ + SetRouteZongRenJieDelayType(routeId, ROUTE_ZRJ_DELAY_TYPE_EXP_TO_OCCUPY); + } + } + else + { + /*进路不能取消*/ + } + } + else if ((ROUTE_STATE_LEAD_LOCK == routeState) || (ROUTE_STATE_LEAD_LOCKERR == routeState)) + { /*引导锁闭||引导锁闭异常*/ + /*人解引导进路解锁原则:修改20180809 + 当进路内方空闲或最后一个区段占用时,立即解锁; + 当非最后一个区段占用且无驶入,则延时解锁,其他场景不解锁*/ + + checkResultSecAndQXZC = RouteExceptLastSecOccuClrCheck(routeId); + if (CI_SUCCESS == checkResultSecAndQXZC) + { /*所有区段空闲或最后一个区段占用*/ + + /*总人解办理*/ + SetRouteStateManage(routeId, ROUTE_STATE_DELAY_UNLOCK); /*-->设置进路延时解锁*/ + /*延时后全部解锁*/ + SetRouteZongRenJieDelayType(routeId, ROUTE_ZRJ_DELAY_TYPE_IDLE);/*延时结束后所有区段解锁*/ + } + else if ((ROUTE_TRAIN_ENTER_FLAG_NO == trainEnterSta) && (CI_ERROR_QXZC != checkResultSecAndQXZC)) + {/*当总人解引导进路时,有取消照查继电器且未吸起则不能解锁引导进路*/ + /*总人解办理*/ + SetRouteStateManage(routeId, ROUTE_STATE_DELAY_UNLOCK); /*-->设置进路延时解锁*/ + /*延时后全部解锁*/ + SetRouteZongRenJieDelayType(routeId, ROUTE_ZRJ_DELAY_TYPE_IDLE);/*延时结束后所有区段解锁*/ + } + else + { + /*不解锁*/ + } + } else { + /*进路状态不满足*/ + /* 记录故障码 */ + SetErrorData(EFUNC_ROUTE_ZRJ_DEAL, CI_DEVICE_TYPE_ROUTE, routeId, ETYPE_ROUTE_STATE, routeState, ESEND_LEVEL_ATS); + } + } - /*延时后部分绿光带,即一个占压的物理区段之前的物理区段变绿光带*/ - SetRouteZongRenJieDelayType(routeId, ROUTE_ZRJ_DELAY_TYPE_EXP_TO_OCCUPY); - } - } - else - { - /*进路不能取消*/ - } - } - else if ((ROUTE_STATE_LEAD_LOCK == routeState) || (ROUTE_STATE_LEAD_LOCKERR == routeState)) - { /*引导锁闭||引导锁闭异常*/ - /*人解引导进路解锁原则:修改20180809 - 当进路内方空闲或最后一个区段占用时,立即解锁; - 当非最后一个区段占用且无驶入,则延时解锁,其他场景不解锁*/ - - checkResultSecAndQXZC = RouteExceptLastSecOccuClrCheck(routeId); - if (CI_SUCCESS == checkResultSecAndQXZC) - { /*所有区段空闲或最后一个区段占用*/ - - /*总人解办理*/ - SetRouteStateManage(routeId, ROUTE_STATE_DELAY_UNLOCK); /*-->设置进路延时解锁*/ - /*延时后全部解锁*/ - SetRouteZongRenJieDelayType(routeId, ROUTE_ZRJ_DELAY_TYPE_IDLE);/*延时结束后所有区段解锁*/ - } - else if ((ROUTE_TRAIN_ENTER_FLAG_NO == trainEnterSta) && (CI_ERROR_QXZC != checkResultSecAndQXZC)) - {/*当总人解引导进路时,有取消照查继电器且未吸起则不能解锁引导进路*/ - /*总人解办理*/ - SetRouteStateManage(routeId, ROUTE_STATE_DELAY_UNLOCK); /*-->设置进路延时解锁*/ - /*延时后全部解锁*/ - SetRouteZongRenJieDelayType(routeId, ROUTE_ZRJ_DELAY_TYPE_IDLE);/*延时结束后所有区段解锁*/ - } - else - { - /*不解锁*/ - } - - } - else - { - /*进路状态不满足*/ - /* 记录故障码 */ - SetErrorData(EFUNC_ROUTE_ZRJ_DEAL, CI_DEVICE_TYPE_ROUTE, routeId, ETYPE_ROUTE_STATE, routeState, ESEND_LEVEL_ATS); } } @@ -4693,38 +4732,45 @@ UINT8 UnlockRouteOverlapProc(const UINT16 routeId) } else if (CI_ERROR == ret) { - /*错误,什么也不做*/ + /*不满足解锁条件,清除保护区段解锁申请*/ + + if (RC_WORK_MODE_TIOC == cRcWorkMode) + { + SetOverlapUnlockApplyTrainId(unlockOverlapId, 0U); + SetReqIvocUnlockStartCycNum(unlockOverlapId, 0U); + } + else if (RC_WORK_MODE_CI == cRcWorkMode) + { + /*停止发解锁申请*/ + SetOverlapUnlockApplyFlag(unlockOverlapId, UNLOCK_OVERLAP_APPLY_NO); + } + else + { + ; /* 无处理 */ + } } else { - /*什么也不做*/ + ; /*什么也不做*/ } - wTrainId = GetOverlapUnlockApplyTrainId(unlockOverlapId); - if (SECTION_OCCUPY_NO == devCurMergeState)/*当前空闲*/ { if (RC_WORK_MODE_TIOC == cRcWorkMode) { - if (0u != wTrainId) - { /*停止发解锁申请*/ SetOverlapUnlockApplyTrainId(unlockOverlapId, 0U); SetReqIvocUnlockStartCycNum(unlockOverlapId, 0U); /*停止倒计时*/ SetSecUtOrCtOccuStartCycNum(devId, 0u); - } } else if (RC_WORK_MODE_CI == cRcWorkMode) { - /* TODO */ - if (UNLOCK_OVERLAP_APPLY_YES == GetOverlapUnlockApplyFlag(unlockOverlapId))/*当前正给ZC发送解锁申请*/ - { - /*停止发解锁申请*/ - SetOverlapUnlockApplyFlag(unlockOverlapId, UNLOCK_OVERLAP_APPLY_NO); - /*停止倒计时*/ - SetSecUtOrCtOccuStartCycNum(devId, 0u); - } + + /*停止发解锁申请*/ + SetOverlapUnlockApplyFlag(unlockOverlapId, UNLOCK_OVERLAP_APPLY_NO); + /*停止倒计时*/ + SetSecUtOrCtOccuStartCycNum(devId, 0u); } else { @@ -4736,21 +4782,14 @@ UINT8 UnlockRouteOverlapProc(const UINT16 routeId) { if (RC_WORK_MODE_TIOC == cRcWorkMode) { - if (0u != wTrainId) - { - /*停止发解锁申请*/ - SetOverlapUnlockApplyTrainId(unlockOverlapId, 0u); - SetReqIvocUnlockStartCycNum(unlockOverlapId, 0U); - } + /*停止发解锁申请*/ + SetOverlapUnlockApplyTrainId(unlockOverlapId, 0u); + SetReqIvocUnlockStartCycNum(unlockOverlapId, 0U); } else if (RC_WORK_MODE_CI == cRcWorkMode) { - /* TODO */ - if (UNLOCK_OVERLAP_APPLY_YES == GetOverlapUnlockApplyFlag(unlockOverlapId))/*当前正给ZC发送解锁申请*/ - { - /*停止发解锁申请*/ - SetOverlapUnlockApplyFlag(unlockOverlapId, UNLOCK_OVERLAP_APPLY_NO); - } + /*停止发解锁申请*/ + SetOverlapUnlockApplyFlag(unlockOverlapId, UNLOCK_OVERLAP_APPLY_NO); } else { @@ -4759,7 +4798,7 @@ UINT8 UnlockRouteOverlapProc(const UINT16 routeId) } else { - /*什么也不做*/ + ; /*什么也不做*/ } } return CI_ERROR; @@ -9477,27 +9516,10 @@ void CiTrainTestLogicManage(void) UINT16 wCollAgreeTryTrainRelayId = 0U;/*试车线采集同意试车继电器ID*/ UINT8 chRelayCollState = 0U;/*采集继电器状态*/ UINT8 ii = 0U; - UINT8 flag = 0U; - UINT8 chCldAndScxMergeFlag = GetCldAndScxMergeFlag(); - UINT8 localCiType = GetLocalCiType(); - - if (CI_TYPE_SCX == localCiType) - { - flag = 1U; - } - else if (CI_TYPE_CLD == localCiType) - { - if (CLD_SCX_MERGE_ON == chCldAndScxMergeFlag) - {/*是车辆段,且车辆段与试车线合设*/ - flag = 1U; - } - } - else - { - /*无处理*/ - } - - if (1U == flag) + UINT8 flag = CI_ERROR;; + + flag = GetLocalCiIsScx(); + if (CI_SUCCESS == flag) { for (; ii < NONROUTE_ID_NUM_MAX; ii++) { @@ -11584,7 +11606,7 @@ void AxisSecJumpLockLogicManage(void) {/*未征用*/ /*设置征用*/ SetPhySecUseState(phyId, PHYSICAL_SECTION_USING_YES, 0); - SetJumpPhySectionPortectSecUse(phyId, PHYSICAL_SECTION_USING_YES);/*设置物理区段关联防护道岔的区段征用*/ + SetJumpPhySectionPortectSecUse(axisSectionId, PHYSICAL_SECTION_USING_YES);/*设置物理区段关联防护道岔的区段征用*/ /*转为选排*/ SetAxisJumpLockState(axisSectionId, AXIS_SECTION_JUMPLOCK_STATE_XUANPAI); } @@ -11601,38 +11623,7 @@ void AxisSecJumpLockLogicManage(void) case AXIS_SECTION_JUMPLOCK_STATE_LOCK: {/*计轴区段跳跃锁闭处理*/ - /*持续进行锁闭检查,检查通过,设置物理区段跳跃锁闭;检查不通过,设置未跳跃锁闭*/ - rtVal = LockAxisSecProc(axisSectionId);/*跳跃锁闭联锁条件检查*/ - if (CI_SUCCESS == rtVal) - { - if ((AXIS_SECTION_JUMPLOCK_APPLY_YES == applyFlag) && - (AXSEC_CANCEL_JUMPLOCK_APPLY_NO == cancelApplyFlag) && - (curCycle == applyCycle)) - {/*本周期有跳跃锁闭申请,才设置物理区段跳跃锁闭*/ - SetPhySecJumpLockState(phyId, PHYSICAL_SECTION_JUMP_LOCK_YES); - SetAxisRelProSwitchLockSta(axisSectionId, SWITCH_LOCK_PROTECT_SET); - SetPhySecJumpLockStateToZC(phyId, PHYSICAL_SECTION_JUMP_LOCK_YES); - SetAxisInCludeLogJumpLockState(axisSectionId, LOGIC_SECTION_JUMP_LOCK_YES); - } - else - { - chPhySecJmpState = GetPhySecJumpLockState(phyId); - if ((PHYSICAL_SECTION_JUMP_LOCK_YES == chPhySecJmpState) && (0U < applyCycle)) - { - SetPhySecJumpLockStateToZC(phyId, PHYSICAL_SECTION_JUMP_LOCK_YES); - } - } - } - else - {/*之前处于锁闭,当持续检查锁闭条件不满足时,内部维持跳跃锁闭,给ZC发不锁闭*/ - SetPhySecJumpLockStateToZC(phyId, PHYSICAL_SECTION_JUMP_LOCK_NO); - } - if ((AXIS_SECTION_JUMPLOCK_APPLY_NO == applyFlag) && - (AXSEC_CANCEL_JUMPLOCK_APPLY_YES == cancelApplyFlag)) - {/*有取消跳跃申请*/ - SetAxisJumpLockState(axisSectionId, AXIS_SECTION_JUMPLOCK_STATE_IDLE); - SetAxisRelProSwitchLockSta(axisSectionId, SWITCH_LOCK_PROTECT_CANCEL); - } + AxisJumpLockStateManage(axisSectionId); } break; default: @@ -11670,6 +11661,12 @@ void AxisJumpLockXuanPaiManage(const UINT16 axisSecId) { rtVal = CI_SUCCESS; } + + if (CI_SUCCESS == rtVal) + { + rtVal = JumpPhySecAllUseCheck(axisSecId);/*所有区段已设置上征用(不考虑相邻联锁,若防护道岔在相邻联锁则不跳跃锁闭)*/ + } + if (CI_SUCCESS == rtVal) { rtVal = LockAxisSecProc(axisSecId);/*跳跃锁闭联锁条件检查*/ @@ -11677,11 +11674,9 @@ void AxisJumpLockXuanPaiManage(const UINT16 axisSecId) axisSecSwitDrvOvtmFlag = ChekJumpLockSwitDrivOvtmStat(axisSecId);/*检查计轴区段关联道岔是否驱动超时*/ if (CI_SUCCESS == rtVal) {/*检查成功*/ - SetAxisJumpLockState(axisSecId, AXIS_SECTION_JUMPLOCK_STATE_LOCK); - /*设置未征用*/ - SetPhySecUseState(phyId, PHYSICAL_SECTION_USING_NO, 0); - SetJumpPhySectionPortectSecUse(phyId, PHYSICAL_SECTION_USING_NO);/*设置物理区段的防护道岔所在区段取消防护征用*/ + SetAxisJumpLockState(axisSecId, AXIS_SECTION_JUMPLOCK_STATE_LOCK);/*状态机流程转*/ + } else if ((RETURN_LOCK_ERR_SWITPOS == rtVal) && (CI_SUCCESS == axisSecSwitDrvOvtmFlag)) {/*位置错误可驱动且驱动道岔没有超时*/ @@ -11692,7 +11687,7 @@ void AxisJumpLockXuanPaiManage(const UINT16 axisSecId) { /*设置未征用*/ SetPhySecUseState(phyId, PHYSICAL_SECTION_USING_NO, 0); - SetJumpPhySectionPortectSecUse(phyId, PHYSICAL_SECTION_USING_NO);/*设置物理区段的防护道岔所在区段取消防护征用*/ + SetJumpPhySectionPortectSecUse(axisSecId, PHYSICAL_SECTION_USING_NO);/*设置物理区段的防护道岔所在区段取消防护征用*/ /*设置计轴区段跳跃状态空闲*/ SetAxisJumpLockState(axisSecId, AXIS_SECTION_JUMPLOCK_STATE_IDLE); @@ -11702,7 +11697,7 @@ void AxisJumpLockXuanPaiManage(const UINT16 axisSecId) {/*其它*/ /*设置未征用*/ SetPhySecUseState(phyId, PHYSICAL_SECTION_USING_NO, 0); - SetJumpPhySectionPortectSecUse(phyId, PHYSICAL_SECTION_USING_NO);/*设置物理区段的防护道岔所在区段取消防护征用*/ + SetJumpPhySectionPortectSecUse(axisSecId, PHYSICAL_SECTION_USING_NO);/*设置物理区段的防护道岔所在区段取消防护征用*/ /*设置计轴区段跳跃状态空闲*/ SetAxisJumpLockState(axisSecId, AXIS_SECTION_JUMPLOCK_STATE_IDLE); @@ -14497,10 +14492,23 @@ void PhySecJumpLockLogicManage(void) chPhySecFLockType = GetPhySecFLockType(wPhyId); /*获取物理区段封锁类型*/ if ((PHY_SEC_FLOCK_TYPE_NONE == chPhySecFLockType)) { + ClearAxisSeceSwitchDanCaoPos(wAxisSectionId);/*清除单操*/ SetPhySecJumpLockState(wPhyId, PHYSICAL_SECTION_JUMP_LOCK_YES); SetAxisRelProSwitchLockSta(wAxisSectionId, SWITCH_LOCK_PROTECT_SET); - /* SetPhySecJumpLockStateToZC(wPhyId, PHYSICAL_SECTION_JUMP_LOCK_YES);当周期先不给ZC发锁闭*/ - SetAxisInCludeLogJumpLockState(wAxisSectionId, LOGIC_SECTION_JUMP_LOCK_YES); + + chTempcheck = AxisRelatedProSwitchLockCheck(wAxisSectionId, &devId, &devState); + if (CI_SUCCESS == chTempcheck) + {/*检查计轴区段锁闭状态*/ + SetPhySecJumpLockStateToZC(wPhyId, PHYSICAL_SECTION_JUMP_LOCK_YES); + SetAxisInCludeLogJumpLockState(wAxisSectionId, LOGIC_SECTION_JUMP_LOCK_YES); + } + else + { + /*无执行*/ + } + + + } else { @@ -14529,6 +14537,10 @@ void PhySecJumpLockLogicManage(void) { SetPhySecJumpLockStateToZC(wPhyId, PHYSICAL_SECTION_JUMP_LOCK_YES); } + else + { + SetPhySecJumpLockStateToZC(wPhyId, PHYSICAL_SECTION_JUMP_LOCK_NO); + } } } } @@ -16850,4 +16862,1288 @@ void lockSwitchLogicManage(void) } } } +} +/* +* 功能描述: 计轴区段跳跃锁闭状态机管理 +* 参数说明: const UINT16 axisSecId, 计轴区段ID +* 返回值 : void +* add by mpt 20260407 +*/ +void AxisJumpLockStateManage(const UINT16 axisSectionId) +{ + UINT8 rtVal = 0U; + UINT8 applyFlag = 0U; + UINT32 applyCycle = 0U; + UINT8 cancelApplyFlag = 0U; + UINT16 phyId = 0U; + UINT32 curCycle = 0U; + UINT8 chPhySecJmpState = 0U; + + + applyFlag = GetAxisSecJumpLockApplyFlag(axisSectionId); + applyCycle = GetAxisSecJumpLockApplyCylce(axisSectionId); + cancelApplyFlag = GetAxisSecJLockCancelApplyFlag(axisSectionId); + + phyId = GetAxisSecRelativePhySecId(axisSectionId);/*获取相关物理区段ID*/ + curCycle = Get2oo2CurCycleNum(); + + + /*持续进行锁闭检查,检查通过,设置物理区段跳跃锁闭;检查不通过,设置未跳跃锁闭*/ + rtVal = LockAxisSecProc(axisSectionId);/*跳跃锁闭联锁条件检查*/ + if (CI_SUCCESS == rtVal) + { + if ((AXIS_SECTION_JUMPLOCK_APPLY_YES == applyFlag) && + (AXSEC_CANCEL_JUMPLOCK_APPLY_NO == cancelApplyFlag) && + (curCycle == applyCycle)) + {/*本周期有跳跃锁闭申请,才设置物理区段跳跃锁闭*/ + chPhySecJmpState = GetPhySecJumpLockState(phyId); + if (PHYSICAL_SECTION_JUMP_LOCK_NO == chPhySecJmpState) + {/*无跳跃锁闭且当前无征用*/ + ClearAxisSeceSwitchDanCaoPos(axisSectionId);/*清除单操*/ + + SetPhySecJumpLockState(phyId, PHYSICAL_SECTION_JUMP_LOCK_YES); + SetAxisRelProSwitchLockSta(axisSectionId, SWITCH_LOCK_PROTECT_SET); + SetPhySecJumpLockStateToZC(phyId, PHYSICAL_SECTION_JUMP_LOCK_YES); + SetAxisInCludeLogJumpLockState(axisSectionId, LOGIC_SECTION_JUMP_LOCK_YES); + + /*设置未征用*/ + SetPhySecUseState(phyId, PHYSICAL_SECTION_USING_NO, 0); + SetJumpPhySectionPortectSecUse(axisSectionId, PHYSICAL_SECTION_USING_NO);/*设置物理区段的防护道岔所在区段取消防护征用*/ + } + else + { + /*不执行*/ + } + } + else + { + chPhySecJmpState = GetPhySecJumpLockState(phyId); + if ((PHYSICAL_SECTION_JUMP_LOCK_YES == chPhySecJmpState) && (0U < applyCycle)) + { + SetPhySecJumpLockStateToZC(phyId, PHYSICAL_SECTION_JUMP_LOCK_YES); + } + else if (PHYSICAL_SECTION_JUMP_LOCK_NO == chPhySecJmpState) + {/*当前未跳跃锁闭*/ + SetPhySecJumpLockStateToZC(phyId, PHYSICAL_SECTION_JUMP_LOCK_NO);/*给ZC不锁闭*/ + + if (AXIS_SECTION_JUMPLOCK_APPLY_NO == applyFlag) + {/*当前未申请*/ + /*设置未征用*/ + SetPhySecUseState(phyId, PHYSICAL_SECTION_USING_NO, 0); + SetJumpPhySectionPortectSecUse(axisSectionId, PHYSICAL_SECTION_USING_NO);/*设置物理区段的防护道岔所在区段取消防护征用*/ + + SetAxisJumpLockState(axisSectionId, AXIS_SECTION_JUMPLOCK_STATE_IDLE);/*设置计轴区段跳跃锁闭状态为空闲*/ + } + else + { + /*有申请则继续锁闭*/ + } + } + else + {/*维持之前*/ + } + } + } + else + {/*之前处于锁闭,当持续检查锁闭条件不满足时,内部维持跳跃锁闭,给ZC发不锁闭*/ + SetPhySecJumpLockStateToZC(phyId, PHYSICAL_SECTION_JUMP_LOCK_NO); + + chPhySecJmpState = GetPhySecJumpLockState(phyId); + if (PHYSICAL_SECTION_JUMP_LOCK_NO == chPhySecJmpState) + {/*未锁闭就一定有征用*/ + /*设置未征用*/ + SetPhySecUseState(phyId, PHYSICAL_SECTION_USING_NO, 0); + SetJumpPhySectionPortectSecUse(axisSectionId, PHYSICAL_SECTION_USING_NO);/*设置物理区段的防护道岔所在区段取消防护征用*/ + SetAxisJumpLockState(axisSectionId, AXIS_SECTION_JUMPLOCK_STATE_IDLE);/*设置计轴区段跳跃锁闭状态为空闲*/ + } + + } + if ((AXIS_SECTION_JUMPLOCK_APPLY_NO == applyFlag) && + (AXSEC_CANCEL_JUMPLOCK_APPLY_YES == cancelApplyFlag)) + {/*有取消跳跃申请*/ + SetAxisJumpLockState(axisSectionId, AXIS_SECTION_JUMPLOCK_STATE_IDLE); + SetAxisRelProSwitchLockSta(axisSectionId, SWITCH_LOCK_PROTECT_CANCEL); + } + +} + +/* +* 功能描述: 试车状态管理逻辑处理中获取本联锁是否具备试车功能(拆分复杂度使用) +*参数说明:无 +* 返回值 :CI_SUCCESS 是试车线(含合设) CI_ERROR +*/ +UINT8 GetLocalCiIsScx(void) +{ + UINT8 chRtn = CI_ERROR; + UINT8 chCldAndScxMergeFlag = GetCldAndScxMergeFlag(); + UINT8 localCiType = GetLocalCiType(); + + if (CI_TYPE_SCX == localCiType) + { + chRtn = CI_SUCCESS; + } + else if (CI_TYPE_CLD == localCiType) + { + if (CLD_SCX_MERGE_ON == chCldAndScxMergeFlag) + {/*是车辆段,且车辆段与试车线合设*/ + chRtn = CI_SUCCESS; + } + else + { + ;/*返回CI_ERROR;*/ + } + } + else + { + ;/*返回CI_ERROR;*/ + } + return chRtn; +} + +/* +* 功能描述: 联络线进路解锁管理 +* 参数说明: const UINT16 wRouteId 进路ID +* 返回值 : 无 +* Create:lyj 20260603 +*/ +void ConnectRouteReleaseManage(const UINT16 wRouteId) +{ + UINT8 chLocalCiId = 0U; /*本地联锁ID*/ + UINT8 chBelongCiId = 0U; /*进路所属联锁ID*/ + UINT8 chAutoSigRouteState = 0U; /*自动信号进路状态*/ + UINT16 wQXzhaochaRelay = 0U; + UINT8 chColleState = 0U; + UINT8 chvirCiId = 0U; + UINT8 chVirCiType = 0U; + UINT8 chRouteState = 0U; + UINT8 chConnectType = 0U; + + if ((0U < wRouteId) && (ROUTE_SUM_MAX > wRouteId)) + { + chLocalCiId = GetSystemParaLocalCiId(); /*获取本机联锁ID*/ + chBelongCiId = GetRouteBelongCiId(wRouteId); /*获取进路所属联锁ID*/ + if ((chLocalCiId == chBelongCiId) && (0U != chBelongCiId)) + { + chConnectType = GetRouteConnectType(wRouteId); /*获取进路联络线属性*/ + if (ROUTE_TYPE_CONNECT == chConnectType) + { + chAutoSigRouteState = GetRouteAutoSigSetState(wRouteId); /*获取进路自动信号状态*/ + chRouteState = GetRouteState(wRouteId); + /*不是自动信号,并且进路不处于延时解锁*/ + if ((ROUTE_AUTOSIGROUTE_NO == chAutoSigRouteState) && (ROUTE_STATE_DELAY_UNLOCK != chRouteState)) + { + wQXzhaochaRelay = GetRouteCancleZhaoChaRelayId(wRouteId); + if ((0U < wQXzhaochaRelay) && (RELAY_SUM_MAX > wQXzhaochaRelay)) + { + chColleState = GetRelayCollState(wQXzhaochaRelay); + if (RELAY_STATE_DOWN == chColleState) + { + SetRouteConnectReleaseFlag(wRouteId, ROUTE_CONNECT_RELEASE_YES); /*设置联络线解锁标志*/ + chvirCiId = GetRouteBelongVirCiId(wRouteId); + chVirCiType = GetLocalVirCiType(chvirCiId); + /*调用总人解函数设置总人解标志*/ + if (CI_TYPE_CLD == chVirCiType) + { + /*总人解*/ + ZongRenJieRouteM(wRouteId); + } + else + {/*总人解*/ + RouteZongRenJieLogicManage(wRouteId); + } + + } + else + { + SetErrorData(EFUNC_CONNECT_ROUTE_RELEASE, CI_DEVICE_TYPE_ROUTE, wRouteId, ETYPE_CONNECT_ROUTE_RELEASE, 0U, ESEND_LEVEL_ATS); + } + } + else + { + SetErrorData(EFUNC_CONNECT_ROUTE_RELEASE, CI_DEVICE_TYPE_ROUTE, wRouteId, ETYPE_CONNECT_ROUTE_RELEASE, 0U, ESEND_LEVEL_ATS); + } + } + else + { + SetErrorData(EFUNC_CONNECT_ROUTE_RELEASE, CI_DEVICE_TYPE_ROUTE, wRouteId, ETYPE_CONNECT_ROUTE_RELEASE, 0U, ESEND_LEVEL_ATS); + } + } + else + { + SetErrorData(EFUNC_CONNECT_ROUTE_RELEASE, CI_DEVICE_TYPE_ROUTE, wRouteId, ETYPE_CONNECT_ROUTE_RELEASE, 0U, ESEND_LEVEL_ATS); + } + + } + else + { + /*不处理-ATS命令处理防护了*/ + } + + } + else + { + /*不处理-ATS命令处理防护了*/ + } + +} + + +/* +* 功能描述: 新增一二次命令管理 +* 参数说明: 无 +* 返回值 : void +* BY fan 20260602 +*/ +void AtsFollowUpCmdProcess(void) +{ + /*依次进行各种消息检查及处理*/ + + /*道岔单解*/ + FollowUpDansuoCanclMsgProc(); + /*道岔解封*/ + FollowUpSwitchUnFlockMsgProc(); + /*区段解封*/ + FollowUpSecUnFlockMsgProc(); + /*信号机解封*/ + FollowUpSignalUnFlockMsgProc(); +} + +/* +* 功能描述: 道岔单解命令管理 +* 参数说明: 无 +* 返回值 : void +* BY fan 20260602 +*/ +void FollowUpDansuoCanclMsgProc(void) +{ + AtsFollowUpCmdFstStru * strMsgFst = NULL;/*首次消息指针*/ + AtsFollowUpCmdSndStru * strMsgSnd = NULL;/*再次消息指针*/ + RCIFollowUpReplyStru * strCfmFst = NULL;/*首次回复指针*/ + RCIFollowUpReplyStru *strCfmSnd = NULL;/*二次回复指针*/ + UINT8 chLocalId = 0U; + UINT32 dwCycle = 0U; + UINT8 chRtn = CI_ERROR;/*中间获取结果*/ + UINT8 szCrcTmp[1024] = { 0U }; + UINT16 ii = 0U; + UINT32 dwCrc = 0U;/*二次消息CRC计算*/ + chLocalId = GetSystemParaLocalCiId(); + dwCycle = Get2oo2CurCycleNum(); + + /*获取对应一次、二次命令 以及首次、再次确认消息*/ + strMsgFst = GetAtsFollowUpMsgFst(ATS_CI_INFO_FST_DS_CANCEL); + strMsgSnd = GetAtsFollowUpMsgSnd(ATS_CI_INFO_SND_DS_CANCEL); + strCfmFst = GetAtsFollowUpReplyFst(RCI_ATS_INFO_FST_DS_CANCEL); + strCfmSnd = GetAtsFollowUpReplySnd(RCI_ATS_INFO_SND_DS_CANCEL); + if ((NULL == strMsgFst) || (NULL == strMsgSnd) + || (NULL == strCfmFst) || (NULL == strCfmSnd)) + { + ; + } + else + { + if ((strMsgFst->chFlag != FLAG_SET) && (strMsgSnd->chFlag != FLAG_SET)) + { + ; /* 没有新消息,什么也不做 */ + } + else if (FLAG_SET == strMsgFst->chFlag) + { + /* 一次消息有效 */ + if (strMsgFst->dwCycle == dwCycle) + { + strCfmFst->chFlag = FLAG_SET; + strCfmFst->chTiocId = chLocalId; + strCfmFst->chRtuId = strMsgFst->chRtuId; + strCfmFst->chAtsId = strMsgFst->chAtsId; + strCfmFst->wIndex = strMsgFst->wIndex; + strCfmFst->dwTime = dwCycle; + + if ((SWITCH_SUM_MAX <= strMsgFst->wDevId)||(chLocalId != strMsgFst->chTiocId)) + {/* 获取设备ID出错,返回不属于本集中区*/ + strCfmFst->chOpStatus = CONFIRM_FST_BELONGERROR; + } + else + { + strCfmFst->chOpStatus = FollowUpDansuoCancleCheck(strMsgFst->wDevId, ATS_CI_INFO_FST_DS_CANCEL); + } + + szCrcTmp[ii] = strMsgFst->chAtsId; + ii++; + szCrcTmp[ii] = strMsgFst->chRtuId; + ii++; + ShortToChar(strMsgFst->wIndex, &szCrcTmp[ii]); + ii += 2U; + LongToChar(strMsgFst->dwTime, &szCrcTmp[ii]); + ii += 4U; + ShortToChar(strMsgFst->wDevId, &szCrcTmp[ii]); + ii += 2U; + strCfmFst->dwCrc32 = Tioc_CommonCrc32(szCrcTmp, ii); /* ATS编号、车站编号、操作站编号、ID、下发时间 计算CRC */ + debug_infor_printf((char*)"\n FollowUpDansuoCanclMsgProc DevId:%d, First Reply:%d \n", strMsgFst->wDevId, strCfmFst->chOpStatus); + if (CONFIRM_REPLY_SUCCESS != strCfmFst->chOpStatus) + { + ClearAtsCmdMsgFst(ATS_CI_INFO_FST_DS_CANCEL); + } + else + { + strMsgFst->chFlag = FLAG_UNSET; + } + } + else + { + ;/* 接收到对应一次消息非本周期 */ + } + } + else + { + /* 二次命令处理 */ + if (strMsgSnd->dwCycle == dwCycle) + { + strCfmSnd->chFlag = FLAG_SET; + strCfmSnd->chTiocId = chLocalId; + strCfmSnd->chRtuId = strMsgSnd->chRtuId; + strCfmSnd->chAtsId = strMsgSnd->chAtsId; + strCfmSnd->wIndex = strMsgSnd->wIndex; + strCfmSnd->dwTime = dwCycle; + + if(0u == strMsgFst->chFlag) + { + /*对应一次命令已清零*/ + strCfmSnd->chOpStatus = CONFIRM_SND_FIRST_NOTFIND; + } + else if ((strMsgSnd->chAtsId != strMsgFst->chAtsId) + ||(strMsgSnd->chRtuId != strMsgFst->chRtuId) + || (strMsgSnd->wIndex != strMsgFst->wIndex) + || (strMsgSnd->chTiocId != strMsgFst->chTiocId) + || (strMsgSnd->wDevId != strMsgFst->wDevId)) + { + strCfmSnd->chOpStatus = CONFIRM_SND_DIFFCMD; + } + else + { + szCrcTmp[ii] = strMsgSnd->chTiocId; + ii++; + LongToChar(strCfmFst->dwTime, &szCrcTmp[ii]); + ii += 4u; + ShortToChar(strMsgSnd->wDevId, &szCrcTmp[ii]); + ii += 2u; + debug_infor_printf((char*)"\nSecondRecvCrc: 1.Tioc:%d , 2.Time:%d 3.Id:%d", strMsgSnd->chTiocId, strCfmFst->dwTime, strMsgSnd->wDevId ); + dwCrc = Tioc_CommonCrc32(szCrcTmp, ii); + if (dwCrc != strMsgSnd->dwCrc32) + { + /* 计算的CRC32与ATS二次消息CRC32不一致 */ + strCfmSnd->chOpStatus = CONFIRM_SND_CRCFAIL; + } + else + { + strCfmSnd->chOpStatus = FollowUpDansuoCancleCheck(strMsgSnd->wDevId, ATS_CI_INFO_SND_DS_CANCEL); + } + } + ii = 0U; + szCrcTmp[ii] = strMsgSnd->chAtsId; + ii++; + szCrcTmp[ii] = strMsgSnd->chRtuId; + ii++; + ShortToChar(strMsgSnd->wIndex, &szCrcTmp[ii]); + ii += 2U; + LongToChar(strMsgSnd->dwTime, &szCrcTmp[ii]); + ii += 4u; + ShortToChar(strMsgSnd->wDevId, &szCrcTmp[ii]); + ii += 2u; + strCfmSnd->dwCrc32 = Tioc_CommonCrc32(szCrcTmp, ii); /* ATS编号、Rtu编号、操作站编号、二次下发时间、设备ID 计算CRC */ + debug_infor_printf((char*)"\n FollowUpDansuoCanclMsgProc DevId:%d, Second Reply:%d \n", strMsgSnd->wDevId, strCfmSnd->chOpStatus); + /*已处理*/ + ClearAtsCmdMsgFst(ATS_CI_INFO_FST_DS_CANCEL); + ClearAtsCmdReplyFst(RCI_ATS_INFO_FST_DS_CANCEL); + ClearAtsCmdMsgSnd(ATS_CI_INFO_SND_DS_CANCEL); + } + } + /*命令超时处理*/ + chRtn = SystemOverTimeCheck(strMsgFst->dwCycle, FOLLOWUP_CONFIRM_TIMEOUT); + if (CI_TIME_OUT == chRtn) + { + ClearAtsCmdMsgFst(ATS_CI_INFO_FST_DS_CANCEL); + ClearAtsCmdReplyFst(RCI_ATS_INFO_FST_DS_CANCEL); + ClearAtsCmdMsgSnd(ATS_CI_INFO_SND_DS_CANCEL); + ClearAtsCmdReplySnd(RCI_ATS_INFO_SND_DS_CANCEL); + } + } +} + +/* +* 功能描述: 道岔单解命令状态检查,返回成功或检查失败原因 +* 参数说明: + UINT16 wDevId命令中设备 + UINT16 wMsgType, 命令类型 +* 返回值 : +1 成功 +2:道岔未设置单锁 +3:道岔不属于本集中区 +5:已办理非进路调车 +* BY fan 20260603 +*/ +UINT8 FollowUpDansuoCancleCheck(UINT16 wDevId, UINT16 wMsgType) +{ + UINT8 chRtn = CONFIRM_FST_BELONGERROR; + UINT8 chDevBelongCi = 0U;/*设备所属联锁*/ + UINT8 chLocalId = GetSystemParaLocalCiId(); + UINT8 localCiType = 0U; + UINT8 chNonRouteCheck = CI_ERROR; + UINT8 chState = 0U;/*当前状态*/ + UINT8 switchType = GetSwitchType(wDevId); + UINT16 switch2ndId = 0U;/*双动*/ + UINT8 functionId = EFUNC_FOLLOWUP_SWITCH_DANSUO_CANCLE; + UINT8 chVir = 0U;/*设备所属虚拟联锁ID*/ + chDevBelongCi = GetSwitchBelongCiId(wDevId); + + if (chDevBelongCi == chLocalId) + { + /*道岔1锁闭状态 =【单锁】或【单锁且防护锁闭】*/ + chState = GetSwitchLockStatus(wDevId); + if ((SWITCH_LOCK_STATUS_DANSUO == chState) || (SWITCH_LOCK_STATUS_DAP == chState)) + { + /*【单锁】或【单锁且防护锁闭】*/ + chRtn = CONFIRM_REPLY_SUCCESS; + if (SWITCH_TYPE_DOUBLE == switchType) + { + switch2ndId = GetDSwitchOtherId(wDevId); + chState = GetSwitchLockStatus(switch2ndId); + if ((SWITCH_LOCK_STATUS_DANSUO == chState) || (SWITCH_LOCK_STATUS_DAP == chState)) + { + chRtn = CONFIRM_REPLY_SUCCESS; + } + else + { + chRtn = CONFIRM_FST_UNSET; + SetErrorData(functionId, CI_DEVICE_TYPE_SWITCH, switch2ndId, ETYPE_SWT_LOCK_STATUS, SWITCH_LOCK_STATUS_DANSUO_NO, ESEND_LEVEL_ZERO); + /* 失败返回 */ + } + } + if (CONFIRM_REPLY_SUCCESS == chRtn) + { + chVir = GetSwitchBelongVirCiId(wDevId); + localCiType = GetLocalVirCiType(chVir); + if (CI_TYPE_CLD == localCiType) + { + chNonRouteCheck = CheckSwitchBelongNonRoute(wDevId); + if (CI_SUCCESS == chNonRouteCheck) + { /*道岔属于已办理非进路*/ + chRtn = CONFIRM_DEVICE_NONROUTE_SET; + debug_infor_printf((char*)"FollowUpDansuoCancleCheck Fail: Swicth%d SetNonRoute\n", wDevId); + } + else if (SWITCH_TYPE_DOUBLE == switchType) + { + chNonRouteCheck = CheckSwitchBelongNonRoute(switch2ndId); + if (CI_SUCCESS == chNonRouteCheck) + { /*道岔属于已办理非进路*/ + chRtn = CONFIRM_DEVICE_NONROUTE_SET; + debug_infor_printf((char*)"FollowUpDansuoCancleCheck Fail: Swicth%d SetNonRoute\n", switch2ndId); + } + else + { + ;/*无非进路检查 返回成功*/ + } + } + else + { + chRtn = CONFIRM_REPLY_SUCCESS; + } + } + else + { + ;/*无非进路检查 返回成功*/ + } + } + } + else + { + chRtn = CONFIRM_FST_UNSET; + SetErrorData(functionId, CI_DEVICE_TYPE_SWITCH, wDevId, ETYPE_SWT_LOCK_STATUS, SWITCH_LOCK_STATUS_DANSUO_NO, ESEND_LEVEL_ZERO); + } + } + else + { + chRtn = CONFIRM_FST_BELONGERROR; + } + + if ((CONFIRM_REPLY_SUCCESS == chRtn) && (ATS_CI_INFO_SND_DS_CANCEL == wMsgType)) + { + /*二次通过,执行操作*/ + if (SWITCH_TYPE_DOUBLE == switchType) + {/*双动道岔*/ + switch2ndId = GetDSwitchOtherId(wDevId); + SetSwitchLockStatus(SWITCH_PLOCKTYPE_DANSUO, 0u, switch2ndId, SWITCH_LOCK_DANSUO_CANCEL); /*取消另一道岔单锁*/ + } + + SetSwitchLockStatus(SWITCH_PLOCKTYPE_DANSUO, 0u, wDevId, SWITCH_LOCK_DANSUO_CANCEL); /*取消道岔单锁*/ + } + return chRtn; +} + +/* +* 功能描述: 道岔解封命令管理 +* 参数说明: 无 +* 返回值 : void +* BY fan 20260602 +*/ +void FollowUpSwitchUnFlockMsgProc(void) +{ + AtsFollowUpCmdFstStru * strMsgFst = NULL;/*首次消息指针*/ + AtsFollowUpCmdSndStru * strMsgSnd = NULL;/*再次消息指针*/ + RCIFollowUpReplyStru * strCfmFst = NULL;/*首次回复指针*/ + RCIFollowUpReplyStru *strCfmSnd = NULL;/*二次回复指针*/ + UINT8 chLocalId = 0U; + UINT32 dwCycle = 0U; + UINT8 chRtn = CI_ERROR;/*中间获取结果*/ + UINT8 szCrcTmp[1024] = { 0U }; + UINT16 ii = 0U; + UINT32 dwCrc = 0U;/*二次消息CRC计算*/ + chLocalId = GetSystemParaLocalCiId(); + dwCycle = Get2oo2CurCycleNum(); + + /*获取对应一次、二次命令 以及首次、再次确认消息*/ + strMsgFst = GetAtsFollowUpMsgFst(ATS_CI_INFO_FST_SWIUNFLOCK); + strMsgSnd = GetAtsFollowUpMsgSnd(ATS_CI_INFO_SND_SWIUNFLOCK); + strCfmFst = GetAtsFollowUpReplyFst(RCI_ATS_INFO_FST_SWIUNFLOCK); + strCfmSnd = GetAtsFollowUpReplySnd(RCI_ATS_INFO_SND_SWIUNFLOCK); + if ((NULL == strMsgFst) || (NULL == strMsgSnd) + || (NULL == strCfmFst) || (NULL == strCfmSnd)) + { + ; + } + else + { + if ((strMsgFst->chFlag != FLAG_SET) && (strMsgSnd->chFlag != FLAG_SET)) + { + ; /* 没有新消息,什么也不做 */ + } + else if (strMsgFst->chFlag == FLAG_SET) + { + /* 一次消息有效 */ + if (strMsgFst->dwCycle == dwCycle) + { + strCfmFst->chFlag = FLAG_SET; + strCfmFst->chTiocId = chLocalId; + strCfmFst->chAtsId = strMsgFst->chAtsId; + strCfmFst->chRtuId = strMsgFst->chRtuId; + strCfmFst->wIndex = strMsgFst->wIndex; + strCfmFst->dwTime = dwCycle; + + if((SWITCH_SUM_MAX <= strMsgFst->wDevId) || (chLocalId != strMsgFst->chTiocId)) + {/* 获取设备ID出错,返回不属于本集中区*/ + strCfmFst->chOpStatus = CONFIRM_FST_BELONGERROR; + } + else + { + strCfmFst->chOpStatus = FollowUpSwitchUnFlockCheck(strMsgFst->wDevId, ATS_CI_INFO_FST_SWIUNFLOCK); + } + + szCrcTmp[ii] = strMsgFst->chAtsId; + ii++; + szCrcTmp[ii] = strMsgFst->chRtuId; + ii++; + ShortToChar(strMsgFst->wIndex, &szCrcTmp[ii]); + ii += 2U; + LongToChar(strMsgFst->dwTime, &szCrcTmp[ii]); + ii += 4U; + ShortToChar(strMsgFst->wDevId, &szCrcTmp[ii]); + ii += 2U; + strCfmFst->dwCrc32 = Tioc_CommonCrc32(szCrcTmp, ii); /* ATS编号、Rtu编号、操作站编号、一次下发时间、设备ID 计算CRC */ + + debug_infor_printf((char*)"\n FollowUpSwitchUnFlockMsgProc DevId:%d, First Reply:%d \n", strMsgFst->wDevId, strCfmFst->chOpStatus); + if (CONFIRM_REPLY_SUCCESS != strCfmFst->chOpStatus) + { + ClearAtsCmdMsgFst(ATS_CI_INFO_FST_SWIUNFLOCK); + } + else + { + strMsgFst->chFlag = FLAG_UNSET; + } + } + else + { + ;/* 接收到对应一次消息非本周期*/ + } + } + else + { + /* 二次命令处理*/ + if (strMsgSnd->dwCycle == dwCycle) + { + strCfmSnd->chFlag = FLAG_SET; + strCfmSnd->chTiocId = chLocalId; + strCfmSnd->chRtuId = strMsgSnd->chRtuId; + strCfmSnd->chAtsId = strMsgSnd->chAtsId; + strCfmSnd->wIndex = strMsgSnd->wIndex; + strCfmSnd->dwTime = dwCycle; + + if (0u == strMsgFst->chFlag) + { + /*对应一次命令已清零*/ + strCfmSnd->chOpStatus = CONFIRM_SND_FIRST_NOTFIND; + } + else if ((strMsgSnd->chAtsId != strMsgFst->chAtsId) + || (strMsgSnd->chRtuId != strMsgFst->chRtuId) + || (strMsgSnd->wIndex != strMsgFst->wIndex) + || (strMsgSnd->chTiocId != strMsgFst->chTiocId) + || (strMsgSnd->wDevId != strMsgFst->wDevId)) + { + strCfmSnd->chOpStatus = CONFIRM_SND_DIFFCMD; + } + else + { + szCrcTmp[ii] = strMsgSnd->chTiocId; + ii++; + LongToChar(strCfmFst->dwTime, &szCrcTmp[ii]); + ii += 4u; + ShortToChar(strMsgSnd->wDevId, &szCrcTmp[ii]); + ii += 2u; + dwCrc = Tioc_CommonCrc32(szCrcTmp, ii); + if (dwCrc != strMsgSnd->dwCrc32) + { + /* 计算的CRC32与ATS二次消息CRC32不一致 */ + strCfmSnd->chOpStatus = CONFIRM_SND_CRCFAIL; + } + else + { + strCfmSnd->chOpStatus = FollowUpSwitchUnFlockCheck(strMsgSnd->wDevId, ATS_CI_INFO_SND_SWIUNFLOCK); + } + } + ii = 0U; + szCrcTmp[ii] = strMsgSnd->chAtsId; + ii++; + szCrcTmp[ii] = strMsgSnd->chRtuId; + ii++; + ShortToChar(strMsgSnd->wIndex, &szCrcTmp[ii]); + ii += 2U; + LongToChar(strMsgSnd->dwTime, &szCrcTmp[ii]); + ii += 4u; + ShortToChar(strMsgSnd->wDevId, &szCrcTmp[ii]); + ii += 2u; + strCfmSnd->dwCrc32 = Tioc_CommonCrc32(szCrcTmp, ii); /* ATS编号、车站编号、操作站编号、ID 计算CRC*/ + debug_infor_printf((char*)"\n FollowUpSwitchUnFlockMsgProc DevId:%d, Second Reply:%d \n", strMsgSnd->wDevId, strCfmSnd->chOpStatus); + /*清除已处理命令*/ + ClearAtsCmdMsgFst(ATS_CI_INFO_FST_SWIUNFLOCK); + ClearAtsCmdReplyFst(RCI_ATS_INFO_FST_SWIUNFLOCK); + ClearAtsCmdMsgSnd(ATS_CI_INFO_SND_SWIUNFLOCK); + } + } + + /*超时处理*/ + chRtn = SystemOverTimeCheck(strMsgFst->dwCycle, FOLLOWUP_CONFIRM_TIMEOUT); + if (CI_TIME_OUT == chRtn) + { + ClearAtsCmdMsgFst(ATS_CI_INFO_FST_SWIUNFLOCK); + ClearAtsCmdReplyFst(RCI_ATS_INFO_FST_SWIUNFLOCK); + ClearAtsCmdMsgSnd(ATS_CI_INFO_SND_SWIUNFLOCK); + ClearAtsCmdReplySnd(RCI_ATS_INFO_SND_SWIUNFLOCK); + } + } +} + +/* +* 功能描述: 道岔解封命令状态检查,返回成功或检查失败原因,二次操作时执行命令 +* 参数说明: +UINT16 wDevId命令中设备 +UINT16 wMsgType, 命令类型 +* 返回值 : +1 成功 +2:道岔未设置封锁 +3:道岔不属于本集中区 +5:已办理非进路调车 +* BY fan 20260603 +*/ +UINT8 FollowUpSwitchUnFlockCheck(UINT16 wDevId, UINT16 wMsgType) +{ + UINT8 chRtn = CONFIRM_FST_BELONGERROR; + UINT8 chDevBelongCi = 0U;/*设备所属联锁*/ + UINT8 chLocalId = GetSystemParaLocalCiId(); + UINT8 localCiType = 0U; + UINT8 chNonRouteCheck = CI_ERROR; + UINT8 chState = 0U;/*当前状态*/ + UINT8 switchType = GetSwitchType(wDevId); + UINT16 switch2ndId = 0U;/*双动*/ + UINT8 functionId = EFUNC_FOLLOWUP_SWITCH_UNFLOCK; + UINT8 chVir = 0U;/*设备所属虚拟联锁ID*/ + chDevBelongCi = GetSwitchBelongCiId(wDevId); + + if (chDevBelongCi == chLocalId) + { + /*道岔状态封锁*/ + chState = GetSwitchFLockState(wDevId); + if(SWITCH_LOCK_FENGSUO_YES == chState) + { + /*存在封锁*/ + chRtn = CONFIRM_REPLY_SUCCESS; + if (SWITCH_TYPE_DOUBLE == switchType) + { + switch2ndId = GetDSwitchOtherId(wDevId); + chState = GetSwitchFLockState(switch2ndId); + if (SWITCH_LOCK_FENGSUO_YES == chState) + { + chRtn = CONFIRM_REPLY_SUCCESS; + } + else + { + chRtn = CONFIRM_FST_UNSET; + SetErrorData(functionId, CI_DEVICE_TYPE_SWITCH, switch2ndId, ETYPE_SWT_FLOCK_STATE, SWITCH_LOCK_FENGSUO_NO, ESEND_LEVEL_ZERO); + } + } + if (CONFIRM_REPLY_SUCCESS == chRtn) + { + chVir = GetSwitchBelongVirCiId(wDevId); + localCiType = GetLocalVirCiType(chVir); + if (CI_TYPE_CLD == localCiType) + { + chNonRouteCheck = CheckSwitchBelongNonRoute(wDevId); + if (CI_SUCCESS == chNonRouteCheck) + { /*道岔属于已办理非进路*/ + chRtn = CONFIRM_DEVICE_NONROUTE_SET; + debug_infor_printf((char*)"FollowUpSwitchUnFlockCheck Fail: Swicth%d SetNonRoute\n", wDevId); + } + else if (SWITCH_TYPE_DOUBLE == switchType) + { + chNonRouteCheck = CheckSwitchBelongNonRoute(switch2ndId); + if (CI_SUCCESS == chNonRouteCheck) + { /*道岔属于已办理非进路*/ + chRtn = CONFIRM_DEVICE_NONROUTE_SET; + debug_infor_printf((char*)"FollowUpSwitchUnFlockCheck Fail: Swicth%d SetNonRoute\n", switch2ndId); + } + else + { + ;/*无非进路检查 返回成功*/ + } + } + else + { + chRtn = CONFIRM_REPLY_SUCCESS; + } + } + else + { + ;/*无非进路检查 返回成功*/ + } + } + } + else + { + chRtn = CONFIRM_FST_UNSET; + SetErrorData(functionId, CI_DEVICE_TYPE_SWITCH, wDevId, ETYPE_SWT_FLOCK_STATE, SWITCH_LOCK_FENGSUO_NO, ESEND_LEVEL_ZERO); + } + } + else + { + chRtn = CONFIRM_FST_BELONGERROR; + } + + if ((CONFIRM_REPLY_SUCCESS == chRtn) && (ATS_CI_INFO_SND_SWIUNFLOCK == wMsgType)) + { + /*二次通过,执行操作*/ + if (SWITCH_TYPE_DOUBLE == switchType) + {/*双动道岔*/ + switch2ndId = GetDSwitchOtherId(wDevId); + SetSwitchFLockState(switch2ndId, SWITCH_LOCK_FENGSUO_NO); /*取消另一道岔封锁*/ + } + SetSwitchFLockState(wDevId, SWITCH_LOCK_FENGSUO_NO); /*取消道岔封锁*/ + + } + return chRtn; +} + +/* +* 功能描述: 区段解封命令管理 +* 参数说明: 无 +* 返回值 : void +* BY fan 20260604 +*/ +void FollowUpSecUnFlockMsgProc(void) +{ + AtsFollowUpCmdFstStru * strMsgFst = NULL;/*首次消息指针*/ + AtsFollowUpCmdSndStru * strMsgSnd = NULL;/*再次消息指针*/ + RCIFollowUpReplyStru * strCfmFst = NULL;/*首次回复指针*/ + RCIFollowUpReplyStru *strCfmSnd = NULL;/*二次回复指针*/ + UINT8 chLocalId = 0U; + UINT32 dwCycle = 0U; + UINT8 chRtn = CI_ERROR;/*中间获取结果*/ + UINT8 szCrcTmp[1024] = { 0U }; + UINT16 ii = 0U; + UINT32 dwCrc = 0U;/*二次消息CRC计算*/ + chLocalId = GetSystemParaLocalCiId(); + dwCycle = Get2oo2CurCycleNum(); + + /*获取对应一次、二次命令 以及首次、再次确认消息*/ + strMsgFst = GetAtsFollowUpMsgFst(ATS_CI_INFO_FST_SECUNFLOCK); + strMsgSnd = GetAtsFollowUpMsgSnd(ATS_CI_INFO_SND_SECUNFLOCK); + strCfmFst = GetAtsFollowUpReplyFst(RCI_ATS_INFO_FST_SECUNFLOCK); + strCfmSnd = GetAtsFollowUpReplySnd(RCI_ATS_INFO_SND_SECUNFLOCK); + if ((NULL == strMsgFst) || (NULL == strMsgSnd) + || (NULL == strCfmFst) || (NULL == strCfmSnd)) + { + ; + } + else + { + if ((strMsgFst->chFlag != FLAG_SET) && (strMsgSnd->chFlag != FLAG_SET)) + { + ; /* 没有新消息,什么也不做 */ + } + else if (strMsgFst->chFlag == FLAG_SET) + { + /* 一次消息有效 */ + if (strMsgFst->dwCycle == dwCycle) + { + strCfmFst->chFlag = FLAG_SET; + strCfmFst->chTiocId = chLocalId; + strCfmFst->chAtsId = strMsgFst->chAtsId; + strCfmFst->chRtuId = strMsgFst->chRtuId; + strCfmFst->wIndex = strMsgFst->wIndex; + strCfmFst->dwTime = dwCycle; + + if ((PHYSICAL_SECTION_SUM_MAX <= strMsgFst->wDevId) || (chLocalId != strMsgFst->chTiocId)) + {/* 获取设备ID出错,返回不属于本集中区*/ + strCfmFst->chOpStatus = CONFIRM_FST_BELONGERROR; + } + else + { + strCfmFst->chOpStatus = FollowUpSecUnFlockCheck(strMsgFst->wDevId, ATS_CI_INFO_FST_SECUNFLOCK); + } + + szCrcTmp[ii] = strMsgFst->chAtsId; + ii++; + szCrcTmp[ii] = strMsgFst->chRtuId; + ii++; + ShortToChar(strMsgFst->wIndex, &szCrcTmp[ii]); + ii += 2U; + LongToChar(strMsgFst->dwTime, &szCrcTmp[ii]); + ii += 4U; + ShortToChar(strMsgFst->wDevId, &szCrcTmp[ii]); + ii += 2U; + strCfmFst->dwCrc32 = Tioc_CommonCrc32(szCrcTmp, ii); /* ATS编号、Rtu编号、操作站编号、下发时间、设备ID 计算CRC */ + debug_infor_printf((char*)"\n FollowUpSecUnFlockMsgProc DevId:%d, First Reply:%d \n", strMsgFst->wDevId, strCfmFst->chOpStatus); + if (CONFIRM_REPLY_SUCCESS != strCfmFst->chOpStatus) + { + ClearAtsCmdMsgFst(ATS_CI_INFO_FST_SECUNFLOCK); + } + else + { + strMsgFst->chFlag = FLAG_UNSET; + } + } + else + { + ;/* 接收到对应一次消息非本周期*/ + } + } + else + { + /* 二次命令处理*/ + if (strMsgSnd->dwCycle == dwCycle) + { + strCfmSnd->chFlag = FLAG_SET; + strCfmSnd->chTiocId = chLocalId; + strCfmSnd->chRtuId = strMsgSnd->chRtuId; + strCfmSnd->chAtsId = strMsgSnd->chAtsId; + strCfmSnd->wIndex = strMsgSnd->wIndex; + strCfmSnd->dwTime = dwCycle; + + if (0u == strMsgFst->chFlag) + { + /*对应一次命令已清零*/ + strCfmSnd->chOpStatus = CONFIRM_SND_FIRST_NOTFIND; + } + else if ((strMsgSnd->chAtsId != strMsgFst->chAtsId) + || (strMsgSnd->chRtuId != strMsgFst->chRtuId) + || (strMsgSnd->wIndex != strMsgFst->wIndex) + || (strMsgSnd->chTiocId != strMsgFst->chTiocId) + || (strMsgSnd->wDevId != strMsgFst->wDevId)) + { + strCfmSnd->chOpStatus = CONFIRM_SND_DIFFCMD; + } + else + { + szCrcTmp[ii] = strMsgSnd->chTiocId; + ii++; + LongToChar(strCfmFst->dwTime, &szCrcTmp[ii]); + ii += 4u; + ShortToChar(strMsgSnd->wDevId, &szCrcTmp[ii]); + ii += 2u; + dwCrc = Tioc_CommonCrc32(szCrcTmp, ii); + if (dwCrc != strMsgSnd->dwCrc32) + { + /* 计算的CRC32与ATS二次消息CRC32不一致 */ + strCfmSnd->chOpStatus = CONFIRM_SND_CRCFAIL; + } + else + { + strCfmSnd->chOpStatus = FollowUpSecUnFlockCheck(strMsgSnd->wDevId, ATS_CI_INFO_SND_SECUNFLOCK); + } + } + ii = 0U; + szCrcTmp[ii] = strMsgSnd->chAtsId; + ii++; + szCrcTmp[ii] = strMsgSnd->chRtuId; + ii++; + ShortToChar(strMsgSnd->wIndex, &szCrcTmp[ii]); + ii += 2U; + LongToChar(strMsgSnd->dwTime, &szCrcTmp[ii]); + ii += 4u; + ShortToChar(strMsgSnd->wDevId, &szCrcTmp[ii]); + ii += 2u; + strCfmSnd->dwCrc32 = Tioc_CommonCrc32(szCrcTmp, ii); /* ATS编号、车站编号、操作站编号、下发时间、ID*/ + debug_infor_printf((char*)"\n FollowUpSecUnFlockMsgProc DevId:%d, Second Reply:%d \n", strMsgSnd->wDevId, strCfmSnd->chOpStatus); + /*已处理*/ + ClearAtsCmdMsgFst(ATS_CI_INFO_FST_SECUNFLOCK); + ClearAtsCmdReplyFst(RCI_ATS_INFO_FST_SECUNFLOCK); + ClearAtsCmdMsgSnd(ATS_CI_INFO_SND_SECUNFLOCK); + } + } + + chRtn = SystemOverTimeCheck(strMsgFst->dwCycle, FOLLOWUP_CONFIRM_TIMEOUT); + if (CI_TIME_OUT == chRtn) + { + ClearAtsCmdMsgFst(ATS_CI_INFO_FST_SECUNFLOCK); + ClearAtsCmdReplyFst(RCI_ATS_INFO_FST_SECUNFLOCK); + ClearAtsCmdMsgSnd(ATS_CI_INFO_SND_SECUNFLOCK); + ClearAtsCmdReplySnd(RCI_ATS_INFO_SND_SECUNFLOCK); + } + } +} + +/* +* 功能描述: 区段解封命令状态检查,返回成功或检查失败原因,二次操作时执行命令 +* 参数说明: +UINT16 wDevId命令中设备 +UINT16 wMsgType, 命令类型 +* 返回值 : +1 成功 +2:未设置人工区段封锁 +3:不属于本集中区 +* BY fan 20260604 +*/ +UINT8 FollowUpSecUnFlockCheck(UINT16 wDevId, UINT16 wMsgType) +{ + UINT8 chRtn = CONFIRM_FST_BELONGERROR; + UINT8 chDevBelongCi = 0U;/*设备所属联锁*/ + UINT8 chLocalId = GetSystemParaLocalCiId(); + UINT8 chState = 0U;/*当前状态*/ + UINT8 flockType = 0u;/*封锁类型*/ + chDevBelongCi = GetPhySecBelongCiId(wDevId); + + if (chDevBelongCi == chLocalId) + { + /*检查状态封锁*/ + chState = GetPhySecFLockState(wDevId); + flockType = GetPhySecFLockType(wDevId); /*物理区段封锁类型*/ + if (PHYSICAL_SECTION_FLOCK_YES == chState) + { + if ((PHY_SEC_FLOCK_TYPE_SPKSCMD == flockType)|| (PHY_SEC_FLOCK_TYPE_CMD == flockType)) + {/*物理区段封锁*/ + chRtn = CONFIRM_REPLY_SUCCESS; + } + else + { + /*SPKS封锁不能取消封锁*/ + chRtn = CONFIRM_FST_UNSET; + SetErrorData(EFUNC_FOLLOWUP_SEC_UNFLOCK,CI_DEVICE_TYPE_PHYSEC,wDevId, ETYPE_PS_FLOCK_STATE, flockType, ESEND_LEVEL_ZERO); + } + } + else + { + chRtn = CONFIRM_FST_UNSET; + SetErrorData(EFUNC_FOLLOWUP_SEC_UNFLOCK, CI_DEVICE_TYPE_PHYSEC, wDevId, ETYPE_PS_UNFLOCK_STATE, chState, ESEND_LEVEL_ZERO); + } + } + else + { + chRtn = CONFIRM_FST_BELONGERROR; + } + + if ((CONFIRM_REPLY_SUCCESS == chRtn) && (ATS_CI_INFO_SND_SECUNFLOCK == wMsgType)) + { + /*二次通过,执行操作*/ + if (PHY_SEC_FLOCK_TYPE_CMD == flockType) + { + (void)SetPhySecFLockState(wDevId, PHYSICAL_SECTION_FLOCK_NO);/*设置物理区段封锁状态为未封锁*/ + SetPhySecFLockType(wDevId, PHY_SEC_FLOCK_TYPE_NONE);/*封锁类型设置成无封锁*/ + } + else + { + /*已检查spks或存在CMD,此处必有SPKS*/ + SetPhySecFLockType(wDevId, PHY_SEC_FLOCK_TYPE_SPKS); + } + } + return chRtn; +} + + +/* +* 功能描述: 信号机解封命令管理 +* 参数说明: 无 +* 返回值 : void +* BY fan 20260604 +*/ +void FollowUpSignalUnFlockMsgProc(void) +{ + AtsFollowUpCmdFstStru * strMsgFst = NULL;/*首次消息指针*/ + AtsFollowUpCmdSndStru * strMsgSnd = NULL;/*再次消息指针*/ + RCIFollowUpReplyStru * strCfmFst = NULL;/*首次回复指针*/ + RCIFollowUpReplyStru *strCfmSnd = NULL;/*二次回复指针*/ + UINT8 chLocalId = 0U; + UINT32 dwCycle = 0U; + UINT8 chRtn = CI_ERROR;/*中间获取结果*/ + UINT8 szCrcTmp[1024] = { 0U }; + UINT16 ii = 0U; + UINT32 dwCrc = 0U;/*二次消息CRC计算*/ + chLocalId = GetSystemParaLocalCiId(); + dwCycle = Get2oo2CurCycleNum(); + + /*获取对应一次、二次命令 以及首次、再次确认消息*/ + strMsgFst = GetAtsFollowUpMsgFst(ATS_CI_INFO_FST_SIGUNFLOCK); + strMsgSnd = GetAtsFollowUpMsgSnd(ATS_CI_INFO_SND_SIGUNFLOCK); + strCfmFst = GetAtsFollowUpReplyFst(RCI_ATS_INFO_FST_SIGUNFLOCK); + strCfmSnd = GetAtsFollowUpReplySnd(RCI_ATS_INFO_SND_SIGUNFLOCK); + if ((NULL == strMsgFst) || (NULL == strMsgSnd) + || (NULL == strCfmFst) || (NULL == strCfmSnd)) + { + ; + } + else + { + if ((strMsgFst->chFlag != FLAG_SET) && (strMsgSnd->chFlag != FLAG_SET)) + { + ; /* 没有新消息,什么也不做 */ + } + else if (strMsgFst->chFlag == FLAG_SET) + { + /* 一次消息有效 */ + if (strMsgFst->dwCycle == dwCycle) + { + strCfmFst->chFlag = FLAG_SET; + strCfmFst->chTiocId = chLocalId; + strCfmFst->chAtsId = strMsgFst->chAtsId; + strCfmFst->chRtuId = strMsgFst->chRtuId; + strCfmFst->wIndex = strMsgFst->wIndex; + strCfmFst->dwTime = dwCycle; + + if ((SIGNAL_SUM_MAX <= strMsgFst->wDevId) || (chLocalId != strMsgFst->chTiocId)) + {/* 获取设备ID出错,返回不属于本集中区*/ + strCfmFst->chOpStatus = CONFIRM_FST_BELONGERROR; + } + else + { + strCfmFst->chOpStatus = FollowUpSignalUnFlockCheck(strMsgFst->wDevId, ATS_CI_INFO_FST_SIGUNFLOCK); + } + + szCrcTmp[ii] = strMsgFst->chAtsId; + ii++; + szCrcTmp[ii] = strMsgFst->chRtuId; + ii++; + ShortToChar(strMsgFst->wIndex, &szCrcTmp[ii]); + ii += 2U; + LongToChar(strMsgFst->dwTime, &szCrcTmp[ii]); + ii += 4U; + ShortToChar(strMsgFst->wDevId, &szCrcTmp[ii]); + ii += 2U; + strCfmFst->dwCrc32 = Tioc_CommonCrc32(szCrcTmp, ii); /* ATS编号、Rtu编号、操作站编号、下发时间、设备ID 计算CRC */ + + debug_infor_printf((char*)"\n FollowUpSignalUnFlockMsgProc DevId:%d, First Reply:%d \n", strMsgFst->wDevId, strCfmFst->chOpStatus); + if (CONFIRM_REPLY_SUCCESS != strCfmFst->chOpStatus) + { + ClearAtsCmdMsgFst(ATS_CI_INFO_FST_SIGUNFLOCK); + } + else + { + strMsgFst->chFlag = FLAG_UNSET; + } + } + else + { + ;/* 接收到对应一次消息非本周期*/ + } + } + else + { + /* 二次命令处理*/ + if (strMsgSnd->dwCycle == dwCycle) + { + strCfmSnd->chFlag = FLAG_SET; + strCfmSnd->chTiocId = chLocalId; + strCfmSnd->chRtuId = strMsgSnd->chRtuId; + strCfmSnd->chAtsId = strMsgSnd->chAtsId; + strCfmSnd->wIndex = strMsgSnd->wIndex; + strCfmSnd->dwTime = dwCycle; + + if (0u == strMsgFst->chFlag) + { + /*对应一次命令已清零*/ + strCfmSnd->chOpStatus = CONFIRM_SND_FIRST_NOTFIND; + } + else if ((strMsgSnd->chAtsId != strMsgFst->chAtsId) + || (strMsgSnd->chRtuId != strMsgFst->chRtuId) + || (strMsgSnd->wIndex != strMsgFst->wIndex) + || (strMsgSnd->chTiocId != strMsgFst->chTiocId) + || (strMsgSnd->wDevId != strMsgFst->wDevId)) + { + strCfmSnd->chOpStatus = CONFIRM_SND_DIFFCMD; + } + else + { + szCrcTmp[ii] = strMsgSnd->chTiocId; + ii++; + LongToChar(strCfmFst->dwTime, &szCrcTmp[ii]); + ii += 4u; + ShortToChar(strMsgSnd->wDevId, &szCrcTmp[ii]); + ii += 2u; + dwCrc = Tioc_CommonCrc32(szCrcTmp, ii); + if (dwCrc != strMsgSnd->dwCrc32) + { + /* 计算的CRC32与ATS二次消息CRC32不一致 */ + strCfmSnd->chOpStatus = CONFIRM_SND_CRCFAIL; + } + else + { + strCfmSnd->chOpStatus = FollowUpSignalUnFlockCheck(strMsgSnd->wDevId, ATS_CI_INFO_SND_SIGUNFLOCK); + } + } + ii = 0U; + szCrcTmp[ii] = strMsgSnd->chAtsId; + ii++; + szCrcTmp[ii] = strMsgSnd->chRtuId; + ii++; + ShortToChar(strMsgSnd->wIndex, &szCrcTmp[ii]); + ii += 2U; + LongToChar(strMsgSnd->dwTime, &szCrcTmp[ii]); + ii += 4u; + ShortToChar(strMsgSnd->wDevId, &szCrcTmp[ii]); + ii += 2u; + strCfmSnd->dwCrc32 = Tioc_CommonCrc32(szCrcTmp, ii); /* ATS编号、车站编号、操作站编号、下发时间、ID 计算CRC */ + debug_infor_printf((char*)"\n FollowUpSignalUnFlockMsgProc DevId:%d, Second Reply:%d \n", strMsgSnd->wDevId, strCfmSnd->chOpStatus); + /*清除已处理命令*/ + ClearAtsCmdMsgFst(ATS_CI_INFO_FST_SIGUNFLOCK); + ClearAtsCmdReplyFst(RCI_ATS_INFO_FST_SIGUNFLOCK); + ClearAtsCmdMsgSnd(ATS_CI_INFO_SND_SIGUNFLOCK); + } + } + + chRtn = SystemOverTimeCheck(strMsgFst->dwCycle, FOLLOWUP_CONFIRM_TIMEOUT); + if (CI_TIME_OUT == chRtn) + { + ClearAtsCmdMsgFst(ATS_CI_INFO_FST_SIGUNFLOCK); + ClearAtsCmdReplyFst(RCI_ATS_INFO_FST_SIGUNFLOCK); + ClearAtsCmdMsgSnd(ATS_CI_INFO_SND_SIGUNFLOCK); + ClearAtsCmdReplySnd(RCI_ATS_INFO_SND_SIGUNFLOCK); + } + } +} + +/* +* 功能描述: 信号机解封命令状态检查,返回成功或检查失败原因,二次操作时执行命令 +* 参数说明: +UINT16 wDevId命令中设备 +UINT16 wMsgType, 命令类型 +* 返回值 : +1 成功 +2:未设置信号机封锁 +3:不属于本集中区 +5:所属非进路已办理 +* BY fan 20260604 +*/ +UINT8 FollowUpSignalUnFlockCheck(UINT16 wDevId, UINT16 wMsgType) +{ + UINT8 chRtn = CONFIRM_FST_BELONGERROR; + UINT8 chDevBelongCi = 0U;/*设备所属联锁*/ + UINT8 chLocalId = GetSystemParaLocalCiId(); + UINT8 chState = 0U;/*当前状态*/ + UINT8 localCiType = 0U; + UINT8 chNonRouteCheck = CI_ERROR; + UINT8 chVir = 0U;/*设备所属虚拟联锁ID*/ + chDevBelongCi = GetSignalBelongCiId(wDevId); + + if (chDevBelongCi == chLocalId) + { + /*检查状态封锁*/ + chState = GetSignalFLockState(wDevId); + if (SIGNAL_FENGSUO_YES == chState) + { + chVir = GetSignalBelongVirCiId(wDevId); + localCiType = GetLocalVirCiType(chVir); + if (CI_TYPE_CLD == localCiType) + { + chNonRouteCheck = CheckSignalBelongNonRoute(wDevId); + if (CI_SUCCESS == chNonRouteCheck) + { /*信号机属于已办理非进路*/ + chRtn = CONFIRM_DEVICE_NONROUTE_SET; + debug_infor_printf((char*)"FollowUpSignalUnFlockCheck Fail: Signal %d SetNonRoute\n", wDevId); + } + else + { + chRtn = CONFIRM_REPLY_SUCCESS; + } + } + else + { + chRtn = CONFIRM_REPLY_SUCCESS; + } + } + else + { + chRtn = CONFIRM_FST_UNSET; + SetErrorData(EFUNC_FOLLOWUP_SIGNAL_UNFLOCK, CI_DEVICE_TYPE_SIGNAL, wDevId, ETYPE_SIG_FLOCK_STATE, chState, ESEND_LEVEL_ZERO); + } + } + else + { + chRtn = CONFIRM_FST_BELONGERROR; + } + + if ((CONFIRM_REPLY_SUCCESS == chRtn) && (ATS_CI_INFO_SND_SIGUNFLOCK == wMsgType)) + { + /*二次通过,执行操作*/ + SetSignalFLockState(wDevId, SIGNAL_FENGSUO_NO); /*设置信号机未封锁*/ + } + return chRtn; +} + +/* +* 功能描述:信号已开放进路的共享资源处理 +* 参数说明:无 +* 返 回 值:无 +* Created By LQ 2026.06.09 +*/ +void OpenedRouteShareResPro(void) +{ + UINT8 cLocalCiId = 0U; /*本控区ID*/ + UINT16 wRouteCurSum = 0U; /*信号机数量*/ + UINT16 ii = 0U; + UINT16 wRouteId = 0U; /*进路ID*/ + UINT8 cRouteBelongCiId = 0U; /*进路所属控区ID*/ + UINT8 cRouteCurState = 0U; /*进路当前状态*/ + + cLocalCiId = GetSystemParaLocalCiId(); + wRouteCurSum = GetRouteCurSum(); + + for (ii = 0U; ii < wRouteCurSum; ii++) + { + wRouteId = GetRouteId(ii); + cRouteBelongCiId = GetRouteBelongCiId(wRouteId); /*获取进路所属联锁ID*/ + + /*判断是否为本控区进路*/ + if (cLocalCiId == cRouteBelongCiId) + { + cRouteCurState = GetRouteState(wRouteId); /*获取进路本周期状态*/ + + /*判断进路信号是否开放*/ + if ((ROUTE_STATE_YUXIAN_OPEN == cRouteCurState) || (ROUTE_STATE_NEAR_OPEN == cRouteCurState)) + { + /*进路状态为预先开放 或 接近开放,设置进路内逻辑区段资源共享标志为共享*/ + SetRouteLgcSecShareFlag(wRouteId, LOGIC_SECTION_RES_SHARE_YES); + } + else + { + /*其它场景,不处理*/ + } + } + else + { + /*非本控区进路,不处理*/ + } + } } \ No newline at end of file diff --git a/TSCP/src/APP/ciapp/LogicManage/InterlockLogicManage.h b/TSCP/src/APP/ciapp/LogicManage/InterlockLogicManage.h index ae64988..7307c7f 100644 --- a/TSCP/src/APP/ciapp/LogicManage/InterlockLogicManage.h +++ b/TSCP/src/APP/ciapp/LogicManage/InterlockLogicManage.h @@ -1161,6 +1161,130 @@ void SetCouplinkRouteLogicManage(const UINT16 wRouteId); * 返回值 : */ void lockSwitchLogicManage(void); +/* +* 功能描述: 计轴区段跳跃锁闭状态机管理 +* 参数说明: const UINT16 axisSecId, 计轴区段ID +* 返回值 : void +* add by mpt 20260407 +*/ +void AxisJumpLockStateManage(const UINT16 axisSectionId); + +/* +* 功能描述: 试车状态管理逻辑处理中获取本联锁是否具备试车功能(拆分复杂度使用) +*参数说明:无 +* 返回值 :CI_SUCCESS 是试车线(含合设) CI_ERROR +*/ +UINT8 GetLocalCiIsScx(void); +/* +* 功能描述: 联络线进路解锁管理 +* 参数说明: const UINT16 wRouteId 进路ID +* 返回值 : 无 +* Create:lyj 20260603 +*/ +void ConnectRouteReleaseManage(const UINT16 wRouteId); + +/* +* 功能描述: 新增一二次命令管理 +* 参数说明: 无 +* 返回值 : void +* BY fan 20260602 +*/ +void AtsFollowUpCmdProcess(void); + +/* +* 功能描述: 道岔单解命令管理 +* 参数说明: 无 +* 返回值 : void +* BY fan 20260602 +*/ +void FollowUpDansuoCanclMsgProc(void); + +/* +* 功能描述: 道岔单解命令状态检查,返回成功或检查失败原因 +* 参数说明: +UINT16 wDevId命令中设备 +UINT16 wMsgType, 命令类型 +* 返回值 : +1 成功 +2:道岔未设置单锁 +3:道岔不属于本集中区 +5:已办理非进路调车 +* BY fan 20260603 +*/ +UINT8 FollowUpDansuoCancleCheck(UINT16 wDevId, UINT16 wMsgType); + +/* +* 功能描述: 道岔解封命令管理 +* 参数说明: 无 +* 返回值 : void +* BY fan 20260602 +*/ +void FollowUpSwitchUnFlockMsgProc(void); + +/* +* 功能描述: 道岔解封命令状态检查,返回成功或检查失败原因,二次操作时执行命令 +* 参数说明: +UINT16 wDevId命令中设备 +UINT16 wMsgType, 命令类型 +* 返回值 : +1 成功 +2:道岔未设置封锁 +3:道岔不属于本集中区 +5:已办理非进路调车 +* BY fan 20260603 +*/ +UINT8 FollowUpSwitchUnFlockCheck(UINT16 wDevId, UINT16 wMsgType); + +/* +* 功能描述: 区段解封命令管理 +* 参数说明: 无 +* 返回值 : void +* BY fan 20260604 +*/ +void FollowUpSecUnFlockMsgProc(void); + +/* +* 功能描述: 区段解封命令状态检查,返回成功或检查失败原因,二次操作时执行命令 +* 参数说明: +UINT16 wDevId命令中设备 +UINT16 wMsgType, 命令类型 +* 返回值 : +1 成功 +2:未设置人工区段封锁 +3:不属于本集中区 +* BY fan 20260604 +*/ +UINT8 FollowUpSecUnFlockCheck(UINT16 wDevId, UINT16 wMsgType); + +/* +* 功能描述: 信号机解封命令管理 +* 参数说明: 无 +* 返回值 : void +* BY fan 20260604 +*/ +void FollowUpSignalUnFlockMsgProc(void); + +/* +* 功能描述: 信号机解封命令状态检查,返回成功或检查失败原因,二次操作时执行命令 +* 参数说明: +UINT16 wDevId命令中设备 +UINT16 wMsgType, 命令类型 +* 返回值 : +1 成功 +2:未设置信号机封锁 +3:不属于本集中区 +5:所属非进路已办理 +* BY fan 20260604 +*/ +UINT8 FollowUpSignalUnFlockCheck(UINT16 wDevId, UINT16 wMsgType); + +/* +* 功能描述:信号已开放进路的共享资源处理 +* 参数说明:无 +* 返 回 值:无 +* Created By LQ 2026.06.09 +*/ +void OpenedRouteShareResPro(void); #ifdef __cplusplus } diff --git a/TSCP/src/APP/ciapp/LogicManage/RouteRecoverManage.c b/TSCP/src/APP/ciapp/LogicManage/RouteRecoverManage.c index ca7464f..5045f60 100644 --- a/TSCP/src/APP/ciapp/LogicManage/RouteRecoverManage.c +++ b/TSCP/src/APP/ciapp/LogicManage/RouteRecoverManage.c @@ -3702,6 +3702,7 @@ static UINT8 OpenBlocRouteOverlapErrCheck(const UINT16 routeId) else { /* zt 删除单轨相关代码 2022-02-15 */ + reResult = CI_ERROR; } /*保护区段 内所有道岔【未封锁】*/ diff --git a/TSCP/src/APP/ciapp/LogicManage/TradInterlockLogicManage.c b/TSCP/src/APP/ciapp/LogicManage/TradInterlockLogicManage.c index dff2d7a..b173ebc 100644 --- a/TSCP/src/APP/ciapp/LogicManage/TradInterlockLogicManage.c +++ b/TSCP/src/APP/ciapp/LogicManage/TradInterlockLogicManage.c @@ -6538,103 +6538,134 @@ UINT16 GetRouteBingZhiSignalId(const UINT16 routeId) */ UINT16 GetRouteChaZhiSignalId(const UINT16 routeId) { - UINT16 startSigId = 0u; /*始端信号机ID*/ - UINT16 signalSum = 0u; /*信号机总数*/ - UINT16 signalId = 0u; /*信号机ID*/ - UINT16 routeSecSum = 0u; /*进路区段总数*/ - RoutePhysicalSectionStruct *pRoutePhySecStru = NULL; /*进路区段数据*/ - UINT16 returnOutSecId = 0u; /*折返信号机外方区段ID*/ - UINT16 returnInSecId = 0u; /*折返信号机内方区段ID*/ - UINT16 lockBelongRouteId = 0u; /*锁闭所属进路ID*/ - UINT16 outSecId = 0u; /*外方区段ID*/ - UINT16 ii = 0u; - UINT16 tmpSigId = 0u; - + UINT16 startSigId = 0U; /*始端信号机ID*/ + UINT16 signalSum = 0U; /*信号机总数*/ + UINT16 signalId = 0U; /*信号机ID*/ + UINT16 routeSecSum = 0U; /*进路区段总数*/ + RoutePhysicalSectionStruct* pRoutePhySecStru = NULL; /*进路区段数据*/ + UINT16 returnOutSecId = 0U; /*折返信号机外方区段ID*/ + UINT16 returnInSecId = 0U; /*折返信号机内方区段ID*/ + UINT16 lockBelongRouteId = 0U; /*锁闭所属进路ID*/ + UINT16 outSecId = 0U; /*外方区段ID*/ + UINT16 ii = 0U; + UINT16 tmpSigId = 0U; + UINT8 chPhySecType = 0U; + UINT16 wTempPhySecId = 0U; + UINT16 wReturnSignal = 0U; + UINT16 wTempSigId = 0U; + UINT8 chPhyLockState = 0U; + UINT16 wLockRouteId = 0U; + UINT16 wTempSigOutPhyId = 0U; + UINT16 wTempSigInPhyId = 0U; startSigId = GetRouteStartSignalId(routeId); /*获取进路始端信号机ID*/ signalSum = GetSignalCurSum(); /*获取信号机总数*/ - if (PHYSICAL_SEC_TYPE_NOSWITCH == GetPhySecType(GetSignalOutFirstPhySecId(startSigId))) + outSecId = GetSignalOutFirstPhySecId(startSigId); + chPhySecType = GetPhySecType(outSecId); + if (PHYSICAL_SEC_TYPE_NOSWITCH == chPhySecType) { /*无岔区段*/ for (ii = 0u; ii < signalSum; ii++) { signalId = GetSignalId(ii); /*获取信号机ID*/ + wTempPhySecId = GetSignalOutFirstPhySecId(signalId); - if ((GetSignalOutFirstPhySecId(startSigId) == GetSignalOutFirstPhySecId(signalId)) && - (startSigId != signalId)) + if ((outSecId == wTempPhySecId) && (startSigId != signalId)) { - return signalId; + wReturnSignal = signalId; + break; + } + else + { + /*不处理*/ } } } else { /*有岔*/ - outSecId = GetSignalOutFirstPhySecId(startSigId); /*进路始端信号机外方区段ID*/ lockBelongRouteId = GetPhySecRLockBelongRouteId(outSecId); /*区段锁闭所属进路ID*/ routeSecSum = GetRoutePhysicalSectionSum(lockBelongRouteId); /*获取进路区段总数*/ pRoutePhySecStru = GetRouteSectionData(lockBelongRouteId); /*获取进路区段数据*/ - if ((0u == routeSecSum) || (NULL == pRoutePhySecStru)) + if ((0U == routeSecSum) || (NULL == pRoutePhySecStru)) { - return 0u; - } - if (routeSecSum == 1u) - { - /*if ((PHYSICAL_SECTION_LOCK_NORMAL == GetPhySecLockState(pRoutePhySecStru[0].PhysicalSectionId)) && - (lockBelongRouteId == GetPhySecRLockBelongRouteId(pRoutePhySecStru[0].PhysicalSectionId)))*/ - { - returnOutSecId = pRoutePhySecStru[0].PhysicalSectionId;/*折返信号机外方区段ID*/ - - tmpSigId = GetRouteStartSignalId(lockBelongRouteId);/*折返信号机内方区段ID*/ - - returnInSecId = GetSignalOutFirstPhySecId(tmpSigId); - } - } - else if (routeSecSum > 1u) - { - for (ii = 0u; ii < routeSecSum; ii++) - { - - if ((PHYSICAL_SECTION_LOCK_NORMAL == GetPhySecLockState(pRoutePhySecStru[ii].PhysicalSectionId)) && - (lockBelongRouteId == GetPhySecRLockBelongRouteId(pRoutePhySecStru[ii].PhysicalSectionId))) - { /*本进路第一个锁闭的区段*/ - - returnOutSecId = pRoutePhySecStru[ii].PhysicalSectionId; /*折返信号机外方区段ID*/ - - if (ii > 0u) - { - returnInSecId = pRoutePhySecStru[ii-1U].PhysicalSectionId; /*折返信号机内方区段ID*/ - } - - break; - } - } + /*不处理*/ } else { - /*无操作*/ - } - if ((0u == returnOutSecId) || (0u == returnInSecId)) - { - return 0u; - } - - for (ii = 0u; ii < signalSum; ii++) - { - signalId = GetSignalId(ii); /*获取信号机ID*/ - - if ((returnOutSecId == GetSignalOutFirstPhySecId(signalId)) && - (returnInSecId == GetSignalInFirstPhySecId(signalId, routeId))) + if (1U == routeSecSum) { - return signalId; + returnOutSecId = pRoutePhySecStru[0U].PhysicalSectionId;/*折返信号机外方区段ID*/ + + tmpSigId = GetRouteStartSignalId(lockBelongRouteId);/*折返信号机内方区段ID*/ + + returnInSecId = GetSignalOutFirstPhySecId(tmpSigId); + } + else if (1U < routeSecSum) + { + for (ii = 0U; ii < routeSecSum; ii++) + { + + chPhyLockState = GetPhySecLockState(pRoutePhySecStru[ii].PhysicalSectionId); + wLockRouteId = GetPhySecRLockBelongRouteId(pRoutePhySecStru[ii].PhysicalSectionId); + if ((PHYSICAL_SECTION_LOCK_NORMAL == chPhyLockState) && + (lockBelongRouteId == wLockRouteId)) + { /*本进路第一个锁闭的区段*/ + + returnOutSecId = pRoutePhySecStru[ii].PhysicalSectionId; /*折返信号机外方区段ID*/ + + if (0U < ii) + { + returnInSecId = pRoutePhySecStru[ii - 1U].PhysicalSectionId; /*折返信号机内方区段ID*/ + } + else + { + wTempSigId = GetRouteStartSignalId(lockBelongRouteId);/*获取锁闭进路的外方第一区段*/ + returnInSecId = GetSignalOutFirstPhySecId(wTempSigId); + + } + + break; + } + } + } + else + { + /*无操作*/ } } + + if ((0U == returnOutSecId) || (0U == returnInSecId)) + { + /*无操作*/ + } + else + { + for (ii = 0u; ii < signalSum; ii++) + { + signalId = GetSignalId(ii); /*获取信号机ID*/ + wTempSigOutPhyId = GetSignalOutFirstPhySecId(signalId); + wTempSigInPhyId = GetSignalInFirstPhySecId(signalId, routeId); + if ((returnOutSecId == wTempSigOutPhyId) && + (returnInSecId == wTempSigInPhyId)) + { + wReturnSignal = signalId; + break; + } + else + { + /*无操作*/ + } + } + } + + } - return 0u; + return wReturnSignal; } diff --git a/TSCP/src/APP/ciapp/LogicProcess/InterlockLogicCheck.c b/TSCP/src/APP/ciapp/LogicProcess/InterlockLogicCheck.c index 242afef..fdd0991 100644 --- a/TSCP/src/APP/ciapp/LogicProcess/InterlockLogicCheck.c +++ b/TSCP/src/APP/ciapp/LogicProcess/InterlockLogicCheck.c @@ -7159,7 +7159,7 @@ UINT8 RouteExceptLastSecOccuClrCheck(UINT16 const routeId) UINT16 cancleZhaoChaRelayId = 0u; /*取消照查继电器ID*/ UINT8 relayState = 0u; /*继电器采集状态*/ UINT8 sendLevel = ESEND_LEVEL_ATS; /*发送ATS*/ - + UINT8 chRConnectReleaseFlag = 0U; /* 区段占用检查 */ if (0u == checkSum) { @@ -7211,10 +7211,20 @@ UINT8 RouteExceptLastSecOccuClrCheck(UINT16 const routeId) } else { - /* 记录故障码 */ - SetErrorData(functionId, CI_DEVICE_TYPE_RELAY, devId, ETYPE_CANCLE_ZHAOCHA, devState, sendLevel); - /* 失败返回 */ - result = CI_ERROR_QXZC; + chRConnectReleaseFlag = GetRouteConnectReleaseFlag(routeId); + if (ROUTE_CONNECT_RELEASE_YES == chRConnectReleaseFlag) + { + /* 通过检查 */ + result = CI_SUCCESS; + } + else + { + /* 记录故障码 */ + SetErrorData(functionId, CI_DEVICE_TYPE_RELAY, devId, ETYPE_CANCLE_ZHAOCHA, devState, sendLevel); + /* 失败返回 */ + result = CI_ERROR_QXZC; + } + } } @@ -7802,37 +7812,61 @@ UINT8 OtherCiDevStatusCheck(UINT16 const routeId,const RouteOtherCheckStruct *pO */ static UINT8 CheckRelationSignalOnSameOpen(UINT16 const routeId,UINT16 const relationSignalId,UINT8 const devStatus) { - UINT8 routeState = 0u,routeLeadProperty = 0u; + UINT8 routeState = 0U; + UINT8 routeLeadProperty = 0U; UINT8 ret = CI_SUCCESS; UINT8 routeType = 0u; /*进路类型*/ UINT8 relationSignalOpenColor = GetSignalCurColor(relationSignalId); UINT8 cRouteStartSigOpenColor = 0U; /*进路始端信号机开放颜色*/ - + UINT8 cRouteToLeadFlag = 0U; + UINT8 chOpenCloseState = 0U; routeState = GetRouteState(routeId); routeLeadProperty = GetRouteLeadProperty(routeId);/*获取进路引导属性*/ routeType = GetRouteType(routeId); /*获取进路类型*/ - if ((routeState != 0u) && (relationSignalOpenColor != 0u)) + + if ((routeState != 0U) && (relationSignalOpenColor != 0U)) { /* 如果信号开放,则检查本进路将要开放的信号是否比当前的开放的级别要高 */ - if (SIGNAL_OPEN == GetSignalOpenCloseState(relationSignalOpenColor)) + chOpenCloseState = GetSignalOpenCloseState(relationSignalOpenColor); + if (SIGNAL_OPEN == chOpenCloseState) { switch (relationSignalOpenColor) { case SIGNAL_SHOWCOLOUR_REDYELLOW: /* 红黄灯,即信号开放必须是引导信号 */ - - if (((ROUTE_LEAD_PROPERTY_YES == routeLeadProperty) || (ROUTE_LEAD_PROPERTY_CBTC_YES == routeLeadProperty)) - && ((ROUTE_STATE_LEAD_LOCK == routeState) + if ((ROUTE_LEAD_PROPERTY_YES == routeLeadProperty) || (ROUTE_LEAD_PROPERTY_CBTC_YES == routeLeadProperty)) + { + /* 进路为可引导*/ + if ((ROUTE_STATE_LEAD_LOCK == routeState) || (ROUTE_STATE_LEAD_LOCKERR == routeState) - || (ROUTE_STATE_LEAD_OPEN == routeState))) - {/* 进路为可引导,且进路状态为<引导锁闭>或<引导锁闭异常>或<引导开放> ,即进路将引导开放,关联 */ - ret = CI_SUCCESS; + || (ROUTE_STATE_LEAD_OPEN == routeState)) + { + /* 进路状态为<引导锁闭>或<引导锁闭异常>或<引导开放> */ + ret = CI_SUCCESS; + } + else + { + cRouteToLeadFlag = GetRouteToLeadFlag(routeId); /*获取引导进路转换标志*/ + if ((ROUTE_TO_LEAD_FLAG_YES == cRouteToLeadFlag) && + ((ROUTE_STATE_YUXIAN_LOCK == routeState) || (ROUTE_STATE_NEAR_LOCK == routeState) + || (ROUTE_STATE_FIRST_LOCKERR == routeState) || (ROUTE_STATE_NEAR_LOCKERR == routeState))) + { + /*列车进路转引导,转换标志有效,列车进路接近锁闭或者预先锁闭或初锁异常或接近锁闭异常可以转引导*/ + ret = CI_SUCCESS; + } + else + { + ret = CI_ERROR; + } + + } } else { ret = CI_ERROR; } + break; case SIGNAL_SHOWCOLOUR_WHITE: if (ROUTE_TYPE_DIAOCHE == routeType) @@ -9256,18 +9290,35 @@ UINT8 KeepRouteSwitchCheck(UINT16 routeId,UINT8 functionId,UINT8 sendLevel) if (CI_SUCCESS == reResult) {/*进路保持开放防护道岔检查*/ - if(CI_TRADITION_RAILWAY == lineIdentity) + if (FUNC_SWITCH_ON == cSndSideProFuncSwitch) { - if (FUNC_SWITCH_ON == cSndSideProFuncSwitch) + /*支持二级侧防时,不检查防护道岔位置和可动性*/ + } + else + { + /*进路关联防护道岔位置正确*/ + devId = 0u; + devState = 0u; + checkResult = RouteRelatedProSwitchPosCheck(routeId, &devId, &devState); + if (checkResult == CI_SUCCESS) { - /*支持二级侧防时,不检查防护道岔位置和可动性*/ + /* 通过检查 */ + reResult = CI_SUCCESS; } else { - /*进路关联防护道岔位置正确*/ + /* 记录故障码 */ + SetErrorData(functionId, CI_DEVICE_TYPE_SWITCH, devId, ETYPE_SWT_POSTION_STATE, devState, sendLevel); + /* 失败返回 */ + reResult = CI_ERROR; + } + + if (CI_SUCCESS == reResult) + { + /*进路关联防护道岔【防护锁闭】或【单锁且防护锁闭】*/ devId = 0u; devState = 0u; - checkResult = RouteRelatedProSwitchPosCheck(routeId, &devId, &devState); + checkResult = RouteRelatedProSwitchLockCheck(routeId, &devId, &devState); if (checkResult == CI_SUCCESS) { /* 通过检查 */ @@ -9276,40 +9327,15 @@ UINT8 KeepRouteSwitchCheck(UINT16 routeId,UINT8 functionId,UINT8 sendLevel) else { /* 记录故障码 */ - SetErrorData(functionId, CI_DEVICE_TYPE_SWITCH, devId, ETYPE_SWT_POSTION_STATE, devState, sendLevel); + SetErrorData(functionId, CI_DEVICE_TYPE_SWITCH, devId, ETYPE_SWT_LOCK_STATUS, devState, sendLevel); /* 失败返回 */ reResult = CI_ERROR; } - - if (CI_SUCCESS == reResult) - { - /*进路关联防护道岔【防护锁闭】或【单锁且防护锁闭】*/ - devId = 0u; - devState = 0u; - checkResult = RouteRelatedProSwitchLockCheck(routeId, &devId, &devState); - if (checkResult == CI_SUCCESS) - { - /* 通过检查 */ - reResult = CI_SUCCESS; - } - else - { - /* 记录故障码 */ - SetErrorData(functionId, CI_DEVICE_TYPE_SWITCH, devId, ETYPE_SWT_LOCK_STATUS, devState, sendLevel); - /* 失败返回 */ - reResult = CI_ERROR; - } - } - else - { - reResult = CI_ERROR; - } } - } - else - { - /* 失败返回 *//* zt 删除单轨相关代码 2022-02-15 */ - reResult = CI_ERROR; + else + { + reResult = CI_ERROR; + } } } else @@ -9466,12 +9492,29 @@ UINT8 KeepLeadRouteSwitchCheck(UINT16 routeId, UINT8 functionId, UINT8 sendLevel if (CI_SUCCESS == reResult) {/*进路保持开放防护道岔检查*/ - if (CI_TRADITION_RAILWAY == lineIdentity) + /*进路关联防护道岔位置正确*/ + devId = 0U; + devState = 0U; + checkResult = RouteRelatedProSwitchPosCheck(routeId, &devId, &devState); + if (checkResult == CI_SUCCESS) { - /*进路关联防护道岔位置正确*/ + /* 通过检查 */ + reResult = CI_SUCCESS; + } + else + { + /* 记录故障码 */ + SetErrorData(functionId, CI_DEVICE_TYPE_SWITCH, devId, ETYPE_SWT_POSTION_STATE, devState, sendLevel); + /* 失败返回 */ + reResult = CI_ERROR; + } + + if (CI_SUCCESS == reResult) + { + /*进路关联防护道岔【防护锁闭】或【单锁且防护锁闭】*/ devId = 0U; devState = 0U; - checkResult = RouteRelatedProSwitchPosCheck(routeId, &devId, &devState); + checkResult = RouteRelatedProSwitchLockCheck(routeId, &devId, &devState); if (checkResult == CI_SUCCESS) { /* 通过检查 */ @@ -9480,38 +9523,13 @@ UINT8 KeepLeadRouteSwitchCheck(UINT16 routeId, UINT8 functionId, UINT8 sendLevel else { /* 记录故障码 */ - SetErrorData(functionId, CI_DEVICE_TYPE_SWITCH, devId, ETYPE_SWT_POSTION_STATE, devState, sendLevel); + SetErrorData(functionId, CI_DEVICE_TYPE_SWITCH, devId, ETYPE_SWT_LOCK_STATUS, devState, sendLevel); /* 失败返回 */ reResult = CI_ERROR; } - - if (CI_SUCCESS == reResult) - { - /*进路关联防护道岔【防护锁闭】或【单锁且防护锁闭】*/ - devId = 0U; - devState = 0U; - checkResult = RouteRelatedProSwitchLockCheck(routeId, &devId, &devState); - if (checkResult == CI_SUCCESS) - { - /* 通过检查 */ - reResult = CI_SUCCESS; - } - else - { - /* 记录故障码 */ - SetErrorData(functionId, CI_DEVICE_TYPE_SWITCH, devId, ETYPE_SWT_LOCK_STATUS, devState, sendLevel); - /* 失败返回 */ - reResult = CI_ERROR; - } - } - else - { - reResult = CI_ERROR; - } } else { - /* 失败返回 *//* zt 删除单轨相关代码 2022-02-15 */ reResult = CI_ERROR; } } @@ -9843,60 +9861,44 @@ UINT8 LockBlocRouteSwitchCheck(UINT16 routeId,UINT8 functionId,UINT8 sendLevel) if (CI_SUCCESS == reResult) { - if (CI_TRADITION_RAILWAY == lineIdentity) + /*进路内所有道岔位置正确或位置不正确但可动作*/ + devId = 0u; + devState = 0u; + + checkResult = RouteSwitchPosAndMoveValidCheck(routeId, sendLevel); + + if (CI_SUCCESS == checkResult) { - /*进路内所有道岔位置正确或位置不正确但可动作*/ - devId = 0u; - devState = 0u; - - checkResult = RouteSwitchPosAndMoveValidCheck(routeId, sendLevel); - - if (CI_SUCCESS == checkResult) - { - /* 通过检查 */ - reResult = CI_SUCCESS; - } - else - { - /* 失败返回 */ - reResult = checkResult; - } + /* 通过检查 */ + reResult = CI_SUCCESS; } else { - /* 失败返回 *//* zt 删除单轨相关代码 2022-02-15 */ - reResult = CI_ERROR; + /* 失败返回 */ + reResult = checkResult; } } if (CI_SUCCESS == reResult) { - if(CI_TRADITION_RAILWAY == lineIdentity) + /* + 进路内所有道岔位置正确 + 不正确:RETURN_LOCK_ERR_SWITPOS + 正确:CI_SUCCESS + */ + devId = 0u; + devState = 0u; + checkResult = RouteAllSwitchPosCheck(routeId, &devId, &devState); + if (checkResult == CI_SUCCESS) { - /* - 进路内所有道岔位置正确 - 不正确:RETURN_LOCK_ERR_SWITPOS - 正确:CI_SUCCESS - */ - devId = 0u; - devState = 0u; - checkResult = RouteAllSwitchPosCheck(routeId,&devId, &devState); - if (checkResult == CI_SUCCESS) - { - /* 通过检查 */ - reResult = CI_SUCCESS; - } - else - { - /* 失败返回 */ - reResult = RETURN_LOCK_ERR_SWITPOS; - - } + /* 通过检查 */ + reResult = CI_SUCCESS; } else { - /* 失败返回 *//* zt 删除单轨相关代码 2022-02-15 */ - reResult = CI_ERROR; + /* 失败返回 */ + reResult = RETURN_LOCK_ERR_SWITPOS; + } } else @@ -10196,60 +10198,44 @@ UINT8 LockLeadRouteSwitchCheck(UINT16 routeId, UINT8 functionId, UINT8 sendLevel if (CI_SUCCESS == reResult) { - if (CI_TRADITION_RAILWAY == lineIdentity) + /*进路内所有道岔位置正确或位置不正确但可动作*/ + devId = 0U; + devState = 0U; + + checkResult = RouteSwitchPosAndMoveValidCheck(routeId, sendLevel); + + if (CI_SUCCESS == checkResult) { - /*进路内所有道岔位置正确或位置不正确但可动作*/ - devId = 0U; - devState = 0U; - - checkResult = RouteSwitchPosAndMoveValidCheck(routeId, sendLevel); - - if (CI_SUCCESS == checkResult) - { - /* 通过检查 */ - reResult = CI_SUCCESS; - } - else - { - /* 失败返回 */ - reResult = checkResult; - } + /* 通过检查 */ + reResult = CI_SUCCESS; } else { - /* 失败返回 *//* zt 删除单轨相关代码 2022-02-15 */ - reResult = CI_ERROR; + /* 失败返回 */ + reResult = checkResult; } } if (CI_SUCCESS == reResult) { - if (CI_TRADITION_RAILWAY == lineIdentity) + /* + 进路内所有道岔位置正确 + 不正确:RETURN_LOCK_ERR_SWITPOS + 正确:CI_SUCCESS + */ + devId = 0U; + devState = 0U; + checkResult = RouteAllSwitchPosCheck(routeId, &devId, &devState); + if (checkResult == CI_SUCCESS) { - /* - 进路内所有道岔位置正确 - 不正确:RETURN_LOCK_ERR_SWITPOS - 正确:CI_SUCCESS - */ - devId = 0U; - devState = 0U; - checkResult = RouteAllSwitchPosCheck(routeId, &devId, &devState); - if (checkResult == CI_SUCCESS) - { - /* 通过检查 */ - reResult = CI_SUCCESS; - } - else - { - /* 失败返回 */ - reResult = RETURN_LOCK_ERR_SWITPOS; - - } + /* 通过检查 */ + reResult = CI_SUCCESS; } else { - /* 失败返回 *//* zt 删除单轨相关代码 2022-02-15 */ - reResult = CI_ERROR; + /* 失败返回 */ + reResult = RETURN_LOCK_ERR_SWITPOS; + } } else @@ -10892,7 +10878,7 @@ UINT8 CheckRouteZongRenJieFeasibility(const UINT16 routeId) UINT8 sectionSum = 0u;/*进路包含的物理区段数量*/ /*故障发送级别*/ UINT8 sendLevel = ESEND_LEVEL_ATS; /*发送ATS*/ UINT16 secIdx = 0u;/*进路内包含的物理区段遍历索引变量*/ - + UINT8 chRouteConnectFlag = 0U; /*联锁条件检查*/ /* 进路内所有区段锁闭状态【正常锁闭】*/ devId = 0u; @@ -11015,10 +11001,20 @@ UINT8 CheckRouteZongRenJieFeasibility(const UINT16 routeId) } else { - /* 记录故障码 */ - SetErrorData(functionId, CI_DEVICE_TYPE_RELAY, devId, ETYPE_CANCLE_ZHAOCHA, devState, sendLevel); - /* 失败返回 */ - reResult = CI_ERROR; + chRouteConnectFlag = GetRouteConnectReleaseFlag(routeId); + if (ROUTE_CONNECT_RELEASE_YES == chRouteConnectFlag) + { + /* 通过检查 */ + reResult = CI_SUCCESS; + } + else + { + /* 记录故障码 */ + SetErrorData(functionId, CI_DEVICE_TYPE_RELAY, devId, ETYPE_CANCLE_ZHAOCHA, devState, sendLevel); + /* 失败返回 */ + reResult = CI_ERROR; + } + } } @@ -12752,39 +12748,37 @@ UINT8 OpenBlocRouteSwitchCheck(UINT16 routeId,UINT8 functionId,UINT8 sendLevel) } } - if(CI_SUCCESS == reResult) - { - if(CI_TRADITION_RAILWAY == lineIdentity) + if (CI_SUCCESS == reResult) + {/*进路开放防护道岔检查*/ + if (FUNC_SWITCH_ON == cSndSideProFuncSwitch) { - /* 通过检查 */ - reResult = CI_SUCCESS; + /*支持二级侧防时,不检查防护道岔位置和可动性*/ } else { - /* 失败返回 *//* zt 删除单轨相关代码 2022-02-15 */ - reResult = CI_ERROR; - } - } - else - { - /* 失败返回 */ - reResult = CI_ERROR; - } - - if (CI_SUCCESS == reResult) - {/*进路开放防护道岔检查*/ - if(CI_TRADITION_RAILWAY == lineIdentity) - { - if (FUNC_SWITCH_ON == cSndSideProFuncSwitch) + /*进路关联防护道岔位置正确*/ + devId = 0u; + devState = 0u; + checkResult = RouteRelatedProSwitchPosCheck(routeId, &devId, &devState); + if (checkResult == CI_SUCCESS) { - /*支持二级侧防时,不检查防护道岔位置和可动性*/ + /* 通过检查 */ + reResult = CI_SUCCESS; } else { - /*进路关联防护道岔位置正确*/ + /* 记录故障码 */ + SetErrorData(functionId, CI_DEVICE_TYPE_SWITCH, devId, ETYPE_SWT_POSTION_STATE, devState, sendLevel); + /* 失败返回 */ + reResult = CI_ERROR; + } + + if (CI_SUCCESS == reResult) + { + /*进路关联防护道岔【防护锁闭】或【单锁且防护锁闭】*/ devId = 0u; devState = 0u; - checkResult = RouteRelatedProSwitchPosCheck(routeId, &devId, &devState); + checkResult = RouteRelatedProSwitchLockCheck(routeId, &devId, &devState); if (checkResult == CI_SUCCESS) { /* 通过检查 */ @@ -12793,40 +12787,15 @@ UINT8 OpenBlocRouteSwitchCheck(UINT16 routeId,UINT8 functionId,UINT8 sendLevel) else { /* 记录故障码 */ - SetErrorData(functionId, CI_DEVICE_TYPE_SWITCH, devId, ETYPE_SWT_POSTION_STATE, devState, sendLevel); + SetErrorData(functionId, CI_DEVICE_TYPE_SWITCH, devId, ETYPE_SWT_LOCK_STATUS, devState, sendLevel); /* 失败返回 */ reResult = CI_ERROR; } - - if (CI_SUCCESS == reResult) - { - /*进路关联防护道岔【防护锁闭】或【单锁且防护锁闭】*/ - devId = 0u; - devState = 0u; - checkResult = RouteRelatedProSwitchLockCheck(routeId, &devId, &devState); - if (checkResult == CI_SUCCESS) - { - /* 通过检查 */ - reResult = CI_SUCCESS; - } - else - { - /* 记录故障码 */ - SetErrorData(functionId, CI_DEVICE_TYPE_SWITCH, devId, ETYPE_SWT_LOCK_STATUS, devState, sendLevel); - /* 失败返回 */ - reResult = CI_ERROR; - } - } - else - { - reResult = CI_ERROR; - } } - } - else - { - /* 失败返回 *//* zt 删除单轨相关代码 2022-02-15 */ - reResult = CI_ERROR; + else + { + reResult = CI_ERROR; + } } } else @@ -12957,31 +12926,29 @@ UINT8 OpenLeadRouteSwitchCheck(UINT16 routeId, UINT8 functionId, UINT8 sendLevel if (CI_SUCCESS == reResult) { - if (CI_TRADITION_RAILWAY == lineIdentity) + /*进路关联防护道岔位置正确*/ + devId = 0U; + devState = 0U; + checkResult = RouteRelatedProSwitchPosCheck(routeId, &devId, &devState); + if (checkResult == CI_SUCCESS) { /* 通过检查 */ reResult = CI_SUCCESS; } else { - /* 失败返回 *//* zt 删除单轨相关代码 2022-02-15 */ + /* 记录故障码 */ + SetErrorData(functionId, CI_DEVICE_TYPE_SWITCH, devId, ETYPE_SWT_POSTION_STATE, devState, sendLevel); + /* 失败返回 */ reResult = CI_ERROR; } - } - else - { - /* 失败返回 */ - reResult = CI_ERROR; - } - if (CI_SUCCESS == reResult) - {/*进路开放防护道岔检查*/ - if (CI_TRADITION_RAILWAY == lineIdentity) + if (CI_SUCCESS == reResult) { - /*进路关联防护道岔位置正确*/ + /*进路关联防护道岔【防护锁闭】或【单锁且防护锁闭】*/ devId = 0U; devState = 0U; - checkResult = RouteRelatedProSwitchPosCheck(routeId, &devId, &devState); + checkResult = RouteRelatedProSwitchLockCheck(routeId, &devId, &devState); if (checkResult == CI_SUCCESS) { /* 通过检查 */ @@ -12990,38 +12957,13 @@ UINT8 OpenLeadRouteSwitchCheck(UINT16 routeId, UINT8 functionId, UINT8 sendLevel else { /* 记录故障码 */ - SetErrorData(functionId, CI_DEVICE_TYPE_SWITCH, devId, ETYPE_SWT_POSTION_STATE, devState, sendLevel); + SetErrorData(functionId, CI_DEVICE_TYPE_SWITCH, devId, ETYPE_SWT_LOCK_STATUS, devState, sendLevel); /* 失败返回 */ reResult = CI_ERROR; } - - if (CI_SUCCESS == reResult) - { - /*进路关联防护道岔【防护锁闭】或【单锁且防护锁闭】*/ - devId = 0U; - devState = 0U; - checkResult = RouteRelatedProSwitchLockCheck(routeId, &devId, &devState); - if (checkResult == CI_SUCCESS) - { - /* 通过检查 */ - reResult = CI_SUCCESS; - } - else - { - /* 记录故障码 */ - SetErrorData(functionId, CI_DEVICE_TYPE_SWITCH, devId, ETYPE_SWT_LOCK_STATUS, devState, sendLevel); - /* 失败返回 */ - reResult = CI_ERROR; - } - } - else - { - reResult = CI_ERROR; - } } else { - /* 失败返回 *//* zt 删除单轨相关代码 2022-02-15 */ reResult = CI_ERROR; } } @@ -13183,7 +13125,7 @@ UINT8 OpenBlocRouteOverlapCheck(UINT16 routeId,UINT8 functionId,UINT8 sendLevel) else { /* zt 删除单轨相关代码 2022-02-15 */ - /*其他线路情况不处理*/ + reResult = CI_ERROR; } #if 0 /*进路办理完成并开灯,此时办理引导总锁,进路应保持原来状态不变*/ @@ -15655,7 +15597,7 @@ UINT8 JumpLockSwitchCheck(const UINT16 axisSecId,UINT8 funcId,UINT8 sendLevel) if (CI_ERROR == reVal) { /* 记录故障码 */ - SetErrorData(funcId,CI_DEVICE_TYPE_SWITCH,devId,ETYPE_SWT_FLOCK_STATE,devState,sendLevel); + SetErrorData(funcId,CI_DEVICE_TYPE_SWITCH,devId, ETYPE_SWT_POSTION_STATE,devState,sendLevel); } } @@ -15668,7 +15610,7 @@ UINT8 JumpLockSwitchCheck(const UINT16 axisSecId,UINT8 funcId,UINT8 sendLevel) if (CI_ERROR == reVal) { /* 记录故障码 */ - SetErrorData(funcId, CI_DEVICE_TYPE_SWITCH, devId, ETYPE_SWT_FLOCK_STATE, devState, sendLevel); + SetErrorData(funcId, CI_DEVICE_TYPE_SWITCH, devId, ETYPE_SWT_POSTION_STATE, devState, sendLevel); } } @@ -15941,7 +15883,7 @@ UINT8 AxisSecPorteSwitchPosMoveCheck(UINT16 const axisSecId, UINT16* pDevId, UIN /* 计轴区段道岔 */ /* 局部变量定义初始化 */ - UINT16 i = 0u; /* 循环变量 */ + UINT8 i = 0u; /* 循环变量 */ UINT16 devId = 0u; UINT8 devState = 0u; UINT8 switchPos = 0u; @@ -15982,6 +15924,8 @@ UINT8 AxisSecPorteSwitchPosMoveCheck(UINT16 const axisSecId, UINT16* pDevId, UIN } else { + *pDevId = devId; + *pDevState = devState; reVal = CI_ERROR; } } @@ -16044,7 +15988,7 @@ UINT8 AxisSecAllSwitchPosCheck(UINT16 const axisSecId,UINT16 *pDevId,UINT8 *pDev AxisSwitchStruct* const dataIdBuf = GetAxisSwitchIdStru(axisSecId); /* 局部变量定义初始化 */ - UINT16 i = 0u; /* 循环变量 */ + UINT8 i = 0u; /* 循环变量 */ UINT16 devId = 0u; UINT8 devState = 0u; UINT8 reVal = CI_ERROR; @@ -16098,7 +16042,7 @@ UINT8 AxisSecAllProtSwitchPosCheck(UINT16 const axisSecId, UINT16* pDevId, UINT8 AxisSwitchStruct* dataIdBuf =NULL; /* 局部变量定义初始化 */ - UINT16 i = 0u; /* 循环变量 */ + UINT8 i = 0u; /* 循环变量 */ UINT16 devId = 0u; UINT8 devState = 0u; UINT8 reVal = CI_ERROR; @@ -16119,10 +16063,11 @@ UINT8 AxisSecAllProtSwitchPosCheck(UINT16 const axisSecId, UINT16* pDevId, UINT8 for (i = 0u; i < checkSum; i++) { devId = dataIdBuf[i].SwitchId; - devState = GetSwitchCurPosition(devId); - if (devState == dataIdBuf[i].SwitchPosition) + devState = GetSwitchCurPosition(devId); /*获取道岔当前位置*/ + reVal = checkSwtLastValDrvPosStayorNot(devId, devState); /*检查道岔上一次驱动是否还在有效期*/ + if ((devState == dataIdBuf[i].SwitchPosition)&&(CI_SUCCESS == reVal)) { - /*道岔位置正确*/ + /*道岔位置正确且无驱动*/ } else @@ -17122,7 +17067,6 @@ UINT8 LogicSecRltvPrtctSwFLockCheck(UINT16 const wLgcId, UINT16 *pDevId, UINT8 * UINT16 wProtectSwSum = 0U; UINT16* pProtectSwIdBuf = NULL; LogsecSwitchStruct *pstLogicSecSwitchBuf = NULL; - chCheckSum = GetLogicSecSwitchSum(wLgcId); pstLogicSecSwitchBuf = GetLogicSecSwitchIdStru(wLgcId); if ((NULL != pDevId) && (NULL != pDevState) && (NULL != pYLockAlarmFlag) && (NULL != pstLogicSecSwitchBuf) @@ -17228,7 +17172,7 @@ UINT8 LogicSecRltvPrtctSwPosCheck(UINT16 const wLgcId, UINT16 *pDevId, UINT8 *pD UINT8 chCheckSum = 0U; UINT8 chProSwState = 0U; LogsecSwitchStruct *pstLogicSecSwitchBuf = NULL; - + chCheckSum = GetLgcRelateProSwSum(wLgcId);/*获取指定ID逻辑区段关联防护道岔数目*/ pstLogicSecSwitchBuf = GetLgcRelateProSwStru(wLgcId); if ((NULL != pDevId) @@ -17244,12 +17188,17 @@ UINT8 LogicSecRltvPrtctSwPosCheck(UINT16 const wLgcId, UINT16 *pDevId, UINT8 *pD chDevId = pstLogicSecSwitchBuf[ii].SwitchId; chDevState = GetSwitchCurPosition(chDevId);/*获取道岔当前位置*/ chProSwState = pstLogicSecSwitchBuf[ii].SwitchPosition; + chRetVal = checkSwtLastValDrvPosStayorNot(chDevId, chDevState); /*检查道岔上一次驱动是否还在有效期*/ + /*当前防护道岔不在逻辑区段包含道岔内*/ /*道岔位置一致*/ if ((chProSwState == chDevState) + &&(CI_SUCCESS == chRetVal) && ((SWITCH_POSITION_DINGWEI == chProSwState) || (SWITCH_POSITION_FANWEI == chProSwState))) { /*位置检查通过,继续检查*/ + + } else { @@ -17283,15 +17232,10 @@ UINT8 LogicSecRltvPrtctSwLockCheck(UINT16 const wLgcId, UINT16 *pDevId, UINT8 *p /* 局部变量定义初始化 */ UINT8 chRetVal = CI_ERROR; UINT8 ii = 0U; - UINT16 jj = 0U; - UINT8 kk = 0U; UINT16 chDevId = 0U; UINT8 chDevState = 0U; - UINT16 wLgcRelativeAxleSecId = 0U; - UINT8 chProtectSwitchSum = 0U; LogsecSwitchStruct *chProtectSwitchIdBuf = NULL; - chProtectSwitchSum = GetLgcRelateProSwSum(wLgcId);/*获取指定ID逻辑区段关联防护道岔数目*/ chProtectSwitchIdBuf = GetLgcRelateProSwStru(wLgcId); @@ -17303,9 +17247,9 @@ UINT8 LogicSecRltvPrtctSwLockCheck(UINT16 const wLgcId, UINT16 *pDevId, UINT8 *p chRetVal = CI_SUCCESS; for (ii = 0U; ii < chProtectSwitchSum; ii++) { - chDevId = chProtectSwitchIdBuf[jj].SwitchId; + chDevId = chProtectSwitchIdBuf[ii].SwitchId; chDevState = GetSwitchLockStatus(chDevId); - + /*当前防护道岔不在逻辑区段包含道岔内*/ if ((SWITCH_LOCK_STATUS_PROTECT == chDevState) || (SWITCH_LOCK_STATUS_DAP == chDevState)) { /*道岔已【防护锁闭】或【单锁且防护锁闭】*/ @@ -17321,7 +17265,7 @@ UINT8 LogicSecRltvPrtctSwLockCheck(UINT16 const wLgcId, UINT16 *pDevId, UINT8 *p if (CI_SUCCESS != chRetVal) { break; - } + } } } else @@ -18257,6 +18201,7 @@ UINT8 LogicSecResApplicabilityCheck(UINT16 const wLogicSecId) else { /* 记录故障码 */ + devState = GetRouteState(routeId); SetErrorData(functionId, CI_DEVICE_TYPE_ROUTE, routeId, ETYPE_ROUTE_STATE, devState, sendLevel); /* 失败返回 */ reResult = CI_ERROR; @@ -26514,6 +26459,8 @@ UINT8 OtherCiOvlpRelProSwMovValCheck(const UINT16 wOverlapId) cRetVal = CI_ERROR; /*道岔位置不正确且道岔不可动作,返回失败*/ } } + + } else { @@ -27865,7 +27812,7 @@ UINT8 PhySecLockMaskSideProtectCheck(UINT16 wPhySecId) /*存在侧防条件时,先判断当前物理区段是否位于关键道岔所处物理区段后方*/ wSwtPhySecId = GetSwitchPhySectionId(pSideProtectData[i].KeysSwitchID); cKeySwtPhySecIndex = GetPhySecInRoutePosIndex(wRLockBelongRouteId, wSwtPhySecId); - if ((ROUTE_PHYSICALSECTION_SUM_MAX > cKeySwtPhySecIndex) && (cKeySwtPhySecIndex < cCurPhySecIndex)) + if (cKeySwtPhySecIndex < cCurPhySecIndex) { /*入参物理区段位于关键道岔所处物理区段后方,无需检查该条侧防条件*/ } @@ -28266,7 +28213,7 @@ UINT8 JumpPhySectionUseCheck(const UINT16 axisSecId) /* 局部变量定义初始化 */ UINT8 reResult = CI_ERROR; /*返回值*/ UINT8 phyUseState = 0u;/*物理区段征用检查*/ - UINT8 phyId = 0u; + UINT16 phyId = 0u; @@ -28282,11 +28229,15 @@ UINT8 JumpPhySectionUseCheck(const UINT16 axisSecId) /*无处理*/ } - /*检查计轴区段的防护道岔所在区段的征用*/ + /*检查计轴区段的防护道岔所在区段和道岔征用*/ if (CI_SUCCESS == reResult) { reResult = JumpPhySectionPortectUseCheck(axisSecId); } + else + { + /*无处理*/ + } /*检查计轴区段的道岔征用*/ @@ -28294,15 +28245,14 @@ UINT8 JumpPhySectionUseCheck(const UINT16 axisSecId) { reResult = JumpPhySectionSwitchUseCheck(axisSecId); } - - /*检查计轴区段的防护道岔道岔征用*/ - if (CI_SUCCESS == reResult) + else { - reResult = JumpPhySectionSwitchUseCheck(axisSecId); + /*无处理*/ } + return reResult; } @@ -28372,7 +28322,7 @@ UINT8 JumpLogicSecPortectUseCheck(const UINT16 wLgcId) phyId = GetSwitchPhySectionId(chDevId); phyUseState = GetPhySecUseState(phyId); if((PHYSICAL_SECTION_USING_NO != phyUseState)||(SWITCH_USING_NO !=cSwitchUsingState)) - {/**/ + {/*存区段征用或存在道岔征用*/ chRetVal = CI_ERROR; break; } @@ -28406,7 +28356,7 @@ UINT8 JumpPhySectionSwitchUseCheck(const UINT16 axisSecId) /* 局部变量定义初始化 */ UINT8 i = 0u; /* 循环变量 */ - UINT16 SwitchId = 0u; + UINT16 wSwitchId = 0u; UINT8 cSwitchUsingState = 0U; @@ -28421,8 +28371,8 @@ UINT8 JumpPhySectionSwitchUseCheck(const UINT16 axisSecId) /*开始检查计轴区段内道岔*/ for (i = 0u; i < checkSum; i++) { - SwitchId = dataIdBuf[i].SwitchId; - cSwitchUsingState = GetSwitchUsingState(SwitchId); + wSwitchId = dataIdBuf[i].SwitchId; + cSwitchUsingState = GetSwitchUsingState(wSwitchId); if (SWITCH_USING_NO != cSwitchUsingState) { retVal = CI_ERROR; @@ -28613,7 +28563,7 @@ void SetAxisRelProSwitchLockSta(const UINT16 axisSecId, const UINT8 lockCommand) cFuncRet = checkSwtLastValDrvPosStayorNot(protectSwitchId, dataIdBuf[ii].SwitchPosition); if ((SWITCH_LOCK_PROTECT_CANCEL == lockCommand) || ((cSwitchCurPos == dataIdBuf[ii].SwitchPosition) && (CI_SUCCESS == cFuncRet))) - { + {/*道岔可动作之前已经查了,这里还是重复查下*/ SetSwitchLockStatus(SWITCH_PLOCKTYPE_AXISSEC, axisSecId, protectSwitchId, lockCommand); /*设置道岔防护锁闭状态*/ } @@ -28642,7 +28592,7 @@ UINT8 AxisRelatedProSwitchLockCheck(UINT16 const axisSecId, UINT16* pDevId, UINT { /* 局部变量定义初始化 */ - UINT16 i = 0u; /* 循环变量 */ + UINT8 i = 0u; /* 循环变量 */ UINT16 devId = 0u; UINT8 devState = 0u; UINT8 reVal = CI_ERROR; @@ -28687,61 +28637,6 @@ UINT8 AxisRelatedProSwitchLockCheck(UINT16 const axisSecId, UINT16* pDevId, UINT return reVal; } -/* -* 功能描述: 逻辑区段所处道岔防护道岔封锁状态检查 -* 参数说明: UINT16 const routeId, 逻辑区段ID -* UINT16 *pDevId, 设备Id(返回) -* UINT8 *pDevState, 设备状态(返回) -* 返回值 : CI_ERROR -* CI_SUCCESS -* add by mpt 20260331 -*/ -UINT8 LogicSecRltvPrtctSwFlockCheck(UINT16 const wLgcId, UINT16* pDevId, UINT8* pDevState) -{ - /* 局部变量定义初始化 */ - UINT8 chRetVal = CI_ERROR; - UINT8 ii = 0U; - UINT16 jj = 0U; - UINT16 chDevId = 0U; - UINT8 chDevState = 0U; - UINT8 chCheckSum = 0U; - LogsecSwitchStruct* pstLogicSecSwitchBuf = NULL; - - chCheckSum = GetLgcRelateProSwSum(wLgcId);/*获取指定ID逻辑区段关联防护道岔数目*/ - pstLogicSecSwitchBuf = GetLgcRelateProSwStru(wLgcId); - if ((NULL != pDevId) - && (NULL != pDevState) - && (NULL != pstLogicSecSwitchBuf) - && (LOGSEC_RELATE_PRO_SW_SUM_MAX > chCheckSum)) - { - chRetVal = CI_SUCCESS; - /*遍历逻辑区段关联防护道岔*/ - for (ii = 0U; ii < chCheckSum; ii++) - { - - chDevId = pstLogicSecSwitchBuf[ii].SwitchId; - chDevState = GetSwitchFLockState(chDevId); - if(SWITCH_LOCK_FENGSUO_NO == chDevState) - { - /*位置检查通过,继续检查*/ - } - else - { - /*状态不一致返回故障状态*/ - *pDevId = chDevId; - *pDevState = chDevState; - chRetVal = CI_ERROR; - break; - } - } - } - else - { - chRetVal = CI_ERROR; - } - - return chRetVal; -} /* * 功能描述: 设置逻辑区段关联防护道岔防护锁闭状态 @@ -28784,7 +28679,7 @@ void SetLogSecRelProSwitchLockSta(const UINT16 wLgcId, const UINT8 lockCommand) retVal = CI_ERROR; } else - { + {/*无处理*/ } } @@ -28812,4 +28707,75 @@ void SetLogSecRelProSwitchLockSta(const UINT16 wLgcId, const UINT8 lockCommand) { retVal = CI_ERROR; } -} \ No newline at end of file +} +/* +* 功能描述:计轴区段所有道岔是否全部征用 +* 参数说明:const UINT16 axisSecId 计轴区段ID +* 返回值 : CI_ERROR 未全部征用 +* CI_SUCCESS 全部征用 +* add by mpt 20260403 +*/ +UINT8 JumpPhySecAllUseCheck(const UINT16 axisSecId) +{ + UINT8 retVal = CI_ERROR; + UINT8 checkSum = 0u; + AxisSwitchStruct* dataIdBuf = 0u; + + /* 局部变量定义初始化 */ + UINT8 i = 0u; /* 循环变量 */ + UINT16 wSwitchId = 0u; + UINT16 phyId = 0U; + UINT8 phyUseState = 0U; + + checkSum = GetAxisSecRelateProSwSum(axisSecId);/*计轴区段关联防护道岔*/ + dataIdBuf = GetAxisSecRelateProSwStru(axisSecId); + + + if (NULL == dataIdBuf) + { + /*无检查项*/ + retVal = CI_ERROR; + } + else + { + retVal = CI_SUCCESS; + /*开始检查防护道岔*/ + for (i = 0u; i < checkSum; i++) + { + wSwitchId = dataIdBuf[i].SwitchId; + + phyId = GetSwitchPhySectionId(wSwitchId); + phyUseState = GetPhySecUseState(phyId); + + if (PHYSICAL_SECTION_USING_YES != phyUseState) + {/*非征用*/ + retVal = CI_ERROR; + break; + } + else + { + /*继续循环*/ + } + + } + } + + if (CI_SUCCESS == retVal) + { + phyId = GetAxisSecRelativePhySecId(axisSecId);/*获取相关物理区段ID*/ + phyUseState = GetPhySecUseState(phyId); + + if (PHYSICAL_SECTION_USING_YES != phyUseState) + {/*非征用*/ + retVal = CI_ERROR; + } + else + { + /*无执行*/ + } + } + + return retVal; +} + + diff --git a/TSCP/src/APP/ciapp/LogicProcess/InterlockLogicCheck.h b/TSCP/src/APP/ciapp/LogicProcess/InterlockLogicCheck.h index 49f4527..51eacaf 100644 --- a/TSCP/src/APP/ciapp/LogicProcess/InterlockLogicCheck.h +++ b/TSCP/src/APP/ciapp/LogicProcess/InterlockLogicCheck.h @@ -3025,22 +3025,22 @@ void SetAxisRelProSwitchLockSta(const UINT16 axisSecId, const UINT8 lockCommand) */ UINT8 AxisRelatedProSwitchLockCheck(UINT16 const axisSecId, UINT16* pDevId, UINT8* pDevState); /* -* 功能描述: 逻辑区段所处道岔防护道岔封锁状态检查 -* 参数说明: UINT16 const routeId, 逻辑区段ID -* UINT16 *pDevId, 设备Id(返回) -* UINT8 *pDevState, 设备状态(返回) -* 返回值 : CI_ERROR -* CI_SUCCESS -* add by mpt 20260331 -*/ -UINT8 LogicSecRltvPrtctSwFlockCheck(UINT16 const wLgcId, UINT16* pDevId, UINT8* pDevState); -/* * 功能描述: 设置逻辑区段关联防护道岔防护锁闭状态 * 参数说明: const UINT16 axisSecId, 计轴区段ID * const UINT8 lockCommand, 锁闭状态 * 返回值 : void * add by mpt 20260331 */ -void SetLogSecRelProSwitchLockSta(const UINT16 wLgcId, const UINT8 lockCommand); +void SetLogSecRelProSwitchLockSta(const UINT16 wLgcId, const UINT8 lockCommand); +/* +* 功能描述:计轴区段所有道岔是否全部征用 +* 参数说明:const UINT16 axisSecId 计轴区段ID +* 返回值 : CI_ERROR 未全部征用 +* CI_SUCCESS 全部征用 +* add by mpt 20260403 +*/ +UINT8 JumpPhySecAllUseCheck(const UINT16 axisSecId); + + #endif diff --git a/TSCP/src/APP/ciapp/LogicProcess/InterlockLogicProcess.c b/TSCP/src/APP/ciapp/LogicProcess/InterlockLogicProcess.c index 8ce766f..643e003 100644 --- a/TSCP/src/APP/ciapp/LogicProcess/InterlockLogicProcess.c +++ b/TSCP/src/APP/ciapp/LogicProcess/InterlockLogicProcess.c @@ -454,26 +454,21 @@ UINT8 SetRevrLTrainRouteLogicProcess(UINT16 const routeId) /* 联锁逻辑检查 */ /* 进路类型是【列车进路】*/ - if(CI_SUCCESS == reResult) + devState = GetRouteType(routeId); + if (devState == ROUTE_TYPE_LIECHE) { - devState = GetRouteType(routeId); - if (devState == ROUTE_TYPE_LIECHE) - { - /* 通过检查 */ - reResult = CI_SUCCESS; - } - else - { - /* 记录故障码 */ - SetErrorData(functionId,CI_DEVICE_TYPE_ROUTE,routeId,ETYPE_ROUTE_TYPE,devState,sendLevel); - /* 失败返回 */ - reResult = CI_ERROR; + /* 通过检查 */ + reResult = CI_SUCCESS; + } + else + { + /* 记录故障码 */ + SetErrorData(functionId, CI_DEVICE_TYPE_ROUTE, routeId, ETYPE_ROUTE_TYPE, devState, sendLevel); + /* 失败返回 */ + reResult = CI_ERROR; - } - } - - - + } + if(CI_SUCCESS == reResult) { devState = GetRouteState(routeId); @@ -1053,21 +1048,18 @@ UINT8 SetReverseRtnRouteLogicProcess(UINT16 const routeId) /* 联锁逻辑检查 */ /* 进路类型是【折返进路】*/ - if(CI_SUCCESS == reResult) + devState = GetRouteType(routeId); + if (devState == ROUTE_TYPE_RETURN) { - devState = GetRouteType(routeId); - if (devState == ROUTE_TYPE_RETURN) - { - /* 通过检查 */ - reResult = CI_SUCCESS; - } - else - { - /* 记录故障码 */ - SetErrorData(functionId,CI_DEVICE_TYPE_ROUTE,routeId,ETYPE_ROUTE_TYPE,devState,sendLevel); - /* 失败返回 */ - reResult = CI_ERROR; - } + /* 通过检查 */ + reResult = CI_SUCCESS; + } + else + { + /* 记录故障码 */ + SetErrorData(functionId, CI_DEVICE_TYPE_ROUTE, routeId, ETYPE_ROUTE_TYPE, devState, sendLevel); + /* 失败返回 */ + reResult = CI_ERROR; } if(CI_SUCCESS == reResult) @@ -2895,36 +2887,23 @@ UINT8 LockRouteOverlapLogicProcess(UINT16 const routeId, UINT16 const overlapId, if (CI_TRADITION_RAILWAY == lineIdentity) {/*传统线路*/ checkResult = OverlapSwitchMoveValidCheck(overlapId,&devId,&devState); + if (checkResult == CI_SUCCESS) + { + /* 通过检查,保持当前状态 */ + } + else + { + /* 记录故障码 */ + SetErrorData(functionId, CI_DEVICE_TYPE_SWITCH, devId, ETYPE_SWT_POSTION_STATE, devState, sendLevel); + /* 失败返回 */ + reResult = CI_ERROR; + } }/* zt 删除单轨相关代码 2022-02-15 */ else {/*线路类型错误*/ - checkResult = CI_ERROR; - } - - if (checkResult == CI_SUCCESS) - { - /* 通过检查,保持当前状态 */ - } - else - { - /* 记录故障码 */ - SetErrorData(functionId,CI_DEVICE_TYPE_SWITCH,devId,ETYPE_SWT_POSTION_STATE,devState,sendLevel); - /* 失败返回 */ reResult = CI_ERROR; } } - /*线路类型检查*/ - if ((CI_SUCCESS == reResult) || (RETURN_WAIT_SWITCH_USING == reResult)) - {/* zt 删除单轨相关代码 2022-02-15 */ - if (CI_TRADITION_RAILWAY == lineIdentity) - {/*传统线路*/ - /* 通过检查,保持当前状态 */ - } - else - {/*线路类型错误*/ - reResult = CI_ERROR; - } - } /*保护区段道岔位置检查 * RETURN_LOCK_ERR_SWITPOS: 保护区段道岔位置不正确 @@ -2934,15 +2913,7 @@ UINT8 LockRouteOverlapLogicProcess(UINT16 const routeId, UINT16 const overlapId, { devId = 0u; devState = 0u; - if(CI_TRADITION_RAILWAY == lineIdentity) - {/*传统线路*/ - checkResult = OverlapSwitchPosCheck(overlapId,&devId,&devState); - }/* zt 删除单轨相关代码 2022-02-15 */ - else - {/*线路类型错误*/ - checkResult = CI_ERROR; - } - + checkResult = OverlapSwitchPosCheck(overlapId, &devId, &devState); if (checkResult == CI_ERROR) { /* 道岔位置不正确 */ @@ -3631,21 +3602,18 @@ UINT8 OpenCbtcLTrainRouteLogicProcess(UINT16 const routeId) /* 联锁逻辑检查 */ /* 进路监督模式为【CBTC】*/ - if (CI_SUCCESS == reResult) + devState = GetRouteLevel(routeId); + if ((devState == ROUTE_LEVEL_CBTC)) { - devState = GetRouteLevel(routeId); - if ((devState == ROUTE_LEVEL_CBTC)) - { - /* 通过检查 */ - reResult = CI_SUCCESS; - } - else - { - /* 记录故障码 */ - SetErrorData(functionId,CI_DEVICE_TYPE_ROUTE,routeId,ETYPE_ROUTE_LEVEL,devState,sendLevel); - /* 失败返回 */ - reResult = CI_ERROR; - } + /* 通过检查 */ + reResult = CI_SUCCESS; + } + else + { + /* 记录故障码 */ + SetErrorData(functionId, CI_DEVICE_TYPE_ROUTE, routeId, ETYPE_ROUTE_LEVEL, devState, sendLevel); + /* 失败返回 */ + reResult = CI_ERROR; } /* 进路类型是列车进路*/ @@ -3886,18 +3854,15 @@ UINT8 OpenCbtcLTrainRouteLogicProcess(UINT16 const routeId) else { /*既不是反向进路,也不是风井进路*/ - if (CI_SUCCESS == reResult) + /*防淹门联锁条件检查*/ + checkResult = CBTCRouteFloodGateCheck(routeId, functionId, sendLevel); + if (CI_SUCCESS == checkResult) { - /*防淹门联锁条件检查*/ - checkResult = CBTCRouteFloodGateCheck(routeId,functionId,sendLevel); - if (CI_SUCCESS == checkResult) - { - reResult = CI_SUCCESS; - } - else - { - reResult = CI_ERROR; - } + reResult = CI_SUCCESS; + } + else + { + reResult = CI_ERROR; } } } @@ -4851,21 +4816,18 @@ UINT8 OpenCbtcReturnRouteLogicProcess(UINT16 const routeId) /* 联锁逻辑检查 */ /* 进路监督模式为【CBTC】*/ - if (CI_SUCCESS == reResult) + devState = GetRouteLevel(routeId); + if ((devState == ROUTE_LEVEL_CBTC)) { - devState = GetRouteLevel(routeId); - if ((devState == ROUTE_LEVEL_CBTC)) - { - /* 通过检查 */ - reResult = CI_SUCCESS; - } - else - { - /* 记录故障码 */ - SetErrorData(functionId,CI_DEVICE_TYPE_ROUTE,routeId,ETYPE_ROUTE_LEVEL,devState,sendLevel); - /* 失败返回 */ - reResult = CI_ERROR; - } + /* 通过检查 */ + reResult = CI_SUCCESS; + } + else + { + /* 记录故障码 */ + SetErrorData(functionId, CI_DEVICE_TYPE_ROUTE, routeId, ETYPE_ROUTE_LEVEL, devState, sendLevel); + /* 失败返回 */ + reResult = CI_ERROR; } /* 进路类型是【折返进路】*/ @@ -6400,13 +6362,15 @@ UINT8 RouteOtherSecAutoUnlockProcess(UINT16 const routeId, UINT16* phySectionId) UINT8 sendLevel = ESEND_LEVEL_ZERO; /*不发送ATS*/ UINT8 chPhySecCurMergeState = 0U;/*物理区段当前融合状态*/ UINT8 chPhySecPreMergeState = 0U;/*物理区段之前融合状态*/ + UINT8 chPhyOtherLineFlag = 0U; + UINT16 wFrontPhyId = 0U; /*联锁检查*/ if(CI_SUCCESS == reResult) { /*找到属于当前进路的第一个【正常锁闭】区段*/ - if (nlockSectionId > 0u) + if (0U < nlockSectionId) { reResult = CI_SUCCESS; } @@ -6416,98 +6380,27 @@ UINT8 RouteOtherSecAutoUnlockProcess(UINT16 const routeId, UINT16* phySectionId) reResult = CI_ERROR; /*返回ID = 0*/ - *phySectionId = 0u; + *phySectionId = 0U; } } - if(CI_SUCCESS == reResult) + if (CI_SUCCESS == reResult) { - /*进路为【折返进路】且解锁区段为折返区段*/ - if ((routeType == ROUTE_TYPE_RETURN) - && (nlockSectionId == returnSecId)) + /* 判断是否联络线对方区段 */ + chPhyOtherLineFlag = GetPhyIsThisLineState(nlockSectionId); + if ((DEV_IS_THIS_LINE_NO == chPhyOtherLineFlag) && (UINT16_MAX == nextSecId) && (ROUTE_TYPE_RETURN != routeType)) { - /*折返解锁*/ - /*折返区段【空闲】之前【占用】*/ - chPhySecCurMergeState = GetPhySecCurMergeState(returnSecId); - chPhySecPreMergeState = GetPhySecPreMergeState(returnSecId); - - if ((SECTION_OCCUPY_NO == chPhySecCurMergeState) && - (SECTION_OCCUPY_YES == chPhySecPreMergeState)) + /*区段不是本线路,且不存在下一个区段,且进路不为折返*/ + wFrontPhyId = GetRoutePhySecFrontPhyId(routeId, nlockSectionId); + chPhySecPreMergeState = GetPhySecPreMergeState(wFrontPhyId); + chPhySecCurMergeState = GetPhySecCurMergeState(wFrontPhyId); + /* 前一区段当前空闲,之前占用 */ + if ((SECTION_OCCUPY_YES == chPhySecPreMergeState) && (SECTION_OCCUPY_NO == chPhySecCurMergeState)) { - reResult = CI_SUCCESS; - } - else - { - /* 失败返回 */ - reResult = CI_ERROR; - *phySectionId = nlockSectionId; - } - - if(CI_SUCCESS == reResult) - { - /*折出进路第一个区段【占用】*/ - chPhySecCurMergeState = GetPhySecCurMergeState(backSecId); - - if (SECTION_OCCUPY_YES == chPhySecCurMergeState) - { - /*折返正常*/ - reResult = CI_SUCCESS; - } - else - { - /*折返异常*/ - /* 记录故障码 */ - SetErrorData(functionId,CI_DEVICE_TYPE_PHYSEC,backSecId,ETYPE_PS_RUNLOCK_ERROR,chPhySecCurMergeState,sendLevel); - /* 失败返回 */ - reResult = RETURN_AUTOLOCK_ERR_EXCEPT; - *phySectionId = nlockSectionId; - } - } - if(CI_SUCCESS == reResult) - { - /*折返进路锁闭时间早于折出进路 且 折出进路状态为【接近锁闭正常】*/ - if ((returnRouteLockTime < backRouteLockTime) - && ((ROUTE_STATE_NEAR_LOCK == backRouteState) - || (ROUTE_STATE_AUTO_UNLOCK == backRouteState))) - { - reResult = CI_SUCCESS; - *phySectionId = nlockSectionId; - } - else - { - /*折返异常*/ - /* 记录故障码 */ - SetErrorData(functionId,CI_DEVICE_TYPE_ROUTE, wPhySecRLockId,ETYPE_PS_RUNLOCK_ERROR, backRouteState,sendLevel); - /* 失败返回 */ - reResult = RETURN_AUTOLOCK_ERR_EXCEPT; - *phySectionId = nlockSectionId; - } - } - } - else - { - /*正常解锁*/ - /*当前区段之前【当前空闲】【之前占用】*/ - chPhySecCurMergeState = GetPhySecCurMergeState(nlockSectionId); - chPhySecPreMergeState = GetPhySecPreMergeState(nlockSectionId); - - if ((SECTION_OCCUPY_NO == chPhySecCurMergeState) && - (SECTION_OCCUPY_YES == chPhySecPreMergeState)) - { - reResult = CI_SUCCESS; - } - else - { - /* 失败返回 */ - reResult = CI_ERROR; - *phySectionId = nlockSectionId; - - } - if(CI_SUCCESS == reResult) - { - /* 下一区段【占用】*/ - chPhySecCurMergeState = GetPhySecCurMergeState(nextSecId); - if (SECTION_OCCUPY_YES == chPhySecCurMergeState) + chPhySecPreMergeState = GetPhySecPreMergeState(nlockSectionId); + chPhySecCurMergeState = GetPhySecCurMergeState(nlockSectionId); + /* 待解锁区段当前空闲,之前占用 */ + if ((SECTION_OCCUPY_YES == chPhySecPreMergeState) && (SECTION_OCCUPY_NO == chPhySecCurMergeState)) { /*正常解锁区段*/ reResult = CI_SUCCESS; @@ -6515,59 +6408,171 @@ UINT8 RouteOtherSecAutoUnlockProcess(UINT16 const routeId, UINT16* phySectionId) } else { - if (validReturnSigId > 0u)/*通过进路转折返进路*/ - { - /*折出进路第一个区段占用*/ - chPhySecCurMergeState = GetPhySecCurMergeState(backSecId); + /* 失败返回 */ + reResult = CI_ERROR; + *phySectionId = nlockSectionId; + } + } + else + { + /* 失败返回 */ + reResult = CI_ERROR; + *phySectionId = nlockSectionId; + } - if (SECTION_OCCUPY_YES == chPhySecCurMergeState) - { - /*折返正常*/ - reResult = CI_SUCCESS; - } - else - { - /*折返异常*/ - /* 记录故障码 */ - SetErrorData(functionId,CI_DEVICE_TYPE_PHYSEC,backSecId,ETYPE_PS_RUNLOCK_ERROR, chPhySecCurMergeState,sendLevel); - /* 失败返回 */ - reResult = RETURN_AUTOLOCK_ERR_EXCEPT; - *phySectionId = nlockSectionId; - } - if(CI_SUCCESS == reResult) - { - /*折返进路锁闭时间早于折出进路 且 折出进路状态为【接近锁闭正常】*/ - if ((((INT32)(backRouteLockTime- returnRouteLockTime)) > 0 ) - &&(backRouteState == ROUTE_STATE_NEAR_LOCK)) - { - reResult = CI_SUCCESS; - *phySectionId = nlockSectionId; - } - else - { - /*折返异常*/ - /* 记录故障码 */ - SetErrorData(functionId,CI_DEVICE_TYPE_ROUTE, wPhySecRLockId,ETYPE_PS_RUNLOCK_ERROR, backRouteState,sendLevel); - /* 失败返回 */ - reResult = RETURN_AUTOLOCK_ERR_EXCEPT; - *phySectionId = nlockSectionId; - } - } + } + else + { + /*进路为【折返进路】且解锁区段为折返区段*/ + if ((ROUTE_TYPE_RETURN == routeType) + && (nlockSectionId == returnSecId)) + { + /*折返解锁*/ + /*折返区段【空闲】之前【占用】*/ + chPhySecCurMergeState = GetPhySecCurMergeState(returnSecId); + chPhySecPreMergeState = GetPhySecPreMergeState(returnSecId); + + if ((SECTION_OCCUPY_NO == chPhySecCurMergeState) && + (SECTION_OCCUPY_YES == chPhySecPreMergeState)) + { + reResult = CI_SUCCESS; + } + else + { + /* 失败返回 */ + reResult = CI_ERROR; + *phySectionId = nlockSectionId; + } + + if (CI_SUCCESS == reResult) + { + /*折出进路第一个区段【占用】*/ + chPhySecCurMergeState = GetPhySecCurMergeState(backSecId); + + if (SECTION_OCCUPY_YES == chPhySecCurMergeState) + { + /*折返正常*/ + reResult = CI_SUCCESS; } else - {/*通过进路解锁异常*/ - /*下一区段【空闲】(飞车)*/ - /* 解锁异常 */ + { + /*折返异常*/ /* 记录故障码 */ - SetErrorData(functionId,CI_DEVICE_TYPE_PHYSEC,nextSecId,ETYPE_PS_AUNLOCK_ERROR, chPhySecCurMergeState,sendLevel); + SetErrorData(functionId, CI_DEVICE_TYPE_PHYSEC, backSecId, ETYPE_PS_RUNLOCK_ERROR, chPhySecCurMergeState, sendLevel); + /* 失败返回 */ + reResult = RETURN_AUTOLOCK_ERR_EXCEPT; + *phySectionId = nlockSectionId; + } + } + if (CI_SUCCESS == reResult) + { + /*折返进路锁闭时间早于折出进路 且 折出进路状态为【接近锁闭正常】*/ + if ((returnRouteLockTime < backRouteLockTime) + && ((ROUTE_STATE_NEAR_LOCK == backRouteState) + || (ROUTE_STATE_AUTO_UNLOCK == backRouteState))) + { + reResult = CI_SUCCESS; + *phySectionId = nlockSectionId; + } + else + { + /*折返异常*/ + /* 记录故障码 */ + SetErrorData(functionId, CI_DEVICE_TYPE_ROUTE, wPhySecRLockId, ETYPE_PS_RUNLOCK_ERROR, backRouteState, sendLevel); /* 失败返回 */ reResult = RETURN_AUTOLOCK_ERR_EXCEPT; *phySectionId = nlockSectionId; } } } + else + { + /*正常解锁*/ + /*当前区段之前【当前空闲】【之前占用】*/ + chPhySecCurMergeState = GetPhySecCurMergeState(nlockSectionId); + chPhySecPreMergeState = GetPhySecPreMergeState(nlockSectionId); + + if ((SECTION_OCCUPY_NO == chPhySecCurMergeState) && + (SECTION_OCCUPY_YES == chPhySecPreMergeState)) + { + reResult = CI_SUCCESS; + } + else + { + /* 失败返回 */ + reResult = CI_ERROR; + *phySectionId = nlockSectionId; + + } + if (CI_SUCCESS == reResult) + { + /* 下一区段【占用】*/ + chPhySecCurMergeState = GetPhySecCurMergeState(nextSecId); + if (SECTION_OCCUPY_YES == chPhySecCurMergeState) + { + /*正常解锁区段*/ + reResult = CI_SUCCESS; + *phySectionId = nlockSectionId; + } + else + { + if (0U < validReturnSigId)/*通过进路转折返进路*/ + { + /*折出进路第一个区段占用*/ + chPhySecCurMergeState = GetPhySecCurMergeState(backSecId); + + if (SECTION_OCCUPY_YES == chPhySecCurMergeState) + { + /*折返正常*/ + reResult = CI_SUCCESS; + } + else + { + /*折返异常*/ + /* 记录故障码 */ + SetErrorData(functionId, CI_DEVICE_TYPE_PHYSEC, backSecId, ETYPE_PS_RUNLOCK_ERROR, chPhySecCurMergeState, sendLevel); + /* 失败返回 */ + reResult = RETURN_AUTOLOCK_ERR_EXCEPT; + *phySectionId = nlockSectionId; + } + if (CI_SUCCESS == reResult) + { + /*折返进路锁闭时间早于折出进路 且 折出进路状态为【接近锁闭正常】*/ + if (0 < (((INT32)(backRouteLockTime - returnRouteLockTime))) + && (ROUTE_STATE_NEAR_LOCK == backRouteState)) + { + reResult = CI_SUCCESS; + *phySectionId = nlockSectionId; + } + else + { + /*折返异常*/ + /* 记录故障码 */ + SetErrorData(functionId, CI_DEVICE_TYPE_ROUTE, wPhySecRLockId, ETYPE_PS_RUNLOCK_ERROR, backRouteState, sendLevel); + /* 失败返回 */ + reResult = RETURN_AUTOLOCK_ERR_EXCEPT; + *phySectionId = nlockSectionId; + } + } + } + else + {/*通过进路解锁异常*/ + /*下一区段【空闲】(飞车)*/ + /* 解锁异常 */ + /* 记录故障码 */ + SetErrorData(functionId, CI_DEVICE_TYPE_PHYSEC, nextSecId, ETYPE_PS_AUNLOCK_ERROR, chPhySecCurMergeState, sendLevel); + /* 失败返回 */ + reResult = RETURN_AUTOLOCK_ERR_EXCEPT; + *phySectionId = nlockSectionId; + } + } + } + } } + } + + return reResult; } @@ -7082,6 +7087,7 @@ UINT8 RouteCancelLogicProcess(UINT16 const routeId) /*故障发送级别*/ UINT8 sendLevel = ESEND_LEVEL_ATS; /*发送ATS*/ UINT8 cRouteType = 0U; /*进路类型*/ + UINT8 chRConnectReleaseFlag = 0U; /*联锁条件检查*/ /* 进路内所有区段锁闭状态【正常锁闭】*/ @@ -7169,10 +7175,20 @@ UINT8 RouteCancelLogicProcess(UINT16 const routeId) } else { - /* 记录故障码 */ - SetErrorData(functionId,CI_DEVICE_TYPE_RELAY,devId,ETYPE_CANCLE_ZHAOCHA,devState,sendLevel); - /* 失败返回 */ - reResult = CI_ERROR; + chRConnectReleaseFlag = GetRouteConnectReleaseFlag(routeId); + if (ROUTE_CONNECT_RELEASE_YES == chRConnectReleaseFlag) + { + /* 通过检查 */ + reResult = CI_SUCCESS; + } + else + { + /* 记录故障码 */ + SetErrorData(functionId, CI_DEVICE_TYPE_RELAY, devId, ETYPE_CANCLE_ZHAOCHA, devState, sendLevel); + /* 失败返回 */ + reResult = CI_ERROR; + } + } } @@ -7863,42 +7879,33 @@ UINT8 SetSwitchFLockLogicProcess(UINT16 const switchId) { if(FUNC_SWITCH_ON == CiFunctionLock) { - if (CI_TRADITION_RAILWAY == lineIdentity) - {/*传统线路*/ - /*道岔2区段状态为【未锁闭】*/ - checkResult = switch2ndSecLockState; - if (checkResult == PHYSICAL_SECTION_LOCK_NO) + /*传统线路*/ + /*道岔2区段状态为【未锁闭】*/ + checkResult = switch2ndSecLockState; + if (checkResult == PHYSICAL_SECTION_LOCK_NO) + { + /*【未锁闭】*/ + reResult = CI_SUCCESS; + if (LOG_SECTION_LOGLOCK_NO == chSw2PhySecLogLockState) { - /*【未锁闭】*/ + /*【未被逻辑进路锁闭】*/ reResult = CI_SUCCESS; - if (LOG_SECTION_LOGLOCK_NO == chSw2PhySecLogLockState) - { - /*【未被逻辑进路锁闭】*/ - reResult = CI_SUCCESS; - } - else - { - /* 记录故障码 */ - SetErrorData(functionId, CI_DEVICE_TYPE_PHYSEC, switch2ndSecId, ETYPE_PS_LOCK_STATE, chSw2PhySecLogLockState, sendLevel); - /* 失败返回 */ - reResult = CI_ERROR; - } } else { - /*【锁闭】*/ /* 记录故障码 */ - SetErrorData(functionId,CI_DEVICE_TYPE_PHYSEC,switch2ndSecId,ETYPE_PS_LOCK_STATE,checkResult,sendLevel); + SetErrorData(functionId, CI_DEVICE_TYPE_PHYSEC, switch2ndSecId, ETYPE_PS_LOCK_STATE, chSw2PhySecLogLockState, sendLevel); /* 失败返回 */ reResult = CI_ERROR; - } - }/* zt 删除单轨相关代码 2022-02-15 */ + } else - {/*线路类型错误*/ - reResult = CI_ERROR; + { + /*【锁闭】*/ /* 记录故障码 */ - SetErrorData(functionId,CI_DEVICE_TYPE_PHYSEC,phySecId,ETYPE_PS_LOCK_STATE,devState,sendLevel); + SetErrorData(functionId, CI_DEVICE_TYPE_PHYSEC, switch2ndSecId, ETYPE_PS_LOCK_STATE, checkResult, sendLevel); + /* 失败返回 */ + reResult = CI_ERROR; } } else if(FUNC_SWITCH_OFF == CiFunctionLock) @@ -9910,7 +9917,7 @@ UINT8 CLDKeepOpenSecCheck(UINT16 routeId, UINT8 functionId, UINT8 sendLevel) ETYPE_PS_MERGY_OCU_STATE, devState, sendLevel); } - else if ((0u == hasUtFlag) && (1u == hasCtFlag)) + else if (1u == hasCtFlag) { if (RC_WORK_MODE_TIOC == rcWorkMode) { @@ -11655,7 +11662,10 @@ void RouteLgcSecResReleaseProcess(const UINT16 wRouteId) && (NULL == pstTrainResInfo)) {/*上一区段已经解锁,本区段由列车申请资源释放或本区段已经解锁*/ /*删除该列车对应逻辑区段资源*/ - (void)ComMemSet((void *)&pstLgcSecInfo[wLgcBufIndex].szTrainResData[jj], (UINT16)sizeof(LogicTrainResStruct), 0U); + + /*重置资源信息结构体*/ + ResetResInfoStruct(wLgcBufIndex, jj); + debug_infor_printf((const)"LogSecRes Release LgcId: %d TrainId:%d Cyc\n" , wUnlockLgcSecId , wTrainId @@ -13149,4 +13159,84 @@ void UpdateRouteCouplinkFlag(const UINT16 wRouteId) /*不处理*/ } +} +/* +* 功能描述: 联络线接车进路解锁处理 +* 参数说明: const UINT16 wRouteId 进路ID +* 返回值 : 无 +* Create: lyj 20260603 +*/ +void ConnectRouteReleaseProc(const UINT16 wRouteId) +{ + UINT8 chRouteState = 0U; /*进路状态*/ + UINT8 chResult = 0U; + UINT16 wFirstOccuSecId = 0U;/*进路内方第一个占用的物理区段ID*/ + UINT8 chDevState = 0U; + UINT8 chTrainEnterSta = 0U; + UINT8 chZongRenJieResult = 0U; + + if ((0U < wRouteId) && (ROUTE_SUM_MAX > wRouteId)) + { + chRouteState = GetRouteState(wRouteId); + + if ((ROUTE_STATE_FIRST_LOCK == chRouteState) + || (ROUTE_STATE_FIRST_LOCKERR == chRouteState) + || (ROUTE_STATE_YUXIAN_LOCK == chRouteState) + || (ROUTE_STATE_NEAR_LOCKERR == chRouteState)) + { + chZongRenJieResult = CheckRouteZongRenJieFeasibility(wRouteId); + chResult = RouteAllSecOccuClearCheck(wRouteId, &wFirstOccuSecId, &chDevState); + if (CI_SUCCESS == chZongRenJieResult) + { + SetRouteStateManage(wRouteId, ROUTE_STATE_DELAY_UNLOCK); /*-->设置进路延时解锁*/ + + if (CI_SUCCESS == chResult) + { + /*进路内无占压,延时后全部解锁*/ + SetRouteZongRenJieDelayType(wRouteId, ROUTE_ZRJ_DELAY_TYPE_IDLE); + } + else + { + /*延时后部分绿光带,即一个占压的物理区段之前的物理区段变绿光带*/ + SetRouteZongRenJieDelayType(wRouteId, ROUTE_ZRJ_DELAY_TYPE_EXP_TO_OCCUPY); + } + } + else + { + /*进路不能解锁*/ + } + + } + else if ((ROUTE_STATE_LEAD_LOCK == chRouteState) || (ROUTE_STATE_LEAD_LOCKERR == chRouteState)) + { + chTrainEnterSta = GetRouteTrainEnterFlag(wRouteId); + chZongRenJieResult = RouteExceptLastSecOccuClrCheck(wRouteId); + if (CI_SUCCESS == chZongRenJieResult) + { + /*所有区段空闲或最后一个区段占用*/ + SetRouteStateManage(wRouteId, ROUTE_STATE_DELAY_UNLOCK); /*-->设置进路延时解锁*/ + /*延时后全部解锁*/ + SetRouteZongRenJieDelayType(wRouteId, ROUTE_ZRJ_DELAY_TYPE_IDLE);/*延时结束后所有区段解锁*/ + } + else if (ROUTE_TRAIN_ENTER_FLAG_NO == chTrainEnterSta) + { + SetRouteStateManage(wRouteId, ROUTE_STATE_DELAY_UNLOCK); /*-->设置进路延时解锁*/ + /*延时后全部解锁*/ + SetRouteZongRenJieDelayType(wRouteId, ROUTE_ZRJ_DELAY_TYPE_IDLE);/*延时结束后所有区段解锁*/ + } + else + { + /*不解锁*/ + } + } + else + { + /*记录进路状态不满足*/ + SetErrorData(EFUNC_ROUTE_ZRJ_DEAL, CI_DEVICE_TYPE_ROUTE, wRouteId, ETYPE_ROUTE_STATE, chRouteState, ESEND_LEVEL_ATS); + } + } + else + { + /*不处理;进路ID异常,不做报警*/ + } } \ No newline at end of file diff --git a/TSCP/src/APP/ciapp/LogicProcess/InterlockLogicProcess.h b/TSCP/src/APP/ciapp/LogicProcess/InterlockLogicProcess.h index 57a3165..c516182 100644 --- a/TSCP/src/APP/ciapp/LogicProcess/InterlockLogicProcess.h +++ b/TSCP/src/APP/ciapp/LogicProcess/InterlockLogicProcess.h @@ -841,6 +841,13 @@ UINT8 SetRouteCouplinkProcess(const UINT16 wRouteId, const UINT8 functionId, con * Create: 20250919 */ void UpdateRouteCouplinkFlag(const UINT16 wRouteId); +/* +* 功能描述: 联络线接车进路解锁处理 +* 参数说明: const UINT16 wRouteId 进路ID +* 返回值 : 无 +* Create: lyj 20260603 +*/ +void ConnectRouteReleaseProc(const UINT16 wRouteId); #ifdef __cplusplus } diff --git a/TSCP/src/APP/ciapp/Overlap/OverlapDataManage.c b/TSCP/src/APP/ciapp/Overlap/OverlapDataManage.c index 656ff30..98816d8 100644 --- a/TSCP/src/APP/ciapp/Overlap/OverlapDataManage.c +++ b/TSCP/src/APP/ciapp/Overlap/OverlapDataManage.c @@ -890,7 +890,10 @@ void CleanOverlapSpecificFlag(const UINT16 routeId, const UINT16 overlapId) } else { - if ((dwAtsLastTimeLockCyc < dwUnlockStartCycNum) && (0U < dwAtsLastTimeLockCyc)) + atsExpLockOverlapId = GetRouteAtsExpLkOverlapId(routeId); + + if ((dwAtsLastTimeLockCyc <= dwUnlockStartCycNum) && (0U < dwAtsLastTimeLockCyc) + && (overlapId == atsExpLockOverlapId)) { /*ATS最后一次下发锁闭保护区段命令时保护区段未自动解锁*/ SetRouteAtsExpLkOverlapId(routeId, 0U); diff --git a/TSCP/src/APP/ciapp/PSD/PSDConfigDataManage.c b/TSCP/src/APP/ciapp/PSD/PSDConfigDataManage.c index 2f1df0e..7157403 100644 --- a/TSCP/src/APP/ciapp/PSD/PSDConfigDataManage.c +++ b/TSCP/src/APP/ciapp/PSD/PSDConfigDataManage.c @@ -1183,3 +1183,51 @@ UINT16 GetIbpConfmRelayId(const UINT16 doorId) } return retVal; } + +/* +* 功能描述: 设置倒切板卡 +* 参数说明: const UINT16 PsdId, 屏蔽门ID,UINT16 wBoardId 板卡Id +* 返回值 : CI_SUCCESS CI_ERROR +*/ +UINT8 SetPsdRelateReverseRelay(const UINT16 PsdId, UINT16 wBoardId) +{ + UINT16 bufIndex = 0u; /*数组下标*/ + UINT8 chRet = CI_ERROR; + bufIndex = GetPsdConfigBufIndex(PsdId); /*获取数组下标*/ + + if (bufIndex < PSD_SUM_MAX) + { + PsdConfigDataStru[bufIndex].wReverseBoardId = wBoardId; + chRet = CI_SUCCESS; + } + else + { + ; + } + return chRet; +} + +/* +* 功能描述: 获取倒切板卡 +* 参数说明: const UINT16 wPsdId, 屏蔽门ID +* 返回值 : UINT16_MAX: 获取数据失败 +* 0: 无倒切 +* [1,65534]板卡ID +*/ +UINT16 GetPsdRelateReverseBoardId(const UINT16 wPsdId) +{ + UINT16 bufIndex = 0u; /*数组下标*/ + UINT16 retVal = UINT16_MAX; + + bufIndex = GetPsdConfigBufIndex(wPsdId); /*获取数组下标*/ + + if (bufIndex < PSD_SUM_MAX) + { + retVal = PsdConfigDataStru[bufIndex].wReverseBoardId; + } + else + { + retVal = UINT16_MAX; + } + return retVal; +} diff --git a/TSCP/src/APP/ciapp/PSD/PSDConfigDataManage.h b/TSCP/src/APP/ciapp/PSD/PSDConfigDataManage.h index 3c1143e..c1e571d 100644 --- a/TSCP/src/APP/ciapp/PSD/PSDConfigDataManage.h +++ b/TSCP/src/APP/ciapp/PSD/PSDConfigDataManage.h @@ -43,7 +43,7 @@ typedef struct S_PsdConfigDataStruct UINT16 OpenFourEditGroupDriveRelayId; /*打开四编组屏蔽门的驱动继电器(配置字段)*/ UINT16 OpenSixEditGroupDriveRelayId; /*打开六编组屏蔽门的驱动继电器(配置字段)*/ UINT16 OpenEightEditGroupDriveRelayId; /*打开八编组屏蔽门的驱动继电器(配置字段)*/ - UINT16 DoorStateRelayId; /*门开采集继电器ID (配置字段)*/ + UINT16 DoorStateRelayId; /*门开采集继电器ID (配置字段)*/ UINT16 wDoorStateRelayId2; /*门开采集继电器ID2(配置字段) 迪斯尼*/ UINT16 wRelayDoorButtonId; /*屏蔽门再关门按钮继电器*/ UINT16 doorReopenRelayId; /*站台门再次开门继电器*/ @@ -73,6 +73,7 @@ typedef struct S_PsdConfigDataStruct UINT16 IncloudeEsbIdBuf[PSD_INCLUDE_ESB_NUM]; /*屏蔽门包含ESB ID*/ UINT8 IncloudeEsbNum; /*包含ESB数量*/ UINT16 wIbpRelayId; /*IBP盘发车按钮继电器ID*/ + UINT16 wReverseBoardId; /*所属倒切板卡Id*/ } PsdConfigDataStruct; @@ -461,6 +462,23 @@ UINT16* GetPsdIncloudeEsbIdBuf(const UINT16 psdId); */ UINT16 GetIbpConfmRelayId(const UINT16 doorId); +/* +* 功能描述: 设置倒切板卡 +* 参数说明: const UINT16 PsdId, 屏蔽门ID,UINT16 wBoardId 板卡Id +* 返回值 : CI_SUCCESS CI_ERROR +*/ +UINT8 SetPsdRelateReverseRelay(const UINT16 PsdId,UINT16 wBoardId); + +/* +* 功能描述: 获取倒切板卡 +* 参数说明: const UINT16 wPsdId, 屏蔽门ID +* 返回值 : UINT16_MAX: 获取数据失败 +* 0: 无倒切 +* [1,65534]板卡ID +*/ +UINT16 GetPsdRelateReverseBoardId(const UINT16 wPsdId); + + #ifdef __cplusplus } #endif diff --git a/TSCP/src/APP/ciapp/PSD/PSDDataManage.c b/TSCP/src/APP/ciapp/PSD/PSDDataManage.c index 36eba83..d692c3d 100644 --- a/TSCP/src/APP/ciapp/PSD/PSDDataManage.c +++ b/TSCP/src/APP/ciapp/PSD/PSDDataManage.c @@ -851,7 +851,7 @@ UINT32 GetStartDetectionCycNum(const UINT16 doorId) * 返回值 : 无 * */ -void SetStartDetectionState(const UINT16 doorId, const UINT32 detectionState) +void SetStartDetectionState(const UINT16 doorId, const UINT8 detectionState) { UINT16 bufIndex = 0u; /*数组下标*/ @@ -861,7 +861,7 @@ void SetStartDetectionState(const UINT16 doorId, const UINT32 detectionState) { if ((JXTC_START_DETECTION_NO == detectionState) || (JXTC_START_DETECTION_YES == detectionState) ) { - PsdDataStru[bufIndex].StartDetectionState = (UINT8)(detectionState); + PsdDataStru[bufIndex].StartDetectionState = detectionState; } else { @@ -906,7 +906,7 @@ UINT8 GetStartDetectionState(const UINT16 doorId) * 返回值 : 无 * */ -void SetStopDetectionState(const UINT16 doorId, const UINT32 detectionState) +void SetStopDetectionState(const UINT16 doorId, const UINT8 detectionState) { UINT16 bufIndex = 0u; /*数组下标*/ @@ -916,7 +916,7 @@ void SetStopDetectionState(const UINT16 doorId, const UINT32 detectionState) { if ((JXTC_STOP_DETECTION_NO == detectionState) || (JXTC_STOP_DETECTION_YES == detectionState) ) { - PsdDataStru[bufIndex].StopDetectionState = (UINT8)(detectionState); + PsdDataStru[bufIndex].StopDetectionState = detectionState; } else { @@ -1405,7 +1405,7 @@ UINT16 GetPsdEditGroupInfoFromPsdData(const UINT16 doorId) * 返回值 : 无 * */ -void SetVOBCDoorState(const UINT16 doorId, const UINT32 doorState) +void SetVOBCDoorState(const UINT16 doorId, const UINT8 doorState) { UINT16 bufIndex = 0u; /*数组下标*/ @@ -1415,7 +1415,7 @@ void SetVOBCDoorState(const UINT16 doorId, const UINT32 doorState) { if ((PSD_DOOR_CLOSEDANDLOCKED_VALID == doorState) || (PSD_DOOR_CLOSEDANDLOCKED_INVALID == doorState)) { - PsdDataStru[bufIndex].VOBCDoorState = (UINT8)(doorState); + PsdDataStru[bufIndex].VOBCDoorState = doorState; } else { @@ -3416,4 +3416,58 @@ UINT8 GetPsdStateToVobc(const UINT16 doorId) } } return chRet; +} + +/* +* 功能描述:设置列车非零速状态 +* 参数说明: const UINT16 doorId, 屏蔽门ID +* const UINT32 detectionState, 非零速状态 +* 返回值 : 无 +* +*/ +void SetTrainZeroSpeedState(const UINT16 doorId, const UINT8 detectionState) +{ + UINT16 bufIndex = 0u; /*数组下标*/ + + bufIndex = GetPsdConfigBufIndex(doorId); /*获取屏蔽门数组下标*/ + + if (bufIndex < PSD_SUM_MAX) + { + if ((PSD_TRAIN_ZERO_SPEED_NO == detectionState) || (PSD_TRAIN_ZERO_SPEED_YES == detectionState)) + { + PsdDataStru[bufIndex].chTrainZeroSpeedState = detectionState; + } + else + { + /*不做处理*/ + } + + } + else + { + /*不做处理*/ + } +} +/* +* 功能描述: 获取列车非零速状态 +* 参数说明: const UINT16 doorId, 屏蔽门ID +* 返回值 : 0: 获取数据失败 +* >0: 非零速状态 +*/ +UINT8 GetTrainZeroSpeedState(const UINT16 doorId) +{ + UINT16 bufIndex = 0u; /*数组下标*/ + UINT8 retVal = CI_ERROR; + + bufIndex = GetPsdConfigBufIndex(doorId); /*获取屏蔽门数组下标*/ + + if (bufIndex < PSD_SUM_MAX) + { + retVal = PsdDataStru[bufIndex].chTrainZeroSpeedState; + } + else + { + retVal = CI_ERROR; + } + return retVal; } \ No newline at end of file diff --git a/TSCP/src/APP/ciapp/PSD/PSDDataManage.h b/TSCP/src/APP/ciapp/PSD/PSDDataManage.h index 40963f7..e749f06 100644 --- a/TSCP/src/APP/ciapp/PSD/PSDDataManage.h +++ b/TSCP/src/APP/ciapp/PSD/PSDDataManage.h @@ -98,6 +98,7 @@ typedef struct S_PsdDataStruct UINT32 JXTCMutualLockStartCycNum; /*间隙探测互锁解除起始时间*/ UINT8 ibpButtonState; /*IBP盘发车按钮状态(动态字段)*/ UINT32 IBPPressCycNum; /*IBP按下起始周期*/ + UINT8 chTrainZeroSpeedState; /*列车非零速状态*/ } PsdDataStruct; /*屏蔽门数据结构体*/ @@ -386,7 +387,7 @@ UINT32 GetStartDetectionCycNum(const UINT16 doorId); * 返回值 : 无 * */ -void SetStartDetectionState(const UINT16 doorId, const UINT32 detectionState); +void SetStartDetectionState(const UINT16 doorId, const UINT8 detectionState); /* * 功能描述: 获取开始启动探测状态 * 参数说明: const UINT16 routeId, 进路ID @@ -402,7 +403,7 @@ UINT8 GetStartDetectionState(const UINT16 doorId); * 返回值 : 无 * */ -void SetStopDetectionState(const UINT16 doorId, const UINT32 detectionState); +void SetStopDetectionState(const UINT16 doorId, const UINT8 detectionState); /* * 功能描述: 获取停止探测状态 @@ -541,7 +542,7 @@ UINT16 GetPsdEditGroupInfoFromPsdData(const UINT16 doorId); * 返回值 : 无 * */ -void SetVOBCDoorState(const UINT16 doorId, const UINT32 doorState); +void SetVOBCDoorState(const UINT16 doorId, const UINT8 doorState); /* * 功能描述: 获取VOBC2CI车门状态信息 @@ -1185,6 +1186,23 @@ UINT8 SetIBPPressCycNum(const UINT16 doorId, const UINT32 startCycNum); * 返回值 :屏蔽门状态 */ UINT8 GetPsdStateToVobc(const UINT16 doorId); + +/* +* 功能描述:设置列车非零速状态 +* 参数说明: const UINT16 doorId, 屏蔽门ID +* const UINT32 detectionState, 非零速状态 +* 返回值 : 无 +* +*/ +void SetTrainZeroSpeedState(const UINT16 doorId, const UINT8 detectionState); + +/* +* 功能描述: 获取列车非零速状态 +* 参数说明: const UINT16 doorId, 屏蔽门ID +* 返回值 : 0: 获取数据失败 +* >0: 非零速状态 +*/ +UINT8 GetTrainZeroSpeedState(const UINT16 doorId); #ifdef __cplusplus } #endif diff --git a/TSCP/src/APP/ciapp/PSD/PSDDefine.h b/TSCP/src/APP/ciapp/PSD/PSDDefine.h index ebc91b0..d1c7470 100644 --- a/TSCP/src/APP/ciapp/PSD/PSDDefine.h +++ b/TSCP/src/APP/ciapp/PSD/PSDDefine.h @@ -17,7 +17,7 @@ /*屏蔽门总数最大值*/ -#define PSD_SUM_MAX ((UINT16)90U) /*定义屏蔽门数量最大值*/ +#define PSD_SUM_MAX ((UINT16)200U) /*定义屏蔽门数量最大值*/ /*和屏蔽门关联的出站进路数目最大值*/ #define RALATED_OUT_STATION_ROUTE_SUM_MAX ((UINT16)10U) /*屏蔽门关联的出站进路数目最大值*/ @@ -228,4 +228,8 @@ #define CI_IVOC_PSD_STATE_OPEN ((UINT8)0x55U) /*CI到IVOC屏蔽门打开*/ #define CI_IVOC_PSD_STATE_PANGLU ((UINT8)0xCCU) /*CI到IVOC屏蔽门互锁解除*/ #define CI_IVOC_PSD_STATE_OPEN_EXCEPT ((UINT8)0x33U) /*CI到IVOC屏蔽门异常打开*/ + +#define PSD_TRAIN_ZERO_SPEED_YES ((UINT8)0x55U) /*列车零速*/ +#define PSD_TRAIN_ZERO_SPEED_NO ((UINT8)0xAAU) /*列车非零速*/ + #endif diff --git a/TSCP/src/APP/ciapp/ParsePack/CiInterfaceDefine.h b/TSCP/src/APP/ciapp/ParsePack/CiInterfaceDefine.h index 96ca9c3..59b3e6a 100644 --- a/TSCP/src/APP/ciapp/ParsePack/CiInterfaceDefine.h +++ b/TSCP/src/APP/ciapp/ParsePack/CiInterfaceDefine.h @@ -164,6 +164,8 @@ #define ATS_CMD_APPLY_PASSXICHE ((UINT8)0xB2) /*现地请求反向洗车命令-降级模式*/ #define ATS_CMD_CANCEL_PASSXICHE ((UINT8)0xB3) /*现地取消反向洗车命令-降级模式*/ #define ATS_CMD_CANCEL_PSD_EXCEPT ((UINT8)0xBA) /*现地取消站台门异常状态*/ +#define ATS_CMD_CONNECT_ROUTE_RELEASE_ONE ((UINT8)0xBB) /*联络线接车进路解锁一次*/ +#define ATS_CMD_CONNECT_ROUTE_RELEASE_TWO ((UINT8)0xBC) /*联络线接车进路解锁二次*/ /****联锁到其他联锁的命令宏定义****/ #define CI_CMD_PHYSEC_USING_APPLY ((UINT16)0x0001) /*物理区段征用申请*/ @@ -246,9 +248,10 @@ #define CI_BACK_GROUP_AUTO_ROUTE_SET_ERR ((UINT8)0x7e) /*组合自动进路自动属性设置失败*/ -#define CI_BACK_AUTO_TRIGGER_SET_ERR (UINT8)0x85 /*进路的自动触发标志设置失败*/ +#define CI_BACK_AUTO_TRIGGER_SET_ERR ((UINT8)0x85) /*进路的自动触发标志设置失败*/ #define CI_BACK_LEAD_ROUTE_CANCEL ((UINT8)0xA4) /*引导进路无法使用总取消解锁反馈*/ #define CI_BACK_COUPLINK_ROUTE_IDLE ((UINT8)0xAF) /*联挂进路内无被联挂车*/ +#define CI_BACK_CONNECT_ROUTE_RELEASE ((UINT8)0xBB) /*联络线接车进路解锁条件不满足*/ /*信号机故障反馈*/ #define CI_BACK_SIG_START_OPEN ((UINT8)0x11) /*进路始端信号机开放*/ @@ -469,6 +472,48 @@ #define CI_BACK_ALLAUTO_RETURN_FLOOD_STATE_ERR ((UINT8)0x9C) /*全自动折返进路存在防淹门不满足*/ #define CI_BACK_ALLAUTO_RETURN_COUPROUTE_SET ((UINT8)0xB2) /*全自动折返联挂进路已办理*/ +#define ATS_CI_INFO_TYPE_FIRST_LEN ((UINT16)11) /*ATS首次命令长度*/ +#define ATS_CI_INFO_TYPE_SND_LEN ((UINT16)15) /*ATS再次命令长度*/ + +/* ATS二次命令帧首次消息结构体 */ +typedef struct +{ + UINT8 chFlag; /*首次消息接收状态*/ + UINT32 dwCycle; /*首次消息接收周期号*/ + UINT8 chAtsId; /*ATS编号:不为0时发送网关*/ + UINT8 chRtuId; /*Rtu编号:不为0时发送现地,全0发ATS*/ + UINT16 wIndex; /*操作站编号*/ + UINT8 chTiocId; /*TIOC编号*/ + UINT32 dwTime; /*请求时间*/ + UINT16 wDevId; /*操作设备ID*/ +}AtsFollowUpCmdFstStru; + +/* ATS二次命令帧再次消息结构体 */ +typedef struct +{ + UINT8 chFlag; /*首次消息接收状态*/ + UINT32 dwCycle; /*再次消息接收周期号*/ + UINT8 chAtsId; /*ATS编号:不为0时发送网关*/ + UINT8 chRtuId; /*Rtu编号:不为0时发送现地,全0发ATS*/ + UINT16 wIndex; /*操作站编号*/ + UINT8 chTiocId; /*TIOC编号*/ + UINT32 dwTime; /*请求时间*/ + UINT16 wDevId; /*操作设备ID*/ + UINT32 dwCrc32; /*再次发送中Crc*/ +}AtsFollowUpCmdSndStru; + +/*二次命令帧反馈信息结构体 */ +typedef struct +{ + UINT8 chFlag; /*消息有效性*/ + UINT8 chTiocId; /*TIOC编号*/ + UINT8 chAtsId; /*Ats编号: 判断组包对象使用,不包含在组包内容中*/ + UINT8 chRtuId; /*Rtu编号*/ + UINT16 wIndex; /*操作站编号*/ + UINT32 dwTime; /*时间*/ + UINT8 chOpStatus; /*操作结果*/ + UINT32 dwCrc32; /*CRC*/ +}RCIFollowUpReplyStru; #endif diff --git a/TSCP/src/APP/ciapp/ParsePack/ParsePackAtsData.c b/TSCP/src/APP/ciapp/ParsePack/ParsePackAtsData.c index b78bdd7..e5a52e2 100644 --- a/TSCP/src/APP/ciapp/ParsePack/ParsePackAtsData.c +++ b/TSCP/src/APP/ciapp/ParsePack/ParsePackAtsData.c @@ -46,6 +46,36 @@ PSCToCiDataStruct* pscCiSendToAtsDataStru = NULL; ReciveAtsCmdDataCycInfo szReciveAtsCmdDataCycInfo[ATS_SUM_MAX * 2U] = {0U}; /*收到ATS命令数据周期号信息数组*/ UINT16 gReciveAtsCmdDataDeviceSum = 0U; /*收到ATS命令数据设备数目*/ +AtsFollowUpCmdFstStru gDansuoCancleMsgFst = { 0u }; /*取消单锁首次消息*/ +RCIFollowUpReplyStru gDansuoCancleReplyFst = { 0u }; /*取消单锁首次确认*/ +AtsFollowUpCmdSndStru gDansuoCancleMsgSnd = { 0u }; /*取消单锁二次消息*/ +RCIFollowUpReplyStru gDansuoCancleReplySnd = { 0u }; /*取消单锁二次确认*/ + +AtsFollowUpCmdFstStru gSwitchUnflockMsgFst = { 0u }; /*道岔解封首次消息*/ +RCIFollowUpReplyStru gSwitchUnflockReplyFst = { 0u }; /*道岔解封首次确认*/ +AtsFollowUpCmdSndStru gSwitchUnflockMsgSnd = { 0u }; /*道岔解封二次消息*/ +RCIFollowUpReplyStru gSwitchUnflockReplySnd = { 0u }; /*道岔解封二次确认*/ + +AtsFollowUpCmdFstStru gSecUnflockMsgFst = { 0u }; /*区段解封首次消息*/ +RCIFollowUpReplyStru gSecUnflockReplyFst = { 0u }; /*区段解封首次确认*/ +AtsFollowUpCmdSndStru gSecUnflockMsgSnd = { 0u }; /*区段解封二次消息*/ +RCIFollowUpReplyStru gSecUnflockReplySnd = { 0u }; /*区段解封二次确认*/ + +AtsFollowUpCmdFstStru gSignalUnflockMsgFst = { 0u }; /*信号机解封首次消息*/ +RCIFollowUpReplyStru gSignalUnflockReplyFst = { 0u }; /*信号机解封首次确认*/ +AtsFollowUpCmdSndStru gSignalUnflockMsgSnd = { 0u }; /*信号机解封二次消息*/ +RCIFollowUpReplyStru gSignalUnflockReplySnd = { 0u }; /*信号机解封二次确认*/ + +AtsFollowUpCmdFstStru gZRJMsgFst = { 0u }; /*总人解首次消息*/ +RCIFollowUpReplyStru gZRJReplyFst = { 0u }; /*总人解首次确认*/ +AtsFollowUpCmdSndStru gZRJMsgSnd = { 0u }; /*总人解二次消息*/ +RCIFollowUpReplyStru gZRJReplySnd = { 0u }; /*总人解二次确认*/ + +AtsFollowUpCmdFstStru gCanclPsdExceptMsgFst = { 0u }; /*解除站台门异常首次消息*/ +RCIFollowUpReplyStru gCanclPsdExceptReplyFst = { 0u }; /*解除站台门异常首次确认*/ +AtsFollowUpCmdSndStru gCanclPsdExceptMsgSnd = { 0u }; /*解除站台门异常二次消息*/ +RCIFollowUpReplyStru gCanclPsdExceptReplySnd = { 0u }; /*解除站台门异常二次确认*/ + /* * 功能描述: 组包Ci到Ats逻辑区段已征用信息 * 参数说明: const UINT8* pDataBuf, 数据缓冲区 @@ -189,7 +219,6 @@ UINT8 ParseAtsOrXianDiToCiDataFrame(const UINT8* dataBuf, const UINT16 dataLengt UINT32 dwCiAndAtsTimeOutTime = 0u; /*联锁与ATS通信中断时间*/ UINT32 dwCiCurappCycleTime = 0u; /*联锁当前周期*/ INT32 remainValidiy = 0; /*剩余时间是否有效*/ - UINT16 wApplyDataLenth = 0U; /*应用层数据长度*/ UINT16 wTmpDataLen = 0U; /*数据长度临时记录变量*/ UINT16 wMsgLen = 0U; /*一条应用数据长度*/ UINT16 wMsgType = 0U; /*报文类型*/ @@ -198,7 +227,14 @@ UINT8 ParseAtsOrXianDiToCiDataFrame(const UINT8* dataBuf, const UINT16 dataLengt UINT8 chCurSystemAreaState = 0U; /*当前系统区域状态*/ UINT32 dwReciveCmdDataAtsCycNum = 0U; /*收到ATS命令数据时ATS周期号*/ UINT32 dwSystemUpdateMainUseCycNum = 0U; /*系统主用起始周期号*/ - + UINT16 wPreCmdNum = 0U;/*上周期命令数:用于命令帧校验通过、二次信息校验失败时清除本次收到命令帧*/ + UINT16 wCurCmdNum = 0U;/*命令帧解析后当前命令总数*/ + AtsFollowUpCmdFstStru tempFstCmd[FOLLOWUP_MSGID_MAX] = { 0U };/*一次命令临时存储*/ + AtsFollowUpCmdSndStru tempSndCmd[FOLLOWUP_MSGID_MAX] = { 0U };/*二次命令临时存储*/ + UINT16 wIndex = 0U;/*临时信息存储索引*/ + UINT16 wMsgTypeTmp = 0U;/*拷贝回全局变量的信息类型*/ + AtsFollowUpCmdFstStru *pGlobalFst = NULL; + AtsFollowUpCmdSndStru *pGlobalSnd = NULL; if ((NULL!= dataBuf) && (0u < dataLength)) { chAtsInterfaceType = GetCiFunctionSwitchConfig(FUNC_ATS_INTERFACE_IDENTIFIER); @@ -261,6 +297,8 @@ UINT8 ParseAtsOrXianDiToCiDataFrame(const UINT8* dataBuf, const UINT16 dataLengt else { chRetVal = CI_SUCCESS; + /*先获取上一周期是存储进路办理命令数*/ + wPreCmdNum = GetCiRevCmdStruCurSum(); while (wTmpDataLen < hlhtGalHead.totalDataLen) { @@ -321,6 +359,83 @@ UINT8 ParseAtsOrXianDiToCiDataFrame(const UINT8* dataBuf, const UINT16 dataLengt debug_infor_printf((const)"\nATS/Xiandi %d Not Deal Cmd,Because chCurSystemAreaState %d\n", chDeciveId, chCurSystemAreaState); } break; + case ATS_CI_INFO_FST_DS_CANCEL: + case ATS_CI_INFO_FST_SWIUNFLOCK: + case ATS_CI_INFO_FST_FAULTUNLOCK: + case ATS_CI_INFO_FST_SECUNFLOCK: + case ATS_CI_INFO_FST_SIGUNFLOCK: + case ATS_CI_INFO_FST_ZONGRENJIE: + case ATS_CI_INFO_FST_PSD_UNEXCEPT: + chCurSystemAreaState = GetLocalCiBackUpPattern(); + if (SYSTEM_WORK_MODE_MAIN == chCurSystemAreaState) + { + /*主用解析操作命令,必须检查当前该包数据是否已经处理过*/ + dwReciveCmdDataAtsCycNum = GetReciveCmdDataAtsCycNum(chDevType, chDeciveId); + dwSystemUpdateMainUseCycNum = GetSystemUpdateMainUseCycNum(); + + if ((dwReciveCmdDataAtsCycNum < hlhtGalHead.crntOwnMsgSN) || + (dwSystemUpdateMainUseCycNum <= hlhtGalHead.recvOppMsgSN)) + { + /*当前ATS发送数据时的周期号大于接收到ATS数据时ATS周期号 + 或当前ATS发送数据时的联锁周期号大于等于当前系统升级主用起始周期号*/ + wIndex = (wMsgType - ATS_CI_INFO_FST_DS_CANCEL) / 4; + if ((FOLLOWUP_MSGID_MAX > wIndex)&&(ATS_CI_INFO_TYPE_FIRST_LEN == wMsgCheckLen)) + { + chRetVal = ProcessCmdFirstMsgCheck(dataBuf, ii, &tempFstCmd[wIndex]); + ii += ATS_CI_INFO_TYPE_FIRST_LEN; + chExistCmdDataFlag = 1U; /*先设置存在命令数据标志有效,数据解析不过在下面置为无效*/ + } + else + { + chRetVal = CI_ERROR;/*越界防护*/ + } + + } + else + { + ii += wMsgCheckLen; + /*已经被另外一机处理过了*/ + debug_infor_printf((const)"\nATS/Xiandi %d Not Deal FstCmd%d,Because curCmd has been processed by another System,dwReciveCmdDataAtsCycNum %d dwSystemUpdateMainUseCycNum %d\n", chDeciveId, wMsgType, dwReciveCmdDataAtsCycNum, dwSystemUpdateMainUseCycNum); + } + } + break; + case ATS_CI_INFO_SND_DS_CANCEL: + case ATS_CI_INFO_SND_SWIUNFLOCK: + case ATS_CI_INFO_SND_FAULTUNLOCK: + case ATS_CI_INFO_SND_SECUNFLOCK: + case ATS_CI_INFO_SND_SIGUNFLOCK: + case ATS_CI_INFO_TYPE_SND_ZRJ: + case ATS_CI_INFO_SND_PSD_UNEXCEPT: + chCurSystemAreaState = GetLocalCiBackUpPattern(); + if (SYSTEM_WORK_MODE_MAIN == chCurSystemAreaState) + { + /*主用解析操作命令,必须检查当前该包数据是否已经处理过*/ + dwReciveCmdDataAtsCycNum = GetReciveCmdDataAtsCycNum(chDevType, chDeciveId); + dwSystemUpdateMainUseCycNum = GetSystemUpdateMainUseCycNum(); + + if ((dwReciveCmdDataAtsCycNum < hlhtGalHead.crntOwnMsgSN) || + (dwSystemUpdateMainUseCycNum <= hlhtGalHead.recvOppMsgSN)) + { + wIndex = (wMsgType - ATS_CI_INFO_SND_DS_CANCEL) / 4; + if ((FOLLOWUP_MSGID_MAX > wIndex) && (ATS_CI_INFO_TYPE_SND_LEN == wMsgCheckLen)) + { + chRetVal = ProcessCmdSndMsgCheck(dataBuf, ii, &tempSndCmd[wIndex]); + ii += ATS_CI_INFO_TYPE_SND_LEN; + chExistCmdDataFlag = 1U; /*先设置存在命令数据标志有效,数据解析不过在下面置为无效*/ + } + else + { + chRetVal = CI_ERROR;/*越界防护*/ + } + } + else + { + ii += wMsgCheckLen; + /*已经被另外一机处理过了*/ + debug_infor_printf((const)"\nATS/Xiandi %d Not Deal SndCmd%d,Because curCmd has been processed by another System,dwReciveCmdDataAtsCycNum %d dwSystemUpdateMainUseCycNum %d\n", chDeciveId, wMsgType, dwReciveCmdDataAtsCycNum, dwSystemUpdateMainUseCycNum); + } + } + break; default: chRetVal = CI_ERROR; break; @@ -340,21 +455,51 @@ UINT8 ParseAtsOrXianDiToCiDataFrame(const UINT8* dataBuf, const UINT16 dataLengt } - if (CI_SUCCESS == chRetVal) + /*校验数据长度*/ + if ((hlhtGalHead.totalDataLen != ii - (UINT16)31U) || (dataLength != hlhtGalHead.totalDataLen+ (UINT16)31U)) { - /*校验数据长度*/ - if (hlhtGalHead.totalDataLen != ii - 31U) - { - /* 31为应用数据帧头长度 */ - chRetVal = CI_ERROR; + /* 31为应用数据帧头长度 */ + chRetVal = CI_ERROR; + debug_infor_printf((char*)"Lenght Error \n"); + } + if (CI_SUCCESS != chRetVal) + { + /*清除本次存储的命令信息*/ + wCurCmdNum = GetCiRevCmdStruCurSum();/*当前命令信息数*/ + ToaClearCmd(); + for (wIndex = wPreCmdNum; wIndex <= wCurCmdNum; wIndex++) + { + (void)CommonMemSet(&CiRevCmdDataStru[wIndex], (UINT32)sizeof(CommandDataStruct), 0u, (UINT32)sizeof(CommandDataStruct)); } } else { - ; + /*将临时一二次信息拷贝到全局变量*/ + for (wIndex = 0U; wIndex < FOLLOWUP_MSGID_MAX; wIndex++) + { + if (FLAG_SET == tempFstCmd[wIndex].chFlag) + { + wMsgTypeTmp = ATS_CI_INFO_FST_DS_CANCEL + wIndex*(UINT16)4U; + pGlobalFst = GetAtsFollowUpMsgFst(wMsgTypeTmp); + if (NULL != pGlobalFst) + { + (void)CommonMemCpy((void *)(pGlobalFst), (UINT32)sizeof(AtsFollowUpCmdFstStru), (const void *)(&tempFstCmd[wIndex]), (UINT32)sizeof(AtsFollowUpCmdFstStru)); + } + } + if (FLAG_SET == tempSndCmd[wIndex].chFlag) + { + wMsgTypeTmp = ATS_CI_INFO_SND_DS_CANCEL + wIndex*(UINT16)4U; + pGlobalSnd = GetAtsFollowUpMsgSnd(wMsgTypeTmp); + if (NULL != pGlobalSnd) + { + (void)CommonMemCpy((void *)(pGlobalSnd), (UINT32)sizeof(AtsFollowUpCmdSndStru), (const void *)(&tempSndCmd[wIndex]), (UINT32)sizeof(AtsFollowUpCmdSndStru)); + } + } + } } + if (CI_SUCCESS == chRetVal) { /*数据经过校验,需要存储通用报文上下文*/ @@ -578,6 +723,12 @@ UINT8 PackCiToAtsOrXianDiData(const UINT8 deviceId, const UINT8 targetDevType, c ; /*继续组包*/ } } + + if (CI_SUCCESS == chReval) + { + /*进行一次、二次回复单独信息帧组包*/ + chReval = PackCiToAtsFollowUpMsg(ciToXianDiDataBuffer, &ii, targetDevType, PACK_ATS_TYPE_CENTER); + } } else { @@ -1297,6 +1448,9 @@ UINT8 FindFirstOrder(UINT8 SecondOrder) case ATS_CMD_EMERG_XS_CANCEL_TWO: reVal = ATS_CMD_EMERG_XS_CANCEL_ONE; /*取消紧急临时限速一次*/ break; + case ATS_CMD_CONNECT_ROUTE_RELEASE_TWO: /*联络线接车进路解锁二次*/ + reVal = ATS_CMD_CONNECT_ROUTE_RELEASE_ONE; /*联络线接车进路解锁一次*/ + break; default: reVal = 0u; break; @@ -2065,7 +2219,7 @@ UINT16 TransCiToAtsSwitchZzjInfo(OcToATSSwitchZzjData* ciSendAtsSwitchZzjData, U } else { - /*道岔没被驱动四开,此转辙机状态设置为正常*/ + /*道岔没被驱动四开,此转辙机状态设置为故障*/ ciSendAtsSwitchZzjData[wSwitchNum].szSwitchIncldeZzjState[jj] = OC_TO_ATS_SWITCH_ZZJ_ALARM; } } @@ -3622,7 +3776,8 @@ UINT8 ReciveAtsCmdDeal(const UINT8* dataBuf, UINT16* dataIndex,const UINT16 wDat } if (CI_ERROR == chRetVal) - {/*包内有数据错误,丢包处理*/ + { + /*包内有数据错误,丢包处理*/ /*清除这本包数据*/ ToaClearCmd(); commandTotalSum = 0u; @@ -3930,4 +4085,504 @@ void PackRcOrCiDeciveCommonState(UINT8* ciToXianDiDataBuffer, UINT16* ii) { /*入参检查失败,不处理*/ } +} + +/** +* @brief 获取ATS对应的首次消息 +* @param[in] const UINT16 wMsgType, 命令类型 +* @return 获取ATS二次信息帧中的首次消息 +* @note by fan 20260602 +*/ +AtsFollowUpCmdFstStru * GetAtsFollowUpMsgFst(UINT16 chMsgType) +{ + AtsFollowUpCmdFstStru* rtnVal = NULL; + switch (chMsgType) + { + case ATS_CI_INFO_FST_DS_CANCEL: + rtnVal = &gDansuoCancleMsgFst; + break; + case ATS_CI_INFO_FST_SWIUNFLOCK: + rtnVal = &gSwitchUnflockMsgFst; + break; + case ATS_CI_INFO_FST_FAULTUNLOCK: + break; + case ATS_CI_INFO_FST_SECUNFLOCK: + rtnVal = &gSecUnflockMsgFst; + break; + case ATS_CI_INFO_FST_SIGUNFLOCK: + rtnVal = &gSignalUnflockMsgFst; + break; + case ATS_CI_INFO_FST_ZONGRENJIE: + break; + case ATS_CI_INFO_FST_PSD_UNEXCEPT: + break; + default: + break; + } + return rtnVal; +} + +/** +* @brief 获取ATS对应的二次消息 +* @param[in] const UINT16 wMsgType, 命令类型 +* @return 获取ATS二次信息帧中的再次消息 +* @note by fan 20260602 +*/ +AtsFollowUpCmdSndStru * GetAtsFollowUpMsgSnd(UINT16 chMsgType) +{ + AtsFollowUpCmdSndStru* rtnVal = NULL; + switch (chMsgType) + { + case ATS_CI_INFO_SND_DS_CANCEL: + rtnVal = &gDansuoCancleMsgSnd; + break; + case ATS_CI_INFO_SND_SWIUNFLOCK: + rtnVal = &gSwitchUnflockMsgSnd; + break; + case ATS_CI_INFO_SND_FAULTUNLOCK: + break; + case ATS_CI_INFO_SND_SECUNFLOCK: + rtnVal = &gSecUnflockMsgSnd; + break; + case ATS_CI_INFO_SND_SIGUNFLOCK: + rtnVal = &gSignalUnflockMsgSnd; + break; + case ATS_CI_INFO_TYPE_SND_ZRJ: + break; + case ATS_CI_INFO_SND_PSD_UNEXCEPT: + break; + default: + break; + } + return rtnVal; +} + +/** +* @brief 获取ATS对应的首次反馈消息 +* @param[in] const UINT16 wMsgType, 命令类型 +* @return 获取ATS二次信息帧中的首次反馈 +* @note by fan 20260602 +*/ +RCIFollowUpReplyStru * GetAtsFollowUpReplyFst(UINT16 chMsgType) +{ + RCIFollowUpReplyStru* rtnVal = NULL; + switch (chMsgType) + { + case RCI_ATS_INFO_FST_DS_CANCEL: + rtnVal = &gDansuoCancleReplyFst; + break; + case RCI_ATS_INFO_FST_SWIUNFLOCK: + rtnVal = &gSwitchUnflockReplyFst; + break; + case RCI_ATS_INFO_FST_FAULTUNLOCK: + break; + case RCI_ATS_INFO_FST_SECUNFLOCK: + rtnVal = &gSecUnflockReplyFst; + break; + case RCI_ATS_INFO_FST_SIGUNFLOCK: + rtnVal = &gSignalUnflockReplyFst; + break; + case RCI_ATS_INFO_FST_ZONGRENJIE: + break; + case RCI_ATS_INFO_FST_PSD_UNEXCEPT: + break; + default: + break; + } + return rtnVal; +} + +/** +* @brief 获取ATS对应的再次反馈消息 +* @param[in] const UINT16 wMsgType, 命令类型 +* @return 获取ATS二次信息帧中的再次反馈 +* @note by fan 20260602 +*/ +RCIFollowUpReplyStru * GetAtsFollowUpReplySnd(UINT16 chMsgType) +{ + RCIFollowUpReplyStru* rtnVal = NULL; + switch (chMsgType) + { + case RCI_ATS_INFO_SND_DS_CANCEL: + rtnVal = &gDansuoCancleReplySnd; + break; + case RCI_ATS_INFO_SND_SWIUNFLOCK: + rtnVal = &gSwitchUnflockReplySnd; + break; + case RCI_ATS_INFO_SND_FAULTUNLOCK: + break; + case RCI_ATS_INFO_SND_SECUNFLOCK: + rtnVal = &gSecUnflockReplySnd; + break; + case RCI_ATS_INFO_SND_SIGUNFLOCK: + rtnVal = &gSignalUnflockReplySnd; + break; + case RCI_ATS_INFO_SND_ZRJ: + break; + case RCI_ATS_INFO_SND_PSD_UNEXCEPT: + break; + default: + break; + } + return rtnVal; +} + +/** +* @brief 清除1次ATS命令信息 +* @param[in] const UINT16 wMsgType, 命令类型 +* @return void +* @note by fan 20260603 +*/ +void ClearAtsCmdMsgFst(UINT16 chMsgType) +{ + switch (chMsgType) + { + case ATS_CI_INFO_FST_DS_CANCEL: + (void)CommonMemSet((void*)&gDansuoCancleMsgFst, (UINT32)sizeof(gDansuoCancleMsgFst), (UINT8)0U, (UINT32)sizeof(gDansuoCancleMsgFst)); + break; + case ATS_CI_INFO_FST_SWIUNFLOCK: + (void)CommonMemSet((void*)&gSwitchUnflockMsgFst, (UINT32)sizeof(gSwitchUnflockMsgFst), (UINT8)0U, (UINT32)sizeof(gSwitchUnflockMsgFst)); + break; + case ATS_CI_INFO_FST_FAULTUNLOCK: + break; + case ATS_CI_INFO_FST_SECUNFLOCK: + (void)CommonMemSet((void*)&gSecUnflockMsgFst, (UINT32)sizeof(gSecUnflockMsgFst), (UINT8)0U, (UINT32)sizeof(gSecUnflockMsgFst)); + break; + case ATS_CI_INFO_FST_SIGUNFLOCK: + (void)CommonMemSet((void*)&gSignalUnflockMsgFst, (UINT32)sizeof(gSignalUnflockMsgFst), (UINT8)0U, (UINT32)sizeof(gSignalUnflockMsgFst)); + break; + case ATS_CI_INFO_FST_ZONGRENJIE: + break; + case ATS_CI_INFO_FST_PSD_UNEXCEPT: + break; + default: + break; + } +} + +/** +* @brief 清除首次反馈信息 +* @param[in] const UINT16 wMsgType, 命令类型 +* @return void +* @note by fan 20260603 +*/ +void ClearAtsCmdReplyFst(UINT16 chMsgType) +{ + switch (chMsgType) + { + case RCI_ATS_INFO_FST_DS_CANCEL: + (void)CommonMemSet((void*)&gDansuoCancleReplyFst, (UINT32)sizeof(gDansuoCancleReplyFst), (UINT8)0U, (UINT32)sizeof(gDansuoCancleReplyFst)); + break; + case RCI_ATS_INFO_FST_SWIUNFLOCK: + (void)CommonMemSet((void*)&gSwitchUnflockReplyFst, (UINT32)sizeof(gSwitchUnflockReplyFst), (UINT8)0U, (UINT32)sizeof(gSwitchUnflockReplyFst)); + break; + case RCI_ATS_INFO_FST_FAULTUNLOCK: + break; + case RCI_ATS_INFO_FST_SECUNFLOCK: + (void)CommonMemSet((void*)&gSecUnflockReplyFst, (UINT32)sizeof(gSecUnflockReplyFst), (UINT8)0U, (UINT32)sizeof(gSecUnflockReplyFst)); + break; + case RCI_ATS_INFO_FST_SIGUNFLOCK: + (void)CommonMemSet((void*)&gSignalUnflockReplyFst, (UINT32)sizeof(gSignalUnflockReplyFst), (UINT8)0U, (UINT32)sizeof(gSignalUnflockReplyFst)); + break; + case RCI_ATS_INFO_FST_ZONGRENJIE: + break; + case RCI_ATS_INFO_FST_PSD_UNEXCEPT: + break; + default: + break; + } +} +/** +* @brief 清除2次ATS命令信息 +* @param[in] const UINT16 wMsgType, 命令类型 +* @return void +* @note by fan 20260603 +*/ +void ClearAtsCmdMsgSnd(UINT16 chMsgType) +{ + switch (chMsgType) + { + case ATS_CI_INFO_SND_DS_CANCEL: + (void)CommonMemSet((void*)&gDansuoCancleMsgSnd, (UINT32)sizeof(gDansuoCancleMsgSnd), (UINT8)0U, (UINT32)sizeof(gDansuoCancleMsgSnd)); + break; + case ATS_CI_INFO_SND_SWIUNFLOCK: + (void)CommonMemSet((void*)&gSwitchUnflockMsgSnd, (UINT32)sizeof(gSwitchUnflockMsgSnd), (UINT8)0U, (UINT32)sizeof(gSwitchUnflockMsgSnd)); + break; + case ATS_CI_INFO_SND_FAULTUNLOCK: + break; + case ATS_CI_INFO_SND_SECUNFLOCK: + (void)CommonMemSet((void*)&gSecUnflockMsgSnd, (UINT32)sizeof(gSecUnflockMsgSnd), (UINT8)0U, (UINT32)sizeof(gSecUnflockMsgSnd)); + break; + case ATS_CI_INFO_SND_SIGUNFLOCK: + (void)CommonMemSet((void*)&gSignalUnflockMsgSnd, (UINT32)sizeof(gSignalUnflockMsgSnd), (UINT8)0U, (UINT32)sizeof(gSignalUnflockMsgSnd)); + break; + case ATS_CI_INFO_TYPE_SND_ZRJ: + break; + case ATS_CI_INFO_SND_PSD_UNEXCEPT: + break; + default: + break; + } +} + +/** +* @brief 清除再次反馈信息 +* @param[in] const UINT16 wMsgType, 命令类型 +* @return void +* @note by fan 20260603 +*/ +void ClearAtsCmdReplySnd(UINT16 chMsgType) +{ + switch (chMsgType) + { + case RCI_ATS_INFO_SND_DS_CANCEL: + (void)CommonMemSet((void*)&gDansuoCancleReplySnd, (UINT32)sizeof(gDansuoCancleReplySnd), (UINT8)0U, (UINT32)sizeof(gDansuoCancleReplySnd)); + break; + case RCI_ATS_INFO_SND_SWIUNFLOCK: + (void)CommonMemSet((void*)&gSwitchUnflockReplySnd, (UINT32)sizeof(gSwitchUnflockReplySnd), (UINT8)0U, (UINT32)sizeof(gSwitchUnflockReplySnd)); + break; + case RCI_ATS_INFO_SND_FAULTUNLOCK: + break; + case RCI_ATS_INFO_SND_SECUNFLOCK: + (void)CommonMemSet((void*)&gSecUnflockReplySnd, (UINT32)sizeof(gSecUnflockReplySnd), (UINT8)0U, (UINT32)sizeof(gSecUnflockReplySnd)); + break; + case RCI_ATS_INFO_SND_SIGUNFLOCK: + (void)CommonMemSet((void*)&gSignalUnflockReplySnd, (UINT32)sizeof(gSignalUnflockReplySnd), (UINT8)0U, (UINT32)sizeof(gSignalUnflockReplySnd)); + break; + case RCI_ATS_INFO_SND_ZRJ: + break; + case RCI_ATS_INFO_SND_PSD_UNEXCEPT: + break; + default: + break; + } +} +/** +* @brief 收到ATS/网关首次信息解析检查处理 +* @param[in] const UINT8* dataBuf, 数据缓冲区 +* @param[in] UINT16* dataIndex, 数据索引 +* @param[Out] AtsFollowUpCmdFstStru* pMsgFst 首次信息变量指针 +* @return CI_ERROR 失败 CI_SUCCESS 成功 +* @note by fan 20260602 +*/ +UINT8 ProcessCmdFirstMsgCheck(const UINT8* dataBuf, UINT16 dataIndex, AtsFollowUpCmdFstStru* pMsgFst) +{ + UINT8 chRetVal = CI_ERROR; + UINT16 ii = 0U; + UINT32 dwCurCyc = Get2oo2CurCycleNum(); + if ((NULL != dataBuf) && (0U != dataIndex)&&(NULL != pMsgFst)) + { + chRetVal = CI_SUCCESS; + ii = dataIndex; + /*无条件更新最新一次命令*/ + pMsgFst->chAtsId = dataBuf[ii++]; + pMsgFst->chRtuId = dataBuf[ii++]; + pMsgFst->wIndex = ShortFromChar(&dataBuf[ii]); /* 操作站编号 */ + ii += 2u; + pMsgFst->chTiocId = dataBuf[ii++]; + pMsgFst->dwTime = LongFromChar(&dataBuf[ii]); /* 请求时间 */ + ii += 4u; + pMsgFst->wDevId = ShortFromChar(&dataBuf[ii]); /* 设备编号 */ + ii += 2u; + if (((0U == pMsgFst->chAtsId) || (0U == pMsgFst->chRtuId)) + &&(0UwIndex) + && (0U < pMsgFst->wDevId) && (UINT16_MAX > pMsgFst->wDevId) + && (0U < pMsgFst->chTiocId) && (CI_SUM_MAX> pMsgFst->chTiocId)) + { + pMsgFst->chFlag = FLAG_SET; + pMsgFst->dwCycle = dwCurCyc; + } + else + { + chRetVal = CI_ERROR; + } + } + return chRetVal; +} + +/** +* @brief 收到ATS/网关再次命令检查处理 +* @param[in] const UINT8* dataBuf, 数据缓冲区 +* @param[in] UINT16* dataIndex, 数据索引 +* @param[Out] AtsFollowUpCmdSndStru* pMsgSnd 再次信息变量指针 +* @return CI_ERROR 失败 CI_SUCCESS 成功 +* @note by fan 20260602 +*/ +UINT8 ProcessCmdSndMsgCheck(const UINT8* dataBuf, UINT16 dataIndex, AtsFollowUpCmdSndStru* pMsgSnd) +{ + UINT8 chRetVal = CI_ERROR; + UINT16 ii = 0U; + UINT32 dwCurCyc = Get2oo2CurCycleNum(); + if ((NULL != dataBuf) && (0U != dataIndex) && (NULL != pMsgSnd)) + { + chRetVal = CI_SUCCESS; + ii = dataIndex; + pMsgSnd->chAtsId = dataBuf[ii++]; + pMsgSnd->chRtuId = dataBuf[ii++]; + pMsgSnd->wIndex = ShortFromChar(&dataBuf[ii]); /* 操作站编号 */ + ii += 2u; + pMsgSnd->chTiocId = dataBuf[ii++]; + pMsgSnd->dwTime = LongFromChar(&dataBuf[ii]); /* 请求时间 */ + ii += 4u; + pMsgSnd->wDevId = ShortFromChar(&dataBuf[ii]); /* 设备编号 */ + ii += 2u; + pMsgSnd->dwCrc32 = LongFromChar(&dataBuf[ii]); /* CRC32 */ + ii += 4u; + if (((0U == pMsgSnd->chAtsId) || (0U == pMsgSnd->chRtuId)) + && (0UwIndex) + && (0U < pMsgSnd->wDevId) && (UINT16_MAX > pMsgSnd->wDevId) + && (0U < pMsgSnd->chTiocId) && (CI_SUM_MAX> pMsgSnd->chTiocId)) + { + pMsgSnd->chFlag = FLAG_SET; + pMsgSnd->dwCycle = dwCurCyc; + } + else + { + chRetVal = CI_ERROR; + } + } + return chRetVal; +} +/** +* @brief ATS/网关/现地 二次命令回复处理 +* @brief 发送ATS通用站场状态处理 +* @param[in] UINT8* ciToXianDiDataBuffer CI组包给ATS或现地的数据数组 +* @param[out] UINT16* wDataIndex CI组包给ATS或现地的数据索引 +* @param[in] const UINT8 chTargetType, 目标系统类型 +* @param[in] const UINT8 chAtsType, ats(设备0x03)类型 +* @return 无 +* @note by fan 20260602 +*/ +UINT8 PackCiToAtsFollowUpMsg(UINT8* ciToXianDiDataBuffer, UINT16* wDataIndex, UINT8 chTargetType, UINT8 chAtsType) +{ + UINT8 reVal = CI_ERROR; + UINT16 ii = 0U;/*游标*/ + UINT16 j = 0U; + UINT16 wMsgIndex = 0u;/*命令帧类型 遍历使用*/ + RCIFollowUpReplyStru * strCfmTemp = NULL;/*回复信息指针*/ + UINT16 wMagDataLenIndex = 0U; + UINT16 wMagLen = 0U;/*单信息长度记录*/ + UINT8 chPackCheck = CI_ERROR;/*检查组包设备是否与消息对应*/ + UINT32 dwCurCyc = Get2oo2CurCycleNum(); + if ((NULL != ciToXianDiDataBuffer) && (NULL != wDataIndex) && + ((CI_SYSTEM_TYPE_XIANDI == chTargetType)||(CI_SYSTEM_TYPE_ATS == chTargetType))) + { + ii = *wDataIndex; + for (j = 0U; j < FOLLOWUP_MSGID_MAX; j++) + { + wMsgIndex = (UINT16)0x0300U + j* (UINT16)4U + (UINT16)2U; + /*获取首次消息反馈*/ + strCfmTemp = GetAtsFollowUpReplyFst(wMsgIndex); + /*校验内容:消息有效、消息属于对应设备*/ + if ((NULL != strCfmTemp)&&(dwCurCyc == strCfmTemp->dwTime)) + { + if ((0U < strCfmTemp->chAtsId) && (CI_SYSTEM_TYPE_ATS == chTargetType) && (PACK_ATS_TYPE_GATEWAY == chAtsType)) + { + /*atsID不为0、对应设备为网关*/ + chPackCheck = CI_SUCCESS; + } + else if ((0U < strCfmTemp->chRtuId) && (CI_SYSTEM_TYPE_XIANDI == chTargetType)) + { + /*Rtu ID不为0、对应设备为现地*/ + chPackCheck = CI_SUCCESS; + } + else if ((0U == strCfmTemp->chAtsId)&&(0U == strCfmTemp->chRtuId)&&(CI_SYSTEM_TYPE_ATS == chTargetType) && (PACK_ATS_TYPE_CENTER == chAtsType)) + { + /*全0 给ATS组包*/ + chPackCheck = CI_SUCCESS; + } + else + { + chPackCheck = CI_ERROR;/*非本设备*/ + } + if(CI_SUCCESS == chPackCheck) + { + wMagDataLenIndex = ii; + ii += 2U; + ShortToChar(wMsgIndex, &ciToXianDiDataBuffer[ii]);/* 报文类型 */ + ii += 2u; + /* 预留2字节 */ + ii += 2u; + ciToXianDiDataBuffer[ii++] = strCfmTemp->chTiocId; /*RC/CI编号*/ + ciToXianDiDataBuffer[ii++] = strCfmTemp->chRtuId; /*RTU id*/ + ShortToChar(strCfmTemp->wIndex , &ciToXianDiDataBuffer[ii]);/* 操作站 */ + ii += 2u; + LongToChar(strCfmTemp->dwTime, &ciToXianDiDataBuffer[ii]); /* 收到请求时间 */ + ii += 4U; + ciToXianDiDataBuffer[ii++] = strCfmTemp->chOpStatus; /*反馈*/ + LongToChar(strCfmTemp->dwCrc32, &ciToXianDiDataBuffer[ii]); /* CRC */ + ii += 4U; + wMagLen = ii - wMagDataLenIndex - 2U; + /* 组数据长度 */ + ShortToChar(wMagLen, &ciToXianDiDataBuffer[wMagDataLenIndex]); + /*修改反馈状态*/ + } + } + if ((NULL != strCfmTemp)&& (dwCurCyc != strCfmTemp->dwTime)) + { + /*非本周期*/ + strCfmTemp->chFlag = FLAG_UNSET; + } + wMsgIndex = (UINT16)0x0300U + j* (UINT16)4U + (UINT16)4U; + /*获取再次次消息反馈*/ + strCfmTemp = GetAtsFollowUpReplySnd(wMsgIndex); + if ((NULL != strCfmTemp) && (dwCurCyc == strCfmTemp->dwTime)) + { + /*校验内容:本周期消息、消息属于对应设备*/ + if ((0U < strCfmTemp->chAtsId) && (CI_SYSTEM_TYPE_ATS == chTargetType) && (PACK_ATS_TYPE_GATEWAY == chAtsType)) + { + /*atsID不为0、对应设备为网关*/ + chPackCheck = CI_SUCCESS; + } + else if ((0U < strCfmTemp->chRtuId) && (CI_SYSTEM_TYPE_XIANDI == chTargetType)) + { + /*Rtu ID不为0、对应设备为现地*/ + chPackCheck = CI_SUCCESS; + } + else if ((0U == strCfmTemp->chAtsId)&&(0U == strCfmTemp->chRtuId)&&(CI_SYSTEM_TYPE_ATS == chTargetType) && (PACK_ATS_TYPE_CENTER == chAtsType)) + { + /*全0 给ATS组包*/ + chPackCheck = CI_SUCCESS; + } + else + { + chPackCheck = CI_ERROR;/*非本设备*/ + } + if (CI_SUCCESS == chPackCheck) + { + wMagDataLenIndex = ii; + ii += 2U; + ShortToChar(wMsgIndex, &ciToXianDiDataBuffer[ii]);/* 报文类型 */ + ii += 2u; + /* 预留2字节 */ + ii += 2u; + ciToXianDiDataBuffer[ii++] = strCfmTemp->chTiocId; /*RC/CI编号*/ + ciToXianDiDataBuffer[ii++] = strCfmTemp->chRtuId; /*RTU id*/ + ShortToChar(strCfmTemp->wIndex, &ciToXianDiDataBuffer[ii]);/* 操作站 */ + ii += 2u; + LongToChar(strCfmTemp->dwTime, &ciToXianDiDataBuffer[ii]); /* 收到请求时间 */ + ii += 4U; + ciToXianDiDataBuffer[ii++] = strCfmTemp->chOpStatus; /*反馈*/ + LongToChar(strCfmTemp->dwCrc32, &ciToXianDiDataBuffer[ii]); /* CRC */ + ii += 4U; + wMagLen = ii - wMagDataLenIndex - 2U; + /* 组数据长度 */ + ShortToChar(wMagLen, &ciToXianDiDataBuffer[wMagDataLenIndex]); + /* 清零二次反馈*/ + } + } + if ((NULL != strCfmTemp) && (dwCurCyc != strCfmTemp->dwTime)) + { + /*非本周期*/ + ClearAtsCmdReplySnd(wMsgIndex); + } + } + *wDataIndex = ii; + reVal = CI_SUCCESS; + } + else + { + ;/*失败*/ + } + return reVal; } \ No newline at end of file diff --git a/TSCP/src/APP/ciapp/ParsePack/ParsePackAtsData.h b/TSCP/src/APP/ciapp/ParsePack/ParsePackAtsData.h index e55a942..f1fc982 100644 --- a/TSCP/src/APP/ciapp/ParsePack/ParsePackAtsData.h +++ b/TSCP/src/APP/ciapp/ParsePack/ParsePackAtsData.h @@ -75,11 +75,57 @@ #define RCI_ATS_INFO_TYPE_DEVICE_STATE ((UINT16)0x0203U) /*RCI->ATS设备状态信息,间隔1周期发送*/ #define ATS_CI_INFO_TYPE_HEART_STATE ((UINT16)0x0204U) /*ATS->CI心跳状态信息,周期发送*/ #define ATS_CI_INFO_TYPE_CMD_CONTROL ((UINT16)0x0205U) /*ATS->CI命令控制信息,ATS触发发送*/ +#define ATS_CI_INFO_TYPE_GATEWAY_COMMON ((UINT16)0x0206U) /*网关->CI既有信息帧 ATS触发发送*/ +#define RCI_ATS_INFO_TYPE_GATEWAY_COMMON ((UINT16)0x0207U) /*RC->网关既有信息汇报,周期发送*/ +#define RCI_ATS_INFO_TYPE_GATEWAY_HEART ((UINT16)0x0208U) /*CI->网关周期心跳*/ +#define ATS_CI_INFO_FST_DS_CANCEL ((UINT16)0x0301U) /*ATS->CI道岔单解一次命令,ATS触发发送*/ +#define RCI_ATS_INFO_FST_DS_CANCEL ((UINT16)0x0302U) /*RCI->ATS道岔单解首次回复,触发单解一次后发送*/ +#define ATS_CI_INFO_SND_DS_CANCEL ((UINT16)0x0303U) /*ATS->CI道岔单解二次命令,ATS触发发送*/ +#define RCI_ATS_INFO_SND_DS_CANCEL ((UINT16)0x0304U) /*RCI->ATS道岔单解再次回复,触发单解二次后发送*/ +#define ATS_CI_INFO_FST_SWIUNFLOCK ((UINT16)0x0305U) /*ATS->CI道岔解封一次命令,ATS触发发送*/ +#define RCI_ATS_INFO_FST_SWIUNFLOCK ((UINT16)0x0306U) /*RCI->ATS道岔解封首次回复,触发解封一次后发送*/ +#define ATS_CI_INFO_SND_SWIUNFLOCK ((UINT16)0x0307U) /*ATS->CI道岔解封二次命令,ATS触发发送*/ +#define RCI_ATS_INFO_SND_SWIUNFLOCK ((UINT16)0x0308U) /*RCI->ATS道岔解封再次回复,触发解封二次后发送*/ +#define ATS_CI_INFO_FST_FAULTUNLOCK ((UINT16)0x0309U) /*ATS->CI 区故解 预留*/ +#define RCI_ATS_INFO_FST_FAULTUNLOCK ((UINT16)0x030AU) /*RCI->ATS区故解一次回复 预留*/ +#define ATS_CI_INFO_SND_FAULTUNLOCK ((UINT16)0x030BU) /*ATS->CI区故解二次 预留*/ +#define RCI_ATS_INFO_SND_FAULTUNLOCK ((UINT16)0x030CU) /*RCI->ATS区故解二次 预留*/ +#define ATS_CI_INFO_FST_SECUNFLOCK ((UINT16)0x030DU) /*ATS->CI区段解封一次命令,ATS触发发送*/ +#define RCI_ATS_INFO_FST_SECUNFLOCK ((UINT16)0x030EU) /*RCI->ATS区段解封首次回复,触发解封一次后发送*/ +#define ATS_CI_INFO_SND_SECUNFLOCK ((UINT16)0x030FU) /*ATS->CI区段解封二次命令,ATS触发发送*/ +#define RCI_ATS_INFO_SND_SECUNFLOCK ((UINT16)0x0310U) /*RCI->ATS区段解封再次回复,触发解封二次后发送*/ +#define ATS_CI_INFO_FST_SIGUNFLOCK ((UINT16)0x0311U) /*ATS->CI信号机解封一次命令,ATS触发发送*/ +#define RCI_ATS_INFO_FST_SIGUNFLOCK ((UINT16)0x0312U) /*RCI->ATS信号机解封首次回复,触发解封一次后发送*/ +#define ATS_CI_INFO_SND_SIGUNFLOCK ((UINT16)0x0313U) /*ATS->CI信号机解封二次命令,ATS触发发送*/ +#define RCI_ATS_INFO_SND_SIGUNFLOCK ((UINT16)0x0314U) /*RCI->ATS信号机解封再次回复,触发解封二次后发送*/ +#define ATS_CI_INFO_FST_ZONGRENJIE ((UINT16)0x0315U) /*ATS->CI总人解一次命令,ATS触发发送*/ +#define RCI_ATS_INFO_FST_ZONGRENJIE ((UINT16)0x0316U) /*RCI->ATS总人解首次回复,触发一次后发送*/ +#define ATS_CI_INFO_TYPE_SND_ZRJ ((UINT16)0x0317U) /*ATS->CI总人解二次命令,ATS触发发送*/ +#define RCI_ATS_INFO_SND_ZRJ ((UINT16)0x0318U) /*RCI->ATS总人解再次回复,触发二次后发送*/ +#define ATS_CI_INFO_FST_PSD_UNEXCEPT ((UINT16)0x0319U) /*ATS->CI站台门异常解除一次命令,ATS触发发送*/ +#define RCI_ATS_INFO_FST_PSD_UNEXCEPT ((UINT16)0x031AU) /*RCI->ATS站台门异常解除首次回复,触发一次后发送*/ +#define ATS_CI_INFO_SND_PSD_UNEXCEPT ((UINT16)0x031BU) /*ATS->CI站台门异常解除二次命令,ATS触发发送*/ +#define RCI_ATS_INFO_SND_PSD_UNEXCEPT ((UINT16)0x031CU) /*RCI->ATS站台门异常解除再次回复,触发二次后发送*/ + #define SHOW_2OO2_STATE_MAIN ((UINT8)0x55U) /*显示主备系状态-主系*/ #define SHOW_2OO2_STATE_BACKUP ((UINT8)0xaaU) /*显示主备系状态-备系*/ #define SHOW_2OO2_STATE_UNKNOW ((UINT8)0xFFU) /*显示主备系状态-未知*/ +#define CONFIRM_REPLY_SUCCESS ((UINT8)1u) /*确认成功*/ +#define CONFIRM_FST_UNSET ((UINT8)2u) /*首次回复未设置该状态*/ +#define CONFIRM_FST_BELONGERROR ((UINT8)3u) /*首次回复设备不属于本集中区*/ +#define CONFIRM_DEVICE_NONROUTE_SET ((UINT8)5u) /*回复非进路调车已办理*/ + +#define CONFIRM_SND_DIFFCMD ((UINT8)2u) /*再次回复操作不一致*/ +#define CONFIRM_SND_FIRST_NOTFIND ((UINT8)3u) /*再次回首次命令未执行*/ +#define CONFIRM_SND_CRCFAIL ((UINT8)4u) /*再次回复CRC校验失败*/ + +#define FOLLOWUP_CONFIRM_TIMEOUT ((UINT16)400u) /*首次消息等待二次消息超时时间*/ +#define PACK_ATS_TYPE_CENTER ((UINT8) 0xAAU)/*ATS二次信息回复组包中区分ATS与网关使用后,代表ATS*/ +#define PACK_ATS_TYPE_GATEWAY ((UINT8) 0x55U) /*ATS二次信息回复组包中区分ATS与网关使用后,代表网关*/ +#define FOLLOWUP_MSGID_MAX ((UINT16)7) /*暂定二次命令种类,遍历使用*/ + /*执行电插箱相关信息*/ typedef struct s_PlusBoxDataSendATS { @@ -143,6 +189,36 @@ extern UINT32 FirstCmdId; /* extern ReciveAtsCmdDataCycInfo szReciveAtsCmdDataCycInfo[ATS_SUM_MAX * 2U]; /*收到ATS命令数据周期号信息数组*/ extern UINT16 gReciveAtsCmdDataDeviceSum; /*收到ATS命令数据设备数目*/ +extern AtsFollowUpCmdFstStru gDansuoCancleMsgFst;/*取消单锁首次消息*/ +extern RCIFollowUpReplyStru gDansuoCancleReplyFst;/*取消单锁首次确认*/ +extern AtsFollowUpCmdSndStru gDansuoCancleMsgSnd; /*取消单锁二次消息*/ +extern RCIFollowUpReplyStru gDansuoCancleReplySnd; /*取消单锁二次确认*/ + +extern AtsFollowUpCmdFstStru gSwitchUnflockMsgFst; /*道岔解封首次消息*/ +extern RCIFollowUpReplyStru gSwitchUnflockReplyFst; /*道岔解封首次确认*/ +extern AtsFollowUpCmdSndStru gSwitchUnflockMsgSnd; /*道岔解封二次消息*/ +extern RCIFollowUpReplyStru gSwitchUnflockReplySnd; /*道岔解封二次确认*/ + +extern AtsFollowUpCmdFstStru gSecUnflockMsgFst; /*区段解封首次消息*/ +extern RCIFollowUpReplyStru gSecUnflockReplyFst; /*区段解封首次确认*/ +extern AtsFollowUpCmdSndStru gSecUnflockMsgSnd; /*区段解封二次消息*/ +extern RCIFollowUpReplyStru gSecUnflockReplySnd; /*区段解封二次确认*/ + +extern AtsFollowUpCmdFstStru gSignalUnflockMsgFst; /*信号机解封首次消息*/ +extern RCIFollowUpReplyStru gSignalUnflockReplyFst; /*信号机解封首次确认*/ +extern AtsFollowUpCmdSndStru gSignalUnflockMsgSnd; /*信号机解封二次消息*/ +extern RCIFollowUpReplyStru gSignalUnflockReplySnd; /*信号机解封二次确认*/ + +extern AtsFollowUpCmdFstStru gZRJMsgFst; /*总人解首次消息*/ +extern RCIFollowUpReplyStru gZRJReplyFst; /*总人解首次确认*/ +extern AtsFollowUpCmdSndStru gZRJMsgSnd; /*总人解二次消息*/ +extern RCIFollowUpReplyStru gZRJReplySnd; /*总人解二次确认*/ + +extern AtsFollowUpCmdFstStru gCanclPsdExceptMsgFst; /*解除站台门异常首次消息*/ +extern RCIFollowUpReplyStru gCanclPsdExceptReplyFst; /*解除站台门异常首次确认*/ +extern AtsFollowUpCmdSndStru gCanclPsdExceptMsgSnd; /*解除站台门异常二次消息*/ +extern RCIFollowUpReplyStru gCanclPsdExceptReplySnd; /*解除站台门异常二次确认*/ + /* * 功能描述: 解析操作命令数据帧 * 参数说明: const UINT8* dataBuf, 数据缓冲区 @@ -502,6 +578,30 @@ void SendAtsCommonStationStateDeal(UINT8* ciToXianDiDataBuffer, UINT16* wDataInd */ UINT8 ReciveAtsCmdDeal(const UINT8* dataBuf, UINT16* dataIndex, const UINT16 wDataLength); +/** +* @brief 收到ATS二次命令帧中一次命令解析处理 +* @param[in] const UINT8* dataBuf, 数据缓冲区 +* @param[in] UINT16 dataIndex, 数据索引 +* @param[in] const UINT16 dataLength, 数据长度 +* @param[in] const UINT16 wMsgType, 帧类型 +* @param[in]AtsFollowUpCmdFstStru* pTempTotalFstMsg, 解析中临时存储本次解析一次命令空间 +* @return CI_ERROR 失败 CI_SUCCESS 成功 +* @note by fan 20260602 +*/ +UINT8 ReciveAtsFollowUpFstCmd(const UINT8* dataBuf, UINT16 dataIndex, const UINT16 wDataLength, const UINT16 wMsgType, AtsFollowUpCmdFstStru* pTempTotalFstMsg); + +/** +* @brief 收到ATS二次命令帧中二次命令解析处理 +* @param[in] const UINT8* dataBuf, 数据缓冲区 +* @param[in] UINT16 dataIndex, 数据索引 +* @param[in] const UINT16 dataLength, 数据长度 +* @param[in] const UINT16 wMsgType, 帧类型 +* @param[in]AtsFollowUpCmdSndStru* pTempTotalSndMsg, 解析中临时存储本次解析二次命令空间 +* @return CI_ERROR 失败 CI_SUCCESS 成功 +* @note by fan 20260602 +*/ +UINT8 ReciveAtsFollowUpSndCmd(const UINT8* dataBuf, UINT16 dataIndex, const UINT16 wDataLength, const UINT16 wMsgType, AtsFollowUpCmdSndStru* pTempTotalSndMsg); + /** * @brief 更新ATS命令数据周期号信息 * @param[in] UINT8 chDeviceType 设备类型 @@ -529,6 +629,100 @@ UINT32 GetReciveCmdDataAtsCycNum(UINT8 chDeviceType, UINT8 chDeviceId); */ void PackRcOrCiDeciveCommonState(UINT8* ciToXianDiDataBuffer, UINT16* ii); +/** +* @brief 获取ATS对应的首次消息 +* @param[in] const UINT16 wMsgType, 命令类型 +* @return 获取ATS二次信息帧中的首次消息 +* @note by fan 20260602 +*/ +AtsFollowUpCmdFstStru * GetAtsFollowUpMsgFst(UINT16 chMsgType); + +/** +* @brief 获取ATS对应的二次消息 +* @param[in] const UINT16 wMsgType, 命令类型 +* @return 获取ATS二次信息帧中的再次消息 +* @note by fan 20260602 +*/ +AtsFollowUpCmdSndStru * GetAtsFollowUpMsgSnd(UINT16 chMsgType); + +/** +* @brief 获取ATS对应的首次反馈消息 +* @param[in] const UINT16 wMsgType, 命令类型 +* @return 获取ATS二次信息帧中的首次反馈 +* @note by fan 20260602 +*/ +RCIFollowUpReplyStru * GetAtsFollowUpReplyFst(UINT16 chMsgType); +/** +* @brief 获取ATS对应的再次反馈消息 +* @param[in] const UINT16 wMsgType, 命令类型 +* @return 获取ATS二次信息帧中的再次反馈 +* @note by fan 20260602 +*/ +RCIFollowUpReplyStru * GetAtsFollowUpReplySnd(UINT16 chMsgType); + +/** +* @brief 清除1次ATS命令信息 +* @param[in] const UINT16 wMsgType, 命令类型 +* @return void +* @note by fan 20260603 +*/ +void ClearAtsCmdMsgFst(UINT16 chMsgType); + +/** +* @brief 清除2次ATS命令信息 +* @param[in] const UINT16 wMsgType, 命令类型 +* @return void +* @note by fan 20260603 +*/ +void ClearAtsCmdMsgSnd(UINT16 chMsgType); + +/** +* @brief 清除再次反馈信息 +* @param[in] const UINT16 wMsgType, 命令类型 +* @return void +* @note by fan 20260603 +*/ +void ClearAtsCmdReplySnd(UINT16 chMsgType); + +/** +* @brief 清除首次反馈信息 +* @param[in] const UINT16 wMsgType, 命令类型 +* @return void +* @note by fan 20260603 +*/ +void ClearAtsCmdReplyFst(UINT16 chMsgType); + +/** +* @brief ATS/网关/现地 二次命令回复处理 +* @brief 发送ATS通用站场状态处理 +* @param[in] UINT8* ciToXianDiDataBuffer CI组包给ATS或现地的数据数组 +* @param[out] UINT16* wDataIndex CI组包给ATS或现地的数据索引 +* @param[in] const UINT8 chTargetType, 目标系统类型 +* @param[in] const UINT8 chAtsType, ats(设备0x03)类型 +* @return 无 +* @note by fan 20260602 +*/ +UINT8 PackCiToAtsFollowUpMsg(UINT8* ciToXianDiDataBuffer, UINT16* wDataIndex, UINT8 chTargetType, UINT8 chAtsType); +/** +* @brief 收到ATS/网关首次信息解析检查处理 +* @param[in] const UINT8* dataBuf, 数据缓冲区 +* @param[in] UINT16* dataIndex, 数据索引 +* @param[Out] AtsFollowUpCmdFstStru* pMsgFst 首次信息变量指针 +* @return CI_ERROR 失败 CI_SUCCESS 成功 +* @note by fan 20260602 +*/ +UINT8 ProcessCmdFirstMsgCheck(const UINT8* dataBuf, UINT16 dataIndex, AtsFollowUpCmdFstStru* pMsgFst); + +/** +* @brief 收到ATS/网关再次命令检查处理 +* @param[in] const UINT8* dataBuf, 数据缓冲区 +* @param[in] UINT16* dataIndex, 数据索引 +* @param[Out] AtsFollowUpCmdSndStru* pMsgSnd 再次信息变量指针 +* @return CI_ERROR 失败 CI_SUCCESS 成功 +* @note by fan 20260602 +*/ +UINT8 ProcessCmdSndMsgCheck(const UINT8* dataBuf, UINT16 dataIndex, AtsFollowUpCmdSndStru* pMsgSnd); + #ifdef __cplusplus } #endif diff --git a/TSCP/src/APP/ciapp/ParsePack/ParsePackCiData.c b/TSCP/src/APP/ciapp/ParsePack/ParsePackCiData.c index 0b2f1f5..4700a84 100644 --- a/TSCP/src/APP/ciapp/ParsePack/ParsePackCiData.c +++ b/TSCP/src/APP/ciapp/ParsePack/ParsePackCiData.c @@ -7902,7 +7902,8 @@ static UINT8 ParseSwitchPacket(const UINT8 *pInputData, UINT16 *pItemLen,const U SetSwitchCurPosition(switchId, SWITCH_POSITION_SIKAI); break; default: - /*不可达分支*/ + SetSingleSwitchCurPosition(switchId, SWITCH_POSITION_SIKAI); + SetSwitchCurPosition(switchId, SWITCH_POSITION_SIKAI); /*设置四开*/ break; } switch (yLockState) @@ -7914,7 +7915,7 @@ static UINT8 ParseSwitchPacket(const UINT8 *pInputData, UINT16 *pItemLen,const U SetSwitchYLockState(switchId, SWITCH_LOCK_YINZONG_YES); /*道岔引导总锁闭状态*/ break; default: - /*不可达分支*/ + SetSwitchYLockState(switchId, SWITCH_LOCK_YINZONG_NO); /*未引导锁闭*/ break; } switch (dLockState) @@ -7926,7 +7927,7 @@ static UINT8 ParseSwitchPacket(const UINT8 *pInputData, UINT16 *pItemLen,const U SetOtherCiSwitchLockStatus(switchId, SWITCH_LOCK_STATUS_DANSUO); /*道岔单锁状态*/ break; default: - /*不可达分支*/ + SetOtherCiSwitchLockStatus(switchId, SWITCH_LOCK_STATUS_NO); /*道岔未单锁状态*/ break; } switch (fLockState) @@ -7938,7 +7939,7 @@ static UINT8 ParseSwitchPacket(const UINT8 *pInputData, UINT16 *pItemLen,const U SetSwitchFLockState(switchId, SWITCH_LOCK_FENGSUO_YES); /*道岔封锁状态*/ break; default: - /*不可达分支*/ + SetSwitchFLockState(switchId, SWITCH_LOCK_FENGSUO_NO); /*道岔未封锁状态*/ break; } } @@ -8042,9 +8043,11 @@ static UINT8 PackSwitchPacket(UINT8 *pInputBuf, UINT16 *pItemLen,const UINT8 dst switch (dLockState) { case SWITCH_LOCK_STATUS_NO: + case SWITCH_LOCK_STATUS_PROTECT: *(pInputBuf + packedLen) = *(pInputBuf + packedLen) | ((UINT8)(BIT_VAL_00000001B << 4u));/*道岔未单锁状态*/ break; case SWITCH_LOCK_STATUS_DANSUO: + case SWITCH_LOCK_STATUS_DAP: *(pInputBuf + packedLen) = *(pInputBuf + packedLen) | ((UINT8)(BIT_VAL_00000010B << 4u));/*道岔单锁状态*/ break; default: @@ -8183,7 +8186,8 @@ static UINT8 ParsePhySecPacket(const UINT8 *pInputData, UINT16 *pItemLen,const U SetPhySecCurMergeState(phySectionId, SECTION_OCCUPY_NO); break; default: - /*不可达分支*/ + SetPhySecCurOccupyState(phySectionId, SECTION_OCCUPY_YES); + SetPhySecCurMergeState(phySectionId, SECTION_OCCUPY_YES); break; } @@ -8225,7 +8229,8 @@ static UINT8 ParsePhySecPacket(const UINT8 *pInputData, UINT16 *pItemLen,const U SetPhyContainAxisSecArbState(phySectionId, AXIS_SECTION_ARB_NO); break; default: - /*不可达分支*/ + SetPhySecArbState(phySectionId, AXIS_SECTION_ARB_NO); + SetPhyContainAxisSecArbState(phySectionId, AXIS_SECTION_ARB_NO); break; } @@ -8239,7 +8244,7 @@ static UINT8 ParsePhySecPacket(const UINT8 *pInputData, UINT16 *pItemLen,const U (void)SetPhySecFLockState(phySectionId, PHYSICAL_SECTION_FLOCK_NO); break; default: - /*不可达分支*/ + (void)SetPhySecFLockState(phySectionId, PHYSICAL_SECTION_FLOCK_YES); break; } @@ -8256,7 +8261,7 @@ static UINT8 ParsePhySecPacket(const UINT8 *pInputData, UINT16 *pItemLen,const U directionState = CI_SYSTEM_DIRECTION_NONE; break; default: - /*不可达分支*/ + directionState = CI_SYSTEM_DIRECTION_NONE;/*不可达分支*/ break; } @@ -8409,41 +8414,41 @@ static UINT8 PackPhySecPacket(UINT8 *pInputBuf, UINT16 *pItemLen, const UINT8 ds } /*区段锁闭状态*/ - if (PhySecLockState == PHYSICAL_SECTION_LOCK_EXCEPT) + if (PHYSICAL_SECTION_LOCK_EXCEPT == PhySecLockState) {/*物理区段故障锁闭*/ *(pInputBuf + packedLen) = *(pInputBuf + packedLen) | ((UINT8)(BIT_VAL_00000010B << 6u)); } else { *(pInputBuf + packedLen) = *(pInputBuf + packedLen) | ((UINT8)(BIT_VAL_00000001B << 6u)); /*未故障锁闭*/ - switch (PhySecLockState) - { - case PHYSICAL_SECTION_LOCK_PROTECT: /*物理区段只有保护锁闭*/ - *(pInputBuf + packedLen) = *(pInputBuf + packedLen) | ((UINT8)(BIT_VAL_00000010B << 4u)); - *(pInputBuf + packedLen) = *(pInputBuf + packedLen) | ((UINT8)(BIT_VAL_00000001B << 2u)); - break; - case PHYSICAL_SECTION_LOCK_NO: /*物理区段未锁闭*/ - *(pInputBuf + packedLen) = *(pInputBuf + packedLen) | ((UINT8)(BIT_VAL_00000001B << 4u)); - *(pInputBuf + packedLen) = *(pInputBuf + packedLen) | ((UINT8)(BIT_VAL_00000001B << 2u)); - break; - case PHYSICAL_SECTION_LOCK_NORMAL: - if (0U != GetPhySecPLockBelongRouteId(phySectionId)) - {/*物理区段同时存在进路锁闭和保护锁闭*/ - *(pInputBuf + packedLen) = *(pInputBuf + packedLen) | ((UINT8)(BIT_VAL_00000010B << 4u)); - *(pInputBuf + packedLen) = *(pInputBuf + packedLen) | ((UINT8)(BIT_VAL_00000010B << 2u)); - } - else - {/*物理区段正常锁闭*/ - *(pInputBuf + packedLen) = *(pInputBuf + packedLen) | ((UINT8)(BIT_VAL_00000001B << 4u)); - *(pInputBuf + packedLen) = *(pInputBuf + packedLen) | ((UINT8)(BIT_VAL_00000010B << 2u)); - } - break; - default: - /*不可达分支*/ - break; - } } - + switch (PhySecLockState) + { + case PHYSICAL_SECTION_LOCK_PROTECT: /*物理区段只有保护锁闭*/ + *(pInputBuf + packedLen) = *(pInputBuf + packedLen) | ((UINT8)(BIT_VAL_00000010B << 4u)); + *(pInputBuf + packedLen) = *(pInputBuf + packedLen) | ((UINT8)(BIT_VAL_00000001B << 2u)); + break; + case PHYSICAL_SECTION_LOCK_NO: /*物理区段未锁闭*/ + *(pInputBuf + packedLen) = *(pInputBuf + packedLen) | ((UINT8)(BIT_VAL_00000001B << 4u)); + *(pInputBuf + packedLen) = *(pInputBuf + packedLen) | ((UINT8)(BIT_VAL_00000001B << 2u)); + break; + case PHYSICAL_SECTION_LOCK_NORMAL: + case PHYSICAL_SECTION_LOCK_DELAY: /*延时解锁发正常锁闭*/ + if (0U != GetPhySecPLockBelongRouteId(phySectionId)) + {/*物理区段同时存在进路锁闭和保护锁闭*/ + *(pInputBuf + packedLen) = *(pInputBuf + packedLen) | ((UINT8)(BIT_VAL_00000010B << 4u)); + *(pInputBuf + packedLen) = *(pInputBuf + packedLen) | ((UINT8)(BIT_VAL_00000010B << 2u)); + } + else + {/*物理区段正常锁闭*/ + *(pInputBuf + packedLen) = *(pInputBuf + packedLen) | ((UINT8)(BIT_VAL_00000001B << 4u)); + *(pInputBuf + packedLen) = *(pInputBuf + packedLen) | ((UINT8)(BIT_VAL_00000010B << 2u)); + } + break; + default: + /*不可达分支*/ + break; + } /*区段ARB状态*/ switch (arbState) @@ -8589,7 +8594,7 @@ static UINT8 ParseLogSecPacket(const UINT8 *pInputData, UINT16 *pItemLen,const U if (localCiId != belongCiId) { - sectionOccupyState = (dataBuf1 & BIT_MASK_00000011B); /*区段占用状态*/ + sectionOccupyState = (dataBuf1 & BIT_MASK_00000011B); /*区段占用状态*/ sectionRouteLockState = ((dataBuf1 >> 2u) & BIT_MASK_00000011B); /*区段进路锁闭状态*/ protectionLockState = ((dataBuf1 >> 4u)& BIT_MASK_00000011B); /*区段保护锁闭状态*/ lockDirection = ((dataBuf1 >> 6u) & BIT_MASK_00000011B); /*区段锁闭方向*/ @@ -8612,11 +8617,12 @@ static UINT8 ParseLogSecPacket(const UINT8 *pInputData, UINT16 *pItemLen,const U SetLogSecCurOccupyState(logSecId, LOGICSECTION_OCCUPY_NO);/*空闲*/ break; default: - /*不可达分支*/ + SetLogSecPreOccupyState(logSecId, GetLogSecCurCtOrUtOccupyState(logSecId));/*保存逻辑区段之前占用状态*/ + SetLogSecCurOccupyState(logSecId, LOGICSECTION_OCCUPY_UT);/*非CBTC车占用*/ break; } - SetLogSecLinShiXianSuState(logSecId, LOGSEC_LSXS_SET_STATE_NO); + /*区段进路锁闭状态*/ switch (sectionRouteLockState) @@ -8658,6 +8664,7 @@ static UINT8 ParseLogSecPacket(const UINT8 *pInputData, UINT16 *pItemLen,const U lockDirection = CI_SYSTEM_DIRECTION_NONE; break; default: + lockDirection = CI_SYSTEM_DIRECTION_NONE;/*异常值设置为无锁闭方向*/ break; } @@ -9058,7 +9065,7 @@ static UINT8 ParseSignalPacket(const UINT8 *pInputData, UINT16 *pItemLen,const U sigExtStat = SIGNAL_LIGHT_EXTICT_STATE_YES; /*信号机亮灯*/ break; default: - /*不可达分支*/ + sigExtStat = SIGNAL_LIGHT_EXTICT_STATE_YES; /*信号机亮灯*/ break; } @@ -9120,7 +9127,7 @@ static UINT8 ParseSignalPacket(const UINT8 *pInputData, UINT16 *pItemLen,const U SetSignalFLockState(signalId, SIGNAL_FENGSUO_NO); /*信号机未封锁*/ break; default: - /*不可达分支*/ + SetSignalFLockState(signalId, SIGNAL_FENGSUO_NO); /*信号机未封锁*/ break; } @@ -9168,6 +9175,7 @@ static UINT8 ParseSignalPacket(const UINT8 *pInputData, UINT16 *pItemLen,const U SetSignalPLockCommand(signalId, SIGNAL_PLOCK_CMD_NONE); break; default: + SetSignalPLockCommand(signalId, SIGNAL_PLOCK_CMD_NONE); break; } } @@ -9220,7 +9228,9 @@ static UINT8 PackSignalPacket(UINT8 *pInputBuf, UINT16 *pItemLen, const UINT8 ds UINT16 sigOutSec = 0u;/*信号机外方物理区段*/ UINT16 sigOutSecCi = 0u;/*信号机外方物理区段所属CI*/ UINT8 sigDsBreakFlag = 0u; /*信号机断丝标志*/ - + UINT16 wSigInFirstPhySec = 0U; + UINT16 wLockBelongRoute = 0U; + UINT8 chRouteState = 0U; pTmpCiTransInfo = GetDstCiTransInfo(dstCiId); localCi = GetSystemParaLocalCiId(); /*获取本机联锁ID*/ @@ -9311,6 +9321,19 @@ static UINT8 PackSignalPacket(UINT8 *pInputBuf, UINT16 *pItemLen, const UINT8 ds default: break; } + /*信号机接近锁闭状态*/ + wSigInFirstPhySec = GetSignalInFirstLockedPhySecId(signalId); + wLockBelongRoute = GetPhySecRLockBelongRouteId(wSigInFirstPhySec); + chRouteState = GetRouteState(wLockBelongRoute);/*进路状态接近锁闭正常、接近锁闭异常、接近开放时组接近锁闭*/ + + if ((ROUTE_STATE_NEAR_LOCK == chRouteState) || (ROUTE_STATE_NEAR_LOCKERR == chRouteState) ||(ROUTE_STATE_NEAR_OPEN == chRouteState)) + { + *(pInputBuf + packedLen + 1U) = *(pInputBuf + packedLen + 1U) | ((UINT8)(BIT_VAL_00000001B << 4U)); + } + else + { + *(pInputBuf + packedLen + 1U) = *(pInputBuf + packedLen + 1U) | ((UINT8)(BIT_VAL_00000010B << 4U)); + } /*信号机保护区段锁闭命令,无效*/ *(pInputBuf + packedLen + 1) = *(pInputBuf + packedLen + 1) | ((UINT8)(BIT_VAL_00000000B << 6u)); @@ -9476,7 +9499,7 @@ static UINT8 ParsePsdPacket(const UINT8 *pInputData, UINT16 *pItemLen,const UINT (void)SetPsdState(psdId, PSD_STATE_CLOSE); break; default: - /*不可达分支*/ + (void)SetPsdState(psdId, PSD_STATE_OPEN); break; } @@ -9492,7 +9515,7 @@ static UINT8 ParsePsdPacket(const UINT8 *pInputData, UINT16 *pItemLen,const UINT (void)SetPsdMutualLockRemoveState(psdId, PSD_MUTUALLOCK_REMOVE_YES); break; default: - /*不可达分支*/ + (void)SetPsdMutualLockRemoveState(psdId, PSD_MUTUALLOCK_REMOVE_NO); break; } } @@ -9709,7 +9732,7 @@ static UINT8 ParseEmbtnPacket(const UINT8 *pInputData, UINT16 *pItemLen,const UI (void)SetEsbState(esbId, ESB_STATE_VALID_NO); break; default: - /*不可达分支*/ + (void)SetEsbState(esbId, ESB_STATE_VALID_NO); break; } } @@ -10086,6 +10109,7 @@ static UINT8 ParseFloodGatePacket(const UINT8 *pInputData, UINT16 *pItemLen, con SetFloodGateCurOpenLockState(wFloodGateId, FLOOD_GATE_NOT_OPENLOCK); /*设置关门*/ break; default: + SetFloodGateCurOpenLockState(wFloodGateId, FLOOD_GATE_NOT_OPENLOCK); /*设置关门*/ break; } @@ -10099,6 +10123,7 @@ static UINT8 ParseFloodGatePacket(const UINT8 *pInputData, UINT16 *pItemLen, con SetFloodGateCurCloseRequestSta(wFloodGateId, FLOOD_GATE_NOT_CLOSEREQ); /*设置无关门请求*/ break; default: + SetFloodGateCurCloseRequestSta(wFloodGateId, FLOOD_GATE_NOT_CLOSEREQ); /*设置无关门请求*/ break; } @@ -10112,6 +10137,7 @@ static UINT8 ParseFloodGatePacket(const UINT8 *pInputData, UINT16 *pItemLen, con SetFloodGateCurAgreeCloseSta(wFloodGateId, FLOOD_GATE_NOT_AGREE_CLOSE); /*设置不允许关门*/ break; default: + SetFloodGateCurAgreeCloseSta(wFloodGateId, FLOOD_GATE_NOT_AGREE_CLOSE); /*设置不允许关门*/ break; } } @@ -10252,23 +10278,20 @@ static UINT8 ParseStartLockPacket(const UINT8* pInputData, UINT16* pItemLen, con UINT8 retValue = CI_ERROR; UINT16 phySecId = 0u; /*物理区段ID*/ UINT16 ii = 0u; /*游标*/ - UINT16 bufIndex = 0u; /*数组下标*/ UINT8 StartLockState = 0u; /*上电锁闭状态*/ UINT8 localCiId = 0u; UINT16 wLogSecId = 0u; /*逻辑区段ID*/ UINT8 cSecBelongCiId = 0U; const CiTransmitStruct* pCiRecptStru = NULL; UINT16 parsedLen = 0u; - LogicSectionDataStruct* pstrLogSecData = NULL; - PhysicalSectionDataStruct* tmpPhysicalSectionDataStru = GetPhySecData(); localCiId = GetSystemParaLocalCiId(); pCiRecptStru = GetSrcCiTransInfo(srcCiId); - pstrLogSecData = GetLogicSecData(); + deviceSum = *(pInputData + parsedLen); parsedLen += 1u; - if ((NULL == pCiRecptStru) || (NULL == tmpPhysicalSectionDataStru) || (NULL == pstrLogSecData)) + if ((NULL == pCiRecptStru)) { *pItemLen = 0u; retValue = CI_ERROR; /*数据获取失败*/ @@ -10284,9 +10307,7 @@ static UINT8 ParseStartLockPacket(const UINT8* pInputData, UINT16* pItemLen, con cSecBelongCiId = GetPhySecBelongCiId(phySecId); if (cSecBelongCiId == srcCiId) { - bufIndex = GetPhySecConfigBufIndex(phySecId); - tmpPhysicalSectionDataStru[bufIndex].PhysicalSectionId = phySecId; - + switch (StartLockState) { case HLHT_STARTLOCK_SET_NO: @@ -10299,7 +10320,7 @@ static UINT8 ParseStartLockPacket(const UINT8* pInputData, UINT16* pItemLen, con SetPhySecPLockRouteIdHlht(phySecId, 0u); break; default: - /*不可达分支*/ + /*不可达分支-上电帧暂时不发,不处理预留*/ break; } } @@ -10315,9 +10336,6 @@ static UINT8 ParseStartLockPacket(const UINT8* pInputData, UINT16* pItemLen, con cSecBelongCiId = GetLogSecBelongCiId(wLogSecId); if (cSecBelongCiId == srcCiId) { - bufIndex = GetlogSectionBufIndex(wLogSecId); - pstrLogSecData[bufIndex].LogicSectionId = wLogSecId; - switch (StartLockState) { case HLHT_STARTLOCK_SET_NO: @@ -10429,9 +10447,9 @@ static UINT8 ParseTSRPacket(const UINT8 *pInputData, UINT16 *pItemLen,const UINT chDeviceSum = *pInputData; wParsedLen += 1U; - if (chDeviceSum == (UINT8)pCiRecptStru->logicSecNum) + if (chDeviceSum == (UINT8)pCiRecptStru->wXianSuLogSecNum) { - for (wLogSecIndex = 0U; wLogSecIndex < pCiRecptStru->logicSecNum; wLogSecIndex++) + for (wLogSecIndex = 0U; wLogSecIndex < pCiRecptStru->wXianSuLogSecNum; wLogSecIndex++) { wInxRem = wLogSecIndex % TSR_NUM_PER_BYTE; @@ -10448,7 +10466,7 @@ static UINT8 ParseTSRPacket(const UINT8 *pInputData, UINT16 *pItemLen,const UINT ; } - wLogSecId = pCiRecptStru->logicSecIdBuf[wLogSecIndex]; + wLogSecId = pCiRecptStru->wXianSuLogSecBuf[wLogSecIndex]; chLogSecBelCiId = GetLogSecBelongCiId(wLogSecId); if (chLocalCiId != chLogSecBelCiId) @@ -10469,7 +10487,7 @@ static UINT8 ParseTSRPacket(const UINT8 *pInputData, UINT16 *pItemLen,const UINT SetLogSecLinShiXianSuState(wLogSecId, LOGSEC_LSXS_SET_STATE_NO); break; default: - /*不可达分支*/ + SetLogSecLinShiXianSuState(wLogSecId, LOGSEC_LSXS_SET_STATE_INVALID);/*异常设置限速无效*/ break; } } @@ -10525,7 +10543,7 @@ static UINT8 PackTSRPacket(UINT8 *pInputBuf, UINT16 *pItemLen, const UINT8 dstCi chLocalCi = GetSystemParaLocalCiId(); wPackedLen += 1U; - for (wLogSecIndex = 0U; wLogSecIndex < pTmpCiTransInfo->logicSecNum; wLogSecIndex++) + for (wLogSecIndex = 0U; wLogSecIndex < pTmpCiTransInfo->wXianSuLogSecNum; wLogSecIndex++) { wInxRem = wLogSecIndex % TSR_NUM_PER_BYTE; @@ -10542,7 +10560,7 @@ static UINT8 PackTSRPacket(UINT8 *pInputBuf, UINT16 *pItemLen, const UINT8 dstCi ; } - wLogSecId = pTmpCiTransInfo->logicSecIdBuf[wLogSecIndex]; + wLogSecId = pTmpCiTransInfo->wXianSuLogSecBuf[wLogSecIndex]; chLogSecBelCiId = GetLogSecBelongCiId(wLogSecId); if (chLocalCi == chLogSecBelCiId) { @@ -10572,7 +10590,7 @@ static UINT8 PackTSRPacket(UINT8 *pInputBuf, UINT16 *pItemLen, const UINT8 dstCi } } - pInputBuf[0] = pTmpCiTransInfo->logicSecNum; + pInputBuf[0] = (UINT8)pTmpCiTransInfo->wXianSuLogSecNum; /*接口限制最多传递1字节数量*/ *pItemLen = wPackedLen; retValue = CI_SUCCESS; } @@ -10748,10 +10766,10 @@ static UINT8 PackCiPacketCont(UINT8 *pInputData, UINT16 *pOverallLen, const UINT } break; case START_LOCK_STATUS_PACKET: - dataIsAvail = CI_TRUE; + dataIsAvail = CI_FALSE; /*互联互通与微联接口不发送上电锁闭信息帧20260507*/ break; case LINSHI_XIANSU_STATUS_PACKET: - if (0u != pTmpCiTransInfo->logicSecNum) + if (0u != pTmpCiTransInfo->wXianSuLogSecNum) { dataIsAvail = CI_TRUE; } @@ -10818,11 +10836,11 @@ static UINT8 PackCiPacketCont(UINT8 *pInputData, UINT16 *pOverallLen, const UINT packedLen += itemLen; break; case START_LOCK_STATUS_PACKET: - retVal &= PackStartLockPacket(pInputData + packedLen, &itemLen, dstCiId); /*组上电锁闭报文内容*/ + retVal &= PackStartLockPacket(pInputData + packedLen, &itemLen, dstCiId); /*组上电锁闭报文内容*/ packedLen += itemLen; break; case LINSHI_XIANSU_STATUS_PACKET: - retVal &= PackTSRPacket(pInputData + packedLen, &itemLen, dstCiId); /*组上电锁闭报文内容*/ + retVal &= PackTSRPacket(pInputData + packedLen, &itemLen, dstCiId); /*组临时限速报文内容*/ packedLen += itemLen; break; case CITY_DEF_STATUS_PACKET: @@ -10957,7 +10975,7 @@ static UINT8 ParseCiPacketCont(const UINT8 *pInputData, const UINT16 overallLen, parsedLen += itemLen; break; case MANUFAC_DEF_STATUS_PACKET: - cRetVal &= ParseManufacDefPacket(pInputData + parsedLen, &itemLen, srcId); + cRetVal &= ParseManufacDefPacket(pInputData + parsedLen, &itemLen, srcId, packetLen); parsedLen += itemLen; break; default: @@ -11915,16 +11933,10 @@ UINT8 ParseCiToCiDataCheck(UINT8* dataBuf, UINT16 dataLength, UINT8* errNo, UINT /*入参防护*/ if ((dataBuf != NULL) && (dataLength > 0U)) { - reVal = CI_SUCCESS; - - /*版本号校验 防止接口版本不一致校验时越界*/ - if (CI_SUCCESS == reVal) + reVal = CheckCiIDAndVer(dataBuf, &ii); + if (CI_ERROR == reVal) { - reVal = CheckCiIDAndVer(dataBuf, &ii); - if (CI_ERROR == reVal) - { - *errNo = 0U; - } + *errNo = 0U; } /*分帧类型进行校验*/ @@ -16937,7 +16949,7 @@ UINT8 CiToCiEnvelopeCheck(const UINT8* dataBuf, UINT16* index) /*列车ID*/ wTrainId = ShortFromChar(&dataBuf[ii]); ii += 2u; - if ((TRAIN_ID_MIN_IVOC <= wTrainId) && (TRAIN_ID_MAX_IVOC >= wTrainId)) + if ((TRAIN_ID_MIN_IVOC < wTrainId) && (TRAIN_ID_MAX_IVOC > wTrainId)) { retVal = CI_SUCCESS; } @@ -17139,7 +17151,7 @@ UINT8 CiToCiEnvelopeCheck(const UINT8* dataBuf, UINT16* index) cActivePort = dataBuf[ii++]; /*列车激活端*/ - if ((TRAIN_SUM_MAX >= envlopetrainID) + if ((TRAIN_SUM_MAX >= envlopetrainID)&&((UINT16)0UdestCiId) { /*跨控区驱动道岔的进路,必然进路所在联锁要在数据中配置给道岔所在联锁传递进路数据*/ - pDestCiTransmitStru = GetDstCiTransInfo(pTmpCiTransmitStru->srcCiId); + pDestCiTransmitStru = GetDstCiTransInfo((UINT8)pTmpCiTransmitStru->srcCiId); if (NULL != pDestCiTransmitStru) { pDestCiTransmitStru->wNeedCheckSwitchStateRouteSum = 0U; @@ -19083,8 +19095,10 @@ UINT8 PackManufacDefPacket(UINT8* pInputBuf, UINT16* pItemLen, const UINT8 dstCi UINT16 wLockedRouteId = 0U; /*锁闭所属进路ID*/ UINT8 chExiansuState = 0U; UINT8 chLockDir = 0U; /*锁闭方向*/ + UINT8 chDataType = 0U; + UINT8 chRelayDetain = 0U; pTmpCiTransInfo = GetDstCiTransInfo(dstCiId); - + chDataType = GetLocalPublicDataType(); if ((NULL != pInputBuf) && (NULL != pItemLen) && (NULL != pTmpCiTransInfo)) { /*组厂商自定义信息版本(微联厂商默认0x01)*/ @@ -19118,71 +19132,76 @@ UINT8 PackManufacDefPacket(UINT8* pInputBuf, UINT16* pItemLen, const UINT8 dstCi } wPackedInfoNum++; /*组完一个信息,数量加1*/ } - - /*组紧急临时限速*/ - for (ii = 0U; ii < pTmpCiTransInfo->logicSecNum; ii++) + if (DATA_TYPE_23_BRANCH == chDataType) { - cTempCounter = (UINT8)(wPackedInfoNum % DEV_NUM_PER_BYTE); /*每2位存一个信息,一个字节可存4个信息*/ - cBitOffset = cTempCounter * BIT_NUM_PER_DEV; - chExiansuState = GetLogSecEmergXianSu(pTmpCiTransInfo->logicSecIdBuf[ii]); - if (LOGSEC_EMERG_XS_SET_NO == chExiansuState) + /*厦门3 厂商自定义信息不组紧急临时限速、道岔防护锁闭*/ + } + else + { + /*组紧急临时限速*/ + for (ii = 0U; ii < pTmpCiTransInfo->wXianSuLogSecNum; ii++) { - *(pInputBuf + wPackedLen) = *(pInputBuf + wPackedLen) | (BIT_VAL_00000010B << cBitOffset); /*紧急临时限速功能:未设置紧急临时限速*/ + cTempCounter = (UINT8)(wPackedInfoNum % DEV_NUM_PER_BYTE); /*每2位存一个信息,一个字节可存4个信息*/ + cBitOffset = cTempCounter * BIT_NUM_PER_DEV; + chExiansuState = GetLogSecEmergXianSu(pTmpCiTransInfo->wXianSuLogSecBuf[ii]); + if (LOGSEC_EMERG_XS_SET_NO == chExiansuState) + { + *(pInputBuf + wPackedLen) = *(pInputBuf + wPackedLen) | (BIT_VAL_00000010B << cBitOffset); /*紧急临时限速功能:未设置紧急临时限速*/ + } + else + { + *(pInputBuf + wPackedLen) = *(pInputBuf + wPackedLen) | (BIT_VAL_00000001B << cBitOffset); /*紧急临时限速功能:设置紧急临时限速*/ + } + + + if ((DEV_NUM_PER_BYTE - 1U) == cTempCounter) + { + wPackedLen++; /*存满一个字节,组包长度加1*/ + } + else + { + /*不处理*/ + } + wPackedInfoNum++; /*组完一个信息,数量加1*/ } - else + /*组道岔防护锁闭状态*/ + for (ii = 0U; ii < pTmpCiTransInfo->switchNum; ii++) { - *(pInputBuf + wPackedLen) = *(pInputBuf + wPackedLen) | (BIT_VAL_00000001B << cBitOffset); /*紧急临时限速功能:设置紧急临时限速*/ + cTempCounter = (UINT8)(wPackedInfoNum % DEV_NUM_PER_BYTE); /*每2位存一个信息,一个字节可存4个信息*/ + cBitOffset = cTempCounter * BIT_NUM_PER_DEV; + + wDeviceId = pTmpCiTransInfo->switchIdBuf[ii]; + cDeviceState = GetSwitchLockStatus(wDeviceId); /*获取道岔锁闭状态*/ + if ((SWITCH_LOCK_STATUS_PROTECT == cDeviceState) || (SWITCH_LOCK_STATUS_DAP == cDeviceState)) + { + *(pInputBuf + wPackedLen) = *(pInputBuf + wPackedLen) | (BIT_VAL_00000001B << cBitOffset); /*有防护锁闭*/ + } + else + { + *(pInputBuf + wPackedLen) = *(pInputBuf + wPackedLen) | (BIT_VAL_00000010B << cBitOffset); /*无防护锁闭*/ + } + + if ((DEV_NUM_PER_BYTE - 1U) == cTempCounter) + { + wPackedLen++; /*存满一个字节,组包长度加1*/ + } + else + { + /*不处理*/ + } + wPackedInfoNum++; /*组完一个信息,数量加1*/ } + } - - if ((DEV_NUM_PER_BYTE - 1U) == cTempCounter) - { - wPackedLen++; /*存满一个字节,组包长度加1*/ - } - else - { - /*不处理*/ - } - wPackedInfoNum++; /*组完一个信息,数量加1*/ - } - - /*组道岔防护锁闭状态*/ - for (ii = 0U; ii < pTmpCiTransInfo->switchNum; ii++) - { - cTempCounter = (UINT8)(wPackedInfoNum % DEV_NUM_PER_BYTE); /*每2位存一个信息,一个字节可存4个信息*/ - cBitOffset = cTempCounter * BIT_NUM_PER_DEV; - - wDeviceId = pTmpCiTransInfo->switchIdBuf[ii]; - cDeviceState = GetSwitchLockStatus(wDeviceId); /*获取道岔锁闭状态*/ - if ((SWITCH_LOCK_STATUS_PROTECT == cDeviceState) || (SWITCH_LOCK_STATUS_DAP == cDeviceState)) - { - *(pInputBuf + wPackedLen) = *(pInputBuf + wPackedLen) | (BIT_VAL_00000001B << cBitOffset); /*有防护锁闭*/ - } - else - { - *(pInputBuf + wPackedLen) = *(pInputBuf + wPackedLen) | (BIT_VAL_00000010B << cBitOffset); /*无防护锁闭*/ - } - - if ((DEV_NUM_PER_BYTE - 1U) == cTempCounter) - { - wPackedLen++; /*存满一个字节,组包长度加1*/ - } - else - { - /*不处理*/ - } - wPackedInfoNum++; /*组完一个信息,数量加1*/ - } - - /*组道岔区段状态*/ - for (ii = 0U; ii < pTmpCiTransInfo->switchNum; ii++) + + /*组道岔所在物理区段状态*/ + for (ii = 0U; ii < pTmpCiTransInfo->wSwitchPhySecNum; ii++) { /*组道岔区段CT占用状态*/ cTempCounter = (UINT8)(wPackedInfoNum % DEV_NUM_PER_BYTE); /*每2位存一个信息,一个字节可存4个信息*/ cBitOffset = cTempCounter * BIT_NUM_PER_DEV; - wDeviceId = pTmpCiTransInfo->switchIdBuf[ii]; - wSwitchRelPhySecId = GetSwitchPhySectionId(wDeviceId); /*获取道岔关联的物理区段ID*/ + wSwitchRelPhySecId = pTmpCiTransInfo->wSwitchPhySecBuf[ii];; /*获取道岔关联的物理区段ID*/ cDeviceState = GetPhySecPreOccState(wSwitchRelPhySecId); /*获取道岔区段CT/UT占用状态*/ if ((LOGICSECTION_OCCUPY_UT == cDeviceState) || (LOGICSECTION_OCCUPY_NO == cDeviceState)) { @@ -19397,63 +19416,70 @@ UINT8 PackManufacDefPacket(UINT8* pInputBuf, UINT16* pItemLen, const UINT8 dstCi wPackedInfoNum++; /*组完一个信息,数量加1*/ } - /*组物理区段计轴预复位状态(以物理区段为单位)*/ - for (ii = 0U; ii < pTmpCiTransInfo->phySecNum; ii++) + if (DATA_TYPE_23_BRANCH == chDataType) { - cTempCounter = (UINT8)(wPackedInfoNum % DEV_NUM_PER_BYTE); /*每2位存一个信息,一个字节可存4个信息*/ - cBitOffset = cTempCounter * BIT_NUM_PER_DEV; - - wDeviceId = pTmpCiTransInfo->phySecIdBuf[ii]; - cDeviceState = GetPhySecPreResetState(wDeviceId); /*获取物理区段计轴预复位状态*/ - - if (PHYSICAL_SECTION_PRE_RESET_YES == cDeviceState) - { - *(pInputBuf + wPackedLen) = *(pInputBuf + wPackedLen) | (BIT_VAL_00000010B << cBitOffset); /*预复位状态继电器吸起*/ - } - else - { - *(pInputBuf + wPackedLen) = *(pInputBuf + wPackedLen) | (BIT_VAL_00000001B << cBitOffset); /*预复位状态继电器落下*/ - } - - if ((DEV_NUM_PER_BYTE - 1U) == cTempCounter) - { - wPackedLen++; /*存满一个字节,组包长度加1*/ - } - else - { - /*不处理*/ - } - wPackedInfoNum++; /*组完一个信息,数量加1*/ + /*厦门3 厂商自定义信息不组计轴预复位、信号机蓝灯断丝状态*/ } - - /*组信号机蓝灯断丝状态*/ - for (ii = 0U; ii < pTmpCiTransInfo->signalNum; ii++) + else { - cTempCounter = (UINT8)(wPackedInfoNum % DEV_NUM_PER_BYTE); /*每2位存一个信息,一个字节可存4个信息*/ - cBitOffset = cTempCounter * BIT_NUM_PER_DEV; + /*组物理区段计轴预复位状态(以物理区段为单位)*/ + for (ii = 0U; ii < pTmpCiTransInfo->phySecNum; ii++) + { + cTempCounter = (UINT8)(wPackedInfoNum % DEV_NUM_PER_BYTE); /*每2位存一个信息,一个字节可存4个信息*/ + cBitOffset = cTempCounter * BIT_NUM_PER_DEV; - wDeviceId = pTmpCiTransInfo->signalIdBuf[ii]; - cDeviceState = GetSignalBlueDsBreakFlag(wDeviceId); /*获取信号机蓝灯断丝状态*/ + wDeviceId = pTmpCiTransInfo->phySecIdBuf[ii]; + cDeviceState = GetPhySecPreResetState(wDeviceId); /*获取物理区段计轴预复位状态*/ - if (SIGNAL_DS_BREAK_NO == cDeviceState) - { - *(pInputBuf + wPackedLen) = *(pInputBuf + wPackedLen) | (BIT_VAL_00000010B << cBitOffset); /*蓝灯未断丝*/ - } - else - { - *(pInputBuf + wPackedLen) = *(pInputBuf + wPackedLen) | (BIT_VAL_00000001B << cBitOffset); /*蓝灯断丝*/ - } + if (PHYSICAL_SECTION_PRE_RESET_YES == cDeviceState) + { + *(pInputBuf + wPackedLen) = *(pInputBuf + wPackedLen) | (BIT_VAL_00000010B << cBitOffset); /*预复位状态继电器吸起*/ + } + else + { + *(pInputBuf + wPackedLen) = *(pInputBuf + wPackedLen) | (BIT_VAL_00000001B << cBitOffset); /*预复位状态继电器落下*/ + } - if ((DEV_NUM_PER_BYTE - 1U) == cTempCounter) - { - wPackedLen++; /*存满一个字节,组包长度加1*/ + if ((DEV_NUM_PER_BYTE - 1U) == cTempCounter) + { + wPackedLen++; /*存满一个字节,组包长度加1*/ + } + else + { + /*不处理*/ + } + wPackedInfoNum++; /*组完一个信息,数量加1*/ } - else + /*组信号机蓝灯断丝状态*/ + for (ii = 0U; ii < pTmpCiTransInfo->signalNum; ii++) { - /*不处理*/ + cTempCounter = (UINT8)(wPackedInfoNum % DEV_NUM_PER_BYTE); /*每2位存一个信息,一个字节可存4个信息*/ + cBitOffset = cTempCounter * BIT_NUM_PER_DEV; + + wDeviceId = pTmpCiTransInfo->signalIdBuf[ii]; + cDeviceState = GetSignalBlueDsBreakFlag(wDeviceId); /*获取信号机蓝灯断丝状态*/ + + if (SIGNAL_DS_BREAK_NO == cDeviceState) + { + *(pInputBuf + wPackedLen) = *(pInputBuf + wPackedLen) | (BIT_VAL_00000010B << cBitOffset); /*蓝灯未断丝*/ + } + else + { + *(pInputBuf + wPackedLen) = *(pInputBuf + wPackedLen) | (BIT_VAL_00000001B << cBitOffset); /*蓝灯断丝*/ + } + + if ((DEV_NUM_PER_BYTE - 1U) == cTempCounter) + { + wPackedLen++; /*存满一个字节,组包长度加1*/ + } + else + { + /*不处理*/ + } + wPackedInfoNum++; /*组完一个信息,数量加1*/ } - wPackedInfoNum++; /*组完一个信息,数量加1*/ - } + } + /*组信号机扣车状态(中心扣车和车站扣车)*/ for (ii = 0U; ii < pTmpCiTransInfo->signalNum; ii++) @@ -19488,14 +19514,30 @@ UINT8 PackManufacDefPacket(UINT8* pInputBuf, UINT16* pItemLen, const UINT8 dstCi cBitOffset = cTempCounter * BIT_NUM_PER_DEV; cDeviceState = GetSignalLocalDetainFlag(wDeviceId); /*获取信号机车站扣车状态*/ - if (SIGNAL_XIANDI_DETAIN_NO == cDeviceState) + chRelayDetain = GetSignalRelayDetainFlag(wDeviceId); /*获取信号机硬线扣车状态*/ + if (DATA_TYPE_23_BRANCH == chDataType) { - *(pInputBuf + wPackedLen) = *(pInputBuf + wPackedLen) | (BIT_VAL_00000010B << cBitOffset); /*不存在扣车*/ + if (SIGNAL_RELAY_DETAIN_NO == chRelayDetain) + { + *(pInputBuf + wPackedLen) = *(pInputBuf + wPackedLen) | (BIT_VAL_00000010B << cBitOffset); /*不存在扣车*/ + } + else + { + *(pInputBuf + wPackedLen) = *(pInputBuf + wPackedLen) | (BIT_VAL_00000001B << cBitOffset); /*存在扣车*/ + } } else { - *(pInputBuf + wPackedLen) = *(pInputBuf + wPackedLen) | (BIT_VAL_00000001B << cBitOffset); /*存在扣车*/ + if (SIGNAL_XIANDI_DETAIN_NO == cDeviceState) + { + *(pInputBuf + wPackedLen) = *(pInputBuf + wPackedLen) | (BIT_VAL_00000010B << cBitOffset); /*不存在扣车*/ + } + else + { + *(pInputBuf + wPackedLen) = *(pInputBuf + wPackedLen) | (BIT_VAL_00000001B << cBitOffset); /*存在扣车*/ + } } + if ((DEV_NUM_PER_BYTE - 1U) == cTempCounter) { @@ -19533,11 +19575,12 @@ UINT8 PackManufacDefPacket(UINT8* pInputBuf, UINT16* pItemLen, const UINT8 dstCi * 参数说明:const UINT8 *pInputData 输入数据指针 * UINT16 *pItemLen 该项数据在输入数据中的长度 * const UINT8 srcCiId 源联锁ID +* const UINT16 packetLen 报文长度 * 返 回 值:CI_SUCCESS 1 解析成功 * CI_ERROR 0 解析失败 * Created By LQ 2025.05.26 */ -UINT8 ParseManufacDefPacket(const UINT8* pInputData, UINT16* pItemLen, const UINT8 srcCiId) +UINT8 ParseManufacDefPacket(const UINT8* pInputData, UINT16* pItemLen, const UINT8 srcCiId, const UINT16 packetLen) { UINT8 cRetVal = CI_ERROR; UINT8 cLocalCiId = 0U; @@ -19572,6 +19615,9 @@ UINT8 ParseManufacDefPacket(const UINT8* pInputData, UINT16* pItemLen, const UIN UINT8 cSwitchPhyUpLockDir = 0U; /*道岔区段上行锁闭方向*/ UINT8 cSwitchPhyDownLockDir = 0U; /*道岔区段下行锁闭方向*/ UINT8 cSwitchPhyLockDir = 0U; /*道岔区段锁闭方向*/ + UINT8 chDataType = 0U; + UINT8 chSwitchLockState = 0U; + cLocalCiId = GetSystemParaLocalCiId(); pCiRecptStru = GetSrcCiTransInfo(srcCiId); /*获取源联锁对应的结构数据*/ pstrAutoRouteData = GetAutoRouteDataStr(); /*获取自动进路动态数据结构体*/ @@ -19579,7 +19625,7 @@ UINT8 ParseManufacDefPacket(const UINT8* pInputData, UINT16* pItemLen, const UIN pstrSwitchData = GetSwitchData(); /*获取道岔动态数据结构体*/ pstrPhySecData = GetPhySecData(); /*获取物理区段动态数据结构体*/ pstrSignalData = GetSignalData(); /*获取信号机动态数据结构体*/ - + chDataType = GetLocalPublicDataType(); /*数据版本信息*/ if ((NULL !=pInputData) && (NULL != pItemLen) && (NULL != pCiRecptStru) && (0U != cLocalCiId) && (NULL != pstrAutoRouteData) && (NULL != pstrLogSecData) && (NULL != pstrSwitchData) && (NULL != pstrPhySecData) && (NULL != pstrSignalData)) { @@ -19616,9 +19662,8 @@ UINT8 ParseManufacDefPacket(const UINT8* pInputData, UINT16* pItemLen, const UIN } else { + SetAutoRouteSetFlag(wDevId, AUTO_ROUTE_SET_NO); /*设置自动进路未办理*/ debug_infor_printf((const)"\nHlht Ci Id[%d] Parse ManufacDef Error: AutoRoute Id[%d] State Error", srcCiId, wDevId); - cRetVal = CI_ERROR; /*信息异常,返回失败*/ - break; } } else @@ -19637,15 +19682,15 @@ UINT8 ParseManufacDefPacket(const UINT8* pInputData, UINT16* pItemLen, const UIN wParsedInfoNum++; /*解析完一个信息,数量加1*/ } - /*解析紧急临时限速信息*/ - if (CI_SUCCESS == cRetVal) + /*解析紧急临时限速信息; 注:厦门3不解析*/ + if (DATA_TYPE_23_BRANCH != chDataType) { - for (ii = 0U; ii < pCiRecptStru->logicSecNum; ii++) + for (ii = 0U; ii < pCiRecptStru->wXianSuLogSecNum; ii++) { cTempCounter = (UINT8)(wParsedInfoNum % DEV_NUM_PER_BYTE); /*每2位一个信息,一个字节有4个信息*/ cBitOffset = cTempCounter * BIT_NUM_PER_DEV; - wDevId = pCiRecptStru->logicSecIdBuf[ii]; + wDevId = pCiRecptStru->wXianSuLogSecBuf[ii]; cDevBelongCiId = GetLogSecBelongCiId(wDevId); /*获取逻辑区段所属联锁*/ if ((cLocalCiId != cDevBelongCiId) && (0U != cDevBelongCiId)) { @@ -19667,9 +19712,8 @@ UINT8 ParseManufacDefPacket(const UINT8* pInputData, UINT16* pItemLen, const UIN } else { - debug_infor_printf((const)"\nHlht Ci Id[%d] Parse ManufacDef Error: LogSec Id[%d] Urgent Tsr Error", srcCiId, wDevId); - cRetVal = CI_ERROR; /*信息异常,返回失败*/ - break; + SetLogEmergXianSuOtherCi(wDevId, LOGSEC_EMERG_XS_SET_NO); + debug_infor_printf((const)"\nHlht Ci Id[%d] Parse ManufacDef Error: LogSec Id[%d] Urgent Tsr Error", srcCiId, wDevId); } } else @@ -19690,11 +19734,11 @@ UINT8 ParseManufacDefPacket(const UINT8* pInputData, UINT16* pItemLen, const UIN } else { - cRetVal = CI_ERROR; + /*不处理*/ } - /*解析道岔防护锁闭信息*/ - if (CI_SUCCESS == cRetVal) + /*解析道岔防护锁闭信息; 注:厦门3不解析*/ + if (DATA_TYPE_23_BRANCH != chDataType) { for (ii = 0U; ii < pCiRecptStru->switchNum; ii++) { @@ -19711,19 +19755,44 @@ UINT8 ParseManufacDefPacket(const UINT8* pInputData, UINT16* pItemLen, const UIN cDevInfo = *(pInputData + wParsedLen); /*该字节存储的道岔防护锁闭信息*/ cDevState = (cDevInfo >> cBitOffset) & BIT_MASK_00000011B; + + chSwitchLockState = GetSwitchLockStatus(wDevId); if (BIT_VAL_00000001B == cDevState) - { - SetHlhtCiSwitchPlockStatus(wDevId, SWITCH_LOCK_STATUS_PROTECT); /*设置道岔有防护锁闭*/ + { + if (SWITCH_LOCK_STATUS_DANSUO == chSwitchLockState) + { + SetHlhtCiSwitchPlockStatus(wDevId, SWITCH_LOCK_STATUS_DAP); /*设置道岔单锁且防护锁闭*/ + } + else + { + SetHlhtCiSwitchPlockStatus(wDevId, SWITCH_LOCK_STATUS_PROTECT); /*设置道岔防护锁闭*/ + } + } else if (BIT_VAL_00000010B == cDevState) { - SetHlhtCiSwitchPlockStatus(wDevId, SWITCH_LOCK_STATUS_NO); /*设置道岔无防护锁闭*/ + if (SWITCH_LOCK_STATUS_DANSUO == chSwitchLockState) + { + /*不处理*/ + } + else + { + SetHlhtCiSwitchPlockStatus(wDevId, SWITCH_LOCK_STATUS_NO); /*设置道岔无防护锁闭*/ + } + } else { - debug_infor_printf((const)"\nHlht Ci Id[%d] Parse ManufacDef Error: Switch Id[%d] PLock Error", srcCiId, wDevId); - cRetVal = CI_ERROR; /*信息异常,返回失败*/ - break; + if (SWITCH_LOCK_STATUS_DANSUO == chSwitchLockState) + { + /*不处理*/ + } + else + { + SetHlhtCiSwitchPlockStatus(wDevId, SWITCH_LOCK_STATUS_NO); /*设置道岔无防护锁闭*/ + } + + debug_infor_printf((const)"\nHlht Ci Id[%d] Parse ManufacDef Error: Switch Id[%d] PLock Error", srcCiId, wDevId); } } @@ -19745,394 +19814,379 @@ UINT8 ParseManufacDefPacket(const UINT8* pInputData, UINT16* pItemLen, const UIN } else { - cRetVal = CI_ERROR; + /*不处理*/ } /*解析道岔区段状态信息*/ - if (CI_SUCCESS == cRetVal) + for (ii = 0U; ii < pCiRecptStru->wSwitchPhySecNum; ii++) { - for (ii = 0U; ii < pCiRecptStru->switchNum; ii++) + /*确定道岔区段CT占用状态*/ + cTempCounter = (UINT8)(wParsedInfoNum % DEV_NUM_PER_BYTE); /*每2位一个信息,一个字节有4个信息*/ + cBitOffset = cTempCounter * BIT_NUM_PER_DEV; + cDevInfo = *(pInputData + wParsedLen); /*该字节存储的道岔区段信息*/ + cDevState = (cDevInfo >> cBitOffset) & BIT_MASK_00000011B; + if (BIT_VAL_00000010B == cDevState) { - /*确定道岔区段CT占用状态*/ - cTempCounter = (UINT8)(wParsedInfoNum % DEV_NUM_PER_BYTE); /*每2位一个信息,一个字节有4个信息*/ - cBitOffset = cTempCounter * BIT_NUM_PER_DEV; - cDevInfo = *(pInputData + wParsedLen); /*该字节存储的道岔区段信息*/ - cDevState = (cDevInfo >> cBitOffset) & BIT_MASK_00000011B; - if (BIT_VAL_00000010B == cDevState) - { - cPhySecCtOcc = LOGICSECTION_OCCUPY_NO; /*空闲*/ - } - else if (BIT_VAL_00000001B == cDevState) - { - cPhySecCtOcc = LOGICSECTION_OCCUPY_CT; /*CT占用*/ - } - else - { - debug_infor_printf((const)"\nHlht Ci Id[%d] Parse ManufacDef Error: Switch Id[%d] CT Occ Error", srcCiId, pCiRecptStru->switchIdBuf[ii]); - cRetVal = CI_ERROR; /*信息异常,返回失败*/ - } + cPhySecCtOcc = LOGICSECTION_OCCUPY_NO; /*空闲*/ + } + else if (BIT_VAL_00000001B == cDevState) + { + cPhySecCtOcc = LOGICSECTION_OCCUPY_CT; /*CT占用*/ + } + else + { + cPhySecCtOcc = LOGICSECTION_OCCUPY_NO; /*空闲*/ + debug_infor_printf((const)"\nHlht Ci Id[%d] Parse ManufacDef Error: Switch Id[%d] CT Occ Error", srcCiId, pCiRecptStru->switchIdBuf[ii]); + } - if ((DEV_NUM_PER_BYTE - 1U) == cTempCounter) - { - wParsedLen++; /*解析完一个字节,长度加1*/ - } - else - { - /*不处理*/ - } - wParsedInfoNum++; /*解析完一个信息,数量加1*/ + if ((DEV_NUM_PER_BYTE - 1U) == cTempCounter) + { + wParsedLen++; /*解析完一个字节,长度加1*/ + } + else + { + /*不处理*/ + } + wParsedInfoNum++; /*解析完一个信息,数量加1*/ - /*确定道岔区段UT占用状态*/ - cTempCounter = (UINT8)(wParsedInfoNum % DEV_NUM_PER_BYTE); /*每2位一个信息,一个字节有4个信息*/ - cBitOffset = cTempCounter * BIT_NUM_PER_DEV; - cDevInfo = *(pInputData + wParsedLen); /*该字节存储的道岔区段信息*/ - cDevState = (cDevInfo >> cBitOffset) & BIT_MASK_00000011B; - if (BIT_VAL_00000010B == cDevState) - { - cPhySecUtOcc = LOGICSECTION_OCCUPY_NO; /*空闲*/ - } - else if (BIT_VAL_00000001B == cDevState) - { - cPhySecUtOcc = LOGICSECTION_OCCUPY_UT; /*UT占用*/ - } - else - { - debug_infor_printf((const)"\nHlht Ci Id[%d] Parse ManufacDef Error: Switch Id[%d] UT Occ Error", srcCiId, pCiRecptStru->switchIdBuf[ii]); - cRetVal = CI_ERROR; /*信息异常,返回失败*/ - } + /*确定道岔区段UT占用状态*/ + cTempCounter = (UINT8)(wParsedInfoNum % DEV_NUM_PER_BYTE); /*每2位一个信息,一个字节有4个信息*/ + cBitOffset = cTempCounter * BIT_NUM_PER_DEV; + cDevInfo = *(pInputData + wParsedLen); /*该字节存储的道岔区段信息*/ + cDevState = (cDevInfo >> cBitOffset) & BIT_MASK_00000011B; + if (BIT_VAL_00000010B == cDevState) + { + cPhySecUtOcc = LOGICSECTION_OCCUPY_NO; /*空闲*/ + } + else if (BIT_VAL_00000001B == cDevState) + { + cPhySecUtOcc = LOGICSECTION_OCCUPY_UT; /*UT占用*/ + } + else + { + cPhySecUtOcc = LOGICSECTION_OCCUPY_UT; /*UT占用*/ + debug_infor_printf((const)"\nHlht Ci Id[%d] Parse ManufacDef Error: Switch Id[%d] UT Occ Error", srcCiId, pCiRecptStru->switchIdBuf[ii]); + } - if ((DEV_NUM_PER_BYTE - 1U) == cTempCounter) - { - wParsedLen++; /*解析完一个字节,长度加1*/ - } - else - { - /*不处理*/ - } - wParsedInfoNum++; /*解析完一个信息,数量加1*/ + if ((DEV_NUM_PER_BYTE - 1U) == cTempCounter) + { + wParsedLen++; /*解析完一个字节,长度加1*/ + } + else + { + /*不处理*/ + } + wParsedInfoNum++; /*解析完一个信息,数量加1*/ - /*确定道岔区段进路锁闭状态*/ - cTempCounter = (UINT8)(wParsedInfoNum % DEV_NUM_PER_BYTE); /*每2位一个信息,一个字节有4个信息*/ - cBitOffset = cTempCounter * BIT_NUM_PER_DEV; - cDevInfo = *(pInputData + wParsedLen); /*该字节存储的道岔区段信息*/ - cDevState = (cDevInfo >> cBitOffset) & BIT_MASK_00000011B; - if (BIT_VAL_00000010B == cDevState) - { - cPhySecRouteLockState = PHYSICAL_SECTION_LOCK_NORMAL; /*进路锁闭*/ - } - else if (BIT_VAL_00000001B == cDevState) - { - cPhySecRouteLockState = PHYSICAL_SECTION_LOCK_NO; /*未进路锁闭*/ - } - else - { - debug_infor_printf((const)"\nHlht Ci Id[%d] Parse ManufacDef Error: Switch Id[%d] RouteLock Error", srcCiId, pCiRecptStru->switchIdBuf[ii]); - cRetVal = CI_ERROR; /*信息异常,返回失败*/ - } + /*确定道岔区段进路锁闭状态*/ + cTempCounter = (UINT8)(wParsedInfoNum % DEV_NUM_PER_BYTE); /*每2位一个信息,一个字节有4个信息*/ + cBitOffset = cTempCounter * BIT_NUM_PER_DEV; + cDevInfo = *(pInputData + wParsedLen); /*该字节存储的道岔区段信息*/ + cDevState = (cDevInfo >> cBitOffset) & BIT_MASK_00000011B; + if (BIT_VAL_00000010B == cDevState) + { + cPhySecRouteLockState = PHYSICAL_SECTION_LOCK_NORMAL; /*进路锁闭*/ + } + else if (BIT_VAL_00000001B == cDevState) + { + cPhySecRouteLockState = PHYSICAL_SECTION_LOCK_NO; /*未进路锁闭*/ + } + else + { + cPhySecRouteLockState = PHYSICAL_SECTION_LOCK_NO; /*未进路锁闭*/ + debug_infor_printf((const)"\nHlht Ci Id[%d] Parse ManufacDef Error: Switch Id[%d] RouteLock Error", srcCiId, pCiRecptStru->switchIdBuf[ii]); + } - if ((DEV_NUM_PER_BYTE - 1U) == cTempCounter) - { - wParsedLen++; /*解析完一个字节,长度加1*/ - } - else - { - /*不处理*/ - } - wParsedInfoNum++; /*解析完一个信息,数量加1*/ + if ((DEV_NUM_PER_BYTE - 1U) == cTempCounter) + { + wParsedLen++; /*解析完一个字节,长度加1*/ + } + else + { + /*不处理*/ + } + wParsedInfoNum++; /*解析完一个信息,数量加1*/ - /*确定道岔区段封锁状态*/ - cTempCounter = (UINT8)(wParsedInfoNum % DEV_NUM_PER_BYTE); /*每2位一个信息,一个字节有4个信息*/ - cBitOffset = cTempCounter * BIT_NUM_PER_DEV; - cDevInfo = *(pInputData + wParsedLen); /*该字节存储的道岔区段信息*/ - cDevState = (cDevInfo >> cBitOffset) & BIT_MASK_00000011B; - if (BIT_VAL_00000010B == cDevState) - { - cPhySecFLockState = PHYSICAL_SECTION_FLOCK_NO; /*未封锁*/ - } - else if (BIT_VAL_00000001B == cDevState) - { - cPhySecFLockState = PHYSICAL_SECTION_FLOCK_YES; /*封锁*/ - } - else - { - debug_infor_printf((const)"\nHlht Ci Id[%d] Parse ManufacDef Error: Switch Id[%d] Flock Error", srcCiId, pCiRecptStru->switchIdBuf[ii]); - cRetVal = CI_ERROR; /*信息异常,返回失败*/ - } + /*确定道岔区段封锁状态*/ + cTempCounter = (UINT8)(wParsedInfoNum % DEV_NUM_PER_BYTE); /*每2位一个信息,一个字节有4个信息*/ + cBitOffset = cTempCounter * BIT_NUM_PER_DEV; + cDevInfo = *(pInputData + wParsedLen); /*该字节存储的道岔区段信息*/ + cDevState = (cDevInfo >> cBitOffset) & BIT_MASK_00000011B; + if (BIT_VAL_00000010B == cDevState) + { + cPhySecFLockState = PHYSICAL_SECTION_FLOCK_NO; /*未封锁*/ + } + else if (BIT_VAL_00000001B == cDevState) + { + cPhySecFLockState = PHYSICAL_SECTION_FLOCK_YES; /*封锁*/ + } + else + { + cPhySecFLockState = PHYSICAL_SECTION_FLOCK_YES; /*封锁*/ + debug_infor_printf((const)"\nHlht Ci Id[%d] Parse ManufacDef Error: Switch Id[%d] Flock Error", srcCiId, pCiRecptStru->switchIdBuf[ii]); + } - if ((DEV_NUM_PER_BYTE - 1U) == cTempCounter) - { - wParsedLen++; /*解析完一个字节,长度加1*/ - } - else - { - /*不处理*/ - } - wParsedInfoNum++; /*解析完一个信息,数量加1*/ + if ((DEV_NUM_PER_BYTE - 1U) == cTempCounter) + { + wParsedLen++; /*解析完一个字节,长度加1*/ + } + else + { + /*不处理*/ + } + wParsedInfoNum++; /*解析完一个信息,数量加1*/ - /*确定道岔区段故障锁闭状态*/ - cTempCounter = (UINT8)(wParsedInfoNum % DEV_NUM_PER_BYTE); /*每2位一个信息,一个字节有4个信息*/ - cBitOffset = cTempCounter * BIT_NUM_PER_DEV; - cDevInfo = *(pInputData + wParsedLen); /*该字节存储的道岔区段信息*/ - cDevState = (cDevInfo >> cBitOffset) & BIT_MASK_00000011B; - if (BIT_VAL_00000010B == cDevState) - { - cPhySecExceptLockState = PHYSICAL_SECTION_LOCK_EXCEPT; /*异常锁闭*/ - } - else if (BIT_VAL_00000001B == cDevState) - { - cPhySecExceptLockState = PHYSICAL_SECTION_LOCK_NO; /*未异常锁闭*/ - } - else - { - debug_infor_printf((const)"\nHlht Ci Id[%d] Parse ManufacDef Error: Switch Id[%d] ExceptLock Error", srcCiId, pCiRecptStru->switchIdBuf[ii]); - cRetVal = CI_ERROR; /*信息异常,返回失败*/ - } + /*确定道岔区段故障锁闭状态*/ + cTempCounter = (UINT8)(wParsedInfoNum % DEV_NUM_PER_BYTE); /*每2位一个信息,一个字节有4个信息*/ + cBitOffset = cTempCounter * BIT_NUM_PER_DEV; + cDevInfo = *(pInputData + wParsedLen); /*该字节存储的道岔区段信息*/ + cDevState = (cDevInfo >> cBitOffset) & BIT_MASK_00000011B; + if (BIT_VAL_00000010B == cDevState) + { + cPhySecExceptLockState = PHYSICAL_SECTION_LOCK_EXCEPT; /*异常锁闭*/ + } + else if (BIT_VAL_00000001B == cDevState) + { + cPhySecExceptLockState = PHYSICAL_SECTION_LOCK_NO; /*未异常锁闭*/ + } + else + { + cPhySecExceptLockState = PHYSICAL_SECTION_LOCK_NO; /*未异常锁闭*/ + debug_infor_printf((const)"\nHlht Ci Id[%d] Parse ManufacDef Error: Switch Id[%d] ExceptLock Error", srcCiId, pCiRecptStru->switchIdBuf[ii]); + } - if ((DEV_NUM_PER_BYTE - 1U) == cTempCounter) - { - wParsedLen++; /*解析完一个字节,长度加1*/ - } - else - { - /*不处理*/ - } - wParsedInfoNum++; /*解析完一个信息,数量加1*/ + if ((DEV_NUM_PER_BYTE - 1U) == cTempCounter) + { + wParsedLen++; /*解析完一个字节,长度加1*/ + } + else + { + /*不处理*/ + } + wParsedInfoNum++; /*解析完一个信息,数量加1*/ - /*确定道岔区段保护区段锁闭状态*/ - cTempCounter = (UINT8)(wParsedInfoNum % DEV_NUM_PER_BYTE); /*每2位一个信息,一个字节有4个信息*/ - cBitOffset = cTempCounter * BIT_NUM_PER_DEV; - cDevInfo = *(pInputData + wParsedLen); /*该字节存储的道岔区段信息*/ - cDevState = (cDevInfo >> cBitOffset) & BIT_MASK_00000011B; - if (BIT_VAL_00000010B == cDevState) - { - cSwitchPLockState = PHYSICAL_SECTION_LOCK_PROTECT; - } - else if(BIT_VAL_00000001B == cDevState) - { - cSwitchPLockState = PHYSICAL_SECTION_LOCK_NO; - } - else - { - debug_infor_printf((const)"\nHlht Ci Id[%d] Parse ManufacDef Error: Switch Id[%d] ExceptLock Error", srcCiId, pCiRecptStru->switchIdBuf[ii]); - cRetVal = CI_ERROR; /*信息异常,返回失败*/ - } - if ((DEV_NUM_PER_BYTE - 1U) == cTempCounter) - { - wParsedLen++; /*解析完一个字节,长度加1*/ - } - else - { - /*不处理*/ - } - wParsedInfoNum++; /*解析完一个信息,数量加1*/ + /*确定道岔区段保护区段锁闭状态*/ + cTempCounter = (UINT8)(wParsedInfoNum % DEV_NUM_PER_BYTE); /*每2位一个信息,一个字节有4个信息*/ + cBitOffset = cTempCounter * BIT_NUM_PER_DEV; + cDevInfo = *(pInputData + wParsedLen); /*该字节存储的道岔区段信息*/ + cDevState = (cDevInfo >> cBitOffset) & BIT_MASK_00000011B; + if (BIT_VAL_00000010B == cDevState) + { + cSwitchPLockState = PHYSICAL_SECTION_LOCK_PROTECT; + } + else if (BIT_VAL_00000001B == cDevState) + { + cSwitchPLockState = PHYSICAL_SECTION_LOCK_NO; + } + else + { + cSwitchPLockState = PHYSICAL_SECTION_LOCK_NO; + debug_infor_printf((const)"\nHlht Ci Id[%d] Parse ManufacDef Error: Switch Id[%d] ExceptLock Error", srcCiId, pCiRecptStru->switchIdBuf[ii]); + } + if ((DEV_NUM_PER_BYTE - 1U) == cTempCounter) + { + wParsedLen++; /*解析完一个字节,长度加1*/ + } + else + { + /*不处理*/ + } + wParsedInfoNum++; /*解析完一个信息,数量加1*/ - /*确定道岔区段上行锁闭方向*/ - cTempCounter = (UINT8)(wParsedInfoNum % DEV_NUM_PER_BYTE); /*每2位一个信息,一个字节有4个信息*/ - cBitOffset = cTempCounter * BIT_NUM_PER_DEV; - cDevInfo = *(pInputData + wParsedLen); /*该字节存储的道岔区段信息*/ - cDevState = (cDevInfo >> cBitOffset) & BIT_MASK_00000011B; - if (BIT_VAL_00000010B == cDevState) - { - cSwitchPhyUpLockDir = CI_SYSTEM_DIRECTION_UP; - } - else if (BIT_VAL_00000001B == cDevState) - { - cSwitchPhyUpLockDir = CI_SYSTEM_DIRECTION_NONE; - } - else - { - debug_infor_printf((const)"\nHlht Ci Id[%d] Parse ManufacDef Error: Switch Id[%d] ExceptLock Error", srcCiId, pCiRecptStru->switchIdBuf[ii]); - cRetVal = CI_ERROR; /*信息异常,返回失败*/ - } - if ((DEV_NUM_PER_BYTE - 1U) == cTempCounter) - { - wParsedLen++; /*解析完一个字节,长度加1*/ - } - else - { - /*不处理*/ - } - wParsedInfoNum++; /*解析完一个信息,数量加1*/ + /*确定道岔区段上行锁闭方向*/ + cTempCounter = (UINT8)(wParsedInfoNum % DEV_NUM_PER_BYTE); /*每2位一个信息,一个字节有4个信息*/ + cBitOffset = cTempCounter * BIT_NUM_PER_DEV; + cDevInfo = *(pInputData + wParsedLen); /*该字节存储的道岔区段信息*/ + cDevState = (cDevInfo >> cBitOffset) & BIT_MASK_00000011B; + if (BIT_VAL_00000010B == cDevState) + { + cSwitchPhyUpLockDir = CI_SYSTEM_DIRECTION_UP; + } + else if (BIT_VAL_00000001B == cDevState) + { + cSwitchPhyUpLockDir = CI_SYSTEM_DIRECTION_NONE; + } + else + { + cSwitchPhyUpLockDir = CI_SYSTEM_DIRECTION_NONE; + debug_infor_printf((const)"\nHlht Ci Id[%d] Parse ManufacDef Error: Switch Id[%d] ExceptLock Error", srcCiId, pCiRecptStru->switchIdBuf[ii]); + } + if ((DEV_NUM_PER_BYTE - 1U) == cTempCounter) + { + wParsedLen++; /*解析完一个字节,长度加1*/ + } + else + { + /*不处理*/ + } + wParsedInfoNum++; /*解析完一个信息,数量加1*/ - /*确定道岔区段下行锁闭方向*/ - cTempCounter = (UINT8)(wParsedInfoNum % DEV_NUM_PER_BYTE); /*每2位一个信息,一个字节有4个信息*/ - cBitOffset = cTempCounter * BIT_NUM_PER_DEV; - cDevInfo = *(pInputData + wParsedLen); /*该字节存储的道岔区段信息*/ - cDevState = (cDevInfo >> cBitOffset) & BIT_MASK_00000011B; - if (BIT_VAL_00000010B == cDevState) - { - cSwitchPhyDownLockDir = CI_SYSTEM_DIRECTION_DOWN; - } - else if (BIT_VAL_00000001B == cDevState) - { - cSwitchPhyDownLockDir = CI_SYSTEM_DIRECTION_NONE; - } - else - { - debug_infor_printf((const)"\nHlht Ci Id[%d] Parse ManufacDef Error: Switch Id[%d] ExceptLock Error", srcCiId, pCiRecptStru->switchIdBuf[ii]); - cRetVal = CI_ERROR; /*信息异常,返回失败*/ - } - if ((DEV_NUM_PER_BYTE - 1U) == cTempCounter) - { - wParsedLen++; /*解析完一个字节,长度加1*/ - } - else - { - /*不处理*/ - } - wParsedInfoNum++; /*解析完一个信息,数量加1*/ + /*确定道岔区段下行锁闭方向*/ + cTempCounter = (UINT8)(wParsedInfoNum % DEV_NUM_PER_BYTE); /*每2位一个信息,一个字节有4个信息*/ + cBitOffset = cTempCounter * BIT_NUM_PER_DEV; + cDevInfo = *(pInputData + wParsedLen); /*该字节存储的道岔区段信息*/ + cDevState = (cDevInfo >> cBitOffset) & BIT_MASK_00000011B; + if (BIT_VAL_00000010B == cDevState) + { + cSwitchPhyDownLockDir = CI_SYSTEM_DIRECTION_DOWN; + } + else if (BIT_VAL_00000001B == cDevState) + { + cSwitchPhyDownLockDir = CI_SYSTEM_DIRECTION_NONE; + } + else + { + cSwitchPhyDownLockDir = CI_SYSTEM_DIRECTION_NONE; + debug_infor_printf((const)"\nHlht Ci Id[%d] Parse ManufacDef Error: Switch Id[%d] ExceptLock Error", srcCiId, pCiRecptStru->switchIdBuf[ii]); + } + if ((DEV_NUM_PER_BYTE - 1U) == cTempCounter) + { + wParsedLen++; /*解析完一个字节,长度加1*/ + } + else + { + /*不处理*/ + } + wParsedInfoNum++; /*解析完一个信息,数量加1*/ - /*确定道岔区段最终CT/UT占用状态--暂时不用在物理区段0x0202帧设置*/ - if ((LOGICSECTION_OCCUPY_NO == cPhySecCtOcc) && (LOGICSECTION_OCCUPY_NO == cPhySecUtOcc)) + /*确定道岔区段最终CT/UT占用状态--暂时不用在物理区段0x0202帧设置*/ + if ((LOGICSECTION_OCCUPY_NO == cPhySecCtOcc) && (LOGICSECTION_OCCUPY_NO == cPhySecUtOcc)) + { + cPhySecCtOrUtOcc = LOGICSECTION_OCCUPY_NO; /*CT/UT均空闲,则空闲*/ + } + else if ((LOGICSECTION_OCCUPY_CT == cPhySecCtOcc) && (LOGICSECTION_OCCUPY_NO == cPhySecUtOcc)) + { + cPhySecCtOrUtOcc = LOGICSECTION_OCCUPY_CT; /*CT占用,UT空闲,则CT占用*/ + } + else if ((LOGICSECTION_OCCUPY_NO == cPhySecCtOcc) && (LOGICSECTION_OCCUPY_UT == cPhySecUtOcc)) + { + cPhySecCtOrUtOcc = LOGICSECTION_OCCUPY_UT; /*CT空闲,UT占用,则UT占用*/ + } + else + { + debug_infor_printf((const)"\nHlht Ci Id[%d] Parse ManufacDef Error: Switch Id[%d] CT And UT Diff", srcCiId, pCiRecptStru->switchIdBuf[ii]); + } + + /*确定道岔区段最终锁闭状态--暂时不用在物理区段0x0202帧设置*/ + if ((PHYSICAL_SECTION_LOCK_NO == cPhySecRouteLockState) && (PHYSICAL_SECTION_LOCK_NO == cPhySecExceptLockState)) + { + if (PHYSICAL_SECTION_LOCK_PROTECT == cSwitchPLockState) { - cPhySecCtOrUtOcc = LOGICSECTION_OCCUPY_NO; /*CT/UT均空闲,则空闲*/ - } - else if ((LOGICSECTION_OCCUPY_CT == cPhySecCtOcc) && (LOGICSECTION_OCCUPY_NO == cPhySecUtOcc)) - { - cPhySecCtOrUtOcc = LOGICSECTION_OCCUPY_CT; /*CT占用,UT空闲,则CT占用*/ - } - else if ((LOGICSECTION_OCCUPY_NO == cPhySecCtOcc) && (LOGICSECTION_OCCUPY_UT == cPhySecUtOcc)) - { - cPhySecCtOrUtOcc = LOGICSECTION_OCCUPY_UT; /*CT空闲,UT占用,则UT占用*/ + cPhySecLockState = PHYSICAL_SECTION_LOCK_PROTECT; /*进路锁闭/故障锁闭均未锁闭,防护锁闭有效则为防护锁闭*/ } else { - debug_infor_printf((const)"\nHlht Ci Id[%d] Parse ManufacDef Error: Switch Id[%d] CT And UT Diff", srcCiId, pCiRecptStru->switchIdBuf[ii]); - cRetVal = CI_ERROR; /*信息异常,返回失败*/ - } - - /*确定道岔区段最终锁闭状态--暂时不用在物理区段0x0202帧设置*/ - if ((PHYSICAL_SECTION_LOCK_NO == cPhySecRouteLockState) && (PHYSICAL_SECTION_LOCK_NO == cPhySecExceptLockState)) - { - if (PHYSICAL_SECTION_LOCK_PROTECT == cSwitchPLockState) - { - cPhySecLockState = PHYSICAL_SECTION_LOCK_PROTECT; /*进路锁闭/故障锁闭均未锁闭,防护锁闭有效则为防护锁闭*/ - } - else - { - cPhySecLockState = PHYSICAL_SECTION_LOCK_NO; /*进路锁闭/故障锁闭/防护锁闭均未锁闭,则未锁闭*/ - } - } - else if ((PHYSICAL_SECTION_LOCK_NORMAL == cPhySecRouteLockState) && (PHYSICAL_SECTION_LOCK_NO == cPhySecExceptLockState)) - { - cPhySecLockState = PHYSICAL_SECTION_LOCK_NORMAL; /*进路锁闭为正常锁闭,故障锁闭为未锁闭,则正常锁闭*/ - } - else if ((PHYSICAL_SECTION_LOCK_NO == cPhySecRouteLockState) && (PHYSICAL_SECTION_LOCK_EXCEPT == cPhySecExceptLockState)) - { - cPhySecLockState = PHYSICAL_SECTION_LOCK_EXCEPT; /*进路锁闭为未锁闭,故障锁闭为异常锁闭,则异常锁闭*/ - } - else - { - debug_infor_printf((const)"\nHlht Ci Id[%d] Parse ManufacDef Error: Switch Id[%d] Lock Diff Error", srcCiId, pCiRecptStru->switchIdBuf[ii]); - cRetVal = CI_ERROR; /*信息异常,返回失败*/ - } - - /*确定道岔区段最终锁闭方向--暂时不用在物理区段0x0202帧设置*/ - if ((CI_SYSTEM_DIRECTION_UP == cSwitchPhyUpLockDir) && (CI_SYSTEM_DIRECTION_NONE == cSwitchPhyDownLockDir)) - { - cSwitchPhyLockDir = CI_SYSTEM_DIRECTION_UP; - } - else if ((CI_SYSTEM_DIRECTION_NONE == cSwitchPhyUpLockDir) && (CI_SYSTEM_DIRECTION_DOWN == cSwitchPhyDownLockDir)) - { - cSwitchPhyLockDir = CI_SYSTEM_DIRECTION_DOWN; - } - else - { - debug_infor_printf((const)"\nHlht Ci Id[%d] Parse ManufacDef Error: Switch Id[%d] Lock Diff Error", srcCiId, pCiRecptStru->switchIdBuf[ii]); - cRetVal = CI_ERROR; /*信息异常,返回失败*/ - } - - if (CI_SUCCESS == cRetVal) - { - wDevId = pCiRecptStru->switchIdBuf[ii]; - wPhySecId = GetSwitchPhySectionId(wDevId); - cDevBelongCiId = GetPhySecBelongCiId(wPhySecId); /*获取道岔区段所属联锁*/ - if ((cLocalCiId != cDevBelongCiId) && (0U != cDevBelongCiId)) - { - /*存储非本控区设备的状态*/ - wDevIndex = GetPhySecConfigBufIndex(wPhySecId); - pstrPhySecData[wDevIndex].PhysicalSectionId = wPhySecId; - - /*暂时预留*/ -#if 0 - SetPhySecLockStateHlht(wPhySecId, cPhySecLockState); /*设置物理区段锁闭状态*/ - SetPhySecFLockState(wPhySecId, cPhySecFLockState); /*设置物理区段封锁状态*/ - SetHlhtPhySecCtOrUtOccState(wPhySecId, cPhySecCtOrUtOcc); /*设置物理区段CT/UT占用状态*/ -#endif - } - else - { - /*不处理*/ - } - } - else - { - cRetVal = CI_ERROR; - break; + cPhySecLockState = PHYSICAL_SECTION_LOCK_NO; /*进路锁闭/故障锁闭/防护锁闭均未锁闭,则未锁闭*/ } } - } - else - { - cRetVal = CI_ERROR; - } - - /*解析物理区段停准停稳信息*/ - if (CI_SUCCESS == cRetVal) - { - for (ii = 0U; ii < pCiRecptStru->phySecNum; ii++) + else if ((PHYSICAL_SECTION_LOCK_NORMAL == cPhySecRouteLockState) && (PHYSICAL_SECTION_LOCK_NO == cPhySecExceptLockState)) { - cTempCounter = (UINT8)(wParsedInfoNum % DEV_NUM_PER_BYTE); /*每2位一个信息,一个字节有4个信息*/ - cBitOffset = cTempCounter * BIT_NUM_PER_DEV; + cPhySecLockState = PHYSICAL_SECTION_LOCK_NORMAL; /*进路锁闭为正常锁闭,故障锁闭为未锁闭,则正常锁闭*/ + } + else if ((PHYSICAL_SECTION_LOCK_NO == cPhySecRouteLockState) && (PHYSICAL_SECTION_LOCK_EXCEPT == cPhySecExceptLockState)) + { + cPhySecLockState = PHYSICAL_SECTION_LOCK_EXCEPT; /*进路锁闭为未锁闭,故障锁闭为异常锁闭,则异常锁闭*/ + } + else + { + debug_infor_printf((const)"\nHlht Ci Id[%d] Parse ManufacDef Error: Switch Id[%d] Lock Diff Error", srcCiId, pCiRecptStru->switchIdBuf[ii]); + } - wDevId = pCiRecptStru->phySecIdBuf[ii]; - cDevBelongCiId = GetPhySecBelongCiId(wDevId); /*获取物理区段所属联锁*/ + /*确定道岔区段最终锁闭方向--暂时不用在物理区段0x0202帧设置*/ + if ((CI_SYSTEM_DIRECTION_UP == cSwitchPhyUpLockDir) && (CI_SYSTEM_DIRECTION_NONE == cSwitchPhyDownLockDir)) + { + cSwitchPhyLockDir = CI_SYSTEM_DIRECTION_UP; + } + else if ((CI_SYSTEM_DIRECTION_NONE == cSwitchPhyUpLockDir) && (CI_SYSTEM_DIRECTION_DOWN == cSwitchPhyDownLockDir)) + { + cSwitchPhyLockDir = CI_SYSTEM_DIRECTION_DOWN; + } + else if ((CI_SYSTEM_DIRECTION_NONE == cSwitchPhyUpLockDir) && ((CI_SYSTEM_DIRECTION_NONE == cSwitchPhyDownLockDir))) + { + cSwitchPhyLockDir = CI_SYSTEM_DIRECTION_NONE; + } + else + { + debug_infor_printf((const)"\nHlht Ci Id[%d] Parse ManufacDef Error: Switch Id[%d] Lock Diff Error", srcCiId, pCiRecptStru->switchIdBuf[ii]); + } + + if (CI_SUCCESS == cRetVal) + { + wPhySecId = pCiRecptStru->wSwitchPhySecBuf[ii]; + cDevBelongCiId = GetPhySecBelongCiId(wPhySecId); /*获取道岔区段所属联锁*/ if ((cLocalCiId != cDevBelongCiId) && (0U != cDevBelongCiId)) { /*存储非本控区设备的状态*/ - wDevIndex = GetPhySecConfigBufIndex(wDevId); - pstrPhySecData[wDevIndex].PhysicalSectionId = wDevId; + /*wDevIndex = GetPhySecConfigBufIndex(wPhySecId);*/ + /*pstrPhySecData[wDevIndex].PhysicalSectionId = wPhySecId;*/ - cDevInfo = *(pInputData + wParsedLen); /*该字节存储的物理区段停准停稳信息*/ - cDevState = (cDevInfo >> cBitOffset) & BIT_MASK_00000011B; - if (BIT_VAL_00000010B == cDevState) - { - SetPhySecStopSteadyFlag(wDevId, PHYSICAL_SECTION_STOPSTEADY_YES); /*设置物理区段停准停稳*/ - } - else if (BIT_VAL_00000001B == cDevState) - { - SetPhySecStopSteadyFlag(wDevId, PHYSICAL_SECTION_STOPSTEADY_NO); /*设置物理区段未停准停稳*/ - } - else - { - debug_infor_printf((const)"\nHlht Ci Id[%d] Parse ManufacDef Error: PhySec Id[%d] Stop Steady Error", srcCiId, wDevId); - cRetVal = CI_ERROR; /*信息异常,返回失败*/ - break; - } + /*暂时预留*/ +#if 0 + SetPhySecLockStateHlht(wPhySecId, cPhySecLockState); /*设置物理区段锁闭状态*/ + SetPhySecFLockState(wPhySecId, cPhySecFLockState); /*设置物理区段封锁状态*/ + SetHlhtPhySecCtOrUtOccState(wPhySecId, cPhySecCtOrUtOcc); /*设置物理区段CT/UT占用状态*/ +#endif } else { /*不处理*/ } - - if ((DEV_NUM_PER_BYTE - 1U) == cTempCounter) - { - wParsedLen++; /*解析完一个字节,长度加1*/ - } - else - { - /*不处理*/ - } - wParsedInfoNum++; /*解析完一个信息,数量加1*/ + } + else + { + cRetVal = CI_ERROR; + break; } } - else + + /*解析物理区段停准停稳信息*/ + for (ii = 0U; ii < pCiRecptStru->phySecNum; ii++) { - cRetVal = CI_ERROR; + cTempCounter = (UINT8)(wParsedInfoNum % DEV_NUM_PER_BYTE); /*每2位一个信息,一个字节有4个信息*/ + cBitOffset = cTempCounter * BIT_NUM_PER_DEV; + + wDevId = pCiRecptStru->phySecIdBuf[ii]; + cDevBelongCiId = GetPhySecBelongCiId(wDevId); /*获取物理区段所属联锁*/ + if ((cLocalCiId != cDevBelongCiId) && (0U != cDevBelongCiId)) + { + /*存储非本控区设备的状态*/ + wDevIndex = GetPhySecConfigBufIndex(wDevId); + pstrPhySecData[wDevIndex].PhysicalSectionId = wDevId; + + cDevInfo = *(pInputData + wParsedLen); /*该字节存储的物理区段停准停稳信息*/ + cDevState = (cDevInfo >> cBitOffset) & BIT_MASK_00000011B; + if (BIT_VAL_00000010B == cDevState) + { + SetPhySecStopSteadyFlag(wDevId, PHYSICAL_SECTION_STOPSTEADY_YES); /*设置物理区段停准停稳*/ + } + else if (BIT_VAL_00000001B == cDevState) + { + SetPhySecStopSteadyFlag(wDevId, PHYSICAL_SECTION_STOPSTEADY_NO); /*设置物理区段未停准停稳*/ + } + else + { + SetPhySecStopSteadyFlag(wDevId, PHYSICAL_SECTION_STOPSTEADY_NO); /*设置物理区段未停准停稳*/ + debug_infor_printf((const)"\nHlht Ci Id[%d] Parse ManufacDef Error: PhySec Id[%d] Stop Steady Error", srcCiId, wDevId); + } + } + else + { + /*不处理*/ + } + + if ((DEV_NUM_PER_BYTE - 1U) == cTempCounter) + { + wParsedLen++; /*解析完一个字节,长度加1*/ + } + else + { + /*不处理*/ + } + wParsedInfoNum++; /*解析完一个信息,数量加1*/ } - /*解析物理区段计轴预复位状态信息*/ - if (CI_SUCCESS == cRetVal) + /*解析物理区段计轴预复位状态信息; 注:厦门3不解析*/ + if (DATA_TYPE_23_BRANCH != chDataType) { for (ii = 0U; ii < pCiRecptStru->phySecNum; ii++) { @@ -20159,9 +20213,8 @@ UINT8 ParseManufacDefPacket(const UINT8* pInputData, UINT16* pItemLen, const UIN } else { - debug_infor_printf((const)"\nHlht Ci Id[%d] Parse ManufacDef Error: PhySec Id[%d] PreReset Error", srcCiId, wDevId); - cRetVal = CI_ERROR; /*信息异常,返回失败*/ - break; + SetPhySecPreResetState(wDevId, PHYSICAL_SECTION_PRE_RESET_NO); /*设置物理区段计轴预复位状态无效*/ + debug_infor_printf((const)"\nHlht Ci Id[%d] Parse ManufacDef Error: PhySec Id[%d] PreReset Error", srcCiId, wDevId); } } else @@ -20182,11 +20235,11 @@ UINT8 ParseManufacDefPacket(const UINT8* pInputData, UINT16* pItemLen, const UIN } else { - cRetVal = CI_ERROR; + /*不处理*/ } - /*解析信号机蓝灯断丝信息*/ - if (CI_SUCCESS == cRetVal) + /*解析信号机蓝灯断丝信息; 注:厦门3不解析*/ + if (DATA_TYPE_23_BRANCH != chDataType) { for (ii = 0U; ii < pCiRecptStru->signalNum; ii++) { @@ -20213,9 +20266,8 @@ UINT8 ParseManufacDefPacket(const UINT8* pInputData, UINT16* pItemLen, const UIN } else { - debug_infor_printf((const)"\nHlht Ci Id[%d] Parse ManufacDef Error: Signal Id[%d] BlueDengsi Error", srcCiId, wDevId); - cRetVal = CI_ERROR; /*信息异常,返回失败*/ - break; + SetHlhtCiSignalBlueDsBreakFlag(wDevId, SIGNAL_DS_BREAK_NO); /*设置信号机未蓝灯断丝*/ + debug_infor_printf((const)"\nHlht Ci Id[%d] Parse ManufacDef Error: Signal Id[%d] BlueDengsi Error", srcCiId, wDevId); } } else @@ -20236,50 +20288,67 @@ UINT8 ParseManufacDefPacket(const UINT8* pInputData, UINT16* pItemLen, const UIN } else { - cRetVal = CI_ERROR; + /*不处理*/ } /*解析信号机扣车信息(中心扣车和车站扣车)*/ - if (CI_SUCCESS == cRetVal) + for (ii = 0U; ii < pCiRecptStru->signalNum; ii++) { - for (ii = 0U; ii < pCiRecptStru->signalNum; ii++) - { - cTempCounter = (UINT8)(wParsedInfoNum % DEV_NUM_PER_BYTE); /*每2位一个信息,一个字节有4个信息*/ - cBitOffset = cTempCounter * BIT_NUM_PER_DEV; - cDevInfo = *(pInputData + wParsedLen); /*该字节存储的信号机扣车信息*/ - cDevState = (cDevInfo >> cBitOffset) & BIT_MASK_00000011B; + cTempCounter = (UINT8)(wParsedInfoNum % DEV_NUM_PER_BYTE); /*每2位一个信息,一个字节有4个信息*/ + cBitOffset = cTempCounter * BIT_NUM_PER_DEV; + cDevInfo = *(pInputData + wParsedLen); /*该字节存储的信号机扣车信息*/ + cDevState = (cDevInfo >> cBitOffset) & BIT_MASK_00000011B; - /*确定中心扣车状态*/ + /*确定中心扣车状态*/ + if (BIT_VAL_00000010B == cDevState) + { + cSignalAtsDetainFlag = SIGNAL_DETAIN_ATS_NO; /*不存在中心扣车*/ + } + else if (BIT_VAL_00000001B == cDevState) + { + cSignalAtsDetainFlag = SIGNAL_DETAIN_ATS; /*存在中心扣车*/ + } + else + { + debug_infor_printf((const)"\nHlht Ci Id[%d] Parse ManufacDef Error: Signal Id[%d] Ats Detain Error", srcCiId, pCiRecptStru->signalIdBuf[ii]); + cSignalAtsDetainFlag = SIGNAL_DETAIN_ATS_NO; + } + + if ((DEV_NUM_PER_BYTE - 1U) == cTempCounter) + { + wParsedLen++; /*解析完一个字节,长度加1*/ + } + else + { + /*不处理*/ + } + wParsedInfoNum++; /*解析完一个信息,数量加1*/ + + cTempCounter = (UINT8)(wParsedInfoNum % DEV_NUM_PER_BYTE); /*每2位一个信息,一个字节有4个信息*/ + cBitOffset = cTempCounter * BIT_NUM_PER_DEV; + cDevInfo = *(pInputData + wParsedLen); /*该字节存储的信号机扣车信息*/ + cDevState = (cDevInfo >> cBitOffset) & BIT_MASK_00000011B; + + /*确定车站扣车状态*/ + if (DATA_TYPE_23_BRANCH == chDataType) + { + /*厦门3只有硬件扣车,没有软件扣车;收到车站扣车设置硬件扣车*/ if (BIT_VAL_00000010B == cDevState) { - cSignalAtsDetainFlag = SIGNAL_DETAIN_ATS_NO; /*不存在中心扣车*/ + cSignalXiandiDetainFlag = SIGNAL_RELAY_DETAIN_NO; /*不存在硬件扣车*/ } else if (BIT_VAL_00000001B == cDevState) { - cSignalAtsDetainFlag = SIGNAL_DETAIN_ATS; /*存在中心扣车*/ + cSignalXiandiDetainFlag = SIGNAL_RELAY_DETAIN_YES; /*存在硬件扣车*/ } else { - debug_infor_printf((const)"\nHlht Ci Id[%d] Parse ManufacDef Error: Signal Id[%d] Ats Detain Error", srcCiId, pCiRecptStru->signalIdBuf[ii]); - cRetVal = CI_ERROR; /*信息异常,返回失败*/ + debug_infor_printf((const)"\nHlht Ci Id[%d] Parse ManufacDef Error: Signal Id[%d] Xiandi Detain Error", srcCiId, pCiRecptStru->signalIdBuf[ii]); + cSignalXiandiDetainFlag = SIGNAL_RELAY_DETAIN_NO; } - - if ((DEV_NUM_PER_BYTE - 1U) == cTempCounter) - { - wParsedLen++; /*解析完一个字节,长度加1*/ - } - else - { - /*不处理*/ - } - wParsedInfoNum++; /*解析完一个信息,数量加1*/ - - cTempCounter = (UINT8)(wParsedInfoNum % DEV_NUM_PER_BYTE); /*每2位一个信息,一个字节有4个信息*/ - cBitOffset = cTempCounter * BIT_NUM_PER_DEV; - cDevInfo = *(pInputData + wParsedLen); /*该字节存储的信号机扣车信息*/ - cDevState = (cDevInfo >> cBitOffset) & BIT_MASK_00000011B; - - /*确定车站扣车状态*/ + } + else + { if (BIT_VAL_00000010B == cDevState) { cSignalXiandiDetainFlag = SIGNAL_DETAIN_XIANDI_NO; /*不存在车站扣车*/ @@ -20291,46 +20360,53 @@ UINT8 ParseManufacDefPacket(const UINT8* pInputData, UINT16* pItemLen, const UIN else { debug_infor_printf((const)"\nHlht Ci Id[%d] Parse ManufacDef Error: Signal Id[%d] Xiandi Detain Error", srcCiId, pCiRecptStru->signalIdBuf[ii]); - cRetVal = CI_ERROR; /*信息异常,返回失败*/ + cSignalXiandiDetainFlag = SIGNAL_DETAIN_XIANDI_NO; } + } + - if ((DEV_NUM_PER_BYTE - 1U) == cTempCounter) + if ((DEV_NUM_PER_BYTE - 1U) == cTempCounter) + { + wParsedLen++; /*解析完一个字节,长度加1*/ + } + else + { + /*不处理*/ + } + wParsedInfoNum++; /*解析完一个信息,数量加1*/ + + if (CI_SUCCESS == cRetVal) + { + wDevId = pCiRecptStru->signalIdBuf[ii]; + cDevBelongCiId = GetSignalBelongCiId(wDevId); /*获取信号机所属联锁*/ + if ((cLocalCiId != cDevBelongCiId) && (0U != cDevBelongCiId)) { - wParsedLen++; /*解析完一个字节,长度加1*/ + /*存储非本控区设备的状态*/ + wDevIndex = GetSignalConfigBufIndex(wDevId); + pstrSignalData[wDevIndex].SignalId = wDevId; + if (DATA_TYPE_23_BRANCH == chDataType) + { + (void)SetSignalDetainFlag(wDevId, cSignalAtsDetainFlag); /*设置信号机中心扣车*/ + (void)SetSignalDetainFlag(wDevId, SIGNAL_DETAIN_XIANDI_NO); /*设置信号机未车站扣车*/ + SetSignalRelayDetainFlag(wDevId, cSignalXiandiDetainFlag);/*设置信号机硬件扣车*/ + } + else + { + (void)SetSignalDetainFlag(wDevId, cSignalAtsDetainFlag); /*设置信号机中心扣车*/ + (void)SetSignalDetainFlag(wDevId, cSignalXiandiDetainFlag); /*设置信号机车站扣车*/ + } + } else { /*不处理*/ } - wParsedInfoNum++; /*解析完一个信息,数量加1*/ - - if (CI_SUCCESS == cRetVal) - { - wDevId = pCiRecptStru->signalIdBuf[ii]; - cDevBelongCiId = GetSignalBelongCiId(wDevId); /*获取信号机所属联锁*/ - if ((cLocalCiId != cDevBelongCiId) && (0U != cDevBelongCiId)) - { - /*存储非本控区设备的状态*/ - wDevIndex = GetSignalConfigBufIndex(wDevId); - pstrSignalData[wDevIndex].SignalId = wDevId; - SetSignalDetainFlag(wDevId, cSignalAtsDetainFlag); /*设置信号机有中心扣车*/ - SetSignalDetainFlag(wDevId, cSignalXiandiDetainFlag); /*设置信号机有中心扣车*/ - } - else - { - /*不处理*/ - } - } - else - { - cRetVal = CI_ERROR; - break; - } } - } - else - { - cRetVal = CI_ERROR; + else + { + cRetVal = CI_ERROR; + break; + } } if (CI_SUCCESS == cRetVal) @@ -20343,7 +20419,14 @@ UINT8 ParseManufacDefPacket(const UINT8* pInputData, UINT16* pItemLen, const UIN { /*不处理*/ } - + if (packetLen == (wParsedLen + 4U)) + { + cRetVal = CI_SUCCESS; + } + else + { + cRetVal = CI_ERROR; + } *pItemLen = wParsedLen; } else @@ -20804,7 +20887,7 @@ UINT8 PackRcToLocalCiDataFrame(const UINT8 cCiId) UINT16 wSignalId = 0U; /*信号机ID*/ UINT8 cLightExtinctState = 0U; /*信号机亮灭状态*/ UINT8 cSignalCrossState = 0U; /*信号机跨压状态*/ - UINT8 wCrossTacsTainId = 0U; /*跨压TACS主控列车ID*/ + UINT8 wCrossTacsTrainId = 0U; /*跨压TACS主控列车ID*/ UINT16 wAxisSecNum = 0U; /*计轴区段数量*/ UINT16 wAxisSecId = 0U; /*计轴区段ID*/ UINT8 cAxisArbState = 0U; /*计轴区段ARB状态*/ @@ -20948,8 +21031,8 @@ UINT8 PackRcToLocalCiDataFrame(const UINT8 cCiId) ii++; /*跨压TACS主控列车ID*/ - wCrossTacsTainId = GetSignalCrossTacsTrainIdCC(wSignalId); - szRcToCiDataBuf[ii] = wCrossTacsTainId; + wCrossTacsTrainId = GetSignalCrossTacsTrainIdCC(wSignalId); + szRcToCiDataBuf[ii] = wCrossTacsTrainId; ii++; wNeedPackDevNum++; @@ -22730,7 +22813,7 @@ UINT8 ParseRcToRcPbTacsDataFrame(UINT8* dataBuf, UINT16 dataLength, UINT8 source UINT8 chIndex = 0u;/*UINT8索引*/ UINT16 dwTmpIndex = 0u;/*UINT16索引*/ CfpTrainInfoStru tmpTrainInfo = { 0u }; - CfpEnvelopeStruct tmpEnvelopeInfo = { 0u }; + CfpEnvelopeStruct tmpEnvelopeInfo[CUTOFF_POINT_SUM_MAX] = { 0u }; UINT8 chEnvelopeNum = 0u; UINT8 chEnvelopeIndex = 0u; UINT8 cTempTrainNum = 0U; @@ -22959,10 +23042,10 @@ UINT8 ParseRcToRcPbTacsDataFrame(UINT8* dataBuf, UINT16 dataLength, UINT8 source /*运行等级*/ tmpTrainInfo.chTrainLevel = dataBuf[ii]; ii++; - if ((0u == tmpTrainInfo.chTrainLevel) || (TRAIN_LEVEL_BACKUP_UNKNOWN == tmpTrainInfo.chTrainLevel) || (TRAIN_LEVEL_UR == tmpTrainInfo.chTrainLevel) + if ((0u == tmpTrainInfo.chTrainLevel) || (TRAIN_LEVEL_UR == tmpTrainInfo.chTrainLevel) || (TRAIN_LEVEL_ABL == tmpTrainInfo.chTrainLevel) || (TRAIN_LEVEL_VBTC == tmpTrainInfo.chTrainLevel) || (TRAIN_LEVEL_ITC == tmpTrainInfo.chTrainLevel)) { - ;/*0:无车、UR、ABL、VBTC,ITC 0xff级别合法*/ + ;/*0:无车、UR、ABL、VBTC,ITC 级别合法*/ } else { @@ -22978,111 +23061,113 @@ UINT8 ParseRcToRcPbTacsDataFrame(UINT8* dataBuf, UINT16 dataLength, UINT8 source /* 分界点收到相邻OC发来的包络数量 */ chEnvelopeNum = dataBuf[ii++]; - if (CUTOFF_POINT_SUM_MAX >= chEnvelopeNum) + if (SECTION_REL_ENVELOPE_SUM_MAX >= chEnvelopeNum) { - SetCfpOtherOcENum(deviceId, chEnvelopeNum); + for (chEnvelopeIndex = 0u; chEnvelopeIndex < chEnvelopeNum; chEnvelopeIndex++) + { + tmpEnvelopeInfo[chEnvelopeIndex].envelopeType = dataBuf[ii++]; /* 包络类型 */ + if ((TYPE_UKT_ENVELOPE == tmpEnvelopeInfo[chEnvelopeIndex].envelopeType) + || (TYPE_UCT_ENVELOPE == tmpEnvelopeInfo[chEnvelopeIndex].envelopeType) + || (TYPE_CT_ENVELOPE == tmpEnvelopeInfo[chEnvelopeIndex].envelopeType)) + { + ;/*1:通信车 2:丢失通信车 3:隐藏车*/ + } + else + { + reVal = CI_ERROR; + } + + tmpEnvelopeInfo[chEnvelopeIndex].headTrainID = ShortFromChar(&dataBuf[ii]);/* 前车ID */ + ii += 2u; + + tmpEnvelopeInfo[chEnvelopeIndex].tailTrainID = ShortFromChar(&dataBuf[ii]);/* 后车ID */ + ii += 2u; + + tmpEnvelopeInfo[chEnvelopeIndex].startPos.Dir = dataBuf[ii++];/* 起点方向 */ + + tmpEnvelopeInfo[chEnvelopeIndex].startPos.Lnk = ShortFromChar(&dataBuf[ii]);/* 起点link */ + ii += 2u; + + tmpEnvelopeInfo[chEnvelopeIndex].startPos.Off = LongFromChar(&dataBuf[ii]);/* 起点offset */ + ii += 4u; + + tmpEnvelopeInfo[chEnvelopeIndex].endPos.Dir = dataBuf[ii++];/* 终点方向 */ + + tmpEnvelopeInfo[chEnvelopeIndex].endPos.Lnk = ShortFromChar(&dataBuf[ii]);/* 终点link */ + ii += 2u; + + tmpEnvelopeInfo[chEnvelopeIndex].endPos.Off = LongFromChar(&dataBuf[ii]);/* 终点offset */ + ii += 4u; + + belongCiId = (UINT8)GetLinkManageTiocById(tmpEnvelopeInfo[chEnvelopeIndex].startPos.Lnk); + if (belongCiId == localCiId) + { + (void)dsuCheckSameLoc(tmpEnvelopeInfo[chEnvelopeIndex].startPos.Lnk, tmpEnvelopeInfo[chEnvelopeIndex].startPos.Off, &tmpEnvelopeInfo[chEnvelopeIndex].startPos.Lnk, &tmpEnvelopeInfo[chEnvelopeIndex].startPos.Off); + } + + belongCiId = (UINT8)GetLinkManageTiocById(tmpEnvelopeInfo[chEnvelopeIndex].endPos.Lnk); + if (belongCiId == localCiId) + { + (void)dsuCheckSameLoc(tmpEnvelopeInfo[chEnvelopeIndex].endPos.Lnk, tmpEnvelopeInfo[chEnvelopeIndex].endPos.Off, &tmpEnvelopeInfo[chEnvelopeIndex].endPos.Lnk, &tmpEnvelopeInfo[chEnvelopeIndex].endPos.Off); + } + + /*截取分界点相邻OC发来的包络数据*/ + reVal = CutCfpOtherOcEData(deviceId, &tmpEnvelopeInfo[chEnvelopeIndex]); + + tmpEnvelopeInfo[chEnvelopeIndex].ACCnt = elm_PrepareACBtwPoints(tmpEnvelopeInfo[chEnvelopeIndex].startPos, tmpEnvelopeInfo[chEnvelopeIndex].endPos, tmpEnvelopeInfo[chEnvelopeIndex].ACID); + /* 内部优化 20220419 wqm elm_PrepareACBtwPoints返回0或者返回列车包络中包含的区段最大个数时,此处都应设置返回为CI_ERROR*/ + if ((SECTION_IN_ENVELOPE_SUM_MAX == tmpEnvelopeInfo[chEnvelopeIndex].ACCnt) || (0u == tmpEnvelopeInfo[chEnvelopeIndex].ACCnt)) + { + reVal = CI_ERROR; + } + else + { + for (chInfoIndex = 0u; chInfoIndex < tmpEnvelopeInfo[chEnvelopeIndex].ACCnt; chInfoIndex++) + { + belongCiId = (UINT8)GetAxisBelongTioc(tmpEnvelopeInfo[chEnvelopeIndex].ACID[chInfoIndex]); + if ((localCiId == belongCiId) || (0u == belongCiId)) + { + reVal = CI_ERROR; + break; + } + else + { + ; + } + } + } + + + tmpEnvelopeInfo[chEnvelopeIndex].trianCnt = dataBuf[ii++];/* 包含列车数量 */ + + for (chInfoIndex = 0u; chInfoIndex < tmpEnvelopeInfo[chEnvelopeIndex].trianCnt; chInfoIndex++) + { + tmpEnvelopeInfo[chEnvelopeIndex].trainID[chInfoIndex] = ShortFromChar(&dataBuf[ii]);/* 列车ID */ + ii += 2u; + + tmpEnvelopeInfo[chEnvelopeIndex].ACTPort[chInfoIndex] = dataBuf[ii++]; /* 列车激活端——UCT跨分界点RRM用 */ + } + if (CI_ERROR == reVal) + { + break; + } + + } + if (CI_SUCCESS == reVal) + { + /*全部解析通过 写入分界点接收到的包络数据 */ + SetCfpOtherOcENum(deviceId, chEnvelopeNum); + for (chEnvelopeIndex = 0u; chEnvelopeIndex < chEnvelopeNum; chEnvelopeIndex++) + { + SetCfpOtherOcEData(deviceId, chEnvelopeIndex, tmpEnvelopeInfo[chEnvelopeIndex]); + } + } } else { reVal = CI_ERROR; } - for (chEnvelopeIndex = 0u; chEnvelopeIndex < chEnvelopeNum; chEnvelopeIndex++) - { - tmpEnvelopeInfo.envelopeType = dataBuf[ii++]; /* 包络类型 */ - if ((TYPE_UKT_ENVELOPE == tmpEnvelopeInfo.envelopeType) - || (TYPE_UCT_ENVELOPE == tmpEnvelopeInfo.envelopeType) - || (TYPE_CT_ENVELOPE == tmpEnvelopeInfo.envelopeType)) - { - ;/*1:通信车 2:丢失通信车 3:隐藏车*/ - } - else - { - reVal = CI_ERROR; - } - - tmpEnvelopeInfo.headTrainID = ShortFromChar(&dataBuf[ii]);/* 前车ID */ - ii += 2u; - - tmpEnvelopeInfo.tailTrainID = ShortFromChar(&dataBuf[ii]);/* 后车ID */ - ii += 2u; - - tmpEnvelopeInfo.startPos.Dir = dataBuf[ii++];/* 起点方向 */ - - tmpEnvelopeInfo.startPos.Lnk = ShortFromChar(&dataBuf[ii]);/* 起点link */ - ii += 2u; - - tmpEnvelopeInfo.startPos.Off = LongFromChar(&dataBuf[ii]);/* 起点offset */ - ii += 4u; - - tmpEnvelopeInfo.endPos.Dir = dataBuf[ii++];/* 终点方向 */ - - tmpEnvelopeInfo.endPos.Lnk = ShortFromChar(&dataBuf[ii]);/* 终点link */ - ii += 2u; - - tmpEnvelopeInfo.endPos.Off = LongFromChar(&dataBuf[ii]);/* 终点offset */ - ii += 4u; - - belongCiId = (UINT8)GetLinkManageTiocById(tmpEnvelopeInfo.startPos.Lnk); - if (belongCiId == localCiId) - { - (void)dsuCheckSameLoc(tmpEnvelopeInfo.startPos.Lnk, tmpEnvelopeInfo.startPos.Off, &tmpEnvelopeInfo.startPos.Lnk, &tmpEnvelopeInfo.startPos.Off); - } - - belongCiId = (UINT8)GetLinkManageTiocById(tmpEnvelopeInfo.endPos.Lnk); - if (belongCiId == localCiId) - { - (void)dsuCheckSameLoc(tmpEnvelopeInfo.endPos.Lnk, tmpEnvelopeInfo.endPos.Off, &tmpEnvelopeInfo.endPos.Lnk, &tmpEnvelopeInfo.endPos.Off); - } - - /*截取分界点相邻OC发来的包络数据*/ - reVal = CutCfpOtherOcEData(deviceId, &tmpEnvelopeInfo); - - tmpEnvelopeInfo.ACCnt = elm_PrepareACBtwPoints(tmpEnvelopeInfo.startPos, tmpEnvelopeInfo.endPos, tmpEnvelopeInfo.ACID); - /* 内部优化 20220419 wqm elm_PrepareACBtwPoints返回0或者返回列车包络中包含的区段最大个数时,此处都应设置返回为CI_ERROR*/ - if ((SECTION_IN_ENVELOPE_SUM_MAX == tmpEnvelopeInfo.ACCnt) || (0u == tmpEnvelopeInfo.ACCnt)) - { - reVal = CI_ERROR; - } - else - { - for (chInfoIndex = 0u; chInfoIndex < tmpEnvelopeInfo.ACCnt; chInfoIndex++) - { - belongCiId = (UINT8)GetAxisBelongTioc(tmpEnvelopeInfo.ACID[chInfoIndex]); - if ((localCiId == belongCiId) || (0u == belongCiId)) - { - reVal = CI_ERROR; - break; - } - else - { - ; - } - } - } - - - tmpEnvelopeInfo.trianCnt = dataBuf[ii++];/* 包含列车数量 */ - - for (chInfoIndex = 0u; chInfoIndex < tmpEnvelopeInfo.trianCnt; chInfoIndex++) - { - tmpEnvelopeInfo.trainID[chInfoIndex] = ShortFromChar(&dataBuf[ii]);/* 列车ID */ - ii += 2u; - - tmpEnvelopeInfo.ACTPort[chInfoIndex] = dataBuf[ii++]; /* 列车激活端——UCT跨分界点RRM用 */ - } - - if (CI_SUCCESS == reVal) - { - /* 写入分界点接收到的包络数据 */ - SetCfpOtherOcEData(deviceId, chEnvelopeIndex, tmpEnvelopeInfo); - } - else - { - ; - } - } - chCtNum = dataBuf[ii++]; for (chInfoIndex = 0u; chInfoIndex < chCtNum; chInfoIndex++) { @@ -23099,7 +23184,7 @@ UINT8 ParseRcToRcPbTacsDataFrame(UINT8* dataBuf, UINT16 dataLength, UINT8 source SetTrainLevel(wTrainId, chLevel); /* 列车运行级别 */ dwTrainDelay = LongFromChar(&dataBuf[ii]); /* TIOC与列车通信延时 */ - ii += 4u; + ii += 4u; (void)SetTrainMsgDelayTime(wTrainId, dwTrainDelay); wSpeed = ShortFromChar(&dataBuf[ii]); diff --git a/TSCP/src/APP/ciapp/ParsePack/ParsePackCiData.h b/TSCP/src/APP/ciapp/ParsePack/ParsePackCiData.h index f9ae6ee..4f15497 100644 --- a/TSCP/src/APP/ciapp/ParsePack/ParsePackCiData.h +++ b/TSCP/src/APP/ciapp/ParsePack/ParsePackCiData.h @@ -231,6 +231,12 @@ extern "C" { UINT16 szNeedCheckProSwtStateOlpIdBuf[OVERLAP_SUM_MAX]; /*需要检查防护道岔状态的保护区段ID数组*/ UINT16 wSwitchSumOfOtherCi; /*涉及到保护区段征用的其它控区道岔数量*/ UINT16 szSwitchIdBufOfOtherCi[SWITCH_SUM_MAX]; /*涉及到保护区段征用的其它控区道岔数量*/ + + /*互联互通增加分界数据类型*/ + UINT16 wSwitchPhySecNum; /*道岔所在物理区段数量*/ + UINT16 wSwitchPhySecBuf[PHYSICAL_SECTION_SUM_MAX]; /*道岔所在物理区段数组*/ + UINT16 wXianSuLogSecNum; /*限速逻辑区段数量*/ + UINT16 wXianSuLogSecBuf[LOGIC_SECTION_SUM_MAX]; /*限速逻辑区段数组*/ } CiTransmitStruct; /* 相邻TIOC发来的通信车 */ @@ -1443,11 +1449,12 @@ UINT8 PackManufacDefPacket(UINT8* pInputBuf, UINT16* pItemLen, const UINT8 dstCi * 参数说明:const UINT8 *pInputData 输入数据指针 * UINT16 *pItemLen 该项数据在输入数据中的长度 * const UINT8 srcCiId 源联锁ID +* const UINT16 packetLen 报文长度 * 返 回 值:CI_SUCCESS 1 解析成功 * CI_ERROR 0 解析失败 * Created By LQ 2025.05.26 */ -UINT8 ParseManufacDefPacket(const UINT8* pInputData, UINT16* pItemLen, const UINT8 srcCiId); +UINT8 ParseManufacDefPacket(const UINT8* pInputData, UINT16* pItemLen, const UINT8 srcCiId, const UINT16 packetLen); /* * 功能描述:组CI到本控区RC单帧数据 diff --git a/TSCP/src/APP/ciapp/ParsePack/ParsePackCommon.c b/TSCP/src/APP/ciapp/ParsePack/ParsePackCommon.c index c303709..8879c5f 100644 --- a/TSCP/src/APP/ciapp/ParsePack/ParsePackCommon.c +++ b/TSCP/src/APP/ciapp/ParsePack/ParsePackCommon.c @@ -26,7 +26,7 @@ #include "../DataManage/PlatDataManage.h" #include "dquCIInterFace.h" #include "NonAutoReturnDataManage.h" - +#include "ReverseCutDataManage.h" #include "2oo2InterfaceDataManage.h" PlatHeartDataStruct RecvHeartDataStru = { 0U }; /*平台心跳帧数据结构*/ @@ -524,6 +524,11 @@ UINT8 SwitchMaskManage(UINT8 MaskType, UINT16 DeviceId, UINT16 MaskId, UINT8* da UINT16 indexFind = 0U; UINT8 devBelongThisLine = 0U; UINT8 switchBoardNum = 0U; + UINT8 chLocalCiOCSswitch = 0U; + UINT8 chMainCotrolOCId = 0U; + + chLocalCiOCSswitch = GetLocalCiOCSswitch(); + switchLockStatus = GetSwitchLockStatus(DeviceId); @@ -698,13 +703,17 @@ UINT8 SwitchMaskManage(UINT8 MaskType, UINT16 DeviceId, UINT16 MaskId, UINT8* da } break; case MASK_TYPE_SWITCH_OPEN_CAP: + chMainCotrolOCId = GetSwitchMainCotrolOCId(DeviceId);/*获取主控OC*/ for (i = 0u; i < m_SwitchNum; i++) { if (m_Switches[i].DeviceId == DeviceId) { - flagFind = 1u; - indexFind = i; - break; + if ((chMainCotrolOCId == m_Switches[i].OcId) || (OC_S_OFF == chLocalCiOCSswitch)) + {/*当前有主控OC或OC-S功能关闭*/ + flagFind = 1u; + indexFind = i; + break; + } } } if (1u == flagFind) @@ -1632,6 +1641,10 @@ UINT8 OverlapMaskManage(UINT8 MaskType, UINT16 DeviceId, UINT16 MaskId, UINT8* d UINT8 RouteMaskManage(UINT8 MaskType, UINT16 DeviceId, UINT16 MaskId, UINT8* dataBuf) { UINT8 returnValue = CI_SUCCESS; /*返回值默认成功*/ + UINT8 chVirCiId = 0u; + UINT8 chVirCiType = 0u; + UINT8 ciTrainTestState = 0u; /*试车线联锁状态*/ + UINT32 xuanpaiStartCycNum = 0u;/*进路选排开始周期数*/ UINT8 routeState = GetRouteState(DeviceId); /*获取进路状态*/ UINT8 routeLevel = GetRouteLevel(DeviceId); UINT16 lastPhyLockId = GetRouteLastPhySectionId(DeviceId); /*获取指定ID进路最后一个物理区段ID*/ @@ -1640,12 +1653,11 @@ UINT8 RouteMaskManage(UINT8 MaskType, UINT16 DeviceId, UINT16 MaskId, UINT8* dat UINT8 dcQState = GetRouteDCQState(DeviceId);/*进路调车请求状态*/ UINT8 dcTState = GetRouteDCTYState(DeviceId);/*进路调车同意状态*/ UINT8 chDCAgreeBtnErrState = GetRouteDcAgreeButtonErrState(DeviceId);/*进路调车同意按钮故障状态*/ - UINT8 ciTrainTestState = 0u; /*试车线联锁状态*/ + UINT8 routeAutoTriggerFlag = GetRouteAutoTriggerFlag(DeviceId); /*获取进路自动触发标志*/ - UINT8 chVirCiId = 0u; - UINT8 chVirCiType = 0u; + xuanpaiStartCycNum = GetRouteXuanPaiStartCycNum(DeviceId);/*进路选排开始周期数*/ switch (MaskType) { case MASK_TYPE_ROUTE_IDLE:/*进路空闲码位*/ @@ -1659,7 +1671,8 @@ UINT8 RouteMaskManage(UINT8 MaskType, UINT16 DeviceId, UINT16 MaskId, UINT8* dat } break; case MASK_TYPE_ROUTE_XUANPAI:/*进路选排码位*/ - if (ROUTE_STATE_XUANPAI == routeState) + /* 处于选排周期号有效即可发送码位*/ + if (xuanpaiStartCycNum > 0u) { SetMaskValue(MaskId, dataBuf); } @@ -4325,6 +4338,8 @@ void PackCiToCimDeviceData(void) UINT32 switchCollTolerateCycNum = 0U; UINT8 chSwitchBDState = SEND_CIM_COLLTOLERATE_NO; UINT8 chSignalDsState = 0xFFU; + UINT8 chReverseState = 0xFFU; + const ReverseSwitchCfgDataStru* pReverseCfg = NULL; /*发送道岔数据*/ pSwitchData = GetSwitchData(); @@ -4644,9 +4659,35 @@ void PackCiToCimDeviceData(void) ciToCimDataBuffer[ii++] = pFloodGateDataCC[deviceId].FloodGateCloseApplyIvocSum; /*防淹门关门申请列车数量*/ ciToCimDataBuffer[ii++] = pFloodGateDataCC[deviceId].FloodGateCloseAnsIvocSum; /*防淹门关门允许,列车回复数量*/ ciToCimDataBuffer[ii++] = pFloodGateDataCC[deviceId].FloodGateAccessUTFlag; /*防淹门接近区段是否有非通信车标志*/ - - } + + /*打印倒切柜数据*/ + pReverseCfg = GetReverseCfgData(); + if (NULL != pReverseCfg) + { + if (0U == pReverseCfg->wId) + { + ciToCimDataBuffer[ii++] = 0U;/*倒切开关数量发0*/ + } + else + { + ciToCimDataBuffer[ii++] = 1U;/*倒切开关数量发1*/ + ShortToChar(pReverseCfg->wId, &ciToCimDataBuffer[ii]);/*倒切开关ID (初始化字段)*/ + ii += 2u; + chReverseState = GetReverseSwitchState(); + ciToCimDataBuffer[ii++] = chReverseState;/*倒切开关状态*/ + ShortToChar(pReverseCfg->wRelateBoardNum, &ciToCimDataBuffer[ii]);/*倒切板卡数量*/ + ii += 2u; + for (jj = 0u; jj wRelateBoardNum; jj++) + { + ShortToChar(pReverseCfg->strRelateBoardBuf[jj].wReversBoardId, &ciToCimDataBuffer[ii]);/*倒切板卡ID*/ + ii += 2u; + chReverseState = GetReverseBoardState(pReverseCfg->strRelateBoardBuf[jj].wReversBoardId); + ciToCimDataBuffer[ii++] = chReverseState;/*倒切板卡状态*/ + } + } + } + /*发送CIM*/ debug_infor_printf((const)"\nCIM_SEND_DEVSTATE:%d", ii); debug_out_array(0xAA, ciToCimDataBuffer, ii); @@ -5536,4 +5577,131 @@ void PackCiToCimCollDiffData(void) /*发送维护机*/ (void)DarkInfoPack(CIM_INFO_IO_COLL_DIFF_ALARM, ciToCimDataBuffer, ii); +} + +/* +* 功能描述: 组包发送CIM双系IO采集不一致信息 +* 参数说明: void +* 返回值 : 无 +*/ +void PackCiToCimSwitchRedunAlarmData(void) +{ + UINT16 wSwitchCurSum = 0u; + UINT32 dwRedunHunXianAlarmCfg = 0u; + UINT16 i = 0u; + UINT16 wSwitchId = 0u; + UINT8 cRedunCollCfg = 0u; + UINT16 cAlarmCount = 0u; + UINT32 dwHunXianStCyc = 0u; + UINT8 cRedunHunXianStt = 0u; + UINT32 dwFaultStCyc = 0u; + UINT8 j = 0u; + UINT32 dwSwitchDrvStCyc = 0u; + UINT8 cTimeOut = 0u; + UINT16 wRelayId = 0u; + UINT16 wBelongOcId = 0u; + UINT16 wIndex = 1u; /*组包下标,跳过1字节道岔总数*/ + UINT8 ciToCimDataBuffer[CI_TO_CIM_DATA_LEN_MAX] = { 0U }; /*数组长度5000字节,大于500个道岔*2个OC*4字节报警,暂无需越界防护*/ + + wSwitchCurSum = GetSwitchCurSum(); + dwRedunHunXianAlarmCfg = GetSwitchRedunCollHunXianCycCfg(); + for (i = 0u; i < wSwitchCurSum; i++) + { + wSwitchId = GetSwitchId(i); + cRedunCollCfg = GetSwitchRedunCollCfg(wSwitchId); + if (REDUN_COLL_YES == cRedunCollCfg) + { + for (j = 0u; j < SWITCH_REDUN_COLL_MAX; j++) + { + /*混线报警*/ + cRedunHunXianStt = GetSwitchRedunHunXianRecovStt(wSwitchId, j); + if (REDUN_HX_RECOV_ALL != cRedunHunXianStt) + { + /*判断混线有效,如果道岔驱动中,容忍报警时间再报警,否则直接报警*/ + dwHunXianStCyc = GetSwitchRedunJudgHunXianStCyc(wSwitchId, j); + dwSwitchDrvStCyc = GetSwitchDriveStartCycNum(wSwitchId); + cTimeOut = SystemOverTimeCheck(dwHunXianStCyc, dwRedunHunXianAlarmCfg); + if ((0u == dwSwitchDrvStCyc) || (CI_TIME_OUT == cTimeOut)) + { + /*报警*/ + cAlarmCount += 1u; + /*道岔ID*/ + ShortToChar(wSwitchId, &ciToCimDataBuffer[wIndex]); + wIndex += 2u; + /*所属OC ID,任选一个冗余采集继电器查询*/ + wRelayId = GetSwitchRedunDBJ1RelayId(wSwitchId, j); + wBelongOcId = GetRelayBelongOCId(wRelayId); + ciToCimDataBuffer[wIndex] = (UINT8)wBelongOcId; + wIndex += 1u; + /*混线报警*/ + ciToCimDataBuffer[wIndex] = REDUN_ALARM_HUNXIAN; + wIndex += 1u; + /*报混线则不报采集故障*/ + continue; + } + else + { + /*不报警*/ + } + } + else + { + /*未混线,不报警*/ + } + + /*采集故障报警*/ + dwFaultStCyc = GetSwitchRedunFaultStCyc(wSwitchId, j); + if (0u < dwFaultStCyc) + { + /*采集故障有效,如果道岔驱动中,容忍报警时间再报警,否则直接报警*/ + dwSwitchDrvStCyc = GetSwitchDriveStartCycNum(wSwitchId); + cTimeOut = SystemOverTimeCheck(dwFaultStCyc, dwRedunHunXianAlarmCfg); + if ((0u == dwSwitchDrvStCyc) || (CI_TIME_OUT == cTimeOut)) + { + /*报警*/ + cAlarmCount += 1u; + /*道岔ID*/ + ShortToChar(wSwitchId, &ciToCimDataBuffer[wIndex]); + wIndex += 2u; + /*所属OC ID,任选一个冗余采集继电器查询*/ + wRelayId = GetSwitchRedunDBJ1RelayId(wSwitchId, j); + wBelongOcId = GetRelayBelongOCId(wRelayId); + ciToCimDataBuffer[wIndex] = (UINT8)wBelongOcId; + wIndex += 1u; + /*采集故障报警*/ + ciToCimDataBuffer[wIndex] = REDUN_ALARM_FAULT; + wIndex += 1u; + } + else + { + /*不报警*/ + } + } + else + { + /*未故障,不报警*/ + } + } + } + else + { + /*道岔不具备冗余采集,不报警*/ + } + } + + if ((UINT16)UINT8_MAX < cAlarmCount) + { + /*报警数量非法,导向报警数量为0*/ + ciToCimDataBuffer[0] = 0u; + (void)debug_infor_printf((const)"SwtRedunCollAlarm Err = %d\n", cAlarmCount); + (void)DarkInfoPack(CIM_INFO_SWT_REDUN_COLL_ALARM, ciToCimDataBuffer, 1u); + } + else + { + /*输出报警*/ + ciToCimDataBuffer[0] = (UINT8)cAlarmCount; + (void)debug_infor_printf((const)"SwtRedunCollAlarm = %d:", cAlarmCount); + (void)debug_out_array(0xAA, ciToCimDataBuffer, wIndex); + (void)DarkInfoPack(CIM_INFO_SWT_REDUN_COLL_ALARM, ciToCimDataBuffer, wIndex); + } } \ No newline at end of file diff --git a/TSCP/src/APP/ciapp/ParsePack/ParsePackCommon.h b/TSCP/src/APP/ciapp/ParsePack/ParsePackCommon.h index 9adef2f..dad98d2 100644 --- a/TSCP/src/APP/ciapp/ParsePack/ParsePackCommon.h +++ b/TSCP/src/APP/ciapp/ParsePack/ParsePackCommon.h @@ -388,6 +388,13 @@ void PackCiToCimFlyProtectData(void); */ void PackCiToCimCollDiffData(void); +/* +* 功能描述: 组包发送CIM双系IO采集不一致信息 +* 参数说明: void +* 返回值 : 无 +*/ +void PackCiToCimSwitchRedunAlarmData(void); + #ifdef __cplusplus } #endif diff --git a/TSCP/src/APP/ciapp/ParsePack/ParsePackDefine.h b/TSCP/src/APP/ciapp/ParsePack/ParsePackDefine.h index efae5c4..384a4cc 100644 --- a/TSCP/src/APP/ciapp/ParsePack/ParsePackDefine.h +++ b/TSCP/src/APP/ciapp/ParsePack/ParsePackDefine.h @@ -87,23 +87,24 @@ #define CI_TO_AXIS_DATA_LEN_MAX ((UINT16)3000) /*联锁到AXIS组包数据最大值*/ /*CI 和 CIM*/ -#define CI_TO_CIM_DATA_LEN_MAX ((UINT16)5000) /*CI到CIM数据最大值*/ -#define CI_TO_AIM_DATA_LEN_MAX ((UINT16)5000) /*CI到AIM数据最大值*/ -#define CIM_INFO_RCI_TO_ATS_DATA ((UINT16)0x2001) /*发送CIM ATS状态信息*/ -#define CIM_INFO_ATS_TO_RCI_DATA ((UINT16)0x2002) /*发送CIM ATS状态信息*/ -#define CIM_INFO_VER_INFO ((UINT16)0x2003) /*发送CIM版本号信息*/ -#define CIM_INFO_COMM_STATE ((UINT16)0x2004) /*发送CIM设备通信状态信息*/ -#define CIM_INFO_SIGNAL_DS_STATE ((UINT16)0x2005) /*发送CIM信号机断丝状态信息*/ -#define CIM_INFO_RELAY_DRVANDCOLLDEF ((UINT16)0x2006) /*发送CIM继电器驱动回采不一致报警*/ -#define CIM_INFO_PSD_ALARM ((UINT16)0x2007) /*发送CIM屏蔽门报警帧类型*/ -#define CIM_INFO_DEVICE_STATE ((UINT16)0x2008) /*发送CIM设备状态信息*/ -#define CIM_INFO_MAINTENANCE ((UINT16)0x2009) /*发送CIM维护信息*/ -#define CIM_INFO_LEU_STATE ((UINT16)0x200A) /*发送CIMLEU状态*/ -#define CIM_INFOR_RELAY_HUNXIAN_STATE ((UINT16)0x200F) /*发送CIM继电器混线状态信息*/ -#define CIM_INFO_SIGNAL_DRIVOUT ((UINT16)0x2010) /*发送CIM信号机驱动超时信息*/ -#define CIM_INFO_UNIT_ALARM ((UINT16)0x2011) /*发送CIM执行单元报警*/ -#define CIM_INFO_FLYPROTECT_ALARM ((UINT16)0x2012) /*发送CIM飞车宕机报警*/ -#define CIM_INFO_IO_COLL_DIFF_ALARM ((UINT16)0x2013) /*发送CIM IO双系采集不一致报警*/ +#define CI_TO_CIM_DATA_LEN_MAX ((UINT16)5000) /*CI到CIM数据最大值*/ +#define CI_TO_AIM_DATA_LEN_MAX ((UINT16)5000) /*CI到AIM数据最大值*/ +#define CIM_INFO_RCI_TO_ATS_DATA ((UINT16)0x2001) /*发送CIM ATS状态信息*/ +#define CIM_INFO_ATS_TO_RCI_DATA ((UINT16)0x2002) /*发送CIM ATS状态信息*/ +#define CIM_INFO_VER_INFO ((UINT16)0x2003) /*发送CIM版本号信息*/ +#define CIM_INFO_COMM_STATE ((UINT16)0x2004) /*发送CIM设备通信状态信息*/ +#define CIM_INFO_SIGNAL_DS_STATE ((UINT16)0x2005) /*发送CIM信号机断丝状态信息*/ +#define CIM_INFO_RELAY_DRVANDCOLLDEF ((UINT16)0x2006) /*发送CIM继电器驱动回采不一致报警*/ +#define CIM_INFO_PSD_ALARM ((UINT16)0x2007) /*发送CIM屏蔽门报警帧类型*/ +#define CIM_INFO_DEVICE_STATE ((UINT16)0x2008) /*发送CIM设备状态信息*/ +#define CIM_INFO_MAINTENANCE ((UINT16)0x2009) /*发送CIM维护信息*/ +#define CIM_INFO_LEU_STATE ((UINT16)0x200A) /*发送CIMLEU状态*/ +#define CIM_INFOR_RELAY_HUNXIAN_STATE ((UINT16)0x200F) /*发送CIM继电器混线状态信息*/ +#define CIM_INFO_SIGNAL_DRIVOUT ((UINT16)0x2010) /*发送CIM信号机驱动超时信息*/ +#define CIM_INFO_UNIT_ALARM ((UINT16)0x2011) /*发送CIM执行单元报警*/ +#define CIM_INFO_FLYPROTECT_ALARM ((UINT16)0x2012) /*发送CIM飞车宕机报警*/ +#define CIM_INFO_IO_COLL_DIFF_ALARM ((UINT16)0x2013) /*发送CIM IO双系采集不一致报警*/ +#define CIM_INFO_SWT_REDUN_COLL_ALARM ((UINT16)0x2014) /*发送CIM道岔冗余采集报警*/ #define CI_AND_OTHER_TRANSMIT_GOOD ((UINT8)0x55) /*CI与其他系统双网通信正常*/ #define CI_AND_OTHER_TRANSMIT_LINK ((UINT8)0x5A) /*CI与其他系统单网通信正常*/ diff --git a/TSCP/src/APP/ciapp/ParsePack/ParsePackGateWayData.c b/TSCP/src/APP/ciapp/ParsePack/ParsePackGateWayData.c index 6bf5552..4ee6fc0 100644 --- a/TSCP/src/APP/ciapp/ParsePack/ParsePackGateWayData.c +++ b/TSCP/src/APP/ciapp/ParsePack/ParsePackGateWayData.c @@ -5,6 +5,9 @@ #include "dquCIInterFace.h" #include "WLBrakeDataManage.h" #include "RRMManageAPI.h" +#include "../ParsePack/ParsePackAtsData.h" +#include "../HLHTMsgHead/HLHTCommonDataPacketHead.h" +#include "../HLHTMsgHead/HLHTHeadContexManage.h" AtsScreenMsgFstStru g_strAtsMsgFst = { 0u }; /*远程筛选首次消息*/ AtsMsgCfmStru g_strAtsCfmFst = { 0u }; /*远程筛选首次确认*/ @@ -32,14 +35,18 @@ AtsMsgCfmStru g_strSndAtsWlbCfmFst = { 0U }; /* AtsMsgCfmStru g_strSndAtsDaCfmFst = { 0U }; /*第二个ATS的取消脱轨防护区首次确认*/ /** -* @brief 解析网关数据帧 +* @brief 解析网关数据帧---无GAL部分消息反馈内容 * @param const UINT8* dataBuf, 数据缓冲区 -* @param const UINT16 dataLength, 数据长度 +* @param[out] UINT16* dataIndex, 数据索引 +* @param[in] const UINT16 dataLength, 数据长度 * @return CI_SUCCESS:成功;CI_ERROR:失败 */ -UINT8 ParseGateWayToCiDataFrame(const UINT8* dataBuf, const UINT16 dataLength) +UINT8 ParseGateWayToCiDataFrame(const UINT8* dataBuf, UINT16* dataIndex, const UINT16 dataLength) { UINT8 chRtn = CI_ERROR; + UINT8 chRtn1 = CI_SUCCESS; + UINT8 chRtn2 = CI_SUCCESS; + UINT8 chRtn3 = CI_SUCCESS; UINT8 chMsgNum = 0u; UINT32 dwDataVer = 0u; UINT32 dwPrtclMsg = 0u; @@ -67,10 +74,11 @@ UINT8 ParseGateWayToCiDataFrame(const UINT8* dataBuf, const UINT16 dataLength) UINT16 wDevId = 0U; UINT8 szCrcTmp[1024] = { 0U }; - if ((NULL != dataBuf) && (0u < dataLength)) - { - chLocalId = GetSystemParaLocalCiId(); + if ((NULL != dataBuf) && (0u < dataLength)&&(NULL !=dataIndex)) + { + ii = *dataIndex; + chLocalId = GetSystemParaLocalCiId(); /* 消息数量 */ chMsgNum = dataBuf[ii++]; /* 数据版本号 */ @@ -89,6 +97,7 @@ UINT8 ParseGateWayToCiDataFrame(const UINT8* dataBuf, const UINT16 dataLength) else { chRtn = CI_ERROR; + chRtn3 = CI_ERROR; } } else @@ -105,6 +114,7 @@ UINT8 ParseGateWayToCiDataFrame(const UINT8* dataBuf, const UINT16 dataLength) else { chRtn = CI_ERROR; + chRtn3 = CI_ERROR; } } else @@ -236,6 +246,7 @@ UINT8 ParseGateWayToCiDataFrame(const UINT8* dataBuf, const UINT16 dataLength) { ; /*DO NOTHING*/ } + chRtn1 = chRtn; } else { @@ -355,6 +366,7 @@ UINT8 ParseGateWayToCiDataFrame(const UINT8* dataBuf, const UINT16 dataLength) { ; /*DO NOTHING*/ } + chRtn2 = chRtn; } break; } @@ -469,6 +481,7 @@ UINT8 ParseGateWayToCiDataFrame(const UINT8* dataBuf, const UINT16 dataLength) { ; /*DO NOTHING*/ } + chRtn3 = chRtn; break; } case MSG_TYPE_EA_CANCLE_FIRST:/* 区间疏散取消首次消息 */ @@ -580,6 +593,7 @@ UINT8 ParseGateWayToCiDataFrame(const UINT8* dataBuf, const UINT16 dataLength) { ; } + chRtn1 = chRtn; } else { @@ -682,6 +696,7 @@ UINT8 ParseGateWayToCiDataFrame(const UINT8* dataBuf, const UINT16 dataLength) { ; } + chRtn2 = chRtn; } break; } @@ -801,7 +816,7 @@ UINT8 ParseGateWayToCiDataFrame(const UINT8* dataBuf, const UINT16 dataLength) { ; } - + chRtn3 = chRtn; break; } case MSG_TYPE_WLB_SET_FIRST: /* 全线列车紧急制动一次命令 */ @@ -923,6 +938,7 @@ UINT8 ParseGateWayToCiDataFrame(const UINT8* dataBuf, const UINT16 dataLength) { ; } + chRtn1 = chRtn; } else { @@ -1039,6 +1055,7 @@ UINT8 ParseGateWayToCiDataFrame(const UINT8* dataBuf, const UINT16 dataLength) { ; } + chRtn2 = chRtn; } break; } @@ -1169,7 +1186,7 @@ UINT8 ParseGateWayToCiDataFrame(const UINT8* dataBuf, const UINT16 dataLength) { ; } - + chRtn3 = chRtn; break; } case MSG_TYPE_DA_CANCLE_FIRST:/* 脱轨防护区取消首次消息 */ @@ -1281,6 +1298,7 @@ UINT8 ParseGateWayToCiDataFrame(const UINT8* dataBuf, const UINT16 dataLength) { ; } + chRtn1 = chRtn; } else { @@ -1383,6 +1401,7 @@ UINT8 ParseGateWayToCiDataFrame(const UINT8* dataBuf, const UINT16 dataLength) { ; } + chRtn2 = chRtn; } break; } @@ -1502,12 +1521,13 @@ UINT8 ParseGateWayToCiDataFrame(const UINT8* dataBuf, const UINT16 dataLength) { ; } - + chRtn3 = chRtn; break; } default: { chRtn = CI_ERROR; + chRtn3 = CI_ERROR; break; } } @@ -1541,24 +1561,44 @@ UINT8 ParseGateWayToCiDataFrame(const UINT8* dataBuf, const UINT16 dataLength) if (CI_SUCCESS == chRtn) { - ; /*不处理*/ + *dataIndex = ii; } else { - ClearAtsMsgFirst(); - ClearAtsMsgSecond(); - ClearAtsEaMsgFirst(); - ClearAtsEaMsgSecond(); - ClearAtsWlbMsgFirst(); - ClearAtsWlbMsgSecond(); - ClearAtsDaMsgFirst(); - ClearAtsDaMsgSecond(); - ClearSndAtsScreenFstCfmMsg(); - ClearSndAtsEaFstCfmMsg(); - ClearSndAtsWlbFstCfmMsg(); - ClearSndAtsDaFstCfmMsg(); - } + /*命令校验非法后,清除对应相关的命令存储*/ + if (CI_ERROR == chRtn1) + { + ClearAtsMsgFirst(); + ClearAtsEaMsgFirst(); + ClearAtsWlbMsgFirst(); + ClearAtsDaMsgFirst(); + } + if (CI_ERROR == chRtn2) + { + ClearSndAtsScreenFstCfmMsg(); + ClearSndAtsEaFstCfmMsg(); + ClearSndAtsWlbFstCfmMsg(); + ClearSndAtsDaFstCfmMsg(); + } + if (CI_ERROR == chRtn3) + { + ClearAtsMsgFirst(); + ClearAtsEaMsgFirst(); + ClearAtsWlbMsgFirst(); + ClearAtsDaMsgFirst(); + ClearSndAtsScreenFstCfmMsg(); + ClearSndAtsEaFstCfmMsg(); + ClearSndAtsWlbFstCfmMsg(); + ClearSndAtsDaFstCfmMsg(); + ClearAtsMsgSecond(); + ClearAtsEaMsgSecond(); + ClearAtsWlbMsgSecond(); + ClearAtsDaMsgSecond(); + } + + } + return chRtn; } @@ -1803,13 +1843,12 @@ void ClearAtsDaMsgSecond(void) } /** -* @brief 组TIOC到网关数据 +* @brief 组TIOC到网关数据--既有信息 * @param 无 * @return CI_ERROR失败;CI_SUCCESS成功 */ -UINT8 PackTiocToGateWayData(const UINT8 deviceId, const UINT8 targetDevType) +UINT8 PackTiocToGateWayData(UINT8* szToGateWayDataBuf, const UINT8 targetDevType, UINT16* wDataIndex) { - UINT8 szToGateWayDataBuf[CI_TO_ATS_DATA_LEN_MAX] = { 0u }; UINT16 ii = 0u; UINT16 jj = 0U; UINT16 wMsgNumIndex = 0u; @@ -1825,7 +1864,6 @@ UINT8 PackTiocToGateWayData(const UINT8 deviceId, const UINT8 targetDevType) UINT8 chTrainIndex = 0u; UINT32 dwTrainId = 0u; UINT16 wMsgLen = 0u; - UINT16 wDstDevId = 0u; UINT16 wTrainLgcId = 0u; UINT8 chEaNum = 0u; UINT16 wEaTrainid = 0u; @@ -1858,826 +1896,820 @@ UINT8 PackTiocToGateWayData(const UINT8 deviceId, const UINT8 targetDevType) TrainFlyProtectStru * pFlyData = NULL; wRcId = (UINT16)chLocalId; /* RC编号,不带类型 */ - - /* 留出消息条数填充位置 */ - ii++; - - chRtn = GetCiEmapCheckVer(chLocalId, &dwDataVer, targetDevType); - if (CI_SUCCESS == chRtn) - {/* 组数据版本 */ - LongToChar(dwDataVer, &szToGateWayDataBuf[ii]); - ii += 4u; - } - else + if ((NULL != szToGateWayDataBuf) && (NULL != wDataIndex)) { - ; - } + ii = *wDataIndex; + wMsgNumIndex = ii; + /* 留出消息条数填充位置 */ + ii++; - if (CI_SUCCESS == chRtn) - {/* 组协议版本 */ - LongToChar(GATE_WAY_PRTCL_VER, &szToGateWayDataBuf[ii]); - ii += 4u; - } - else - { - ; - } - if (0U == dwFlyProtectOverCyc) - { + chRtn = GetCiEmapCheckVer(chLocalId, &dwDataVer, targetDevType); if (CI_SUCCESS == chRtn) - {/* 组TIOC汇报给ATS的远程筛选列车信息 */ - szToGateWayDataBuf[ii++] = MSG_TYPE_REPORT; /* 汇报远程筛选列车信息帧 */ - wMsgLenIndex = ii; /* 记录帧长度存放下标 */ - ii += 2u; - szToGateWayDataBuf[ii++] = MSG_TYPE_REPORT; - ShortToChar(GATE_WAY_APP_PRTCL_VER, &szToGateWayDataBuf[ii]); /* 应用协议版本号 */ - ii += 2u; - szToGateWayDataBuf[ii++] = chLocalId; /* TIOC编号 */ - chAtsScreenNum = GetAtsScreenNum(); - szToGateWayDataBuf[ii++] = chAtsScreenNum; /* 远程筛选列车数量 */ - for (chTrainIndex = 0u; chTrainIndex < chAtsScreenNum; chTrainIndex++) - { - wTrainId = GetAtsScreenTrainIdByIndex(chTrainIndex); - chRtn = dquDevName2HlhtId(wTrainId, wTrainLgcId, &dwTrainId); - chScreenType = GetAtsScreenTypeByIndex(chTrainIndex); - wLgcId = GetAtsScreenLgcIdByIndex(chTrainIndex); - chTrainPosMonitorState = GetTrainPosMonitorState(wTrainId); - chTrainNvramFlag = GetTrainNvramPosFlag(wTrainId); + {/* 组数据版本 */ + LongToChar(dwDataVer, &szToGateWayDataBuf[ii]); + ii += 4u; + } + else + { + ; + } - LongToChar(dwTrainId, &szToGateWayDataBuf[ii]); /* 列车ID */ - ii += 4u; - - if (TRAIN_SCREEN_TYPE_LU == chScreenType) + if (CI_SUCCESS == chRtn) + {/* 组协议版本 */ + LongToChar(GATE_WAY_PRTCL_VER, &szToGateWayDataBuf[ii]); + ii += 4u; + } + else + { + ; + } + if (0U == dwFlyProtectOverCyc) + { + if (CI_SUCCESS == chRtn) + {/* 组TIOC汇报给ATS的远程筛选列车信息 */ + szToGateWayDataBuf[ii++] = MSG_TYPE_REPORT; /* 汇报远程筛选列车信息帧 */ + wMsgLenIndex = ii; /* 记录帧长度存放下标 */ + ii += 2u; + szToGateWayDataBuf[ii++] = MSG_TYPE_REPORT; + ShortToChar(GATE_WAY_APP_PRTCL_VER, &szToGateWayDataBuf[ii]); /* 应用协议版本号 */ + ii += 2u; + szToGateWayDataBuf[ii++] = chLocalId; /* TIOC编号 */ + chAtsScreenNum = GetAtsScreenNum(); + szToGateWayDataBuf[ii++] = chAtsScreenNum; /* 远程筛选列车数量 */ + for (chTrainIndex = 0u; chTrainIndex < chAtsScreenNum; chTrainIndex++) { - if ((TRAIN_POS_MONITOR_VALID == chTrainPosMonitorState) || (TRAIN_NVRAM_POS_FLAG_NO == chTrainNvramFlag)) - { - szToGateWayDataBuf[ii++] = TRAIN_SCREEN_TYPE_LU; /* 远程筛选类别 */ - } - else - { - szToGateWayDataBuf[ii++] = TRAIN_SCREEN_TYPE_POSTION_LOST; /* 监督位置无效筛选 */ - } - - } - else - { - szToGateWayDataBuf[ii++] = chScreenType; - } + wTrainId = GetAtsScreenTrainIdByIndex(chTrainIndex); + chRtn = dquDevName2HlhtId(wTrainId, wTrainLgcId, &dwTrainId); + chScreenType = GetAtsScreenTypeByIndex(chTrainIndex); + wLgcId = GetAtsScreenLgcIdByIndex(chTrainIndex); + chTrainPosMonitorState = GetTrainPosMonitorState(wTrainId); + chTrainNvramFlag = GetTrainNvramPosFlag(wTrainId); - ShortToChar(wLgcId, &szToGateWayDataBuf[ii]); /* 列车所处逻辑区段 */ - ii += 2u; - } - wMsgLen = (ii - wMsgLenIndex - 2u); - ShortToChar(wMsgLen, &szToGateWayDataBuf[wMsgLenIndex]); /* 帧长度 */ - chMsgNum++; /* 消息数量递增 */ - } - else - { - ; - } - - if (CI_SUCCESS == chRtn) - { - if (FLAG_SET == g_strAtsCfmFst.chFlag) - { - szToGateWayDataBuf[ii++] = MSG_TYPE_CONFIRM_FIRST; /* 帧类型 */ - wMsgLenIndex = ii; /* 记录帧长度存放下标 */ - ii += 2u; - szToGateWayDataBuf[ii++] = MSG_TYPE_CONFIRM_FIRST; - szToGateWayDataBuf[ii++] = chLocalId; /* TIOC编号 */ - szToGateWayDataBuf[ii++] = g_strAtsCfmFst.chStation; /* 车站编号 */ - ShortToChar(g_strAtsCfmFst.wIndex, &szToGateWayDataBuf[ii]); /* 操作站编号 */ - ii += 2U; - LongToChar(g_strAtsCfmFst.dwTime, &szToGateWayDataBuf[ii]); /* 时间 */ - ii += 4u; - szToGateWayDataBuf[ii++] = g_strAtsCfmFst.chOpStatus; /* 确认结果 */ - LongToChar(g_strAtsCfmFst.dwCrc32, &szToGateWayDataBuf[ii]); /* CRC */ - ii += 4u; - wMsgLen = (ii - wMsgLenIndex - 2u); - ShortToChar(wMsgLen, &szToGateWayDataBuf[wMsgLenIndex]); /* 帧长度 */ - chMsgNum++; /* 消息数量递增 */ - } - else - { - ; - } - g_strAtsCfmFst.chFlag = FLAG_UNSET; - } - else - { - ; - } - - if (CI_SUCCESS == chRtn) - { - /*组第二个ATS的远程筛选首次确认信息*/ - if (FLAG_SET == g_strSndAtsCfmFst.chFlag) - { - szToGateWayDataBuf[ii] = MSG_TYPE_CONFIRM_FIRST; /* 帧类型 */ - ii++; - wMsgLenIndex = ii; /* 记录帧长度存放下标 */ - ii += 2U; - szToGateWayDataBuf[ii] = MSG_TYPE_CONFIRM_FIRST; - ii++; - szToGateWayDataBuf[ii] = chLocalId; /* TIOC编号 */ - ii++; - szToGateWayDataBuf[ii] = g_strSndAtsCfmFst.chStation; /* 车站编号 */ - ii++; - ShortToChar(g_strSndAtsCfmFst.wIndex, &szToGateWayDataBuf[ii]); /* 操作站编号 */ - ii += 2U; - LongToChar(g_strSndAtsCfmFst.dwTime, &szToGateWayDataBuf[ii]); /* 时间 */ - ii += 4U; - szToGateWayDataBuf[ii] = g_strSndAtsCfmFst.chOpStatus; /* 确认结果 */ - ii++; - LongToChar(g_strSndAtsCfmFst.dwCrc32, &szToGateWayDataBuf[ii]); /* CRC */ - ii += 4U; - wMsgLen = (ii - wMsgLenIndex - 2U); - ShortToChar(wMsgLen, &szToGateWayDataBuf[wMsgLenIndex]); /* 帧长度 */ - chMsgNum++; /* 消息数量递增 */ - - /*组包后清除第二个ATS的确认信息*/ - ClearSndAtsScreenFstCfmMsg(); - } - else - { - ; - } - } - else - { - ; - } - - if (CI_SUCCESS == chRtn) - { - if (FLAG_SET == g_strAtsCfmSnd.chFlag) - { - szToGateWayDataBuf[ii++] = MSG_TYPE_CONFIRM_SECOND; /* 帧类型 */ - wMsgLenIndex = ii; /* 记录帧长度存放下标 */ - ii += 2u; - szToGateWayDataBuf[ii++] = MSG_TYPE_CONFIRM_SECOND; - szToGateWayDataBuf[ii++] = chLocalId; /* TIOC编号 */ - szToGateWayDataBuf[ii++] = g_strAtsCfmSnd.chStation; /* 车站编号 */ - ShortToChar(g_strAtsCfmSnd.wIndex, &szToGateWayDataBuf[ii]); /* 操作站编号 */ - ii += 2U; - LongToChar(g_strAtsCfmSnd.dwTime, &szToGateWayDataBuf[ii]); /* 时间 */ - ii += 4u; - szToGateWayDataBuf[ii++] = g_strAtsCfmSnd.chOpStatus; /* 确认结果 */ - LongToChar(g_strAtsCfmSnd.dwCrc32, &szToGateWayDataBuf[ii]); /* CRC */ - ii += 4u; - wMsgLen = (ii - wMsgLenIndex - 2u); - ShortToChar(wMsgLen, &szToGateWayDataBuf[wMsgLenIndex]); /* 帧长度 */ - chMsgNum++; /* 消息数量递增 */ - } - else - { - ; - } - g_strAtsCfmSnd.chFlag = FLAG_UNSET; - } - else - { - ; - } - - if (CI_SUCCESS == chRtn) - { - /* 组TIOC汇报给ATS的区间疏散信息 */ - szToGateWayDataBuf[ii++] = MSG_TYPE_EA_REPORT; /* 区间疏散汇报消息 */ - wMsgLenIndex = ii; /* 记录帧长度存放下标 */ - ii += 2u; - szToGateWayDataBuf[ii++] = MSG_TYPE_EA_REPORT; - ShortToChar(GATE_WAY_APP_PRTCL_VER, &szToGateWayDataBuf[ii]); /* 应用协议版本号 */ - ii += 2u; - szToGateWayDataBuf[ii++] = chLocalId; /* TIOC编号 */ - - chEaNum = GetEaNum(); - if (EA_MAX_NUM < chEaNum) - { - chRtn = CI_ERROR; - } - else - { - chEaSendNum = 0u; - wEaNumIndex = ii; /* 记录汇报数量存储下标 */ - ii++; - - for (chEaIndex = 0u; chEaIndex < chEaNum; chEaIndex++) - { - wEaTrainid = GetEvacuatingTrainIdByIndex(chEaIndex); - chRtn = dquDevName2HlhtId(wEaTrainid, wTrainLgcId, &dwEaTrainHlhtId); - chEaLgcNum = EaGetLgcNum(chEaIndex); - pEaLgcId = EaGetLgcId(chEaIndex); - chEaBuidFlag = GetEaBuildedFlag(chEaIndex); - chEaSrcId = GetEaSrcTiocByIndex(chEaIndex); - chPaType = GetPaTypeByIndex(chEaIndex); - chEaConfigId = GetEaConfigID(chEaIndex); - chEaAreaLineType = GetEaAreaLineType(chEaIndex); - if ((NULL == pEaLgcId) || (CI_ERROR == chRtn) || (EA_SECTION_MAX_NUM < chEaLgcNum) - || ((PA_TYPE_DA != chPaType) && (PA_TYPE_EA != chPaType))) - { - chRtn = CI_ERROR; - break; - } - else - { - if ((chEaSrcId == chLocalId) && (PA_TYPE_EA == chPaType)) - { - chEaSendNum++; - LongToChar(dwEaTrainHlhtId, &szToGateWayDataBuf[ii]); /* 区间疏散列车互联互通ID */ - ii += 4u; - - szToGateWayDataBuf[ii++] = chEaConfigId; /* 防护区域ID,*/ - - szToGateWayDataBuf[ii++] = chEaBuidFlag; /* 防护区域建立标志 */ - - szToGateWayDataBuf[ii++] = chEaAreaLineType; /* 上下行区域 */ - - szToGateWayDataBuf[ii++] = chEaLgcNum; /* 逻辑区段数量 */ - for (chEaLgcIndex = 0u; chEaLgcIndex < chEaLgcNum; chEaLgcIndex++) - { - ShortToChar(pEaLgcId[chEaLgcIndex], &szToGateWayDataBuf[ii]); - ii += 2u; - } - } - else - { - ; /* 本控区非建立控区,不汇报给ATS */ - } - } - } - - szToGateWayDataBuf[wEaNumIndex] = chEaSendNum; /* 组汇报数量 */ - - wMsgLen = (ii - wMsgLenIndex - 2u); - ShortToChar(wMsgLen, &szToGateWayDataBuf[wMsgLenIndex]); /* 帧长度 */ - chMsgNum++; /* 消息数量递增 */ - } - } - else - { - ; - } - - if (CI_SUCCESS == chRtn) - { - if (FLAG_SET == g_strAtsEaCfmFst.chFlag) - { - szToGateWayDataBuf[ii++] = MSG_TYPE_EA_CONFIRM_FIRST; /* 帧类型 */ - wMsgLenIndex = ii; /* 记录帧长度存放下标 */ - ii += 2u; - szToGateWayDataBuf[ii++] = MSG_TYPE_EA_CONFIRM_FIRST; - szToGateWayDataBuf[ii++] = chLocalId; /* TIOC编号 */ - szToGateWayDataBuf[ii++] = g_strAtsEaCfmFst.chStation; /* 车站编号 */ - ShortToChar(g_strAtsEaCfmFst.wIndex, &szToGateWayDataBuf[ii]); /* 操作站编号 */ - ii += 2U; - LongToChar(g_strAtsEaCfmFst.dwTime, &szToGateWayDataBuf[ii]); /* 时间 */ - ii += 4u; - szToGateWayDataBuf[ii++] = g_strAtsEaCfmFst.chOpStatus; /* 确认结果 */ - LongToChar(g_strAtsEaCfmFst.dwCrc32, &szToGateWayDataBuf[ii]); /* CRC */ - ii += 4u; - wMsgLen = (ii - wMsgLenIndex - 2u); - ShortToChar(wMsgLen, &szToGateWayDataBuf[wMsgLenIndex]); /* 帧长度 */ - chMsgNum++; /* 消息数量递增 */ - } - else - { - ; - } - g_strAtsEaCfmFst.chFlag = FLAG_UNSET; - } - else - { - ; - } - - if (CI_SUCCESS == chRtn) - { - /*组第二个ATS的取消区间疏散首次确认信息*/ - if (FLAG_SET == g_strSndAtsEaCfmFst.chFlag) - { - szToGateWayDataBuf[ii] = MSG_TYPE_EA_CONFIRM_FIRST; /* 帧类型 */ - ii++; - wMsgLenIndex = ii; /* 记录帧长度存放下标 */ - ii += 2U; - szToGateWayDataBuf[ii] = MSG_TYPE_EA_CONFIRM_FIRST; - ii++; - szToGateWayDataBuf[ii] = chLocalId; /* TIOC编号 */ - ii++; - szToGateWayDataBuf[ii] = g_strSndAtsEaCfmFst.chStation; /* 车站编号 */ - ii++; - ShortToChar(g_strSndAtsEaCfmFst.wIndex, &szToGateWayDataBuf[ii]); /* 操作站编号 */ - ii += 2U; - LongToChar(g_strSndAtsEaCfmFst.dwTime, &szToGateWayDataBuf[ii]); /* 时间 */ - ii += 4U; - szToGateWayDataBuf[ii] = g_strSndAtsEaCfmFst.chOpStatus; /* 确认结果 */ - ii++; - LongToChar(g_strSndAtsEaCfmFst.dwCrc32, &szToGateWayDataBuf[ii]); /* CRC */ - ii += 4U; - wMsgLen = (ii - wMsgLenIndex - 2U); - ShortToChar(wMsgLen, &szToGateWayDataBuf[wMsgLenIndex]); /* 帧长度 */ - chMsgNum++; /* 消息数量递增 */ - - /*组包后清除第二个ATS的确认信息*/ - ClearSndAtsEaFstCfmMsg(); - } - else - { - ; - } - } - else - { - ; - } - - if (CI_SUCCESS == chRtn) - { - if (FLAG_SET == g_strAtsEaCfmSnd.chFlag) - { - szToGateWayDataBuf[ii++] = MSG_TYPE_EA_CONFIRM_SECOND; /* 帧类型 */ - wMsgLenIndex = ii; /* 记录帧长度存放下标 */ - ii += 2u; - szToGateWayDataBuf[ii++] = MSG_TYPE_EA_CONFIRM_SECOND; - szToGateWayDataBuf[ii++] = chLocalId; /* TIOC编号 */ - szToGateWayDataBuf[ii++] = g_strAtsEaCfmSnd.chStation; /* 车站编号 */ - ShortToChar(g_strAtsEaCfmSnd.wIndex, &szToGateWayDataBuf[ii]); /* 操作站编号 */ - ii += 2U; - LongToChar(g_strAtsEaCfmSnd.dwTime, &szToGateWayDataBuf[ii]); /* 时间 */ - ii += 4u; - szToGateWayDataBuf[ii++] = g_strAtsEaCfmSnd.chOpStatus; /* 确认结果 */ - LongToChar(g_strAtsEaCfmSnd.dwCrc32, &szToGateWayDataBuf[ii]); /* CRC */ - ii += 4u; - wMsgLen = (ii - wMsgLenIndex - 2u); - ShortToChar(wMsgLen, &szToGateWayDataBuf[wMsgLenIndex]); /* 帧长度 */ - chMsgNum++; /* 消息数量递增 */ - } - else - { - ; - } - g_strAtsEaCfmSnd.chFlag = FLAG_UNSET; - } - else - { - ; - } - - if (CI_SUCCESS == chRtn) - { - /* 组TIOC汇报给ATS的全线列车紧急制动信息 */ - szToGateWayDataBuf[ii++] = MSG_TYPE_WLB_REPORT; /* 全线列车紧急制动汇报消息 */ - wMsgLenIndex = ii; /* 记录帧长度存放下标 */ - ii += 2u; - szToGateWayDataBuf[ii++] = MSG_TYPE_WLB_REPORT; - szToGateWayDataBuf[ii++] = chLocalId; /* TIOC编号 */ - - wWlbSum = 0U; - wWlbSumIndex = ii; - ii += 2U; - - /*组全线紧急制动信息*/ - chWlbState = WlbGetState(); - if (WLB_UNSET != chWlbState) - { - wWlbSum++; - szToGateWayDataBuf[ii++] = WLB_TYPE_RC; /* 制动类型 */ - ShortToChar(wRcId, &szToGateWayDataBuf[ii]); /* RC编号 */ - ii += 2u; - } - else - { - /* 未设置,不组包 */ - } - - /*组区域紧急制动信息*/ - wPhyCurSum = GetPhySecCurSum(); - for (jj = 0U; jj < wPhyCurSum; jj++) - { - wPhySecId = GetPhySecId(jj); - cPhySecAreaUrgentState = GetPhySecAreaUrgentState(wPhySecId); - if (PHYSEC_AREA_URGENT_NO != cPhySecAreaUrgentState) - { - wWlbSum++; - szToGateWayDataBuf[ii++] = WLB_TYPE_PHYSEC; /* 制动类型 */ - ShortToChar(wPhySecId, &szToGateWayDataBuf[ii]); /* 物理区段编号 */ - ii += 2U; - } - else - { - /*不组包*/ - } - } - - ShortToChar(wWlbSum, &szToGateWayDataBuf[wWlbSumIndex]); /* 组紧急制动数量 */ - - wMsgLen = (ii - wMsgLenIndex - 2u); - ShortToChar(wMsgLen, &szToGateWayDataBuf[wMsgLenIndex]); /* 帧长度 */ - chMsgNum++; /* 消息数量递增 */ - } - else - { - ; - } - - if (CI_SUCCESS == chRtn) - { - if (FLAG_SET == g_strAtsWlbCfmFst.chFlag) - { - szToGateWayDataBuf[ii++] = MSG_TYPE_WLB_CONFIRM_FIRST; /* 帧类型 */ - wMsgLenIndex = ii; /* 记录帧长度存放下标 */ - ii += 2u; - szToGateWayDataBuf[ii++] = MSG_TYPE_WLB_CONFIRM_FIRST; - szToGateWayDataBuf[ii++] = chLocalId; /* TIOC编号 */ - szToGateWayDataBuf[ii++] = g_strAtsWlbCfmFst.chStation; /* 车站编号 */ - ShortToChar(g_strAtsWlbCfmFst.wIndex, &szToGateWayDataBuf[ii]); /* 操作站编号 */ - ii += 2U; - LongToChar(g_strAtsWlbCfmFst.dwTime, &szToGateWayDataBuf[ii]); /* 时间 */ - ii += 4u; - szToGateWayDataBuf[ii++] = g_strAtsWlbCfmFst.chOpStatus; /* 确认结果 */ - LongToChar(g_strAtsWlbCfmFst.dwCrc32, &szToGateWayDataBuf[ii]); /* CRC */ - ii += 4u; - wMsgLen = (ii - wMsgLenIndex - 2u); - ShortToChar(wMsgLen, &szToGateWayDataBuf[wMsgLenIndex]); /* 帧长度 */ - chMsgNum++; /* 消息数量递增 */ - } - else - { - ; - } - g_strAtsWlbCfmFst.chFlag = FLAG_UNSET; - } - else - { - ; - } - - if (CI_SUCCESS == chRtn) - { - /*组第二个ATS的全线紧急制动首次确认信息*/ - if (FLAG_SET == g_strSndAtsWlbCfmFst.chFlag) - { - szToGateWayDataBuf[ii] = MSG_TYPE_WLB_CONFIRM_FIRST; /* 帧类型 */ - ii++; - wMsgLenIndex = ii; /* 记录帧长度存放下标 */ - ii += 2U; - szToGateWayDataBuf[ii] = MSG_TYPE_WLB_CONFIRM_FIRST; - ii++; - szToGateWayDataBuf[ii] = chLocalId; /* TIOC编号 */ - ii++; - szToGateWayDataBuf[ii] = g_strSndAtsWlbCfmFst.chStation; /* 车站编号 */ - ii++; - ShortToChar(g_strSndAtsWlbCfmFst.wIndex, &szToGateWayDataBuf[ii]); /* 操作站编号 */ - ii += 2U; - LongToChar(g_strSndAtsWlbCfmFst.dwTime, &szToGateWayDataBuf[ii]); /* 时间 */ - ii += 4U; - szToGateWayDataBuf[ii] = g_strSndAtsWlbCfmFst.chOpStatus; /* 确认结果 */ - ii++; - LongToChar(g_strSndAtsWlbCfmFst.dwCrc32, &szToGateWayDataBuf[ii]); /* CRC */ - ii += 4U; - wMsgLen = (ii - wMsgLenIndex - 2U); - ShortToChar(wMsgLen, &szToGateWayDataBuf[wMsgLenIndex]); /* 帧长度 */ - chMsgNum++; /* 消息数量递增 */ - - /*组包后清除第二个ATS的确认信息*/ - ClearSndAtsWlbFstCfmMsg(); - } - else - { - ; - } - } - else - { - ; - } - - if (CI_SUCCESS == chRtn) - { - if (FLAG_SET == g_strAtsWlbCfmSnd.chFlag) - { - szToGateWayDataBuf[ii++] = MSG_TYPE_WLB_CONFIRM_SECOND; /* 帧类型 */ - wMsgLenIndex = ii; /* 记录帧长度存放下标 */ - ii += 2u; - szToGateWayDataBuf[ii++] = MSG_TYPE_WLB_CONFIRM_SECOND; - szToGateWayDataBuf[ii++] = chLocalId; /* TIOC编号 */ - szToGateWayDataBuf[ii++] = g_strAtsWlbCfmSnd.chStation; /* 车站编号 */ - ShortToChar(g_strAtsWlbCfmSnd.wIndex, &szToGateWayDataBuf[ii]); /* 操作站编号 */ - ii += 2U; - LongToChar(g_strAtsWlbCfmSnd.dwTime, &szToGateWayDataBuf[ii]); /* 时间 */ - ii += 4u; - szToGateWayDataBuf[ii++] = g_strAtsWlbCfmSnd.chOpStatus; /* 确认结果 */ - LongToChar(g_strAtsWlbCfmSnd.dwCrc32, &szToGateWayDataBuf[ii]); /* CRC */ - ii += 4u; - wMsgLen = (ii - wMsgLenIndex - 2u); - ShortToChar(wMsgLen, &szToGateWayDataBuf[wMsgLenIndex]); /* 帧长度 */ - chMsgNum++; /* 消息数量递增 */ - } - else - { - ; - } - g_strAtsWlbCfmSnd.chFlag = FLAG_UNSET; - } - else - { - ; - } - - if (CI_SUCCESS == chRtn) - { - /* 组TIOC汇报给ATS的脱轨防护区域信息 */ - szToGateWayDataBuf[ii++] = MSG_TYPE_DA_REPORT; /* 脱轨防护区域汇报消息 */ - wMsgLenIndex = ii; /* 记录帧长度存放下标 */ - ii += 2u; - szToGateWayDataBuf[ii++] = MSG_TYPE_DA_REPORT; - ShortToChar(GATE_WAY_APP_PRTCL_VER, &szToGateWayDataBuf[ii]); /* 应用协议版本号 */ - ii += 2u; - szToGateWayDataBuf[ii++] = chLocalId; /* TIOC编号 */ - - chEaNum = GetEaNum(); - if (EA_MAX_NUM < chEaNum) - { - chRtn = CI_ERROR; - } - else - { - chEaSendNum = 0u; - wEaNumIndex = ii; /* 记录汇报数量存储下标 */ - ii++; - - for (chEaIndex = 0u; chEaIndex < chEaNum; chEaIndex++) - { - wEaTrainid = GetEvacuatingTrainIdByIndex(chEaIndex); - chRtn = dquDevName2HlhtId(wEaTrainid, wTrainLgcId, &dwEaTrainHlhtId); - chEaLgcNum = EaGetLgcNum(chEaIndex); - pEaLgcId = EaGetLgcId(chEaIndex); - chEaBuidFlag = GetEaBuildedFlag(chEaIndex); - chEaSrcId = GetEaSrcTiocByIndex(chEaIndex); - chPaType = GetPaTypeByIndex(chEaIndex); - chEaAreaLineType = GetEaAreaLineType(chEaIndex); - - if ((NULL == pEaLgcId) || (CI_ERROR == chRtn) || (EA_SECTION_MAX_NUM < chEaLgcNum) - || ((PA_TYPE_DA != chPaType) && (PA_TYPE_EA != chPaType))) - { - chRtn = CI_ERROR; - break; - } - else - { - if ((chEaSrcId == chLocalId) && (PA_TYPE_DA == chPaType)) - { - chEaSendNum++; - LongToChar(dwEaTrainHlhtId, &szToGateWayDataBuf[ii]); /* 区间疏散列车互联互通ID */ - ii += 4u; - - szToGateWayDataBuf[ii++] = chEaAreaLineType; /* 上下行区域 */ - - szToGateWayDataBuf[ii++] = chEaLgcNum; /* 逻辑区段数量 */ - for (chEaLgcIndex = 0u; chEaLgcIndex < chEaLgcNum; chEaLgcIndex++) - { - ShortToChar(pEaLgcId[chEaLgcIndex], &szToGateWayDataBuf[ii]); - ii += 2u; - } - } - else - { - ; /* 本控区非建立控区,不汇报给ATS */ - } - } - } - - szToGateWayDataBuf[wEaNumIndex] = chEaSendNum; /* 组汇报数量 */ - - wMsgLen = (ii - wMsgLenIndex - 2u); - ShortToChar(wMsgLen, &szToGateWayDataBuf[wMsgLenIndex]); /* 帧长度 */ - chMsgNum++; /* 消息数量递增 */ - } - } - else - { - ; - } - - if (CI_SUCCESS == chRtn) - { - if (FLAG_SET == g_strAtsDaCfmFst.chFlag) - { - szToGateWayDataBuf[ii++] = MSG_TYPE_DA_CONFIRM_FIRST; /* 帧类型 */ - wMsgLenIndex = ii; /* 记录帧长度存放下标 */ - ii += 2u; - szToGateWayDataBuf[ii++] = MSG_TYPE_DA_CONFIRM_FIRST; - szToGateWayDataBuf[ii++] = chLocalId; /* TIOC编号 */ - szToGateWayDataBuf[ii++] = g_strAtsDaCfmFst.chStation; /* 车站编号 */ - ShortToChar(g_strAtsDaCfmFst.wIndex, &szToGateWayDataBuf[ii]); /* 操作站编号 */ - ii += 2U; - LongToChar(g_strAtsDaCfmFst.dwTime, &szToGateWayDataBuf[ii]); /* 时间 */ - ii += 4u; - szToGateWayDataBuf[ii++] = g_strAtsDaCfmFst.chOpStatus; /* 确认结果 */ - LongToChar(g_strAtsDaCfmFst.dwCrc32, &szToGateWayDataBuf[ii]); /* CRC */ - ii += 4u; - wMsgLen = (ii - wMsgLenIndex - 2u); - ShortToChar(wMsgLen, &szToGateWayDataBuf[wMsgLenIndex]); /* 帧长度 */ - chMsgNum++; /* 消息数量递增 */ - } - else - { - ; - } - g_strAtsDaCfmFst.chFlag = FLAG_UNSET; - } - else - { - ; - } - - if (CI_SUCCESS == chRtn) - { - /*组第二个ATS的取消防护区域首次确认信息*/ - if (FLAG_SET == g_strSndAtsDaCfmFst.chFlag) - { - szToGateWayDataBuf[ii] = MSG_TYPE_DA_CONFIRM_FIRST; /* 帧类型 */ - ii++; - wMsgLenIndex = ii; /* 记录帧长度存放下标 */ - ii += 2U; - szToGateWayDataBuf[ii] = MSG_TYPE_DA_CONFIRM_FIRST; - ii++; - szToGateWayDataBuf[ii] = chLocalId; /* TIOC编号 */ - ii++; - szToGateWayDataBuf[ii] = g_strSndAtsDaCfmFst.chStation; /* 车站编号 */ - ii++; - ShortToChar(g_strSndAtsDaCfmFst.wIndex, &szToGateWayDataBuf[ii]); /* 操作站编号 */ - ii += 2U; - LongToChar(g_strSndAtsDaCfmFst.dwTime, &szToGateWayDataBuf[ii]); /* 时间 */ - ii += 4U; - szToGateWayDataBuf[ii] = g_strSndAtsDaCfmFst.chOpStatus; /* 确认结果 */ - ii++; - LongToChar(g_strSndAtsDaCfmFst.dwCrc32, &szToGateWayDataBuf[ii]); /* CRC */ - ii += 4U; - wMsgLen = (ii - wMsgLenIndex - 2U); - ShortToChar(wMsgLen, &szToGateWayDataBuf[wMsgLenIndex]); /* 帧长度 */ - chMsgNum++; /* 消息数量递增 */ - - /*组包后清除第二个ATS的确认信息*/ - ClearSndAtsDaFstCfmMsg(); - } - else - { - ; - } - } - else - { - ; - } - - if (CI_SUCCESS == chRtn) - { - if (FLAG_SET == g_strAtsDaCfmSnd.chFlag) - { - szToGateWayDataBuf[ii++] = MSG_TYPE_DA_CONFIRM_SECOND; /* 帧类型 */ - wMsgLenIndex = ii; /* 记录帧长度存放下标 */ - ii += 2u; - szToGateWayDataBuf[ii++] = MSG_TYPE_DA_CONFIRM_SECOND; - szToGateWayDataBuf[ii++] = chLocalId; /* TIOC编号 */ - szToGateWayDataBuf[ii++] = g_strAtsDaCfmSnd.chStation; /* 车站编号 */ - ShortToChar(g_strAtsDaCfmSnd.wIndex, &szToGateWayDataBuf[ii]); /* 操作站编号 */ - ii += 2U; - LongToChar(g_strAtsDaCfmSnd.dwTime, &szToGateWayDataBuf[ii]); /* 时间 */ - ii += 4u; - szToGateWayDataBuf[ii++] = g_strAtsDaCfmSnd.chOpStatus; /* 确认结果 */ - LongToChar(g_strAtsDaCfmSnd.dwCrc32, &szToGateWayDataBuf[ii]); /* CRC */ - ii += 4u; - wMsgLen = (ii - wMsgLenIndex - 2u); - ShortToChar(wMsgLen, &szToGateWayDataBuf[wMsgLenIndex]); /* 帧长度 */ - chMsgNum++; /* 消息数量递增 */ - } - else - { - ; - } - g_strAtsDaCfmSnd.chFlag = FLAG_UNSET; - } - else - { - ; - } - - if (CI_SUCCESS == chRtn) - { - /* 组TIOC汇报给ATS的列车信息 */ - rrm_GetInfToATSUCTInfo(&strTrainInfo); - szToGateWayDataBuf[ii++] = MSG_TYPE_TRIAN_INFO_REPORT; /* 汇报远程筛选列车信息帧 */ - wMsgLenIndex = ii; /* 记录帧长度存放下标 */ - ii += 2u; - szToGateWayDataBuf[ii++] = MSG_TYPE_TRIAN_INFO_REPORT; - ShortToChar(GATE_WAY_APP_PRTCL_VER, &szToGateWayDataBuf[ii]); /* 应用协议版本号 */ - ii += 2u; - szToGateWayDataBuf[ii++] = chLocalId; /* TIOC编号 */ - szToGateWayDataBuf[ii++] = strTrainInfo.trainCnt; /* 列车数量 */ - for (chTrainIndex = 0u; chTrainIndex < strTrainInfo.trainCnt; chTrainIndex++) - { - (void)dquDevName2HlhtId(strTrainInfo.TrainID[chTrainIndex], wTrainLgcId, &dwTrainId); - LongToChar(dwTrainId, &szToGateWayDataBuf[ii]); /* 列车互联互通ID */ - ii += 4u; - - ShortToChar(strTrainInfo.TailSecID[chTrainIndex], &szToGateWayDataBuf[ii]); /* 列车车尾所处逻辑区段 */ - ii += 2u; - } - wMsgLen = (ii - wMsgLenIndex - 2u); - ShortToChar(wMsgLen, &szToGateWayDataBuf[wMsgLenIndex]); /* 帧长度 */ - chMsgNum++; /* 消息数量递增 */ - } - else - { - ; - } - } - else - { - /*组飞车宕机信息*/ - szToGateWayDataBuf[ii++] = MSG_TYPE_TRAIN_FLY_INFO; /* 帧类型 */ - wMsgLenIndex = ii; /* 记录帧长度存放下标 */ - ii += 2u; - szToGateWayDataBuf[ii++] = MSG_TYPE_TRAIN_FLY_INFO; - - ShortToChar(GATE_WAY_APP_PRTCL_VER, &szToGateWayDataBuf[ii]); /* 应用协议版本号 */ - ii += 2u; - szToGateWayDataBuf[ii++] = chLocalId; /* TIOC编号 */ - - FlyProtectTrainNum = GetFlyProtectNum(); - if (SHUT_DOWN_TRAIN_NUMMAX < FlyProtectTrainNum) - { - chRtn = CI_ERROR; - } - else - { - szToGateWayDataBuf[ii++] = FlyProtectTrainNum; /*组飞车列车数量*/ - for (chIndex = 0U; chIndex < FlyProtectTrainNum; chIndex++) - { - pFlyData = GetFlyProtectData(chIndex); - wTrainId = pFlyData->wTrainId; - TrainFlyAxis = pFlyData->flyProtectSecCnt; - chRtn = dquDevName2HlhtId((UINT16)(CI_SYSTEM_TYPE_IVOC * 256U) + wTrainId, 0U, &dwTrainId); /*两字节列车ID转换为4字节互联互通ID*/ - if (chRtn == CI_SUCCESS) - {/*互联互通ID查询成功*/ LongToChar(dwTrainId, &szToGateWayDataBuf[ii]); /* 列车ID */ ii += 4u; - /** 获取通信车对应的包络id */ - - if (TRAIN_FLYALARM_SECNUM_MAX < TrainFlyAxis) + + if (TRAIN_SCREEN_TYPE_LU == chScreenType) { - chRtn = CI_ERROR; + if ((TRAIN_POS_MONITOR_VALID == chTrainPosMonitorState) || (TRAIN_NVRAM_POS_FLAG_NO == chTrainNvramFlag)) + { + szToGateWayDataBuf[ii++] = TRAIN_SCREEN_TYPE_LU; /* 远程筛选类别 */ + } + else + { + szToGateWayDataBuf[ii++] = TRAIN_SCREEN_TYPE_POSTION_LOST; /* 监督位置无效筛选 */ + } + } else { - szToGateWayDataBuf[ii++] = TrainFlyAxis; /* 计轴数量 */ - /* 获取计轴 id*/ - for (jj = 0U; jj < TrainFlyAxis; jj++) + szToGateWayDataBuf[ii++] = chScreenType; + } + + ShortToChar(wLgcId, &szToGateWayDataBuf[ii]); /* 列车所处逻辑区段 */ + ii += 2u; + } + wMsgLen = (ii - wMsgLenIndex - 2u); + ShortToChar(wMsgLen, &szToGateWayDataBuf[wMsgLenIndex]); /* 帧长度 */ + chMsgNum++; /* 消息数量递增 */ + } + else + { + ; + } + + if (CI_SUCCESS == chRtn) + { + if (FLAG_SET == g_strAtsCfmFst.chFlag) + { + szToGateWayDataBuf[ii++] = MSG_TYPE_CONFIRM_FIRST; /* 帧类型 */ + wMsgLenIndex = ii; /* 记录帧长度存放下标 */ + ii += 2u; + szToGateWayDataBuf[ii++] = MSG_TYPE_CONFIRM_FIRST; + szToGateWayDataBuf[ii++] = chLocalId; /* TIOC编号 */ + szToGateWayDataBuf[ii++] = g_strAtsCfmFst.chStation; /* 车站编号 */ + ShortToChar(g_strAtsCfmFst.wIndex, &szToGateWayDataBuf[ii]); /* 操作站编号 */ + ii += 2U; + LongToChar(g_strAtsCfmFst.dwTime, &szToGateWayDataBuf[ii]); /* 时间 */ + ii += 4u; + szToGateWayDataBuf[ii++] = g_strAtsCfmFst.chOpStatus; /* 确认结果 */ + LongToChar(g_strAtsCfmFst.dwCrc32, &szToGateWayDataBuf[ii]); /* CRC */ + ii += 4u; + wMsgLen = (ii - wMsgLenIndex - 2u); + ShortToChar(wMsgLen, &szToGateWayDataBuf[wMsgLenIndex]); /* 帧长度 */ + chMsgNum++; /* 消息数量递增 */ + } + else + { + ; + } + g_strAtsCfmFst.chFlag = FLAG_UNSET; + } + else + { + ; + } + + if (CI_SUCCESS == chRtn) + { + /*组第二个ATS的远程筛选首次确认信息*/ + if (FLAG_SET == g_strSndAtsCfmFst.chFlag) + { + szToGateWayDataBuf[ii] = MSG_TYPE_CONFIRM_FIRST; /* 帧类型 */ + ii++; + wMsgLenIndex = ii; /* 记录帧长度存放下标 */ + ii += 2U; + szToGateWayDataBuf[ii] = MSG_TYPE_CONFIRM_FIRST; + ii++; + szToGateWayDataBuf[ii] = chLocalId; /* TIOC编号 */ + ii++; + szToGateWayDataBuf[ii] = g_strSndAtsCfmFst.chStation; /* 车站编号 */ + ii++; + ShortToChar(g_strSndAtsCfmFst.wIndex, &szToGateWayDataBuf[ii]); /* 操作站编号 */ + ii += 2U; + LongToChar(g_strSndAtsCfmFst.dwTime, &szToGateWayDataBuf[ii]); /* 时间 */ + ii += 4U; + szToGateWayDataBuf[ii] = g_strSndAtsCfmFst.chOpStatus; /* 确认结果 */ + ii++; + LongToChar(g_strSndAtsCfmFst.dwCrc32, &szToGateWayDataBuf[ii]); /* CRC */ + ii += 4U; + wMsgLen = (ii - wMsgLenIndex - 2U); + ShortToChar(wMsgLen, &szToGateWayDataBuf[wMsgLenIndex]); /* 帧长度 */ + chMsgNum++; /* 消息数量递增 */ + + /*组包后清除第二个ATS的确认信息*/ + ClearSndAtsScreenFstCfmMsg(); + } + else + { + ; + } + } + else + { + ; + } + + if (CI_SUCCESS == chRtn) + { + if (FLAG_SET == g_strAtsCfmSnd.chFlag) + { + szToGateWayDataBuf[ii++] = MSG_TYPE_CONFIRM_SECOND; /* 帧类型 */ + wMsgLenIndex = ii; /* 记录帧长度存放下标 */ + ii += 2u; + szToGateWayDataBuf[ii++] = MSG_TYPE_CONFIRM_SECOND; + szToGateWayDataBuf[ii++] = chLocalId; /* TIOC编号 */ + szToGateWayDataBuf[ii++] = g_strAtsCfmSnd.chStation; /* 车站编号 */ + ShortToChar(g_strAtsCfmSnd.wIndex, &szToGateWayDataBuf[ii]); /* 操作站编号 */ + ii += 2U; + LongToChar(g_strAtsCfmSnd.dwTime, &szToGateWayDataBuf[ii]); /* 时间 */ + ii += 4u; + szToGateWayDataBuf[ii++] = g_strAtsCfmSnd.chOpStatus; /* 确认结果 */ + LongToChar(g_strAtsCfmSnd.dwCrc32, &szToGateWayDataBuf[ii]); /* CRC */ + ii += 4u; + wMsgLen = (ii - wMsgLenIndex - 2u); + ShortToChar(wMsgLen, &szToGateWayDataBuf[wMsgLenIndex]); /* 帧长度 */ + chMsgNum++; /* 消息数量递增 */ + } + else + { + ; + } + g_strAtsCfmSnd.chFlag = FLAG_UNSET; + } + else + { + ; + } + + if (CI_SUCCESS == chRtn) + { + /* 组TIOC汇报给ATS的区间疏散信息 */ + szToGateWayDataBuf[ii++] = MSG_TYPE_EA_REPORT; /* 区间疏散汇报消息 */ + wMsgLenIndex = ii; /* 记录帧长度存放下标 */ + ii += 2u; + szToGateWayDataBuf[ii++] = MSG_TYPE_EA_REPORT; + ShortToChar(GATE_WAY_APP_PRTCL_VER, &szToGateWayDataBuf[ii]); /* 应用协议版本号 */ + ii += 2u; + szToGateWayDataBuf[ii++] = chLocalId; /* TIOC编号 */ + + chEaNum = GetEaNum(); + if (EA_MAX_NUM < chEaNum) + { + chRtn = CI_ERROR; + } + else + { + chEaSendNum = 0u; + wEaNumIndex = ii; /* 记录汇报数量存储下标 */ + ii++; + + for (chEaIndex = 0u; chEaIndex < chEaNum; chEaIndex++) + { + wEaTrainid = GetEvacuatingTrainIdByIndex(chEaIndex); + chRtn = dquDevName2HlhtId(wEaTrainid, wTrainLgcId, &dwEaTrainHlhtId); + chEaLgcNum = EaGetLgcNum(chEaIndex); + pEaLgcId = EaGetLgcId(chEaIndex); + chEaBuidFlag = GetEaBuildedFlag(chEaIndex); + chEaSrcId = GetEaSrcTiocByIndex(chEaIndex); + chPaType = GetPaTypeByIndex(chEaIndex); + chEaConfigId = GetEaConfigID(chEaIndex); + chEaAreaLineType = GetEaAreaLineType(chEaIndex); + if ((NULL == pEaLgcId) || (CI_ERROR == chRtn) || (EA_SECTION_MAX_NUM < chEaLgcNum) + || ((PA_TYPE_DA != chPaType) && (PA_TYPE_EA != chPaType))) { - wPhySecId = pFlyData->flyProtectSec[jj]; - ShortToChar(wPhySecId, &szToGateWayDataBuf[ii]); - ii += 2u; + chRtn = CI_ERROR; + break; + } + else + { + if ((chEaSrcId == chLocalId) && (PA_TYPE_EA == chPaType)) + { + chEaSendNum++; + LongToChar(dwEaTrainHlhtId, &szToGateWayDataBuf[ii]); /* 区间疏散列车互联互通ID */ + ii += 4u; + + szToGateWayDataBuf[ii++] = chEaConfigId; /* 防护区域ID,*/ + + szToGateWayDataBuf[ii++] = chEaBuidFlag; /* 防护区域建立标志 */ + + szToGateWayDataBuf[ii++] = chEaAreaLineType; /* 上下行区域 */ + + szToGateWayDataBuf[ii++] = chEaLgcNum; /* 逻辑区段数量 */ + for (chEaLgcIndex = 0u; chEaLgcIndex < chEaLgcNum; chEaLgcIndex++) + { + ShortToChar(pEaLgcId[chEaLgcIndex], &szToGateWayDataBuf[ii]); + ii += 2u; + } + } + else + { + ; /* 本控区非建立控区,不汇报给ATS */ + } } } - } - else - { /*组包失败*/ - chRtn = CI_ERROR; + szToGateWayDataBuf[wEaNumIndex] = chEaSendNum; /* 组汇报数量 */ + + wMsgLen = (ii - wMsgLenIndex - 2u); + ShortToChar(wMsgLen, &szToGateWayDataBuf[wMsgLenIndex]); /* 帧长度 */ + chMsgNum++; /* 消息数量递增 */ } } - wMsgLen = (ii - wMsgLenIndex - 2u); - ShortToChar(wMsgLen, &szToGateWayDataBuf[wMsgLenIndex]); /* 帧长度 */ - } + else + { + ; + } - if (CI_SUCCESS == chRtn) - { - debug_infor_printf((const)"\n GATEWAY_FLY_SHUT_DOWN \n"); - chMsgNum = 1U; - } - } - if (CI_SUCCESS == chRtn) - { - /* 组包成功,填入消息数量 */ - szToGateWayDataBuf[wMsgNumIndex] = chMsgNum; - wDstDevId = (UINT16)(((UINT16)targetDevType << 8U) | (UINT16)deviceId); - chRtn = OutnetSafeSend(wDstDevId, 0u, &szToGateWayDataBuf[0], ii); - if (CI_SUCCESS == chRtn) - { - debug_infor_printf((const)"\nGATEWAY_SEND:%d", ii); - debug_out_array(0xAA, szToGateWayDataBuf, ii); + if (CI_SUCCESS == chRtn) + { + if (FLAG_SET == g_strAtsEaCfmFst.chFlag) + { + szToGateWayDataBuf[ii++] = MSG_TYPE_EA_CONFIRM_FIRST; /* 帧类型 */ + wMsgLenIndex = ii; /* 记录帧长度存放下标 */ + ii += 2u; + szToGateWayDataBuf[ii++] = MSG_TYPE_EA_CONFIRM_FIRST; + szToGateWayDataBuf[ii++] = chLocalId; /* TIOC编号 */ + szToGateWayDataBuf[ii++] = g_strAtsEaCfmFst.chStation; /* 车站编号 */ + ShortToChar(g_strAtsEaCfmFst.wIndex, &szToGateWayDataBuf[ii]); /* 操作站编号 */ + ii += 2U; + LongToChar(g_strAtsEaCfmFst.dwTime, &szToGateWayDataBuf[ii]); /* 时间 */ + ii += 4u; + szToGateWayDataBuf[ii++] = g_strAtsEaCfmFst.chOpStatus; /* 确认结果 */ + LongToChar(g_strAtsEaCfmFst.dwCrc32, &szToGateWayDataBuf[ii]); /* CRC */ + ii += 4u; + wMsgLen = (ii - wMsgLenIndex - 2u); + ShortToChar(wMsgLen, &szToGateWayDataBuf[wMsgLenIndex]); /* 帧长度 */ + chMsgNum++; /* 消息数量递增 */ + } + else + { + ; + } + g_strAtsEaCfmFst.chFlag = FLAG_UNSET; + } + else + { + ; + } + + if (CI_SUCCESS == chRtn) + { + /*组第二个ATS的取消区间疏散首次确认信息*/ + if (FLAG_SET == g_strSndAtsEaCfmFst.chFlag) + { + szToGateWayDataBuf[ii] = MSG_TYPE_EA_CONFIRM_FIRST; /* 帧类型 */ + ii++; + wMsgLenIndex = ii; /* 记录帧长度存放下标 */ + ii += 2U; + szToGateWayDataBuf[ii] = MSG_TYPE_EA_CONFIRM_FIRST; + ii++; + szToGateWayDataBuf[ii] = chLocalId; /* TIOC编号 */ + ii++; + szToGateWayDataBuf[ii] = g_strSndAtsEaCfmFst.chStation; /* 车站编号 */ + ii++; + ShortToChar(g_strSndAtsEaCfmFst.wIndex, &szToGateWayDataBuf[ii]); /* 操作站编号 */ + ii += 2U; + LongToChar(g_strSndAtsEaCfmFst.dwTime, &szToGateWayDataBuf[ii]); /* 时间 */ + ii += 4U; + szToGateWayDataBuf[ii] = g_strSndAtsEaCfmFst.chOpStatus; /* 确认结果 */ + ii++; + LongToChar(g_strSndAtsEaCfmFst.dwCrc32, &szToGateWayDataBuf[ii]); /* CRC */ + ii += 4U; + wMsgLen = (ii - wMsgLenIndex - 2U); + ShortToChar(wMsgLen, &szToGateWayDataBuf[wMsgLenIndex]); /* 帧长度 */ + chMsgNum++; /* 消息数量递增 */ + + /*组包后清除第二个ATS的确认信息*/ + ClearSndAtsEaFstCfmMsg(); + } + else + { + ; + } + } + else + { + ; + } + + if (CI_SUCCESS == chRtn) + { + if (FLAG_SET == g_strAtsEaCfmSnd.chFlag) + { + szToGateWayDataBuf[ii++] = MSG_TYPE_EA_CONFIRM_SECOND; /* 帧类型 */ + wMsgLenIndex = ii; /* 记录帧长度存放下标 */ + ii += 2u; + szToGateWayDataBuf[ii++] = MSG_TYPE_EA_CONFIRM_SECOND; + szToGateWayDataBuf[ii++] = chLocalId; /* TIOC编号 */ + szToGateWayDataBuf[ii++] = g_strAtsEaCfmSnd.chStation; /* 车站编号 */ + ShortToChar(g_strAtsEaCfmSnd.wIndex, &szToGateWayDataBuf[ii]); /* 操作站编号 */ + ii += 2U; + LongToChar(g_strAtsEaCfmSnd.dwTime, &szToGateWayDataBuf[ii]); /* 时间 */ + ii += 4u; + szToGateWayDataBuf[ii++] = g_strAtsEaCfmSnd.chOpStatus; /* 确认结果 */ + LongToChar(g_strAtsEaCfmSnd.dwCrc32, &szToGateWayDataBuf[ii]); /* CRC */ + ii += 4u; + wMsgLen = (ii - wMsgLenIndex - 2u); + ShortToChar(wMsgLen, &szToGateWayDataBuf[wMsgLenIndex]); /* 帧长度 */ + chMsgNum++; /* 消息数量递增 */ + } + else + { + ; + } + g_strAtsEaCfmSnd.chFlag = FLAG_UNSET; + } + else + { + ; + } + + if (CI_SUCCESS == chRtn) + { + /* 组TIOC汇报给ATS的全线列车紧急制动信息 */ + szToGateWayDataBuf[ii++] = MSG_TYPE_WLB_REPORT; /* 全线列车紧急制动汇报消息 */ + wMsgLenIndex = ii; /* 记录帧长度存放下标 */ + ii += 2u; + szToGateWayDataBuf[ii++] = MSG_TYPE_WLB_REPORT; + szToGateWayDataBuf[ii++] = chLocalId; /* TIOC编号 */ + + wWlbSum = 0U; + wWlbSumIndex = ii; + ii += 2U; + + /*组全线紧急制动信息*/ + chWlbState = WlbGetState(); + if (WLB_UNSET != chWlbState) + { + wWlbSum++; + szToGateWayDataBuf[ii++] = WLB_TYPE_RC; /* 制动类型 */ + ShortToChar(wRcId, &szToGateWayDataBuf[ii]); /* RC编号 */ + ii += 2u; + } + else + { + /* 未设置,不组包 */ + } + + /*组区域紧急制动信息*/ + wPhyCurSum = GetPhySecCurSum(); + for (jj = 0U; jj < wPhyCurSum; jj++) + { + wPhySecId = GetPhySecId(jj); + cPhySecAreaUrgentState = GetPhySecAreaUrgentState(wPhySecId); + if (PHYSEC_AREA_URGENT_NO != cPhySecAreaUrgentState) + { + wWlbSum++; + szToGateWayDataBuf[ii++] = WLB_TYPE_PHYSEC; /* 制动类型 */ + ShortToChar(wPhySecId, &szToGateWayDataBuf[ii]); /* 物理区段编号 */ + ii += 2U; + } + else + { + /*不组包*/ + } + } + + ShortToChar(wWlbSum, &szToGateWayDataBuf[wWlbSumIndex]); /* 组紧急制动数量 */ + + wMsgLen = (ii - wMsgLenIndex - 2u); + ShortToChar(wMsgLen, &szToGateWayDataBuf[wMsgLenIndex]); /* 帧长度 */ + chMsgNum++; /* 消息数量递增 */ + } + else + { + ; + } + + if (CI_SUCCESS == chRtn) + { + if (FLAG_SET == g_strAtsWlbCfmFst.chFlag) + { + szToGateWayDataBuf[ii++] = MSG_TYPE_WLB_CONFIRM_FIRST; /* 帧类型 */ + wMsgLenIndex = ii; /* 记录帧长度存放下标 */ + ii += 2u; + szToGateWayDataBuf[ii++] = MSG_TYPE_WLB_CONFIRM_FIRST; + szToGateWayDataBuf[ii++] = chLocalId; /* TIOC编号 */ + szToGateWayDataBuf[ii++] = g_strAtsWlbCfmFst.chStation; /* 车站编号 */ + ShortToChar(g_strAtsWlbCfmFst.wIndex, &szToGateWayDataBuf[ii]); /* 操作站编号 */ + ii += 2U; + LongToChar(g_strAtsWlbCfmFst.dwTime, &szToGateWayDataBuf[ii]); /* 时间 */ + ii += 4u; + szToGateWayDataBuf[ii++] = g_strAtsWlbCfmFst.chOpStatus; /* 确认结果 */ + LongToChar(g_strAtsWlbCfmFst.dwCrc32, &szToGateWayDataBuf[ii]); /* CRC */ + ii += 4u; + wMsgLen = (ii - wMsgLenIndex - 2u); + ShortToChar(wMsgLen, &szToGateWayDataBuf[wMsgLenIndex]); /* 帧长度 */ + chMsgNum++; /* 消息数量递增 */ + } + else + { + ; + } + g_strAtsWlbCfmFst.chFlag = FLAG_UNSET; + } + else + { + ; + } + + if (CI_SUCCESS == chRtn) + { + /*组第二个ATS的全线紧急制动首次确认信息*/ + if (FLAG_SET == g_strSndAtsWlbCfmFst.chFlag) + { + szToGateWayDataBuf[ii] = MSG_TYPE_WLB_CONFIRM_FIRST; /* 帧类型 */ + ii++; + wMsgLenIndex = ii; /* 记录帧长度存放下标 */ + ii += 2U; + szToGateWayDataBuf[ii] = MSG_TYPE_WLB_CONFIRM_FIRST; + ii++; + szToGateWayDataBuf[ii] = chLocalId; /* TIOC编号 */ + ii++; + szToGateWayDataBuf[ii] = g_strSndAtsWlbCfmFst.chStation; /* 车站编号 */ + ii++; + ShortToChar(g_strSndAtsWlbCfmFst.wIndex, &szToGateWayDataBuf[ii]); /* 操作站编号 */ + ii += 2U; + LongToChar(g_strSndAtsWlbCfmFst.dwTime, &szToGateWayDataBuf[ii]); /* 时间 */ + ii += 4U; + szToGateWayDataBuf[ii] = g_strSndAtsWlbCfmFst.chOpStatus; /* 确认结果 */ + ii++; + LongToChar(g_strSndAtsWlbCfmFst.dwCrc32, &szToGateWayDataBuf[ii]); /* CRC */ + ii += 4U; + wMsgLen = (ii - wMsgLenIndex - 2U); + ShortToChar(wMsgLen, &szToGateWayDataBuf[wMsgLenIndex]); /* 帧长度 */ + chMsgNum++; /* 消息数量递增 */ + + /*组包后清除第二个ATS的确认信息*/ + ClearSndAtsWlbFstCfmMsg(); + } + else + { + ; + } + } + else + { + ; + } + + if (CI_SUCCESS == chRtn) + { + if (FLAG_SET == g_strAtsWlbCfmSnd.chFlag) + { + szToGateWayDataBuf[ii++] = MSG_TYPE_WLB_CONFIRM_SECOND; /* 帧类型 */ + wMsgLenIndex = ii; /* 记录帧长度存放下标 */ + ii += 2u; + szToGateWayDataBuf[ii++] = MSG_TYPE_WLB_CONFIRM_SECOND; + szToGateWayDataBuf[ii++] = chLocalId; /* TIOC编号 */ + szToGateWayDataBuf[ii++] = g_strAtsWlbCfmSnd.chStation; /* 车站编号 */ + ShortToChar(g_strAtsWlbCfmSnd.wIndex, &szToGateWayDataBuf[ii]); /* 操作站编号 */ + ii += 2U; + LongToChar(g_strAtsWlbCfmSnd.dwTime, &szToGateWayDataBuf[ii]); /* 时间 */ + ii += 4u; + szToGateWayDataBuf[ii++] = g_strAtsWlbCfmSnd.chOpStatus; /* 确认结果 */ + LongToChar(g_strAtsWlbCfmSnd.dwCrc32, &szToGateWayDataBuf[ii]); /* CRC */ + ii += 4u; + wMsgLen = (ii - wMsgLenIndex - 2u); + ShortToChar(wMsgLen, &szToGateWayDataBuf[wMsgLenIndex]); /* 帧长度 */ + chMsgNum++; /* 消息数量递增 */ + } + else + { + ; + } + g_strAtsWlbCfmSnd.chFlag = FLAG_UNSET; + } + else + { + ; + } + + if (CI_SUCCESS == chRtn) + { + /* 组TIOC汇报给ATS的脱轨防护区域信息 */ + szToGateWayDataBuf[ii++] = MSG_TYPE_DA_REPORT; /* 脱轨防护区域汇报消息 */ + wMsgLenIndex = ii; /* 记录帧长度存放下标 */ + ii += 2u; + szToGateWayDataBuf[ii++] = MSG_TYPE_DA_REPORT; + ShortToChar(GATE_WAY_APP_PRTCL_VER, &szToGateWayDataBuf[ii]); /* 应用协议版本号 */ + ii += 2u; + szToGateWayDataBuf[ii++] = chLocalId; /* TIOC编号 */ + + chEaNum = GetEaNum(); + if (EA_MAX_NUM < chEaNum) + { + chRtn = CI_ERROR; + } + else + { + chEaSendNum = 0u; + wEaNumIndex = ii; /* 记录汇报数量存储下标 */ + ii++; + + for (chEaIndex = 0u; chEaIndex < chEaNum; chEaIndex++) + { + wEaTrainid = GetEvacuatingTrainIdByIndex(chEaIndex); + chRtn = dquDevName2HlhtId(wEaTrainid, wTrainLgcId, &dwEaTrainHlhtId); + chEaLgcNum = EaGetLgcNum(chEaIndex); + pEaLgcId = EaGetLgcId(chEaIndex); + chEaBuidFlag = GetEaBuildedFlag(chEaIndex); + chEaSrcId = GetEaSrcTiocByIndex(chEaIndex); + chPaType = GetPaTypeByIndex(chEaIndex); + chEaAreaLineType = GetEaAreaLineType(chEaIndex); + + if ((NULL == pEaLgcId) || (CI_ERROR == chRtn) || (EA_SECTION_MAX_NUM < chEaLgcNum) + || ((PA_TYPE_DA != chPaType) && (PA_TYPE_EA != chPaType))) + { + chRtn = CI_ERROR; + break; + } + else + { + if ((chEaSrcId == chLocalId) && (PA_TYPE_DA == chPaType)) + { + chEaSendNum++; + LongToChar(dwEaTrainHlhtId, &szToGateWayDataBuf[ii]); /* 区间疏散列车互联互通ID */ + ii += 4u; + + szToGateWayDataBuf[ii++] = chEaAreaLineType; /* 上下行区域 */ + + szToGateWayDataBuf[ii++] = chEaLgcNum; /* 逻辑区段数量 */ + for (chEaLgcIndex = 0u; chEaLgcIndex < chEaLgcNum; chEaLgcIndex++) + { + ShortToChar(pEaLgcId[chEaLgcIndex], &szToGateWayDataBuf[ii]); + ii += 2u; + } + } + else + { + ; /* 本控区非建立控区,不汇报给ATS */ + } + } + } + + szToGateWayDataBuf[wEaNumIndex] = chEaSendNum; /* 组汇报数量 */ + + wMsgLen = (ii - wMsgLenIndex - 2u); + ShortToChar(wMsgLen, &szToGateWayDataBuf[wMsgLenIndex]); /* 帧长度 */ + chMsgNum++; /* 消息数量递增 */ + } + } + else + { + ; + } + + if (CI_SUCCESS == chRtn) + { + if (FLAG_SET == g_strAtsDaCfmFst.chFlag) + { + szToGateWayDataBuf[ii++] = MSG_TYPE_DA_CONFIRM_FIRST; /* 帧类型 */ + wMsgLenIndex = ii; /* 记录帧长度存放下标 */ + ii += 2u; + szToGateWayDataBuf[ii++] = MSG_TYPE_DA_CONFIRM_FIRST; + szToGateWayDataBuf[ii++] = chLocalId; /* TIOC编号 */ + szToGateWayDataBuf[ii++] = g_strAtsDaCfmFst.chStation; /* 车站编号 */ + ShortToChar(g_strAtsDaCfmFst.wIndex, &szToGateWayDataBuf[ii]); /* 操作站编号 */ + ii += 2U; + LongToChar(g_strAtsDaCfmFst.dwTime, &szToGateWayDataBuf[ii]); /* 时间 */ + ii += 4u; + szToGateWayDataBuf[ii++] = g_strAtsDaCfmFst.chOpStatus; /* 确认结果 */ + LongToChar(g_strAtsDaCfmFst.dwCrc32, &szToGateWayDataBuf[ii]); /* CRC */ + ii += 4u; + wMsgLen = (ii - wMsgLenIndex - 2u); + ShortToChar(wMsgLen, &szToGateWayDataBuf[wMsgLenIndex]); /* 帧长度 */ + chMsgNum++; /* 消息数量递增 */ + } + else + { + ; + } + g_strAtsDaCfmFst.chFlag = FLAG_UNSET; + } + else + { + ; + } + + if (CI_SUCCESS == chRtn) + { + /*组第二个ATS的取消防护区域首次确认信息*/ + if (FLAG_SET == g_strSndAtsDaCfmFst.chFlag) + { + szToGateWayDataBuf[ii] = MSG_TYPE_DA_CONFIRM_FIRST; /* 帧类型 */ + ii++; + wMsgLenIndex = ii; /* 记录帧长度存放下标 */ + ii += 2U; + szToGateWayDataBuf[ii] = MSG_TYPE_DA_CONFIRM_FIRST; + ii++; + szToGateWayDataBuf[ii] = chLocalId; /* TIOC编号 */ + ii++; + szToGateWayDataBuf[ii] = g_strSndAtsDaCfmFst.chStation; /* 车站编号 */ + ii++; + ShortToChar(g_strSndAtsDaCfmFst.wIndex, &szToGateWayDataBuf[ii]); /* 操作站编号 */ + ii += 2U; + LongToChar(g_strSndAtsDaCfmFst.dwTime, &szToGateWayDataBuf[ii]); /* 时间 */ + ii += 4U; + szToGateWayDataBuf[ii] = g_strSndAtsDaCfmFst.chOpStatus; /* 确认结果 */ + ii++; + LongToChar(g_strSndAtsDaCfmFst.dwCrc32, &szToGateWayDataBuf[ii]); /* CRC */ + ii += 4U; + wMsgLen = (ii - wMsgLenIndex - 2U); + ShortToChar(wMsgLen, &szToGateWayDataBuf[wMsgLenIndex]); /* 帧长度 */ + chMsgNum++; /* 消息数量递增 */ + + /*组包后清除第二个ATS的确认信息*/ + ClearSndAtsDaFstCfmMsg(); + } + else + { + ; + } + } + else + { + ; + } + + if (CI_SUCCESS == chRtn) + { + if (FLAG_SET == g_strAtsDaCfmSnd.chFlag) + { + szToGateWayDataBuf[ii++] = MSG_TYPE_DA_CONFIRM_SECOND; /* 帧类型 */ + wMsgLenIndex = ii; /* 记录帧长度存放下标 */ + ii += 2u; + szToGateWayDataBuf[ii++] = MSG_TYPE_DA_CONFIRM_SECOND; + szToGateWayDataBuf[ii++] = chLocalId; /* TIOC编号 */ + szToGateWayDataBuf[ii++] = g_strAtsDaCfmSnd.chStation; /* 车站编号 */ + ShortToChar(g_strAtsDaCfmSnd.wIndex, &szToGateWayDataBuf[ii]); /* 操作站编号 */ + ii += 2U; + LongToChar(g_strAtsDaCfmSnd.dwTime, &szToGateWayDataBuf[ii]); /* 时间 */ + ii += 4u; + szToGateWayDataBuf[ii++] = g_strAtsDaCfmSnd.chOpStatus; /* 确认结果 */ + LongToChar(g_strAtsDaCfmSnd.dwCrc32, &szToGateWayDataBuf[ii]); /* CRC */ + ii += 4u; + wMsgLen = (ii - wMsgLenIndex - 2u); + ShortToChar(wMsgLen, &szToGateWayDataBuf[wMsgLenIndex]); /* 帧长度 */ + chMsgNum++; /* 消息数量递增 */ + } + else + { + ; + } + g_strAtsDaCfmSnd.chFlag = FLAG_UNSET; + } + else + { + ; + } + + if (CI_SUCCESS == chRtn) + { + /* 组TIOC汇报给ATS的列车信息 */ + rrm_GetInfToATSUCTInfo(&strTrainInfo); + szToGateWayDataBuf[ii++] = MSG_TYPE_TRIAN_INFO_REPORT; /* 汇报远程筛选列车信息帧 */ + wMsgLenIndex = ii; /* 记录帧长度存放下标 */ + ii += 2u; + szToGateWayDataBuf[ii++] = MSG_TYPE_TRIAN_INFO_REPORT; + ShortToChar(GATE_WAY_APP_PRTCL_VER, &szToGateWayDataBuf[ii]); /* 应用协议版本号 */ + ii += 2u; + szToGateWayDataBuf[ii++] = chLocalId; /* TIOC编号 */ + szToGateWayDataBuf[ii++] = strTrainInfo.trainCnt; /* 列车数量 */ + for (chTrainIndex = 0u; chTrainIndex < strTrainInfo.trainCnt; chTrainIndex++) + { + (void)dquDevName2HlhtId(strTrainInfo.TrainID[chTrainIndex], wTrainLgcId, &dwTrainId); + LongToChar(dwTrainId, &szToGateWayDataBuf[ii]); /* 列车互联互通ID */ + ii += 4u; + + ShortToChar(strTrainInfo.TailSecID[chTrainIndex], &szToGateWayDataBuf[ii]); /* 列车车尾所处逻辑区段 */ + ii += 2u; + } + wMsgLen = (ii - wMsgLenIndex - 2u); + ShortToChar(wMsgLen, &szToGateWayDataBuf[wMsgLenIndex]); /* 帧长度 */ + chMsgNum++; /* 消息数量递增 */ + } + else + { + ; + } } else { - ; + /*组飞车宕机信息*/ + szToGateWayDataBuf[ii++] = MSG_TYPE_TRAIN_FLY_INFO; /* 帧类型 */ + wMsgLenIndex = ii; /* 记录帧长度存放下标 */ + ii += 2u; + szToGateWayDataBuf[ii++] = MSG_TYPE_TRAIN_FLY_INFO; + + ShortToChar(GATE_WAY_APP_PRTCL_VER, &szToGateWayDataBuf[ii]); /* 应用协议版本号 */ + ii += 2u; + szToGateWayDataBuf[ii++] = chLocalId; /* TIOC编号 */ + + FlyProtectTrainNum = GetFlyProtectNum(); + if (SHUT_DOWN_TRAIN_NUMMAX < FlyProtectTrainNum) + { + chRtn = CI_ERROR; + } + else + { + szToGateWayDataBuf[ii++] = FlyProtectTrainNum; /*组飞车列车数量*/ + for (chIndex = 0U; chIndex < FlyProtectTrainNum; chIndex++) + { + pFlyData = GetFlyProtectData(chIndex); + wTrainId = pFlyData->wTrainId; + TrainFlyAxis = pFlyData->flyProtectSecCnt; + chRtn = dquDevName2HlhtId((UINT16)(CI_SYSTEM_TYPE_IVOC * 256U) + wTrainId, 0U, &dwTrainId); /*两字节列车ID转换为4字节互联互通ID*/ + if (chRtn == CI_SUCCESS) + {/*互联互通ID查询成功*/ + LongToChar(dwTrainId, &szToGateWayDataBuf[ii]); /* 列车ID */ + ii += 4u; + /** 获取通信车对应的包络id */ + + if (TRAIN_FLYALARM_SECNUM_MAX < TrainFlyAxis) + { + chRtn = CI_ERROR; + } + else + { + szToGateWayDataBuf[ii++] = TrainFlyAxis; /* 计轴数量 */ + /* 获取计轴 id*/ + for (jj = 0U; jj < TrainFlyAxis; jj++) + { + wPhySecId = pFlyData->flyProtectSec[jj]; + ShortToChar(wPhySecId, &szToGateWayDataBuf[ii]); + ii += 2u; + } + } + + } + else + { /*组包失败*/ + chRtn = CI_ERROR; + } + } + wMsgLen = (ii - wMsgLenIndex - 2u); + ShortToChar(wMsgLen, &szToGateWayDataBuf[wMsgLenIndex]); /* 帧长度 */ + } + + if (CI_SUCCESS == chRtn) + { + debug_infor_printf((char*)"\n GATEWAY_FLY_SHUT_DOWN \n"); + chMsgNum = 1U; + } + } + if (CI_SUCCESS == chRtn) + { + /* 组包成功,填入消息数量 */ + szToGateWayDataBuf[wMsgNumIndex] = chMsgNum; + *wDataIndex = ii; } } else { ; } - + return chRtn; } @@ -2777,4 +2809,580 @@ void ClearSndAtsWlbFstCfmMsg(void) void ClearSndAtsDaFstCfmMsg(void) { (void)CommonMemSet((void*)&g_strSndAtsDaCfmFst, (UINT32)sizeof(AtsMsgCfmStru), (UINT8)0U, (UINT32)sizeof(AtsMsgCfmStru)); +} + +/** +* @brief 解析网关数据帧--按照接口类型区分有无GAL +* @param const UINT8* dataBuf, 数据缓冲区 +* @param const UINT16 dataLength, 数据长度 +* @return CI_SUCCESS:成功;CI_ERROR:失败 +* @note Created By fan 20260604 +*/ +UINT8 ParseGateWayToCiDataProc(const UINT8* dataBuf, const UINT16 dataLength) +{ + UINT8 chAtsInterfaceType = 0U; /*ATS接口类型*/ + UINT8 chGalHeadSaved = 0u; /*通用头是否已保存标志,1保存;0未保存*/ + UINT16 ii = 0U; /*数据索引*/ + UINT8 chRetVal = CI_ERROR; + HLHTGALInfoStruct hlhtGalHead = { 0U }; /*互联互通报文头*/ + UINT8 chHeadReval = CI_ERROR; /*互联互通报文头检查结果*/ + UINT16 wTiocRcvAtsGtwyDevTypeId = 0U; + UINT8 chLocalCiId = GetSystemParaLocalCiId();/*联锁ID*/ + UINT16 wRemoteDevName = 0U; /*对方设备信息*/ + UINT32 dwErrCode = 0U; /*通用报文头错误码记录*/ + UINT32 dwCurCycNum = Get2oo2CurCycleNum(); /*当前周期号*/ + UINT32 dwCiAndAtsTimeOutTime = 0u; /*联锁与ATS通信中断时间*/ + INT32 remainValidiy = 0; /*剩余时间是否有效*/ + UINT32 dwCiCurappCycleTime = 0u; /*联锁当前周期*/ + UINT16 wMsgLen = 0U; /*一条应用数据长度*/ + UINT16 wTmpDataLen = 0U; /*数据长度临时记录变量*/ + UINT16 wMsgType = 0U; /*报文类型*/ + UINT16 wMsgCheckLen = 0U; /* 单帧数据长度*/ + UINT8 chCurSystemAreaState = 0U; /*当前系统区域状态*/ + UINT32 dwReciveCmdDataAtsCycNum = 0U; /*收到ATS命令数据时ATS周期号*/ + UINT32 dwSystemUpdateMainUseCycNum = 0U; /*系统主用起始周期号*/ + UINT8 chExistCmdDataFlag = 0U; /*存在命令数据标志*/ + UINT8 chDeciveId = 0U; /*网关ID*/ + AtsFollowUpCmdFstStru tempFstCmd[FOLLOWUP_MSGID_MAX] = { 0U };/*一次命令临时存储*/ + AtsFollowUpCmdSndStru tempSndCmd[FOLLOWUP_MSGID_MAX] = { 0U };/*二次命令临时存储*/ + UINT16 wIndex = 0U;/*临时信息存储索引*/ + UINT16 wMsgTypeTmp = 0U;/*拷贝回全局变量的信息类型*/ + AtsFollowUpCmdFstStru *pGlobalFst = NULL; + AtsFollowUpCmdSndStru *pGlobalSnd = NULL; + wTiocRcvAtsGtwyDevTypeId = GetTiocTrnsmtGtwyDevTypeId(); + chDeciveId =(UINT8)(wTiocRcvAtsGtwyDevTypeId & 0x00FFU); + if ((NULL != dataBuf) && (0u < dataLength)) + { + chAtsInterfaceType = GetCiFunctionSwitchConfig(FUNC_GATEWAY_INTERFACE_IDENTIFIER); + + if (ATS_INTERFACE_EXIST_GAL != chAtsInterfaceType) + { + /*旧数据结构只有命令信息*/ + chRetVal = ParseGateWayToCiDataFrame(dataBuf, &ii, dataLength); + } + else + { + /*新数据结构存在GAL报文头,且存在心跳帧或命令信息帧*/ + /*解析通用消息包头*/ + hlhtGalHead.devInterInfoType = ShortFromChar(&dataBuf[ii]); + ii += 2U; + hlhtGalHead.sourceId = LongFromChar(&dataBuf[ii]); + ii += 4U; + hlhtGalHead.destId = LongFromChar(&dataBuf[ii]); + ii += 4U; + hlhtGalHead.emapVerCrc = LongFromChar(&dataBuf[ii]); + ii += 4U; + hlhtGalHead.crntOwnMsgSN = LongFromChar(&dataBuf[ii]); + ii += 4U; + hlhtGalHead.comPeriod = ShortFromChar(&dataBuf[ii]); + ii += 2U; + hlhtGalHead.recvOppMsgSN = LongFromChar(&dataBuf[ii]); + ii += 4U; + hlhtGalHead.preOwnMsgSN = LongFromChar(&dataBuf[ii]); + ii += 4U; + hlhtGalHead.prtclVer = dataBuf[ii++]; + hlhtGalHead.totalDataLen = ShortFromChar(&dataBuf[ii]); + ii += 2U; + + wRemoteDevName = (CI_SYSTEM_TYPE_RCI)* 256U + chLocalCiId; + chHeadReval = HLHTRecvCommonPacketHeadCheck(wTiocRcvAtsGtwyDevTypeId, wRemoteDevName, ATS_CI_INTERFACE_INFOTYPE, 1U, &hlhtGalHead, &dwErrCode, 0U, CI_SYSTEM_TYPE_ATS); + + debug_infor_printf((char*)"\nGateWay%#x GAL Check Result:%d errCode:%d\n", wTiocRcvAtsGtwyDevTypeId, chHeadReval, dwErrCode); /*0x55正确,0xaa错误,0x33初始通信帧*/ + + if (HLHT_HEAD_SUCCESS == chHeadReval) + { + dwCiAndAtsTimeOutTime = GetCiAndAtsTransBadEnsureTime(); + dwCiCurappCycleTime = GetSystemParaAppCycleTime(); + /*计算消息的时效性*/ + remainValidiy = HLHTCommonMsgRemainingValidity(dwCiAndAtsTimeOutTime, dwCurCycNum, dwCiCurappCycleTime, hlhtGalHead.recvOppMsgSN, hlhtGalHead.crntOwnMsgSN, hlhtGalHead.preOwnMsgSN, hlhtGalHead.comPeriod); + + if (remainValidiy > 0) + { + /*解析应用数据*/ + if (0u == hlhtGalHead.totalDataLen) + { + /* 仅有GAL头信息 */ + chRetVal = CI_ERROR; + } + else if (6u > hlhtGalHead.totalDataLen) + { + /* 数据长度错误,返回失败 */ + chRetVal = CI_ERROR; + } + else + { + chRetVal = CI_SUCCESS; + /*先获取上一周期是存储进路办理命令数*/ + while (wTmpDataLen < hlhtGalHead.totalDataLen) + { + /* 一条应用数据长度 */ + wMsgLen = ShortFromChar(&dataBuf[ii]); + ii += 2u; + wTmpDataLen += 2U; + wTmpDataLen += wMsgLen; + if (0u == wMsgLen) + { + ; /* 无处理,继续解析下一包 */ + } + else + { + /* 获取报文类型 */ + wMsgType = ShortFromChar(&dataBuf[ii]); + ii += 2u; + + /* 跳过预留 */ + ii += 2u; + wMsgCheckLen = wMsgLen - 4u; + switch (wMsgType) + { + case ATS_CI_INFO_TYPE_HEART_STATE: + /* 解析心跳信息 */ + ii += wMsgCheckLen; + break; + case ATS_CI_INFO_TYPE_GATEWAY_COMMON: + /* 解析既有信息 */ + chRetVal = ParseGateWayToCiDataFrame(dataBuf, &ii, wMsgCheckLen); + chExistCmdDataFlag = 1U; /*先设置存在命令数据标志有效,数据解析不过在下面置为无效*/ + break; + case ATS_CI_INFO_FST_DS_CANCEL: + case ATS_CI_INFO_FST_SWIUNFLOCK: + case ATS_CI_INFO_FST_FAULTUNLOCK: + case ATS_CI_INFO_FST_SECUNFLOCK: + case ATS_CI_INFO_FST_SIGUNFLOCK: + case ATS_CI_INFO_FST_ZONGRENJIE: + case ATS_CI_INFO_FST_PSD_UNEXCEPT: + chCurSystemAreaState = GetLocalCiBackUpPattern(); + if (SYSTEM_WORK_MODE_MAIN == chCurSystemAreaState) + { + /*主用解析操作命令,必须检查当前该包数据是否已经处理过*/ + dwReciveCmdDataAtsCycNum = GetReciveCmdDataAtsCycNum(CI_SYSTEM_TYPE_ATS, chDeciveId); + dwSystemUpdateMainUseCycNum = GetSystemUpdateMainUseCycNum(); + + if ((dwReciveCmdDataAtsCycNum < hlhtGalHead.crntOwnMsgSN) || + (dwSystemUpdateMainUseCycNum <= hlhtGalHead.recvOppMsgSN)) + { + /*当前ATS发送数据时的周期号大于接收到ATS数据时ATS周期号 + 或当前ATS发送数据时的联锁周期号大于等于当前系统升级主用起始周期号*/ + wIndex = (wMsgType - ATS_CI_INFO_FST_DS_CANCEL) / 4; + if ((FOLLOWUP_MSGID_MAX > wIndex) && (ATS_CI_INFO_TYPE_FIRST_LEN == wMsgCheckLen)) + { + chRetVal = ProcessCmdFirstMsgCheck(dataBuf, ii, &tempFstCmd[wIndex]); + ii += ATS_CI_INFO_TYPE_FIRST_LEN; + chExistCmdDataFlag = 1U; /*先设置存在命令数据标志有效,数据解析不过在下面置为无效*/ + } + else + { + chRetVal = CI_ERROR;/*越界防护*/ + } + + } + else + { + ii += wMsgCheckLen; + /*已经被另外一机处理过了*/ + debug_infor_printf((char*)"\nATS/Xiandi %d Not Deal FstCmd%d,Because curCmd has been processed by another System,dwReciveCmdDataAtsCycNum %d dwSystemUpdateMainUseCycNum %d\n", chDeciveId, wMsgType, dwReciveCmdDataAtsCycNum, dwSystemUpdateMainUseCycNum); + } + } + break; + case ATS_CI_INFO_SND_DS_CANCEL: + case ATS_CI_INFO_SND_SWIUNFLOCK: + case ATS_CI_INFO_SND_FAULTUNLOCK: + case ATS_CI_INFO_SND_SECUNFLOCK: + case ATS_CI_INFO_SND_SIGUNFLOCK: + case ATS_CI_INFO_TYPE_SND_ZRJ: + case ATS_CI_INFO_SND_PSD_UNEXCEPT: + chCurSystemAreaState = GetLocalCiBackUpPattern(); + if (SYSTEM_WORK_MODE_MAIN == chCurSystemAreaState) + { + /*主用解析操作命令,必须检查当前该包数据是否已经处理过*/ + dwReciveCmdDataAtsCycNum = GetReciveCmdDataAtsCycNum(CI_SYSTEM_TYPE_ATS, chDeciveId); + dwSystemUpdateMainUseCycNum = GetSystemUpdateMainUseCycNum(); + + if ((dwReciveCmdDataAtsCycNum < hlhtGalHead.crntOwnMsgSN) || + (dwSystemUpdateMainUseCycNum <= hlhtGalHead.recvOppMsgSN)) + { + wIndex = (wMsgType - ATS_CI_INFO_SND_DS_CANCEL) / 4; + if ((FOLLOWUP_MSGID_MAX > wIndex) && (ATS_CI_INFO_TYPE_SND_LEN == wMsgCheckLen)) + { + chRetVal = ProcessCmdSndMsgCheck(dataBuf, ii, &tempSndCmd[wIndex]); + ii += ATS_CI_INFO_TYPE_SND_LEN; + chExistCmdDataFlag = 1U; /*先设置存在命令数据标志有效,数据解析不过在下面置为无效*/ + } + else + { + chRetVal = CI_ERROR;/*越界防护*/ + } + } + else + { + ii += wMsgCheckLen; + /*已经被另外一机处理过了*/ + debug_infor_printf((char*)"\nATS/Xiandi %d Not Deal SndCmd%d,Because curCmd has been processed by another System,dwReciveCmdDataAtsCycNum %d dwSystemUpdateMainUseCycNum %d\n", chDeciveId, wMsgType, dwReciveCmdDataAtsCycNum, dwSystemUpdateMainUseCycNum); + } + } + break; + default: + chRetVal = CI_ERROR; + break; + } + } + if (CI_ERROR == chRetVal) + { + chExistCmdDataFlag = 0U; + break; + } + else + { + ; /*do nothing*/ + } + } + } + + /*校验数据长度*/ + if ((hlhtGalHead.totalDataLen != ii - (UINT16)31U) || (dataLength != hlhtGalHead.totalDataLen + (UINT16)31U)) + { + /* 31为应用数据帧头长度 */ + chRetVal = CI_ERROR; + debug_infor_printf((char*)"ParseGateWayToCiDataProc HlhtGal Length Error\n"); + } + + if (CI_SUCCESS != chRetVal) + { + /*清除本次存储的命令信息*/ + ClearCurGateWayMsg(); + } + else + { + /*将临时一二次信息拷贝到全局变量*/ + for (wIndex = 0U; wIndex < FOLLOWUP_MSGID_MAX; wIndex++) + { + if (FLAG_SET == tempFstCmd[wIndex].chFlag) + { + wMsgTypeTmp = ATS_CI_INFO_FST_DS_CANCEL + wIndex*(UINT16)4U; + pGlobalFst = GetAtsFollowUpMsgFst(wMsgTypeTmp); + if (NULL != pGlobalFst) + { + (void)CommonMemCpy((void *)(pGlobalFst), (UINT32)sizeof(AtsFollowUpCmdFstStru), (const void *)(&tempFstCmd[wIndex]), (UINT32)sizeof(AtsFollowUpCmdFstStru)); + } + } + if (FLAG_SET == tempSndCmd[wIndex].chFlag) + { + wMsgTypeTmp = ATS_CI_INFO_SND_DS_CANCEL + wIndex*(UINT16)4U; + pGlobalSnd = GetAtsFollowUpMsgSnd(wMsgTypeTmp); + if (NULL != pGlobalSnd) + { + (void)CommonMemCpy((void *)(pGlobalSnd), (UINT32)sizeof(AtsFollowUpCmdSndStru), (const void *)(&tempSndCmd[wIndex]), (UINT32)sizeof(AtsFollowUpCmdSndStru)); + } + } + } + } + + if (CI_SUCCESS == chRetVal) + { + /*数据经过校验,需要存储通用报文上下文*/ + SetHLHTHeadCtxComPeriod(CI_SYSTEM_TYPE_ATS, chDeciveId, hlhtGalHead.comPeriod); + SetHLHTHeadCtxSrcCrntSN(CI_SYSTEM_TYPE_ATS, chDeciveId, hlhtGalHead.crntOwnMsgSN); + SetHLHTHeadCtxSrcOppSN(CI_SYSTEM_TYPE_ATS, chDeciveId, hlhtGalHead.recvOppMsgSN); + SetHLHTHeadCtxSrcOwnSN(CI_SYSTEM_TYPE_ATS, chDeciveId, hlhtGalHead.preOwnMsgSN); + SetHLHTHeadCtxCiRcvSN(CI_SYSTEM_TYPE_ATS, chDeciveId, dwCurCycNum); + SetHLHTHeadCtxCiRcvLogId(CI_SYSTEM_TYPE_ATS, chDeciveId, 0U); + + chGalHeadSaved = 1U; + + if (1U == chExistCmdDataFlag) + { + UpdateAtsCmdDataCycInfo(CI_SYSTEM_TYPE_ATS, chDeciveId); + } + else + { + ; /*不更新最近一次收到ATS命令数据周期号*/ + } + } + else + { + ; + } + } + else + { + chRetVal = CI_ERROR; + } + } + else if (HLHT_HEAD_INIT == chHeadReval) + { + if (dwCurCycNum > 0U)/*判断序号大于0,因为把0当做无效序号*/ + { + SetHLHTHeadCtxComPeriod(CI_SYSTEM_TYPE_ATS, chDeciveId, hlhtGalHead.comPeriod); + SetHLHTHeadCtxSrcCrntSN(CI_SYSTEM_TYPE_ATS, chDeciveId, hlhtGalHead.crntOwnMsgSN); + SetHLHTHeadCtxSrcOppSN(CI_SYSTEM_TYPE_ATS, chDeciveId, hlhtGalHead.recvOppMsgSN); + SetHLHTHeadCtxSrcOwnSN(CI_SYSTEM_TYPE_ATS, chDeciveId, hlhtGalHead.preOwnMsgSN); + SetHLHTHeadCtxCiRcvSN(CI_SYSTEM_TYPE_ATS, chDeciveId, dwCurCycNum); + SetHLHTHeadCtxCiRcvLogId(CI_SYSTEM_TYPE_ATS, chDeciveId, 0U); + + chGalHeadSaved = 1U; + } + + chRetVal = CI_ERROR; + } + else + { + /*记录校验失败信息*/ + if (GAL_COMPARE_INFO_TYPE_ERR == (dwErrCode & GAL_COMPARE_INFO_TYPE_ERR)) + { + /*记录接口信息类型错误*/ + SetErrorData(EFUNC_PARSE_GATEWAY2CI_DATA, CI_SYSTEM_TYPE_ATS, wTiocRcvAtsGtwyDevTypeId, ETYPE_COMM_WITH_GATEWAY, CI_BACK_DATA_INFO_TYPE_ERR, ESEND_LEVEL_ZERO); + } + else if (GAL_COMPARE_SEND_FLAG_ERR == (dwErrCode & GAL_COMPARE_SEND_FLAG_ERR)) + { + /*发送方标识信息错误*/ + SetErrorData(EFUNC_PARSE_GATEWAY2CI_DATA, CI_SYSTEM_TYPE_ATS, wTiocRcvAtsGtwyDevTypeId, ETYPE_COMM_WITH_GATEWAY, CI_BACK_DATA_SEND_FLAG_ERR, ESEND_LEVEL_ZERO); + } + else if (GAL_COMPARE_RECV_FLAG_ERR == (dwErrCode & GAL_COMPARE_RECV_FLAG_ERR)) + { + /*数据接收方标志信息错误*/ + SetErrorData(EFUNC_PARSE_GATEWAY2CI_DATA, CI_SYSTEM_TYPE_ATS, wTiocRcvAtsGtwyDevTypeId, ETYPE_COMM_WITH_GATEWAY, CI_BACK_DATA_RECV_FLAG_ERR, ESEND_LEVEL_ZERO); + } + else if (GAL_COMPARE_EMAP_VER_COMP_ERR == (dwErrCode & GAL_COMPARE_EMAP_VER_COMP_ERR)) + { + /*数据版本校验失败信息*/ + SetErrorData(EFUNC_PARSE_GATEWAY2CI_DATA, CI_SYSTEM_TYPE_ATS, wTiocRcvAtsGtwyDevTypeId, ETYPE_COMM_WITH_GATEWAY, CI_BACK_DATA_VER_CHECK_FAIL, ESEND_LEVEL_ATS); + } + else if (GAL_COMPARE_PROTOCOL_VER_ERR == (dwErrCode & GAL_COMPARE_PROTOCOL_VER_ERR)) + { + /*数据协议版本号错误*/ + SetErrorData(EFUNC_PARSE_GATEWAY2CI_DATA, CI_SYSTEM_TYPE_ATS, wTiocRcvAtsGtwyDevTypeId, ETYPE_COMM_WITH_GATEWAY, CI_BACK_DATA_PROTOCOL_VER_ERR, ESEND_LEVEL_ZERO); + } + else if (GAL_COMPARE_MSG_BDS_SN_ERR == (dwErrCode & GAL_COMPARE_MSG_BDS_SN_ERR)) + { + /*双方序列号错误*/ + SetErrorData(EFUNC_PARSE_GATEWAY2CI_DATA, CI_SYSTEM_TYPE_ATS, wTiocRcvAtsGtwyDevTypeId, ETYPE_COMM_WITH_GATEWAY, CI_BACK_DATA_MSG_BDS_SN_ERR, ESEND_LEVEL_ZERO); + } + else if (GAL_COMPARE_APP_LEN_ERR == (dwErrCode & GAL_COMPARE_APP_LEN_ERR)) + { + /*应用层数据长度无效*/ + SetErrorData(EFUNC_PARSE_GATEWAY2CI_DATA, CI_SYSTEM_TYPE_ATS, wTiocRcvAtsGtwyDevTypeId, ETYPE_COMM_WITH_GATEWAY, CI_BACK_DATA_APP_LEN_ERR, ESEND_LEVEL_ZERO); + } + else + { + /*记录通信故障码*/ + SetErrorData(EFUNC_PARSE_GATEWAY2CI_DATA, CI_SYSTEM_TYPE_ATS, wTiocRcvAtsGtwyDevTypeId, ETYPE_COMM_WITH_GATEWAY, CI_ERROR, ESEND_LEVEL_ZERO); + } + chRetVal = CI_ERROR; + } + } + + if ((CI_ERROR == chRetVal) && (0u == chGalHeadSaved)) + { + /*如果通用头已经保存了,则不执行清除通用头操作,否则,出错后也将清除通用头*/ + ClearHlhtHeadCtx(CI_SYSTEM_TYPE_ATS, chDeciveId); + } + else + { + ; /*do nothing*/ + } + } + else + { + /*数据无效*/ + chRetVal = CI_ERROR; + } + return chRetVal; +} + +/* +* 功能描述: 组网关数据-按照接口类型区分有无GAL +* 参数说明: QueueStruct* ciToAtsDataQueue, 组包发送队列地址 +* const UINT8 deviceId, 目标系统ID +* const UINT8 targetDevType, 目标系统类型 +* const UINT8 frame,帧类型 +* UINT8* chSendXiandiorAtsBuf 码位数据数组首地址 +* 返回值 : 0: 组包失败 +* 1: 组包成功 +* fan 20260604 +*/ +UINT8 PackCiToGateWayDataProc(const UINT8 deviceId, const UINT8 targetDevType) +{ + UINT8 ciToGateWayBuffer[CI_TO_ATS_DATA_LEN_MAX] = { 0u }; + UINT16 ii = 0u; + UINT8 chReval = CI_ERROR; + UINT8 chAtsInterfaceType = 0U; /*ATS接口类型*/ + UINT8 chLocalCiId = GetSystemParaLocalCiId(); /*本地联锁ID*/ + UINT32 dwCiEtcsId = 0U; /*联锁互联互通ID*/ + UINT32 dwAtsEtcsId = 0U; /*ATS互联互通ID*/ + UINT32 dwEmapCheckVer = 0U; /*电子地图校验版本号*/ + UINT32 dwHlhtHSrcSN = 0U; /*向CI发送数据的一方发送报文时当前的SN*/ + UINT32 dwHlhtHRcvSN = 0U; /*CI接收到数据时本身的SN*/ + UINT32 dwCurCycleNum = Get2oo2CurCycleNum(); /*联锁应用周期号*/ + UINT32 dwAppCycleTime = GetSystemParaAppCycleTime(); /*联锁应用周期*/ + UINT16 wAppDataLenIndex = 0U; /* 应用数据长度位置 */ + UINT16 wAppDataLen = 0u; /* 应用数据长度 */ + UINT16 wMagLen = 0u; /* 单包数据长度 */ + UINT16 wMagDataLenIndex = 0U; /* 消息数据长度位置 */ + UINT16 dstDevId = 0u; + UINT8 chCurSystemAreaState = GetLocalCiBackUpPattern(); /*当前系统区域状态*/ + UINT32 dwFlyProtectOverCyc = GetFlyProtectOverCyc(); /*飞车*/ + chAtsInterfaceType = GetCiFunctionSwitchConfig(FUNC_GATEWAY_INTERFACE_IDENTIFIER); + if (ATS_INTERFACE_EXIST_GAL != chAtsInterfaceType) + { + /*旧数据结构运行无需GAL报文头*/ + chReval = PackTiocToGateWayData(ciToGateWayBuffer, targetDevType, &ii); + + } + else + { + /*新数据结构运行需要GAL报文头*/ + /*首先获取组包时所需的信息,获取成功才继续组包*/ + /*先用设备ID,后续可能用互联互通ID*/ + dwCiEtcsId = (UINT32)(CI_SYSTEM_TYPE_RCI * 256U + chLocalCiId); + dwAtsEtcsId = (UINT32)(targetDevType * 256U + deviceId); + chReval = GetCiEmapCheckVer(chLocalCiId, &dwEmapCheckVer, targetDevType); + dwHlhtHSrcSN = GetHLHTHeadCtxSrcCrntSN(targetDevType, deviceId); + dwHlhtHRcvSN = GetHLHTHeadCtxCiRcvSN(targetDevType, deviceId); + + if (CI_SUCCESS == chReval) + { + /*组GAL包头*/ + ShortToChar(ATS_CI_INTERFACE_INFOTYPE, &ciToGateWayBuffer[ii]);/*接口信息类型*/ + ii += 2u; + LongToChar(dwCiEtcsId, &ciToGateWayBuffer[ii]);/*发送方标识信息*/ + ii += 4u; + LongToChar(dwAtsEtcsId, &ciToGateWayBuffer[ii]);/*接收方标识信息*/ + ii += 4u; + LongToChar(dwEmapCheckVer, &ciToGateWayBuffer[ii]);/*电子地图版本校验信息*/ + ii += 4u; + LongToChar(dwCurCycleNum, &ciToGateWayBuffer[ii]);/*本方消息序列号*/ + ii += 4u; + ShortToChar((UINT16)dwAppCycleTime, &ciToGateWayBuffer[ii]);/*设备通讯周期*/ + ii += 2u; + LongToChar(dwHlhtHSrcSN, &ciToGateWayBuffer[ii]);/*对方消息序列号:recvOppMsgSN记录收到对方上一条消息中的对方消息序列号*/ + ii += 4u; + LongToChar(dwHlhtHRcvSN, &ciToGateWayBuffer[ii]);/*收到上一条消息时本方序列号*/ + ii += 4u; + + ciToGateWayBuffer[ii++] = 1U; /*CI_ATS接口协议版本号*/ + /*应用层数据长度*/ + wAppDataLenIndex = ii; + ii += 2u; + + wMagDataLenIndex = ii; + ii += 2U; + if (RC_WORK_MODE_CI == CI_SYSTEM_TYPE_RCI) + { + ShortToChar(RCI_ATS_INFO_TYPE_GATEWAY_HEART, &ciToGateWayBuffer[ii]);/* 报文类型 */ + ii += 2u; + /* 预留2字节 */ + ii += 2u; + } + else + { + ShortToChar(ATS_CI_INFO_TYPE_GATEWAY_COMMON, &ciToGateWayBuffer[ii]);/* 报文类型 */ + ii += 2u; + /* 预留2字节 */ + ii += 2u; + + chReval = PackTiocToGateWayData(ciToGateWayBuffer, targetDevType, &ii); + } + wMagLen = ii - wMagDataLenIndex - 2U; + /* 组数据长度 */ + ShortToChar(wMagLen, &ciToGateWayBuffer[wMagDataLenIndex]); + /*进行一次、二次回复单独信息帧组包*/ + /*主用模式、未飞车*/ + if ((CI_SUCCESS == chReval)&& (SYSTEM_WORK_MODE_MAIN == chCurSystemAreaState)&& ( 0U == dwFlyProtectOverCyc)) + { + chReval = PackCiToAtsFollowUpMsg(ciToGateWayBuffer, &ii, targetDevType, PACK_ATS_TYPE_GATEWAY); + } + } + + /* 填充数据长度 */ + if (CI_SUCCESS == chReval) + { + wAppDataLen = ii - wAppDataLenIndex - 2U; + ShortToChar(wAppDataLen, &ciToGateWayBuffer[wAppDataLenIndex]); + } + else + { + ; + } + } + if ((ii > CI_TO_ATS_DATA_LEN_MAX) || (CI_ERROR == chReval)) + { + chReval = CI_ERROR; + } + else + { + /* 向外发送 */ + dstDevId = ((UINT16)((UINT16)targetDevType << 8u) | ((UINT16)deviceId)); + chReval = OutnetSafeSend(dstDevId, 0u, &ciToGateWayBuffer[0], ii); + if (CI_SUCCESS == chReval) + { + debug_infor_printf((char*)"\nGATEWAY_SEND:%d", ii); + debug_out_array(0xAA, ciToGateWayBuffer, ii); + } + else + { + ; + } + } + + return chReval; +} + +/* +* 功能描述: 网关信息解析失败、清除既有已经存储的本周期收到网关信息 +* 参数说明: 无 +* 返回值 :无 +* fan 20260604 +*/ +void ClearCurGateWayMsg(void) +{ + /*远程筛选消息*/ + UINT32 dwCurCycNum = Get2oo2CurCycleNum(); /*当前周期号*/ + if (dwCurCycNum == g_strAtsMsgFst.dwCycle) + { + ClearAtsMsgFirst(); + } + if (dwCurCycNum == g_strAtsMsgSnd.dwCycle) + { + ClearAtsMsgSecond(); + } + if (FLAG_SET == g_strSndAtsCfmFst.chFlag)/*第二个反馈信息解析时直接存储至反馈并设置标志*/ + { + ClearSndAtsScreenFstCfmMsg(); + } + if (dwCurCycNum == g_strAtsEaMsgFst.dwCycle) + { + ClearAtsEaMsgFirst(); + } + if (dwCurCycNum == g_strAtsEaMsgSnd.dwCycle) + { + ClearAtsEaMsgSecond(); + } + if (FLAG_SET == g_strSndAtsEaCfmFst.chFlag)/*第二个反馈信息解析时直接存储至反馈并设置标志*/ + { + ClearSndAtsEaFstCfmMsg(); + } + if (dwCurCycNum == g_strAtsWlbMsgFst.dwCycle) + { + ClearAtsWlbMsgFirst(); + } + if (dwCurCycNum == g_strAtsWlbMsgSnd.dwCycle) + { + ClearAtsWlbMsgSecond(); + } + if (FLAG_SET == g_strSndAtsWlbCfmFst.chFlag)/*第二个反馈信息解析时直接存储至反馈并设置标志*/ + { + ClearSndAtsWlbFstCfmMsg(); + } + if (dwCurCycNum == g_strAtsDaMsgFst.dwCycle) + { + ClearAtsDaMsgFirst(); + } + if (dwCurCycNum == g_strAtsDaMsgSnd.dwCycle) + { + ClearAtsDaMsgSecond(); + } + if (FLAG_SET == g_strSndAtsDaCfmFst.chFlag)/*第二个反馈信息解析时直接存储至反馈并设置标志*/ + { + ClearSndAtsDaFstCfmMsg(); + } } \ No newline at end of file diff --git a/TSCP/src/APP/ciapp/ParsePack/ParsePackGateWayData.h b/TSCP/src/APP/ciapp/ParsePack/ParsePackGateWayData.h index 3ab0acb..b54ba8d 100644 --- a/TSCP/src/APP/ciapp/ParsePack/ParsePackGateWayData.h +++ b/TSCP/src/APP/ciapp/ParsePack/ParsePackGateWayData.h @@ -253,20 +253,21 @@ extern AtsMsgCfmStru * GetAtsCfmFst(void); extern AtsMsgCfmStru * GetAtsCfmSnd(void); /** -* @brief 获取远程筛选二次确认消息 +* @brief 组TIOC到网关数据--既有信息 * @param 无 -* @return 远程筛选二次确认消息 +* @return CI_ERROR失败;CI_SUCCESS成功 */ -extern UINT8 PackTiocToGateWayData(const UINT8 deviceId, const UINT8 targetDevType); +UINT8 PackTiocToGateWayData(UINT8* szToGateWayDataBuf, const UINT8 targetDevType, UINT16* wDataIndex); /** -* @brief 解析网关数据帧 +* @brief 解析网关数据帧---无GAL部分消息反馈内容 * @param const UINT8* dataBuf, 数据缓冲区 -* @param const UINT16 dataLength, 数据长度 +* @param[out] UINT16* dataIndex, 数据索引 +* @param[in] const UINT16 dataLength, 数据长度 * @return CI_SUCCESS:成功;CI_ERROR:失败 */ -extern UINT8 ParseGateWayToCiDataFrame(const UINT8* dataBuf, const UINT16 dataLength); +UINT8 ParseGateWayToCiDataFrame(const UINT8* dataBuf, UINT16* dataIndex, const UINT16 dataLength); /** * @brief 清除1次ATS筛选信息 @@ -449,4 +450,34 @@ void ClearSndAtsWlbFstCfmMsg(void); */ void ClearSndAtsDaFstCfmMsg(void); +/** +* @brief 解析网关数据帧--按照接口类型区分有无GAL +* @param const UINT8* dataBuf, 数据缓冲区 +* @param const UINT16 dataLength, 数据长度 +* @note Created By fan 20260604 +* @return CI_SUCCESS:成功;CI_ERROR:失败 +*/ +UINT8 ParseGateWayToCiDataProc(const UINT8* dataBuf, const UINT16 dataLength); + +/* +* 功能描述: 组网关数据-按照接口类型区分有无GAL +* 参数说明: QueueStruct* ciToAtsDataQueue, 组包发送队列地址 +* const UINT8 deviceId, 目标系统ID +* const UINT8 targetDevType, 目标系统类型 +* const UINT8 frame,帧类型 +* UINT8* chSendXiandiorAtsBuf 码位数据数组首地址 +* 返回值 : 0: 组包失败 +* 1: 组包成功 +* fan 20260604 +*/ +UINT8 PackCiToGateWayDataProc(const UINT8 deviceId, const UINT8 targetDevType); + +/* +* 功能描述: 网关信息解析失败、清除既有已经存储的本周期收到网关信息 +* 参数说明: 无 +* 返回值 :无 +* fan 20260604 +*/ +void ClearCurGateWayMsg(void); + #endif \ No newline at end of file diff --git a/TSCP/src/APP/ciapp/ParsePack/ParsePackManage.c b/TSCP/src/APP/ciapp/ParsePack/ParsePackManage.c index 812b205..8b7fa8f 100644 --- a/TSCP/src/APP/ciapp/ParsePack/ParsePackManage.c +++ b/TSCP/src/APP/ciapp/ParsePack/ParsePackManage.c @@ -290,7 +290,7 @@ UINT8 ParseOtherSysToCiData(void) debug_infor_printf((const)"\nGATEWAY_RECV:%d", dataLen); debug_out_array(0xAA, data, (UINT16)dataLen); - checkResult = ParseGateWayToCiDataFrame(data, (UINT16)dataLen); + checkResult = ParseGateWayToCiDataProc(data, (UINT16)dataLen); } if (CI_ERROR == checkResult) @@ -881,7 +881,7 @@ UINT8 PackCiToOtherSysData(void) if (chTiocRcvAtsGtwyDevTypeId == deviceIdBuf[ii]) { /*组ATS站场帧数据*/ - reVal = PackTiocToGateWayData(deviceIdBuf[ii], CI_SYSTEM_TYPE_ATS); + reVal = PackCiToGateWayDataProc(deviceIdBuf[ii], CI_SYSTEM_TYPE_ATS); if (CI_ERROR == reVal) { @@ -1256,6 +1256,8 @@ UINT8 PackCiToOtherSysData(void) PackCiToCimFlyProtectData(); /*发送维护机IO双系采集不一致报警*/ PackCiToCimCollDiffData(); + /*发送道岔冗余采集报警*/ + PackCiToCimSwitchRedunAlarmData(); /*发送给AIM退出运营信息*/ AIMOutput(); /*发送给维护机执行单元报警信息*/ diff --git a/TSCP/src/APP/ciapp/ParsePack/ParsePackOcData.c b/TSCP/src/APP/ciapp/ParsePack/ParsePackOcData.c index 622e8c6..8b30406 100644 --- a/TSCP/src/APP/ciapp/ParsePack/ParsePackOcData.c +++ b/TSCP/src/APP/ciapp/ParsePack/ParsePackOcData.c @@ -253,7 +253,7 @@ UINT8 PackCiToOcData( UINT8 deviceId) UINT8 chMainCotrolOCId = 0U; UINT8 chControlCmd = 0U; UINT8 chControlCmdNum = 0u; - UINT16 cmdIndex = 0u; + UINT32 cmdIndex = 0u; UINT8 chOcOutControlCmd = 0u; UINT8 chOcFindPostionCmd = 0u; UINT8 chLocalCiOCSswitch = 0u; @@ -348,11 +348,11 @@ UINT8 PackCiToOcData( UINT8 deviceId) {/*有OC-S且当前无主控,需寻表*/ drvCmd = OC_SWITCH_DRIVE_POS_KEEP;/*保持*/ - chOcOutControlCmd = GetSwitchThisOcOutControlCmd(pOcData->OcDevices[kk].DeviceId, pOcData->OcId); + chOcOutControlCmd = GetSwitchThisOcOutControlCmd(pOcData->OcDevices[kk].DeviceId, (UINT8)pOcData->OcId); if (MAIN_CONTROL == chOcOutControlCmd) { - chOcFindPostionCmd = GetSwitchThisOcFindPostionCmd(pOcData->OcDevices[kk].DeviceId, pOcData->OcId); + chOcFindPostionCmd = GetSwitchThisOcFindPostionCmd(pOcData->OcDevices[kk].DeviceId, (UINT8)pOcData->OcId); drvCmd = ConvertSwitchFindPosToSwFindCmd(chOcFindPostionCmd); } } @@ -680,8 +680,8 @@ UINT8 PackCiToOcData( UINT8 deviceId) ii += 2u; if (OC_S_ON == chLocalCiOCSswitch) {/*OS-S开关打开*/ - chControlCmd = GetSwitchThisOcOutControlCmd(pOcData->OcDevices[kk].DeviceId, pOcData->OcId); - if ((MAIN_CONTROL == chControlCmd) || (STANDBY_CONTROL == chControlCmd) || (NO_CONTROL_FUN == chControlCmd)) + chControlCmd = GetSwitchThisOcOutControlCmd(pOcData->OcDevices[kk].DeviceId, (UINT8)pOcData->OcId); + if ((MAIN_CONTROL == chControlCmd) || (STANDBY_CONTROL == chControlCmd)) { Ci2OcDataBuffer[ii] = chControlCmd; } @@ -701,6 +701,7 @@ UINT8 PackCiToOcData( UINT8 deviceId) } default: {/*无执行*/ + break; } } } @@ -1198,7 +1199,7 @@ UINT8 ParseOcToCiDataFrame(const UINT8* dataBuf, const UINT16 dataLength,const U UINT32 dwUpToMainCyc = 0U;/*本机升主机周期号*/ UINT32 CiRecvOcSN = 0U;/*同步的CI数据中OC周期号*/ HLHTHeadContextStru* pstrHlhtHeadCtx = NULL; /*CI同步的互联互通报文头上下文数据*/ - UINT32 dwMainStandbyState = 0U; + UINT8 dwMainStandbyState = 0U; UINT8 chSwitchBelongOThisOCRet = 0U; @@ -1262,7 +1263,7 @@ UINT8 ParseOcToCiDataFrame(const UINT8* dataBuf, const UINT16 dataLength,const U localCiId = GetSystemParaLocalCiId(); /*获取联锁ID*/ wCiName = (CI_SYSTEM_TYPE_RCI)* 256U + localCiId; - headRet = HLHTRecvCommonPacketHeadCheck(ocName, wCiName, CI_OC_INTERFACE_INFOTYPE, CI_OC_PRTCL_VER, &hlhtGalHead, &errCode, 0u, CI_SYSTEM_TYPE_OC); + headRet = HLHTRecvCommonPacketHeadCheck(ocName, wCiName, CI_OC_INTERFACE_INFOTYPE, (UINT8)CI_OC_PRTCL_VER, &hlhtGalHead, &errCode, 0u, CI_SYSTEM_TYPE_OC); transmitBadEnsureTime = GetCiAndOcTransmitBadEnsureTime(); debug_infor_printf((const)"\nOC %d GAL Check Result:%d errCode:%d\n", systemId, headRet, errCode); /*0x55正确,0xaa错误,0x33初始通信帧*/ @@ -1302,7 +1303,7 @@ UINT8 ParseOcToCiDataFrame(const UINT8* dataBuf, const UINT16 dataLength,const U { chUsableCycCheck = CI_SUCCESS; } - if (0U < ocInfoRemainValidity) + if (0 < ocInfoRemainValidity) { /*解析应用数据*/ wApplyDataLenth = ShortFromChar(&dataBuf[ii]);/*应用层数据长度*/ @@ -2172,7 +2173,7 @@ INT16 GetIndexBySignalId(UINT16 sigId) * 参数说明: UINT16 swId 道岔ID,UINT8 ocId OCID * 返回值 : 索引 */ -INT16 GetIndexBySwitchId(UINT16 swId,UINT16 ocId) +INT16 GetIndexBySwitchId(UINT16 swId,UINT8 ocId) { INT16 retIndex = -1; @@ -2180,7 +2181,7 @@ INT16 GetIndexBySwitchId(UINT16 swId,UINT16 ocId) for (i=0u;iDeviceType == OC_DEVICE_TYPE_SIGNAL) {/*信号机*/ ind = GetIndexBySignalId(pOcDevice->DeviceId); - if ((ind >=0) && (OC_DEVICE_TYPE_SIGNAL == pOcDevice->DeviceType)) + if (ind >=0) { if ((m_Signals[ind].OcId == pOcDevice->OcId) && (m_Signals[ind].DeviceId == pOcDevice->DeviceId)) @@ -2429,18 +2431,18 @@ void ConvertOcOriginDataToOcSigSwDev(UINT8 devId) m_Switches[ind].MainStandbyState[k] = pOcDevice->MainStandbyState[k]; } - chSwitchszPlusBoxId = GetSwitchszPlusBoxId(m_Switches[ind].DeviceId, m_Switches[ind].OcId); + chSwitchszPlusBoxId = GetSwitchszPlusBoxId(m_Switches[ind].DeviceId,(UINT8)m_Switches[ind].OcId); for (k = 0U; k < m_OcToCiOrginDataArr[i].chPbNum; k++) { if (chSwitchszPlusBoxId == m_OcToCiOrginDataArr[i].szPlusBox[k].chPbId) { if (SWITCH_BOX_NORMAL == m_OcToCiOrginDataArr[i].szPlusBox[k].chAsState) {/*正常*/ - SetSwitchOcPlusBoxSateState(m_Switches[ind].DeviceId, m_Switches[ind].OcId, SWITCH_BOX_NORMAL); + SetSwitchOcPlusBoxSateState(m_Switches[ind].DeviceId, (UINT8)m_Switches[ind].OcId, SWITCH_BOX_NORMAL); } else { - SetSwitchOcPlusBoxSateState(m_Switches[ind].DeviceId, m_Switches[ind].OcId, SWITCH_BOX_FAULT); + SetSwitchOcPlusBoxSateState(m_Switches[ind].DeviceId, (UINT8)m_Switches[ind].OcId, SWITCH_BOX_FAULT); } break; } @@ -2449,7 +2451,7 @@ void ConvertOcOriginDataToOcSigSwDev(UINT8 devId) /*将板卡故障状态导入*/ for (k = 0U; k < m_Switches[ind].BoardNum; k++) { - SetSwitchThisOCBoardState(m_Switches[ind].DeviceId, m_Switches[ind].OcId, m_Switches[ind].BoardAddr[k], m_Switches[ind].BoardState[k]); + SetSwitchThisOCBoardState(m_Switches[ind].DeviceId, (UINT8)m_Switches[ind].OcId, m_Switches[ind].BoardAddr[k], m_Switches[ind].BoardState[k]); } @@ -3012,6 +3014,7 @@ UINT8 OcInputSignalStateCheck(const UINT8 chInput) break; default: retVal = CI_ERROR; + break; } return retVal; } diff --git a/TSCP/src/APP/ciapp/ParsePack/ParsePackOcData.h b/TSCP/src/APP/ciapp/ParsePack/ParsePackOcData.h index 08b273a..98effdc 100644 --- a/TSCP/src/APP/ciapp/ParsePack/ParsePackOcData.h +++ b/TSCP/src/APP/ciapp/ParsePack/ParsePackOcData.h @@ -440,7 +440,7 @@ INT16 GetIndexBySignalId(UINT16 sigId); * 参数说明: UINT16 swId 道岔ID,UINT8 ocId OCID * 返回值 : 索引 */ -INT16 GetIndexBySwitchId(UINT16 swId, UINT16 ocId); +INT16 GetIndexBySwitchId(UINT16 swId, UINT8 ocId); /* * 功能描述: 通过轨道id获取索引 diff --git a/TSCP/src/APP/ciapp/ParsePack/ParsePackTmcData.c b/TSCP/src/APP/ciapp/ParsePack/ParsePackTmcData.c index 1eb06c9..92b90bc 100644 --- a/TSCP/src/APP/ciapp/ParsePack/ParsePackTmcData.c +++ b/TSCP/src/APP/ciapp/ParsePack/ParsePackTmcData.c @@ -364,7 +364,7 @@ UINT8 ParseTmcToTiocDataFrame(UINT8* dataBuf, UINT16 dataLength, UINT8 systemId) retVal = CI_ERROR; } - if ((CI_ERROR == retVal) || (0u == galHeadSaved)) + if ((CI_ERROR == retVal) && (0u == galHeadSaved)) { /*清除通用报文头*/ ClearHlhtHeadCtx(CI_SYSTEM_TYPE_TMC, systemId); diff --git a/TSCP/src/APP/ciapp/ParsePack/ParsePackVobcData.c b/TSCP/src/APP/ciapp/ParsePack/ParsePackVobcData.c index 2b35454..a999066 100644 --- a/TSCP/src/APP/ciapp/ParsePack/ParsePackVobcData.c +++ b/TSCP/src/APP/ciapp/ParsePack/ParsePackVobcData.c @@ -288,6 +288,13 @@ static UINT8 WashTrainRequestCheck(UINT8 Data); */ static UINT8 HeadWashStopSteadyInfoCheck(UINT8 Data); /* +* 功能描述: 联挂端洗车停稳信息接口校验 +* 参数说明: 入参:UINT8 Data 联挂端洗车停稳信息 +* 返回值 : CI_ERROR: 接口校验失败 +* CI_SUCESS: 接口校验成功 +*/ +static UINT8 CoupingWashStopStedInfoCheck(UINT8 Data); +/* * 功能描述: 暂停洗车请求信息接口校验 * 参数说明: 入参:UINT8 Data 暂停洗车请求信息 * 返回值 : CI_ERROR: 接口校验失败 @@ -1577,6 +1584,7 @@ static UINT8 ParseVobcToCiDataFrameHLHT(const UINT8* dataBuf, const UINT16 dataL UINT16 wMsgLen = 0U; /*应用数据长度*/ UINT32 dwCiAndVobcTransBadTime = 0U; /*ci和VOBC通信中断时间*/ UINT32 dwAppCycleTime = 0U; /*ci周期*/ + UINT8 trainZeroSpeedState = 0U; /*列车零速状态*/ ci_vobcPrtclVersion = GetVersionOfVOBCToCI(); vobcName = (CI_SYSTEM_TYPE_VOBC)*256U + systemId; @@ -1762,7 +1770,6 @@ static UINT8 ParseVobcToCiDataFrameHLHT(const UINT8* dataBuf, const UINT16 dataL ii += 4U; vobcToCiDataStru->signalID = signalId; /*将信号机ID保存到结构体*/ - } else { @@ -1777,6 +1784,23 @@ static UINT8 ParseVobcToCiDataFrameHLHT(const UINT8* dataBuf, const UINT16 dataL vobcToCiDataStru->ComStartCycle = Get2oo2CurCycleNum(); } break; + case VOBC_CI_INFO_TYPE_MANU_DEFINED: + {/*只解析报文内容*/ + /*列车零速状态*/ + trainZeroSpeedState = dataBuf[ii]; + ii += 1U; + if ((CI_VOBC_TRAIN_ZERO_SPEED_YES == trainZeroSpeedState) || (CI_VOBC_TRAIN_ZERO_SPEED_NO == trainZeroSpeedState)) + { + vobcToCiDataStru->chTrainZeroState = trainZeroSpeedState; + } + else + { + retVal = CI_ERROR; + } + ii += 9U; /*预留*/ + + } + break; case VOBC_CI_INFO_TYPE_BLOCLINK: /*点连式信息帧*/ { retVal = ParseVobcBlocLinkData(&dataBuf[ii], wMsgLen-4U, vobcToCiDataStru); @@ -2100,7 +2124,7 @@ static UINT8 PackCiToVobcDataHLHT(VobcToCiDataStruct *vobcToCiDataStru) UINT16 sigId = 0U; /*信号机ID*/ UINT32 curCycleNum = Get2oo2CurCycleNum(); UINT32 appCycleTime = GetSystemParaAppCycleTime(); - UINT8 retVal = CI_SUCCESS; + UINT8 retVal = CI_ERROR; UINT8 localCiId = GetSystemParaLocalCiId(); /*本地联锁ID*/ UINT32 ciEtcsId = 0U; UINT32 vobcEtcsId = 0U; @@ -2113,6 +2137,7 @@ static UINT8 PackCiToVobcDataHLHT(VobcToCiDataStruct *vobcToCiDataStru) UINT8 outStationSignalAllowOrNot = CI_VOBC_SIGNAL_DEFAULT; /*信号机的允许或禁止状态*/ UINT32 signalIdInterConn = 0U; /*互联互通4字节信号机ID*/ UINT16 wTempIndex = 0U; /*临时记录下标*/ + UINT8 chPackCheck = CI_SUCCESS; ci_vobcPrtclVersion = GetVersionOfVOBCToCI(); @@ -2158,7 +2183,7 @@ static UINT8 PackCiToVobcDataHLHT(VobcToCiDataStruct *vobcToCiDataStru) ii += 2U;/*预留两个字节*/ - if ((VOBC_CI_INFO_TYPE_PSD_CONTROL == vobcToCiDataStru->appInfoType) && (curCycleNum == vobcToCiDataStru->ComStartCycle)) + if (VOBC_CI_INFO_TYPE_PSD_CONTROL == vobcToCiDataStru->appInfoType) {/*只有当VOBC发送的信息类型是屏蔽门控制信息时,才组包如下内容;若信息类型为心跳帧,则只发送报文帧头(31+6)*/ LongToChar(vobcToCiDataStru->trackSecID,&CiToVobcDataBuffer[ii]);/*回复收到的轨道区段ID,依据CI-VOBCV2.9接口文档修改*/ ii += 4U; @@ -2305,16 +2330,18 @@ static UINT8 PackCiToVobcDataHLHT(VobcToCiDataStruct *vobcToCiDataStru) } else { - /*信息类型错误,什么都不做*/ + /*不组包发送上述帧*/ + chPackCheck = CI_ERROR; } /*组点连式信息*/ if (curCycleNum == vobcToCiDataStru->strBlocLinkData.chBlocLinkCycle) - { + { /*-由于可以和屏蔽门控制帧同时发,所以判点连式周期-*/ if (0U == CiToVobcDataBuffer[33U]) { - /*没有组其他信息帧,填充预留*/ + chPackCheck = CI_SUCCESS; + /*没有组其他信息帧,填充帧类型点连式*/ ShortToChar(CI_VOBC_INFO_TYPE_BLOCLINK, &CiToVobcDataBuffer[33U]); /*报文类型,两字节*/ PackVobcBlocLinkData(CiToVobcDataBuffer, &ii, vobcToCiDataStru); /*组点连式信息*/ /*应用层数据的报文长度 */ @@ -2339,26 +2366,32 @@ static UINT8 PackCiToVobcDataHLHT(VobcToCiDataStruct *vobcToCiDataStru) { /*不处理*/ } + if (CI_SUCCESS == chPackCheck) + { + /*通用报文头中应用层报文总长度*/ + CiToVobcDataBuffer[29U] = (UINT8)((UINT8)((ii - 31U) >> 8U) & 0xffU); + CiToVobcDataBuffer[30U] = (UINT8)((ii - 31U) & 0xffU); - /*通用报文头中应用层报文总长度*/ - CiToVobcDataBuffer[29U] = (UINT8) ((UINT8)((ii - 31U) >> 8U) & 0xffU); - CiToVobcDataBuffer[30U] = (UINT8) ((ii - 31U) & 0xffU); - - dstDevId = ((UINT16)CI_SYSTEM_TYPE_VOBC << 8U) | vobcToCiDataStru->VobcId; - outnetSafeSendRtn = OutnetSafeSend(dstDevId, 0U, &CiToVobcDataBuffer[0U], ii); - if (1U == outnetSafeSendRtn) - { /*写队列成功*/ + dstDevId = ((UINT16)CI_SYSTEM_TYPE_VOBC << 8U) | vobcToCiDataStru->VobcId; + outnetSafeSendRtn = OutnetSafeSend(dstDevId, 0U, &CiToVobcDataBuffer[0U], ii); + if (1U == outnetSafeSendRtn) + { /*写队列成功*/ #ifdef LOGPRINT/*日志打印宏*/ #ifdef PLATFORM_2OO2/*2oo2平台打印*/ - debug_infor_printf((const)"\nVOBC_CBTC_SEND:%d", ii); - debug_out_array(0xAA, CiToVobcDataBuffer, ii); + debug_infor_printf((const)"\nVOBC_CBTC_SEND:%d", ii); + debug_out_array(0xAA, CiToVobcDataBuffer, ii); #endif/*平台打印结束*/ #endif + } + else + { + /*写队列失败*/ + retVal = CI_ERROR; + } } else { - /*写队列失败*/ - retVal = CI_ERROR; + /*不组包*/ } } else @@ -3327,36 +3360,51 @@ static UINT8 PackCiToVobcDataFAOHLHT(VobcToCiDataStruct *vobcToCiDataStru) } } else - {/*无站台发车按钮给VOBC发送站台无发车按钮状态*/ - CiToVobcDataBuffer[ii] = PLATFORM_DEPAR_BUTTON_NO; + { + CiToVobcDataBuffer[ii] = PLATFORM_DEPAR_BUTTON_NO;;/*有些线路PSD不配置发车按钮继电器*/ } /* IBP盘发车按钮检查*/ if(PLATFORM_DEPAR_BUTTON_STATE_VALID != CiToVobcDataBuffer[ii]) { - if (PSD_BUTTON_PANGLU_STATE_VALID == psdButtonPangluState) + /*无效、无站台*/ + + /*检查IBP按钮状态*/ + wibpBtnRelayId = GetIbpConfmRelayId(psdId); + if ((0u != wibpBtnRelayId) && (UINT16_MAX != wibpBtnRelayId)) { - ; /* 站台按钮旁路*/ - } - else - { - /*之前发车按钮无效,需要检查IBP按钮状态*/ - wibpBtnRelayId = GetIbpConfmRelayId(psdId); - if ((0u != wibpBtnRelayId) && (UINT16_MAX != wibpBtnRelayId)) + if (PSD_BUTTON_PANGLU_STATE_VALID == psdButtonPangluState) { - chibpState = GetPsdButtonIbpState(psdId); /*IBP按钮状态*/ - if(PLATFORM_DEPAR_BUTTON_STATE_VALID == chibpState) - { - CiToVobcDataBuffer[ii] = chibpState; - } - else - { - ; /*保持原状态不变*/ - } + /*无站台发车按钮给VOBC发送站台关门按钮默认值*/ + CiToVobcDataBuffer[ii] = PSD_RELATED_BUTTON_STATE_DEFAULT; } else { - ; /*保持原状态不变*/ + chibpState = GetPsdButtonIbpState(psdId); /*IBP按钮状态(有效、无效、故障)*/ + /* 有效 》 默认 》 无效*/ + if (PLATFORM_DEPAR_BUTTON_STATE_INVALID == chibpState) + { + /*IBP按钮状态无效*/ + if (PSD_RELATED_BUTTON_STATE_DEFAULT == CiToVobcDataBuffer[ii]) + { + ;/*组默认*/ + } + else + { + /*站台发车按钮无效,给VOBC发送IBP按钮状态*/ + CiToVobcDataBuffer[ii] = chibpState; + } + } + else + { + /*IBP按钮状态有效或者默认,给VOBC发送站台:IBP按钮状态即可*/ + CiToVobcDataBuffer[ii] = chibpState; + } } + + } + else + { + ;/*无IBP、维持既有不动*/ } } else @@ -6163,33 +6211,47 @@ static UINT8 PackCiToIvocPsdInfo(UINT8* pDataBuf, UINT16 *wDataLength) {/*无站台发车按钮给VOBC发送站台无发车按钮状态*/ pDataBuf[ii] = CI_IVOC_PSD_PDB_NO_BUTTON; } - /* IBP盘发车按钮检查 */ + /* IBP盘发车按钮检查*/ if(PLATFORM_DEPAR_BUTTON_STATE_VALID != pDataBuf[ii]) { - if (PSD_BUTTON_PANGLU_STATE_VALID == psdButtonPangluState) + /*无效、无站台*/ + /*检查IBP按钮状态*/ + wibpBtnRelayId = GetIbpConfmRelayId(wPsdId); + if ((0u != wibpBtnRelayId) && (UINT16_MAX != wibpBtnRelayId)) { - ;/* 站台按钮旁路*/ - } - else - { - /*之前发车按钮无效,需要检查IBP按钮状态*/ - wibpBtnRelayId = GetIbpConfmRelayId(wPsdId); - if ((0u != wibpBtnRelayId) && (UINT16_MAX != wibpBtnRelayId)) + if (PSD_BUTTON_PANGLU_STATE_VALID == psdButtonPangluState) { - chibpState = GetPsdButtonIbpState(wPsdId); /*IBP按钮状态*/ - if(PLATFORM_DEPAR_BUTTON_STATE_VALID == chibpState) - { - pDataBuf[ii] = chibpState; - } - else - { - ; /*保持原状态不变*/ - } + /*无站台发车按钮给VOBC发送站台关门按钮默认值*/ + pDataBuf[ii] = PSD_RELATED_BUTTON_STATE_DEFAULT; } else { - ; /*保持原状态不变*/ + chibpState = GetPsdButtonIbpState(wPsdId); /*IBP按钮状态(有效、无效、故障)*/ + /* 有效 》 默认 》 无效*/ + if (PLATFORM_DEPAR_BUTTON_STATE_INVALID == chibpState) + { + /*IBP按钮状态无效*/ + if (PSD_RELATED_BUTTON_STATE_DEFAULT == pDataBuf[ii]) + { + ;/*组默认*/ + } + else + { + /*站台发车按钮无效,给VOBC发送IBP按钮状态*/ + pDataBuf[ii] = chibpState; + } + } + else + { + /*IBP按钮状态有效或者默认,给VOBC发送站台:IBP按钮状态即可*/ + pDataBuf[ii] = chibpState; + } } + + } + else + { + ;/*无IBP、维持既有不动*/ } } else @@ -6885,7 +6947,7 @@ static UINT8 PackCiToIvocFLockInfo(UINT8* pDataBuf, UINT16 *wDataLength) chStartLockStat = GetStartFLockFlag(); /*上电封锁状态*/ - if (CI_START_LOCK_NO == chStartLockStat) + if (CI_START_FLOCK_NO == chStartLockStat) { pDataBuf[ii] = CI_IVOC_ALLLINE_FLOCK_NO; } @@ -7394,6 +7456,8 @@ static UINT8 PackCiToIvocSleepTrainInfo(UINT8* pDataBuf, UINT16 *wDataLength) UINT16 wEnvelopeSendSumIndex = 0u; UINT16 wTrainId = 0u; UINT8 chLinkLogicDirUpAndDown = 0u; + UINT8 chTrainVirHeadScreenFlag = 0U;/*虚拟前筛标志*/ + UINT8 chTrainVirTailScreenFlag = 0U;/*虚拟后筛标志*/ if ((NULL == pDataBuf) || (NULL == wDataLength)) @@ -7481,8 +7545,16 @@ static UINT8 PackCiToIvocSleepTrainInfo(UINT8* pDataBuf, UINT16 *wDataLength) { chRetVal = CI_ERROR; } - /*前筛*/ - chHeadScreStat = strEnvelope.suspicHead; + /*前筛*/ + chTrainVirHeadScreenFlag = GetTrainVirHeadScreenPassFlag(wTrainId); + if (TRAIN_VIR_SCREEN_PASS_FLAG_VALID == chTrainVirHeadScreenFlag) + { + chHeadScreStat = CI_IVOC_HEAD_SCREEN_PASS; + } + else + { + chHeadScreStat = strEnvelope.suspicHead; + } if (CI_IVOC_HEAD_SCREEN_PASS == chHeadScreStat) { @@ -7497,8 +7569,16 @@ static UINT8 PackCiToIvocSleepTrainInfo(UINT8* pDataBuf, UINT16 *wDataLength) chRetVal = CI_ERROR; debug_infor_printf((const)"\n PackCiToIvocSleepTrainInfo HeadScreState_Error, state : %d \n", chHeadScreStat); } - /*后筛*/ - chTailScreStat = strEnvelope.suspicTail; + /*后筛*/ + chTrainVirTailScreenFlag = GetTrainVirTailScreenPassFlag(wTrainId); + if (TRAIN_VIR_SCREEN_PASS_FLAG_VALID == chTrainVirTailScreenFlag) + { + chTailScreStat = CI_IVOC_TAIL_SCREEN_PASS; + } + else + { + chTailScreStat = strEnvelope.suspicTail; + } if (CI_IVOC_TAIL_SCREEN_PASS == chTailScreStat) { pDataBuf[ii] |= BIT_VAL_00000001B << 4; /*后端筛选通过 01B*/ @@ -8983,34 +9063,49 @@ UINT8 PackCiToVobcDataFAOHLHToneSelf(VobcToCiDataStruct* vobcToCiDataStru) CiToVobcDataBuffer[ii] = PLATFORM_DEPAR_BUTTON_NO; } /* IBP盘发车按钮检查*/ + if(PLATFORM_DEPAR_BUTTON_STATE_VALID != CiToVobcDataBuffer[ii]) { - if ((PSD_BUTTON_PANGLU_STATE_VALID == psdButtonPangluState) || (1u == flag)) + /*无效、无站台*/ + + /*检查IBP按钮状态*/ + wibpBtnRelayId = GetIbpConfmRelayId(psdId); + if ((0u != wibpBtnRelayId) && (UINT16_MAX != wibpBtnRelayId)) { - ; - } - else - { - /*之前发车按钮无效,需要检查IBP按钮状态*/ - wibpBtnRelayId = GetIbpConfmRelayId(psdId); - if ((0u != wibpBtnRelayId) && (UINT16_MAX != wibpBtnRelayId)) + if (PSD_BUTTON_PANGLU_STATE_VALID == psdButtonPangluState) { - chibpState = GetPsdButtonIbpState(psdId); /*IBP按钮状态*/ - if(PLATFORM_DEPAR_BUTTON_STATE_VALID == chibpState) - { - CiToVobcDataBuffer[ii] = chibpState; - } - else - { - ; /*保持原状态不变*/ - } + /*无站台发车按钮给VOBC发送站台关门按钮默认值*/ + CiToVobcDataBuffer[ii] = PSD_RELATED_BUTTON_STATE_DEFAULT; } else { - ; /*保持原状态不变*/ + chibpState = GetPsdButtonIbpState(psdId); /*IBP按钮状态(有效、无效、故障)*/ + /* 有效 》 默认 》 无效*/ + if (PLATFORM_DEPAR_BUTTON_STATE_INVALID == chibpState) + { + /*IBP按钮状态无效*/ + if (PSD_RELATED_BUTTON_STATE_DEFAULT == CiToVobcDataBuffer[ii]) + { + ;/*组默认*/ + } + else + { + /*站台发车按钮无效,给VOBC发送IBP按钮状态*/ + CiToVobcDataBuffer[ii] = chibpState; + } + } + else + { + /*IBP按钮状态有效或者默认,给VOBC发送站台:IBP按钮状态即可*/ + CiToVobcDataBuffer[ii] = chibpState; + } } + + } + else + { + ;/*无IBP、维持既有不动*/ } - } else { @@ -9158,6 +9253,7 @@ UINT8 PackCiToVobcDataFAOHLHToneSelf(VobcToCiDataStruct* vobcToCiDataStru) CiToVobcDataBuffer[ii++] = washMachineState; /*5洗车机故障:0x55无故障,0xaa故障*/ CiToVobcDataBuffer[ii++] = washModeState; /*洗车模式:0x01:通过洗(侧洗),0x02:端洗(全洗)*/ CiToVobcDataBuffer[ii++] = chWashWorkModeBack; /*洗车模式设置反馈:5个取值*/ + CiToVobcDataBuffer[ii++] = GetCoupingWashAllowState(washMachineId); /*联挂端洗车允许通过:0x55允许通过,0xaa禁止通过*/ } else {/*本联锁集中区没有洗车机,发送默认值,洗车机故障状态发送采集信息*/ @@ -9168,6 +9264,7 @@ UINT8 PackCiToVobcDataFAOHLHToneSelf(VobcToCiDataStruct* vobcToCiDataStru) CiToVobcDataBuffer[ii++] = WASHMACHINE_COL_FALUT_NO_2; CiToVobcDataBuffer[ii++] = XTA_MODE_STATE_NO; CiToVobcDataBuffer[ii++] = WASH_WORKMODE_BACK_DEFAULT; + CiToVobcDataBuffer[ii++] = WASHMACHINE_COL_COUPINGWASH_NO; } ShortToChar(CI_VOBC_INFO_TYPE_FAO_INFO, &CiToVobcDataBuffer[33]);/*全自动运行洗车帧报文类型,两字节*/ @@ -9712,6 +9809,30 @@ static UINT8 HeadWashStopSteadyInfoCheck(UINT8 Data) return retVal; } +/* +* 功能描述: 联挂端洗车停稳信息接口校验 +* 参数说明: 入参:UINT8 Data 联挂端洗车停稳信息 +* 返回值 : CI_ERROR: 接口校验失败 +* CI_SUCESS: 接口校验成功 +*/ +static UINT8 CoupingWashStopStedInfoCheck(UINT8 Data) +{ + UINT8 coupingWashStopSteadyInfo = 0U; + UINT8 retVal = CI_ERROR; + coupingWashStopSteadyInfo = Data; + + if ((WASHMACHINE_COUPING_STEADY_YES == coupingWashStopSteadyInfo) || (WASHMACHINE_COUPING_STEADY_NO == coupingWashStopSteadyInfo)) + { + retVal = CI_SUCCESS; + } + else + { + retVal = CI_ERROR; + } + + return retVal; +} + /* * 功能描述: 暂停洗车请求信息接口校验 * 参数说明: 入参:UINT8 Data 暂停洗车请求信息 @@ -11863,11 +11984,23 @@ UINT8 ParseFAOHLHTOtherTypeData(const UINT16 appInfoType, UINT8* dataBuf, UINT16 { vobcToCiDataStru->chWashMachineWorkMode = dataBuf[ii]; ii += 1U; + chRetVal = CoupingWashStopStedInfoCheck(dataBuf[ii]); } else { chRetVal = CI_ERROR; } + + if (CI_SUCCESS == chRetVal) + { + vobcToCiDataStru->couplingWashStopSteadyInfo = dataBuf[ii]; + ii += 1U; + } + else + { + chRetVal = CI_ERROR; + } + } else if ((VOBC_CI_INFO_TYPE_HEART_FRAME == appInfoType) || (VOBC_CI_INFO_TYPE_LOGOUT_ASK == appInfoType)) {/*心跳帧或注销请求帧*/ @@ -14049,20 +14182,22 @@ void PackVobcBlocLinkData(UINT8* CiToVobcDataBuffer, UINT16* ii, VobcToCiDataStr UINT8 k = 0U; UINT32 dwTempHLHTId = 0U; UINT8 chEsbPLState = 0U; - wIndex = *ii; + if ((NULL != CiToVobcDataBuffer) && (NULL != ii) && (NULL != vobcToCiDataStru)) { + wIndex = *ii; + /*判断是否匹配到进路,若未匹配到进路不组应用数据*/ chRouteNum = GetBlocLinkRouteNum(vobcToCiDataStru->VobcId); pRouteBuf = GetBlocLinkRouteBuf(vobcToCiDataStru->VobcId); - debug_infor_printf((const)"\nVOBC %d BlocLink RouteNum: %d\n", VobcToCiDataStru->VobcId, chRouteNum); - for (k = 0U;k< chRouteNum;k++) - { - debug_infor_printf((const)"\nRouteID: %d\n", pRouteBuf[k]); - } - + if ((0U < chRouteNum) && (CI_VOBC_ROUTE_MAX >= chRouteNum) && (NULL != pRouteBuf)) { + for (k = 0U; k < chRouteNum; k++) + { + debug_infor_printf((const)"\nBlocLinkRouteID: %d\n", pRouteBuf[k]); + } + /*1 组下一个CI互联互通编号*/ PackNextCiId(CiToVobcDataBuffer, &wIndex,vobcToCiDataStru); @@ -14081,7 +14216,7 @@ void PackVobcBlocLinkData(UINT8* CiToVobcDataBuffer, UINT16* ii, VobcToCiDataStr { LongToChar(dwTempHLHTId, &CiToVobcDataBuffer[wIndex]); /*组道岔ID*/ wIndex += 4U; - chTempState = GetSwitchCurPosition(wSwitchBuffer[k]); /*组道岔状态D*/ + chTempState = GetSwitchCurPosition(wSwitchBuffer[k]); /*组道岔状态*/ if (SWITCH_POSITION_DINGWEI == chTempState) { CiToVobcDataBuffer[wIndex++] = CI_IVOC_SWITCH_POSTION_DING; @@ -14114,7 +14249,7 @@ void PackVobcBlocLinkData(UINT8* CiToVobcDataBuffer, UINT16* ii, VobcToCiDataStr { LongToChar(dwTempHLHTId, &CiToVobcDataBuffer[wIndex]); /*组ID*/ wIndex += 4U; - CiToVobcDataBuffer[wIndex++] = GetPsdStateToVobc(wTempBuffer[k]); /*组状态D*/ + CiToVobcDataBuffer[wIndex++] = GetPsdStateToVobc(wTempBuffer[k]); /*组状态*/ } else { @@ -14161,17 +14296,8 @@ void PackVobcBlocLinkData(UINT8* CiToVobcDataBuffer, UINT16* ii, VobcToCiDataStr wIndex += 2U; for (k = 0U; k < chTempNum; k++) { - chRet = dquQueryOutDevId(QFUN_IDMAP_SPKS_ID, wTempBuffer[k], &dwTempHLHTId); - if (CI_SUCCESS == chRet) - { - LongToChar(dwTempHLHTId, &CiToVobcDataBuffer[wIndex]); /*组ID*/ - wIndex += 4U; - } - else - { - LongToChar(0U, &CiToVobcDataBuffer[wIndex]); /*组无效值*/ - wIndex += 4U; - } + LongToChar(wTempBuffer[k], &CiToVobcDataBuffer[wIndex]); /*组ID*/ + wIndex += 4U; } /*7 组路径临时限速信息*/ @@ -14450,7 +14576,13 @@ static UINT8 PackMoveAuthorityData(UINT8* CiToVobcDataBuffer, UINT16* ii, VobcTo UINT8 chRet = CI_ERROR; UINT16* pRouteBuf = NULL; UINT8 chRouteNum = 0U; - + UINT8 chTempState = 0U; + UINT8 chRouteDir = 0U; + UINT16 wRouteLastPhy = 0U; + UINT16 wLogBelongPhyId = 0U; + UINT8 chTrainDir = 0U; + struct_PathPoint end = { 0U }; /*列车逻辑终点*/ + UINT16 wEndLogSecId = 0U; if ((NULL != CiToVobcDataBuffer) && (NULL != ii) && (NULL != vobcToCiDataStru)) { wIndex = *ii; @@ -14458,117 +14590,29 @@ static UINT8 PackMoveAuthorityData(UINT8* CiToVobcDataBuffer, UINT16* ii, VobcTo chRouteNum = GetBlocLinkRouteNum(vobcToCiDataStru->VobcId); pRouteBuf = GetBlocLinkRouteBuf(vobcToCiDataStru->VobcId); if ((NULL != pRouteBuf) && (0U < chRouteNum)) - { - chRet = CI_SUCCESS; - wEndSigId = GetRouteEndSignalId(pRouteBuf[chRouteNum - 1U]); /*匹配终端进路的终端信号机*/ - wOverLapId = GetRouteOverlapLockedId(pRouteBuf[chRouteNum - 1U]); - chFlag = OverlapValidMaskCheck(wOverLapId); + { + chTempState = GetRouteType(pRouteBuf[chRouteNum - 1U]); + chRouteDir = GetRouteConfigDirection(pRouteBuf[chRouteNum - 1U]); + chTrainDir = GetAblTrainDir(vobcToCiDataStru->VobcId); + wRouteLastPhy = GetRouteLastPhySectionId(pRouteBuf[chRouteNum - 1U]); + + /*车头位置*/ + end.wLinkId = GetAblTrainMaxHeadLink(vobcToCiDataStru->VobcId); + end.dwOffset = GetAblTrainMaxHeadOffset(vobcToCiDataStru->VobcId); + wEndLogSecId = GetPointBelongLogSec(end); + wLogBelongPhyId = GetLgcSecRelativePhySecId(wEndLogSecId); - if (CI_SUCCESS == chFlag) + /**进路是折返进路,车的方向与进路方向不同,车在进路最后区段**/ + if ((ROUTE_TYPE_RETURN == chTempState) && (chRouteDir != chTrainDir) && (wRouteLastPhy == wLogBelongPhyId)) { - /*进路存在有效保护区段*/ - chSigProtectDir = GetSignalDirection(wEndSigId); /*信号机防护方向*/ - chOverlapLogSum = GetOverlapLogicSectionSum(wOverLapId); - pOverlapLogBuf = GetOverlapLogicSectionBuf(wOverLapId); - if ((NULL != pOverlapLogBuf) && (0U < chOverlapLogSum) && (OVLP_LOGICSECTION_SUM_MAX > chOverlapLogSum)) - { - if (LINK_DIRECTION == chSigProtectDir) - { - /*终端信号机防护方向与link一致,安全防护点取保护区段终点link,和link长度*/ - wLinkId = GetLgcSecTmnlLink(pOverlapLogBuf[chOverlapLogSum - 1U]); - chRet = dquQueryOutDevId(QFUN_IDMAP_TRACKSEC_ID, wLinkId, &dwLinkHLHTId); - if (CI_SUCCESS == chRet) - { - /***组安全防护点位置*/ - LongToChar(dwLinkHLHTId, &CiToVobcDataBuffer[wIndex]); - wIndex += 4U; - dwlinkLength = GetLgcSecTmnlOffset(pOverlapLogBuf[chOverlapLogSum - 1U]); - LongToChar(dwlinkLength, &CiToVobcDataBuffer[wIndex]); - wIndex += 4U; - - /*终端信号机防护方向与link一致,障碍点取保护区段起点link,长度0*/ - wLinkId = GetLgcSecOrgnLink(pOverlapLogBuf[0U]); - chRet = dquQueryOutDevId(QFUN_IDMAP_TRACKSEC_ID, wLinkId, &dwLinkHLHTId); - if (CI_SUCCESS == chRet) - { - /***组障碍点点位置*/ - LongToChar(dwLinkHLHTId, &CiToVobcDataBuffer[wIndex]); - wIndex += 4U; - LongToChar(0U, &CiToVobcDataBuffer[wIndex]); - wIndex += 4U; - - } - else - { - chRet = CI_ERROR; - } - - } - else - { - chRet = CI_ERROR; - } - - } - else if (NOT_LINK_DIRECTION == chSigProtectDir) - { - /*终端信号机防护方向与link相反,安全防护点取保护区段起点link,长度0*/ - wLinkId = GetLgcSecOrgnLink(pOverlapLogBuf[chOverlapLogSum - 1U]); - chRet = dquQueryOutDevId(QFUN_IDMAP_TRACKSEC_ID, wLinkId, &dwLinkHLHTId); - if (CI_SUCCESS == chRet) - { - /***组安全防护点位置*/ - LongToChar(dwLinkHLHTId, &CiToVobcDataBuffer[wIndex]); - wIndex += 4U; - LongToChar(0U, &CiToVobcDataBuffer[wIndex]); - wIndex += 4U; - - /*终端信号机防护方向与link相反,障碍点取保护区段起点link,link长度*/ - wLinkId = GetLgcSecTmnlLink(pOverlapLogBuf[0U]); - chRet = dquQueryOutDevId(QFUN_IDMAP_TRACKSEC_ID, wLinkId, &dwLinkHLHTId); - if (CI_SUCCESS == chRet) - { - /***组障碍点位置*/ - LongToChar(dwLinkHLHTId, &CiToVobcDataBuffer[wIndex]); - wIndex += 4U; - dwlinkLength = GetLgcSecTmnlOffset(pOverlapLogBuf[chOverlapLogSum - 1U]); - LongToChar(dwlinkLength, &CiToVobcDataBuffer[wIndex]); - wIndex += 4U; - } - else - { - chRet = CI_ERROR; - } - } - else - { - chRet = CI_ERROR; - } - - - } - else - { - chRet = CI_ERROR; - } - } - else - { - chRet = CI_ERROR; - } - } - else - { - /*组安全防护点为进路终端信号机防护点link,link偏移量*/ - wLinkId = GetSignalProtectLink(wEndSigId); - chRet = dquQueryOutDevId(QFUN_IDMAP_TRACKSEC_ID, wLinkId, &dwLinkHLHTId); + /*最后一条进路车换端之后,未匹配到折出进路,安全防护点组车的大前,障碍点组默认值*/ + chRet = dquQueryOutDevId(QFUN_IDMAP_TRACKSEC_ID, vobcToCiDataStru->strBlocLinkData.wTrainMaxSafeHeadLink, &dwLinkHLHTId); if (CI_SUCCESS == chRet) { /***组安全防护点位置*/ LongToChar(dwLinkHLHTId, &CiToVobcDataBuffer[wIndex]); wIndex += 4U; - dwlinkLength = GetSignalProtectLinkOff(wEndSigId); - LongToChar(dwlinkLength, &CiToVobcDataBuffer[wIndex]); + LongToChar(vobcToCiDataStru->strBlocLinkData.dwTrainMaxSafeHeadOffset, &CiToVobcDataBuffer[wIndex]); wIndex += 4U; /***组障碍点组默认值*/ @@ -14583,7 +14627,134 @@ static UINT8 PackMoveAuthorityData(UINT8* CiToVobcDataBuffer, UINT16* ii, VobcTo } } + else + { + chRet = CI_SUCCESS; + wEndSigId = GetRouteEndSignalId(pRouteBuf[chRouteNum - 1U]); /*匹配终端进路的终端信号机*/ + wOverLapId = GetRouteOverlapLockedId(pRouteBuf[chRouteNum - 1U]); + chFlag = OverlapValidMaskCheck(wOverLapId); + + if (CI_SUCCESS == chFlag) + { + /*进路存在有效保护区段*/ + chSigProtectDir = GetSignalDirection(wEndSigId); /*信号机防护方向*/ + chOverlapLogSum = GetOverlapLogicSectionSum(wOverLapId); + pOverlapLogBuf = GetOverlapLogicSectionBuf(wOverLapId); + if ((NULL != pOverlapLogBuf) && (0U < chOverlapLogSum) && (OVLP_LOGICSECTION_SUM_MAX > chOverlapLogSum)) + { + if (LINK_DIRECTION == chSigProtectDir) + { + /*终端信号机防护方向与link一致,安全防护点取保护区段终点link,和link长度*/ + wLinkId = GetLgcSecTmnlLink(pOverlapLogBuf[chOverlapLogSum - 1U]); + chRet = dquQueryOutDevId(QFUN_IDMAP_TRACKSEC_ID, wLinkId, &dwLinkHLHTId); + if (CI_SUCCESS == chRet) + { + /***组安全防护点位置*/ + LongToChar(dwLinkHLHTId, &CiToVobcDataBuffer[wIndex]); + wIndex += 4U; + dwlinkLength = GetLgcSecTmnlOffset(pOverlapLogBuf[chOverlapLogSum - 1U]); + LongToChar(dwlinkLength, &CiToVobcDataBuffer[wIndex]); + wIndex += 4U; + + /*终端信号机防护方向与link一致,障碍点取保护区段起点link,长度0*/ + wLinkId = GetLgcSecOrgnLink(pOverlapLogBuf[0U]); + chRet = dquQueryOutDevId(QFUN_IDMAP_TRACKSEC_ID, wLinkId, &dwLinkHLHTId); + if (CI_SUCCESS == chRet) + { + /***组障碍点点位置*/ + LongToChar(dwLinkHLHTId, &CiToVobcDataBuffer[wIndex]); + wIndex += 4U; + LongToChar(0U, &CiToVobcDataBuffer[wIndex]); + wIndex += 4U; + + } + else + { + chRet = CI_ERROR; + } + + } + else + { + chRet = CI_ERROR; + } + + } + else if (NOT_LINK_DIRECTION == chSigProtectDir) + { + /*终端信号机防护方向与link相反,安全防护点取保护区段起点link,长度0*/ + wLinkId = GetLgcSecOrgnLink(pOverlapLogBuf[chOverlapLogSum - 1U]); + chRet = dquQueryOutDevId(QFUN_IDMAP_TRACKSEC_ID, wLinkId, &dwLinkHLHTId); + if (CI_SUCCESS == chRet) + { + /***组安全防护点位置*/ + LongToChar(dwLinkHLHTId, &CiToVobcDataBuffer[wIndex]); + wIndex += 4U; + LongToChar(0U, &CiToVobcDataBuffer[wIndex]); + wIndex += 4U; + + /*终端信号机防护方向与link相反,障碍点取保护区段起点link,link长度*/ + wLinkId = GetLgcSecTmnlLink(pOverlapLogBuf[0U]); + chRet = dquQueryOutDevId(QFUN_IDMAP_TRACKSEC_ID, wLinkId, &dwLinkHLHTId); + if (CI_SUCCESS == chRet) + { + /***组障碍点位置*/ + LongToChar(dwLinkHLHTId, &CiToVobcDataBuffer[wIndex]); + wIndex += 4U; + dwlinkLength = GetLgcSecTmnlOffset(pOverlapLogBuf[chOverlapLogSum - 1U]); + LongToChar(dwlinkLength, &CiToVobcDataBuffer[wIndex]); + wIndex += 4U; + } + else + { + chRet = CI_ERROR; + } + } + else + { + chRet = CI_ERROR; + } + + + } + else + { + chRet = CI_ERROR; + } + } + else + { + chRet = CI_ERROR; + } + } + else + { + /*组安全防护点为进路终端信号机防护点link,link偏移量*/ + wLinkId = GetSignalProtectLink(wEndSigId); + chRet = dquQueryOutDevId(QFUN_IDMAP_TRACKSEC_ID, wLinkId, &dwLinkHLHTId); + if (CI_SUCCESS == chRet) + { + /***组安全防护点位置*/ + LongToChar(dwLinkHLHTId, &CiToVobcDataBuffer[wIndex]); + wIndex += 4U; + dwlinkLength = GetSignalProtectLinkOff(wEndSigId); + LongToChar(dwlinkLength, &CiToVobcDataBuffer[wIndex]); + wIndex += 4U; + + /***组障碍点组默认值*/ + LongToChar(0U, &CiToVobcDataBuffer[wIndex]); + wIndex += 4U; + LongToChar(UINT32_MAX, &CiToVobcDataBuffer[wIndex]); + wIndex += 4U; + } + else + { + chRet = CI_ERROR; + } + + } + } if (CI_SUCCESS == chRet) { *ii = wIndex; /*输出长度*/ @@ -14592,6 +14763,7 @@ static UINT8 PackMoveAuthorityData(UINT8* CiToVobcDataBuffer, UINT16* ii, VobcTo { /*不处理*/ } + } else { @@ -15580,7 +15752,7 @@ static UINT8 GetPathFloodGateData(UINT16* pPathTempBuf, const UINT16 wTrainId) wLogBelongPhyId = GetLgcSecRelativePhySecId(pLogSecBuf[j]); chFloodGateNum = GetPhySecLocatedFloodSum(wLogBelongPhyId); phFloodGateBuf = GetPhySecLocatedFloodId(wLogBelongPhyId); - if ((CI_VOBC_OTHER_EQUIPMENT_MAX > (chTempNum + chFloodGateNum)) && (NULL != phFloodGateBuf)) + if ((((UINT16)CI_VOBC_OTHER_EQUIPMENT_MAX) > (((UINT16)chTempNum) + chFloodGateNum)) && (NULL != phFloodGateBuf)) { for (m = 0U;m < chFloodGateNum;m++) { @@ -15624,7 +15796,7 @@ static UINT8 GetPathFloodGateData(UINT16* pPathTempBuf, const UINT16 wTrainId) { chFloodGateNum = GetPhySecLocatedFloodSum(pRoutePhyBuf[k].PhysicalSectionId); phFloodGateBuf = GetPhySecLocatedFloodId(pRoutePhyBuf[k].PhysicalSectionId); - if ((CI_VOBC_OTHER_EQUIPMENT_MAX > (chTempNum + chFloodGateNum)) && (NULL != phFloodGateBuf)) + if ((((UINT16)CI_VOBC_OTHER_EQUIPMENT_MAX) > (((UINT16)chTempNum) + chFloodGateNum)) && (NULL != phFloodGateBuf)) { for (m = 0U; m < chFloodGateNum; m++) { @@ -15689,7 +15861,7 @@ static UINT8 GetPathFloodGateData(UINT16* pPathTempBuf, const UINT16 wTrainId) { chFloodGateNum = GetPhySecLocatedFloodSum(pOverLapPhyBuf[k]); phFloodGateBuf = GetPhySecLocatedFloodId(pOverLapPhyBuf[k]); - if ((CI_VOBC_OTHER_EQUIPMENT_MAX > (chTempNum + chFloodGateNum)) && (NULL != phFloodGateBuf)) + if ((((UINT16)CI_VOBC_OTHER_EQUIPMENT_MAX) > (((UINT16)chTempNum) + chFloodGateNum)) && (NULL != phFloodGateBuf)) { for (m = 0U; m < chFloodGateNum; m++) { @@ -15744,7 +15916,7 @@ static UINT8 GetPathFloodGateData(UINT16* pPathTempBuf, const UINT16 wTrainId) static UINT8 GetDestinationType(UINT8 chRouteNum, UINT16* pRouteBuf) { UINT8 chTempState = 0U; - UINT8 chRet = 0U; + UINT8 chRet = 0xff; if ((NULL != pRouteBuf) && (CI_VOBC_ROUTE_MAX >= chRouteNum) && (0U < chRouteNum)) { chTempState = GetRouteType(pRouteBuf[chRouteNum - 1U]); @@ -15832,45 +16004,54 @@ static UINT8 PackCiToIvocComErrRcInfo(UINT8* pDataBuf, UINT16* wDataLength) chTransRciSum = GetCiTransmitSpecifySysDevSum(CI_SYSTEM_TYPE_RC); pTransRciId = GetCiTransmitSpecifySysDevBuf(CI_SYSTEM_TYPE_RC); - /*数据合法*/ - if (NULL != pTransRciId) + if (0U == chTransRciSum) { + /*如果RC没有相邻RC,故障RC数目返回0*/ chRetVal = CI_SUCCESS; - - for (jj = 0U; jj < chTransRciSum; jj++) - { - chNearRciCommState = GetCiTransmitState(CI_SYSTEM_TYPE_RC, jj); /*获取与相邻RC通信状态*/ - - /*通信正常*/ - if ((TRANSMIT_2OO2_STATE_GOOD == chNearRciCommState) || (TRANSMIT_2OO2_STATE_LINK == chNearRciCommState)) - { - ; - } - else - { - /*当前通信故障RC数目未超限*/ - if (CI_IVOC_COM_ERR_RC_NUM_MAX > chComErrRcNum) - { - /*通信故障,记录当前RC ID*/ - wComRcId = ((CI_SYSTEM_TYPE_RC << 8U) || pTransRciId[jj]); - ShortToChar(wComRcId, &pDataBuf[ii]); - ii += 2U; - chComErrRcNum++; - } - else - { - chRetVal = CI_ERROR; - debug_infor_printf((const)"\n PackCiToIvocComErrRcInfo Error: chComErrRcNum more than Max\n"); - break; - } - } - } } else { - /*数据错误*/ - ; + /*数据合法*/ + if (NULL != pTransRciId) + { + chRetVal = CI_SUCCESS; + + for (jj = 0U; jj < chTransRciSum; jj++) + { + chNearRciCommState = GetCiTransmitState(CI_SYSTEM_TYPE_RC, pTransRciId[jj]); /*获取与相邻RC通信状态*/ + + /*通信正常*/ + if (TRANSMIT_STATE_GOOD == chNearRciCommState) + { + ; + } + else + { + /*当前通信故障RC数目未超限*/ + if (CI_IVOC_COM_ERR_RC_NUM_MAX > chComErrRcNum) + { + /*通信故障,记录当前RC ID*/ + wComRcId = (UINT16)((CI_SYSTEM_TYPE_RC << 8U) | pTransRciId[jj]); + ShortToChar(wComRcId, &pDataBuf[ii]); + ii += 2U; + chComErrRcNum++; + } + else + { + chRetVal = CI_ERROR; + debug_infor_printf((const)"\n PackCiToIvocComErrRcInfo Error: chComErrRcNum more than Max\n"); + break; + } + } + } + } + else + { + /*数据错误*/ + ; + } } + } diff --git a/TSCP/src/APP/ciapp/ParsePack/ParsePackVobcData.h b/TSCP/src/APP/ciapp/ParsePack/ParsePackVobcData.h index 960f44f..4e4507f 100644 --- a/TSCP/src/APP/ciapp/ParsePack/ParsePackVobcData.h +++ b/TSCP/src/APP/ciapp/ParsePack/ParsePackVobcData.h @@ -267,6 +267,9 @@ #define CI_VOBC_FLOOD_STATE_OPEN ((UINT8)0xaaU) /*CI-VOBC点连式防淹门开启锁定状态且无关门请求*/ #define CI_VOBC_FLOOD_STATE_CLOSE ((UINT8)0x55U) /*CI-VOBC点连式防淹非开启锁定状态或有关门请求*/ +#define CI_VOBC_TRAIN_ZERO_SPEED_NO ((UINT8)0xAAU) /*CI-VOBC列车非零速*/ +#define CI_VOBC_TRAIN_ZERO_SPEED_YES ((UINT8)0x55U) /*CI-VOBC列车零速*/ + #ifdef __cplusplus extern "C" { diff --git a/TSCP/src/APP/ciapp/ParsePack/ParsePackZcData.c b/TSCP/src/APP/ciapp/ParsePack/ParsePackZcData.c index 98cc0c5..f42adca 100644 --- a/TSCP/src/APP/ciapp/ParsePack/ParsePackZcData.c +++ b/TSCP/src/APP/ciapp/ParsePack/ParsePackZcData.c @@ -74,8 +74,8 @@ UINT8 ParseZcToCiDataFrame(UINT8* dataBuf, UINT16 dataLength, UINT8 systemId) zcName = (CI_SYSTEM_TYPE_ZC)*256U + systemId; ciName = (CI_SYSTEM_TYPE_RCI)*256U + localCiId; curntCycleNo = Get2oo2CurCycleNum(); - chDataType = GetLocalPublicDataType(); /*区分28.0.0.14与其他线路zc接口*/ - if ((NULL != dataBuf) && (dataLength > 0u)) + chDataType = GetLocalPublicDataType(); /*区分分支,与主线zc接口*/ + if ((NULL != dataBuf) && (0U < dataLength)) { sourceId = GetCiTransmitSpecifySysDevBuf(CI_SYSTEM_TYPE_ZC);/*获取与本联锁通信的ZC的ID,目前一个联锁最多只与一个ZC通信*/ @@ -119,7 +119,7 @@ UINT8 ParseZcToCiDataFrame(UINT8* dataBuf, UINT16 dataLength, UINT8 systemId) /*计算消息的时效性*/ zcInfoRemainValidity = HLHTCommonMsgRemainingValidity(GetCiAndZcTransmitBadEnsureTime(), curntCycleNo, GetSystemParaAppCycleTime(), hlhtGalHead.recvOppMsgSN, hlhtGalHead.crntOwnMsgSN, hlhtGalHead.preOwnMsgSN, hlhtGalHead.comPeriod); - if (zcInfoRemainValidity > 0) + if (0 < zcInfoRemainValidity) { if (0u == hlhtGalHead.totalDataLen) { @@ -135,162 +135,247 @@ UINT8 ParseZcToCiDataFrame(UINT8* dataBuf, UINT16 dataLength, UINT8 systemId) { /*报文有效,继续解析*/ retVal = CI_SUCCESS; + if (DATA_TYPE_MAIN_BRANCH == chDataType) { - if (DATA_TYPE_MAIN_BRANCH == chDataType) + while (wTmpDataLen < hlhtGalHead.totalDataLen) { - while (wTmpDataLen < hlhtGalHead.totalDataLen) + /* 一条应用数据长度 */ + wMsgLen = ShortFromChar(&dataBuf[ii]); + + ii += 2u; + wTmpDataLen += 2U; + wTmpDataLen += wMsgLen; + + if (0u == wMsgLen) { - /* 一条应用数据长度 */ - wMsgLen = ShortFromChar(&dataBuf[ii]); - + ; /* 无处理,继续解析下一包 */ + } + else if (5u > wMsgLen) + { + /* 单包长度不对 */ + retVal = CI_ERROR; + debug_infor_printf((const)"ParseZcToCiDataFrame_Error wMsgLen\n"); + } + else + { + /* 获取报文类型 */ + wMsgType = ShortFromChar(&dataBuf[ii]); ii += 2u; - wTmpDataLen += 2U; - wTmpDataLen += wMsgLen; - if (0u == wMsgLen) + /* 跳过预留 */ + ii += 2u; + + wMsgCheckLen = wMsgLen - 4u;/*单个应用报文解析长度,删除预留2和类型2字节*/ + switch (wMsgType) { - ; /* 无处理,继续解析下一包 */ - } - else if (5u > wMsgLen) - { - /* 单包长度不对 */ + case ZC_TO_TIOC_MASK_MSG: + /* 解析ZC-CI码位信息 */ + retVal = ParseMaskData(&dataBuf[ii], wMsgCheckLen); + dwStep |= 0x10000U; + break; + case ZC_TO_TIOC_TSR_MSG: + /* 解析临时限速信息 */ + retVal = ParseZcTsrData(&dataBuf[ii], wMsgCheckLen); + dwStep |= 0x01000U; + break; + case ZC_TO_TIOC_WLB_MSG: + /* 解析紧急制动信息 */ + retVal = ParseZcEbData(&dataBuf[ii], wMsgCheckLen); + dwStep |= 0x00100U; + break; + case ZC_TO_TIOC_SNOW_MSG: + /*解析ZC-CI雨雪模式信息*/ + retVal = ParseZcSnowData(&dataBuf[ii], wMsgCheckLen); + dwStep |= 0x00010U; + break; + case ZC_TO_TIOC_ITELINECUT_MSG: + /*解析ZC-CI的ITE切除信息*/ + retVal = ParseZcIteCutData(&dataBuf[ii], wMsgCheckLen); + dwStep |= 0x00001U; + break; + case ZC_TO_RC_CBTC_CROSS_MSG: + /*解析ZC-CI的CBTC主控列车跨压信息*/ + retVal = ParseZcCbtcCrossData(&dataBuf[ii], wMsgCheckLen); + dwStep |= 0x00002U; + break; + default: retVal = CI_ERROR; - debug_infor_printf((const)"ParseZcToCiDataFrame_Error wMsgLen\n"); - } - else - { - /* 获取报文类型 */ - wMsgType = ShortFromChar(&dataBuf[ii]); - ii += 2u; - - /* 跳过预留 */ - ii += 2u; - - wMsgCheckLen = wMsgLen - 4u;/*单个应用报文解析长度,删除预留2和类型2字节*/ - switch (wMsgType) - { - case ZC_TO_TIOC_MASK_MSG: - /* 解析ZC-CI码位信息 */ - retVal = ParseMaskData(&dataBuf[ii], wMsgCheckLen); - dwStep |= 0x10000U; - break; - case ZC_TO_TIOC_TSR_MSG: - /* 解析临时限速信息 */ - retVal = ParseZcTsrData(&dataBuf[ii], wMsgCheckLen); - dwStep |= 0x01000U; - break; - case ZC_TO_TIOC_WLB_MSG: - /* 解析紧急制动信息 */ - retVal = ParseZcEbData(&dataBuf[ii], wMsgCheckLen); - dwStep |= 0x00100U; - break; - case ZC_TO_TIOC_SNOW_MSG: - /*解析ZC-CI雨雪模式信息*/ - retVal = ParseZcSnowData(&dataBuf[ii], wMsgCheckLen); - dwStep |= 0x00010U; - break; - case ZC_TO_TIOC_ITELINECUT_MSG: - /*解析ZC-CI的ITE切除信息*/ - retVal = ParseZcIteCutData(&dataBuf[ii], wMsgCheckLen); - dwStep |= 0x00001U; - break; - case ZC_TO_RC_CBTC_CROSS_MSG: - /*解析ZC-CI的CBTC主控列车跨压信息*/ - retVal = ParseZcCbtcCrossData(&dataBuf[ii], wMsgCheckLen); - dwStep |= 0x00002U; - break; - default: - retVal = CI_ERROR; - break; - } - - if (CI_SUCCESS == retVal) - { - /* 解析成功,跳过该数据包 */ - ii += wMsgCheckLen; - } - else - { - debug_infor_printf((const)"ParseZcToCiDataFrame_Error Step: 0x%5x\n", dwStep); - ClearZcData(); /*任意步骤没解析通过则清空*/ - } - } - - if (CI_ERROR == retVal) /*解析失败*/ - { break; } + + if (CI_SUCCESS == retVal) + { + /* 解析成功,跳过该数据包 */ + ii += wMsgCheckLen; + } else { - ; /*do nothing*/ + debug_infor_printf((const)"ParseZcToCiDataFrame_Error Step: 0x%5x\n", dwStep); + ClearZcData(); /*任意步骤没解析通过则清空*/ } } - if (CI_SUCCESS == retVal) + + if (CI_ERROR == retVal) /*解析失败*/ { - /*校验数据长度*/ - if (ii > dataLength) + break; + } + else + { + ; /*do nothing*/ + } + } + if (CI_SUCCESS == retVal) + { + /*校验数据长度*/ + if (ii > dataLength) + { + retVal = CI_ERROR; + } + } + } + else if (DATA_TYPE_28_BRANCH == chDataType) + { + /*28分支具备码位0201,0205*/ + while (wTmpDataLen < hlhtGalHead.totalDataLen) + { + /* 一条应用数据长度 */ + wMsgLen = ShortFromChar(&dataBuf[ii]); + ii += 2U; + wTmpDataLen += 2U; + wTmpDataLen += wMsgLen; + + if (5U > wMsgLen) + { + /* 单包长度不对 */ + retVal = CI_ERROR; + debug_infor_printf((const)"ParseZcToCiDataFrame_Error wMsgLen\n"); + } + else + { + /* 获取报文类型 */ + wMsgType = ShortFromChar(&dataBuf[ii]); + ii += 2U; + /* 跳过预留 */ + ii += 2U; + wMsgCheckLen = wMsgLen - 4U; + + switch (wMsgType) { + case ZC_TO_TIOC_MASK_MSG: + { + /* 解析ZC-CI码位信息 */ + retVal = ParseMaskData(&dataBuf[ii], wMsgCheckLen); + } + break; + case ZC_TO_TIOC_SNOW_MSG: + { + /*解析ZC-CI雨雪模式信息*/ + retVal = ParseZcSnowData(&dataBuf[ii], wMsgCheckLen); + } + break; + default: retVal = CI_ERROR; + break; + } + + if (CI_SUCCESS == retVal) + { + /* 解析成功,跳过该数据包 */ + ii += wMsgCheckLen; + } + else + { + debug_infor_printf((const)"ParseZcToCiDataFrame_Error MsgType: %d\n", wMsgType); + ClearZcData(); /*任意步骤没解析通过则清空*/ } } + + if (CI_ERROR == retVal) /*解析失败*/ + { + break; + } + else + { + ; /*do nothing*/ + } + + } + if (CI_SUCCESS == retVal) + { + /*校验数据长度*/ + if (ii > dataLength) + { + retVal = CI_ERROR; + } + } + } + else + { + /*23分支无报文类型、类型长度和预留,仅具备码位*/ + wMsgCheckLen = hlhtGalHead.totalDataLen; + retVal = ParseMaskData(&dataBuf[ii], wMsgCheckLen); + if (CI_ERROR == retVal) + { + debug_infor_printf((const)"\nParseZcToCiDataFrame_Error MaskOnly\n"); + ClearZcData(); /*没解析通过则清空*/ } else { - /*杭德线无报文类型、类型长度和预留,仅具备码位0201*/ - wMsgCheckLen = hlhtGalHead.totalDataLen; - retVal = ParseMaskData(&dataBuf[ii], wMsgCheckLen); - if (CI_ERROR == retVal) - { - debug_infor_printf((const)"\nParseZcToCiDataFrame_Error MaskOnly\n"); - ClearZcData(); /*没解析通过则清空*/ - } - else - { - ; /*继续*/ - } + ii += wMsgCheckLen; /*继续*/ } - - if (CI_SUCCESS == retVal) + } + if (CI_SUCCESS == retVal) + { + if (hlhtGalHead.totalDataLen != (ii - 31U)) { - /*更新通信周期*/ - dwCurCyc = Get2oo2CurCycleNum(); - funRet = SetCiTransmitRecvDataCycNum(localCiId, CI_SYSTEM_TYPE_ZC, sourceId[0], dwCurCyc); - if (CI_ERROR == funRet) - {/*更新周期失败*/ + retVal = CI_ERROR; + debug_infor_printf((const)"\nParseZcToCiDataFrame_Error totalDataLen\n"); + } + else + { + /*继续*/ + } + } + if (CI_SUCCESS == retVal) + { + /*更新通信周期*/ + dwCurCyc = Get2oo2CurCycleNum(); + funRet = SetCiTransmitRecvDataCycNum(localCiId, CI_SYSTEM_TYPE_ZC, sourceId[0U], dwCurCyc); + if (CI_ERROR == funRet) + {/*更新周期失败*/ + } + else + {/*更新周期成功*/ + + /*更新与ZC通信状态:判断与ZC是否通信中断*/ + funRet = UpdateCiTransmitState(localCiId, CI_SYSTEM_TYPE_ZC, sourceId[0U]); + if (CI_ERROR == funRet) + { + /*更新通信状态失败*/ } else - {/*更新周期成功*/ - - /*更新与ZC通信状态:判断与ZC是否通信中断*/ - funRet = UpdateCiTransmitState(localCiId, CI_SYSTEM_TYPE_ZC, sourceId[0]); - if (CI_ERROR == funRet) - { - /*更新通信状态失败*/ - } - else - { - /*更新通信状态成功*/ - } + { + /*更新通信状态成功*/ } - - /*数据经过校验,需要存储通用报文上下文*/ - SetHLHTHeadCtxComPeriod(CI_SYSTEM_TYPE_ZC, systemId, hlhtGalHead.comPeriod); - SetHLHTHeadCtxSrcCrntSN(CI_SYSTEM_TYPE_ZC, systemId, hlhtGalHead.crntOwnMsgSN); - SetHLHTHeadCtxSrcOppSN(CI_SYSTEM_TYPE_ZC, systemId, hlhtGalHead.recvOppMsgSN); - SetHLHTHeadCtxSrcOwnSN(CI_SYSTEM_TYPE_ZC, systemId, hlhtGalHead.preOwnMsgSN); - SetHLHTHeadCtxCiRcvSN(CI_SYSTEM_TYPE_ZC, systemId, curntCycleNo); - SetHLHTHeadCtxCiRcvLogId(CI_SYSTEM_TYPE_ZC, systemId, 0u); - - galHeadSaved = 1; } + + /*数据经过校验,需要存储通用报文上下文*/ + SetHLHTHeadCtxComPeriod(CI_SYSTEM_TYPE_ZC, systemId, hlhtGalHead.comPeriod); + SetHLHTHeadCtxSrcCrntSN(CI_SYSTEM_TYPE_ZC, systemId, hlhtGalHead.crntOwnMsgSN); + SetHLHTHeadCtxSrcOppSN(CI_SYSTEM_TYPE_ZC, systemId, hlhtGalHead.recvOppMsgSN); + SetHLHTHeadCtxSrcOwnSN(CI_SYSTEM_TYPE_ZC, systemId, hlhtGalHead.preOwnMsgSN); + SetHLHTHeadCtxCiRcvSN(CI_SYSTEM_TYPE_ZC, systemId, curntCycleNo); + SetHLHTHeadCtxCiRcvLogId(CI_SYSTEM_TYPE_ZC, systemId, 0u); + + galHeadSaved = 1U; } } } } else if (HLHT_HEAD_INIT ==headRet) { - if (curntCycleNo > 0u)/*判断序号大于0,因为把0当做无效序号*/ + if (0U < curntCycleNo)/*判断序号大于0,因为把0当做无效序号*/ { SetHLHTHeadCtxComPeriod(CI_SYSTEM_TYPE_ZC, systemId, hlhtGalHead.comPeriod); SetHLHTHeadCtxSrcCrntSN(CI_SYSTEM_TYPE_ZC, systemId, hlhtGalHead.crntOwnMsgSN); @@ -299,7 +384,7 @@ UINT8 ParseZcToCiDataFrame(UINT8* dataBuf, UINT16 dataLength, UINT8 systemId) SetHLHTHeadCtxCiRcvSN(CI_SYSTEM_TYPE_ZC, systemId, curntCycleNo); SetHLHTHeadCtxCiRcvLogId(CI_SYSTEM_TYPE_ZC, systemId, 0u); - galHeadSaved = 1; + galHeadSaved = 1U; } retVal = CI_ERROR; @@ -1061,24 +1146,24 @@ UINT8 ParseZcSnowData(UINT8* dataBuf, UINT16 dataLen) */ UINT8 PackCiToZcData( UINT8 deviceId) { - UINT8 localCi = 0u; /*本地联锁ID*/ - UINT8 CiToZcDataBuffer[CI_TO_ZC_DATA_LEN_MAX] = {0u};/*CI到ZC组帧数组*/ - UINT16 SendMaskSum = 0u; - UINT16 ii = 0u; - UINT32 ciEtcsId = 0u; /*CI互联互通编号*/ - UINT32 zcEtcsId = 0u; /*ZC互联互通编号*/ - UINT32 emapCheckVer = 0u; /*共用数据校验信息*/ + UINT8 localCi = 0U; /*本地联锁ID*/ + UINT8 CiToZcDataBuffer[CI_TO_ZC_DATA_LEN_MAX] = {0U};/*CI到ZC组帧数组*/ + UINT16 SendMaskSum = 0U; + UINT16 ii = 0U; + UINT32 ciEtcsId = 0U; /*CI互联互通编号*/ + UINT32 zcEtcsId = 0U; /*ZC互联互通编号*/ + UINT32 emapCheckVer = 0U; /*共用数据校验信息*/ UINT8 retVal = CI_ERROR; UINT32 curCycleNum = Get2oo2CurCycleNum(); /*联锁应用周期号*/ UINT32 appCycleTime = GetSystemParaAppCycleTime(); /*联锁应用周期*/ - UINT8 ci_zcPrtclVersion = 0u; - UINT16 dstDevId = 0; - UINT8 outnetSafeSendRtn = 0u; + UINT8 ci_zcPrtclVersion = 0U; + UINT16 dstDevId = 0U; + UINT8 outnetSafeSendRtn = 0U; UINT8 CIName2HlhtId = 0U; UINT8 ZCName2HlhtId = 0U; UINT8 CiEmapCheckVer = 0U; - UINT32 dwHlhtHSrcSN = 0u; - UINT32 dwHlhtHRcvSN = 0u; + UINT32 dwHlhtHSrcSN = 0U; + UINT32 dwHlhtHRcvSN = 0U; UINT16 totallenIndex = 0U; UINT16 wCrossFrameLen = 0U; UINT8 chDataType = 0U; @@ -1104,16 +1189,16 @@ UINT8 PackCiToZcData( UINT8 deviceId) if ((CI_SUCCESS == retVal)) { /*获取将要发送的码位字节数*/ - if ((GetSendMaskSum(CI_SYSTEM_TYPE_ZC) % 8u) == 0u) + if (0U == (GetSendMaskSum(CI_SYSTEM_TYPE_ZC) % 8U)) { - SendMaskSum = (UINT16) (GetSendMaskSum(CI_SYSTEM_TYPE_ZC) / 8u); + SendMaskSum = (UINT16) (GetSendMaskSum(CI_SYSTEM_TYPE_ZC) / 8U); } else { - SendMaskSum = (UINT16) (GetSendMaskSum(CI_SYSTEM_TYPE_ZC) / 8u + 1u); + SendMaskSum = (UINT16) (GetSendMaskSum(CI_SYSTEM_TYPE_ZC) / 8U + 1U); } - if (0u == SendMaskSum) + if (0U == SendMaskSum) { retVal = CI_ERROR; } @@ -1131,21 +1216,21 @@ UINT8 PackCiToZcData( UINT8 deviceId) /*开始组应用数据帧*/ /*组GAL包头*/ ShortToChar(CI_ZC_INTERFACE_INFOTYPE, &CiToZcDataBuffer[ii]);/*接口信息类型*/ - ii += 2u; + ii += 2U; LongToChar(ciEtcsId, &CiToZcDataBuffer[ii]);/*发送方标识信息*/ - ii += 4u; + ii += 4U; LongToChar(zcEtcsId, &CiToZcDataBuffer[ii]);/*接收方标识信息*/ - ii += 4u; + ii += 4U; LongToChar(emapCheckVer, &CiToZcDataBuffer[ii]);/*电子地图版本校验信息*/ - ii += 4u; + ii += 4U; LongToChar(curCycleNum, &CiToZcDataBuffer[ii]);/*本方消息序列号*/ - ii += 4u; + ii += 4U; ShortToChar((UINT16)appCycleTime, &CiToZcDataBuffer[ii]);/*设备通讯周期*/ - ii += 2u; + ii += 2U; LongToChar(dwHlhtHSrcSN, &CiToZcDataBuffer[ii]);/*对方消息序列号:recvOppMsgSN记录收到对方上一条消息中的对方消息序列号*/ - ii += 4u; + ii += 4U; LongToChar(dwHlhtHRcvSN, &CiToZcDataBuffer[ii]);/*收到上一条消息时本方序列号*/ - ii += 4u; + ii += 4U; lineIdentity = GetCiFunctionSwitchConfig(VOBC_INTERFACE_IDENTITY);/*获取线路标识*/ @@ -1159,20 +1244,22 @@ UINT8 PackCiToZcData( UINT8 deviceId) } totallenIndex = ii; - ii += 2u;/*通用报文头中的应用层报文总长度*/ - if (DATA_TYPE_MAIN_BRANCH == chDataType) + ii += 2U;/*通用报文头中的应用层报文总长度*/ + + if ((DATA_TYPE_MAIN_BRANCH == chDataType) || (DATA_TYPE_28_BRANCH == chDataType)) { - ii += 2u;/*通用报文头中的应用层报文长度(0x202报文长度)*/ + ii += 2U;/*通用报文头中的应用层报文长度(0x202报文长度)*/ ShortToChar(TIOC_TO_ZC_MASK_MSG, &CiToZcDataBuffer[ii]);/*接口信息类型*/ - ii += 2u; + ii += 2U; - ii += 2u; /*预留*/ + ii += 2U; /*预留*/ } else { - ;/*杭德线路无0x202报文长度、类型及预留*/ + /*23分支无0x202报文长度、类型及预留*/ } + /*组码位信息*/ (void)MaskPack(CI_SYSTEM_TYPE_ZC,&CiToZcDataBuffer[ii]); @@ -1182,27 +1269,33 @@ UINT8 PackCiToZcData( UINT8 deviceId) { /*通用应用层报文长度(0x202报文长度)*/ /*刨去2字节应用报文总长度+2字节0202帧长度*/ - ShortToChar((ii - (totallenIndex + 4u)), &CiToZcDataBuffer[totallenIndex + 2u]); + ShortToChar((ii - (totallenIndex + 4U)), &CiToZcDataBuffer[totallenIndex + 2U]); /*组TACS列车跨压信息*/ wCrossFrameLen = PackRcTacsCrossData(&CiToZcDataBuffer[ii]); ii += wCrossFrameLen; } + else if(DATA_TYPE_28_BRANCH == chDataType) + { + /*通用应用层报文长度(0x202报文长度)*/ + /*刨去2字节应用报文总长度+2字节0202帧长度*/ + ShortToChar((ii - (totallenIndex + 4U)), &CiToZcDataBuffer[totallenIndex + 2U]); + } else { - /*nothing*/ + /*23分支 nothing*/ } /*通用报文头中应用层报文总长度*/ /*刨去2字节应用报文总长度*/ - ShortToChar(ii - (totallenIndex + 2u), &CiToZcDataBuffer[totallenIndex]); + ShortToChar(ii - (totallenIndex + 2U), &CiToZcDataBuffer[totallenIndex]); /*清ZC数据*/ ClearZcData(); - dstDevId = (UINT16)(CI_SYSTEM_TYPE_ZC << 8) | ((UINT16)deviceId); - outnetSafeSendRtn = OutnetSafeSend(dstDevId, 0u, &CiToZcDataBuffer[0], ii); - if (1u == outnetSafeSendRtn) + dstDevId = (UINT16)(CI_SYSTEM_TYPE_ZC << 8U) | ((UINT16)deviceId); + outnetSafeSendRtn = OutnetSafeSend(dstDevId, 0U, &CiToZcDataBuffer[0U], ii); + if (1U == outnetSafeSendRtn) { /*写队列成功*/ #ifdef LOGPRINT/*日志打印宏*/ #ifdef PLATFORM_2OO2/*2oo2平台打印*/ @@ -1300,7 +1393,7 @@ static UINT16 PackRcTacsCrossData(UINT8 *pDataBuf) /*非法值防护*/ if ((0u < wSignalId) && (CROSS_SIGNAL_ID_MAX >= wSignalId) && (0u < wCrossTacsTrainId) && (TACS_CROSS_ID_MAX >= wCrossTacsTrainId) - && (ALL_TACS_CROSS_SUM_MAX >= wTacsCrossTrainSum)) + && (ALL_TACS_CROSS_SUM_MAX > wTacsCrossTrainSum)) { /*TACS主控列车ID有效,赋值至待发送数组*/ wTacsCrossSignalBuf[wTacsCrossTrainSum] = wSignalId; @@ -1348,14 +1441,6 @@ static UINT16 PackRcTacsCrossData(UINT8 *pDataBuf) /*最后赋值长度*/ ShortToChar((Index - 2u), &pDataBuf[0u]); - /*打印*/ - debug_infor_printf((const)"SendTacsCross Len=%d:", Index); - for (i = 0u; i < Index; i++) - { - debug_infor_printf((const)"%x-", pDataBuf[i]); - } - debug_infor_printf((const)"\n"); - return Index; } @@ -1583,6 +1668,8 @@ static UINT8 ParseZcCbtcCrossData(UINT8* pDataBuf, UINT16 dataLen) if (NULL != pDataBuf) { cRetVal = CI_SUCCESS; + ZcToCiDataStru.cRecvCbtcCrossFrameTag = CI_SUCCESS; + wCrossNum = pDataBuf[ii]; ii++; diff --git a/TSCP/src/APP/ciapp/ParsePack/ParsePackZcData.h b/TSCP/src/APP/ciapp/ParsePack/ParsePackZcData.h index bbbca0e..6f3367f 100644 --- a/TSCP/src/APP/ciapp/ParsePack/ParsePackZcData.h +++ b/TSCP/src/APP/ciapp/ParsePack/ParsePackZcData.h @@ -66,6 +66,7 @@ typedef struct S_ZcToCiDataStruct UINT8 cIteLineCutState; /* ITE全线切除状态 */ UINT8 cAreaIteCutNum; /*区间ITE切除数量*/ UINT16 szAreaIteCutId[ALL_AREA_SNOW_SUM_MAX]; /*区间ITE切除ID数组*/ + UINT8 cRecvCbtcCrossFrameTag; /*接收到主控CBTC列车跨压信息帧标志*/ UINT8 wCbtcCrossNum; /*CBTC主控列车跨压数量*/ UINT16 wCbtcCrossSignalId[ALL_CBTC_CROSS_SUM_MAX]; /*CBTC主控列车跨压信号机ID*/ UINT8 wCbtcCrossTrainId[ALL_CBTC_CROSS_SUM_MAX]; /*CBTC主控列车跨压列车ID*/ diff --git a/TSCP/src/APP/ciapp/QueryFiles/dquCIInit.c b/TSCP/src/APP/ciapp/QueryFiles/dquCIInit.c index de3aea2..783914d 100644 --- a/TSCP/src/APP/ciapp/QueryFiles/dquCIInit.c +++ b/TSCP/src/APP/ciapp/QueryFiles/dquCIInit.c @@ -112,6 +112,17 @@ static UINT8 NonReturnStruFromDquStr(DSU_AR_STRU* pNonReturn, NonAutoReturnConfi */ static UINT8 LinkSpecialEaDataInit(CHAR* FSName); + +/* +*功能描述: 相邻联锁串口通信数据初始化 +*输入参数: 无 +*输出参数: 无 +*返回值: 0 失败 +* 1 成功 +* by cgh 20260516 +*/ +static UINT8 RciSerialCommDataInit(void); + /********************************************* *函数功能:初始化继电器所有的结构体,初始化系统配置数据、相邻联锁通信数据, * 初始化出站信号机关联逻辑区段/计轴区段配置数据、初始化各设备继电器配置数据、初始化计轴区段/逻辑区段配置数据、 @@ -127,7 +138,6 @@ UINT8 RelayInit(CHAR* FSName) UINT8 tmpSpeedLimitType = 0u; /*点式临时限速配置数据读取类型*/ UINT8 localCiPattern = 0u; /*本CI模式*/ UINT8 cLocalWorkType = 0U; /*本地工作模式*/ - UINT8 chDataType = 0U; /*数据结构类型*/ (void)memset(&RelayData,0,sizeof(RelayDataStruct_Config)); (void)memset(&LSData,0,sizeof(LSDataStruct)); @@ -137,25 +147,12 @@ UINT8 RelayInit(CHAR* FSName) tmpSpeedLimitType = GetCiFunctionSwitchConfig(BLK_TEMP_SPEED_LIM_CONF); /*获取临时限速数据类型*/ - chDataType = GetLocalPublicDataType(); - if (DATA_TYPE_MAIN_BRANCH == chDataType) + /* 新数据结构 */ + funcRtn = TransmitDataStructInitNew(FSName); + if (0u == funcRtn) { - /* 新数据结构 */ - funcRtn = TransmitDataStructInitNew(FSName); + debug_infor_printf((const) "TransmitDataStructInitNew fail.\r\n"); } - else - { - /* 杭德数据结构 */ - /*初始化通信关系数据结构体*/ - funcRtn = TransmitRelationDataStructInit(FSName); - if (0u == funcRtn) - { - debug_infor_printf((const)"TransmitRelationDataStructInit fail.\r\n"); - } - } - - - /* 读取虚拟联锁与OC设备关系配置数据*/ funcRtn *= ReadVirCIWithOCRelationData(FSName); @@ -396,13 +393,10 @@ UINT8 RelayInit(CHAR* FSName) debug_infor_printf((const)"ReverseCutConfigDataStructInit fail.\r\n"); } - if (RC_WORK_MODE_TIOC == cLocalWorkType) + funcRtn *= GatewayConfigDataStructInit(FSName); + if (0u == funcRtn) { - funcRtn *= GatewayConfigDataStructInit(FSName); - if (0u == funcRtn) - { - debug_infor_printf((const)"GatewayConfigDataStructInit fail.\r\n"); - } + debug_infor_printf((const)"GatewayConfigDataStructInit fail.\r\n"); } /******************************************************************************** @@ -516,7 +510,17 @@ UINT8 RelayInit(CHAR* FSName) /*计轴区段防护道岔初始化*/ funcRtn *= AxisSecProtectSwitchInit(); + if (0u == funcRtn) + { + debug_infor_printf((const)"AxisSecProtectSwitchInit fail.\r\n"); + } + /* 倒切配置数据---在可能配置倒切的设备初始化后 */ + funcRtn *= ReverseSwitchConfigDataStructInit(FSName); + if (0u == funcRtn) + { + debug_infor_printf((const)"ReverseSwitchConfigDataStructInit fail.\r\n"); + } return funcRtn; } @@ -699,9 +703,6 @@ UINT8 SystemParameterStructInit(CHAR* FSName) /*一个临时限速报文中包含的最大限速区段数量*/ dquCICfgDtStr.SystemParaStrNew.MaxSectionOfTsr = pCbtcConfigDataStru.MaxSectionOfTsr; - /*IVOC-OC通信故障判断时间(ms)*/ - dquCICfgDtStr.SystemParaStrNew.IvocOcCommunicationErrorTime = pCbtcConfigDataStru.IvocOcCommunicationErrorTime; - /*OC-TMC通信故障判断时间(ms)*/ dquCICfgDtStr.SystemParaStrNew.TmcOcCommunicationErrorTime = pCbtcConfigDataStru.TmcOcCommunicationErrorTime; @@ -874,59 +875,51 @@ UINT8 SwitchConfigDataStructInit(CHAR * FSName) rtnvalue = 0u; } /*电子地图初始化成功,继续执行*/ - else + if (0U != rtnvalue) { - if (CI_TRADITION_RAILWAY == lineIdentity) + for (i = 0u; i= SWITCH_SUM_MAX) { - if (i >= SWITCH_SUM_MAX) + rtnvalue = 0u; + break; + } + rtnvalue = SwitchCfgDtStruFromDquPointStr(dsuStaticHeadStru.pPointStru + i, &dquCICfgDtStr.SwchCfgDtStr[i]); + + if (1u == rtnvalue) + { + rtnvalue = SwitchCfgDtStruFromLSProHostStr(&dquCICfgDtStr.SwchCfgDtStr[i]); + if (0u == rtnvalue) { - rtnvalue = 0u; + debug_infor_printf((const)"SwitchCfgDtStruFromLSProHostStr switch %d fail.\r\n", dquCICfgDtStr.SwchCfgDtStr[i].SwitchId); break; } - rtnvalue = SwitchCfgDtStruFromDquPointStr(dsuStaticHeadStru.pPointStru+i,&dquCICfgDtStr.SwchCfgDtStr[i]); + else + { + } if (1u == rtnvalue) { - rtnvalue = SwitchCfgDtStruFromLSProHostStr(&dquCICfgDtStr.SwchCfgDtStr[i]); + rtnvalue = SwitchCfgLogTrackInitDquStr(dsuStaticHeadStru.pPointStru + i, &dquCICfgDtStr.SwchCfgDtStr[i]); if (0u == rtnvalue) { - debug_infor_printf((const)"SwitchCfgDtStruFromLSProHostStr switch %d fail.\r\n", dquCICfgDtStr.SwchCfgDtStr[i].SwitchId); - break; - } - else - { - - } - if (1u == rtnvalue) - { - rtnvalue = SwitchCfgLogTrackInitDquStr(dsuStaticHeadStru.pPointStru+i,&dquCICfgDtStr.SwchCfgDtStr[i]); - if(0u == rtnvalue) - { - debug_infor_printf((const)"SwitchCfgLogTrackInitDquStr switch %d fail.\r\n",dquCICfgDtStr.SwchCfgDtStr[i].SwitchId); - break; - } - } - else - { - debug_infor_printf((const)"SwitchCfgDtStruFromLSProHostStr switch %d fail.\r\n",dquCICfgDtStr.SwchCfgDtStr[i].SwitchId); + debug_infor_printf((const)"SwitchCfgLogTrackInitDquStr switch %d fail.\r\n", dquCICfgDtStr.SwchCfgDtStr[i].SwitchId); break; } } else { - debug_infor_printf((const)"SwitchCfgDtStruFromDquPointStr switch %d fail.\r\n",dquCICfgDtStr.SwchCfgDtStr[i].SwitchId); + debug_infor_printf((const)"SwitchCfgDtStruFromLSProHostStr switch %d fail.\r\n", dquCICfgDtStr.SwchCfgDtStr[i].SwitchId); break; } } - }/* zt 删除单轨相关代码 2022-02-15 */ - else - { - rtnvalue = 0u; + else + { + debug_infor_printf((const)"SwitchCfgDtStruFromDquPointStr switch %d fail.\r\n", dquCICfgDtStr.SwchCfgDtStr[i].SwitchId); + break; + } } - } - + }/* zt 删除单轨相关代码 2022-02-15 */ return rtnvalue; } /********************************************* @@ -1484,7 +1477,7 @@ UINT8 SglCfgDtStruFromDquSignalStr(DSU_SIGNAL_STRU* pSgnl,SignalConfigDataStruct pSgnlCfgDtStr->startSigRouBuf[pSgnlCfgDtStr->startSigRouSum] = pCurrentRouteStru->wId; pSgnlCfgDtStr->startSigRouSum ++; - if (0u==(pCurrentRouteStru->wRouteType & 0x0200u)) + if (0u==(pCurrentRouteStru->dwRouteType & 0x0200u)) {/*非ZC自动办理的进路*/ pSgnlCfgDtStr->startSigCiRouteSum++; } @@ -1740,113 +1733,163 @@ UINT8 SwitchCfgDtStruFromDquPointStr(DSU_POINT_STRU* pPoint,SwitchConfigDataStru UINT16 i=0u; UINT16 j=0u; UINT8 rtnvalue = 0u; - UINT8 chDataType = DATA_TYPE_MAIN_BRANCH; - chDataType = GetLocalPublicDataType();/*数据结构*/ - + UINT8 CiPattern = 0u; /*入口参数防护*/ if((NULL == pPoint) || (NULL == pSwitchCfgDtStr)) { /*返回失败*/ - return 0u; + rtnvalue = 0u; + } + else + { + rtnvalue = 1u; } - pSwitchCfgDtStr->SwitchId = pPoint->wId; - pSwitchCfgDtStr->BelongCiId = (UINT8)pPoint->wManagePhysicalCI; - pSwitchCfgDtStr->BelongVirCI = (UINT8)pPoint->wBelongVirCI;/*所属虚拟联锁编号*/ - pSwitchCfgDtStr->dwSwitchKilo = pPoint->dwPointKilo; /* 公里标 */ - pSwitchCfgDtStr->chKiloType = pPoint->dwPointKiloPlueMinusSign; - if (pSwitchCfgDtStr->SwitchId < SWITCH_SUM_MAX) + if (1u == rtnvalue) { - - /*将OC配置表数据存储到道岔配置数据结构体*/ - rtnvalue = SwitchCfgDtStruFromOCconfigStr(pSwitchCfgDtStr); - if (DATA_TYPE_MAIN_BRANCH == chDataType) + /*冗余采集相关变量初始化为默认值*/ + CiPattern = GetLocalCiPattern(); + pSwitchCfgDtStr->RedunCollCfg = REDUN_COLL_NO; + for (i = 0u; i < SWITCH_REDUN_COLL_MAX; i++) { + pSwitchCfgDtStr->RedunCollRelayStru[i].wRedunDb1RelayId = 0u; + pSwitchCfgDtStr->RedunCollRelayStru[i].wRedunDb2RelayId = 0u; + pSwitchCfgDtStr->RedunCollRelayStru[i].wRedunFb1RelayId = 0u; + pSwitchCfgDtStr->RedunCollRelayStru[i].wRedunFb2RelayId = 0u; + } + + pSwitchCfgDtStr->SwitchId = pPoint->wId; + pSwitchCfgDtStr->BelongCiId = (UINT8)pPoint->wManagePhysicalCI; + pSwitchCfgDtStr->BelongVirCI = (UINT8)pPoint->wBelongVirCI;/*所属虚拟联锁编号*/ + pSwitchCfgDtStr->dwSwitchKilo = pPoint->dwPointKilo; /* 公里标 */ + pSwitchCfgDtStr->chKiloType = pPoint->dwPointKiloPlueMinusSign; + pSwitchCfgDtStr->wReverseBoardId = 0U;/*初始化无倒切*/ + if (SWITCH_SUM_MAX > pSwitchCfgDtStr->SwitchId) + { + /*将OC配置表数据存储到道岔配置数据结构体*/ + rtnvalue = SwitchCfgDtStruFromOCconfigStr(pSwitchCfgDtStr); + /*通过板卡ID,计算该板卡在本OC中使用了哪些插箱*/ rtnvalue &= CalcuSwitchInsertionBoxData(pSwitchCfgDtStr); - } - else - {/*无执行*/ - } - if (0u == rtnvalue) - { - return rtnvalue; } - - - } - pSwitchCfgDtStr->DSwitchOtherId = (pPoint->DPointOtherId != 0xffffu)?pPoint->DPointOtherId:0U; - pSwitchCfgDtStr->SwitchPhySecId = 0xffu; - pSwitchCfgDtStr->SwitchIsThisLine = DEV_IS_THIS_LINE_YES; - /*cgh-合并CID-2341-10:*/ - pSwitchCfgDtStr->DsRelayId = 0u; - pSwitchCfgDtStr->DsQRelayId = 0u; - pSwitchCfgDtStr->DsHRelayId = 0u; - pSwitchCfgDtStr->ByPassRelayId = 0u; - pSwitchCfgDtStr->IbpDrvRelayId = 0u; - for(j=0u;jwId==(RelayData.pRelayPointStr+j)->wPointId) + if (1u == rtnvalue) { - pSwitchCfgDtStr->DbRelayId = (RelayData.pRelayPointStr+j)->wRelayDingBiaoId; - pSwitchCfgDtStr->FbRelayId = (RelayData.pRelayPointStr+j)->wRelayFanBiaoId; - pSwitchCfgDtStr->YcRelayId = (RelayData.pRelayPointStr+j)->wRelayYunCaoId; - pSwitchCfgDtStr->DcRelayId = (RelayData.pRelayPointStr+j)->wRelayDingCaoId; - pSwitchCfgDtStr->FcRelayId = (RelayData.pRelayPointStr+j)->wRelayFanCaoId; - pSwitchCfgDtStr->ZDbRelayId = (RelayData.pRelayPointStr+j)->wRelayZongDingBiaoId; - pSwitchCfgDtStr->ZFbRelayId = (RelayData.pRelayPointStr+j)->wRelayZongFanBiaoId; - pSwitchCfgDtStr->DFHRelayId = (RelayData.pRelayPointStr+j)->wDFHId; - pSwitchCfgDtStr->wShadowDbRelayId = (RelayData.pRelayPointStr + j)->wRelayShadowDingBiaoId; - pSwitchCfgDtStr->wShadowFbRelayId = (RelayData.pRelayPointStr + j)->wRelayShadowFanBiaoId; - if (pSwitchCfgDtStr->SwitchId>0u) + pSwitchCfgDtStr->DSwitchOtherId = (pPoint->DPointOtherId != 0xffffu) ? pPoint->DPointOtherId : 0U; + pSwitchCfgDtStr->SwitchPhySecId = 0xffu; + pSwitchCfgDtStr->SwitchIsThisLine = DEV_IS_THIS_LINE_YES; + /*cgh-合并CID-2341-10:*/ + pSwitchCfgDtStr->DsRelayId = 0u; + pSwitchCfgDtStr->DsQRelayId = 0u; + pSwitchCfgDtStr->DsHRelayId = 0u; + pSwitchCfgDtStr->ByPassRelayId = 0u; + pSwitchCfgDtStr->IbpDrvRelayId = 0u; + for (j = 0u; j < RelayDataLen.RelayPointStrLen; j++) { - if (0u == pSwitchCfgDtStr->DbRelayId) + if (pPoint->wId == (RelayData.pRelayPointStr + j)->wPointId) { - debug_infor_printf((const)"Switch %d DBJ %d not config.",pSwitchCfgDtStr->SwitchId,pSwitchCfgDtStr->DbRelayId); - DebugPrintAppError(ERROR_SWITCH_DBJ_NOT_CONFIG,CI_DEVICE_TYPE_SWITCH,pSwitchCfgDtStr->SwitchId,PRINT_ONCE); - } - if (0u == pSwitchCfgDtStr->FbRelayId) - { - debug_infor_printf((const)"Switch %d FBJ %d not config.",pSwitchCfgDtStr->SwitchId,pSwitchCfgDtStr->FbRelayId); - DebugPrintAppError(ERROR_SWITCH_FBJ_NOT_CONFIG,CI_DEVICE_TYPE_SWITCH,(UINT32)(pSwitchCfgDtStr->SwitchId),PRINT_ONCE); - } - if (0u == pSwitchCfgDtStr->YcRelayId) - { - debug_infor_printf((const)"Switch %d YCJ %d not config.",pSwitchCfgDtStr->SwitchId,pSwitchCfgDtStr->YcRelayId); - DebugPrintAppError(ERROR_SWITCH_YCJ_NOT_CONFIG,CI_DEVICE_TYPE_SWITCH,(UINT32)(pSwitchCfgDtStr->SwitchId),PRINT_ONCE); - } - if (0u == pSwitchCfgDtStr->DcRelayId) - { - debug_infor_printf((const)"Switch %d DCJ %d not config.",pSwitchCfgDtStr->SwitchId,pSwitchCfgDtStr->DcRelayId); - DebugPrintAppError(ERROR_SWITCH_DCJ_NOT_CONFIG,CI_DEVICE_TYPE_SWITCH,(UINT32)(pSwitchCfgDtStr->SwitchId),PRINT_ONCE); - } - if (0u == pSwitchCfgDtStr->FcRelayId) - { - debug_infor_printf((const)"Switch %d FCJ %d not config.",pSwitchCfgDtStr->SwitchId,pSwitchCfgDtStr->FcRelayId); - DebugPrintAppError(ERROR_SWITCH_FCJ_NOT_CONFIG,CI_DEVICE_TYPE_SWITCH,(UINT32)(pSwitchCfgDtStr->SwitchId),PRINT_ONCE); + pSwitchCfgDtStr->DbRelayId = (RelayData.pRelayPointStr + j)->wRelayDingBiaoId; + pSwitchCfgDtStr->FbRelayId = (RelayData.pRelayPointStr + j)->wRelayFanBiaoId; + pSwitchCfgDtStr->YcRelayId = (RelayData.pRelayPointStr + j)->wRelayYunCaoId; + pSwitchCfgDtStr->DcRelayId = (RelayData.pRelayPointStr + j)->wRelayDingCaoId; + pSwitchCfgDtStr->FcRelayId = (RelayData.pRelayPointStr + j)->wRelayFanCaoId; + pSwitchCfgDtStr->ZDbRelayId = (RelayData.pRelayPointStr + j)->wRelayZongDingBiaoId; + pSwitchCfgDtStr->ZFbRelayId = (RelayData.pRelayPointStr + j)->wRelayZongFanBiaoId; + pSwitchCfgDtStr->DFHRelayId = (RelayData.pRelayPointStr + j)->wDFHId; + + for (i = 0u; i < SWITCH_REDUN_COLL_MAX; i++) + { + if ((0u == pSwitchCfgDtStr->RedunCollRelayStru[i].wRedunDb1RelayId) + && (0u == pSwitchCfgDtStr->RedunCollRelayStru[i].wRedunDb2RelayId) + && (0u == pSwitchCfgDtStr->RedunCollRelayStru[i].wRedunFb1RelayId) + && (0u == pSwitchCfgDtStr->RedunCollRelayStru[i].wRedunFb2RelayId)) + { + pSwitchCfgDtStr->RedunCollRelayStru[i].wRedunDb1RelayId = (RelayData.pRelayPointStr + j)->wRelayRedunDB1Id; + pSwitchCfgDtStr->RedunCollRelayStru[i].wRedunDb2RelayId = (RelayData.pRelayPointStr + j)->wRelayRedunDB2Id; + pSwitchCfgDtStr->RedunCollRelayStru[i].wRedunFb1RelayId = (RelayData.pRelayPointStr + j)->wRelayRedunFB1Id; + pSwitchCfgDtStr->RedunCollRelayStru[i].wRedunFb2RelayId = (RelayData.pRelayPointStr + j)->wRelayRedunFB2Id; + break; + } + else + { + /*继续遍历*/ + } + } + + if (0u < pSwitchCfgDtStr->SwitchId) + { + if (0u == pSwitchCfgDtStr->DbRelayId) + { + debug_infor_printf((const)"Switch %d DBJ %d not config.", pSwitchCfgDtStr->SwitchId, pSwitchCfgDtStr->DbRelayId); + DebugPrintAppError(ERROR_SWITCH_DBJ_NOT_CONFIG, CI_DEVICE_TYPE_SWITCH, pSwitchCfgDtStr->SwitchId, PRINT_ONCE); + } + if (0u == pSwitchCfgDtStr->FbRelayId) + { + debug_infor_printf((const)"Switch %d FBJ %d not config.", pSwitchCfgDtStr->SwitchId, pSwitchCfgDtStr->FbRelayId); + DebugPrintAppError(ERROR_SWITCH_FBJ_NOT_CONFIG, CI_DEVICE_TYPE_SWITCH, (UINT32)(pSwitchCfgDtStr->SwitchId), PRINT_ONCE); + } + if (0u == pSwitchCfgDtStr->YcRelayId) + { + debug_infor_printf((const)"Switch %d YCJ %d not config.", pSwitchCfgDtStr->SwitchId, pSwitchCfgDtStr->YcRelayId); + DebugPrintAppError(ERROR_SWITCH_YCJ_NOT_CONFIG, CI_DEVICE_TYPE_SWITCH, (UINT32)(pSwitchCfgDtStr->SwitchId), PRINT_ONCE); + } + if (0u == pSwitchCfgDtStr->DcRelayId) + { + debug_infor_printf((const)"Switch %d DCJ %d not config.", pSwitchCfgDtStr->SwitchId, pSwitchCfgDtStr->DcRelayId); + DebugPrintAppError(ERROR_SWITCH_DCJ_NOT_CONFIG, CI_DEVICE_TYPE_SWITCH, (UINT32)(pSwitchCfgDtStr->SwitchId), PRINT_ONCE); + } + if (0u == pSwitchCfgDtStr->FcRelayId) + { + debug_infor_printf((const)"Switch %d FCJ %d not config.", pSwitchCfgDtStr->SwitchId, pSwitchCfgDtStr->FcRelayId); + DebugPrintAppError(ERROR_SWITCH_FCJ_NOT_CONFIG, CI_DEVICE_TYPE_SWITCH, (UINT32)(pSwitchCfgDtStr->SwitchId), PRINT_ONCE); + } + } } } - break; - } - } - for(i=0u;iwRelatPointNum;j++) - { - if(pSwitchCfgDtStr->SwitchId == (dsuStaticHeadStru.pAxleSgmtStru+i)->wRelatPointId[j]) + rtnvalue = 0u; + for (i = 0u; i < dsuDataLenStru.wAxleSgmtLen; i++) { - pSwitchCfgDtStr->SwitchPhySecId = (dsuStaticHeadStru.pAxleSgmtStru+i)->wRelatePhysicalSgmtId; + for (j = 0u; j < (dsuStaticHeadStru.pAxleSgmtStru + i)->wRelatPointNum; j++) + { + if (pSwitchCfgDtStr->SwitchId == (dsuStaticHeadStru.pAxleSgmtStru + i)->wRelatPointId[j]) + { + pSwitchCfgDtStr->SwitchPhySecId = (dsuStaticHeadStru.pAxleSgmtStru + i)->wRelatePhysicalSgmtId; - /*找到道岔继电器后,直接返回*/ - rtnvalue = 1u; - return rtnvalue; + /*找到道岔继电器后,直接返回*/ + rtnvalue = 1u; + break; + } + } + } + + if (CI_PATTERN_FULL_ELECTRONIC == CiPattern) + { + pSwitchCfgDtStr->RedunCollCfg = REDUN_COLL_YES; + for (i = 0u; i < SWITCH_REDUN_COLL_MAX; i++) + { + if ((0u == pSwitchCfgDtStr->RedunCollRelayStru[i].wRedunDb1RelayId) + || (0u == pSwitchCfgDtStr->RedunCollRelayStru[i].wRedunDb2RelayId) + || (0u == pSwitchCfgDtStr->RedunCollRelayStru[i].wRedunFb1RelayId) + || (0u == pSwitchCfgDtStr->RedunCollRelayStru[i].wRedunFb2RelayId)) + { + /*冗余采集继电器无效,不具备冗余采集*/ + pSwitchCfgDtStr->RedunCollCfg = REDUN_COLL_NO; + break; + } + else + { + /*全电子联锁,冗余采集继电器有效,具备冗余采集*/ + } + } + } + else + { + /*传统计算机联锁不支持道岔冗余采集*/ } } } - rtnvalue = 0u; return rtnvalue; } @@ -3821,6 +3864,7 @@ UINT8 PsdCfgDtStruFromDquEmergStr(DSU_SCREEN_STRU * pScreen,PsdConfigDataStruct* pPsdCfgDtStr->VirtualAttribute = PSD_VIRTUAL_ATTR_YES; /*初始化为虚拟属性*/ pPsdCfgDtStr->chPsdControlType = PSD_CONTROL_TYPE_RCI; /*初始化为RCI控制*/ pPsdCfgDtStr->wIbpRelayId = 0U; + pPsdCfgDtStr->wReverseBoardId = 0U;/*初始化无倒切*/ if ((UINT16_MAX != pScreen->wLocalPlatformId) && (0U != pScreen->wLocalPlatformId)) { stationId = dsuStaticHeadStru.pStationStru[dsuStationIndex[pScreen->wLocalPlatformId]].wStationID; @@ -3915,13 +3959,6 @@ UINT8 PsdConfigDataStructInit(CHAR * FSName) UINT16 startAxisSectionWId = 0u; /*始端计轴区段link编号*/ UINT16 endAxisSectionWId = 0u; /*终端计轴区段link编号*/ UINT16 linkId = 0u; - UINT16 wPhySecId = 0U; - UINT8 chLogSectionSum = 0U; - UINT16 wLogSectionId = 0u; - UINT8 k = 0u; - INT16 rtVal = -1; - UINT16 wPhyIndex = 0U; - UINT16 wLogicSgmtIndex = 0U; callFun = dfsEmapInit (FSName); callFun *= InitRelay_ScreenStru (FSName); @@ -3991,57 +4028,10 @@ UINT8 PsdConfigDataStructInit(CHAR * FSName) } } - - /*初始化站台门关联ESB数据*/ - wPhySecId = 0U; - wLogSectionId = 0U; - wPhyIndex = 0U; - wLogicSgmtIndex = 0U; - if (1U == rtnvalue) - { - wPhySecId = dquCICfgDtStr.PsdCfgDtStr[i].PsdRelationPhySecId; - if ((0U < wPhySecId) && (PHYSICAL_SECTION_SUM_MAX > wPhySecId)) - { - wPhyIndex = dsuPhysicalSgmtIndex[wPhySecId];/*获取物理区段索引*/ - wLogSectionId = dquCICfgDtStr.PsclSgmtCfgDtStr[wPhyIndex].LogSectionIdBuf[0];/*仅匹配第一个逻辑区段即可*/ - - if ((0U < wLogSectionId) && (LOGIC_SECTION_SUM_MAX > wLogSectionId)) - { - wLogicSgmtIndex = dsuLogicSgmtIndex[wLogSectionId]; - } - else - { - rtnvalue = 0U;/*非法值,初始化失败*/ - } - } - else - { - rtnvalue = 0U;/*非法值,初始化失败*/ - } - } - - if (1U == rtnvalue) - { - for (k = 0u; k < dquCICfgDtStr.lgcSctCfgDtStr[wLogicSgmtIndex].logSecRltEsbSum; k++) - { - rtVal = SetNoRepeatDataToBuf(dquCICfgDtStr.PsdCfgDtStr[i].IncloudeEsbIdBuf, PSD_INCLUDE_ESB_NUM, dquCICfgDtStr.lgcSctCfgDtStr[wLogicSgmtIndex].logSecRltEsbBuf[k], dquCICfgDtStr.PsdCfgDtStr[i].IncloudeEsbNum); - if (-1 != rtVal) - { - dquCICfgDtStr.PsdCfgDtStr[i].IncloudeEsbNum = (UINT8)rtVal; - } - else - { - rtnvalue = 0u; - break; - } - } - } - - - + rtnvalue = PsdRelateEsbConfigDataInit(i); } } if (0u == rtnvalue) @@ -5087,12 +5077,12 @@ UINT8 RouteCfgDtStruFrmLSRouteStr( LS_RouteStruct * pLSRouteStr,RouteConfigDataS if ((CI_ERROR != ciType)&&(CI_ERROR!= rtnvalue)) { /*进路属性*/ - if (0x01u == (pDsuRouteStr->wRouteType & 0x01u)) + if (0x01u == (pDsuRouteStr->dwRouteType & 0x01u)) { /*进路类型为列车进路*/ pRouteCfgDtStr->RouteType = ROUTE_TYPE_LIECHE; } - else if (0x02u == (pDsuRouteStr->wRouteType & 0x02u)) + else if (0x02u == (pDsuRouteStr->dwRouteType & 0x02u)) { /*进路类型为折返进路*/ pRouteCfgDtStr->RouteType = ROUTE_TYPE_RETURN; @@ -5106,16 +5096,16 @@ UINT8 RouteCfgDtStruFrmLSRouteStr( LS_RouteStruct * pLSRouteStr,RouteConfigDataS { } } - else if (0x0100u == (pDsuRouteStr->wRouteType & 0x0100u)) + else if (0x0100u == (pDsuRouteStr->dwRouteType & 0x0100u)) { /*进路类型为调车进路*/ pRouteCfgDtStr->RouteType = ROUTE_TYPE_DIAOCHE; } - else if (0u == pDsuRouteStr->wRouteType) + else if (0u == pDsuRouteStr->dwRouteType) { pRouteCfgDtStr->RouteType = 0u; } - else if (0u != (0xffu&pDsuRouteStr->wRouteType)) + else if (0u != (0xffu&pDsuRouteStr->dwRouteType)) { /*类型不为0,且低字节不为0,进路类型为列车进路*/ pRouteCfgDtStr->RouteType = ROUTE_TYPE_LIECHE; @@ -5128,7 +5118,7 @@ UINT8 RouteCfgDtStruFrmLSRouteStr( LS_RouteStruct * pLSRouteStr,RouteConfigDataS /*设置配置进路类型*/ pRouteCfgDtStr->ConfigRouteType = pRouteCfgDtStr->RouteType; /*车辆段折返进路,调整配置进路类型*/ - if (0x02u == (pDsuRouteStr->wRouteType & 0x02u)) + if (0x02u == (pDsuRouteStr->dwRouteType & 0x02u)) { pRouteCfgDtStr->ConfigRouteType = ROUTE_TYPE_RETURN; } @@ -5136,7 +5126,7 @@ UINT8 RouteCfgDtStruFrmLSRouteStr( LS_RouteStruct * pLSRouteStr,RouteConfigDataS { } - if (0x0800u == (pDsuRouteStr->wRouteType & 0x0800u)) + if (0x0800u == (pDsuRouteStr->dwRouteType & 0x0800u)) { /*风井进路*/ pRouteCfgDtStr->AirShaftRouteType = ROUTE_TYPE_AIRSHAFT; } @@ -5145,7 +5135,7 @@ UINT8 RouteCfgDtStruFrmLSRouteStr( LS_RouteStruct * pLSRouteStr,RouteConfigDataS } /*自动触发进路属性*/ - if (0x1000u == (pDsuRouteStr->wRouteType & 0x1000u)) + if (0x1000u == (pDsuRouteStr->dwRouteType & 0x1000u)) {/*自动触发进路*/ pRouteCfgDtStr->AutoTriggerType = ROUTE_TYPE_AUTO_TRIGGER; } @@ -5155,7 +5145,7 @@ UINT8 RouteCfgDtStruFrmLSRouteStr( LS_RouteStruct * pLSRouteStr,RouteConfigDataS /*设置进路入库属性*/ pRouteCfgDtStr->cRouteRukuProperty = ROUTE_RUKU_PROPERTY_NO; - if (0x0010U == (pDsuRouteStr->wRouteType & 0x0010U)) + if (0x0010U == (pDsuRouteStr->dwRouteType & 0x0010U)) { pRouteCfgDtStr->cRouteRukuProperty = ROUTE_RUKU_PROPERTY_YES; } @@ -5174,13 +5164,22 @@ UINT8 RouteCfgDtStruFrmLSRouteStr( LS_RouteStruct * pLSRouteStr,RouteConfigDataS { } /*进路联挂属性*/ - if (0x8000U == (pDsuRouteStr->wRouteType & 0x8000U)) + if (0x8000U == (pDsuRouteStr->dwRouteType & 0x8000U)) { pRouteCfgDtStr->chRouteCouplinkType = ROUTE_TYPE_COUPLINK; } else { + } + /*进路联络线属性*/ + if (0x10000U == (pDsuRouteStr->dwRouteType & 0x10000U)) + { + pRouteCfgDtStr->chRouteConnectType = ROUTE_TYPE_CONNECT; + } + else + { + } /*自动进路属性*/ @@ -5733,7 +5732,7 @@ UINT8 RouteCfgDtStruFrmLSRouteStr( LS_RouteStruct * pLSRouteStr,RouteConfigDataS }/* zt 删除单轨相关代码 2022-02-15 */ else { - + rtnvalue = CI_ERROR; } } else @@ -6119,33 +6118,26 @@ UINT8 RouteCfgDtStruFrmLSRouteStr( LS_RouteStruct * pLSRouteStr,RouteConfigDataS } if(CI_SUCCESS == rtnvalue) { - if (CI_TRADITION_RAILWAY == lineIdentity) - {/*传统城轨线路*/ - /*进路离去区段为进路终端信号机内方第一区段,可能不存在(终端阻挡信号机)*/ - routeEndSignal = dsuStaticHeadStru.pRouteStru[dsuRouteIndex[routeId]].wEndSignalId;/*进路终端信号机*/ - if(SIGNAL_SUM_MAX >= dquCICfgDtStr.SgnlCfgDtStrLen) - { - for (i = 0u;i < dquCICfgDtStr.SgnlCfgDtStrLen;i++) - {/*遍历所有信号机*/ - if (routeEndSignal == dquCICfgDtStr.SgnlCfgDtStr[i].SignalId) - {/*找到进路的终端信号机*/ - pRouteCfgDtStr->RouteLeavePhySecId = dquCICfgDtStr.SgnlCfgDtStr[i].InFirstPhySecId; - break; - } - else - { - } + /*进路离去区段为进路终端信号机内方第一区段,可能不存在(终端阻挡信号机)*/ + routeEndSignal = dsuStaticHeadStru.pRouteStru[dsuRouteIndex[routeId]].wEndSignalId;/*进路终端信号机*/ + if (SIGNAL_SUM_MAX >= dquCICfgDtStr.SgnlCfgDtStrLen) + { + for (i = 0u; i < dquCICfgDtStr.SgnlCfgDtStrLen; i++) + {/*遍历所有信号机*/ + if (routeEndSignal == dquCICfgDtStr.SgnlCfgDtStr[i].SignalId) + {/*找到进路的终端信号机*/ + pRouteCfgDtStr->RouteLeavePhySecId = dquCICfgDtStr.SgnlCfgDtStr[i].InFirstPhySecId; + break; + } + else + { } } - else - { - rtnvalue = CI_ERROR; - } - } + } else { - /* zt 删除单轨相关代码 2022-02-15 */ - } + rtnvalue = CI_ERROR; + } } else { @@ -6212,7 +6204,7 @@ UINT8 RouteCfgDtStruFrmLSRouteStr( LS_RouteStruct * pLSRouteStr,RouteConfigDataS { routeEndSignal =dsuStaticHeadStru.pRouteStru[dsuRouteIndex[LSData.pLSRouteStr[i].wRouteId]].wEndSignalId; if((routeStartSignal == routeEndSignal) && - (0x02u == (dsuStaticHeadStru.pRouteStru[dsuRouteIndex[LSData.pLSRouteStr[i].wRouteId]].wRouteType & 0x02u))) + (0x02u == (dsuStaticHeadStru.pRouteStru[dsuRouteIndex[LSData.pLSRouteStr[i].wRouteId]].dwRouteType & 0x02u))) {/*此条折返进路的终端信号机为当前进路的始端信号机*/ /*风井折返进路和普通折返进路*/ if(ROUTE_SIGNAL_OPPOSED_ROUTE_SUM_MAX > index) { @@ -7487,8 +7479,8 @@ UINT8 RouteConfigDataStructInit(CHAR * FSName) for (i = 0u; i < dquCICfgDtStr.lgcSctCfgDtStrLen; i++) { execRet = LogRelateRouteDataInit(dquCICfgDtStr.RouteCfgDtStr, &(dquCICfgDtStr.lgcSctCfgDtStr[i]));/*逻辑区段关联进路计算*/ + execRet *= LogRelateOverlapDataInit(dquCICfgDtStr.OvlapCfgDtStr, &(dquCICfgDtStr.lgcSctCfgDtStr[i]));/*逻辑区段关联保护区段计算*/ execRet *= LogRelateProSwDataInit(dquCICfgDtStr.RouteCfgDtStr, &(dquCICfgDtStr.lgcSctCfgDtStr[i]));/*逻辑区段关联防护道岔计算*/ - execRet *= LogRelateOverlapDataInit(dquCICfgDtStr.OvlapCfgDtStr, &(dquCICfgDtStr.lgcSctCfgDtStr[i]));/*逻辑区段关联防护道岔计算*/ if (execRet > 0u) { @@ -7575,190 +7567,21 @@ UINT8 RouteConfigDataStructInit(CHAR * FSName) } return rtnvalue; } - /********************************************* -*函数功能:按行解析通信关系(从设备IP表里去到的数据,每行17个数据) -*参数说明:Data通信数组 -*返回值:0,失败;1,成功 -*********************************************/ -UINT8 TransmitRelationDataStruFrmSZ(UINT16 Data[]) -{ - UINT8 rtnvalue = 0u; - UINT16 i=0u; - UINT16 j =0u; - UINT16 Type = 0u; - UINT16 findIndex = 0u;/*在既有的zcdus通信关系表中找到的索引,0:未找到,其它值:找到的索引*/ - UINT8 tmpCiId=0u; /*临时变量:ci id*/ - UINT8 tmpOtherSysType =0u;/*临时变量:其它系统类型*/ - UINT8 findFlag = 0u; /*找到标志*/ - UINT16 chRcType = 0U; - /*入口参数防护*/ - if(NULL == Data) - { - /*返回失败*/ - return 0u; - } - else - { - } - if (RC_WORK_MODE_CI == CI_SYSTEM_TYPE_RCI) - { - chRcType = 0x3C00U; - } - else - { - chRcType = 0x3D00U; - } - if((chRcType != (Data[0]&0xFF00u))) - { - rtnvalue = 1u; - return rtnvalue; - } - else - { } -#if 0 - /*第二个数据项是有效数据长度*/ - for(i=0u;i>8); - dquCICfgDtStr.TrsmtRlsDtStr[dquCICfgDtStr.TrsmtRlsDtStrLen].DeviceSum = 0; - dquCICfgDtStr.TrsmtRlsDtStr[dquCICfgDtStr.TrsmtRlsDtStrLen].DeviceIdBuf[dquCICfgDtStr.TrsmtRlsDtStr[dquCICfgDtStr.TrsmtRlsDtStrLen].DeviceSum] = (UINT8)(Data[2+i]&0x00FF); - dquCICfgDtStr.TrsmtRlsDtStr[dquCICfgDtStr.TrsmtRlsDtStrLen].DeviceSum++; - dquCICfgDtStr.TrsmtRlsDtStrLen++; - Type = (Data[2+i]&0xFF00); - } - /*相同的通信设备,只记录一下ID就好(代码默认相同的设备类型写在了一起)*/ - else - { - dquCICfgDtStr.TrsmtRlsDtStr[dquCICfgDtStr.TrsmtRlsDtStrLen-1].DeviceIdBuf[dquCICfgDtStr.TrsmtRlsDtStr[dquCICfgDtStr.TrsmtRlsDtStrLen-1].DeviceSum] = (UINT8)(Data[2+i]&0x00FF); - dquCICfgDtStr.TrsmtRlsDtStr[dquCICfgDtStr.TrsmtRlsDtStrLen-1].DeviceSum++; - } - } -#endif - /*第二个数据项是有效数据长度*/ - for(i=0u;i>8u); - - findFlag = 0u; - - for (j=0u;j>8u); - dquCICfgDtStr.TrsmtRlsDtStr[dquCICfgDtStr.TrsmtRlsDtStrLen].DeviceSum = 0u; - dquCICfgDtStr.TrsmtRlsDtStr[dquCICfgDtStr.TrsmtRlsDtStrLen].DeviceIdBuf[dquCICfgDtStr.TrsmtRlsDtStr[dquCICfgDtStr.TrsmtRlsDtStrLen].DeviceSum] = (UINT8)(Data[2u+i]&0x00FFu); - dquCICfgDtStr.TrsmtRlsDtStr[dquCICfgDtStr.TrsmtRlsDtStrLen].DeviceSum++; - dquCICfgDtStr.TrsmtRlsDtStrLen++; - Type = (Data[2u+i]&0xFF00u); - - - } - else if (1u == findFlag) - {/*找到,则在找到的结构体中增加设备*/ - dquCICfgDtStr.TrsmtRlsDtStr[findIndex].DeviceIdBuf[dquCICfgDtStr.TrsmtRlsDtStr[findIndex].DeviceSum] = (UINT8)(Data[2U+i]&0x00FFu); - dquCICfgDtStr.TrsmtRlsDtStr[findIndex].DeviceSum++; - } - else - { - /*非法值,不处理*/ - } - } - - - - rtnvalue = 1u; - return rtnvalue; -} - -/********************************************* -*函数功能:初始化通信关系数据结构体(OLD) -*参数说明:FSName文件指针 -*返回值:0,失败;1,成功 -*********************************************/ -UINT8 TransmitRelationDataStructInit(CHAR* FSName) + *函数功能:初始化通信关系数据结构体(NEW) + *参数说明:FSName文件指针 + *返回值:0,失败;1,成功 + *********************************************/ +UINT8 TransmitDataStructInitNew(CHAR *FSName) { UINT8 rtnValue = 0u; - UINT8* pDataAddr; /*数据地址*/ - UINT32 DataSize; /*数据大小(字节数)*/ - UINT16 i,j; + UINT8 *pDataAddr = NULL; /*数据地址*/ + UINT32 DataSize = 0u; /*数据大小(字节数)*/ UINT8 funcRtn = 0u; - UINT16 Data[ZC_DSU_TRANSMIT_DATA_LEN/2U]; - /*读取 通信关系 数据*/ - funcRtn = dquGetConfigData(FSName,DEVICE_IP_TYPE, ZC_DSU_TRANSMIT_DATA_ID,&pDataAddr,&DataSize); - - if(funcRtn == 0u) - { - /*函数调用失败*/ - rtnValue = 0u; - return rtnValue; - } - /*求得个数*/ - if(DataSize%ZC_DSU_TRANSMIT_DATA_LEN != 0u) - { - rtnValue = 0u; - debug_infor_printf((const)"\nCI_DEVICE_IP_DATA,ZC_DSU_COMM,len %d not equal to fs",CI_SYSTEM_CI_FUNC_SWITCH_LEN); - DebugPrintAppError(ERROR_fs_columns_len_not_equal_to_ci_software,CI_DEVICE_TYPE_FS_TABLE,(DEVICE_IP_TYPE<<8)+ZC_DSU_TRANSMIT_DATA_ID,PRINT_ONCE); - return rtnValue; - } - for(i=0u;isrcCiId; cLocalWorkType = GetLocalRcWorkMode(); /* 设置数据 */ - if ((tmpLocalCiId < CI_SUM_MAX) && (tmpLocalCiId > 0u) + if ((CI_SUM_MAX > tmpLocalCiId) && (0U < tmpLocalCiId) && ((RC_WORK_MODE_TIOC == cLocalWorkType) || ((RC_WORK_MODE_CI == cLocalWorkType) && (CI_DEVICE_TYPE_CUTOFF_POINT != pDquCiTransmitStr->devType)))) { /* 查找目标ID是否已经添加过 */ @@ -9083,6 +8922,10 @@ UINT8 ReadDquCiTransmitInfoToConfig(DquCiTransmitStruct *pDquCiTransmitStr) { dquCICfgDtStr.CiTransmitStrLen[tmpLocalCiId]++; } + else + { + /* 不处理 */ + } pTmpCiTransConfig = &dquCICfgDtStr.CiTransmitStru[tmpLocalCiId][ii]; pTmpCiTransConfig->destCiId = pDquCiTransmitStr->dstCiId; pTmpCiTransConfig->srcCiId = pDquCiTransmitStr->srcCiId; @@ -9090,7 +8933,7 @@ UINT8 ReadDquCiTransmitInfoToConfig(DquCiTransmitStruct *pDquCiTransmitStr) switch (pDquCiTransmitStr->devType) { case CI_DEVICE_TYPE_SWITCH: /* 道岔 */ - if ((pDquCiTransmitStr->devId > 0u) && (pDquCiTransmitStr->devId < SWITCH_SUM_MAX) && (pTmpCiTransConfig->switchNum < SWITCH_SUM_MAX)) + if ((0U < pDquCiTransmitStr->devId) && (SWITCH_SUM_MAX > pDquCiTransmitStr->devId) && (SWITCH_SUM_MAX > pTmpCiTransConfig->switchNum)) { pTmpCiTransConfig->switchIdBuf[pTmpCiTransConfig->switchNum] = pDquCiTransmitStr->devId; pTmpCiTransConfig->switchNum++; @@ -9102,7 +8945,7 @@ UINT8 ReadDquCiTransmitInfoToConfig(DquCiTransmitStruct *pDquCiTransmitStr) } break; case CI_DEVICE_TYPE_SIGNAL: /* 信号机 */ - if ((pDquCiTransmitStr->devId > 0u) && (pDquCiTransmitStr->devId < SIGNAL_SUM_MAX) && (pTmpCiTransConfig->signalNum < SIGNAL_SUM_MAX)) + if ((0U < pDquCiTransmitStr->devId) && (SIGNAL_SUM_MAX > pDquCiTransmitStr->devId) && (SIGNAL_SUM_MAX > pTmpCiTransConfig->signalNum)) { pTmpCiTransConfig->signalIdBuf[pTmpCiTransConfig->signalNum] = pDquCiTransmitStr->devId; pTmpCiTransConfig->signalNum++; @@ -9114,7 +8957,7 @@ UINT8 ReadDquCiTransmitInfoToConfig(DquCiTransmitStruct *pDquCiTransmitStr) } break; case CI_DEVICE_TYPE_PHYSEC: /* 物理区段 */ - if ((pDquCiTransmitStr->devId > 0u) && (pDquCiTransmitStr->devId < PHYSICAL_SECTION_SUM_MAX) && (pTmpCiTransConfig->phySecNum < PHYSICAL_SECTION_SUM_MAX)) + if ((0U < pDquCiTransmitStr->devId) && (PHYSICAL_SECTION_SUM_MAX > pDquCiTransmitStr->devId) && (PHYSICAL_SECTION_SUM_MAX > pTmpCiTransConfig->phySecNum)) { pTmpCiTransConfig->phySecIdBuf[pTmpCiTransConfig->phySecNum] = pDquCiTransmitStr->devId; pTmpCiTransConfig->phySecIdLockDirFlag[pTmpCiTransConfig->phySecNum] = pDquCiTransmitStr->phyLockDirOppOrNot;/*物理区段锁闭方向是否取反标志*/ @@ -9127,7 +8970,7 @@ UINT8 ReadDquCiTransmitInfoToConfig(DquCiTransmitStruct *pDquCiTransmitStr) } break; case CI_DEVICE_TYPE_LOGICSEC: /* 逻辑区段 */ - if ((pDquCiTransmitStr->devId > 0u) && (pDquCiTransmitStr->devId < LOGIC_SECTION_SUM_MAX) && (pTmpCiTransConfig->logicSecNum < LOGIC_SECTION_SUM_MAX)) + if ((0U < pDquCiTransmitStr->devId) && (LOGIC_SECTION_SUM_MAX > pDquCiTransmitStr->devId) && (LOGIC_SECTION_SUM_MAX > pTmpCiTransConfig->logicSecNum)) { pTmpCiTransConfig->logicSecIdBuf[pTmpCiTransConfig->logicSecNum] = pDquCiTransmitStr->devId; pTmpCiTransConfig->logicSecNum++; @@ -9139,7 +8982,7 @@ UINT8 ReadDquCiTransmitInfoToConfig(DquCiTransmitStruct *pDquCiTransmitStr) } break; case CI_DEVICE_TYPE_ESB: /* ESB */ - if ((pDquCiTransmitStr->devId > 0u) && (pDquCiTransmitStr->devId < ESB_SUM_MAX) && (pTmpCiTransConfig->esbNum < ESB_SUM_MAX)) + if ((0U < pDquCiTransmitStr->devId) && (ESB_SUM_MAX > pDquCiTransmitStr->devId) && (ESB_SUM_MAX > pTmpCiTransConfig->esbNum)) { pTmpCiTransConfig->esbIdBuf[pTmpCiTransConfig->esbNum] = pDquCiTransmitStr->devId; pTmpCiTransConfig->esbNum++; @@ -9151,7 +8994,7 @@ UINT8 ReadDquCiTransmitInfoToConfig(DquCiTransmitStruct *pDquCiTransmitStr) } break; case CI_DEVICE_TYPE_PSD: /* PSD */ - if ((pDquCiTransmitStr->devId > 0u) && (pDquCiTransmitStr->devId < PSD_SUM_MAX) && (pTmpCiTransConfig->psdNum < PSD_SUM_MAX)) + if ((0U < pDquCiTransmitStr->devId) && (PSD_SUM_MAX > pDquCiTransmitStr->devId) && (PSD_SUM_MAX > pTmpCiTransConfig->psdNum)) { pTmpCiTransConfig->psdIdBuf[pTmpCiTransConfig->psdNum] = pDquCiTransmitStr->devId; pTmpCiTransConfig->psdNum++; @@ -9163,7 +9006,7 @@ UINT8 ReadDquCiTransmitInfoToConfig(DquCiTransmitStruct *pDquCiTransmitStr) } break; case CI_DEVICE_TYPE_ROUTE: /* 进路 */ - if ((pDquCiTransmitStr->devId > 0u) && (pDquCiTransmitStr->devId < ROUTE_SUM_MAX) && (pTmpCiTransConfig->routeNum < ROUTE_SUM_MAX)) + if ((0U < pDquCiTransmitStr->devId) && (ROUTE_SUM_MAX > pDquCiTransmitStr->devId) && (ROUTE_SUM_MAX > pTmpCiTransConfig->routeNum)) { pTmpCiTransConfig->routeIdBuf[pTmpCiTransConfig->routeNum] = pDquCiTransmitStr->devId; pTmpCiTransConfig->routeNum++; @@ -9175,7 +9018,7 @@ UINT8 ReadDquCiTransmitInfoToConfig(DquCiTransmitStruct *pDquCiTransmitStr) } break; case CI_DEVICE_TYPE_OVERLAP: /* 保护区段 */ - if ((pDquCiTransmitStr->devId > 0u) && (pDquCiTransmitStr->devId < OVERLAP_SUM_MAX) && (pTmpCiTransConfig->overlapNum < OVERLAP_SUM_MAX)) + if ((0U < pDquCiTransmitStr->devId) && (OVERLAP_SUM_MAX > pDquCiTransmitStr->devId) && (OVERLAP_SUM_MAX > pTmpCiTransConfig->overlapNum)) { pTmpCiTransConfig->overlapIdBuf[pTmpCiTransConfig->overlapNum] = pDquCiTransmitStr->devId; pTmpCiTransConfig->overlapNum++; @@ -9187,7 +9030,7 @@ UINT8 ReadDquCiTransmitInfoToConfig(DquCiTransmitStruct *pDquCiTransmitStr) } break; case CI_DEVICE_TYPE_SPKS: /* SPKS */ - if ((pDquCiTransmitStr->devId > 0u) && (pDquCiTransmitStr->devId < SPKS_SUM_MAX) && (pTmpCiTransConfig->spksNum < SPKS_SUM_MAX)) + if ((0U < pDquCiTransmitStr->devId) && (SPKS_SUM_MAX > pDquCiTransmitStr->devId) && (SPKS_SUM_MAX > pTmpCiTransConfig->spksNum)) { pTmpCiTransConfig->spksIdBuff[pTmpCiTransConfig->spksNum] = pDquCiTransmitStr->devId; pTmpCiTransConfig->spksNum++; @@ -9200,7 +9043,7 @@ UINT8 ReadDquCiTransmitInfoToConfig(DquCiTransmitStruct *pDquCiTransmitStr) break; case CI_DEVICE_TYPE_FLOODGATE:/*防淹门*/ { - if ((pDquCiTransmitStr->devId > 0u) && (pDquCiTransmitStr->devId < FLOOD_GATE_SUM_MAX) && (pTmpCiTransConfig->floodGateNum < FLOOD_GATE_SUM_MAX)) + if ((0U < pDquCiTransmitStr->devId) && (FLOOD_GATE_SUM_MAX > pDquCiTransmitStr->devId) && (FLOOD_GATE_SUM_MAX > pTmpCiTransConfig->floodGateNum)) { pTmpCiTransConfig->floodGateIdBuf[pTmpCiTransConfig->floodGateNum] = pDquCiTransmitStr->devId; pTmpCiTransConfig->floodGateNum++; @@ -9213,7 +9056,7 @@ UINT8 ReadDquCiTransmitInfoToConfig(DquCiTransmitStruct *pDquCiTransmitStr) } break; case CI_DEVICE_TYPE_RELAY: /* 照查继电器 */ - if ((pDquCiTransmitStr->devId > 0u) && (pDquCiTransmitStr->devId < RELAY_SUM_MAX) && (pTmpCiTransConfig->zcjNum < ZCJ_SUM_MAX)) + if ((0U < pDquCiTransmitStr->devId) && (RELAY_SUM_MAX > pDquCiTransmitStr->devId) && (ZCJ_SUM_MAX > pTmpCiTransConfig->zcjNum)) { pTmpCiTransConfig->zcjIdBuf[pTmpCiTransConfig->zcjNum] = pDquCiTransmitStr->devId; pTmpCiTransConfig->zcjNum++; @@ -9225,7 +9068,7 @@ UINT8 ReadDquCiTransmitInfoToConfig(DquCiTransmitStruct *pDquCiTransmitStr) } break; case CI_DEVICE_TYPE_CUTOFF_POINT: /* 分界点 */ - if ((pDquCiTransmitStr->devId > 0u) && (pDquCiTransmitStr->devId < CUTOFF_POINT_SUM_MAX) && (pTmpCiTransConfig->wCutoffPointNum < CUTOFF_POINT_SUM_MAX)) + if ((0U < pDquCiTransmitStr->devId) && (CUTOFF_POINT_SUM_MAX > pDquCiTransmitStr->devId) && (CUTOFF_POINT_SUM_MAX > pTmpCiTransConfig->wCutoffPointNum)) { pTmpCiTransConfig->wCutoffPointBuf[pTmpCiTransConfig->wCutoffPointNum] = pDquCiTransmitStr->devId; pTmpCiTransConfig->wCutoffPointNum++; @@ -9237,8 +9080,8 @@ UINT8 ReadDquCiTransmitInfoToConfig(DquCiTransmitStruct *pDquCiTransmitStr) } break; case CI_DEVICE_TYPE_AUTOROUTE:/* cgh-合并CID-2539-7:自动通过 */ - if ((pDquCiTransmitStr->devId > 0u) && (pDquCiTransmitStr->devId < AUTO_ROUTE_SUM_MAX) && - (pTmpCiTransConfig->autoRouteNum < AUTO_ROUTE_SUM_MAX)) + if ((0U < pDquCiTransmitStr->devId) && (AUTO_ROUTE_SUM_MAX > pDquCiTransmitStr->devId) && + (AUTO_ROUTE_SUM_MAX > pTmpCiTransConfig->autoRouteNum)) { pTmpCiTransConfig->autoRouteIdBuf[pTmpCiTransConfig->autoRouteNum] = pDquCiTransmitStr->devId; pTmpCiTransConfig->autoRouteNum++; @@ -9249,6 +9092,34 @@ UINT8 ReadDquCiTransmitInfoToConfig(DquCiTransmitStruct *pDquCiTransmitStr) debug_infor_printf((const)"ReadDquCiTransmitInfoToConfig: Read AutoRoute Error\n"); } break; + case CI_DEVICE_TYPE_SWITCH_PHYSEC:/*道岔所在物理区段,互联互通接口使用*/ + { + if ((0U < pDquCiTransmitStr->devId) && (PHYSICAL_SECTION_SUM_MAX > pDquCiTransmitStr->devId) && (PHYSICAL_SECTION_SUM_MAX > pTmpCiTransConfig->wSwitchPhySecNum)) + { + pTmpCiTransConfig->wSwitchPhySecBuf[pTmpCiTransConfig->wSwitchPhySecNum] = pDquCiTransmitStr->devId; + pTmpCiTransConfig->wSwitchPhySecNum++; + rtnValue = 1U; + } + else + { + debug_infor_printf((const)"ReadDquCiTransmitInfoToConfig: Read SwtchPhySec Error\n"); + } + } + break; + case CI_DEVICE_TYPE_XIANSU_LOGSEC:/*限速逻辑区段,互联互通接口使用*/ + { + if ((0U < pDquCiTransmitStr->devId) && (LOGIC_SECTION_SUM_MAX > pDquCiTransmitStr->devId) && (LOGIC_SECTION_SUM_MAX > pTmpCiTransConfig->wXianSuLogSecNum)) + { + pTmpCiTransConfig->wXianSuLogSecBuf[pTmpCiTransConfig->wXianSuLogSecNum] = pDquCiTransmitStr->devId; + pTmpCiTransConfig->wXianSuLogSecNum++; + rtnValue = 1U; + } + else + { + debug_infor_printf((const)"ReadDquCiTransmitInfoToConfig: Read XianSuLogse Error\n"); + } + } + break; default: rtnValue = 0u; break; @@ -10319,7 +10190,7 @@ UINT8 OCSwitchConfigDataStructInit(CHAR* FSName) { UINT8 rtnValue = 0u; UINT8* pDataAddr = NULL; /*数据地址*/ - UINT32 DataSize = 0u; /*数据大小(字节数)*/ + UINT32 dwDataSize = 0u; /*数据大小(字节数)*/ UINT8 funcRtn = 0u; UINT16 realRowCount = 0u; /*实际表数据的行数*/ UINT16 i = 0u; @@ -10333,7 +10204,7 @@ UINT8 OCSwitchConfigDataStructInit(CHAR* FSName) else { /*读取道岔转辙机状态指示灯表数据*/ - funcRtn = dquGetConfigDataNew(FSName, OC_DATA_TYPE, OC_SWITCH_ID, &pDataAddr, &DataSize, &realRowCount); + funcRtn = dquGetConfigDataNew(FSName, OC_DATA_TYPE, OC_SWITCH_ID, &pDataAddr, &dwDataSize, &realRowCount); if (0u == funcRtn) { rtnValue = 0u; @@ -10343,19 +10214,19 @@ UINT8 OCSwitchConfigDataStructInit(CHAR* FSName) rtnValue = 1u; for (i = 0u; i < SWITCH_SUM_MAX; i++) { - funcRtn &= CommonMemSet(dquCICfgDtStr.OCSwitchCfgStr, (UINT32)sizeof(OCSwitchConfigDataStruct), 0u, (UINT32)sizeof(OCSwitchConfigDataStruct)); + funcRtn &= CommonMemSet(&dquCICfgDtStr.OCSwitchCfgStr[i], (UINT32)sizeof(OCSwitchConfigDataStruct), 0u, (UINT32)sizeof(OCSwitchConfigDataStruct)); } if (1u == funcRtn) { /*不做处理*/ } - if ((0u != DataSize) && (0u != realRowCount)) + if ((0u != dwDataSize) && (0u != realRowCount)) { - if (0u == (DataSize % realRowCount)) + if (0u == (dwDataSize % realRowCount)) { /*计算每行字节长度*/ - wDataLen = (UINT16)(DataSize / realRowCount); + wDataLen = (UINT16)(dwDataSize / realRowCount); for (i = 0u; i < realRowCount; i++) { /*道岔配置表*/ @@ -10383,6 +10254,10 @@ UINT8 OCSwitchConfigDataStructInit(CHAR* FSName) } } + if (1u == rtnValue) + {/*计算出每个道岔同板卡的其他道岔*/ + rtnValue = AllSwitchOtherSwitchByOCconfig(); + } return rtnValue; } @@ -10941,7 +10816,6 @@ UINT8 ReadVirCIWithOCRelationData(CHAR* FSName) UINT8 RowDatalen =0u;/*行数*/ UINT8 virCIid = 0u; UINT8 jj =0u; - UINT16 ocid =0u; UINT8 ocNum=0u; @@ -11835,6 +11709,162 @@ UINT8 ReverseCutCfgDtStruFromDquStr(Relay_ReverseCutStruct* pReverseCutRelay, Re return rtnvalue; } +/********************************************* +*函数功能:初始化倒切开关配置数据结构体----对外结构体 +*参数说明:FSName文件指针 +*返回值:0,失败;1,成功 +*********************************************/ +UINT8 ReverseSwitchConfigDataStructInit(CHAR * FSName) +{ + + UINT8 rtnvalue = 0u; + UINT8 callFun = 0u; + UINT16 i = 0u; + + if (NULL != FSName) + { + + callFun = InitRelay_ReverseSwitchStru(FSName); + callFun *= InitRelay_ReverseBoardStru(FSName); + } + else + { + rtnvalue = 0u; + } + /*电子地图初始化失败,函数失败退出*/ + if (0u == callFun) + { + rtnvalue = 0u; + } + else + { + rtnvalue = 1u; + } + + if ((1u == rtnvalue)&&(CI_SUM_MAX > RelayDataLen.RelayReverseSwitchStrLen)) + { + dquCICfgDtStr.wRelayReverseSwitchStrLen = RelayDataLen.RelayReverseSwitchStrLen; + for (i = 0u; iwId = pReverseSwitchRelay->wReversSwitchId; + for (jj = 0u; jjwColCloseRelayId == RelayData.pRelayCfgDtStr[jj].RelayId) + { + chFindClose = CI_SUCCESS; + } + else if (pReverseSwitchRelay->wColOpenRelayId == RelayData.pRelayCfgDtStr[jj].RelayId) + { + pReverseSwitchCfgDtStr->chBelongCiId = RelayData.pRelayCfgDtStr[jj].BelongCiId; + chFindOpen = CI_SUCCESS; + } + else + { + ; + } + if ((CI_SUCCESS == chFindOpen) && (CI_SUCCESS == chFindClose)) + { + break;/*均找到*/ + } + } + + if ((CI_ERROR == chFindOpen) || (CI_ERROR == chFindClose)) + { + /*返回失败*/ + rtnvalue = 0u; + debug_infor_printf((char*)"\nOpenRelay :%d CloseRelay:%d, Not Find In RelayTable \n", pReverseSwitchRelay->wColOpenRelayId, pReverseSwitchRelay->wColCloseRelayId); + } + else + { + rtnvalue = 1u; + pReverseSwitchCfgDtStr->wColCloseRelayId = pReverseSwitchRelay->wColCloseRelayId; + pReverseSwitchCfgDtStr->wColOpenRelayId = pReverseSwitchRelay->wColOpenRelayId; + pReverseSwitchCfgDtStr->wRelateBoardNum = pReverseSwitchRelay->wRelateBoardNum; + if ((0U < pReverseSwitchCfgDtStr->wRelateBoardNum) && (REVERSE_BOARD_SUM_MAX >= pReverseSwitchCfgDtStr->wRelateBoardNum)) + { + for (kk = 0u; kk < pReverseSwitchCfgDtStr->wRelateBoardNum; kk++) + { + pReverseSwitchCfgDtStr->strRelateBoardBuf[kk].wReversBoardId = pReverseSwitchRelay->strRelateBoardBuf[kk].wReversBoardId; + pReverseSwitchCfgDtStr->strRelateBoardBuf[kk].chDevType = pReverseSwitchRelay->strRelateBoardBuf[kk].chDevType; + pReverseSwitchCfgDtStr->strRelateBoardBuf[kk].wBoardColCloseRelayId = pReverseSwitchRelay->strRelateBoardBuf[kk].wBoardColCloseRelayId; + pReverseSwitchCfgDtStr->strRelateBoardBuf[kk].wBoardColOpenRelayId = pReverseSwitchRelay->strRelateBoardBuf[kk].wBoardColOpenRelayId; + pReverseSwitchCfgDtStr->strRelateBoardBuf[kk].wDevId = pReverseSwitchRelay->strRelateBoardBuf[kk].wDevId; + chFindClose = CI_ERROR; + chFindOpen = CI_ERROR; + for (jj = 0u; jjstrRelateBoardBuf[kk].wBoardColCloseRelayId == RelayData.pRelayCfgDtStr[jj].RelayId) + { + chFindClose = CI_SUCCESS; + } + else if (pReverseSwitchCfgDtStr->strRelateBoardBuf[kk].wBoardColOpenRelayId == RelayData.pRelayCfgDtStr[jj].RelayId) + { + pReverseSwitchCfgDtStr->chBelongCiId = RelayData.pRelayCfgDtStr[jj].BelongCiId; + chFindOpen = CI_SUCCESS; + } + else + { + ; + } + if ((CI_SUCCESS == chFindOpen) && (CI_SUCCESS == chFindClose)) + { + break;/*均找到*/ + } + } + + if ((CI_ERROR == chFindOpen) || (CI_ERROR == chFindClose)) + { + rtnvalue = 0u; + debug_infor_printf((char*)"\nBoard: %d openRelay:%d closeRelay:%d, Not Find In RelayTable \n", pReverseSwitchCfgDtStr->strRelateBoardBuf[kk].wReversBoardId, + pReverseSwitchCfgDtStr->strRelateBoardBuf[kk].wBoardColOpenRelayId, pReverseSwitchCfgDtStr->strRelateBoardBuf[kk].wBoardColCloseRelayId); + break; + } + } + } + } + } + else + { + /*返回失败*/ + rtnvalue = 0u; + } + return rtnvalue; +} + /********************************************* *函数功能:初始化TIOCATS设备网关配置数据结构体----对外结构体 *参数说明:FSName文件指针 @@ -13773,8 +13803,6 @@ void R_OCSwitchModeCfgDataFromChar(UINT8* pDataAddr) UINT8* pData = NULL; UINT16 wSwitchIdTemp = 0u; UINT8 i = 0U; - UINT8 chDataType = DATA_TYPE_MAIN_BRANCH; - chDataType = GetLocalPublicDataType();/*用于28.0.0.14不进行逻辑区段关联进路初始化*/ if (NULL == pDataAddr) @@ -13797,24 +13825,23 @@ void R_OCSwitchModeCfgDataFromChar(UINT8* pDataAddr) dquCICfgDtStr.OCSwitchCfgStr[dquCICfgDtStr.OCSwitchCfgStrLen].BelongOcId = ShortFromChar(pData); pData += 2u; - if (DATA_TYPE_MAIN_BRANCH == chDataType) + + /*跳过牵引级数*/ + pData += 1u; + for (i = 0u; i < SWITCH_BOARD_MODE_MAX; i++) { - /*跳过牵引级数*/ + /*道岔模块-A板卡ID*/ + dquCICfgDtStr.OCSwitchCfgStr[dquCICfgDtStr.OCSwitchCfgStrLen].ModuleAddrA[i] = *pData; pData += 1u; - for (i = 0u; i < SWITCH_BOARD_MODE_MAX; i++) - { - /*道岔模块-A板卡ID*/ - dquCICfgDtStr.OCSwitchCfgStr[dquCICfgDtStr.OCSwitchCfgStrLen].ModuleAddrA[i] = *pData; - pData += 1u; - pData += 1u;/*模块位置跳过*/ + pData += 1u;/*模块位置跳过*/ - /*道岔模块-B板卡ID*/ - dquCICfgDtStr.OCSwitchCfgStr[dquCICfgDtStr.OCSwitchCfgStrLen].ModuleAddrB[i] = *pData; - pData += 1u; - pData += 1u;/*模块位置跳过*/ + /*道岔模块-B板卡ID*/ + dquCICfgDtStr.OCSwitchCfgStr[dquCICfgDtStr.OCSwitchCfgStrLen].ModuleAddrB[i] = *pData; + pData += 1u; + pData += 1u;/*模块位置跳过*/ - } } + dquCICfgDtStr.OCSwitchCfgStrLen++;/*数量增加*/ @@ -13904,7 +13931,8 @@ UINT8 SwitchOcCfgStrFromOCconfigStr(SwitchBelongOCConfigDataStr* pSwitchOCcfgDtS } else { - pSwitchOCcfgDtStr->OcId = pOcCfgDtStr->BelongOcId; + pSwitchOCcfgDtStr->OcId = (UINT8)pOcCfgDtStr->BelongOcId; + pSwitchOCcfgDtStr->wThisOcOtherSwitchId = pOcCfgDtStr->otherSwitchId;/*同属于一个OC同块板卡的另一个道岔*/ rtnvalue =1u; for (i = 0u; i < MAX_OC_SWITCH_INCLUDE_BOARD_NUM; i++) { @@ -13914,7 +13942,7 @@ UINT8 SwitchOcCfgStrFromOCconfigStr(SwitchBelongOCConfigDataStr* pSwitchOCcfgDtS ret = SetNoUINT8RepeatDataToBuf((UINT8 *)pSwitchOCcfgDtStr->ModuleAddr, MAX_OC_SWITCH_INCLUDE_BOARD_NUM, pOcCfgDtStr->ModuleAddrA[i], boardNum); if (-1 != ret) { - boardNum = ret; + boardNum = (UINT8)ret; } else { @@ -13930,7 +13958,7 @@ UINT8 SwitchOcCfgStrFromOCconfigStr(SwitchBelongOCConfigDataStr* pSwitchOCcfgDtS ret = SetNoUINT8RepeatDataToBuf((UINT8*)pSwitchOCcfgDtStr->ModuleAddr, MAX_OC_SWITCH_INCLUDE_BOARD_NUM, pOcCfgDtStr->ModuleAddrB[i], boardNum); if (-1 != ret) { - boardNum = ret; + boardNum = (UINT8)ret; } else { @@ -13972,8 +14000,6 @@ UINT8 CalcuSwitchInsertionBoxData(SwitchConfigDataStruct* pSwitchCfgDtStr) UINT8 i = 0u; UINT8 j = 0u; UINT8 chBoxId = 0u;/*插箱ID*/ - UINT8 cInsertionBoxNum = 0u; - INT16 ret = 0; /*入口参数防护*/ if (NULL == pSwitchCfgDtStr) @@ -14025,7 +14051,7 @@ UINT8 CalcuSwitchInsertionBoxData(SwitchConfigDataStruct* pSwitchCfgDtStr) return rtnvalue; } /********************************************* -*函数功能:填充不重复的数据进入数组 +*函数功能:填充不重复的数据进入UINT8数组 *参数说明:目标数组的指针 * 待填入的数据 *返回值:非-1为已填入的长度,-1为空间已满 @@ -14090,43 +14116,50 @@ UINT8 LogRelateProSwDataByOverlapInit(LogicSectionConfigDataStruct* pLgScCfgDtSt if (NULL != pLgScCfgDtStr) { - /*逻辑区段关联防护道岔计算*/ - for (ii = 0; ii < pLgScCfgDtStr->chLogsecSwitchSum; ii++) - {/*遍历逻辑区段包含的所有道岔*/ - wProtectSwSum = dquCICfgDtStr.SwchCfgDtStr[g_dsuEmapStru->dsuEmapIndexStru->dsuPointIndex[pLgScCfgDtStr->LogsecSwitchIdStru[ii].SwitchId]].wProtectSwitchNum; - for (jj = 0; jj < wProtectSwSum; jj++) - {/*遍历道岔对应的防护道岔*/ - wProtectSwId = dquCICfgDtStr.SwchCfgDtStr[g_dsuEmapStru->dsuEmapIndexStru->dsuPointIndex[pLgScCfgDtStr->LogsecSwitchIdStru[ii].SwitchId]].wszProtectSwitchIdBuf[jj]; - chProtectSwFlag = 0U; - for (kk = 0U; kk < pLgScCfgDtStr->chRelateOverLapSum; kk++) - {/*遍历逻辑区段关联的保护区段*/ - for (hh = 0U; hh < dquCICfgDtStr.OvlapCfgDtStr[g_dsuEmapStru->dsuEmapIndexStru->dsuProtectLinkIndex[pLgScCfgDtStr->wRelateOverLapIdBuf[kk]]].ProtectSwitchSum; hh++) - {/*查询逻辑区段关联保护区段,若保护区段包含该防护道岔,则逻辑区段关联防护道岔的位置与保护区段一致*/ - if (dquCICfgDtStr.OvlapCfgDtStr[g_dsuEmapStru->dsuEmapIndexStru->dsuProtectLinkIndex[pLgScCfgDtStr->wRelateOverLapIdBuf[kk]]].ProtectSwitchStru[hh].ProtectSwitchId == wProtectSwId) - { - for (mm = 0U; mm < pLgScCfgDtStr->chRelateProSwSum; mm++) - {/*关联防护道岔ID去重*/ - if ((pLgScCfgDtStr->wRelateProSwId[mm].SwitchId == dquCICfgDtStr.OvlapCfgDtStr[g_dsuEmapStru->dsuEmapIndexStru->dsuProtectLinkIndex[pLgScCfgDtStr->wRelateOverLapIdBuf[kk]]].ProtectSwitchStru[hh].ProtectSwitchId) - && (pLgScCfgDtStr->wRelateProSwId[mm].SwitchPosition == dquCICfgDtStr.OvlapCfgDtStr[g_dsuEmapStru->dsuEmapIndexStru->dsuProtectLinkIndex[pLgScCfgDtStr->wRelateOverLapIdBuf[kk]]].ProtectSwitchStru[hh].ProtectPosition)) - { - chProtectSwFlag = 1U; + if (0u == pLgScCfgDtStr->chRelateRouteSum) + { + /*逻辑区段关联防护道岔计算*/ + for (ii = 0; ii < pLgScCfgDtStr->chLogsecSwitchSum; ii++) + {/*遍历逻辑区段包含的所有道岔*/ + wProtectSwSum = dquCICfgDtStr.SwchCfgDtStr[g_dsuEmapStru->dsuEmapIndexStru->dsuPointIndex[pLgScCfgDtStr->LogsecSwitchIdStru[ii].SwitchId]].wProtectSwitchNum; + for (jj = 0; jj < wProtectSwSum; jj++) + {/*遍历道岔对应的防护道岔*/ + wProtectSwId = dquCICfgDtStr.SwchCfgDtStr[g_dsuEmapStru->dsuEmapIndexStru->dsuPointIndex[pLgScCfgDtStr->LogsecSwitchIdStru[ii].SwitchId]].wszProtectSwitchIdBuf[jj]; + chProtectSwFlag = 0U; + for (kk = 0U; kk < pLgScCfgDtStr->chRelateOverLapSum; kk++) + {/*遍历逻辑区段关联的保护区段*/ + for (hh = 0U; hh < dquCICfgDtStr.OvlapCfgDtStr[g_dsuEmapStru->dsuEmapIndexStru->dsuProtectLinkIndex[pLgScCfgDtStr->wRelateOverLapIdBuf[kk]]].ProtectSwitchSum; hh++) + {/*查询逻辑区段关联保护区段,若保护区段包含该防护道岔,则逻辑区段关联防护道岔的位置与保护区段一致*/ + if (dquCICfgDtStr.OvlapCfgDtStr[g_dsuEmapStru->dsuEmapIndexStru->dsuProtectLinkIndex[pLgScCfgDtStr->wRelateOverLapIdBuf[kk]]].ProtectSwitchStru[hh].ProtectSwitchId == wProtectSwId) + { + for (mm = 0U; mm < pLgScCfgDtStr->chRelateProSwSum; mm++) + {/*关联防护道岔ID去重*/ + if ((pLgScCfgDtStr->wRelateProSwId[mm].SwitchId == dquCICfgDtStr.OvlapCfgDtStr[g_dsuEmapStru->dsuEmapIndexStru->dsuProtectLinkIndex[pLgScCfgDtStr->wRelateOverLapIdBuf[kk]]].ProtectSwitchStru[hh].ProtectSwitchId) + && (pLgScCfgDtStr->wRelateProSwId[mm].SwitchPosition == dquCICfgDtStr.OvlapCfgDtStr[g_dsuEmapStru->dsuEmapIndexStru->dsuProtectLinkIndex[pLgScCfgDtStr->wRelateOverLapIdBuf[kk]]].ProtectSwitchStru[hh].ProtectPosition)) + { + chProtectSwFlag = 1U; + break; + } + } + if (1U != chProtectSwFlag) + {/*当前防护道岔数组中不包含此ID才进行添加*/ + if (LOGSEC_RELATE_PRO_SW_SUM_MAX > pLgScCfgDtStr->chRelateProSwSum) + { + pLgScCfgDtStr->wRelateProSwId[pLgScCfgDtStr->chRelateProSwSum].SwitchId = dquCICfgDtStr.OvlapCfgDtStr[g_dsuEmapStru->dsuEmapIndexStru->dsuProtectLinkIndex[pLgScCfgDtStr->wRelateOverLapIdBuf[kk]]].ProtectSwitchStru[hh].ProtectSwitchId; + pLgScCfgDtStr->wRelateProSwId[pLgScCfgDtStr->chRelateProSwSum].SwitchPosition = dquCICfgDtStr.OvlapCfgDtStr[g_dsuEmapStru->dsuEmapIndexStru->dsuProtectLinkIndex[pLgScCfgDtStr->wRelateOverLapIdBuf[kk]]].ProtectSwitchStru[hh].ProtectPosition; + (pLgScCfgDtStr->chRelateProSwSum)++; + } + else + { + chMaxCheck = CI_ERROR; + } break; } } - if (1U != chProtectSwFlag) - {/*当前防护道岔数组中不包含此ID才进行添加*/ - if (LOGSEC_RELATE_PRO_SW_SUM_MAX > pLgScCfgDtStr->chRelateProSwSum) - { - pLgScCfgDtStr->wRelateProSwId[pLgScCfgDtStr->chRelateProSwSum].SwitchId = dquCICfgDtStr.OvlapCfgDtStr[g_dsuEmapStru->dsuEmapIndexStru->dsuProtectLinkIndex[pLgScCfgDtStr->wRelateOverLapIdBuf[kk]]].ProtectSwitchStru[hh].ProtectSwitchId; - pLgScCfgDtStr->wRelateProSwId[pLgScCfgDtStr->chRelateProSwSum].SwitchPosition = dquCICfgDtStr.OvlapCfgDtStr[g_dsuEmapStru->dsuEmapIndexStru->dsuProtectLinkIndex[pLgScCfgDtStr->wRelateOverLapIdBuf[kk]]].ProtectSwitchStru[hh].ProtectPosition; - (pLgScCfgDtStr->chRelateProSwSum)++; - } - else - { - chMaxCheck = CI_ERROR; - } - break; - } + } + if (CI_ERROR == chMaxCheck) + { + break; } } if (CI_ERROR == chMaxCheck) @@ -14141,17 +14174,18 @@ UINT8 LogRelateProSwDataByOverlapInit(LogicSectionConfigDataStruct* pLgScCfgDtSt } if (CI_ERROR == chMaxCheck) { - break; + rtnvalue = 0U; + } + else + { + rtnvalue = 1U; } - } - if (CI_ERROR == chMaxCheck) - { - rtnvalue = 0U; } else { rtnvalue = 1U; } + } return rtnvalue; @@ -14311,7 +14345,7 @@ UINT8 AxisSecProtectSwitchInit(void) ret = AxisSecCfgDtStruFromLogicSecStr(dquCICfgDtStr.lgcSctCfgDtStr[j].wRelateProSwId, dquCICfgDtStr.lgcSctCfgDtStr[j].chRelateProSwSum, pAxScCfgDtStr->wRelateProSwId, pAxScCfgDtStr->chRelateProSwSum); if (-1 != ret) { - pAxScCfgDtStr->chRelateProSwSum = ret;/*更新数量*/ + pAxScCfgDtStr->chRelateProSwSum = (UINT8)ret;/*更新数量*/ } break; } @@ -14340,5 +14374,257 @@ UINT8 AxisSecProtectSwitchInit(void) return rtnvalue; } +/********************************************* +*函数功能:为某道岔计算属于同板卡的另一道岔ID +*参数说明:OCSwitchConfigDataStruct * pOCSwitchCfgStr 道岔配置数据结构体 +*返回值:0 失败,1成功 +* add by mpt 20260404 +*********************************************/ +UINT8 SwitchOtherSwitchFromOCconfig(OCSwitchConfigDataStruct * pOCSwitchCfgStr) +{ + UINT16 j = 0u; + UINT8 rtnvalue = 0u; + UINT8 k = 0u; + /*入口参数防护*/ + if (NULL == pOCSwitchCfgStr) + { + /*返回失败*/ + rtnvalue = 0u; + } + else + { + rtnvalue = 1u; - + if (SWITCH_SUM_MAX > pOCSwitchCfgStr->SwitchId) + { + + for (j = 0u; j < dquCICfgDtStr.OCSwitchCfgStrLen; j++) + { + if ((pOCSwitchCfgStr->SwitchId != dquCICfgDtStr.OCSwitchCfgStr[j].SwitchId)&&(pOCSwitchCfgStr->BelongOcId == dquCICfgDtStr.OCSwitchCfgStr[j].BelongOcId)) + {/*不是自己*/ + for (k = 0u; k < MAX_OC_SWITCH_INCLUDE_BOARD_NUM; k++) + { + + if ((pOCSwitchCfgStr->ModuleAddrA[k] == dquCICfgDtStr.OCSwitchCfgStr[j].ModuleAddrA[k])&&(UINT8_MAX !=pOCSwitchCfgStr->ModuleAddrA[k]) && (0u != pOCSwitchCfgStr->ModuleAddrA[k])) + {/*板卡ID有效,且相等*/ + pOCSwitchCfgStr->otherSwitchId = dquCICfgDtStr.OCSwitchCfgStr[j].SwitchId; + break; + } + } + if (0u != pOCSwitchCfgStr->otherSwitchId) + { + break; + } + else + { + /*什么也不执行,不会有仅配置B系不配A系的情况*/ + } + } + } + } + else + { + /*返回失败*/ + rtnvalue = 0u; + } + } + + return rtnvalue; +} + +/********************************************* +*函数功能:为所有道岔计算属于同板卡的另一道岔ID +*参数说明:void +*返回值:0 失败,1成功 +* add by mpt 20260404 +*********************************************/ +UINT8 AllSwitchOtherSwitchByOCconfig(void) +{ + UINT16 j = 0U; + UINT8 rtnvalue = 0U; + if (0U == dquCICfgDtStr.OCSwitchCfgStrLen) + { + rtnvalue = 1U; /*没有配置道岔数据,返回1*/ + } + else + { + for (j = 0U; j < dquCICfgDtStr.OCSwitchCfgStrLen; j++) + { + rtnvalue = SwitchOtherSwitchFromOCconfig(&dquCICfgDtStr.OCSwitchCfgStr[j]); + if (0U == rtnvalue) + { + break; + } + } + } + return rtnvalue; +} + +/********************************************* +*函数功能:初始化屏蔽门关联ESB数据----降低复杂度使用 +*参数说明:FSName文件指针 +*输入参数 wPsdIndex屏蔽门索引 +*返回值:0,失败;1,成功 +* fan 20260421 +*********************************************/ +UINT8 PsdRelateEsbConfigDataInit(UINT16 wPsdIndex) +{ + UINT8 rtnvalue = 0U; + UINT16 wPhySecId = 0U; + UINT16 wLogSectionId = 0u; + UINT16 wPhyIndex = 0U; + UINT16 wLogicSgmtIndex = 0U; + UINT8 k = 0u; + INT16 rtVal = -1; + if (PSD_SUM_MAX > wPsdIndex) + { + rtnvalue = 1U; + wPhyIndex = 0U; + wLogicSgmtIndex = 0U; + wPhySecId = dquCICfgDtStr.PsdCfgDtStr[wPsdIndex].PsdRelationPhySecId; + if ((0U < wPhySecId) && (PHYSICAL_SECTION_SUM_MAX > wPhySecId)) + { + wPhyIndex = dsuPhysicalSgmtIndex[wPhySecId];/*获取物理区段索引*/ + wLogSectionId = dquCICfgDtStr.PsclSgmtCfgDtStr[wPhyIndex].LogSectionIdBuf[0];/*仅匹配第一个逻辑区段即可*/ + + if ((0U < wLogSectionId) && (LOGIC_SECTION_SUM_MAX > wLogSectionId)) + { + wLogicSgmtIndex = dsuLogicSgmtIndex[wLogSectionId]; + } + else + { + rtnvalue = 0U;/*非法值,初始化失败*/ + } + } + else + { + rtnvalue = 0U;/*非法值,初始化失败*/ + } + + if (1U == rtnvalue) + { + for (k = 0u; k < dquCICfgDtStr.lgcSctCfgDtStr[wLogicSgmtIndex].logSecRltEsbSum; k++) + { + rtVal = SetNoRepeatDataToBuf(dquCICfgDtStr.PsdCfgDtStr[wPsdIndex].IncloudeEsbIdBuf, PSD_INCLUDE_ESB_NUM, dquCICfgDtStr.lgcSctCfgDtStr[wLogicSgmtIndex].logSecRltEsbBuf[k], dquCICfgDtStr.PsdCfgDtStr[wPsdIndex].IncloudeEsbNum); + if (-1 != rtVal) + { + dquCICfgDtStr.PsdCfgDtStr[wPsdIndex].IncloudeEsbNum = (UINT8)rtVal; + } + else + { + rtnvalue = 0u; + break; + } + } + } + } + return rtnvalue; +} + +/* +*功能描述: RCI功能配置数据初始化 +*输入参数: CHAR * FSName 数据文件名指针 +*输出参数: 无 +*返回值: 0 失败 +* 1 成功 +* by cgh 20260516 +*/ +UINT8 RciCommonConfigDataInit(CHAR* FSName) +{ + UINT8 chReval = CI_ERROR; + + chReval = CiPatternInit(FSName); /*初始化当前联锁类型配置数据*/ + chReval &= RciSerialCommDataInit(); /*初始化相邻联锁串口通信数据*/ + + return chReval; +} + +/* +*功能描述: 相邻联锁串口通信数据初始化 +*输入参数: 无 +*输出参数: 无 +*返回值: 0 失败 +* 1 成功 +* by cgh 20260516 +*/ +static UINT8 RciSerialCommDataInit(void) +{ + UINT8 chRtnValue = CI_ERROR; /*函数返回值*/ + UINT8 chFuncRtn = CI_ERROR; /*临时返回值承接变量*/ + UINT8* pDataAddr = NULL; /*数据地址*/ + UINT32 DataSize = 0U; /*数据大小(字节数)*/ + UINT16 realRowCount = 0U; /*实际表数据的行数*/ + UINT16 ii = 0U; /*循环变量*/ + UINT8 chLocalCiId = 0U; /*本地联锁ID*/ + UINT16 wDataLen = 0U; /*数据宽度*/ + UINT16 val = 0U; /*临时承接变量*/ + UINT8 chCiDevId = 0U; /*CI设备ID*/ + UINT8 chCiDevType = 0U; /*CI设备类型*/ + UINT8 chLocalRcWorkMode = 0u; /*本地RC工作模式*/ + + chFuncRtn = dquGetConfigDataNew((const)DataPath, CI_SYSTEM_PARAMETER_DATA_TYPE, CI_SYSTEM_SERIAL_COMM_ID, &pDataAddr, &DataSize, &realRowCount); + if (0U == chFuncRtn) + { + /*函数调用失败*/ + chRtnValue = CI_ERROR; + } + else + { + chRtnValue = CI_SUCCESS; + + if ((0u != DataSize) && (0u != realRowCount)) + { + if (0U == (DataSize % realRowCount)) + { + chLocalCiId = GetSystemParaLocalCiId(); + chLocalRcWorkMode = GetLocalRcWorkMode(); + wDataLen = (UINT16)(DataSize / realRowCount); + + for (ii = 0u; ii < realRowCount; ii++) + { + val = dquCiShortFromChar(&pDataAddr[0]); + chCiDevId = (UINT8)(val & 0x00FF); + chCiDevType = (UINT8)((val & 0xFF00) >> 8); + + if ((chLocalCiId == chCiDevId) && (chLocalRcWorkMode == chCiDevType)) + { + /*设置本联锁串口通信标志*/ + chRtnValue &= SetLocalSerialCommFlag(SERIAL_COMM_YES); + + /*设置本联锁串口通信数据*/ + val = dquCiShortFromChar(&pDataAddr[2]); + chRtnValue &= SetLocalSerialCommData(0U, 0U, val, pDataAddr[4]); + chRtnValue &= SetLocalSerialCommData(0U, 1U, val, pDataAddr[5]); + val = dquCiShortFromChar(&pDataAddr[6]); + chRtnValue &= SetLocalSerialCommData(1U, 0U, val, pDataAddr[8]); + chRtnValue &= SetLocalSerialCommData(1U, 1U, val, pDataAddr[9]); + } + else + { + ; + } + if (CI_ERROR == chRtnValue) + { + break; + } + else + { + pDataAddr += wDataLen; + } + } + } + else + { + /*数据错误*/ + chRtnValue = CI_ERROR; + } + + } + else + { + ; /*不做处理,不配置数据初始化成功*/ + } + } + + return chRtnValue; +} \ No newline at end of file diff --git a/TSCP/src/APP/ciapp/QueryFiles/dquCIInit.h b/TSCP/src/APP/ciapp/QueryFiles/dquCIInit.h index bb350af..35217f3 100644 --- a/TSCP/src/APP/ciapp/QueryFiles/dquCIInit.h +++ b/TSCP/src/APP/ciapp/QueryFiles/dquCIInit.h @@ -176,6 +176,9 @@ typedef struct ReverseCutCfgDataStru stReverseCutCfgDtStr[REVERSE_CUT_SUM_MAX]; /*倒切设备配置数据*/ UINT16 wReverseCutCfgLen; + ReverseSwitchCfgDataStru stReverseSwitchCfgDtStr[CI_SUM_MAX]; /*倒切设备开关板卡配置数据*/ + UINT16 wRelayReverseSwitchStrLen; /*倒切开关个数*/ + EaConfigStru szEaCfgDtStr[EA_CFG_SUM_MAX]; /*防护区域配置数据*/ UINT16 wEaCfgLen; /*防护区域配置数据长度*/ @@ -427,20 +430,6 @@ UINT8 RouteCfgDtStruFrmLSRouteStr( LS_RouteStruct * pLSRouteStr,RouteConfigDataS UINT8 RouteConfigDataStructInit(CHAR * FSName); -/********************************************* -*函数功能:按行解析通信关系(从设备IP表里去到的数据,每行17个数据) -*参数说明:Data通信数组 -*返回值:0,失败;1,成功 -*********************************************/ -UINT8 TransmitRelationDataStruFrmSZ(UINT16 Data[]); - -/********************************************* -*函数功能:初始化通信关系数据结构体 -*参数说明:FSName文件指针 -*返回值:0,失败;1,成功 -*********************************************/ -UINT8 TransmitRelationDataStructInit(CHAR* FSName); - /********************************************* *函数功能:初始化通信关系数据结构体(NEW) *参数说明:FSName文件指针 @@ -1068,5 +1057,54 @@ INT16 AxisSecCfgDtStruFromLogicSecStr(LogsecSwitchStruct* pSrcSwitchStructBuf, U * add mpt 20260331 *********************************************/ UINT8 AxisSecProtectSwitchInit(void); +/********************************************* +*函数功能:为某道岔计算属于同板卡的另一道岔ID +*参数说明:OCSwitchConfigDataStruct * pOCSwitchCfgStr 道岔配置数据结构体 +* add by mpt 20260404 +*返回值:0 失败,1成功 +*********************************************/ +UINT8 SwitchOtherSwitchFromOCconfig(OCSwitchConfigDataStruct* pOCSwitchCfgStr); +/********************************************* +*函数功能:为所有道岔计算属于同板卡的另一道岔ID +*参数说明:void +*返回值:0 失败,1成功 +* add by mpt 20260404 +*********************************************/ +UINT8 AllSwitchOtherSwitchByOCconfig(void); + +/********************************************* +*函数功能:初始化屏蔽门关联ESB数据----降低复杂度使用 +*参数说明:FSName文件指针 +*输入参数 wPsdIndex屏蔽门索引 +*返回值:0,失败;1,成功 +* fan 20260421 +*********************************************/ +UINT8 PsdRelateEsbConfigDataInit(UINT16 wPsdIndex); + +/* +*功能描述: RCI功能配置数据初始化 +*输入参数: CHAR * FSName 数据文件名指针 +*输出参数: 无 +*返回值: 0 失败 +* 1 成功 +* by cgh 20260516 +*/ +UINT8 RciCommonConfigDataInit(CHAR* FSName); + +/********************************************* +*函数功能:初始化倒切开关配置数据结构体----对外结构体 +*参数说明:FSName文件指针 +*返回值:0,失败;1,成功 +*********************************************/ +UINT8 ReverseSwitchConfigDataStructInit(CHAR * FSName); + +/********************************************* +*函数功能:倒切开关配置数据结构体计算 +*参数说明:pReverseSwitchRelay继电器初始化数据指针 +pReverseSwitchCfgDtStr配置数据结构体指针 +*返回值:0,失败;1,成功 +*********************************************/ +UINT8 ReverseSiwtchCfgDtStruFromDquStr(Relay_ReverseSwitchStruct* pReverseSwitchRelay, ReverseSwitchCfgDataStru* pReverseSwitchCfgDtStr); + #endif diff --git a/TSCP/src/APP/ciapp/QueryFiles/dquCIInterFace.c b/TSCP/src/APP/ciapp/QueryFiles/dquCIInterFace.c index b3448cb..fa12b9e 100644 --- a/TSCP/src/APP/ciapp/QueryFiles/dquCIInterFace.c +++ b/TSCP/src/APP/ciapp/QueryFiles/dquCIInterFace.c @@ -133,7 +133,7 @@ UINT8 InitAll(CHAR* FSName) { CIInitEmap(dsuEmapStru);/*为CI使用的公共数据赋值*/ - RtnVal = CiPatternInit(FSName); /*初始化当前联锁类型配置数据*/ + RtnVal = RciCommonConfigDataInit(FSName); /*初始化当前联锁类型配置数据*/ if (0u != RtnVal) /*初始化当前联锁类型配置数据*/ { /*初始化系统配置数据结构体*/ @@ -171,8 +171,8 @@ UINT8 InitAll(CHAR* FSName) else { #ifdef PLATFORM_2OO2 - (void)printf("CiPattern Init Error\n"); - debug_infor_printf((const)"CiPattern Init Error\n"); + (void)printf("RciCommonConfigDataInit Error\n"); + debug_infor_printf((const)"RciCommonConfigDataInit Error\n"); #endif } } @@ -2379,9 +2379,6 @@ UINT8 ReadSystemParamConfDataNew(const UINT8 ciId,SystemParameterStructNew* Syst /*一个临时限速报文中包含的最大限速区段数量*/ SystemParameterStru->MaxSectionOfTsr = dquCICfgDtStr.SystemParaStrNew.MaxSectionOfTsr; - /*IVOC-OC通信故障判断时间(ms)*/ - SystemParameterStru->IvocOcCommunicationErrorTime = dquCICfgDtStr.SystemParaStrNew.IvocOcCommunicationErrorTime; - /*OC-TSL通信故障判断时间(ms)*/ SystemParameterStru->OcTslCommunicationErrorTime = dquCICfgDtStr.SystemParaStrNew.OcTslCommunicationErrorTime; @@ -3424,8 +3421,8 @@ void ReadEmapCiConfig(EmapCiConfigStru emapVerArr[]) UINT8 ciId; UINT8 jj = 0U; UINT8 chLocalCiId = 0U; - - + UINT16 k = 0U; + chLocalCiId = GetSystemParaLocalCiId(); if (NULL != emapVerArr) { @@ -3484,14 +3481,30 @@ void ReadEmapCiConfig(EmapCiConfigStru emapVerArr[]) {/*试车线与车辆段合设开关*/ SystemParameterStruNew.chCldAndScxMergeFlag = dsuStaticHeadStru.pCIStruStru[i].chCldAndScxMergeFlag; } - - + else + { + /*不处理*/ + } } else { ; /*RC模式校验数据信息根据RC表初始化*/ } } + /*联锁厂商定义 ** CI类型配置*/ + for (k = 0U; k < wCIStruSum; k++) + { + ciId = (UINT8)(dsuStaticHeadStru.pCIStruStru[k].wID & 0x00FFU); + if (CI_SUM_MAX > ciId) + { + SystemParameterStruNew.chCiFactoryType[ciId] = dsuStaticHeadStru.pCIStruStru[k].chCiFactoryType; + } + else + { + /*不处理*/ + } + } + if (RC_WORK_MODE_TIOC == CI_SYSTEM_TYPE_RCI) { @@ -4124,6 +4137,70 @@ INT16 ReadReverseCutConfigData(const UINT8 ciId, ReverseCutCfgDataStru* pstRever return DataNum; } +/********************************************* +*函数功能:本联锁倒切设备关联对应板卡配置数据 +*参数说明:ciId联锁ID, pLocalReverseData 本联锁倒切设备配置数据结构体指针 +*返回值:-1 失败 其他 成功 +*********************************************/ +INT16 ReadReverseSwitchConfigData(const UINT8 ciId, ReverseSwitchCfgDataStru* pLocalReverseData) +{ + UINT16 i = 0u; + INT16 DataNum = -1; + UINT16 jj = 0U; + if ((0u == ciId) || (NULL == pLocalReverseData)) + { + DataNum = -1; + } + else + { + DataNum = 0; + } + + if (0 == DataNum) + { + for (i = 0u; iwColCloseRelayId = dquCICfgDtStr.stReverseSwitchCfgDtStr[i].wColCloseRelayId; + pLocalReverseData->wColOpenRelayId = dquCICfgDtStr.stReverseSwitchCfgDtStr[i].wColOpenRelayId; + if ((0U == pLocalReverseData->wColCloseRelayId) || (UINT16_MAX == pLocalReverseData->wColCloseRelayId) + || (0U == pLocalReverseData->wColOpenRelayId) || (UINT16_MAX == pLocalReverseData->wColOpenRelayId)) + { + DataNum = -1;/*本联锁配置有倒切开关但采集错误*/ + } + else + { + pLocalReverseData->wRelateBoardNum = dquCICfgDtStr.stReverseSwitchCfgDtStr[i].wRelateBoardNum; + pLocalReverseData->wId = dquCICfgDtStr.stReverseSwitchCfgDtStr[i].wId; + pLocalReverseData->chBelongCiId = ciId; + for (jj = 0u; jj < dquCICfgDtStr.stReverseSwitchCfgDtStr[i].wRelateBoardNum; jj++) + { + pLocalReverseData->strRelateBoardBuf[jj].wReversBoardId = dquCICfgDtStr.stReverseSwitchCfgDtStr[i].strRelateBoardBuf[jj].wReversBoardId; + pLocalReverseData->strRelateBoardBuf[jj].chDevType = dquCICfgDtStr.stReverseSwitchCfgDtStr[i].strRelateBoardBuf[jj].chDevType; + pLocalReverseData->strRelateBoardBuf[jj].wBoardColCloseRelayId = dquCICfgDtStr.stReverseSwitchCfgDtStr[i].strRelateBoardBuf[jj].wBoardColCloseRelayId; + pLocalReverseData->strRelateBoardBuf[jj].wBoardColOpenRelayId = dquCICfgDtStr.stReverseSwitchCfgDtStr[i].strRelateBoardBuf[jj].wBoardColOpenRelayId; + if ((0U == pLocalReverseData->strRelateBoardBuf[jj].wBoardColCloseRelayId) || (UINT16_MAX == pLocalReverseData->strRelateBoardBuf[jj].wBoardColCloseRelayId) + || (0U == pLocalReverseData->strRelateBoardBuf[jj].wBoardColOpenRelayId) || (UINT16_MAX == pLocalReverseData->strRelateBoardBuf[jj].wBoardColOpenRelayId)) + { + DataNum = -1;/*配置有倒切板卡但采集错误*/ + break; + } + pLocalReverseData->strRelateBoardBuf[jj].wDevId = dquCICfgDtStr.stReverseSwitchCfgDtStr[i].strRelateBoardBuf[jj].wDevId; + } + } + break; + } + } + } + else + { + ; + } + + return DataNum; +} + /************************************************** *函数功能:取VOBC设备编号相应位数,查询vobc索引 diff --git a/TSCP/src/APP/ciapp/QueryFiles/dquCIInterFace.h b/TSCP/src/APP/ciapp/QueryFiles/dquCIInterFace.h index 133f09f..4ee1668 100644 --- a/TSCP/src/APP/ciapp/QueryFiles/dquCIInterFace.h +++ b/TSCP/src/APP/ciapp/QueryFiles/dquCIInterFace.h @@ -418,6 +418,13 @@ INT16 ReadCutoffPointConfigData(const UINT8 ciId, CfpConfigStru* pstCutoffConfig *返回值:本地关联分界点ID *********************************************/ INT16 ReadReverseCutConfigData(const UINT8 ciId, ReverseCutCfgDataStru* pstReverseConfigData); + +/********************************************* +*函数功能:本联锁倒切设备关联对应板卡配置数据 +*参数说明:ciId联锁ID, pLocalReverseData 本联锁到期配置数据结构体指针 +*返回值:-1 失败 其他 成功 +*********************************************/ +INT16 ReadReverseSwitchConfigData(const UINT8 ciId, ReverseSwitchCfgDataStru* pLocalReverseData); /************************************************************************ 功能:HlhtID转vobc内部编号 输入: diff --git a/TSCP/src/APP/ciapp/QueryFiles/dquCIJDQStruFrmChar.c b/TSCP/src/APP/ciapp/QueryFiles/dquCIJDQStruFrmChar.c index 5afb0b5..3f57f37 100644 --- a/TSCP/src/APP/ciapp/QueryFiles/dquCIJDQStruFrmChar.c +++ b/TSCP/src/APP/ciapp/QueryFiles/dquCIJDQStruFrmChar.c @@ -404,32 +404,34 @@ UINT8 R_PointStructFromChar(UINT8 * pDataAddr,Relay_PointStruct* pSwitchStr) } if (CI_TRADITION_RAILWAY == lineIdentity) {/*城轨线路*/ - pSwitchStr->wPointId = dquCiShortFromChar(pData); /*道岔ID*/ + pSwitchStr->wPointId = dquCiShortFromChar(pData); /*道岔ID*/ + pData += 2u; + pSwitchStr->wOcId = dquCiShortFromChar(pData); /*OC ID*/ + pData += 2u; + pSwitchStr->wRelayDingBiaoId = dquCiShortFromChar(pData); /*定表继电器ID */ + pData += 2u; + pSwitchStr->wRelayFanBiaoId = dquCiShortFromChar(pData); /*反表继电器ID */ pData += 2u; - /*跳过OCID*/ - pData += 2u; - pSwitchStr->wRelayDingBiaoId = dquCiShortFromChar(pData); /*定表继电器ID */ - pData += 2u; - pSwitchStr->wRelayFanBiaoId = dquCiShortFromChar(pData); /*反表继电器ID */ + pSwitchStr->wRelayYunCaoId = dquCiShortFromChar(pData); /*允操继电器ID*/ pData += 2u; - - pSwitchStr->wRelayYunCaoId = dquCiShortFromChar(pData); /*允操继电器ID*/ - pData += 2u; - pSwitchStr->wRelayDingCaoId = dquCiShortFromChar(pData); /*定操继电器ID */ + pSwitchStr->wRelayDingCaoId = dquCiShortFromChar(pData); /*定操继电器ID */ pData += 2u; - pSwitchStr->wRelayFanCaoId = dquCiShortFromChar(pData); /*反操继电器ID */ + pSwitchStr->wRelayFanCaoId = dquCiShortFromChar(pData); /*反操继电器ID */ pData += 2u; - pSwitchStr->wRelayZongDingBiaoId = dquCiShortFromChar(pData); /*总定表继电器ID */ + pSwitchStr->wRelayZongDingBiaoId = dquCiShortFromChar(pData); /*总定表继电器ID */ pData += 2u; - pSwitchStr->wRelayZongFanBiaoId = dquCiShortFromChar(pData); /*总反表继电器ID */ + pSwitchStr->wRelayZongFanBiaoId = dquCiShortFromChar(pData); /*总反表继电器ID */ pData += 2u; - pSwitchStr->wDFHId = dquCiShortFromChar(pData); /*DFH继电器ID*/ + pSwitchStr->wDFHId = dquCiShortFromChar(pData); /*DFH继电器ID*/ pData += 2u; - - pSwitchStr->wRelayShadowDingBiaoId = dquCiShortFromChar(pData); /*定表继电器ID */ + pSwitchStr->wRelayRedunDB1Id = dquCiShortFromChar(pData); /*(北京10冗余采集)DBJ1继电器ID*/ pData += 2u; - pSwitchStr->wRelayShadowFanBiaoId = dquCiShortFromChar(pData); /*反表继电器ID */ + pSwitchStr->wRelayRedunDB2Id = dquCiShortFromChar(pData); /*(北京10冗余采集)DBJ2继电器ID*/ + pData += 2u; + pSwitchStr->wRelayRedunFB1Id = dquCiShortFromChar(pData); /*(北京10冗余采集)FBJ1继电器ID*/ + pData += 2u; + pSwitchStr->wRelayRedunFB2Id = dquCiShortFromChar(pData); /*(北京10冗余采集)FBJ2继电器ID*/ pData += 2u; }/* zt 删除单轨相关代码 2022-02-15 */ else @@ -1192,4 +1194,155 @@ UINT8 R_OCIndicStruFromChar(UINT8* pDataAddr, OCStationIndicConfigDataStru* pInd return reVal; } +/********************************************* +*函数功能:从数据到倒切开关配置继电器结构体 +*参数说明:pDataAddr数据地址, Relay_ReverseSwitchStruct 倒切开关继电器配置数据结构体指针 +*返回值:0,失败;1,成功 +*********************************************/ +UINT8 R_ReverseSwitchStrFromChar(UINT8 * pDataAddr, Relay_ReverseSwitchStruct * pReverseStr) +{ + UINT8 * pData = pDataAddr; + UINT8 rtnvalue = 0u; + UINT16 j = 0U; + UINT16 wTemp = 0U; + if ((NULL == pDataAddr) || (NULL == pReverseStr)) + { + rtnvalue = 0u; + + } + else + { + rtnvalue = 1U; + } + + if (1u == rtnvalue) + { + pReverseStr->wReversSwitchId = dquCiShortFromChar(pData); /*ID*/ + pData += 2u; + + pReverseStr->ocId = dquCiShortFromChar(pData); /*Oc ID*/ + pData += 2u; + + pReverseStr->wColOpenRelayId = dquCiShortFromChar(pData); /*常开继电器*/ + pData += 2u; + + pReverseStr->wColCloseRelayId = dquCiShortFromChar(pData); /*常闭继电器*/ + pData += 2u; + + if ((0U == pReverseStr->wColOpenRelayId) + ||(0U == pReverseStr->wColCloseRelayId) + || (pReverseStr->wColOpenRelayId == pReverseStr->wColCloseRelayId)) + { + rtnvalue = 0u; + } + else + { + pReverseStr->wRelateBoardNum = dquCiShortFromChar(pData); /*板卡个数*/ + pData += 2u; + + if ((0U < pReverseStr->wRelateBoardNum)&&(OC_RELAY_REVERSE_BOARD_MAX >= pReverseStr->wRelateBoardNum)) + { + for (j = 0U; j < pReverseStr->wRelateBoardNum; j++) + { + wTemp = dquCiShortFromChar(pData); /*板卡id*/ + pData += 2u; + if ((0U == wTemp) || (UINT16_MAX == wTemp)) + { + rtnvalue = 0U; + break; + } + else + { + pReverseStr->strRelateBoardBuf[j].wReversBoardId = wTemp; + } + } + } + else + { + rtnvalue = 0u; + debug_infor_printf((char*)"\nR_ReverseSwitchStrFromChar BoardNum%d", pReverseStr->wRelateBoardNum); + } + } + } + + return rtnvalue; + +} + +/********************************************* +*函数功能:从数据到倒切板卡结构体 +*参数说明:pDataAddr数据地址, Relay_ReverseBoardStruct 倒切板卡继电器配置数据结构体指针 +*返回值:0,失败;1,成功 +*********************************************/ +UINT8 R_ReverseBoardStrFromChar(UINT8 * pDataAddr, Relay_ReverseBoardStruct * pReverseStr) +{ + UINT8 * pData = pDataAddr; + UINT8 rtnvalue = 0u; + UINT16 wBoardId = 0U; + if ((NULL == pDataAddr) || (NULL == pReverseStr)) + { + rtnvalue = 0u; + + } + else + { + rtnvalue = 1U; + } + + if (1u == rtnvalue) + { + wBoardId = dquCiShortFromChar(pData); /*ID*/ + pData += 2u; + + if (0U == wBoardId) + { + rtnvalue = 0U; + } + else + { + pReverseStr->wReversBoardId = wBoardId; /*板卡ID*/ + + pReverseStr->wBoardColOpenRelayId = dquCiShortFromChar(pData); /*常开继电器*/ + pData += 2u; + + pReverseStr->wBoardColCloseRelayId = dquCiShortFromChar(pData); /*常闭继电器*/ + pData += 2u; + + if ((0U == pReverseStr->wBoardColCloseRelayId) + ||(0U == pReverseStr->wBoardColOpenRelayId) + || (pReverseStr->wBoardColOpenRelayId == pReverseStr->wBoardColCloseRelayId)) + { + rtnvalue = 0U; + } + else + { + pReverseStr->chDevType = *pData;/*类型*/ + pData++; + + pReverseStr->wDevId = dquCiShortFromChar(pData); /*设备ID*/ + pData += 2u; + + if ((OC_LEN_REVERSE_TYPE_PSD == pReverseStr->chDevType) || (OC_LEN_REVERSE_TYPE_SWITCH == pReverseStr->chDevType)) + { + if ((0U < pReverseStr->wDevId) && (UINT16_MAX != pReverseStr->wDevId)) + { + rtnvalue = 1U; + } + else + { + rtnvalue = 0U; + } + } + else + { + rtnvalue = 0U; + } + } + } + } + + return rtnvalue; + +} + diff --git a/TSCP/src/APP/ciapp/QueryFiles/dquCIJDQStruFrmChar.h b/TSCP/src/APP/ciapp/QueryFiles/dquCIJDQStruFrmChar.h index 9df9f0c..4746325 100644 --- a/TSCP/src/APP/ciapp/QueryFiles/dquCIJDQStruFrmChar.h +++ b/TSCP/src/APP/ciapp/QueryFiles/dquCIJDQStruFrmChar.h @@ -150,4 +150,18 @@ UINT8 R_ReverseCutStrFromChar(UINT8 * pDataAddr, Relay_ReverseCutStruct * pRever * cgh-合并CID-3037-3: *********************************************/ UINT8 R_OCIndicStruFromChar(UINT8* pDataAddr, OCStationIndicConfigDataStru* pIndicStru); + +/********************************************* +*函数功能:从数据到倒切开关配置继电器结构体 +*参数说明:pDataAddr数据地址, Relay_ReverseSwitchStruct 倒切开关继电器配置数据结构体指针 +*返回值:0,失败;1,成功 +*********************************************/ +UINT8 R_ReverseSwitchStrFromChar(UINT8 * pDataAddr, Relay_ReverseSwitchStruct * pReverseStr); + +/********************************************* +*函数功能:从数据到倒切板卡结构体 +*参数说明:pDataAddr数据地址, Relay_ReverseBoardStruct 倒切板卡继电器配置数据结构体指针 +*返回值:0,失败;1,成功 +*********************************************/ +UINT8 R_ReverseBoardStrFromChar(UINT8 * pDataAddr, Relay_ReverseBoardStruct * pReverseStr); #endif diff --git a/TSCP/src/APP/ciapp/QueryFiles/dquCIJDQStruInit.c b/TSCP/src/APP/ciapp/QueryFiles/dquCIJDQStruInit.c index f189fac..d7c93c7 100644 --- a/TSCP/src/APP/ciapp/QueryFiles/dquCIJDQStruInit.c +++ b/TSCP/src/APP/ciapp/QueryFiles/dquCIJDQStruInit.c @@ -397,35 +397,27 @@ UINT8 InitRelay_ScreenStru(CHAR* CIDataName) { RelayDataLen.RelayScreenStrLen = wRealRowCount; rowLen = DataSize / wRealRowCount; - if (DataSize < rowLen) + /*动态申请空间*/ + RelayData.pRelayScreenStr = (Relay_ScreenStruct*)MyNew((UINT32)(sizeof(Relay_ScreenStruct) * RelayDataLen.RelayScreenStrLen)); + /*动态申请空间失败*/ + if (NULL == RelayData.pRelayScreenStr) { + RelayDataLen.RelayScreenStrLen = 0U; rtnValue = 0U; - } else { - /*动态申请空间*/ - RelayData.pRelayScreenStr = (Relay_ScreenStruct*)MyNew((UINT32)(sizeof(Relay_ScreenStruct) * RelayDataLen.RelayScreenStrLen)); - /*动态申请空间失败*/ - if (NULL == RelayData.pRelayScreenStr) + /*内存先设为无效*/ + (void)memset(RelayData.pRelayScreenStr, 0x00, sizeof(Relay_ScreenStruct) * RelayDataLen.RelayScreenStrLen); + /*解析数据到 默认行车序列 结构体数组 */ + for (j = 0u; j < RelayDataLen.RelayScreenStrLen; j++) { - RelayDataLen.RelayScreenStrLen = 0U; - rtnValue = 0U; - } - else - { - /*内存先设为无效*/ - (void)memset(RelayData.pRelayScreenStr, 0x00, sizeof(Relay_ScreenStruct) * RelayDataLen.RelayScreenStrLen); - /*解析数据到 默认行车序列 结构体数组 */ - for (j = 0u; j < RelayDataLen.RelayScreenStrLen; j++) - { - pScreenStr = RelayData.pRelayScreenStr + j; + pScreenStr = RelayData.pRelayScreenStr + j; - /*填充数据结构体*/ - rtnValue &= R_ScreenStructFromChar(pDataAddr, pScreenStr, (UINT16)rowLen); - pDataAddr += rowLen; + /*填充数据结构体*/ + rtnValue &= R_ScreenStructFromChar(pDataAddr, pScreenStr, (UINT16)rowLen); + pDataAddr += rowLen; - } } } } @@ -476,8 +468,8 @@ UINT8 InitRelay_PointStru(CHAR* CIDataName) if (CI_PATTERN_TRADITIONAL == localCiPattern) { excelId = CI_DATA_TYPE; - sheetId = RELAY_SIGNAL; - rowLen = LEN_RELAY_SIGNAL; + sheetId = RELAY_POINT; + rowLen = LEN_RELAY_POINT; } else { @@ -1650,3 +1642,191 @@ UINT8 InitRelay_ReverseCutStru(CHAR* CIDataName) return rtnValue; } +/********************************************* +*函数功能:填充倒切开关继电器结构体数组---内部用 +*参数说明:CIDataName件指针 +*返回值:0,失败;1,成功 +*********************************************/ +UINT8 InitRelay_ReverseSwitchStru(CHAR* CIDataName) +{ + UINT8 funcRtn = 0u; + Relay_ReverseSwitchStruct* pReverseSwitchStr = NULL; /*倒切开关变量*/ + UINT8* pDataAddr = NULL; /*数据地址*/ + UINT32 DataSize = 0U; /*数据大小(字节数)*/ + UINT16 j = 0U; + UINT8 rtnValue = 0u; + + /*已经初始化了,不用老是调用执行过程 全电子不用初始化这张表*/ + if (NULL != RelayData.pRelayReverseSwitchStr) + { + rtnValue = 1u; + } + else + { + /*读取倒切设备继电器数据表*/ + funcRtn = dquGetConfigData(CIDataName, OC_DATA_TYPE, OC_RELAY_REVERSE_SWITCH_ID, &pDataAddr, &DataSize); + if (0u == funcRtn) + { + /*函数调用失败*/ + rtnValue = 0u; + } + else + { + + if ((0u != DataSize% OC_LEN_REVERSE_SWITCH_LEN)) + { /*求得个数不为整数,数据错误*/ + debug_infor_printf((char* )"\nCI_RELAY_DATA,REVERSE_Switch len %d not equal to fs", OC_LEN_REVERSE_SWITCH_LEN); + rtnValue = 0u; + } + else + { + RelayDataLen.RelayReverseSwitchStrLen = (UINT16)(DataSize / OC_LEN_REVERSE_SWITCH_LEN);/*计算结构体个数*/ + + if (OC_LEN_REVERSE_SWITCH_LEN > DataSize) + {/*不足一个*/ + RelayData.pRelayReverseSwitchStr = (Relay_ReverseSwitchStruct *)MyNew((UINT32)sizeof(Relay_ReverseSwitchStruct)); + RelayDataLen.RelayReverseSwitchStrLen = 0u; + rtnValue = 1u; + } + else + { + + /*动态申请空间*/ + RelayData.pRelayReverseSwitchStr = (Relay_ReverseSwitchStruct *)MyNew((UINT32)(sizeof(Relay_ReverseSwitchStruct) * RelayDataLen.RelayReverseSwitchStrLen)); + + if (NULL == RelayData.pRelayReverseSwitchStr) + {/*动态申请空间失败*/ + RelayDataLen.RelayReverseSwitchStrLen = 0u; + rtnValue = 0u; + } + else + { + /*内存先设为无效*/ + (void)CommonMemSet(RelayData.pRelayReverseSwitchStr, (UINT32)(sizeof(Relay_ReverseSwitchStruct) * RelayDataLen.RelayReverseSwitchStrLen), + (UINT8)0x00, (UINT32)(sizeof(Relay_ReverseSwitchStruct) * RelayDataLen.RelayReverseSwitchStrLen)); + /*解析数据到 结构体数组 */ + rtnValue = 1u; + for (j = 0u; j < RelayDataLen.RelayReverseSwitchStrLen; j++) + { + pReverseSwitchStr = RelayData.pRelayReverseSwitchStr + j; + + /*填充数据结构体*/ + rtnValue &= R_ReverseSwitchStrFromChar(pDataAddr, pReverseSwitchStr); + pDataAddr += OC_LEN_REVERSE_SWITCH_LEN; + if (1U != rtnValue) + { + break; + } + } + } + } + } + } + } + return rtnValue; +} + +/********************************************* +*函数功能:填充倒切板卡继电器结构体数组---内部用 +*参数说明:CIDataName件指针 +*返回值:0,失败;1,成功 +*********************************************/ +UINT8 InitRelay_ReverseBoardStru(CHAR* CIDataName) +{ + UINT8 funcRtn = 0u; + UINT8* pDataAddr = NULL; /*数据地址*/ + UINT32 DataSize = 0U; /*数据大小(字节数)*/ + Relay_ReverseBoardStruct tempBoardStru = {0}; /*倒切板卡临时存储*/ + Relay_ReverseSwitchStruct* pReverseSwitchStr = NULL;/*倒切开关指针*/ + Relay_ReverseBoardStruct* pReverseBoard = NULL; /*倒切板卡指针*/ + UINT16 j = 0U; + UINT16 ii = 0U; + UINT16 kk = 0U; + UINT8 rtnValue = 0u; + UINT16 wLen = 0U; + UINT8 chFind = CI_ERROR; + + if (NULL == RelayData.pRelayReverseSwitchStr) + { + /*需要先初始化倒切开关继电器*/ + rtnValue = 0u; + } + else + { + /*读取倒切板卡继电器数据表*/ + funcRtn = dquGetConfigData(CIDataName, OC_DATA_TYPE, OC_RELAY_REVERSE_BOARD_ID, &pDataAddr, &DataSize); + if (0u == funcRtn) + { + /*函数调用失败*/ + rtnValue = 0u; + } + else + { + + if ((0u != DataSize% OC_LEN_REVERSE_BOARD_LEN)) + { /*求得个数不为整数,数据错误*/ + debug_infor_printf((char*)"\nCI_RELAY_DATA,REVERSE_Board len %d not equal to fs", OC_LEN_REVERSE_BOARD_LEN); + rtnValue = 0u; + } + else + { + wLen = (UINT16)(DataSize / OC_LEN_REVERSE_BOARD_LEN);/*计算结构体个数*/ + + if ((0U == RelayDataLen.RelayReverseSwitchStrLen)&&(RelayDataLen.RelayReverseSwitchStrLen == wLen)) + { + /*无开关*/ + rtnValue = 1u; + } + else if ((0U == RelayDataLen.RelayReverseSwitchStrLen) || (0U == wLen)||(CI_SUM_MAX <= RelayDataLen.RelayReverseSwitchStrLen)) + { + /*板卡与开关配置不一致*/ + debug_infor_printf((char*)"\n InitRelay_ReverseBoardStru len %d Error \n", wLen); + rtnValue = 0u; + } + else + { + /*初始化到对应开关数据,板卡数据的空间已经申请在开关数据结构体内*/ + rtnValue = 1u; + for (ii = 0U; ii < wLen; ii++) + { + /*填充数据结构体*/ + rtnValue &= R_ReverseBoardStrFromChar(pDataAddr, &tempBoardStru); + pDataAddr += OC_LEN_REVERSE_BOARD_LEN; + chFind = CI_ERROR; + if (1U == rtnValue) + { + for (j = 0U; j < RelayDataLen.RelayReverseSwitchStrLen; j++) + { + pReverseSwitchStr = RelayData.pRelayReverseSwitchStr + j; + for (kk = 0U; kk < pReverseSwitchStr->wRelateBoardNum; kk++) + { + /*遍历查找对应倒切板卡*/ + if (pReverseSwitchStr->strRelateBoardBuf[kk].wReversBoardId == tempBoardStru.wReversBoardId) + { + pReverseBoard = &pReverseSwitchStr->strRelateBoardBuf[kk]; + (void)CommonMemCpy((void *)(pReverseBoard), (UINT32)sizeof(Relay_ReverseBoardStruct), (const void *)(&tempBoardStru), (UINT32)sizeof(Relay_ReverseBoardStruct)); + chFind = CI_SUCCESS; + break; + } + } + if (CI_SUCCESS == chFind) + { + break; + } + } + } + + if ((CI_ERROR == chFind)||(0U == rtnValue)) + { + rtnValue = 0u; + debug_infor_printf((char*)"\n InitRelay_ReverseBoardStru Board%d Not Find \n", tempBoardStru.wReversBoardId); + break; + } + } + } + } + } + } + return rtnValue; +} + diff --git a/TSCP/src/APP/ciapp/QueryFiles/dquCIJDQStruInit.h b/TSCP/src/APP/ciapp/QueryFiles/dquCIJDQStruInit.h index 1344741..db8afea 100644 --- a/TSCP/src/APP/ciapp/QueryFiles/dquCIJDQStruInit.h +++ b/TSCP/src/APP/ciapp/QueryFiles/dquCIJDQStruInit.h @@ -36,6 +36,7 @@ typedef struct SConfig_RelayDataStruct Relay_WashMachineStruct *pRelayWashMachineStr; /*洗车机继电器结构体*/ Relay_DCAgreeStruct *pRelayDCAgreeStr;/*调车同意继电器结构体*/ Relay_ReverseCutStruct *pRelayReverseCutStr;/*倒切设备继电器结构体*/ + Relay_ReverseSwitchStruct* pRelayReverseSwitchStr; /*倒切开关继电器结构体*/ } RelayDataStruct_Config; /*继电器数组长度结构体*/ typedef struct S_RelayDataStructLen @@ -58,6 +59,7 @@ typedef struct S_RelayDataStructLen UINT16 RelayMonoRailPointStrLen ; /*单轨道岔继电器结构体数组长度*/ UINT16 RelayDCAgreeStrLen;/*调车同意继电器结构体数量*/ UINT16 RelayReverseCutStrLen;/*倒切设备继电器结构体数量*/ + UINT16 RelayReverseSwitchStrLen;/*倒切开关继电器结构体数量*/ } RelayDataStruct_ConfigLen; /*********定义全局的继电器信息数据变量*******/ @@ -173,5 +175,19 @@ UINT8 InitRelay_DCAgreeStru(CHAR* CIDataName); *********************************************/ UINT8 InitRelay_ReverseCutStru(CHAR* CIDataName); +/********************************************* +*函数功能:填充倒切开关继电器结构体数组---内部用 +*参数说明:CIDataName件指针 +*返回值:0,失败;1,成功 +*********************************************/ +UINT8 InitRelay_ReverseSwitchStru(CHAR* CIDataName); + +/********************************************* +*函数功能:填充倒切板卡继电器结构体数组---内部用 +*参数说明:CIDataName件指针 +*返回值:0,失败;1,成功 +*********************************************/ +UINT8 InitRelay_ReverseBoardStru(CHAR* CIDataName); + #endif diff --git a/TSCP/src/APP/ciapp/QueryFiles/dquCILSStruInit.c b/TSCP/src/APP/ciapp/QueryFiles/dquCILSStruInit.c index fd38d46..ffcceb5 100644 --- a/TSCP/src/APP/ciapp/QueryFiles/dquCILSStruInit.c +++ b/TSCP/src/APP/ciapp/QueryFiles/dquCILSStruInit.c @@ -1583,40 +1583,33 @@ UINT8 InitLS_OverlapLockCondStru(CHAR *LSDataName) realRowLen = (UINT16)(DataSize / rowLen); LSDataLen.LSOverlapLockCondStruLen = (UINT16)rowLen; - if (DataSize < realRowLen) + /*动态申请空间*/ + LSData.pLSOverlapLockCondStru = (LS_OveralpLockCondStru*)MyNew((UINT32)(sizeof(LS_OveralpLockCondStru) * LSDataLen.LSOverlapLockCondStruLen)); + /*动态申请空间失败*/ + if (NULL == LSData.pLSOverlapLockCondStru) { - rtnValue = 0U; + /*将数组长度清0,防护数组访问越界*/ + LSDataLen.LSOverlapLockCondStruLen = 0u; + + rtnValue = 0u; } else { - /*动态申请空间*/ - LSData.pLSOverlapLockCondStru = (LS_OveralpLockCondStru*)MyNew((UINT32)(sizeof(LS_OveralpLockCondStru) * LSDataLen.LSOverlapLockCondStruLen)); - /*动态申请空间失败*/ - if (NULL == LSData.pLSOverlapLockCondStru) + /*内存先设为无效*/ + (void)memset(LSData.pLSOverlapLockCondStru, 0x00, sizeof(LS_OveralpLockCondStru) * LSDataLen.LSOverlapLockCondStruLen); + + /*解析数据到 默认行车序列 结构体数组 */ + rtnValue = 1u; + for (j = 0u; j < LSDataLen.LSOverlapLockCondStruLen; j++) { - /*将数组长度清0,防护数组访问越界*/ - LSDataLen.LSOverlapLockCondStruLen = 0u; + pTempLSProtSecLockCondStru = LSData.pLSOverlapLockCondStru + j; - rtnValue = 0u; + /*填充数据结构体*/ + rtnValue &= LS_OverlapLockCondStruFromChar(pDataAddr, pTempLSProtSecLockCondStru); + + pDataAddr += realRowLen; } - else - { - /*内存先设为无效*/ - (void)memset(LSData.pLSOverlapLockCondStru, 0x00, sizeof(LS_OveralpLockCondStru) * LSDataLen.LSOverlapLockCondStruLen); - /*解析数据到 默认行车序列 结构体数组 */ - rtnValue = 1u; - for (j = 0u; j < LSDataLen.LSOverlapLockCondStruLen; j++) - { - pTempLSProtSecLockCondStru = LSData.pLSOverlapLockCondStru + j; - - /*填充数据结构体*/ - rtnValue &= LS_OverlapLockCondStruFromChar(pDataAddr, pTempLSProtSecLockCondStru); - - pDataAddr += realRowLen; - } - - } } } } @@ -2403,28 +2396,21 @@ UINT8 InitLSSideProtec(CHAR* LSDataName) for (j = 0u; j < wRouteSideProtecNum; j++)/*遍历每个侧防条件*/ { wSideProtecID = LSData.pLSSideProtecGroupStru[i].RouteSideProtecBuf[j].SideProtecID; - if (0u < wSideProtecID)/*侧防条件组表中的侧防条件ID大于0*/ + for (k = 0u; k < LSDataLen.LSRouteSideProtecStruLen; k++) { - for (k = 0u; k < LSDataLen.LSRouteSideProtecStruLen; k++) + if (wSideProtecID == LSData.pLSRouteSideProtecStru[k].SideProtecID) { - if (wSideProtecID == LSData.pLSRouteSideProtecStru[k].SideProtecID) - { - CommonMemCpy(&LSData.pLSSideProtecGroupStru[i].RouteSideProtecBuf[j], sizeof(SideProtecStru), &LSData.pLSRouteSideProtecStru[k], sizeof(SideProtecStru)); - break;/*找到则跳出*/ - } - else - { - /*继续遍历*/ - } + (void)CommonMemCpy(&LSData.pLSSideProtecGroupStru[i].RouteSideProtecBuf[j], (UINT32)sizeof(SideProtecStru), &LSData.pLSRouteSideProtecStru[k], (UINT32)sizeof(SideProtecStru)); + break;/*找到则跳出*/ } - if (k == LSDataLen.LSRouteSideProtecStruLen) + else { - rtnValue = 0u; + /*继续遍历*/ } } - else + if (k == LSDataLen.LSRouteSideProtecStruLen) { - break; + rtnValue = 0u; } } } diff --git a/TSCP/src/APP/ciapp/QueryFiles/dquCIPZStru.h b/TSCP/src/APP/ciapp/QueryFiles/dquCIPZStru.h index 8d41f4a..b5df9b0 100644 --- a/TSCP/src/APP/ciapp/QueryFiles/dquCIPZStru.h +++ b/TSCP/src/APP/ciapp/QueryFiles/dquCIPZStru.h @@ -61,5 +61,7 @@ #define CI_SYSTEM_VERGE_KILL_ID ((UINT8)0x0F) /*计轴器对应临线的公里标转换表*/ +#define CI_SYSTEM_SERIAL_COMM_ID ((UINT8)0x10) /*相邻联锁串口通信配置表*/ + #endif diff --git a/TSCP/src/APP/ciapp/QueryFiles/dquCIStru.h b/TSCP/src/APP/ciapp/QueryFiles/dquCIStru.h index d8f6b03..3263ead 100644 --- a/TSCP/src/APP/ciapp/QueryFiles/dquCIStru.h +++ b/TSCP/src/APP/ciapp/QueryFiles/dquCIStru.h @@ -21,6 +21,8 @@ #define DEVICE_IP_TYPE ((UINT32)0x40) #define ZC_DSU_TRANSMIT_DATA_ID ((UINT32)4) -#define ZC_DSU_TRANSMIT_DATA_LEN ((UINT16)(34+30)) +#define ZC_DSU_TRANSMIT_DATA_NEW_LEN ((UINT16)(34+30+40))/*ZCDSU通信关系表数据结构长度*/ + +#define ZC_DSU_TRANSMIT_DATA_NEW_NUM_MAX ((UINT16)(50)) /*ZCDSU通信关系表数据结构最大条数*/ #endif diff --git a/TSCP/src/APP/ciapp/QueryFiles/dqucijdqstru.h b/TSCP/src/APP/ciapp/QueryFiles/dqucijdqstru.h index 58b202f..6e70cc8 100644 --- a/TSCP/src/APP/ciapp/QueryFiles/dqucijdqstru.h +++ b/TSCP/src/APP/ciapp/QueryFiles/dqucijdqstru.h @@ -108,11 +108,10 @@ /*道岔配置表*/ #define OC_SWITCH_ID ((UINT8)2) -#define LEN_OC_SWITCH ((UINT8)25) #define SWITCH_BOARD_MODE_MAX 5U /*一个OC中道岔最多的模块数*/ /*道岔继电器配置表*/ #define OC_SWITCH_RELAY_ID ((UINT8)4) -#define LEN_OC_SWITCH_RELAY ((UINT8)24) +#define LEN_OC_SWITCH_RELAY ((UINT8)28) /*信号机配置表*/ #define OC_SIGNAL_ID ((UINT8)5) #define LEN_OC_SIGNAL ((UINT8)24) @@ -202,6 +201,15 @@ /* 试灯继电器表 */ #define OC_RELAY_LIGHTTESTBUTTON_ID ((UINT8)39) +/*北京10倒切板卡采集需求*/ +#define OC_RELAY_REVERSE_SWITCH_ID ((UINT8)42)/*倒切开关*/ +#define OC_RELAY_REVERSE_BOARD_ID ((UINT8)43)/*倒切板卡*/ +#define OC_RELAY_REVERSE_BOARD_MAX ((UINT16)42)/*倒切板卡个数最大值*/ +#define OC_LEN_REVERSE_SWITCH_LEN ((UINT8)94) +#define OC_LEN_REVERSE_BOARD_LEN ((UINT8)9) +#define OC_LEN_REVERSE_TYPE_SWITCH ((UINT8)0x01) +#define OC_LEN_REVERSE_TYPE_PSD ((UINT8)0x10) + /*紧急停车按钮继电器结构体*/ typedef struct S_Relay_EmegencyStopStruct { @@ -276,10 +284,13 @@ typedef struct S_Relay_PhysicalSegmentStruct typedef struct S_Relay_PointStruct { UINT16 wPointId; /*道岔ID*/ + UINT16 wOcId; /*OC ID*/ UINT16 wRelayDingBiaoId; /*定表继电器ID*/ UINT16 wRelayFanBiaoId; /*反表继电器ID*/ - UINT16 wRelayShadowDingBiaoId; /*定表继电器ID*/ - UINT16 wRelayShadowFanBiaoId; /*反表继电器ID*/ + UINT16 wRelayRedunDB1Id; /*(北京10道岔冗余采集)定表继电器1ID*/ + UINT16 wRelayRedunDB2Id; /*(北京10道岔冗余采集)定表继电器2ID*/ + UINT16 wRelayRedunFB1Id; /*(北京10道岔冗余采集)反表继电器1ID*/ + UINT16 wRelayRedunFB2Id; /*(北京10道岔冗余采集)反表继电器2ID*/ UINT16 wRelayYunCaoId; /*允操继电器ID*/ UINT16 wRelayDingCaoId; /*定操继电器ID*/ UINT16 wRelayFanCaoId; /*反操继电器ID*/ @@ -483,4 +494,23 @@ typedef struct S_Relay_ReverseCutStruct UINT16 wReverseCutRelayId; /*倒切继电器ID*/ }Relay_ReverseCutStruct; +typedef struct S_Relay_ReverseBoardStruct +{ + UINT16 wReversBoardId; /*倒切板卡D*/ + UINT8 chDevType; /*设备类型*/ + UINT16 wDevId; /*板卡配置设备 ID*/ + UINT16 wBoardColOpenRelayId; /* 常开采集继电器ID */ + UINT16 wBoardColCloseRelayId; /* 常闭采集继电器ID */ +}Relay_ReverseBoardStruct; + +typedef struct S_Relay_ReverseSwitchStruct +{ + UINT16 wReversSwitchId; /*倒切开关ID*/ + UINT16 ocId; /*OC ID*/ + UINT16 wColOpenRelayId; /* 常开采集继电器ID */ + UINT16 wColCloseRelayId; /* 常闭采集继电器ID */ + UINT16 wRelateBoardNum; /*关联板卡个数*/ + Relay_ReverseBoardStruct strRelateBoardBuf[OC_RELAY_REVERSE_BOARD_MAX]; /*关联板卡数据*/ +}Relay_ReverseSwitchStruct; + #endif diff --git a/TSCP/src/APP/ciapp/Relay/RelayDefine.h b/TSCP/src/APP/ciapp/Relay/RelayDefine.h index e5246ec..771b7f1 100644 --- a/TSCP/src/APP/ciapp/Relay/RelayDefine.h +++ b/TSCP/src/APP/ciapp/Relay/RelayDefine.h @@ -97,6 +97,11 @@ #define SIGNAL_DXJ_TYPE ((UINT8)0x0A) /*DXJ继电器*/ #define CHECK_ZCJ_TYPE ((UINT8)0x0B) /*ZCJ继电器*/ #define SWITCH_IBP_TYPE ((UINT8)0x0C) /*IBP继电器*/ +#define SIGNAL_DJ_TYPE ((UINT8)0x0F) /*信号机灯丝继电器*/ +#define SIGNAL_MAINJ_TYPE ((UINT8)0x10) /*信号机主控继电器*/ +#define SIGNAL_ACKJ_TYPE ((UINT8)0x11) /*信号机次控继电器*/ +#define SINNAL_CMAINJ_TYPE ((UINT8)0x12) /*信号机复杂主控继电器*/ + /*继电器混线相关*/ #define RELAY_HUNXIAN_NUM ((UINT8)10) /*继电器混线容忍最大周期*/ diff --git a/TSCP/src/APP/ciapp/RemoteRM/RRMManageAPI.c b/TSCP/src/APP/ciapp/RemoteRM/RRMManageAPI.c index 4d5dfb3..7ba698e 100644 --- a/TSCP/src/APP/ciapp/RemoteRM/RRMManageAPI.c +++ b/TSCP/src/APP/ciapp/RemoteRM/RRMManageAPI.c @@ -1901,12 +1901,14 @@ static UINT8 rrm_CheckTrainHeadInFreeSta(UINT16 trainID, IN const EnvelopeStruct UINT8 chHeadAcStatus = 0U; /*车头计轴区段占用状态*/ /** 入口参数校验 */ - ASSERT_RET_VALUE((NULL == pTemp) || (0U == pTemp->ACCnt), errorCode, 0x80000000U); - - headRelStaID = rrm_PrepareAtsLgcStaOfAC(pTemp->ACID[pTemp->ACCnt - 1U]); - - ASSER_ERROR((0xffffU == headRelStaID), errorCode, 0x40000000U); + ASSER_ERROR((NULL == pTemp) || (0U == pTemp->ACCnt), errorCode, 0x80000000U); + if(0U == errorCode) + { + headRelStaID = rrm_PrepareAtsLgcStaOfAC(pTemp->ACID[pTemp->ACCnt - 1U]); + ASSER_ERROR((0xffffU == headRelStaID), errorCode, 0x40000000U); + } + if (0U == errorCode) { trainNextSta = rrm_PrepareNextStaOfTrain(trainID); diff --git a/TSCP/src/APP/ciapp/ReverseCut/ReverseCutConfigDataManage.c b/TSCP/src/APP/ciapp/ReverseCut/ReverseCutConfigDataManage.c index f268dd8..32fbe1b 100644 --- a/TSCP/src/APP/ciapp/ReverseCut/ReverseCutConfigDataManage.c +++ b/TSCP/src/APP/ciapp/ReverseCut/ReverseCutConfigDataManage.c @@ -10,12 +10,16 @@ ********************************************************/ #include "ReverseCutConfigDataManage.h" +#include "../Switch/SwitchConfigDataManage.h" +#include "../PSD/PSDConfigDataManage.h" ReverseCutCfgDataStru gstReverseCutCfgData[REVERSE_CUT_SUM_MAX] = { 0U }; /*定义倒切装置数据配置结构体*/ UINT16 gReverseCutCfgIdBuf[REVERSE_CUT_SUM_MAX] = { 0U }; /*定义倒切装置数据配置ID 缓存*/ INT16 gReverseCutCfgSum = 0; /*定义倒切装置数据配置总数 */ +ReverseSwitchCfgDataStru gLocalReverseData = { 0U };/*定义属于本联锁的倒切柜数据*/ + /* * 功能描述: 获取倒切装置当前总数 @@ -139,9 +143,13 @@ UINT8 ReverseCutConfigDataManage(void) UINT16 jj = 0u; /*游标*/ UINT16 wReverseCutDataSum = 0u; /*信号机设备配置数据总数*/ UINT8 ret = CI_ERROR; - UINT8 localCiId = GetSystemParaLocalCiId(); - - /*保存信号机ID索引数组*/ + UINT16 wDevId = 0u; + UINT16 wLocalSwitchSum = 0U;/*本地道岔*/ + UINT16 wLocalPsdSum = 0U;/*本地PSD*/ + UINT8 localCiId = GetSystemParaLocalCiId(); /*获取本机联锁ID*/ + UINT8 belongCiId = 0u;/*设备配置初始化所属联锁*/ + UINT8 chFind = CI_ERROR; + /*保存倒切ID索引数组*/ wReverseCutDataSum = GetReverseCutCurSum(); if (wReverseCutDataSum < REVERSE_CUT_SUM_MAX) {/*配置数据总数错误*/ @@ -163,6 +171,162 @@ UINT8 ReverseCutConfigDataManage(void) ret = CI_SUCCESS; } - return ret; + if (CI_SUCCESS == ret) + { + if (0U != gLocalReverseData.wId) + { + wLocalSwitchSum = GetSwitchCurSum(); + wLocalPsdSum = GetPsdSum(); + /*本联锁具备倒切*/ + for (ii = 0u; ii < gLocalReverseData.wRelateBoardNum; ii++) + { + chFind = CI_ERROR; + if (CI_DEVICE_TYPE_SWITCH == gLocalReverseData.strRelateBoardBuf[ii].chDevType) + { + for (jj = 0u; jj < wLocalSwitchSum; jj++) + { + wDevId = GetSwitchId(jj); /*获取道岔ID*/ + belongCiId = GetSwitchBelongCiId(wDevId); /*获取所属联锁ID*/ + if ((wDevId == gLocalReverseData.strRelateBoardBuf[ii].wDevId) && (belongCiId == localCiId)) + { + /*设置对应倒切继电器*/ + chFind = SetSwitchRelateReverseBoardId(wDevId, gLocalReverseData.strRelateBoardBuf[ii].wReversBoardId); + break; + } + } + } + else if (CI_DEVICE_TYPE_PSD == gLocalReverseData.strRelateBoardBuf[ii].chDevType) + { + for (jj = 0u; jj < wLocalPsdSum; jj++) + { + wDevId = GetPsdId(jj); /*获取屏蔽门ID*/ + belongCiId = GetPsdBelongCiId(wDevId); /*获取所属联锁ID*/ + if ((wDevId == gLocalReverseData.strRelateBoardBuf[ii].wDevId) && (belongCiId == localCiId)) + { + /*设置对应倒切继电器*/ + chFind = SetPsdRelateReverseRelay(wDevId, gLocalReverseData.strRelateBoardBuf[ii].wReversBoardId); + break; + } + } + } + else + { + chFind = CI_ERROR; + } + if (CI_ERROR == chFind) + { + ret = CI_ERROR; + break; + } + } + } + } + + return ret; +} + +/* +* 功能描述: 获取本集中区倒切开关常开继电器 +* 参数说明: 无 +* 返回值 : 0: 无倒切 +* [1,65534]继电器ID +*/ +UINT16 GetReverseSwitchOpenRelay(void) +{ + return gLocalReverseData.wColOpenRelayId; +} + +/* +* 功能描述: 获取本集中区倒切开关常闭继电器 +* 参数说明: 无 +* 返回值 : 0: 无倒切 +* [1,65534]继电器ID +*/ +UINT16 GetReverseSwitchCloseRelay(void) +{ + return gLocalReverseData.wColCloseRelayId; +} + +/* +* 功能描述: 获取本集中区指定索引倒切板卡常开继电器 +* 参数说明: wIndex 索引 +* 返回值 : 0: 无倒切 +* [1,65534]继电器ID +* UINT16_MAX 错误 +*/ +UINT16 GetReverseBoardOpenRelay(UINT16 wIndex) +{ + UINT16 chRetVal =UINT16_MAX; + if (0U == gLocalReverseData.wRelateBoardNum) + { + chRetVal = 0U; + } + else if (wIndex < gLocalReverseData.wRelateBoardNum) + { + chRetVal = gLocalReverseData.strRelateBoardBuf[wIndex].wBoardColOpenRelayId; + } + else + { + ;/*错误*/ + } + return chRetVal; +} + +/* +* 功能描述: 获取本集中区指定索引倒切板卡常闭继电器 +* 参数说明: wIndex 索引 +* 返回值 : 0: 无倒切 +* [1,65534]继电器ID +*/ +UINT16 GetReverseBoardCloseRelay(UINT16 wIndex) +{ + UINT16 chRetVal = UINT16_MAX; + if (0U == gLocalReverseData.wRelateBoardNum) + { + chRetVal = 0U; + } + else if (wIndex < gLocalReverseData.wRelateBoardNum) + { + chRetVal = gLocalReverseData.strRelateBoardBuf[wIndex].wBoardColCloseRelayId; + } + else + { + ;/*错误*/ + } + return chRetVal; +} + +/* +* 功能描述: 获取本集中区倒切板卡数量 +* 参数说明: 无 +* 返回值 : 0: 无倒切 [1,42]板卡数量 +*/ +UINT16 GetReverseBoardNum(void) +{ + UINT16 chRetVal = 0U; + if (0U == gLocalReverseData.wRelateBoardNum) + { + chRetVal = 0U; + } + else if (REVERSE_BOARD_SUM_MAX >= gLocalReverseData.wRelateBoardNum) + { + chRetVal = gLocalReverseData.wRelateBoardNum; + } + else + { + chRetVal = REVERSE_BOARD_SUM_MAX; + } + return chRetVal; +} + +/** +* @brief 获取本集中区倒切配置数据 +* @param[in] 无 +* @return 本集中区倒切配置数据 +* @note by fan 20260610 +*/ +const ReverseSwitchCfgDataStru * GetReverseCfgData(void) +{ + return &gLocalReverseData; +} -} \ No newline at end of file diff --git a/TSCP/src/APP/ciapp/ReverseCut/ReverseCutConfigDataManage.h b/TSCP/src/APP/ciapp/ReverseCut/ReverseCutConfigDataManage.h index 32598fa..996c7ad 100644 --- a/TSCP/src/APP/ciapp/ReverseCut/ReverseCutConfigDataManage.h +++ b/TSCP/src/APP/ciapp/ReverseCut/ReverseCutConfigDataManage.h @@ -31,11 +31,34 @@ extern "C" { UINT16 wReverseRelayId; /*倒切继电器ID (配置数据)*/ }ReverseCutCfgDataStru; + typedef struct S_ReverseBoardStruct + { + UINT16 wReversBoardId; /*倒切板卡D*/ + UINT8 chDevType; /*设备类型*/ + UINT16 wDevId; /*板卡配置设备 ID*/ + UINT16 wBoardColOpenRelayId; /* 常开采集继电器ID */ + UINT16 wBoardColCloseRelayId; /* 常闭采集继电器ID */ + }ReverseBoardStruct; + + /*倒切开关及板卡配置数据结构体*/ + typedef struct S_ReverseSwitchDataStruct + { + UINT16 wId; /*倒切开关编号*/ + UINT16 wColOpenRelayId; /* 常开采集继电器ID */ + UINT16 wColCloseRelayId; /* 常闭采集继电器ID */ + UINT16 wRelateBoardNum; /*关联板卡个数*/ + UINT8 chBelongCiId;/*所属联锁*/ + ReverseBoardStruct strRelateBoardBuf[REVERSE_BOARD_SUM_MAX]; /*关联板卡数据*/ + }ReverseSwitchCfgDataStru; + + + + /*******************************全局变量声明*******************************/ extern ReverseCutCfgDataStru gstReverseCutCfgData[REVERSE_CUT_SUM_MAX]; /*定义倒切装置数据配置结构体*/ extern UINT16 gReverseCutCfgIdBuf[REVERSE_CUT_SUM_MAX]; /*定义倒切装置数据配置ID 缓存*/ extern INT16 gReverseCutCfgSum; /*定义倒切装置数据配置总数 */ - + extern ReverseSwitchCfgDataStru gLocalReverseData;/*定义属于本联锁的倒切柜数据*/ /* * 功能描述: 获取倒切装置当前总数 * 参数说明: void @@ -83,6 +106,54 @@ extern "C" { * CI_ERROR,整理失败 */ UINT8 ReverseCutConfigDataManage(void); + + /* + * 功能描述: 获取本集中区倒切开关常开继电器 + * 参数说明: 无 + * 返回值 : 0: 无倒切 + * [1,65534]继电器ID + */ + UINT16 GetReverseSwitchOpenRelay(void); + + /* + * 功能描述: 获取本集中区倒切开关常闭继电器 + * 参数说明: 无 + * 返回值 : 0: 无倒切 + * [1,65534]继电器ID + */ + UINT16 GetReverseSwitchCloseRelay(void); + + /* + * 功能描述: 获取本集中区指定索引倒切板卡常开继电器 + * 参数说明: wIndex 索引 + * 返回值 : 0: 无倒切 + * [1,65534]继电器ID + * UINT16_MAX 错误 + */ + UINT16 GetReverseBoardOpenRelay(UINT16 wIndex); + + /* + * 功能描述: 获取本集中区指定索引倒切板卡常闭继电器 + * 参数说明: wIndex 索引 + * 返回值 : 0: 无倒切 + * [1,65534]继电器ID + */ + UINT16 GetReverseBoardCloseRelay(UINT16 wIndex); + + /* + * 功能描述: 获取本集中区倒切板卡数量 + * 参数说明: 无 + * 返回值 : 0: 无倒切 [1,42]板卡数量 + */ + UINT16 GetReverseBoardNum(void); + + /** + * @brief 获取本集中区倒切配置数据 + * @param[in] 无 + * @return 本集中区倒切配置数据 + * @note by fan 20260610 + */ + const ReverseSwitchCfgDataStru * GetReverseCfgData(void); #ifdef __cplusplus } #endif diff --git a/TSCP/src/APP/ciapp/ReverseCut/ReverseCutDataManage.c b/TSCP/src/APP/ciapp/ReverseCut/ReverseCutDataManage.c index 14ee6d2..d2528bd 100644 --- a/TSCP/src/APP/ciapp/ReverseCut/ReverseCutDataManage.c +++ b/TSCP/src/APP/ciapp/ReverseCut/ReverseCutDataManage.c @@ -16,6 +16,7 @@ ReverseCutDataStru gstReverseCutData[REVERSE_CUT_SUM_MAX] = { 0U }; /* UINT8 gTiocSystemMode = 0U; /*TIOC主机模式 (影子模式 主控模式)*/ UINT8 gTiocSystemCutState = 0U; /*TIOC能否倒切状态 (能否倒切或默认)*/ UINT8 gTiocCanntCutReason = 0U; /*不可倒切原因*/ +LocalReverseBoardDataStru gstReversetData = { 0U }; /*本集中区倒切状态存储、周期刷新*/ /* @@ -235,6 +236,78 @@ UINT8 ReverseCutDataManageInit(void) ;/* 初始化失败 */ } + if (CI_SUCCESS == ret) + { + /*初始化为非控制侧*/ + gstReversetData.chSwitchState = REVERSE_STATE_OLD_SYSTEM; + for (i = 0u; i < REVERSE_BOARD_SUM_MAX; i++) + { + gstReversetData.localReverBoardState[i] = REVERSE_STATE_OLD_SYSTEM; + } + } + return ret; +} +/* +* 功能描述: 设置倒切开关状态 +* 参数说明: const UINT8 chReverseCutState,倒切状态 0xAA新建 0x55既有 0xFF异常 +* 返回值 : 无 +*/ +void SetReverseSwitchState(const UINT8 chReverseCutState) +{ + if ((REVERSE_STATE_NEW_SYSTEM == chReverseCutState) + || (REVERSE_STATE_OLD_SYSTEM == chReverseCutState) + ||(REVERSE_STATE_ABNORMAL == chReverseCutState)) + { + gstReversetData.chSwitchState = chReverseCutState; + } +} + +/* +* 功能描述: 设置指定索引倒切板卡状态 +* 参数说明: const UINT8 chReverseCutState,倒切状态0xAA新建 0x55既有 0xFF异常 wIndex索引 +* 返回值 : 无 +*/ +void SetReverseBoardState(const UINT8 chReverseCutState, const UINT16 wIndex) +{ + if ((REVERSE_STATE_NEW_SYSTEM == chReverseCutState) + || (REVERSE_STATE_OLD_SYSTEM == chReverseCutState) + ||(REVERSE_STATE_ABNORMAL == chReverseCutState)) + { + if(wIndex < REVERSE_BOARD_SUM_MAX) + { + gstReversetData.localReverBoardState[wIndex] = chReverseCutState; + } + } +} + +/* +* 功能描述: 获取倒切开关状态 +* 参数说明: 无 +* 返回值 :0xAA新建 0x55既有 0xFF异常 +*/ +UINT8 GetReverseSwitchState(void) +{ + UINT8 ret = gstReversetData.chSwitchState; + return ret; +} + +/* +* 功能描述: 获取指定ID指定索引倒切板卡状态 +* 参数说明: const UINT16 wBoardId,倒切板卡Id +* 返回值 :0xAA新建 0x55既有 0xFF异常 +*/ +UINT8 GetReverseBoardState(const UINT16 wBoardId) +{ + UINT8 ret = REVERSE_STATE_ABNORMAL; + UINT16 jj = 0U;/*索引*/ + for (jj = 0U; jj < gLocalReverseData.wRelateBoardNum; jj++) + { + if (wBoardId == gLocalReverseData.strRelateBoardBuf[jj].wReversBoardId) + { + ret = gstReversetData.localReverBoardState[jj]; + break; + } + } return ret; } \ No newline at end of file diff --git a/TSCP/src/APP/ciapp/ReverseCut/ReverseCutDataManage.h b/TSCP/src/APP/ciapp/ReverseCut/ReverseCutDataManage.h index 3e9445e..c672e8e 100644 --- a/TSCP/src/APP/ciapp/ReverseCut/ReverseCutDataManage.h +++ b/TSCP/src/APP/ciapp/ReverseCut/ReverseCutDataManage.h @@ -30,6 +30,15 @@ extern "C" { UINT16 wReverseState; /*倒切状态*/ }ReverseCutDataStru; + /*倒切状态数据结构体*/ + typedef struct S_ReverseDataStruct + { + UINT8 chSwitchState; /*倒切开关状态*/ + UINT8 localReverBoardState[REVERSE_BOARD_SUM_MAX];/*倒切板卡状态数组*/ + }LocalReverseBoardDataStru; + + + /*******************************全局变量声明*******************************/ extern ReverseCutDataStru gstReverseCutData[REVERSE_CUT_SUM_MAX]; /*定义倒切装置数据动态数据结构体*/ extern UINT8 gTiocSystemMode; @@ -109,6 +118,34 @@ void SetReverseCutState(const UINT16 wReverseCutId, const UINT8 chReverseCutStat */ UINT8 ReverseCutDataManageInit(void); +/* +* 功能描述: 设置倒切开关状态 +* 参数说明: const UINT8 chReverseCutState,倒切状态 0xAA新建 0x55既有 0xFF异常 +* 返回值 : 无 +*/ +void SetReverseSwitchState(const UINT8 chReverseCutState); + +/* +* 功能描述: 设置指定索引倒切板卡状态 +* 参数说明: const UINT8 chReverseCutState,倒切状态0xAA新建 0x55既有 0xFF异常 wIndex索引 +* 返回值 : 无 +*/ +void SetReverseBoardState(const UINT8 chReverseCutState, const UINT16 wIndex); + +/* +* 功能描述: 获取倒切开关状态 +* 参数说明: 无 +* 返回值 :0xAA新建 0x55既有 0xFF异常 +*/ +UINT8 GetReverseSwitchState(void); + +/* +* 功能描述: 获取指定ID指定索引倒切板卡状态 +* 参数说明: const UINT16 wBoardId,倒切板卡Id +* 返回值 :0xAA新建 0x55既有 0xFF异常 +*/ +UINT8 GetReverseBoardState(const UINT16 wBoardId); + #ifdef __cplusplus } #endif diff --git a/TSCP/src/APP/ciapp/ReverseCut/ReverseCutDefine.h b/TSCP/src/APP/ciapp/ReverseCut/ReverseCutDefine.h index 0d4b91c..0758472 100644 --- a/TSCP/src/APP/ciapp/ReverseCut/ReverseCutDefine.h +++ b/TSCP/src/APP/ciapp/ReverseCut/ReverseCutDefine.h @@ -31,4 +31,12 @@ #define REVERSE_REASON_OC_COMM_ERR ((UINT8)0x01) /*不可倒切原因 OC通信故障*/ #define REVERSE_REASON_IVOC_COMM_ERR ((UINT8)0x02) /*不可倒切原因 IVOC通信故障*/ #define REVERSE_REASON_AXLE_COMM_ERR ((UINT8)0x04) /*不可倒切原因 计轴系统通信故障*/ + +/*倒切设备总数最大值*/ +#define REVERSE_BOARD_SUM_MAX ((UINT16)42) /*定义倒切板卡最大值*/ + +/*倒切状态*/ +#define REVERSE_STATE_NEW_SYSTEM ((UINT8)0xAAU) /*新建系统侧*/ +#define REVERSE_STATE_OLD_SYSTEM ((UINT8)0x55U) /*既有系统侧*/ +#define REVERSE_STATE_ABNORMAL ((UINT8)0xFFU) /*采集异常*/ #endif \ No newline at end of file diff --git a/TSCP/src/APP/ciapp/Route/DynamicRouteDataManage.c b/TSCP/src/APP/ciapp/Route/DynamicRouteDataManage.c index 060363a..5e90373 100644 --- a/TSCP/src/APP/ciapp/Route/DynamicRouteDataManage.c +++ b/TSCP/src/APP/ciapp/Route/DynamicRouteDataManage.c @@ -2163,32 +2163,24 @@ static UINT8 LockDrSubRouteSwitchCheck(UINT16 wSubRouteId, UINT8 functionId, UIN if (CI_SUCCESS == reResult) { - if (CI_TRADITION_RAILWAY == lineIdentity) + /* + 进路内所有道岔位置正确 + 不正确:RETURN_LOCK_ERR_SWITPOS + 正确:CI_SUCCESS + */ + devId = 0u; + devState = 0u; + checkResult = RouteAllSwitchPosCheck(wSubRouteId, &devId, &devState); + if (checkResult == CI_SUCCESS) { - /* - 进路内所有道岔位置正确 - 不正确:RETURN_LOCK_ERR_SWITPOS - 正确:CI_SUCCESS - */ - devId = 0u; - devState = 0u; - checkResult = RouteAllSwitchPosCheck(wSubRouteId, &devId, &devState); - if (checkResult == CI_SUCCESS) - { - /* 通过检查 */ - reResult = CI_SUCCESS; - } - else - { - /* 失败返回 */ - reResult = RETURN_LOCK_ERR_SWITPOS; - - } + /* 通过检查 */ + reResult = CI_SUCCESS; } else { /* 失败返回 */ - reResult = CI_ERROR; + reResult = RETURN_LOCK_ERR_SWITPOS; + } } @@ -3922,32 +3914,30 @@ static UINT8 SetDrSubRouteSwitchCheck(UINT16 routeId, UINT8 functionId, UINT8 se } if (CI_SUCCESS == reResult) - { - if (CI_TRADITION_RAILWAY == lineIdentity) + {/*进路办理防护道岔检查*/ + /*进路关联防护道岔【未引导总锁】*/ + devId = 0u; + devState = 0u; + checkResult = RouteRelatedProSwitchYLockCheck(routeId, &devId, &devState); + if (checkResult == CI_SUCCESS) { /* 通过检查 */ reResult = CI_SUCCESS; } else { - /* 失败返回 *//* zt 删除单轨相关代码 2022-02-15 */ + /* 记录故障码 */ + SetErrorData(functionId, CI_DEVICE_TYPE_SWITCH, devId, ETYPE_SWT_YLOCK_STATE, devState, sendLevel); + /* 失败返回 */ reResult = CI_ERROR; } - } - else - { - /* 失败返回 */ - reResult = CI_ERROR; - } - if (CI_SUCCESS == reResult) - {/*进路办理防护道岔检查*/ - if (CI_TRADITION_RAILWAY == lineIdentity) + if (CI_SUCCESS == reResult) { - /*进路关联防护道岔【未引导总锁】*/ + /*进路关联防护道岔位置正确或位置不正确但可动作*/ devId = 0u; devState = 0u; - checkResult = RouteRelatedProSwitchYLockCheck(routeId, &devId, &devState); + checkResult = DrSubRouteProtSwiPosMovValCheck(routeId, &devId, &devState, sendLevel); if (checkResult == CI_SUCCESS) { /* 通过检查 */ @@ -3955,37 +3945,12 @@ static UINT8 SetDrSubRouteSwitchCheck(UINT16 routeId, UINT8 functionId, UINT8 se } else { - /* 记录故障码 */ - SetErrorData(functionId, CI_DEVICE_TYPE_SWITCH, devId, ETYPE_SWT_YLOCK_STATE, devState, sendLevel); /* 失败返回 */ reResult = CI_ERROR; } - - if (CI_SUCCESS == reResult) - { - /*进路关联防护道岔位置正确或位置不正确但可动作*/ - devId = 0u; - devState = 0u; - checkResult = DrSubRouteProtSwiPosMovValCheck(routeId, &devId, &devState, sendLevel); - if (checkResult == CI_SUCCESS) - { - /* 通过检查 */ - reResult = CI_SUCCESS; - } - else - { - /* 失败返回 */ - reResult = CI_ERROR; - } - } - else - { - reResult = CI_ERROR; - } } else { - /* 失败返回 *//* zt 删除单轨相关代码 2022-02-15 */ reResult = CI_ERROR; } } diff --git a/TSCP/src/APP/ciapp/Route/LogicalRouteDataManage.c b/TSCP/src/APP/ciapp/Route/LogicalRouteDataManage.c index 8e9a331..92fea29 100644 --- a/TSCP/src/APP/ciapp/Route/LogicalRouteDataManage.c +++ b/TSCP/src/APP/ciapp/Route/LogicalRouteDataManage.c @@ -2437,7 +2437,9 @@ void LgcSecLogicalUnlockProc(const UINT16 logRouteId, const UINT16 logSectionId, /*清0 防脏数据*/ for (jj = chTrainSum; jj < chLgcResTrainSum; jj++) { - (void)ComMemSet(&(pstLgcSecInfo[wLgcBufIndex].szTrainResData[jj]), (UINT16)sizeof(LogicTrainResStruct), 0U); + + /*重置资源信息结构体*/ + ResetResInfoStruct(wLgcBufIndex, jj); } pstLgcSecInfo[wLgcBufIndex].chTrainInfoSum = chTrainSum; diff --git a/TSCP/src/APP/ciapp/Route/RouteConfigDataManage.c b/TSCP/src/APP/ciapp/Route/RouteConfigDataManage.c index f278152..6d1f390 100644 --- a/TSCP/src/APP/ciapp/Route/RouteConfigDataManage.c +++ b/TSCP/src/APP/ciapp/Route/RouteConfigDataManage.c @@ -12,7 +12,7 @@ #include "../Switch/SwitchDataManage.h" #include "RouteConfigDataManage.h" - +#include "dquCILSStruInit.h" RouteConfigDataStruct RouteConfigDataStru[ROUTE_SUM_MAX]; /*定义进路配置数据结构体,cgh-合并CID-2539-1:此处声明不进行初始化,统一放到InitAllStaticDataStr函数中进行初始化,为解决生成内核过大得问题*/ UINT16 LocalCiRouteIdBuf[ROUTE_SUM_MAX] = {0u}; /*定义本地联锁进路ID映射数组*/ INT16 RouteCurSum = 0; /*进路当前总数(本联锁和相邻联锁发送给本联锁的进路总数),进路的特殊处理*/ @@ -3726,4 +3726,76 @@ UINT8 GetRouteConfigDirection(const UINT16 routeId) retVal = CI_ERROR; } return retVal; +} + +/* +* 功能描述: 获取进路联络线属性 +* 参数说明: const UINT16 wRouteId, 进路ID +* 返回值 : 进路联络线属性 +* +* BY LYJ 20260602 +*/ +UINT8 GetRouteConnectType(const UINT16 wRouteId) +{ + UINT8 chRetVal = 0U; + UINT16 bufIndex = 0U; + bufIndex = GetRouteConfigBufIndex(wRouteId); /*获取进路数组下标*/ + + if (ROUTE_SUM_MAX > bufIndex) + { + chRetVal = RouteConfigDataStru[bufIndex].chRouteConnectType; + } + else + { + /*不处理*/ + } + + return chRetVal; +} + +/* +* 功能描述: 获取进路指定区段的前一个区段 +* 参数说明: const UINT16 wRouteId, 进路ID +* const UINT16 wPhySecId,物理区段ID +* 返回值 : 进路指定区段的前一个区段 +* +* BY LYJ 20260603 +*/ +UINT16 GetRoutePhySecFrontPhyId(const UINT16 wRouteId, const UINT16 wPhySecId) +{ + UINT16 wFroutPhySecId = 0U; + UINT8 chRoutePhySum = 0U; + RoutePhysicalSectionStruct* pRoutePhyBuf = NULL; + UINT8 ii = 0U; + + chRoutePhySum = GetRoutePhysicalSectionSum(wRouteId); + pRoutePhyBuf = GetRouteSectionData(wRouteId); + if (NULL != pRoutePhyBuf) + { + for (ii = 0U;ii < chRoutePhySum;ii++) + { + if (pRoutePhyBuf[ii].PhysicalSectionId == wPhySecId) + { + if (0U < ii) + { + wFroutPhySecId = pRoutePhyBuf[ii - 1U].PhysicalSectionId; + } + else + { + /*进路第一个区段属于邻线,进路是邻线,不在本线处理*/ + } + break; + } + else + { + /*不处理*/ + } + } + } + else + { + /*不处理*/ + } + + return wFroutPhySecId; } \ No newline at end of file diff --git a/TSCP/src/APP/ciapp/Route/RouteConfigDataManage.h b/TSCP/src/APP/ciapp/Route/RouteConfigDataManage.h index 76ee4e4..1ec65ce 100644 --- a/TSCP/src/APP/ciapp/Route/RouteConfigDataManage.h +++ b/TSCP/src/APP/ciapp/Route/RouteConfigDataManage.h @@ -317,6 +317,7 @@ typedef struct S_RouteConfigDataStruct UINT8 cRouteRukuProperty; /*是否为入库进路:0x55 入库进路;0xaa 非入库进路*/ SideProtecGroupStru RouteSideProtecData;/*进路侧防条件*/ UINT8 chRouteCouplinkType; /*进路联挂属性:0x55 配置联挂属性;0xaa 未配置联挂属性*/ + UINT8 chRouteConnectType; /*进路联络线属性:0x55 配置联络线属性;0xaa 未配置联络线属性*/ }RouteConfigDataStruct; /*******************************全局变量声明*******************************/ @@ -1427,6 +1428,23 @@ UINT8 GetPhySecInRoutePosIndex(const UINT16 routeId, const UINT16 phySectionId); ** by LYJ 20260330 */ UINT8 GetRouteConfigDirection(const UINT16 routeId); +/* +* 功能描述: 获取进路联络线属性 +* 参数说明: const UINT16 wRouteId, 进路ID +* 返回值 : 进路联络线属性 +* +* BY LYJ 20260602 +*/ +UINT8 GetRouteConnectType(const UINT16 wRouteId); +/* +* 功能描述: 获取进路指定区段的前一个区段 +* 参数说明: const UINT16 wRouteId, 进路ID +* const UINT16 wPhySecId,物理区段ID +* 返回值 : 进路指定区段的前一个区段 +* +* BY LYJ 20260603 +*/ +UINT16 GetRoutePhySecFrontPhyId(const UINT16 wRouteId, const UINT16 wPhySecId); #ifdef __cplusplus } diff --git a/TSCP/src/APP/ciapp/Route/RouteDataManage.c b/TSCP/src/APP/ciapp/Route/RouteDataManage.c index 52f5ef6..1b0f6a4 100644 --- a/TSCP/src/APP/ciapp/Route/RouteDataManage.c +++ b/TSCP/src/APP/ciapp/Route/RouteDataManage.c @@ -6192,4 +6192,54 @@ UINT32 GetRouteIdleCycNum(const UINT16 routeId) } return reVal; +} + +/* +* 功能描述:设置指定进路联络线解锁标志 +* 参数说明:const UINT16 routeId 需设置的进路ID +* const UINT8 setFlag 需设置标志 +* 返 回 值:无 +* Created lyj 2026.06.03 +*/ +void SetRouteConnectReleaseFlag(const UINT16 routeId, const UINT8 setFlag) +{ + UINT16 bufIndex = 0U; /*数组下标*/ + bufIndex = GetRouteConfigBufIndex(routeId); /*获取进路数组下标*/ + if (ROUTE_SUM_MAX > bufIndex) + { + if ((ROUTE_CONNECT_RELEASE_YES == setFlag) || (ROUTE_CONNECT_RELEASE_NO == setFlag)) + { + RouteDataStru[bufIndex].chRouteConnReleaseFlag = setFlag; + } + else + { + /*不处理*/ + } + } + else + { + /*不处理*/ + } +} +/* +* 功能描述:获取指定进路联络线解锁标志 +* 参数说明:const UINT16 routeId 进路ID +* 返 回 值:进路联络线解锁标志 +* Created lyj 2026.06.03 +*/ +UINT8 GetRouteConnectReleaseFlag(const UINT16 routeId) +{ + UINT16 bufIndex = 0U; /*数组下标*/ + UINT8 chRetVal = ROUTE_CONNECT_RELEASE_NO; + bufIndex = GetRouteConfigBufIndex(routeId); /*获取进路数组下标*/ + if (ROUTE_SUM_MAX > bufIndex) + { + chRetVal = RouteDataStru[bufIndex].chRouteConnReleaseFlag; + } + else + { + /*不处理*/ + } + + return chRetVal; } \ No newline at end of file diff --git a/TSCP/src/APP/ciapp/Route/RouteDataManage.h b/TSCP/src/APP/ciapp/Route/RouteDataManage.h index 4db2edf..e43273f 100644 --- a/TSCP/src/APP/ciapp/Route/RouteDataManage.h +++ b/TSCP/src/APP/ciapp/Route/RouteDataManage.h @@ -113,6 +113,7 @@ typedef struct S_RouteDataStruct UINT8 chCouplinkSuccessFlag; /*进路联挂成功*/ UINT8 chCouplinkErrorFlag; /*进路联挂失败*/ UINT32 dwRouteIdleCycNum; /*进路空闲起始周期号*/ + UINT8 chRouteConnReleaseFlag; /*进路联络线解锁标志*/ } RouteDataStruct; /*进路动态数据结构体-车车*/ @@ -1787,6 +1788,21 @@ void SetRouteStopensureFlagCC(const UINT16 routeId, const UINT8 stopensureFlag); * by cgh 20251210 */ UINT32 GetRouteIdleCycNum(const UINT16 routeId); +/* +* 功能描述:设置指定进路联络线解锁标志 +* 参数说明:const UINT16 routeId 需设置的进路ID +* const UINT8 setFlag 需设置标志 +* 返 回 值:无 +* Created lyj 2026.06.03 +*/ +void SetRouteConnectReleaseFlag(const UINT16 routeId, const UINT8 setFlag); +/* +* 功能描述:获取指定进路联络线解锁标志 +* 参数说明:const UINT16 routeId 进路ID +* 返 回 值:进路联络线解锁标志 +* Created lyj 2026.06.03 +*/ +UINT8 GetRouteConnectReleaseFlag(const UINT16 routeId); #ifdef __cplusplus } diff --git a/TSCP/src/APP/ciapp/Route/RouteDefine.h b/TSCP/src/APP/ciapp/Route/RouteDefine.h index 3720948..94922e3 100644 --- a/TSCP/src/APP/ciapp/Route/RouteDefine.h +++ b/TSCP/src/APP/ciapp/Route/RouteDefine.h @@ -100,6 +100,7 @@ #define ROUTE_TYPE_AUTO_TRIGGER ((UINT8)0x66) /*自动触发进路*/ #define ROUTE_TYPE_RUKU ((UINT8)0x77) /*入库进路*/ #define ROUTE_TYPE_COUPLINK ((UINT8)0x88) /*联挂进路*/ +#define ROUTE_TYPE_CONNECT ((UINT8)0x99) /*联络线进路*/ /*进路状态*/ #define ROUTE_STATE_IDLE ((UINT8)0x01) /*进路空闲*/ @@ -401,5 +402,10 @@ #define SIDE_PROTECT_SWITCH_NUM_MAX ((UINT8)5) /*侧防道岔数量*/ #define SIDE_PROTECT_PHYSEC_NUM_MAX ((UINT8)10) /*侧防物理区段数量*/ #define SIDE_PROTECT_NUM_MAX ((UINT8)10) /*侧防条件数量*/ + + +#define ROUTE_CONNECT_RELEASE_YES ((UINT8)0x55) /*进路联络线解锁标志有效*/ +#define ROUTE_CONNECT_RELEASE_NO ((UINT8)0xaa) /*进路联络线解锁标志无效*/ + #endif diff --git a/TSCP/src/APP/ciapp/Section/AxisSectionDataManage.c b/TSCP/src/APP/ciapp/Section/AxisSectionDataManage.c index b732dba..189236f 100644 --- a/TSCP/src/APP/ciapp/Section/AxisSectionDataManage.c +++ b/TSCP/src/APP/ciapp/Section/AxisSectionDataManage.c @@ -503,20 +503,43 @@ void SetAxisIncludeLogSecArbState(const UINT16 wAxisSectionId, const UINT8 chSta UINT16* pLogSectionIdBuf = NULL;/*计轴区段包含逻辑区段ID*/ UINT8 chLogSectionSum = 0U;/*计轴区段包含逻辑区段数目*/ UINT8 ii = 0U; + UINT8 cLocalCiId = 0U; + UINT8 chLogSecBelongCi = 0U; + UINT8 chCheckFlag = 0U; pLogSectionIdBuf = GetAxisSecLogSectionIdBuf(wAxisSectionId); chLogSectionSum = GetAxisSecLogSectionSum(wAxisSectionId); - + cLocalCiId = GetSystemParaLocalCiId(); + if (NULL != pLogSectionIdBuf) { for (ii = 0U; ii < chLogSectionSum; ii++) { if ((LGC_SECTION_ARB_NO == chState) || (LGC_SECTION_ARB_YES == chState)) { - SetLgcArbState(pLogSectionIdBuf[ii], chState); + chLogSecBelongCi = GetLogSecBelongCiId(pLogSectionIdBuf[ii]); + chCheckFlag = IsSameLineCI(cLocalCiId, chLogSecBelongCi); + if (SAME_LINE_NO == chCheckFlag) + { + SetLgcArbState(pLogSectionIdBuf[ii], chState); + SetLogSecCbtcArbState(pLogSectionIdBuf[ii], chState); /*互联互通,不同线路设置CBTCARB;用于显示*/ + } + else + { + SetLgcArbState(pLogSectionIdBuf[ii], chState); + } + + } + else + { + /*不处理*/ } } } + else + { + /*不处理*/ + } } /* diff --git a/TSCP/src/APP/ciapp/Section/LogicSectionDataManage.c b/TSCP/src/APP/ciapp/Section/LogicSectionDataManage.c index 7a1b4f1..3525814 100644 --- a/TSCP/src/APP/ciapp/Section/LogicSectionDataManage.c +++ b/TSCP/src/APP/ciapp/Section/LogicSectionDataManage.c @@ -1618,7 +1618,8 @@ void ClearLgcSecResTrain(UINT16 wLogSecId) /*清0防脏*/ for (ii = chNeedKeepSum; ii < LOGIC_SECTION_RES_SUM_MAX; ii++) { - (void)ComMemSet((UINT8*)&(LogicSectionDataStruCC[wBufIndex].szTrainResData[ii]), (UINT16)sizeof(LogicTrainResStruct), 0U); + /*重置资源信息结构体*/ + ResetResInfoStruct(wBufIndex, ii); } LogicSectionDataStruCC[wBufIndex].chTrainInfoSum = chNeedKeepSum; } @@ -2886,7 +2887,7 @@ void RemoveLgcSecResTrain(UINT16 wLogSecId, UINT16 wTrainId) if (wLgcResTrainId == wTrainId) { /*删除该列车对应逻辑区段资源*/ - (void)ComMemSet((void *)&pstLgcSecInfo[wLgcBufIndex].szTrainResData[jj], (UINT16)sizeof(LogicTrainResStruct), 0U); + ResetResInfoStruct(wLgcBufIndex, jj); debug_infor_printf((const)"LogSecRes Remove LgcId: %d TrainId:%d Cyc\n" , wLogSecId , wTrainId @@ -3805,7 +3806,9 @@ void LogJumpLockCmdManage(const UINT16 logSectionId, const UINT8 jumpLockState) else { /** 设置跳跃锁闭允许标志为允许 */ + + ClearLogSeceSwitchDanCaoPos(logSectionId);/*清除单操位置*/ /** 设置逻辑区段跳跃锁闭 */ SetLogSecJumpLockState(logSectionId, LOGIC_SECTION_JUMP_LOCK_YES); @@ -3815,9 +3818,13 @@ void LogJumpLockCmdManage(const UINT16 logSectionId, const UINT8 jumpLockState) devState = 0u; retVal = LogicSecRltvPrtctSwLockCheck(logSectionId, &devId, &devState); if (CI_SUCCESS == retVal) - { + {/*防护道岔锁检查*/ SetLogSecJumpLockPermFlag(logSectionId, LOGIC_JUMPUNLOCK_PERMISSIVE_YES); } + else + { + SetLogSecJumpLockPermFlag(logSectionId, LOGIC_JUMPUNLOCK_PERMISSIVE_NO); + } } } @@ -4985,7 +4992,7 @@ void SetLogSecLogLockState(const UINT16 wLogSectionId, const UINT8 chLogLockStat { UINT16 wBufIndex = 0U; /*数组下标*/ UINT16 LogSecLockBelongRouteId = 0U; - + UINT8 index = 0U; wBufIndex = GetlogSectionBufIndex(wLogSectionId); /*获取区段数组下标*/ if (LOGIC_SECTION_SUM_MAX > wBufIndex) @@ -5003,9 +5010,10 @@ void SetLogSecLogLockState(const UINT16 wLogSectionId, const UINT8 chLogLockStat else { LogicSectionDataStruCC[wBufIndex].chTrainInfoSum = 0U; - (void)CommonMemSet(LogicSectionDataStruCC[wBufIndex].szTrainResData, \ - (UINT32)sizeof(LogicSectionDataStruCC[wBufIndex].szTrainResData), \ - 0U, (UINT32)sizeof(LogicSectionDataStruCC[wBufIndex].szTrainResData)); + for(index = 0U; index < LOGIC_SECTION_RES_SUM_MAX; index++) + { + ResetResInfoStruct(wBufIndex, index); + } } } @@ -5189,7 +5197,7 @@ void SetLogSecLogLockStateOtherCi(const UINT16 wLogSectionId, const UINT8 chLogL { UINT16 wBufIndex = 0U; /*数组下标*/ UINT8 cLogSecLockState = 0U; /*逻辑区段锁闭状态*/ - + UINT8 jj = 0U; wBufIndex = GetlogSectionBufIndex(wLogSectionId); /*获取区段数组下标*/ if (LOGIC_SECTION_SUM_MAX > wBufIndex) @@ -5204,7 +5212,10 @@ void SetLogSecLogLockStateOtherCi(const UINT16 wLogSectionId, const UINT8 chLogL { /*进路锁闭和逻辑锁闭均未锁闭,清除逻辑区段资源列车信息*/ LogicSectionDataStruCC[wBufIndex].chTrainInfoSum = 0U; - (void)CommonMemSet(LogicSectionDataStruCC[wBufIndex].szTrainResData, (UINT32)sizeof(LogicSectionDataStruCC[wBufIndex].szTrainResData), 0U, (UINT32)sizeof(LogicSectionDataStruCC[wBufIndex].szTrainResData)); + for (jj = 0U; jj < LOGIC_SECTION_RES_SUM_MAX; jj++) + { + ResetResInfoStruct(wBufIndex, jj); + } } else { @@ -5719,13 +5730,13 @@ void SetLogSecLockDirHlht(UINT16 wLogSectionId, const UINT8 lockDir) if (bufIndex < LOGIC_SECTION_SUM_MAX) { - if (CI_SYSTEM_DIRECTION_NONE == lockDir) + if ((CI_SYSTEM_DIRECTION_UP == lockDir) || (CI_SYSTEM_DIRECTION_DOWN == lockDir)) { - LogicSectionDataStru[bufIndex].LogLockDir = CI_SYSTEM_DIRECTION_NONE; + LogicSectionDataStru[bufIndex].LogLockDir = lockDir; } else { - LogicSectionDataStru[bufIndex].LogLockDir = lockDir; + LogicSectionDataStru[bufIndex].LogLockDir = CI_SYSTEM_DIRECTION_NONE; } } else @@ -6385,10 +6396,6 @@ UINT8 ReqAlignmentInfoCalc(void) { break; } - else - { - /*继续执行*/ - } } } else @@ -6613,4 +6620,35 @@ void SetSendAtsLgcArbState(void) ; /* 数据获取失败 */ } } -} \ No newline at end of file +} + +/* +* 功能描述: 重置资源信息结构体 +* 参数说明: UINT16 logicSectionId 逻辑区段ID +* UINT8 index 资源信息结构体数组索引 +* 返回值 : 无 +*/ +void ResetResInfoStruct(UINT16 logicSectionId, UINT8 index) +{ + if (LOGIC_SECTION_SUM_MAX > logicSectionId) + { + + if (LOGIC_SECTION_RES_SUM_MAX > index) + { + LogicSectionDataStruCC[logicSectionId].szTrainResData[index].wTrainId = 0U; + LogicSectionDataStruCC[logicSectionId].szTrainResData[index].chLogicResUsable = LOGIC_SECTION_RES_UNUSABLE; + LogicSectionDataStruCC[logicSectionId].szTrainResData[index].chLogicReturnState = LOGIC_SECTION_TRAIN_RETURN_NO; + LogicSectionDataStruCC[logicSectionId].szTrainResData[index].chTrainApplyState = LOGIC_SECTION_TRAIN_APPLY_NO; + LogicSectionDataStruCC[logicSectionId].szTrainResData[index].chLogicUnlockState = LOGIC_SECTION_TRAIN_UNLOCK_NO; + LogicSectionDataStruCC[logicSectionId].szTrainResData[index].dwRcvUnlockCmdCyc = 0U; + } + else + { + /*不处理*/ + } + } + else + { + ; /*不处理*/ + } +} diff --git a/TSCP/src/APP/ciapp/Section/LogicSectionDataManage.h b/TSCP/src/APP/ciapp/Section/LogicSectionDataManage.h index 4682b32..bd0cc2d 100644 --- a/TSCP/src/APP/ciapp/Section/LogicSectionDataManage.h +++ b/TSCP/src/APP/ciapp/Section/LogicSectionDataManage.h @@ -1469,7 +1469,13 @@ void SetLogSecPbTacsArbState(const UINT16 wLgcId, const UINT8 chArb); * by cgh 20260330 */ void SetSendAtsLgcArbState(void); - +/* +* 功能描述: 重置资源信息结构体 +* 参数说明: UINT16 logicSectionId 逻辑区段ID +* 返回值 : 无 +* by cgh 20260330 +*/ +void ResetResInfoStruct(UINT16 logicSectionId, UINT8 index); #ifdef __cplusplus } #endif diff --git a/TSCP/src/APP/ciapp/Section/SectionDefine.h b/TSCP/src/APP/ciapp/Section/SectionDefine.h index fc47938..336405b 100644 --- a/TSCP/src/APP/ciapp/Section/SectionDefine.h +++ b/TSCP/src/APP/ciapp/Section/SectionDefine.h @@ -16,9 +16,9 @@ /*区段最大数量*/ #define PHYSICAL_SECTION_SUM_MAX ((UINT16)1000) /*定义物理区段数量最大值*/ -#define AXIS_SECTION_SUM_MAX ((UINT16)1200) /*定义计轴区段数量最大值*/ +#define AXIS_SECTION_SUM_MAX ((UINT16)2000) /*定义计轴区段数量最大值*/ #define AXIS_INCLUDE_LOG_SUM_MAX ((UINT16)50) /*定义计轴包含逻辑区段数量最大值*/ -#define LOGIC_SECTION_SUM_MAX ((UINT16)1500) /*定义逻辑区段数量最大值*/ +#define LOGIC_SECTION_SUM_MAX ((UINT16)3000) /*定义逻辑区段数量最大值*/ #define PHYSICAL_INCLUDE_AXIS_SUM_MAX ((UINT16)10) /*定义物理区段包含计轴区段数量最大值*/ #define AXIS_INCLUDE_SWITCH_SUM_MAX ((UINT16)4) /*定义计轴区段包含的道岔数量最大值*/ #define AXIS_INCLUDE_LINK_SUM_MAX ((UINT16)5) /*定义计轴区段包含的LINK最大值*/ diff --git a/TSCP/src/APP/ciapp/Signal/SignalConfigDataManage.c b/TSCP/src/APP/ciapp/Signal/SignalConfigDataManage.c index a193dab..fe397c1 100644 --- a/TSCP/src/APP/ciapp/Signal/SignalConfigDataManage.c +++ b/TSCP/src/APP/ciapp/Signal/SignalConfigDataManage.c @@ -1888,4 +1888,93 @@ UINT16 GetSignalOutFirstLogSec(const UINT16 signalId) } } return retVal; -} \ No newline at end of file +} + +/* +* 功能描述: 获取指定ID信号机1灯丝驱动继电器ID(联络线使用) +* 参数说明: const UINT16 signalId, 信号机ID +* 返回值 : 0: 获取数据失败 +* >0: 信号1灯丝驱动继电器ID +*/ +UINT16 GetSignalFirstDsDrvRelayId(const UINT16 signalId) +{ + UINT16 bufIndex = 0U; /*数组下标*/ + UINT16 retVal = CI_ERROR; + + bufIndex = GetSignalConfigBufIndex(signalId); /*获取区段数组下标*/ + if (SIGNAL_SUM_MAX > bufIndex) + { + retVal = SignalConfigDataStru[bufIndex].wFirstDsDrvRelayId; + } + else + { + retVal = CI_ERROR; + } + return retVal; +} +/* +* 功能描述: 获取指定ID信号机主控驱动继电器ID(联络线使用) +* 参数说明: const UINT16 signalId, 信号机ID +* 返回值 : 0: 获取数据失败 +* >0: 信号主控驱动继电器ID +*/ +UINT16 GetSignalMainDrvRelayId(const UINT16 signalId) +{ + UINT16 bufIndex = 0U; /*数组下标*/ + UINT16 retVal = CI_ERROR; + + bufIndex = GetSignalConfigBufIndex(signalId); /*获取区段数组下标*/ + if (SIGNAL_SUM_MAX > bufIndex) + { + retVal = SignalConfigDataStru[bufIndex].wMainDrvRelayId; + } + else + { + retVal = CI_ERROR; + } + return retVal; +} +/* +* 功能描述: 获取指定ID信号机次控驱动继电器ID(联络线使用) +* 参数说明: const UINT16 signalId, 信号机ID +* 返回值 : 0: 获取数据失败 +* >0: 信号次控驱动继电器ID +*/ +UINT16 GetSignalAckDrvRelayId(const UINT16 signalId) +{ + UINT16 bufIndex = 0U; /*数组下标*/ + UINT16 retVal = CI_ERROR; + + bufIndex = GetSignalConfigBufIndex(signalId); /*获取区段数组下标*/ + if (SIGNAL_SUM_MAX > bufIndex) + { + retVal = SignalConfigDataStru[bufIndex].wAckDrvRelayId; + } + else + { + retVal = CI_ERROR; + } + return retVal; +} +/* +* 功能描述: 获取指定ID信号机复杂主控驱动继电器ID(联络线使用) +* 参数说明: const UINT16 signalId, 信号机ID +* 返回值 : 0: 获取数据失败 +* >0: 信号复杂主控驱动继电器ID +*/ +UINT16 GetSignalCMainDrvRelayId(const UINT16 signalId) +{ + UINT16 bufIndex = 0U; /*数组下标*/ + UINT16 retVal = CI_ERROR; + + bufIndex = GetSignalConfigBufIndex(signalId); /*获取区段数组下标*/ + if (SIGNAL_SUM_MAX > bufIndex) + { + retVal = SignalConfigDataStru[bufIndex].wCMainDrvRelayId; + } + else + { + retVal = CI_ERROR; + } + return retVal; +} diff --git a/TSCP/src/APP/ciapp/Signal/SignalConfigDataManage.h b/TSCP/src/APP/ciapp/Signal/SignalConfigDataManage.h index 80a0591..71585b7 100644 --- a/TSCP/src/APP/ciapp/Signal/SignalConfigDataManage.h +++ b/TSCP/src/APP/ciapp/Signal/SignalConfigDataManage.h @@ -102,6 +102,11 @@ typedef struct S_SignalConfigDataStruct UINT16 LxDrvRelayId; /*列车信号驱动继电器ID(配置字段-联络线使用)*/ UINT16 YxDrvRelayId; /*引导信号驱动继电器ID(配置字段-联络线使用)*/ UINT16 DxDrvRelayId; /*调车信号驱动继电器ID(配置字段-联络线使用)*/ + UINT16 wFirstDsDrvRelayId; /*1灯丝驱动继电器ID(配置字段-联络线使用)*/ + UINT16 wMainDrvRelayId; /*信号机主控驱动继电器ID(配置字段-联络线使用)*/ + UINT16 wAckDrvRelayId; /*信号机次控驱动继电器ID(配置字段-联络线使用)*/ + UINT16 wCMainDrvRelayId; /*信号机复杂主控驱动继电器ID(配置字段-联络线使用)*/ + } SignalConfigDataStruct; typedef struct S_OC_SignalConfigDataStruct @@ -744,6 +749,34 @@ UINT16 GetSignalDxDrvRelayId(const UINT16 signalId); * >0: 逻辑区段ID */ UINT16 GetSignalOutFirstLogSec(const UINT16 signalId); +/* +* 功能描述: 获取指定ID信号机1灯丝驱动继电器ID(联络线使用) +* 参数说明: const UINT16 signalId, 信号机ID +* 返回值 : 0: 获取数据失败 +* >0: 信号1灯丝驱动继电器ID +*/ +UINT16 GetSignalFirstDsDrvRelayId(const UINT16 signalId); +/* +* 功能描述: 获取指定ID信号机主控驱动继电器ID(联络线使用) +* 参数说明: const UINT16 signalId, 信号机ID +* 返回值 : 0: 获取数据失败 +* >0: 信号主控驱动继电器ID +*/ +UINT16 GetSignalMainDrvRelayId(const UINT16 signalId); +/* +* 功能描述: 获取指定ID信号机次控驱动继电器ID(联络线使用) +* 参数说明: const UINT16 signalId, 信号机ID +* 返回值 : 0: 获取数据失败 +* >0: 信号次控驱动继电器ID +*/ +UINT16 GetSignalAckDrvRelayId(const UINT16 signalId); +/* +* 功能描述: 获取指定ID信号机复杂主控驱动继电器ID(联络线使用) +* 参数说明: const UINT16 signalId, 信号机ID +* 返回值 : 0: 获取数据失败 +* >0: 信号复杂主控驱动继电器ID +*/ +UINT16 GetSignalCMainDrvRelayId(const UINT16 signalId); #ifdef __cplusplus } diff --git a/TSCP/src/APP/ciapp/Signal/SignalDataManage.c b/TSCP/src/APP/ciapp/Signal/SignalDataManage.c index 6af206e..1971e01 100644 --- a/TSCP/src/APP/ciapp/Signal/SignalDataManage.c +++ b/TSCP/src/APP/ciapp/Signal/SignalDataManage.c @@ -5791,4 +5791,71 @@ void SetSignalCrossStateCC(const UINT16 signalId, const UINT8 signalCrossState, { /*不处理*/ } +} + +/* +* 功能描述:获取复杂主控继电器驱动状态 +* 参数说明:const UINT16 wCMainlRralyId, 继电器ID +* const UINT16 wSignalId, 信号机ID +* 返 回 值:驱动状态 +* Created LYJ 2026.6.2 +*/ +UINT8 GetCMainRelayDriveState(const UINT16 wCMainlRralyId, const UINT16 wSignalId) +{ + UINT8 chRet = CI_ERROR; + UINT16 wSigOutPhyId = 0U; + UINT16 wSigInPhyId = 0U; + UINT16 wLockRouteId = 0U; + UINT8 chOccState = 0U; + UINT8 chLockState = 0U; + UINT8 chFengSuoState = 0U; + UINT8 chJLockState = 0U; + UINT16 wQXzhaochaRelay = 0U; + UINT8 chColleState = 0U; + + if ((0U < wCMainlRralyId) && (RELAY_SUM_MAX > wCMainlRralyId)) + { + wSigOutPhyId = GetSignalOutFirstPhySecId(wSignalId); /*信号机外方区段*/ + chOccState = GetPhySecCurMergeState(wSigOutPhyId); /*占用状态*/ + chLockState = GetPhySecLockState(wSigOutPhyId); /*锁闭状态*/ + chFengSuoState = GetPhySecFLockState(wSigOutPhyId); /*封锁状态*/ + chJLockState = GetPhySecJumpLockState(wSigOutPhyId); /*跳跃锁闭状态*/ + /*信号机外方区段,未锁闭,未占用,未封锁*/ + if ((SECTION_OCCUPY_NO == chOccState) && (PHYSICAL_SECTION_LOCK_NO == chLockState) + && (PHYSICAL_SECTION_FLOCK_NO == chFengSuoState) && (PHYSICAL_SECTION_JUMP_LOCK_NO == chJLockState)) + { + wSigInPhyId = GetSignalInFirstPhySecId(wSignalId,0U); /*信号机内方区段*/ + wLockRouteId = GetPhySecRLockBelongRouteId(wSigInPhyId); /*锁闭所属进路*/ + wQXzhaochaRelay = GetRouteCancleZhaoChaRelayId(wLockRouteId); /*进路配置的取消照查继电器*/ + + /*信号机为始端的进路 配置的取消照查继电器落下*/ + if ((0U < wQXzhaochaRelay) && (RELAY_SUM_MAX > wQXzhaochaRelay)) + { + chColleState = GetRelayCollState(wQXzhaochaRelay); + if (RELAY_STATE_DOWN == chColleState) + { + chRet = CI_SUCCESS; + } + else + { + /*不处理*/ + } + } + else + { + /*不处理*/ + } + } + else + { + /*不处理*/ + } + + } + else + { + /*不处理*/ + } + + return chRet; } \ No newline at end of file diff --git a/TSCP/src/APP/ciapp/Signal/SignalDataManage.h b/TSCP/src/APP/ciapp/Signal/SignalDataManage.h index e426e20..7a8f931 100644 --- a/TSCP/src/APP/ciapp/Signal/SignalDataManage.h +++ b/TSCP/src/APP/ciapp/Signal/SignalDataManage.h @@ -1248,6 +1248,14 @@ UINT8 GetSignalCrossTacsTrainIdCC(const UINT16 signalId); * Created By LQ 2025.11.05 */ void SetSignalCrossStateCC(const UINT16 signalId, const UINT8 signalCrossState, const UINT8 wTrainId); +/* +* 功能描述:获取复杂主控继电器驱动状态 +* 参数说明:const UINT16 wCMainlRralyId, 信号机ID +* const UINT16 wSignalId, 信号机ID +* 返 回 值:驱动状态 +* Created LYJ 2026.6.2 +*/ +UINT8 GetCMainRelayDriveState(const UINT16 wCMainlRralyId, const UINT16 wSignalId); #ifdef __cplusplus } diff --git a/TSCP/src/APP/ciapp/Switch/SwitchConfigDataManage.c b/TSCP/src/APP/ciapp/Switch/SwitchConfigDataManage.c index b8e9a87..f8e1f07 100644 --- a/TSCP/src/APP/ciapp/Switch/SwitchConfigDataManage.c +++ b/TSCP/src/APP/ciapp/Switch/SwitchConfigDataManage.c @@ -46,7 +46,7 @@ UINT16 GetSwitchCurSum(void) UINT16 retVal = 0u; if (SwitchCurSum >= (INT16)SWITCH_SUM_MAX) { - retVal = SWITCH_SUM_MAX; + retVal = SWITCH_SUM_MAX; } else if (SwitchCurSum < 0) { @@ -227,31 +227,6 @@ UINT16 GetSwitchDbRelayId(const UINT16 switchId) return retVal; } -/* -* 功能描述: 获取指定ID道岔影子模式定位表示继电器ID -* 参数说明: const UINT16 switchId, 道岔ID -* 返回值 : 0: 获取数据失败 -* >0: 定位表示继电器ID -*/ -UINT16 GetSwitchShadowDbRelayId(const UINT16 switchId) -{ - UINT16 bufIndex = 0u; /*数组下标*/ - UINT16 retVal = CI_ERROR; - - bufIndex = GetSwitchConfigBufIndex(switchId); /*获取道岔数组下标*/ - - if (bufIndex < SWITCH_SUM_MAX) - { - retVal = SwitchConfigDataStru[bufIndex].wShadowDbRelayId; - } - else - { - retVal = CI_ERROR; - } - return retVal; -} - - /* * 功能描述: 获取指定ID道岔反位表示继电器ID * 参数说明: const UINT16 switchId, 道岔ID @@ -276,31 +251,6 @@ UINT16 GetSwitchFbRelayId(const UINT16 switchId) return retVal; } -/* -* 功能描述: 获取指定ID道岔影子模式反位表示继电器ID -* 参数说明: const UINT16 switchId, 道岔ID -* 返回值 : 0: 获取数据失败 -* >0: 反位表示继电器ID -*/ -UINT16 GetSwitchShadowFbRelayId(const UINT16 switchId) -{ - UINT16 bufIndex = 0u; /*数组下标*/ - UINT16 retVal = CI_ERROR; - - bufIndex = GetSwitchConfigBufIndex(switchId); /*获取道岔数组下标*/ - - if (bufIndex < SWITCH_SUM_MAX) - { - retVal = SwitchConfigDataStru[bufIndex].wShadowFbRelayId; - } - else - { - retVal = CI_ERROR; - } - return retVal; -} - - /* * 功能描述: 获取指定ID道岔允操继电器ID * 参数说明: const UINT16 switchId, 道岔ID @@ -1726,3 +1676,208 @@ UINT8 GetSwitchWhetherBelongThisOc(UINT16 switchId, UINT8 ocId) return retVal; } +/* +* 功能描述: 获取道岔属于本OC同块板卡的道岔ID +* 参数说明: +* 输入参数: +* UINT16 switchId 道岔ID +* UINT8 ocId OCID +* 返回值 : + <500 道岔ID + =500 非法值 +* Add by mpt 20260404 +*/ +UINT16 GetSwitchThisOcOtherSwitchId(UINT16 switchId, UINT8 ocId) +{ + UINT16 bufIndex = 0u; /*数组下标*/ + UINT8 i = 0u; + UINT16 retVal = SWITCH_SUM_MAX; + UINT8 chOCIndex = 0U; + + bufIndex = GetSwitchConfigBufIndex(switchId); /*获取道岔数组下标*/ + + if ((SWITCH_SUM_MAX > bufIndex) && (OC_SUM_MAX > ocId) && (0u < ocId)) + { + chOCIndex = GetSwitchThisOCIndex(switchId, ocId); + if (SWITCH_BELONG_OC_MAX > chOCIndex) + { + retVal = SwitchConfigDataStru[bufIndex].belongOCConfigData[chOCIndex].wThisOcOtherSwitchId; + } + else + { + /*无执行*/ + } + } + + return retVal; +} + +/* +* 功能描述:获取指定ID道岔是否具备冗余采集 +* 参数说明:const UINT16 switchId, 道岔ID +* 返回值 :REDUN_COLL_YES: 具备道岔冗余采集 +* REDUN_COLL_NO: 不具备道岔冗余采集 +* CI_ERROR: ID有误 +*/ +UINT8 GetSwitchRedunCollCfg(const UINT16 switchId) +{ + UINT16 bufIndex = 0u; /*数组下标*/ + UINT8 retVal = CI_ERROR; + + bufIndex = GetSwitchConfigBufIndex(switchId); /*获取道岔数组下标*/ + + if (SWITCH_SUM_MAX > bufIndex) + { + retVal = SwitchConfigDataStru[bufIndex].RedunCollCfg; + } + else + { + retVal = CI_ERROR; + } + return retVal; +} + +/* +* 功能描述:获取指定ID道岔的冗余表示DBJ1继电器ID +* 参数说明:const UINT16 switchId, 道岔ID +* 返回值 :0: ID有误 +* 其他:继电器ID +*/ +UINT16 GetSwitchRedunDBJ1RelayId(const UINT16 switchId, const UINT16 ocIndex) +{ + UINT16 bufIndex = 0u; /*数组下标*/ + UINT16 retVal = 0u; + + bufIndex = GetSwitchConfigBufIndex(switchId); /*获取道岔数组下标*/ + + if ((SWITCH_SUM_MAX > bufIndex) && (SWITCH_REDUN_COLL_MAX > ocIndex)) + { + retVal = SwitchConfigDataStru[bufIndex].RedunCollRelayStru[ocIndex].wRedunDb1RelayId; + } + else + { + retVal = 0u; + } + return retVal; +} + +/* +* 功能描述:获取指定ID道岔的冗余表示DBJ2继电器ID +* 参数说明:const UINT16 switchId, 道岔ID +* 返回值 :0: ID有误 +* 其他:继电器ID +*/ +UINT16 GetSwitchRedunDBJ2RelayId(const UINT16 switchId, const UINT16 ocIndex) +{ + UINT16 bufIndex = 0u; /*数组下标*/ + UINT16 retVal = 0u; + + bufIndex = GetSwitchConfigBufIndex(switchId); /*获取道岔数组下标*/ + + if ((SWITCH_SUM_MAX > bufIndex) && (SWITCH_REDUN_COLL_MAX > ocIndex)) + { + retVal = SwitchConfigDataStru[bufIndex].RedunCollRelayStru[ocIndex].wRedunDb2RelayId; + } + else + { + retVal = 0u; + } + return retVal; +} + +/* +* 功能描述:获取指定ID道岔的冗余表示FBJ1继电器ID +* 参数说明:const UINT16 switchId, 道岔ID +* 返回值 :0: ID有误 +* 其他:继电器ID +*/ +UINT16 GetSwitchRedunFBJ1RelayId(const UINT16 switchId, const UINT16 ocIndex) +{ + UINT16 bufIndex = 0u; /*数组下标*/ + UINT16 retVal = 0u; + + bufIndex = GetSwitchConfigBufIndex(switchId); /*获取道岔数组下标*/ + + if ((SWITCH_SUM_MAX > bufIndex) && (SWITCH_REDUN_COLL_MAX > ocIndex)) + { + retVal = SwitchConfigDataStru[bufIndex].RedunCollRelayStru[ocIndex].wRedunFb1RelayId; + } + else + { + retVal = 0u; + } + return retVal; +} + +/* +* 功能描述:获取指定ID道岔的冗余表示FBJ2继电器ID +* 参数说明:const UINT16 switchId, 道岔ID +* 返回值 :0: ID有误 +* 其他:继电器ID +*/ +UINT16 GetSwitchRedunFBJ2RelayId(const UINT16 switchId, const UINT16 ocIndex) +{ + UINT16 bufIndex = 0u; /*数组下标*/ + UINT16 retVal = 0u; + + bufIndex = GetSwitchConfigBufIndex(switchId); /*获取道岔数组下标*/ + + if ((SWITCH_SUM_MAX > bufIndex) && (SWITCH_REDUN_COLL_MAX > ocIndex)) + { + retVal = SwitchConfigDataStru[bufIndex].RedunCollRelayStru[ocIndex].wRedunFb2RelayId; + } + else + { + retVal = 0u; + } + return retVal; +} + +/* +* 功能描述: 设置倒切板卡 +* 参数说明: const UINT16 switchId, 道岔ID,UINT16 wBoardId倒切板卡Id +* 返回值 : CI_SUCCESS CI_ERROR +*/ +UINT8 SetSwitchRelateReverseBoardId(const UINT16 switchId, UINT16 wBoardId) +{ + UINT16 bufIndex = 0u; /*数组下标*/ + UINT8 chRet = CI_ERROR; + bufIndex = GetSwitchConfigBufIndex(switchId); /*获取道岔数组下标*/ + + if (bufIndex < SWITCH_SUM_MAX) + { + SwitchConfigDataStru[bufIndex].wReverseBoardId = wBoardId; + chRet = CI_SUCCESS; + } + else + { + ; + } + return chRet; +} + +/* +* 功能描述: 获取倒切板卡id +* 参数说明: const UINT16 switchId, 道岔ID +* 返回值 : UINT16_MAX: 获取数据失败 +* 0: 无倒切 +* [1,65534]倒切板卡Id +*/ +UINT16 GetSwitchRelateReverseBoardId(const UINT16 switchId) +{ + UINT16 bufIndex = 0u; /*数组下标*/ + UINT16 retVal = UINT16_MAX; + + bufIndex = GetSwitchConfigBufIndex(switchId); /*获取道岔数组下标*/ + + if (bufIndex < SWITCH_SUM_MAX) + { + retVal = SwitchConfigDataStru[bufIndex].wReverseBoardId; + } + else + { + retVal = UINT16_MAX; + } + return retVal; +} + diff --git a/TSCP/src/APP/ciapp/Switch/SwitchConfigDataManage.h b/TSCP/src/APP/ciapp/Switch/SwitchConfigDataManage.h index 29829c8..2bb12c3 100644 --- a/TSCP/src/APP/ciapp/Switch/SwitchConfigDataManage.h +++ b/TSCP/src/APP/ciapp/Switch/SwitchConfigDataManage.h @@ -33,12 +33,22 @@ typedef struct S_ZzjPowerConfigDataStruct UINT16 ZzjFanweiPower2; /*转辙机J1反表灯_供电2*/ }ZzjPowerConfigDataStruct; +typedef struct S_SwitchRedunCollCfgDataStru +{ + UINT16 wRedunDb1RelayId; /*(北京10道岔冗余采集)道岔定表继电器1ID*/ + UINT16 wRedunDb2RelayId; /*(北京10道岔冗余采集)道岔定表继电器2ID*/ + UINT16 wRedunFb1RelayId; /*(北京10道岔冗余采集)道岔反表继电器1ID*/ + UINT16 wRedunFb2RelayId; /*(北京10道岔冗余采集)道岔反表继电器2ID*/ +} +SwitchRedunCollCfgDataStru; + typedef struct S_SwitchBelongOCConfigDataStr/*道岔所属OC配置数据*/ { UINT8 OcId; /*当前OC*/ UINT8 chSwitchBoardNum; /*道岔板卡数*/ UINT8 ModuleAddr[MAX_OC_SWITCH_INCLUDE_BOARD_NUM]; /*地址ID*/ UINT8 szPlusBoxId; /*转辙机板所在插箱ID*/ + UINT16 wThisOcOtherSwitchId; /*同OC属于同板卡的另一道岔ID*/ }SwitchBelongOCConfigDataStr; typedef struct S_SwitchConfigDataStruct @@ -58,8 +68,6 @@ typedef struct S_SwitchConfigDataStruct UINT16 FbRelayId; /*道岔反表继电器ID (配置字段) 即单开反表表示继电器ID*/ UINT16 YcRelayId; /*道岔允操继电器ID (配置字段) 即单开定位操作继电器ID*/ UINT16 DcRelayId; /*道岔定操继电器ID (配置字段) 即单开反位操作继电器ID*/ - UINT16 wShadowDbRelayId; /*影子模式道岔定表继电器ID (配置字段) 迪斯尼*/ - UINT16 wShadowFbRelayId; /*影子模式道岔反表继电器ID (配置字段) 迪斯尼*/ /*以下为单轨道岔相关继电器*/ UINT16 GZJId; /*故障继电器ID (配置字段)*/ UINT16 JTYJaId; /*现场状态继电器ID (配置字段)*/ @@ -110,7 +118,9 @@ typedef struct S_SwitchConfigDataStruct UINT8 chSwitchBelongOcNum;/*道岔所属OC数*/ SwitchBelongOCConfigDataStr belongOCConfigData[SWITCH_BELONG_OC_MAX];/*道岔所属各OC的配置情况*/ - + UINT8 RedunCollCfg; /*道岔是否具备冗余采集*/ + SwitchRedunCollCfgDataStru RedunCollRelayStru[SWITCH_REDUN_COLL_MAX]; + UINT16 wReverseBoardId; /*所属倒切板卡ID*/ } SwitchConfigDataStruct; @@ -120,6 +130,7 @@ typedef struct S_OC_SwitchConfigDataStruct UINT16 BelongOcId; /*所属OCID(配置字段)*/ UINT8 ModuleAddrA[MAX_OC_SWITCH_INCLUDE_BOARD_NUM]; /*A系地址*/ UINT8 ModuleAddrB[MAX_OC_SWITCH_INCLUDE_BOARD_NUM]; /*B系地址*/ + UINT16 otherSwitchId; /*同OC属于同板卡的另一道岔ID(运算字段)*/ }OCSwitchConfigDataStruct; /*旧版OC道岔配置数据表*/ @@ -541,22 +552,6 @@ UINT16 GetSwitchProtectSwitchNum(const UINT16 wSwitchId); */ UINT16* GetSwitchProtectSwitchIdBuf(const UINT16 wSwitchId); -/* -* 功能描述: 获取指定ID道岔影子模式反位表示继电器ID -* 参数说明: const UINT16 switchId, 道岔ID -* 返回值 : 0: 获取数据失败 -* >0: 反位表示继电器ID -*/ -UINT16 GetSwitchShadowFbRelayId(const UINT16 switchId); - -/* -* 功能描述: 获取指定ID道岔影子模式定位表示继电器ID -* 参数说明: const UINT16 switchId, 道岔ID -* 返回值 : 0: 获取数据失败 -* >0: 定位表示继电器ID -*/ -UINT16 GetSwitchShadowDbRelayId(const UINT16 switchId); - /** * @brief 获取道岔公里标 * @param const UINT16 switchId 道岔ID @@ -670,6 +665,75 @@ UINT8 GetSwitchThisOcOtherOCId(const UINT16 switchId, const UINT8 ocId); * Add by mpt 20260330 */ UINT8 GetSwitchWhetherBelongThisOc(UINT16 switchId, UINT8 ocId); +/* +* 功能描述: 获取道岔属于本OC同块板卡的道岔ID +* 参数说明: +* 输入参数: +* UINT16 switchId 道岔ID +* UINT8 ocId OCID +* 返回值 : + <500 道岔ID + =500 非法值 +* Add by mpt 20260404 +*/ +UINT16 GetSwitchThisOcOtherSwitchId(UINT16 switchId, UINT8 ocId); + +/* +* 功能描述:获取指定ID道岔是否具备冗余采集 +* 参数说明:const UINT16 switchId, 道岔ID +* 返回值 :REDUN_COLL_YES: 具备道岔冗余采集 +* REDUN_COLL_NO: 不具备道岔冗余采集 +* CI_ERROR: ID有误 +*/ +UINT8 GetSwitchRedunCollCfg(const UINT16 switchId); + +/* +* 功能描述:获取指定ID道岔的冗余表示DBJ1继电器ID +* 参数说明:const UINT16 switchId, 道岔ID +* 返回值 :0: ID有误 +* 其他:继电器ID +*/ +UINT16 GetSwitchRedunDBJ1RelayId(const UINT16 switchId, const UINT16 ocIndex); + +/* +* 功能描述:获取指定ID道岔的冗余表示DBJ2继电器ID +* 参数说明:const UINT16 switchId, 道岔ID +* 返回值 :0: ID有误 +* 其他:继电器ID +*/ +UINT16 GetSwitchRedunDBJ2RelayId(const UINT16 switchId, const UINT16 ocIndex); + +/* +* 功能描述:获取指定ID道岔的冗余表示FBJ1继电器ID +* 参数说明:const UINT16 switchId, 道岔ID +* 返回值 :0: ID有误 +* 其他:继电器ID +*/ +UINT16 GetSwitchRedunFBJ1RelayId(const UINT16 switchId, const UINT16 ocIndex); + +/* +* 功能描述:获取指定ID道岔的冗余表示FBJ2继电器ID +* 参数说明:const UINT16 switchId, 道岔ID +* 返回值 :0: ID有误 +* 其他:继电器ID +*/ +UINT16 GetSwitchRedunFBJ2RelayId(const UINT16 switchId, const UINT16 ocIndex); + +/* +* 功能描述: 设置倒切板卡 +* 参数说明: const UINT16 switchId, 道岔ID,UINT16 wBoardId倒切板卡Id +* 返回值 : CI_SUCCESS CI_ERROR +*/ +UINT8 SetSwitchRelateReverseBoardId(const UINT16 switchId, UINT16 wBoardId); +/* +* 功能描述: 获取倒切板卡id +* 参数说明: const UINT16 switchId, 道岔ID +* 返回值 : UINT16_MAX: 获取数据失败 +* 0: 无倒切 +* [1,65534]倒切板卡Id +*/ +UINT16 GetSwitchRelateReverseBoardId(const UINT16 switchId); + #ifdef __cplusplus } #endif diff --git a/TSCP/src/APP/ciapp/Switch/SwitchDataManage.c b/TSCP/src/APP/ciapp/Switch/SwitchDataManage.c index fd57f0c..4e412ad 100644 --- a/TSCP/src/APP/ciapp/Switch/SwitchDataManage.c +++ b/TSCP/src/APP/ciapp/Switch/SwitchDataManage.c @@ -1159,14 +1159,11 @@ void SetSwitchDrivePostion(const UINT16 switchId, const UINT8 drivePosition) UINT8 singleSwitchCurPosition = 0U; UINT16 switchOtherId = 0U; /*双动道岔另一道岔ID*/ UINT8 ciPattern = GetLocalCiPattern(); - UINT32 dwCurCycleNum = 0u; bufIndex = GetSwitchConfigBufIndex(switchId); /*获取道岔数组下标*/ switchOtherId = GetDSwitchOtherId(switchId); bufIndex2 = GetSwitchConfigBufIndex(switchOtherId); /*获取双动道岔数组下标*/ - dwCurCycleNum = Get2oo2CurCycleNum(); - if (bufIndex < SWITCH_SUM_MAX) { @@ -1190,9 +1187,7 @@ void SetSwitchDrivePostion(const UINT16 switchId, const UINT8 drivePosition) /*设置驱动位置*/ SwitchDataStru[bufIndex].SwitchDrivePos = drivePosition; /*道岔驱动开始时间*/ - SetSwitchDriveStartCycNum(switchId, dwCurCycleNum); - /*设置道岔驱动起始周期,直到有位置时才清0*/ - SetSwitchOutputDrvCmdCycNum(switchId, dwCurCycleNum); + SetSwitchDriveStartCycNum(switchId, Get2oo2CurCycleNum()); } } else @@ -1228,10 +1223,7 @@ void SetSwitchDrivePostion(const UINT16 switchId, const UINT8 drivePosition) /*设置驱动位置*/ SwitchDataStru[bufIndex2].SwitchDrivePos = drivePosition; /*道岔驱动开始时间*/ - SetSwitchDriveStartCycNum(switchOtherId, dwCurCycleNum); - - /*设置道岔驱动起始周期,直到有位置时才清0*/ - SetSwitchOutputDrvCmdCycNum(switchOtherId, dwCurCycleNum); + SetSwitchDriveStartCycNum(switchOtherId, Get2oo2CurCycleNum()); } } else @@ -2884,7 +2876,7 @@ void SetHlhtCiSwitchPlockStatus(const UINT16 switchId, const UINT8 lockStatus) if (SWITCH_SUM_MAX > bufIndex) { - if ((SWITCH_LOCK_STATUS_PROTECT == lockStatus) || (SWITCH_LOCK_STATUS_NO == lockStatus)) + if ((SWITCH_LOCK_STATUS_PROTECT == lockStatus) || (SWITCH_LOCK_STATUS_NO == lockStatus) || (SWITCH_LOCK_STATUS_DAP == lockStatus)) { SwitchDataStru[bufIndex].LockStatus = lockStatus; } @@ -3278,7 +3270,7 @@ void SetSwitchOcPlusBoxSateState(const UINT16 switchId, const UINT8 ocId, const bufIndex = GetSwitchConfigBufIndex(switchId); /*获取道岔数组下标*/ chOCIndex = GetSwitchThisOCIndex(switchId, ocId); - if ((SWITCH_SUM_MAX > bufIndex) && (chOCIndex < SWITCH_BELONG_OC_MAX)) + if ((SWITCH_SUM_MAX > bufIndex) && (SWITCH_BELONG_OC_MAX >chOCIndex)) { SwitchDataStru[bufIndex].belongOCData[chOCIndex].PlusBoxSate = state; } @@ -3306,7 +3298,7 @@ UINT8 GetSwitchOcPlusBoxSateState(const UINT16 switchId, const UINT8 ocId) bufIndex = GetSwitchConfigBufIndex(switchId); /*获取道岔数组下标*/ chOCIndex = GetSwitchThisOCIndex(switchId, ocId); - if ((SWITCH_SUM_MAX > bufIndex) && (chOCIndex < SWITCH_BELONG_OC_MAX)) + if ((SWITCH_SUM_MAX > bufIndex) && (SWITCH_BELONG_OC_MAX > chOCIndex)) { ret = SwitchDataStru[bufIndex].belongOCData[chOCIndex].PlusBoxSate; } @@ -3371,7 +3363,7 @@ UINT8 GetSwitchThisOCBoardState(const UINT16 switchId, const UINT8 ocId) UINT8 num = 0u; UINT8 i = 0u; UINT8 chSwitchThisOCBoardNum = 0u; - UINT8 chOCIndex = 0U; + UINT8 chOCIndex = 0u; UINT8 addrAState = 0u; UINT8 addrBState = 0u; UINT8 retVal = SWITCH_BOARD_FAULT; @@ -3384,20 +3376,23 @@ UINT8 GetSwitchThisOCBoardState(const UINT16 switchId, const UINT8 ocId) chSwitchThisOCBoardNum = GetSwitchThisOCBoardNum(switchId, ocId); if (SWITCH_BELONG_OC_MAX > chOCIndex) { - for (i = 0; i < (chSwitchThisOCBoardNum/2u); i+=2u) + if (0u < chSwitchThisOCBoardNum) { - addrAState = SwitchDataStru[bufIndex].belongOCData[chOCIndex].BoardStateBuf[i]; - addrBState = SwitchDataStru[bufIndex].belongOCData[chOCIndex].BoardStateBuf[i+1]; - if ((SWITCH_BOARD_FAULT == addrAState) && (SWITCH_BOARD_FAULT == addrBState)) + retVal = SWITCH_BOARD_NORMAL;/*先置为正常*/ + for (i = 0u; i < (chSwitchThisOCBoardNum - 1u); i += 2u) { - retVal = SWITCH_BOARD_FAULT; - break; + addrAState = SwitchDataStru[bufIndex].belongOCData[chOCIndex].BoardStateBuf[i]; + addrBState = SwitchDataStru[bufIndex].belongOCData[chOCIndex].BoardStateBuf[i + 1u]; + if ((SWITCH_BOARD_FAULT == addrAState) && (SWITCH_BOARD_FAULT == addrBState)) + { + retVal = SWITCH_BOARD_FAULT; + break; + } } } - - if ((0U < chSwitchThisOCBoardNum) && (i == chSwitchThisOCBoardNum)) - { - retVal = SWITCH_BOARD_NORMAL; + else + {/*异常分支,置为故障*/ + retVal = SWITCH_BOARD_FAULT; } } @@ -3529,7 +3524,7 @@ void SetSwitchOutputDrvCmdCycNum(const UINT16 switchId, const UINT32 cycNum) { UINT16 bufIndex = 0u; /*数组下标*/ bufIndex = GetSwitchConfigBufIndex(switchId); /*获取道岔数组下标*/ - if (bufIndex < SWITCH_SUM_MAX) + if (SWITCH_SUM_MAX >bufIndex) { SwitchDataStru[bufIndex].SwitchOutputDrvCmdCycNum = cycNum; } @@ -3546,7 +3541,7 @@ UINT32 GetSwitchOutputDrvCmdCycNum(const UINT16 switchId) UINT32 retVal = CI_ERROR; bufIndex = GetSwitchConfigBufIndex(switchId); /*获取道岔数组下标*/ - if (bufIndex < SWITCH_SUM_MAX) + if (SWITCH_SUM_MAX > bufIndex) { retVal = SwitchDataStru[bufIndex].SwitchOutputDrvCmdCycNum; } @@ -3655,3 +3650,302 @@ void SetSwitchThisOcFindCmdCycNum(const UINT16 switchId, const UINT8 ocId, const } } +/* +* 功能描述: 设置判断混线起始周期号 +* 参数说明: const UINT16 switchId, 道岔ID +* const UINT8 ocIndex OC下标 +* UINT32 cycNum 周期号 +* 返回值 :void +* add by wyd 20260604 +*/ +void SetSwitchRedunJudgHunXianStCyc(const UINT16 switchId, const UINT8 chOCIndex, const UINT32 cycNum) +{ + UINT16 bufIndex = 0u; /*数组下标*/ + bufIndex = GetSwitchConfigBufIndex(switchId); /*获取道岔数组下标*/ + + if ((SWITCH_SUM_MAX > bufIndex) && (SWITCH_REDUN_COLL_MAX > chOCIndex)) + { + SwitchDataStru[bufIndex].RedunCollData[chOCIndex].dwRedunJudgHunXianStCyc = cycNum; + } + else + { + /*nothing*/ + } +} + +/* +* 功能描述:获取判断混线起始周期号 +* 参数说明:const UINT16 switchId, 道岔ID +* const UINT8 ocIndex OC下标 +* 返回值 :周期号 +* add by wyd 20260604 +*/ +UINT32 GetSwitchRedunJudgHunXianStCyc(const UINT16 switchId, const UINT8 chOCIndex) +{ + UINT16 bufIndex = 0u; /*数组下标*/ + UINT32 cycNum = 0u; + + bufIndex = GetSwitchConfigBufIndex(switchId); /*获取道岔数组下标*/ + + if ((SWITCH_SUM_MAX > bufIndex) && (SWITCH_REDUN_COLL_MAX > chOCIndex)) + { + cycNum = SwitchDataStru[bufIndex].RedunCollData[chOCIndex].dwRedunJudgHunXianStCyc; + } + else + { + /*nothing*/ + } + + return cycNum; +} + +/* +* 功能描述: 设置实际混线起始周期号 +* 参数说明: const UINT16 switchId, 道岔ID +* const UINT8 ocIndex OC下标 +* UINT32 cycNum 周期号 +* 返回值 :void +* add by wyd 20260604 +*/ +void SetSwitchRedunRealHunXianStCyc(const UINT16 switchId, const UINT8 chOCIndex, const UINT32 cycNum) +{ + UINT16 bufIndex = 0u; /*数组下标*/ + bufIndex = GetSwitchConfigBufIndex(switchId); /*获取道岔数组下标*/ + + if ((SWITCH_SUM_MAX > bufIndex) && (SWITCH_REDUN_COLL_MAX > chOCIndex)) + { + SwitchDataStru[bufIndex].RedunCollData[chOCIndex].dwRedunRealHunXianStCyc = cycNum; + } + else + { + /*nothing*/ + } +} + +/* +* 功能描述:获取实际混线起始周期号 +* 参数说明:const UINT16 switchId, 道岔ID +* const UINT8 ocIndex OC下标 +* 返回值 :周期号 +* add by wyd 20260604 +*/ +UINT32 GetSwitchRedunRealHunXianStCyc(const UINT16 switchId, const UINT8 chOCIndex) +{ + UINT16 bufIndex = 0u; /*数组下标*/ + UINT32 cycNum = 0u; + + bufIndex = GetSwitchConfigBufIndex(switchId); /*获取道岔数组下标*/ + + if ((SWITCH_SUM_MAX > bufIndex) && (SWITCH_REDUN_COLL_MAX > chOCIndex)) + { + cycNum = SwitchDataStru[bufIndex].RedunCollData[chOCIndex].dwRedunRealHunXianStCyc; + } + else + { + /*nothing*/ + } + + return cycNum; +} + +/* +* 功能描述: 设置混线恢复状态 +* 参数说明: const UINT16 switchId, 道岔ID +* const UINT8 ocIndex OC下标 +* const UINT8 cHunXianStt 混线恢复状态 +* REDUN_HX_RECOV_1100、REDUN_HX_RECOV_1010、REDUN_HX_RECOV_0011:设置 +* 0:清除 +* 返回值 :void +* add by wyd 20260604 +*/ +void SetSwitchRedunHunXianRecovStt(const UINT16 switchId, const UINT8 chOCIndex, const UINT8 cHunXianStt) +{ + UINT16 bufIndex = 0u; /*数组下标*/ + bufIndex = GetSwitchConfigBufIndex(switchId); /*获取道岔数组下标*/ + + if ((SWITCH_SUM_MAX > bufIndex) && (SWITCH_REDUN_COLL_MAX > chOCIndex)) + { + if ((REDUN_HX_RECOV_1100 == cHunXianStt) || (REDUN_HX_RECOV_1010 == cHunXianStt) + || (REDUN_HX_RECOV_0011 == cHunXianStt) || (REDUN_HX_RECOV_ALL == cHunXianStt)) + { + /*记录混线恢复采集*/ + SwitchDataStru[bufIndex].RedunCollData[chOCIndex].cHunXianRecovStt |= cHunXianStt; + } + else + { + /*清空混线恢复采集*/ + SwitchDataStru[bufIndex].RedunCollData[chOCIndex].cHunXianRecovStt = 0u; + } + } + else + { + /*nothing*/ + } +} + +/* +* 功能描述:获取混线恢复状态 +* 参数说明:const UINT16 switchId, 道岔ID +* const UINT8 ocIndex OC下标 +* 返回值 :混线恢复状态 +* add by wyd 20260604 +*/ +UINT8 GetSwitchRedunHunXianRecovStt(const UINT16 switchId, const UINT8 chOCIndex) +{ + UINT16 bufIndex = 0u; /*数组下标*/ + UINT8 RtnValue = 0u; + + bufIndex = GetSwitchConfigBufIndex(switchId); /*获取道岔数组下标*/ + + if ((SWITCH_SUM_MAX > bufIndex) && (SWITCH_REDUN_COLL_MAX > chOCIndex)) + { + RtnValue = SwitchDataStru[bufIndex].RedunCollData[chOCIndex].cHunXianRecovStt; + } + else + { + /*nothing*/ + } + + return RtnValue; +} + +/* +* 功能描述: 设置采集故障起始周期号 +* 参数说明: const UINT16 switchId, 道岔ID +* const UINT8 ocIndex OC下标 +* UINT32 cycNum 周期号 +* 返回值 :void +* add by wyd 20260604 +*/ +void SetSwitchRedunFaultStCyc(const UINT16 switchId, const UINT8 chOCIndex, const UINT32 cycNum) +{ + UINT16 bufIndex = 0u; /*数组下标*/ + bufIndex = GetSwitchConfigBufIndex(switchId); /*获取道岔数组下标*/ + + if ((SWITCH_SUM_MAX > bufIndex) && (SWITCH_REDUN_COLL_MAX > chOCIndex)) + { + SwitchDataStru[bufIndex].RedunCollData[chOCIndex].dwRedunFaultStCyc = cycNum; + } + else + { + /*nothing*/ + } +} + +/* +* 功能描述:获取采集故障起始周期号 +* 参数说明:const UINT16 switchId, 道岔ID +* const UINT8 ocIndex OC下标 +* 返回值 :周期号 +* add by wyd 20260604 +*/ +UINT32 GetSwitchRedunFaultStCyc(const UINT16 switchId, const UINT8 chOCIndex) +{ + UINT16 bufIndex = 0u; /*数组下标*/ + UINT32 cycNum = 0u; + + bufIndex = GetSwitchConfigBufIndex(switchId); /*获取道岔数组下标*/ + + if ((SWITCH_SUM_MAX > bufIndex) && (SWITCH_REDUN_COLL_MAX > chOCIndex)) + { + cycNum = SwitchDataStru[bufIndex].RedunCollData[chOCIndex].dwRedunFaultStCyc; + } + else + { + /*nothing*/ + } + + return cycNum; +} + +/* +* 功能描述: 设置冗余采集组合状态 +* 参数说明: const UINT16 switchId, 道岔ID +* const UINT8 ocIndex OC下标 +* UINT32 cycNum 周期号 +* 返回值 :void +* add by wyd 20260604 +*/ +void SetSwitchRedunCombineStt(const UINT16 switchId, const UINT8 chOCIndex, const UINT8 setValue) +{ + UINT16 bufIndex = 0u; /*数组下标*/ + bufIndex = GetSwitchConfigBufIndex(switchId); /*获取道岔数组下标*/ + + if ((SWITCH_SUM_MAX > bufIndex) && (SWITCH_REDUN_COLL_MAX > chOCIndex)) + { + SwitchDataStru[bufIndex].RedunCollData[chOCIndex].cCombineStt = setValue; + } + else + { + /*nothing*/ + } +} + +/* +* 功能描述: 设置主控转辙机板采集道岔位置 +* 参数说明: const UINT16 switchId, 道岔ID +* const UINT8 ocIndex OC下标 +* UINT32 cycNum 周期号 +* 返回值 :void +* add by wyd 20260604 +*/ +void SetSwitchMainCollPos(const UINT16 switchId, const UINT8 setValue) +{ + UINT16 bufIndex = 0u; /*数组下标*/ + bufIndex = GetSwitchConfigBufIndex(switchId); /*获取道岔数组下标*/ + + if (SWITCH_SUM_MAX > bufIndex) + { + SwitchDataStru[bufIndex].cMainOcCollPos = setValue; + } + else + { + /*nothing*/ + } +} + +/* +* 功能描述: 设置冗余采集采集道岔位置 +* 参数说明: const UINT16 switchId, 道岔ID +* const UINT8 ocIndex OC下标 +* UINT32 cycNum 周期号 +* 返回值 :void +* add by wyd 20260604 +*/ +void SetSwitchRedunCollPos(const UINT16 switchId, const UINT8 chOCIndex, const UINT8 setValue) +{ + UINT16 bufIndex = 0u; /*数组下标*/ + bufIndex = GetSwitchConfigBufIndex(switchId); /*获取道岔数组下标*/ + + if ((SWITCH_SUM_MAX > bufIndex) && (SWITCH_REDUN_COLL_MAX > chOCIndex)) + { + SwitchDataStru[bufIndex].RedunCollData[chOCIndex].cCollPos = setValue; + } + else + { + /*nothing*/ + } +} + +/* +* 功能描述: 设置冗余采集当周期混线状态 +* 参数说明: const UINT16 switchId, 道岔ID +* const UINT8 ocIndex OC下标 +* UINT32 cycNum 周期号 +* 返回值 :void +* add by wyd 20260604 +*/ +void SetSwitchRedunCurrHunXianStt(const UINT16 switchId, const UINT8 chOCIndex, const UINT8 setValue) +{ + UINT16 bufIndex = 0u; /*数组下标*/ + bufIndex = GetSwitchConfigBufIndex(switchId); /*获取道岔数组下标*/ + + if ((SWITCH_SUM_MAX > bufIndex) && (SWITCH_REDUN_COLL_MAX > chOCIndex)) + { + SwitchDataStru[bufIndex].RedunCollData[chOCIndex].cCurrHunxianStt = setValue; + } + else + { + /*nothing*/ + } +} \ No newline at end of file diff --git a/TSCP/src/APP/ciapp/Switch/SwitchDataManage.h b/TSCP/src/APP/ciapp/Switch/SwitchDataManage.h index 68b0d2e..ce86761 100644 --- a/TSCP/src/APP/ciapp/Switch/SwitchDataManage.h +++ b/TSCP/src/APP/ciapp/Switch/SwitchDataManage.h @@ -27,6 +27,21 @@ #ifdef __cplusplus extern "C" { #endif + +typedef struct S_SwitchRedunCollStruct +{ + UINT32 dwRedunJudgHunXianStCyc; /*(北京10道岔冗余采集)判断混线起始周期号,道岔移动中混线容忍用。 + 设置时机为采集到混线,清零时机为容忍时间内未采集到混线,或采集到定、反、移动中*/ + UINT32 dwRedunRealHunXianStCyc; /*(北京10道岔冗余采集)实际混线起始周期号,混线恢复用。 + 设置时机为采集到混线,清零时机为未采集到混线*/ + UINT8 cHunXianRecovStt; /*(北京10道岔冗余采集)混线恢复状态。 + bit0=1:采集到1100,bit1=1:采集到1010,bi2=1:采集到0011 + bit0、1、2均为1表示未混线*/ + UINT32 dwRedunFaultStCyc; /*(北京10道岔冗余采集)采集故障(四开)起始周期号*/ + UINT8 cCombineStt; /*(打印用)继电器采集组合*/ + UINT8 cCollPos; /*(打印用)冗余采集位置*/ + UINT8 cCurrHunxianStt; /*(打印用)当周期混线状态*/ +}SwitchRedunCollStruct; /*道岔数据结构体*/ typedef struct S_SwitchOcDataStruct @@ -103,8 +118,8 @@ typedef struct S_SwitchDataStruct UINT8 PLockedAxisSecNum;/*被防护锁闭的计轴区段id数量,只能在本文件使用*/ UINT16 PLockedAxisSecIdArr[SWITCH_MAX_PROTECT_LOCKED_NUM];/*被防护锁闭的计轴区段id数组,只能在本文件使用*/ - - + SwitchRedunCollStruct RedunCollData[SWITCH_REDUN_COLL_MAX]; + UINT8 cMainOcCollPos; /*(打印用)主控转辙机板道岔位置*/ } SwitchDataStruct; /*道岔数据结构体*/ @@ -927,6 +942,125 @@ UINT32 GetSwitchThisOcFindCmdCycNum(const UINT16 switchId, const UINT8 ocId); * add mpt by 20260402 */ void SetSwitchThisOcFindCmdCycNum(const UINT16 switchId, const UINT8 ocId, const UINT32 cycNum); + +/* +* 功能描述: 设置判断混线起始周期号 +* 参数说明: const UINT16 switchId, 道岔ID +* const UINT8 ocIndex OC下标 +* UINT32 cycNum 周期号 +* 返回值 :void +* add by wyd 20260604 +*/ +void SetSwitchRedunJudgHunXianStCyc(const UINT16 switchId, const UINT8 chOCIndex, const UINT32 cycNum); + +/* +* 功能描述:获取判断混线起始周期号 +* 参数说明:const UINT16 switchId, 道岔ID +* const UINT8 ocIndex OC下标 +* 返回值 :周期号 +* add by wyd 20260604 +*/ +UINT32 GetSwitchRedunJudgHunXianStCyc(const UINT16 switchId, const UINT8 chOCIndex); + +/* +* 功能描述: 设置实际混线起始周期号 +* 参数说明: const UINT16 switchId, 道岔ID +* const UINT8 ocIndex OC下标 +* UINT32 cycNum 周期号 +* 返回值 :void +* add by wyd 20260604 +*/ +void SetSwitchRedunRealHunXianStCyc(const UINT16 switchId, const UINT8 chOCIndex, const UINT32 cycNum); + +/* +* 功能描述:获取实际混线起始周期号 +* 参数说明:const UINT16 switchId, 道岔ID +* const UINT8 ocIndex OC下标 +* 返回值 :周期号 +* add by wyd 20260604 +*/ +UINT32 GetSwitchRedunRealHunXianStCyc(const UINT16 switchId, const UINT8 chOCIndex); + +/* +* 功能描述: 设置混线恢复状态 +* 参数说明: const UINT16 switchId, 道岔ID +* const UINT8 ocIndex OC下标 +* const UINT8 cHunXianStt 混线恢复状态 +* REDUN_HX_RECOV_1100、REDUN_HX_RECOV_1010、REDUN_HX_RECOV_0011:设置 +* 0:清除 +* 返回值 :void +* add by wyd 20260604 +*/ +void SetSwitchRedunHunXianRecovStt(const UINT16 switchId, const UINT8 chOCIndex, const UINT8 cHunXianStt); + +/* +* 功能描述:获取混线恢复状态 +* 参数说明:const UINT16 switchId, 道岔ID +* const UINT8 ocIndex OC下标 +* 返回值 :混线恢复状态 +* add by wyd 20260604 +*/ +UINT8 GetSwitchRedunHunXianRecovStt(const UINT16 switchId, const UINT8 chOCIndex); + +/* +* 功能描述: 设置采集故障起始周期号 +* 参数说明: const UINT16 switchId, 道岔ID +* const UINT8 ocIndex OC下标 +* UINT32 cycNum 周期号 +* 返回值 :void +* add by wyd 20260604 +*/ +void SetSwitchRedunFaultStCyc(const UINT16 switchId, const UINT8 chOCIndex, const UINT32 cycNum); + +/* +* 功能描述:获取采集故障起始周期号 +* 参数说明:const UINT16 switchId, 道岔ID +* const UINT8 ocIndex OC下标 +* 返回值 :周期号 +* add by wyd 20260604 +*/ +UINT32 GetSwitchRedunFaultStCyc(const UINT16 switchId, const UINT8 chOCIndex); + +/* +* 功能描述: 设置冗余采集组合状态 +* 参数说明: const UINT16 switchId, 道岔ID +* const UINT8 ocIndex OC下标 +* UINT32 cycNum 周期号 +* 返回值 :void +* add by wyd 20260604 +*/ +void SetSwitchRedunCombineStt(const UINT16 switchId, const UINT8 chOCIndex, const UINT8 setValue); + +/* +* 功能描述: 设置主控转辙机板采集道岔位置 +* 参数说明: const UINT16 switchId, 道岔ID +* const UINT8 ocIndex OC下标 +* UINT32 cycNum 周期号 +* 返回值 :void +* add by wyd 20260604 +*/ +void SetSwitchMainCollPos(const UINT16 switchId, const UINT8 setValue); + +/* +* 功能描述: 设置冗余采集采集道岔位置 +* 参数说明: const UINT16 switchId, 道岔ID +* const UINT8 ocIndex OC下标 +* UINT32 cycNum 周期号 +* 返回值 :void +* add by wyd 20260604 +*/ +void SetSwitchRedunCollPos(const UINT16 switchId, const UINT8 chOCIndex, const UINT8 setValue); + +/* +* 功能描述: 设置冗余采集当周期混线状态 +* 参数说明: const UINT16 switchId, 道岔ID +* const UINT8 ocIndex OC下标 +* UINT32 cycNum 周期号 +* 返回值 :void +* add by wyd 20260604 +*/ +void SetSwitchRedunCurrHunXianStt(const UINT16 switchId, const UINT8 chOCIndex, const UINT8 setValue); + #ifdef __cplusplus } #endif diff --git a/TSCP/src/APP/ciapp/Switch/SwitchDefine.h b/TSCP/src/APP/ciapp/Switch/SwitchDefine.h index d143ac3..b604ec0 100644 --- a/TSCP/src/APP/ciapp/Switch/SwitchDefine.h +++ b/TSCP/src/APP/ciapp/Switch/SwitchDefine.h @@ -155,6 +155,7 @@ #define SWITCH_BELONG_OC_MAX 2U /*道岔所属OC最多数*/ +#define SWITCH_REDUN_COLL_MAX 2U /*道岔冗余采集最多数*/ #define MAIN_CONTROL 0x55U /*主控*/ #define STANDBY_CONTROL 0xAAU /*备控*/ @@ -168,9 +169,21 @@ #define SWITCH_BOARD_FAULT ((UINT8)0xff) /*转辙机板故障*/ #define SWITCH_BOARD_NORMAL ((UINT8)0x55) /*转辙机板正常*/ -#define FIND_DINGWEI_CMD ((UINT8)0x1) /*寻定*/ -#define FIND_FANWEI_CMD ((UINT8)0x2) /*寻反*/ -#define INIT_FIND_CMD ((UINT8)0x3) /*初始寻*/ -#define NO_FIND_CMD ((UINT8)0x0) /*无寻位置指令*/ +#define FIND_DINGWEI_CMD ((UINT8)0x1) /*寻定*/ +#define FIND_FANWEI_CMD ((UINT8)0x2) /*寻反*/ +#define INIT_FIND_CMD ((UINT8)0x3) /*初始寻*/ +#define NO_FIND_CMD ((UINT8)0x0) /*无寻位置指令*/ + +#define REDUN_COLL_YES ((UINT8)0xAAu) /*具备道岔冗余采集*/ +#define REDUN_COLL_NO ((UINT8)0x55u) /*不具备道岔冗余采集*/ + +#define REDUN_HX_RECOV_1100 ((UINT8)0x01u) /*混线恢复采集到过1100*/ +#define REDUN_HX_RECOV_1010 ((UINT8)0x02u) /*混线恢复采集到过1010*/ +#define REDUN_HX_RECOV_0011 ((UINT8)0x04u) /*混线恢复采集到过0011*/ +#define REDUN_HX_RECOV_ALL ((UINT8)0x07u) /*全部混线恢复采集*/ + +#define REDUN_ALARM_HUNXIAN ((UINT8)0x55u) /*冗余采集混线报警*/ +#define REDUN_ALARM_FAULT ((UINT8)0xAAu) /*冗余采集故障报警*/ + #endif diff --git a/TSCP/src/APP/ciapp/System/CiSystemDefine.h b/TSCP/src/APP/ciapp/System/CiSystemDefine.h index 3370bd0..360ab4d 100644 --- a/TSCP/src/APP/ciapp/System/CiSystemDefine.h +++ b/TSCP/src/APP/ciapp/System/CiSystemDefine.h @@ -125,6 +125,9 @@ extern UINT8 CI_SYSTEM_TYPE_RCI; #define CI_DEVICE_TYPE_BACKUP_VOBC ((UINT8)0xBE) /*后备VOBC列车*/ #define CI_DEVICE_TYPE_ZHAOCHA ((UINT8)0xC0) /*照查*/ +#define CI_DEVICE_TYPE_SWITCH_PHYSEC ((UINT8)0xC1) /*道岔所在物理区段,互联互通接口使用*/ +#define CI_DEVICE_TYPE_XIANSU_LOGSEC ((UINT8)0xC2) /*限速逻辑区段,互联互通接口使用*/ + #define CI_DEVICE_TYPE_CMD ((UINT8)0x0B) /*命令*/ diff --git a/TSCP/src/APP/ciapp/System/SystemConfigDefine.h b/TSCP/src/APP/ciapp/System/SystemConfigDefine.h index 05ca236..e3da949 100644 --- a/TSCP/src/APP/ciapp/System/SystemConfigDefine.h +++ b/TSCP/src/APP/ciapp/System/SystemConfigDefine.h @@ -59,10 +59,10 @@ /*联锁V13.0版本升级数据结构 2018.8.3*/ /*版本号*/ -#define VER_MAIN_SUBCI_CI_CID ((UINT8)25) /*子系统主版本号*/ +#define VER_MAIN_SUBCI_CI_CID ((UINT8)27) /*子系统主版本号*/ #define VER_SUB_SUBCI_CI_CID ((UINT8)0) /*子系统子版本号*/ #define VER_BRUNCH_CI_CID ((UINT8)0) /*分支版本号..........主线填0....分支填1 调试填2 */ -#define VER_RETURN_SUBCI_CI_CID ((UINT8)2) /*子系统回归版本号*/ +#define VER_RETURN_SUBCI_CI_CID ((UINT8)1) /*子系统回归版本号*/ #ifdef SCADE_MODE /*SCADE软件版本号*/ @@ -75,30 +75,30 @@ /*手写软件版本号*/ #define VER_SOFT_PRODUCT ((UINT8)40) /*产品编号*/ #define VER_SOFT_MODUAL_APP ((UINT8)1) /*模块编号*/ -#define VER_SOFT_MIANVERSION ((UINT8)25) /*主版本号*/ -#define VER_SOFT_SUBVERSION ((UINT8)3) /*子版本号*/ +#define VER_SOFT_MIANVERSION ((UINT8)27) /*主版本号*/ +#define VER_SOFT_SUBVERSION ((UINT8)2) /*子版本号*/ #endif /*可兼容的公共数据结构版本号*/ #define VER_1_PUBLIC_FS_1 ((UINT8)31) -#define VER_1_PUBLIC_FS_2 ((UINT8)5) +#define VER_1_PUBLIC_FS_2 ((UINT8)8) #define VER_1_PUBLIC_FS_3 ((UINT8)0) #define VER_1_PUBLIC_FS_4 ((UINT8)0) #define VER_2_PUBLIC_FS_1 ((UINT8)23) #define VER_2_PUBLIC_FS_2 ((UINT8)2) #define VER_2_PUBLIC_FS_3 ((UINT8)1) -#define VER_2_PUBLIC_FS_4 ((UINT8)5) +#define VER_2_PUBLIC_FS_4 ((UINT8)7) #define VER_3_PUBLIC_FS_1 ((UINT8)28) #define VER_3_PUBLIC_FS_2 ((UINT8)0) #define VER_3_PUBLIC_FS_3 ((UINT8)0) -#define VER_3_PUBLIC_FS_4 ((UINT8)22) +#define VER_3_PUBLIC_FS_4 ((UINT8)25) /*可兼容的私有数据结构版本号*/ -#define VER_1_PRIVATE_FS_1 ((UINT8)50) +#define VER_1_PRIVATE_FS_1 ((UINT8)53) #define VER_1_PRIVATE_FS_2 ((UINT8)0) #define VER_2_PRIVATE_FS_1 ((UINT8)0xFF) @@ -108,7 +108,7 @@ #define VER_3_PRIVATE_FS_2 ((UINT8)0xFF) /*可兼容OC数据结构版本号*/ -#define VER_1_OCDATA_FS_1 ((UINT8)37) /*oc 3.0 较新数据版本*/ +#define VER_1_OCDATA_FS_1 ((UINT8)38) /*oc 3.0 较新数据版本*/ #define VER_1_OCDATA_FS_2 ((UINT8)0) #define VER_2_OCDATA_FS_1 ((UINT8)0xFF) diff --git a/TSCP/src/APP/ciapp/System/SystemParameterManage.c b/TSCP/src/APP/ciapp/System/SystemParameterManage.c index 0f90313..7d27700 100644 --- a/TSCP/src/APP/ciapp/System/SystemParameterManage.c +++ b/TSCP/src/APP/ciapp/System/SystemParameterManage.c @@ -23,6 +23,8 @@ static UINT16 LocalCTProtectSecUnlockTime = 0u;/* static UINT16 LocalUTNearUnLockTime = 0u;/*本联锁UT接近延时解锁超限时间(s)*/ static UINT16 LocalCTNearUnLockTime = 0u;/*本联锁CT接近延时解锁超限时间(s)*/ static UINT8 LocalWaysidePattern = 0u; /*本联锁轨旁继电器接口类型*/ +UINT8 gSerialCommFlag = SERIAL_COMM_NO; /*本联锁串口通信标志*/ +SerialCommData gSzSerialCommData[SERIAL_GROUP_SUM_MAX] = { 0U }; /*串口通信数据*/ static UINT8 OCSswitch = 0u; /*OC-S开关*/ /* RC合并新增,用于区分TIOC功能或者联锁联锁 */ @@ -123,9 +125,10 @@ static UINT16 g_TiocFsVersion[TIOCFS_VERSION_LENGTH] = { 0u };/* TIOC UINT32 gSystemUpdateMainUseCycNum = 0U; /*系统升级主用起始周期号*/ -static UINT32 wSwitchMachineCutInterval = 0U; /*RC/CI系统控制转辙机板主控切换间隔时间(单位:S)*/ -static UINT32 wSwitchMachineDrvingCutInterval = 0U; /*RC/CI系统驱动道岔后控制转辙机板主控切换时间(单位:S)*/ -static UINT32 wSwitchLastDrvValidTime = 0U; /*RC/CI系统上一次驱动道岔有效时间*/ +static UINT32 wSwitchMachineCutInterval = 0U; /*RC/CI系统控制转辙机板主控切换间隔时间(单位:S)*/ +static UINT32 wSwitchMachineDrvingCutInterval = 0U; /*RC/CI系统驱动道岔后控制转辙机板主控切换时间(单位:S)*/ +static UINT32 wSwitchLastDrvValidTime = 0U; /*RC/CI系统上一次驱动道岔有效时间*/ +static UINT32 dwSwitchRedunCollTolTime = 0U; /*道岔冗余采集报警容忍时间*/ /* * 功能描述: 系统参数时间转周期数 * 参数说明: void @@ -359,6 +362,9 @@ void SystemParaTimeToCycleCount(void) paraVal = GetSystemParaValue(SWITCH_LAST_DRV_TIME); wSwitchLastDrvValidTime = TimeToCycleCount((UINT32)paraVal * 1000U, appCycleTime); /*RC/CI系统上一次驱动道岔有效时间*/ + + paraVal = GetSystemParaValue(SWITCH_REDUN_COLL_ALARM_TIME); + dwSwitchRedunCollTolTime = TimeToCycleCount((UINT32)paraVal, appCycleTime); /*道岔冗余采集报警容忍时间*/ } /* @@ -1541,6 +1547,45 @@ UINT16 GetTiocSystemParameterData(UINT32* pConfigDataAdderBuf, UINT16* pConfigDa ;/*无处理 */ } + /*本联锁轨旁继电器接口类型*/ + wTmpLen = 1u + wTmpConfigDataSum; + if (wBufMaxLen >= wTmpLen) + { + pConfigDataAdderBuf[wTmpConfigDataSum] = &LocalWaysidePattern; + pConfigDataLenBuf[wTmpConfigDataSum] = (UINT16)sizeof(UINT8); + wTmpConfigDataSum++; + } + else + { + ;/*无处理 */ + } + + /*本联锁串口通信标志*/ + wTmpLen = 1u + wTmpConfigDataSum; + if (wBufMaxLen >= wTmpLen) + { + pConfigDataAdderBuf[wTmpConfigDataSum] = &gSerialCommFlag; + pConfigDataLenBuf[wTmpConfigDataSum] = (UINT16)sizeof(UINT8); + wTmpConfigDataSum++; + } + else + { + ;/*无处理 */ + } + + /*串口通信数据*/ + wTmpLen = 1u + wTmpConfigDataSum; + if (wBufMaxLen >= wTmpLen) + { + pConfigDataAdderBuf[wTmpConfigDataSum] = &gSzSerialCommData; + pConfigDataLenBuf[wTmpConfigDataSum] = (UINT16)(sizeof(SerialCommData) * (SERIAL_GROUP_SUM_MAX)); + wTmpConfigDataSum++; + } + else + { + ;/*无处理 */ + } + /*本联锁OC数据结构类型*/ wTmpLen = 1u + wTmpConfigDataSum; if (wBufMaxLen >= wTmpLen) @@ -2458,7 +2503,7 @@ UINT16 GetTiocSystemParameterData(UINT32* pConfigDataAdderBuf, UINT16* pConfigDa ;/* 无处理 */ } - /* RC/CI系统控制转辙机板主控切换间隔时间(单位:S) */ + /* RC/CI系统控制转辙机板主控切换间隔时间(单位:ms) */ wTmpLen = 1u + wTmpConfigDataSum; if (wBufMaxLen >= wTmpLen) { @@ -2470,7 +2515,7 @@ UINT16 GetTiocSystemParameterData(UINT32* pConfigDataAdderBuf, UINT16* pConfigDa { ;/* 无处理 */ } - /* RC/CI系统驱动道岔后控制转辙机板主控切换时间(单位:S) */ + /* RC/CI系统驱动道岔后控制转辙机板主控切换时间(单位:ms) */ wTmpLen = 1u + wTmpConfigDataSum; if (wBufMaxLen >= wTmpLen) { @@ -2907,7 +2952,7 @@ OtherCiParaStruct GetOtherCiPara(const UINT8 chOtherCiId) /* * 功能描述:获取无C轨站型B轨有UT车时可追踪功能开关 * 参数说明:无 -* 返回值:aa关闭 55打开 +* 返回值:aa打开 55关闭 * by cgh 20240815 */ UINT8 GetNoCGFollowUtSwitch(void) @@ -3280,9 +3325,9 @@ UINT32 GetSwitchMachineCutInterval(void) return wSwitchMachineCutInterval; } /* -* 功能描述:获取RC/CI系统驱动道岔后控制转辙机板主控切换时间(单位:S) +* 功能描述:获取RC/CI系统驱动道岔后控制转辙机板主控切换时间(单位:ms) * 参数说明:无 -* 返回值:RC/CI系统驱动道岔后控制转辙机板主控切换时间(单位:S) +* 返回值:RC/CI系统驱动道岔后控制转辙机板主控切换时间(单位:ms) * by mpt 20260324 */ UINT32 GetSwitchMachineDrvCutInterval(void) @@ -3325,3 +3370,177 @@ UINT8 GetLocalCiOCSswitch(void) { return OCSswitch; } + +/* +* 获取联锁厂商信息 +* 参数说明:const UINT8 chCiId +* 返回值:厂商信息 +* BY:lyj +*/ +UINT8 GetCiFactoryType(const UINT8 chCiId) +{ + UINT8 chRet = 0U; + if (CI_SUM_MAX > chCiId) + { + chRet = SystemParameterStruNew.chCiFactoryType[chCiId]; + } + else + { + /*不处理*/ + } + return chRet; +} +/** +* @brief 设置本联锁串口通信标志 +* @param[in] UINT8 chSerialCommFlag 串口通信标志 +* @return CI_SUCCESS 设置成功 CI_ERROR 设置失败 +* @note by cgh 20260507 +*/ +UINT8 SetLocalSerialCommFlag(UINT8 chSerialCommFlag) +{ + UINT8 chReval = CI_ERROR; + + if ((SERIAL_COMM_YES == chSerialCommFlag) || (SERIAL_COMM_NO == chSerialCommFlag)) + { + gSerialCommFlag = chSerialCommFlag; + chReval = CI_SUCCESS; + } + else + { + ; + } + + return chReval; +} + +/** +* @brief 获取本联锁串口通信标志 +* @param[in] void +* @return SERIAL_COMM_YES 支持串口通信 chSerialCommFlag 不支持串口通信 +* @note by cgh 20260507 +*/ +UINT8 GetLocalSerialCommFlag(void) +{ + return gSerialCommFlag; +} + +/** +* @brief 设置本联锁串口通信数据 +* @param[in] UINT8 chGroupIndex 串口组索引 +* @param[in] UINT8 chPortIndex 端口索引 +* @param[in] UINT16 wSerialCommCiId 串口通信其它联锁ID +* @param[in] UINT8 chSerialCommPort 串口通信端口号 +* @return CI_SUCCESS 设置成功 CI_ERROR 设置失败 +* @note by cgh 20260507 +*/ +UINT8 SetLocalSerialCommData(UINT8 chGroupIndex, UINT8 chPortIndex, UINT16 wSerialCommCiId, UINT8 chSerialCommPort) +{ + UINT8 chReval = CI_ERROR; + UINT8 chDevType = 0U; /*设备类型*/ + UINT8 chDevId = 0U; /*设备ID*/ + UINT8 chLocalRcWorkMode = 0u; /*本地RC工作模式*/ + + if ((SERIAL_GROUP_SUM_MAX > chGroupIndex) && (SERIAL_PORT_SUM_MAX > chPortIndex)) + { + chLocalRcWorkMode = GetLocalRcWorkMode(); + chDevType = (UINT8)((wSerialCommCiId & 0xFF00U) >> 8U); + chDevId = (UINT8)(wSerialCommCiId & 0x00FFU); + + if ((0u ==wSerialCommCiId) || ((chLocalRcWorkMode == chDevType) && (CI_SUM_MAX > chDevId))) + { + gSzSerialCommData[chGroupIndex].wSerialCommOtherCiId = wSerialCommCiId; + gSzSerialCommData[chGroupIndex].chSerialCommPort[chPortIndex] = chSerialCommPort; + + chReval = CI_SUCCESS; + } + else + { + ; /*初始化失败*/ + } + } + else + { + ; + } + + return chReval; +} + +/** +* @brief 获取本联锁串口通信数据 +* @param[in] void +* @return 串口通信数据 +* @note by cgh 20260507 +*/ +SerialCommData* GetLocalSerialCommData(void) +{ + return gSzSerialCommData; +} + +/** +* @brief 根据设备名获取对应的串口组 +* @param[in] UINT16 DeviceName 设备名称 +* @param[in] UINT8* pSerialGroup 端口组索引 +* @return 串口通信数据 +* @note by cgh 20260507 +*/ +UINT8 IsSerialDevice(UINT16 DeviceName, UINT8* pSerialGroup) +{ + UINT8 chReval = CI_ERROR; + UINT8 chLocalRcWorkMode = 0u; /*本地RC工作模式*/ + UINT8 cDstType = 0U; /*目标设备类型*/ + UINT8 cDstId = 0U; /*目标设备ID*/ + UINT8 chSerialCommFlag = 0U; /* 串口通信标志 */ + SerialCommData* szSerialCommData = NULL; /*串口通信数据*/ + UINT8 cSerialGroupIndex = 0U; + + chLocalRcWorkMode = GetLocalRcWorkMode(); + cDstType = (UINT8)((DeviceName & 0xFF00U) >> 8U); + cDstId = (UINT8)(DeviceName & 0x00FFU); + + if ((chLocalRcWorkMode == cDstType) && (NULL != pSerialGroup)) + { + /* 先判断当前联锁是否具备串口通信的功能 */ + chSerialCommFlag = GetLocalSerialCommFlag(); + szSerialCommData = GetLocalSerialCommData(); + + if ((SERIAL_COMM_YES == chSerialCommFlag) && (NULL != szSerialCommData)) + { + for (cSerialGroupIndex = 0U; cSerialGroupIndex < SERIAL_GROUP_SUM_MAX; cSerialGroupIndex++) + { + if (DeviceName == szSerialCommData[cSerialGroupIndex].wSerialCommOtherCiId) + { + *pSerialGroup = cSerialGroupIndex; + chReval = CI_SUCCESS; + break; + } + else + { + /*继续查找第二组*/ + ; + } + } + } + else + { + ; + } + } + else + { + + } + + return chReval; +} + +/** +* @brief 获取道岔冗余采集故障报警容忍时间(ms) +* @param[in] void +* @return 道岔冗余采集故障报警容忍时间(ms) +* @note by wyd 20260605 +*/ +UINT32 GetSwitchRedunCollHunXianCycCfg(void) +{ + return dwSwitchRedunCollTolTime; +} \ No newline at end of file diff --git a/TSCP/src/APP/ciapp/System/SystemParameterManage.h b/TSCP/src/APP/ciapp/System/SystemParameterManage.h index 150e918..534f5cd 100644 --- a/TSCP/src/APP/ciapp/System/SystemParameterManage.h +++ b/TSCP/src/APP/ciapp/System/SystemParameterManage.h @@ -108,6 +108,8 @@ extern "C" { #define FUNC_REOPRN_SET_NEAR ((UINT8)73) /*重开信号是否记忆进路接近锁闭状态开关:0xAA-重开后默认设置接近 0x55-重开后根据接近区段占用状态设置接近/未接近*/ #define FUNC_OVERLAP_UT_UNLOCK_MODE ((UINT8)74) /*UT列车占压停车区域时,保护区段解锁方式*/ #define FUNC_PSD_EXCEPT_CANCLE_TYPE ((UINT8)75) /*屏蔽门异常打开后解除异常方式:0xAA 需ATS发 0xBA命令;0x55未异常打开自动解除*/ +#define FUNC_PSD_KEEP_CLOSE_TYPE ((UINT8)76) /*联锁系统输出打开/关闭站台门命令原则*/ +#define FUNC_GATEWAY_INTERFACE_IDENTIFIER ((UINT8)77) /*联锁与网关接口标识:01:不存在GAL报文头 02:存在GAL报文头*/ #define CiSum_ID ((UINT16)1)/*实际联锁集中站数量 编号*/ @@ -190,6 +192,7 @@ extern "C" { #define SWITCH_MACHINE_CUT_INTERVAL (77U) /*RC/CI系统控制转辙机板主控切换间隔时间(单位:S)*/ #define SWITCH_MACHINE_CUT_DRV_INTERVAL (78U) /*RC/CI系统驱动道岔后控制转辙机板主控切换时间(单位:S)*/ #define SWITCH_LAST_DRV_TIME (79U) /*RC/CI系统上一次驱动道岔有效时间*/ +#define SWITCH_REDUN_COLL_ALARM_TIME (80U) /*道岔冗余采集报警容忍时间(ms)*/ #define FUNC_SWITCH_ON ((UINT8)0xAA) /*功能配置开关打开*/ #define FUNC_SWITCH_OFF ((UINT8)0x55) /*功能配置开关关闭*/ @@ -259,9 +262,15 @@ extern "C" { #define RC_LINK_LINE_YES ((UINT8)0x55U) /*具备联络线属性*/ #define RC_LINK_LINE_NO ((UINT8)0xAAU) /*不具备联络线属性*/ -#define OC_S_ON ((UINT8)0xAA) /*持续OC-S*/ +#define OC_S_ON ((UINT8)0xAA) /*支持OC-S*/ #define OC_S_OFF ((UINT8)0x55) /*不支持OC-S*/ +#define SERIAL_GROUP_SUM_MAX 2 /*串口通信设备数最大值 */ +#define SERIAL_PORT_SUM_MAX 2 /*串口通信端口索引最大值 */ + +#define SERIAL_COMM_YES ((UINT8)0xAAU) /*支持串口通信*/ +#define SERIAL_COMM_NO ((UINT8)0x55U) /*不支持串口通信*/ + /*系统参数结构体*/ typedef struct S_SystemParameterStruct { @@ -375,7 +384,6 @@ typedef struct S_SystemParaStruct UINT8 MaxTsrSpeed;/*临时限速最高限速*/ UINT16 MaxTsrNum;/*一次设置临时限速的最大个数*/ UINT16 MaxSectionOfTsr;/*一个临时限速报文中包含的最大逻辑区段数量*/ - UINT32 IvocOcCommunicationErrorTime;/*IVOC-OC通信故障判断时间(ms),add by yt,2022年3月1日,适配车车系统配置数据*/ UINT32 TmcOcCommunicationErrorTime;/*TMC-OC通信故障判断时间(ms),add by yt,2022年3月1日,适配车车系统配置数据*/ UINT32 OcTslCommunicationErrorTime;/*OC-TSL通信故障判断时间(ms),add by yt,2022年3月1日,适配车车系统配置数据*/ UINT8 LinkLogicDirUpAndDown; /*系统定义逻辑方向与上下行方向的关系,add by yt,2022年3月1日,适配车车系统配置数据*/ @@ -395,6 +403,7 @@ typedef struct S_SystemParaStruct UINT8 chNoCGFollowUtSwitch; /*无C轨站型B轨有UT车是可追踪功能开关 aa打开 55关闭*/ OtherCiParaStruct otherCICiParaStru[CI_SUM_MAX]; /*其他联锁参数配置*/ UINT8 chCldAndScxMergeFlag; /*车辆段与试车线合设开关,0x55 合设,0xaa 不合设*/ + UINT8 chCiFactoryType[CI_SUM_MAX]; /*联锁厂商定义*/ /************************************************/ }SystemParameterStructNew; @@ -418,6 +427,12 @@ typedef struct S_CI_OC_Relation UINT16 OcIdNum; }CiOcRelateion; +typedef struct S_SERIAL_COMM_DATA +{ + UINT16 wSerialCommOtherCiId; /*串口通信其它联锁ID*/ + UINT8 chSerialCommPort[SERIAL_PORT_SUM_MAX]; /*串口通信端口*/ +}SerialCommData; + /*******************************全局变量声明*******************************/ extern UINT8 LocalCiId; /*本机联锁ID*/ @@ -506,6 +521,8 @@ extern UINT8 localBackUpFlag; /* extern UINT32 dwDownWashWaitAcceptTime; /*降级模式洗车等待值班员同意最大时间(S)*/ extern UINT32 LineMinTrainLength; /*系统配置数据,线路最小车长*/ extern UINT32 wJXTCStopDetectTime; /*间隙探测停止检测时间(s)*/ +extern UINT8 gSerialCommFlag; /*本联锁串口通信标志*/ +extern SerialCommData gSzSerialCommData[SERIAL_GROUP_SUM_MAX]; /*串口通信数据*/ /* * 功能描述: 系统参数时间转周期数 * 参数说明: void @@ -1353,7 +1370,7 @@ OtherCiParaStruct GetOtherCiPara(const UINT8 chOtherCiId); /* * 功能描述:获取无C轨站型B轨有UT车是可追踪功能开关 * 参数说明:无 -* 返回值:aa关闭 55打开 +* 返回值:aa打开 55关闭 * by cgh 20240815 */ UINT8 GetNoCGFollowUtSwitch(void); @@ -1544,9 +1561,9 @@ void SetCiFunctionSwitchConfig(UINT8 chFunctionConfigIndex, UINT8 chSwitchVal); */ UINT32 GetSwitchMachineCutInterval(void); /* -* 功能描述:获取RC/CI系统驱动道岔后控制转辙机板主控切换时间(单位:S) +* 功能描述:获取RC/CI系统驱动道岔后控制转辙机板主控切换时间(单位:ms) * 参数说明:无 -* 返回值:RC/CI系统驱动道岔后控制转辙机板主控切换时间(单位:S) +* 返回值:RC/CI系统驱动道岔后控制转辙机板主控切换时间(单位:ms) * by mpt 20260324 */ UINT32 GetSwitchMachineDrvCutInterval(void); @@ -1569,6 +1586,65 @@ UINT8 SetLocalCiOCSswitch(UINT8 funSwitch); * 返回值:本联锁OCS开关 */ UINT8 GetLocalCiOCSswitch(void); +/* +* 获取联锁厂商信息 +* 参数说明:const UINT8 chCiId +* 返回值:厂商信息 +* BY:lyj +*/ +UINT8 GetCiFactoryType(const UINT8 chCiId); + +/** +* @brief 设置本联锁串口通信标志 +* @param[in] UINT8 chSerialCommFlag 串口通信标志 +* @return CI_SUCCESS 设置成功 CI_ERROR 设置失败 +* @note by cgh 20260507 +*/ +UINT8 SetLocalSerialCommFlag(UINT8 chSerialCommFlag); + +/** +* @brief 获取本联锁串口通信标志 +* @param[in] void +* @return SERIAL_COMM_YES 支持串口通信 chSerialCommFlag 不支持串口通信 +* @note by cgh 20260507 +*/ +UINT8 GetLocalSerialCommFlag(void); + +/** +* @brief 设置本联锁串口通信数据 +* @param[in] UINT8 chGroupIndex 串口组索引 +* @param[in] UINT8 chPortIndex 端口索引 +* @param[in] UINT16 wSerialCommCiId 串口通信其它联锁ID +* @param[in] UINT8 chSerialCommPort 串口通信端口号 +* @return CI_SUCCESS 设置成功 CI_ERROR 设置失败 +* @note by cgh 20260507 +*/ +UINT8 SetLocalSerialCommData(UINT8 chGroupIndex, UINT8 chPortIndex, UINT16 wSerialCommCiId, UINT8 chSerialCommPort); + +/** +* @brief 获取本联锁串口通信数据 +* @param[in] void +* @return 串口通信数据 +* @note by cgh 20260507 +*/ +SerialCommData* GetLocalSerialCommData(void); + +/** +* @brief 根据设备名获取对应的串口组 +* @param[in] UINT16 DeviceName 设备名称 +* @param[in] UINT8* pSerialGroup 端口组索引 +* @return 串口通信数据 +* @note by cgh 20260507 +*/ +UINT8 IsSerialDevice(UINT16 DeviceName, UINT8* pSerialGroup); + +/** +* @brief 获取道岔冗余采集故障报警容忍时间(ms) +* @param[in] void +* @return 道岔冗余采集故障报警容忍时间(ms) +* @note by wyd 20260605 +*/ +UINT32 GetSwitchRedunCollHunXianCycCfg(void); #ifdef __cplusplus } diff --git a/TSCP/src/APP/ciapp/Train/TrainDataManage.c b/TSCP/src/APP/ciapp/Train/TrainDataManage.c index 7465ff8..d83cd1e 100644 --- a/TSCP/src/APP/ciapp/Train/TrainDataManage.c +++ b/TSCP/src/APP/ciapp/Train/TrainDataManage.c @@ -360,7 +360,8 @@ UINT8 TrainDataModuleInit(void) gstTrainInfo[chCycle].chTrainPostionMode = 0U; /*列车位置模式*/ - + gstTrainInfo[chCycle].chPbtacsTransState = TRAIN_COMM_STATE_UNKNOWN; /*初始化与PBTACS车未通信*/ + gstTrainInfo[chCycle].dwPbtacsTransBadCyc = 0U; gszTrainId[gTrainSum] = gstTrainInfo[chCycle].wTrainId; gTrainSum++; @@ -409,7 +410,6 @@ UINT8 TrainDataModuleInit(void) gTrainInfoTemp[chCycle].chIvocSpeedDir = 0u; /*Ivoc速度方向*/ gTrainInfoTemp[chCycle].wIvocTrainSpeed = 0u; /*Ivoc列车速度*/ gTrainInfoTemp[chCycle].dwIvocDelayTime = 0u; /*Ivoc消息延迟时间*/ - } @@ -2869,6 +2869,7 @@ static void CalTrainSafePosition(void) chResult &= SetTrainSafeHeadOffset(wTrainId, UINT32_MAX); chResult &= SetTrainSafeTailLink(wTrainId, 0u); chResult &= SetTrainSafeTailOffset(wTrainId, UINT32_MAX); + SetTrainMinSafeHead(wTrainId, 0u, UINT32_MAX, 0u); if (CI_ERROR == chResult) { ; /*暂不处理*/ @@ -3016,6 +3017,9 @@ void ClearTrainInfo(UINT16 wTrainId) gstTrainInfo[wBufIndex].strJumpBackData.chJumpBackApplyState = TRAIN_JUMP_BACK_STATE_INVALID;/*初始化未申请*/ gstTrainInfo[wBufIndex].strJumpBackData.chJumpBackReplyState = TRAIN_JUMP_BACK_STATE_NONE;/*初始化允许默认值*/ gstTrainInfo[wBufIndex].strJumpBackData.dwJumpBackApplySn = 0U;/*初始化默认序列号*/ + + gstTrainInfo[wBufIndex].chPbtacsTransState = TRAIN_COMM_STATE_UNKNOWN; /*重置与PBTACS车未通信*/ + gstTrainInfo[wBufIndex].dwPbtacsTransBadCyc = 0U; } else { @@ -3091,7 +3095,6 @@ UINT8 dsuTrainCrossSignal(const UINT16 wTrainId, const UINT16 wRouteId) UINT16 wEndSignal = 0u; struct_PathPoint strTrainMaxHead = { 0u }; struct_PathPoint strTrainMinTail = { 0u }; - struct_PathPoint strTrainSafeMinHead = { 0u }; str_Zone strRouteZone = { 0u }; UINT8 chRtnVal = CI_ERROR; str_PointInArea strRouteSwitch = { 0u }; @@ -3124,8 +3127,6 @@ UINT8 dsuTrainCrossSignal(const UINT16 wTrainId, const UINT16 wRouteId) strTrainZone.pStart.dwOffset = strTrainMinTail.dwOffset; strTrainZone.pEnd.wLinkId = strTrainMaxHead.wLinkId; strTrainZone.pEnd.dwOffset = strTrainMaxHead.dwOffset; - strTrainSafeMinHead.wLinkId = GetTrainMinSafeHeadLink(wTrainId); - strTrainSafeMinHead.dwOffset = GetTrainMinSafeHeadOffset(wTrainId); chSwitchNum = GetRouteSwitchSum(wRouteId); pRouteSwitch = GetRouteSwitchData(wRouteId); @@ -3145,7 +3146,6 @@ UINT8 dsuTrainCrossSignal(const UINT16 wTrainId, const UINT16 wRouteId) chRtnVal &= CheckLinkValid(strTrainMinTail.wLinkId, strTrainMinTail.dwOffset); chRtnVal &= CheckLinkValid(strRouteZone.pStart.wLinkId, strRouteZone.pStart.dwOffset); chRtnVal &= CheckLinkValid(strRouteZone.pEnd.wLinkId, strRouteZone.pEnd.dwOffset); - chRtnVal &= CheckLinkValid(strTrainSafeMinHead.wLinkId, strTrainSafeMinHead.dwOffset); } else { @@ -7719,23 +7719,21 @@ UINT8 GetTrainResRecycleOTStat(const UINT16 wTrainId) UINT16 wBufIndex = 0U; UINT32 overtimeCycleCount = 0U; - - overtimeCycleCount = GetSystemParaTrainReCycleCount(); + overtimeCycleCount = GetSystemParaTrainReCycleCount(); /*获取资源回收超限时间*/ wBufIndex = GetTrainBufIndex(wTrainId); if (TRAIN_SUM_MAX > wBufIndex) { - trainTransimitStat = GetTrainTransitmitStat(wTrainId); - trainLoseCommCyc = GetTrainTransBadCyc(wTrainId); + trainTransimitStat = GetPbtacsTrainTransState(wTrainId); /*获取与PBTACS车的通信状态*/ + trainLoseCommCyc = GetPbtacsTrainTransBadCyc(wTrainId); /*列车通信不好*/ if (TRAIN_COMM_STATE_BAD == trainTransimitStat) { - overtimeStat = SystemOverTimeCheck(trainLoseCommCyc, overtimeCycleCount); if (CI_TIME_OUT == overtimeStat) { - /*超时,*/ + /*超时*/ chRetVal = CI_SUCCESS; } else @@ -13755,7 +13753,6 @@ static void DoubleTrianComStateJuge(const UINT16 wTrainId, const UINT8 chComBadF chIvocCtxValid = GetHLHTHeadCtxValid(CI_SYSTEM_TYPE_IVOC, (UINT8)wTrainId); chVobcCtxValid = GetHLHTHeadCtxValid(CI_SYSTEM_TYPE_VOBC, (UINT8)wTrainId); - trainMsgFromTiocId = GetTrainMsgFromTiocId(wTrainId); /*根据双车计算通信状态*/ if ((CI_ERROR == chIvocCtxValid) && (CI_ERROR == chVobcCtxValid)) @@ -13951,3 +13948,96 @@ UINT16* GetBlocLinkLogSecBuf(const UINT16 wTrainId) } return pLogSecBuf; } + +/* +* 功能描述:设置指定PBTACS列车通信状态 +* 参数说明:const UINT16 wTrainId, 列车ID +* const UINT8 chTrainmitStat 通信状态 +* 返 回 值:无 +* Created By LQ 2026.06.09 +*/ +void SetPbtacsTrainTransState(const UINT16 wTrainId, const UINT8 chTrainmitStat) +{ + UINT16 wBufIndex = 0U; + UINT32 dwCurCycNum = 0U; + + wBufIndex = GetTrainBufIndex(wTrainId); + if ((TRAIN_SUM_MAX > wBufIndex) + && ((TRAIN_COMM_STATE_GOOD == chTrainmitStat) || (TRAIN_COMM_STATE_BAD == chTrainmitStat) || (TRAIN_COMM_STATE_UNKNOWN == chTrainmitStat))) + { + gstTrainInfo[wBufIndex].chPbtacsTransState = chTrainmitStat; + + if (TRAIN_COMM_STATE_BAD == chTrainmitStat) + { + if (0U == gstTrainInfo[wBufIndex].dwPbtacsTransBadCyc) + { + dwCurCycNum = Get2oo2CurCycleNum(); + gstTrainInfo[wBufIndex].dwPbtacsTransBadCyc = dwCurCycNum; /*设置通信中断时间*/ + } + else + { + /*已设置通信中断时间,不再重复刷新*/ + } + } + else + { + gstTrainInfo[wBufIndex].dwPbtacsTransBadCyc = 0U; + } + } + else + { + /*异常分支,不处理*/ + } + +} + +/* +* 功能描述:获取指定PBTACS列车通信状态 +* 参数说明:const UINT16 wTrainId 列车ID +* 返 回 值:0 获取数据失败 +* 0x55 通信状态良好 +* 0xAA 丢失通信 +* 0xFF 通信状态未知 +* Created By LQ 2026.06.09 +*/ +UINT8 GetPbtacsTrainTransState(const UINT16 wTrainId) +{ + UINT8 chRetVal = CI_ERROR; + UINT16 wBufIndex = 0U; + + wBufIndex = GetTrainBufIndex(wTrainId); + if (TRAIN_SUM_MAX > wBufIndex) + { + chRetVal = gstTrainInfo[wBufIndex].chPbtacsTransState; + } + else + { + chRetVal = CI_ERROR; + } + + return chRetVal; +} + +/* +* 功能描述:获取指定PBTACS列车通信中断周期号 +* 参数说明:const UINT16 wTrainId 列车ID +* 返 回 值:列车通信中断周期号 +* Created By LQ 2026.06.09 +*/ +UINT32 GetPbtacsTrainTransBadCyc(const UINT16 wTrainId) +{ + UINT32 dwRetVal = 0U; + UINT16 wBufIndex = 0U; + + wBufIndex = GetTrainBufIndex(wTrainId); + if (TRAIN_SUM_MAX > wBufIndex) + { + dwRetVal = gstTrainInfo[wBufIndex].dwPbtacsTransBadCyc; + } + else + { + ; + } + + return dwRetVal; +} \ No newline at end of file diff --git a/TSCP/src/APP/ciapp/Train/TrainDataManage.h b/TSCP/src/APP/ciapp/Train/TrainDataManage.h index a7e10d5..09a55d2 100644 --- a/TSCP/src/APP/ciapp/Train/TrainDataManage.h +++ b/TSCP/src/APP/ciapp/Train/TrainDataManage.h @@ -295,6 +295,8 @@ typedef struct S_TrainInfoStru UINT8 chTrainPostionMode; /*列车位置模式,0x10 使用IVOC位置,0x14使用VOBC位置*/ BlocLinkInfoStru strBlocLinkData; /*点连式信息*/ + UINT8 chPbtacsTransState; /*RC与PBTACS列车通信状态(该变量用于资源回收功能):0x55-通信正常,0xAA-通信中断,0xFF-未知*/ + UINT32 dwPbtacsTransBadCyc; /*RC与PBTACS列车通信中断周期(该变量用于资源回收功能)*/ }TrainInfoStru; @@ -3103,6 +3105,34 @@ UINT8 GetBlocLinkLogSecNum(const UINT16 wTrainId); */ UINT16* GetBlocLinkLogSecBuf(const UINT16 wTrainId); +/* +* 功能描述:设置指定PBTACS列车通信状态 +* 参数说明:const UINT16 wTrainId, 列车ID +* const UINT8 chTrainmitStat 通信状态 +* 返 回 值:无 +* Created By LQ 2026.06.09 +*/ +void SetPbtacsTrainTransState(const UINT16 wTrainId, const UINT8 chTrainmitStat); + +/* +* 功能描述:获取指定PBTACS列车通信状态 +* 参数说明:const UINT16 wTrainId 列车ID +* 返 回 值:0 获取数据失败 +* 0x55 通信状态良好 +* 0xAA 丢失通信 +* 0xFF 通信状态未知 +* Created By LQ 2026.06.09 +*/ +UINT8 GetPbtacsTrainTransState(const UINT16 wTrainId); + +/* +* 功能描述:获取指定PBTACS列车通信中断周期号 +* 参数说明:const UINT16 wTrainId 列车ID +* 返 回 值:列车通信中断周期号 +* Created By LQ 2026.06.09 +*/ +UINT32 GetPbtacsTrainTransBadCyc(const UINT16 wTrainId); + #ifdef __cplusplus } #endif diff --git a/TSCP/src/APP/ciapp/WashMachine/WashMachineDataManage.c b/TSCP/src/APP/ciapp/WashMachine/WashMachineDataManage.c index 2c2f0b8..ed98bb5 100644 --- a/TSCP/src/APP/ciapp/WashMachine/WashMachineDataManage.c +++ b/TSCP/src/APP/ciapp/WashMachine/WashMachineDataManage.c @@ -14,7 +14,7 @@ WashMachineDataStruct WashMachineDataStru[WASHMACHINE_SUM_MAX]; /*定义洗车机数据结构体*/ - +UINT8 RouteDriveIntoResult = CI_ERROR; /*判断进路是否有车驶入过*/ /* * 功能描述: 获取指定ID洗车机数据 diff --git a/TSCP/src/APP/ciapp/WashMachine/WashMachineDataManage.h b/TSCP/src/APP/ciapp/WashMachine/WashMachineDataManage.h index b7d27c3..4c221b1 100644 --- a/TSCP/src/APP/ciapp/WashMachine/WashMachineDataManage.h +++ b/TSCP/src/APP/ciapp/WashMachine/WashMachineDataManage.h @@ -75,6 +75,7 @@ typedef struct S_WashMachineDataStruct extern WashMachineDataStruct WashMachineDataStru[WASHMACHINE_SUM_MAX]; /*定义洗车机数据结构体*/ +extern UINT8 RouteDriveIntoResult; /*判断进路是否有车驶入过*/ /* * 功能描述: 获取指定ID洗车机数据 * 参数说明: diff --git a/TSCP/src/MSCP/CFM/CFM_Net.c b/TSCP/src/MSCP/CFM/CFM_Net.c index 2f3d6bb..84d073b 100644 --- a/TSCP/src/MSCP/CFM/CFM_Net.c +++ b/TSCP/src/MSCP/CFM/CFM_Net.c @@ -36,6 +36,7 @@ #include "MSCP_APP_Interface.h" #include "PFM_RemoteUpdate.h" #include "MSCP_Define.h" +#include "CFM_Raw.h" #include #define CFM_2oo2_MSG_NUM_MAX (200u) @@ -58,6 +59,18 @@ /*鏃ュ織鏀掑寘鍙戦 鏀掑寘澶у皬*/ #define LOG_MAX (5120u) +/* 蹇冭烦鍦ㄥ懆鏈熺粨鏉熷墠30ms鎵ц鍙戦 */ +#define CFM_HEART_WAITE (30u) + +/* 蹇冭烦鍙戦佺嚎绋嬫帶鍒剁粨鏋勪綋 */ +typedef struct +{ + CM_SEM_T m_Start; /* 蹇冭烦绾跨▼寮濮嬩俊鍙烽噺 */ + CM_SEM_T m_Stop; /* 蹇冭烦绾跨▼缁撴潫淇″彿閲 */ +} STRU_CFM_HEART_CTRL_T; + +static STRU_CFM_HEART_CTRL_T s_CFM_HeartCtrl; + /** 鎺ユ敹绾跨▼鎺у埗 */ typedef struct { @@ -351,6 +364,8 @@ static CM_THREAD_FUNC_T t_TimeThread_Area(IN CM_Thread_Arg_Struct_T* arg); static CM_THREAD_FUNC_T t_RemoteUpdateThread(IN CM_Thread_Arg_Struct_T* arg); static CM_THREAD_FUNC_T t_ClearArpThread(void); +/* 鍗曠嫭鐨勫績璺冲彂閫佺嚎绋 */ +static CM_THREAD_FUNC_T t_OutNetHeartSendThread(IN CM_Thread_Arg_Struct_T* arg); /* 2鍙栦娇鐢╯ocket鐨勫垵濮嬪寲*/ @@ -2664,7 +2679,14 @@ static void s_NetInit_Outnet(void) } rtCheck = CM_Thread_Create((CM_THREAD_T*) NULL, (CM_THREAD_FUNC_T) t_ClearArpThread,"Clear_Arp", 0, CM_TASK_PRIORITY_94, NULL); - CM_RE_ASSERT(CM_TRUE == rtCheck, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_4, TSCP_DARK_ASSERT_13); + CM_ASSERT(CM_TRUE == rtCheck, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_4, TSCP_DARK_ASSERT_13); + + rt = CM_Sem_Init(&s_CFM_HeartCtrl.m_Start); + CM_ASSERT(ENUM_CM_TRUE == rt, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_4, TSCP_DARK_ASSERT_14); + rt = CM_Sem_Init(&s_CFM_HeartCtrl.m_Stop); + CM_ASSERT(ENUM_CM_TRUE == rt, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_4, TSCP_DARK_ASSERT_15); + rtCheck = CM_Thread_Create((CM_THREAD_T*) NULL, (CM_THREAD_FUNC_T) t_OutNetHeartSendThread,"heart_send", 0, CM_TASK_PRIORITY_82, (CM_Thread_Arg_Struct_T*)&s_CFM_HeartCtrl); + CM_ASSERT(CM_TRUE == rtCheck, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_4, TSCP_DARK_ASSERT_16); CM_Sleep(100u);/* 寤舵椂绛夊緟绾跨▼鍚姩 */ } @@ -4767,7 +4789,36 @@ void CFM_AssertRecved(void) assertMsgNum = CM_MQ_Get_Msg_Num(&s_CFM_Rx2oo2_Assert.MsgQ); CM_ASSERT((0u == assertMsgNum),NET_MODE,DARK_FAULT_CODE_FUN_ORDER_41,TSCP_DARK_ASSERT_1); } +/** + * @brief 鍙戦佸績璺崇嚎绋嬬殑鍚姩淇″彿閲忥紝闇瑕佸湪骞冲彴鍛ㄦ湡寮濮嬫椂鍙戦 + */ +void CFM_Heart_Thread_PostStart(void) +{ + (void)CM_Sem_Post(s_CFM_HeartCtrl.m_Start); +} +/* 鍗曠嫭鐨勫績璺冲彂閫佺嚎绋 */ +static CM_THREAD_FUNC_T t_OutNetHeartSendThread(IN CM_Thread_Arg_Struct_T* arg) +{ + STRU_CFM_HEART_CTRL_T *pCtrl = (STRU_CFM_HEART_CTRL_T*)arg; + CM_UINT32 cyc_time = g_PFM_Cfg.CYC_TIME; + ENUM_2x2_STATE_T state_2x2 = ENUM_2x2_SHUTDOWN; +#if QNX + void* pmask = NULL; + /*- 鏈嚎绋嬮攣瀹氬湪 A53 core 1 */ + pmask = (void*)(0x01u|0x02u); + (void)ThreadCtl(_NTO_TCTL_RUNMASK, pmask); +#endif + while(1) + { + CM_Sem_Wait(pCtrl->m_Start); + state_2x2 = SFM_2x2_GetLocal2x2State(); + CM_Sleep(cyc_time - CFM_HEART_WAITE); + /*- 鍙戦佷富绾跨▼鐑鐘舵佺殑澶栫綉蹇冭烦*/ + (void)CFM_TxOutnetHeart(state_2x2); + } + return NULL; +} /* MAC灞傦細14瀛楄妭 dst MAC [6] src MAC [6] type [2] diff --git a/TSCP/src/MSCP/CFM/CFM_Net.h b/TSCP/src/MSCP/CFM/CFM_Net.h index de93934..879e7f1 100644 --- a/TSCP/src/MSCP/CFM/CFM_Net.h +++ b/TSCP/src/MSCP/CFM/CFM_Net.h @@ -759,6 +759,10 @@ extern "C" * @brief 鍒ゆ柇鏀跺埌瀹曟満鍚庣殑2鍙栵紝绔嬪嵆鎵ц瀹曟満鎿嶄綔 */ void CFM_AssertRecved(void); + /** + * @brief 鍙戦佸績璺崇嚎绋嬬殑鍚姩淇″彿閲忥紝闇瑕佸湪骞冲彴鍛ㄦ湡寮濮嬫椂鍙戦 + */ + void CFM_Heart_Thread_PostStart(void); #ifdef __cplusplus } #endif diff --git a/TSCP/src/MSCP/MSCP_main.c b/TSCP/src/MSCP/MSCP_main.c index 09ea599..b58a126 100644 --- a/TSCP/src/MSCP/MSCP_main.c +++ b/TSCP/src/MSCP/MSCP_main.c @@ -478,6 +478,8 @@ static CM_THREAD_FUNC_T MSCP_CycBase(void) /*TODO 鍙戦2x鐘舵佽捣濮嬩俊鍙烽噺*/ SFM_2x2_Thread_PostStart(); SFM_AREA_Thread_PostStart(); + /* 鍙戦佸績璺崇嚎绋嬭捣濮嬩俊鍙烽噺 */ + CFM_Heart_Thread_PostStart(); PFM_CFC_Check(24); /*- @alias 2oo2鍛ㄦ湡鏍℃椂 */ if (0x55u == g_PFM_Cfg.M_2oo2_Enable) diff --git a/TSCP/src/MSCP/PFM/PFM_Cfg.c b/TSCP/src/MSCP/PFM/PFM_Cfg.c index a049969..22c14c6 100644 --- a/TSCP/src/MSCP/PFM/PFM_Cfg.c +++ b/TSCP/src/MSCP/PFM/PFM_Cfg.c @@ -40,11 +40,11 @@ CM_CHAR FS_FILE_PATH[100]; /** 骞冲彴杞欢鐗堟湰鍙 */ -const CM_UINT8 MSCP_SW_VERION[4] = { 93u, 1u, 1u, 62u }; +const CM_UINT8 MSCP_SW_VERION[4] = { 93u, 1u, 1u, 63u }; /** 椹卞姩杞欢鐗堟湰鍙 */ CM_UINT8 MSCP_DRV_VERION[4] = {0}; /** 涓庣淮鎶や竴浣撴満鎺ュ彛鏂囨。鐗堟湰鍙(鎺ュ彛鏂囨。鍙戠敓鏀瑰彉鏃跺崌绾х増鏈彿) */ -CM_UINT16 TSCP_DOC_VERION[2] = {37u,0u}; +CM_UINT16 TSCP_DOC_VERION[2] = {38u,0u}; /** 鎿嶄綔绯荤粺鐗堟湰鍙 */ CM_UINT8 TSCP_QNX_VERION[10] = {0u}; diff --git a/TSCP/src/MSCP/PFM/PFM_InputOutput.c b/TSCP/src/MSCP/PFM/PFM_InputOutput.c index ceaf884..7d1f057 100644 --- a/TSCP/src/MSCP/PFM/PFM_InputOutput.c +++ b/TSCP/src/MSCP/PFM/PFM_InputOutput.c @@ -89,6 +89,11 @@ static CM_INT32 s_2oo2OutputCheckFrame_Pack(OUT CM_UINT8 buf[], IN CM_UINT32 Buf static CM_INT32 s_2x2OutputCheckFrame_Pack(OUT CM_UINT8 *buf, IN CM_UINT32 BufSize); /* 杈撳叆闃舵鐨2x2鍚屾 */ static void s_input_2x2sync(void); + +/** + * @brief 杈撳嚭闃舵鐨2鍙栨牎楠 + */ +static void s_output_2oo2check(IN CM_UINT8* check_2oo2_Buf, IN CM_UINT32 check_2oo2_Len); /** * @brief 杈撳叆闃舵鐨2x2鍚屾 */ @@ -460,7 +465,6 @@ void PFM_BufSwich(void) s_OutnetHeart_Mine_AppReadIndex = 0; s_OutnetHeart_Peer_AppReadIndex = 0; } - /** * @brief 杈撳叆寰懆鏈熷鐞 * @details @@ -476,7 +480,6 @@ void PFM_InputProc(void) /*- 鍙橀噺鍒濆鍖 */ CM_INT32 i = 0; ENUM_2x2_STATE_T p_state_2x2 = ENUM_2x2_SHUTDOWN; /* 瀵圭郴鐑鐘舵 */ - ENUM_2x2_STATE_T localstate = SFM_2x2_GetLocal2x2State(); /* 鏈満2x2鐘舵 */ /************************骞冲彴鏁版嵁鎺ユ敹*************************/ /*- 澶栫綉瀹夊叏鏁版嵁鎺ユ敹 */ @@ -512,8 +515,6 @@ void PFM_InputProc(void) } PFM_CFC_Check(30); - /*- 鍙戦佷富绾跨▼鐑鐘舵佺殑澶栫綉蹇冭烦*/ - (void)CFM_TxOutnetHeart(localstate); PFM_CFC_Check(31); /*棰勭暀*/ /*************************鏈湴杈撳叆鏁版嵁2oo2浜ゆ崲鍜屾瘮杈*************************/ MSCP_LOG_MSG("timecurr 1 Input Recv = %lld us\n", NOW_USED_TIME); @@ -698,18 +699,8 @@ void PFM_OutputProc(void) /*- 鏄惁寮鍚簡2oo2鍔熻兘 */ if (0x55u == g_PFM_Cfg.M_2oo2_Enable) { - /*- 2oo2浜ゆ崲杈撳嚭鏍¢獙甯 */ - ret = SFM_2oo2_Exchange_Currency(check_2oo2_Buf, check_2oo2_Len, buf_peer, (CM_UINT32)check_2oo2_Len, ENUM_2oo2_OUTPUT_CHECK); - - /*- 妫鏌2oo2鍙屾満鐨勮緭鍑烘牎楠屽抚鏄惁涓鑷 */ - CM_RE_ASSERT(check_2oo2_Len == ret, IN_OUT_MODE, DARK_FAULT_CODE_FUN_ORDER_3, TSCP_DARK_ASSERT_1); - ret = CM_Memcmp(check_2oo2_Buf, buf_peer, (CM_SIZE_T)check_2oo2_Len); - if(0 != ret) - { - MSCP_LOG_DATALEN(check_2oo2_Buf,check_2oo2_Len,"Ouput check_2oo2_Buf"); - MSCP_LOG_DATALEN(buf_peer,check_2oo2_Len,"Ouput buf_peer"); - CM_RE_ASSERT(0, IN_OUT_MODE, DARK_FAULT_CODE_FUN_ORDER_3, TSCP_DARK_ASSERT_2); - } + /* 2鍙栨牎楠 */ + (void)s_output_2oo2check(check_2oo2_Buf, (CM_UINT32)check_2oo2_Len); } else { @@ -809,7 +800,6 @@ void PFM_OutputProc(void) void PFM_EndProc(void) { /*- 鍙橀噺鍒濆鍖 */ - CM_UINT32 crc = 0u; /* crc鍊 */ CM_UINT8 mybuf[8] = { 0u }; /* 鏈満2oo2缂撳啿鍖 */ CM_UINT8 peerbuf[8] = { 0u };/* 閭绘満2oo2缂撳啿鍖 */ CM_INT32 len = 0; /* 闀垮害 */ @@ -823,7 +813,7 @@ void PFM_EndProc(void) { /*- 鐢熸垚璺熼殢鏁版嵁鐨勭壒寰佷俊鎭 */ CM_LongToChar((CM_UINT32)g_TxAppFollow_len, mybuf); - (void)CM_Memcpy(mybuf + 4, 4, g_TxAppFollow, 4); + CM_Memcpy(&mybuf[4u], 4u, g_TxAppFollow, 4u); /*- 2oo2浜ゆ崲鐗瑰緛淇℃伅 */ len = SFM_2oo2_Exchange_Currency(mybuf, 8, peerbuf, 8u, ENUM_2oo2_OUTPUT_CHECK); /*- 2oo2涓ユ牸姣旇緝鐗瑰緛淇℃伅 */ @@ -831,6 +821,7 @@ void PFM_EndProc(void) if(0 == CM_Memcmp(mybuf, peerbuf, (CM_SIZE_T)8)) { /*- 鏃犲鐞 */ + CM_Memcpy(&g_TxAppFollow[4u], 4u, &peerbuf[4u], 4u); } else { @@ -1024,6 +1015,7 @@ static CM_INT32 s_2x2OutputCheckFrame_Pack(OUT CM_UINT8 *buf, IN CM_UINT32 BufSi CM_UINT32 len = 0u; /* 杈撳嚭璺熼殢鎶ユ枃闀垮害 */ CM_UINT32 crc = 0u; /* 杈撳嚭璺熼殢鎶ユ枃CRC */ CM_UINT32 sysCyc = SFM_2x2_GetSysCount(); /* 绯荤粺鍛ㄦ湡鍙 */ + CM_UINT32 peerLen = 0u; /* 閭绘満杈撳嚭鏍¢獙鎶ユ枃闀垮害 */ /*- 鍏ュ弬妫鏌*/ CM_ASSERT(((4 + (g_2x2oo2_data_num * 8)) <= (CM_INT32)BufSize) && (NULL != buf), IN_OUT_MODE, DARK_FAULT_CODE_FUN_ORDER_7, TSCP_DARK_ASSERT_1); @@ -1048,6 +1040,10 @@ static CM_INT32 s_2x2OutputCheckFrame_Pack(OUT CM_UINT8 *buf, IN CM_UINT32 BufSi /*浜屽彇鏍囧織鏈娇鑳*/ } } + + peerLen = SFM_2oo2_Exchange_Currency(buf, i, &buf[i], BufSize - i, ENUM_2oo2_OUTPUT_EX); + CM_RE_ASSERT(peerLen == i, IN_OUT_MODE, DARK_FAULT_CODE_FUN_ORDER_19, TSCP_DARK_ASSERT_1); + i += peerLen; /*- 杩斿洖杈撳嚭鏍¢獙鎶ユ枃闀垮害 */ return i; @@ -1918,5 +1914,43 @@ void PFM_CISendAppData(CM_UINT8* pData, CM_UINT32 dataLen) } } +/** + * @brief 杈撳嚭闃舵鐨2鍙栨牎楠 + */ +static void s_output_2oo2check(IN CM_UINT8* check_2oo2_Buf, IN CM_UINT32 check_2oo2_Len) +{ + CM_INT32 ret = 0, i = 0; + CM_UINT8 buf_peer[500] = {0u}; + CM_UINT32 offset = 0u; /* 鐢ㄤ簬鏃ュ織鎵撳嵃鏃讹紝鍒ゆ柇閫氶亾*/ + /*- 2oo2浜ゆ崲杈撳嚭鏍¢獙甯 */ + CM_ASSERT(NULL != check_2oo2_Buf, IN_OUT_MODE, DARK_FAULT_CODE_FUN_ORDER_20, TSCP_DARK_ASSERT_1); + ret = SFM_2oo2_Exchange_Currency(check_2oo2_Buf, check_2oo2_Len, buf_peer, (CM_UINT32)check_2oo2_Len, ENUM_2oo2_OUTPUT_CHECK); + /*- 妫鏌2oo2鍙屾満鐨勮緭鍑烘牎楠屽抚鏄惁涓鑷 */ + CM_RE_ASSERT(check_2oo2_Len == ret, IN_OUT_MODE, DARK_FAULT_CODE_FUN_ORDER_20, TSCP_DARK_ASSERT_2); + ret = CM_Memcmp(check_2oo2_Buf, buf_peer, (CM_SIZE_T)check_2oo2_Len); + if(0 != ret) + { + MSCP_LOG_DATALEN(check_2oo2_Buf,check_2oo2_Len,"Ouput check_2oo2_Buf"); + MSCP_LOG_DATALEN(buf_peer,check_2oo2_Len,"Ouput buf_peer"); + for (i = 1; i <= g_2x2oo2_data_num; i++) + { + if ((CM_UINT32)CM_TRUE == g_2x2oo2_tx[g_2x2oo2_base][i].b_2oo2_Enable) + { + offset = (CM_UINT32)(i - 1) * 8 + 4u; + ret = CM_Memcmp(&check_2oo2_Buf[offset], &buf_peer[offset], 8); + if(ret != 0) + { + MSCP_LOG_MSG("2oo2 output compare err, INDEX = %d, len = %d\n", i, (CM_SIZE_T)g_2x2oo2_tx[g_2x2oo2_base][i].buf_len); + MSCP_LOG_BIN(g_2x2oo2_tx[g_2x2oo2_base][i].p_buf, (CM_SIZE_T)g_2x2oo2_tx[g_2x2oo2_base][i].buf_len); + } + } + else + { + /*浜屽彇鏍囧織鏈娇鑳*/ + } + } + CM_RE_ASSERT(0, IN_OUT_MODE, DARK_FAULT_CODE_FUN_ORDER_20, TSCP_DARK_ASSERT_3); + } +} diff --git a/TSCP/src/MSCP/SFM/SFM_2x2.c b/TSCP/src/MSCP/SFM/SFM_2x2.c index 98ac872..03282e1 100644 --- a/TSCP/src/MSCP/SFM/SFM_2x2.c +++ b/TSCP/src/MSCP/SFM/SFM_2x2.c @@ -33,6 +33,9 @@ #include "stdarg.h" #include "SFM_Area.h" +#define BASE_FOLLOW_DATA_LEN (21u) /*骞冲彴璺熼殢鏁版嵁闀垮害*/ +#define BASE_FOLLOW_ALL_LEN (21u+4u) /*骞冲彴璺熼殢鏁版嵁鎬婚暱搴*/ + /*閫氫俊涓柇鏃堕棿鍜屽悓姝ヨ秴鏃舵椂闂村彲浠ョ浉鍚岋紝姝ゆ椂浼樺厛鎵ц閫氫俊涓柇鍒囩郴*/ CM_INT32 g_2x2oo2_base = 0; /**< 2x2oo2鍙岀紦鍐插尯鐨勫钩鍙扮储寮 */ @@ -66,7 +69,7 @@ static CM_UINT8 g_TxBaseFollow[SFM_FOLLOW_BUFF_SIZE]; /**< 鍙戦佺殑骞冲彴璺熼殢 static CM_INT32 g_RxAppFollow_len = 0; /**< 鏀跺埌鐨勫簲鐢ㄨ窡闅忔暟鎹暱搴 */ static CM_UINT8 g_RxAppFollow[MSCP_FOLLOW_BUFF_SIZE*2]; /**< 鏀跺埌鐨勫簲鐢ㄨ窡闅忔暟鎹姤鏂 */ static CM_INT32 g_RxAppFollowCrc_len = 0; /**< 鏀跺埌鐨勫簲鐢ㄨ窡闅忔暟鎹暱搴 */ -static CM_UINT8 g_RxAppFollowCrc[8]; /**< 鏀跺埌鐨勫簲鐢ㄨ窡闅忔暟鎹姤鏂 */ +static CM_UINT8 g_RxAppFollowCrc[12]; /**< 鏀跺埌鐨勫簲鐢ㄨ窡闅忔暟鎹姤鏂 */ CM_INT32 g_TxAppFollow_len = 0; /**< 鍙戦佺殑搴旂敤璺熼殢鏁版嵁闀垮害 */ CM_UINT8 g_TxAppFollow[MSCP_FOLLOW_BUFF_SIZE*2]; /**< 鍙戦佺殑搴旂敤璺熼殢鏁版嵁鎶ユ枃 */ @@ -116,6 +119,22 @@ static void s_Area_Transition(void); * @return ENUM_CM_TRUE-鍋滄 ENUM_CM_FALSE-鏈仠姝 * */ static ENUM_CM_RETURN s_isPulseStopped(CM_UINT8 index); +/** + * @brief 杈撳叆闃舵,涓荤郴鍙戦佸钩鍙拌窡闅忔暟鎹墠鐨2oo2姣旇緝 + */ +static void s_2x2_BaseFollow_2oo2Check_Send(void); +/** + * @brief 杈撳叆闃舵锛岄潪涓荤郴杩涜鐩稿叧CRC鏍¢獙鍚庤窡闅 + */ +static void s_2x2_BaseFollow_Sync(void); +/** + * @brief 鍛ㄦ湡鏈樁娈碉紝澶囩郴鎺ユ敹涓荤郴搴旂敤璺熼殢CRC鍚庣殑姣旇緝閫昏緫 + */ +static void s_2x2_AppFollow_SyncCheck(void); +/** + * @brief 杈撳嚭闃舵锛屽绯绘帴鏀朵富绯昏緭鍑烘暟鎹瓹RC鍚庣殑姣旇緝閫昏緫 + */ +static void s_2x2_Output_SyncCheck(IN const CM_UINT8 *CheckBuf, CM_INT32 CheckLen); /** * 缁熶竴缃垏绯绘爣蹇 */ @@ -2351,7 +2370,7 @@ static void s_2x2_Recv(void) if (ENUM_CM_TRUE == ret) { /*- 鏇存柊璺熼殢鎶ユ枃鐘舵 */ - CM_RE_ASSERT(8 <= g_RxBaseFollow_len, SFM_2x2_MODE, DARK_FAULT_CODE_FUN_ORDER_6, TSCP_DARK_ASSERT_4); + CM_RE_ASSERT(BASE_FOLLOW_ALL_LEN + 8u <= g_RxBaseFollow_len, SFM_2x2_MODE, DARK_FAULT_CODE_FUN_ORDER_6, TSCP_DARK_ASSERT_4); s_2x2_Ctrl.RxBaseFollowSysCyc = msgCyc; MSCP_LOG_MSG("2x2 RxBaseFollowCyc = %d,rcvlen = %d,Time:%d us\r\n", msgCyc,g_RxBaseFollow_len,NOW_USED_TIME); } @@ -2418,7 +2437,7 @@ static void s_2x2_Recv(void) if (ENUM_CM_TRUE == ret) { /*- 鏇存柊璺熼殢鎶ユ枃鐘舵 */ - CM_RE_ASSERT(8 == g_RxAppFollowCrc_len, SFM_2x2_MODE, DARK_FAULT_CODE_FUN_ORDER_6, TSCP_DARK_ASSERT_18); + CM_RE_ASSERT(12 == g_RxAppFollowCrc_len, SFM_2x2_MODE, DARK_FAULT_CODE_FUN_ORDER_6, TSCP_DARK_ASSERT_18); s_2x2_Ctrl.RxAppFollowSysCyc = msgCyc; MSCP_LOG_MSG("2x2 RxAppFollowCrcCyc = %d,rcvlen = %d,Time:%d us\r\n", msgCyc,g_RxAppFollowCrc_len,NOW_USED_TIME); } @@ -2607,46 +2626,37 @@ void SFM_2x2_InputProc(void) CM_INT32 ret = 0; /* 涓存椂鍙橀噺 */ CM_UINT32 sysCyc = SFM_2x2_GetSysCount(); /* 绯荤粺鍛ㄦ湡鍙 */ CM_UINT32 areaCyc = SFM_Area_GetSysCount(); /* 鍖哄煙鍛ㄦ湡鍙*/ - CM_UINT32 len_prtcl = 0u; /* 鍗忚璺熼殢鏁版嵁闀垮害 */ - CM_UINT32 len_sfprtcl = 0u; /* 鍗忚璺熼殢鏁版嵁闀垮害 */ - CM_UINT32 len_pfm = 0u; /* 骞冲彴璺熼殢鏁版嵁闀垮害 */ - CM_UINT32 offset = 0u; /* 瑙e寘鏃朵娇鐢╫ffset*/ CM_UINT64 sTick = 0u; /* 璧峰Tick */ CM_UINT64 delta_Tick = 0u; /* Tickze澧為噺 */ CM_UINT64 curTick = 0u; /* 褰撳墠Tick */ CM_UINT32 len = 0u; /* 涓存椂鍙橀噺 */ /*######################## 鍙戦佽窡闅忔暟鎹紙涓荤郴锛########################*/ PFM_CFC_Check(33); - /*- 鏈郴鏄惁涓轰富 */ - if ((ENUM_2x2_MASTER == s_2x2_Ctrl.LocalState)) + /*- 濉啓閫傞厤灞(-1)璺熼殢鏁版嵁 */ + len = SFM_GetPrtclFollowData(g_TxBaseFollow + 4, (CM_UINT32)(sizeof(g_TxBaseFollow)) - 4u); + CM_LongToChar(len, g_TxBaseFollow); + g_TxBaseFollow_len = (CM_INT32)len + 4; + /*- 濉啓鍐呯綉sfp璺熼殢鏁版嵁 */ + len = SFM_GetSfpPrtclFollowData(g_TxBaseFollow + g_TxBaseFollow_len, (CM_UINT32)(sizeof(g_TxBaseFollow)- g_TxBaseFollow_len - 4u)); + g_TxBaseFollow_len += len; + /*- 濉啓骞冲彴璺熼殢鏁版嵁 */ + CM_RE_ASSERT(g_TxBaseFollow_len <= ((CM_INT32)sizeof(g_TxBaseFollow) - BASE_FOLLOW_ALL_LEN), SFM_2x2_MODE, DARK_FAULT_CODE_FUN_ORDER_7, TSCP_DARK_ASSERT_9);/*杈撳嚭缂撳啿鑷冲皯绌洪棽8瀛楄妭*/ + CM_LongToChar(21u, g_TxBaseFollow + g_TxBaseFollow_len); + CM_LongToChar(sysCyc, g_TxBaseFollow + g_TxBaseFollow_len + 4); + CM_LongToChar(SFM_GetTxSn(), g_TxBaseFollow + g_TxBaseFollow_len + 8); + g_TxBaseFollow_len += 12; + /*- 濉啓鍖哄煙鍛ㄦ湡鍙*/ + CM_LongToChar(areaCyc, g_TxBaseFollow + g_TxBaseFollow_len); + g_TxBaseFollow_len += 4; + g_TxBaseFollow[g_TxBaseFollow_len++] = s_2x2_Ctrl.TimeSyncFlag_Area; + CM_64ToChar((CM_UINT64)s_2x2_Ctrl.AreaTimeOffset, g_TxBaseFollow + g_TxBaseFollow_len); + g_TxBaseFollow_len += 8; + /* 2鍙栨瘮杈冨悗,鑻ヤ负涓荤郴鎵ц鍙戦*/ + if(0x55u == g_PFM_Cfg.M_2oo2_Enable) { - /*- 濉啓閫傞厤灞(-1)璺熼殢鏁版嵁 */ - len = SFM_GetPrtclFollowData(g_TxBaseFollow + 4, (CM_UINT32)(sizeof(g_TxBaseFollow)) - 4u); - CM_LongToChar(len, g_TxBaseFollow); - g_TxBaseFollow_len = (CM_INT32)len + 4; - /*- 濉啓鍐呯綉sfp璺熼殢鏁版嵁 */ - len = SFM_GetSfpPrtclFollowData(g_TxBaseFollow + g_TxBaseFollow_len, (CM_UINT32)(sizeof(g_TxBaseFollow)- g_TxBaseFollow_len - 4u)); - g_TxBaseFollow_len += len; - /*- 濉啓骞冲彴璺熼殢鏁版嵁 */ - /*- 濉啓骞冲彴璺熼殢鏁版嵁 */ - CM_RE_ASSERT(g_TxBaseFollow_len <= ((CM_INT32)sizeof(g_TxBaseFollow) - 25u), SFM_2x2_MODE, DARK_FAULT_CODE_FUN_ORDER_7, TSCP_DARK_ASSERT_9);/*杈撳嚭缂撳啿鑷冲皯绌洪棽8瀛楄妭*/ - CM_LongToChar(21u, g_TxBaseFollow + g_TxBaseFollow_len); - CM_LongToChar(sysCyc, g_TxBaseFollow + g_TxBaseFollow_len + 4); - CM_LongToChar(SFM_GetTxSn(), g_TxBaseFollow + g_TxBaseFollow_len + 8); - g_TxBaseFollow_len += 12; - /*- 濉啓鍖哄煙鍛ㄦ湡鍙*/ - CM_LongToChar(areaCyc, g_TxBaseFollow + g_TxBaseFollow_len); - g_TxBaseFollow_len += 4; - g_TxBaseFollow[g_TxBaseFollow_len++] = s_2x2_Ctrl.TimeSyncFlag_Area; - CM_64ToChar((CM_UINT64)s_2x2_Ctrl.AreaTimeOffset, g_TxBaseFollow + g_TxBaseFollow_len); - g_TxBaseFollow_len += 8; - /*- 鍙戦 */ - SFM_2x2_Send(g_TxBaseFollow, (CM_UINT32)g_TxBaseFollow_len, ENUM_2x2_MSG_BASE_FOLLOW); - } - else - { - /*- 鏃犲鐞 */ + s_2x2_BaseFollow_2oo2Check_Send(); } + MSCP_LOG_MSG("timecurr 3.1 Input 2x2Send = %lld us\n", NOW_USED_TIME); /*########################2x2瀵圭郴鏁版嵁鎺ユ敹########################*/ PFM_CFC_Check(34); @@ -2730,35 +2740,9 @@ void SFM_2x2_InputProc(void) if ((ENUM_2x2_OFFLINE == s_2x2_Ctrl.LocalState) || (ENUM_2x2_SLAVE == s_2x2_Ctrl.LocalState)) { - if ((g_RxBaseFollow_len >= 12u) && (s_2x2_Ctrl.RxBaseFollowSysCyc > 0u))/*閫氳繃鏁版嵁闀垮害鍒ゆ柇鏄惁鏈夋柊鏁版嵁*/ + if ((g_RxBaseFollow_len >= BASE_FOLLOW_ALL_LEN + 8u) && (s_2x2_Ctrl.RxBaseFollowSysCyc > 0u))/*閫氳繃鏁版嵁闀垮害鍒ゆ柇鏄惁鏈夋柊鏁版嵁*/ { - offset = 0u; - /*- 閫傞厤灞傚崗璁暟鎹窡闅*/ - len_prtcl = CM_LongFromChar(g_RxBaseFollow); - CM_RE_ASSERT(len_prtcl <= ((CM_UINT32)g_RxBaseFollow_len - 4u), SFM_2x2_MODE, DARK_FAULT_CODE_FUN_ORDER_7, TSCP_DARK_ASSERT_3); - SFM_SetPrtclFollowData(g_RxBaseFollow + 4u); - - /*- sfp鍗忚鏁版嵁璺熼殢*/ - len_sfprtcl = CM_LongFromChar(g_RxBaseFollow + 4u + len_prtcl); - CM_RE_ASSERT(len_prtcl + len_sfprtcl <= ((CM_UINT32)g_RxBaseFollow_len - 8u), SFM_2x2_MODE, DARK_FAULT_CODE_FUN_ORDER_7, TSCP_DARK_ASSERT_10); - SFM_SetSfpPrtclFollowData(len_sfprtcl, g_RxBaseFollow + 4u + len_prtcl + 4u); - - /*- 骞冲彴鏁版嵁璺熼殢*/ - len_pfm = CM_LongFromChar(g_RxBaseFollow + 4u + len_prtcl + 4u + len_sfprtcl); - CM_RE_ASSERT(len_pfm == ((CM_UINT32)g_RxBaseFollow_len - len_prtcl - len_sfprtcl - 12u), SFM_2x2_MODE, DARK_FAULT_CODE_FUN_ORDER_7, TSCP_DARK_ASSERT_4); - CM_RE_ASSERT(len_pfm == 21u, SFM_2x2_MODE, DARK_FAULT_CODE_FUN_ORDER_7, TSCP_DARK_ASSERT_5); - /*姝ゅ浣跨敤涓存椂鍛ㄦ湡鍙锋帴鏀,鍦ㄥ懆鏈熸湯鍚屾*/ - offset = 12u + len_prtcl + len_sfprtcl; - s_2x2_Ctrl.SysCycSync = CM_LongFromChar(&g_RxBaseFollow[offset]); /* parasoft-suppress BD-PB-CHECKRET "姝ゅ鏃犻渶妫鏌M_LongFromChar()鐨勮繑鍥炲" */ - offset += 4u; - SFM_SetTxSn(CM_LongFromChar(&g_RxBaseFollow[offset])); - offset += 4u; - s_2x2_Ctrl.AreaCycSync = CM_LongFromChar(&g_RxBaseFollow[offset]); - offset += 4u; - s_2x2_Ctrl.TimeSyncFlag_Area = g_RxBaseFollow[offset]; - offset += 1u; - s_2x2_Ctrl.AreaTimeOffset = (CM_INT64)CM_64FromChar(&g_RxBaseFollow[offset]); - offset += 8u; + s_2x2_BaseFollow_Sync(); /*- 鏈懆鏈熸槸鍚﹁窡闅忔垚鍔 */ /*- 璁板綍鏈璺熼殢鏃堕棿 */ @@ -2826,6 +2810,8 @@ void SFM_2x2_OutputProc(IN const CM_UINT8 *CheckBuf, CM_INT32 CheckLen) { /*- 鍙戦佽緭鍑烘牎楠屽抚*/ SFM_2x2_Send(CheckBuf, (CM_UINT32)CheckLen, ENUM_2x2_MSG_OUTCHECK); + ret = CM_Memcmp(CheckBuf, CheckBuf + CheckLen / 2, CheckLen / 2); + CM_RE_ASSERT(0 == ret, SFM_2x2_MODE, DARK_FAULT_CODE_FUN_ORDER_8, TSCP_DARK_ASSERT_3); } else { @@ -2904,47 +2890,7 @@ void SFM_2x2_OutputProc(IN const CM_UINT8 *CheckBuf, CM_INT32 CheckLen) if ((sysCyc == s_2x2_Ctrl.RxCheckSysCyc) && (CheckLen == s_2x2_Ctrl.RxCheckLen)) { /*- 杩涜杈撳嚭姣旇緝 */ - ret = CM_Memcmp((const void*)CheckBuf, (void*)s_2x2_Ctrl.RxCheckFrame, (CM_SIZE_T)CheckLen); - /*- 杈撳嚭姣旇緝鏄惁涓鑷 */ - if (0 == ret) - { - /*- 鏇存柊杈撳嚭姣旇緝鐘舵 */ - s_2x2_Ctrl.LastCheckOKCount = SFM_2x2_GetSysCount(); - s_2x2_Ctrl.OutPutCheckFailFlag = 0u; - MSCP_LOG_MSG("Out Put Success!\n"); - } - else - { - /*- 鏇存柊OutPutCheckFailFlag鍒欓檷绾т负绂荤嚎,鍥犱负濡傛灉鏀跺埌杈撳嚭鏁版嵁浣嗘槸姣旇緝澶辫触,鍒欓檷涓虹绾跨姸鎬 */ - s_2x2_Ctrl.OutPutCheckFailFlag = 1u; - for(i = 0u;i < CheckLen;i++) - { - if(CheckBuf[i] == s_2x2_Ctrl.RxCheckFrame[i]) - { - - } - else - { - /*- 璺冲嚭 */ - break; - } - } - /*璁板綍鏆楁枃鏃ュ織*/ - (void)CFM_DarkLog_Multiple(DARK_LOG_HEX, TSCP_DARK_2X2_OUT_CHECK_FAIL,3u, - sizeof(CM_UINT8),s_2x2_Ctrl.OutPutCheckFailFlag, - sizeof(CM_UINT32),i, - sizeof(CM_UINT32),s_2x2_Ctrl.RxCheckSysCyc); - MSCP_LOG_MSG("Out Put failed_[%d]!\n",i); - MSCP_LOG_BIN(CheckBuf,CheckLen); - if(ENUM_2x2_SLAVE == s_2x2_Ctrl.LocalState) - { - CM_RE_ASSERT(0, SFM_2x2_MODE, DARK_FAULT_CODE_FUN_ORDER_8, TSCP_DARK_ASSERT_3); - } - else - { - /*- 鏃犲鐞 */ - } - } + s_2x2_Output_SyncCheck(CheckBuf, CheckLen); } else { @@ -3082,13 +3028,15 @@ void SFM_2x2_EndProc(void) if(ENUM_2x2_SLAVE == SFM_2x2_GetPartner2x2State()) { /*- 鍙戦佽窡闅忔暟鎹 */ - SFM_2x2_Send(g_TxAppFollow, (CM_UINT32)8, ENUM_2x2_MSG_APP_FOLLOW_CRC); + SFM_2x2_Send(g_TxAppFollow, (CM_UINT32)12, ENUM_2x2_MSG_APP_FOLLOW_CRC); + cmp_ret = CM_Memcmp(&g_TxAppFollow[0], &g_TxAppFollow[4], 4u); + CM_RE_ASSERT(0 == cmp_ret, SFM_2x2_MODE, DARK_FAULT_CODE_FUN_ORDER_9, TSCP_DARK_ASSERT_3); MSCP_LOG_MSG("Iam master partner is slave send appfollowcrc\n"); } else { - SFM_2x2_Send(g_TxAppFollow + 4, (CM_UINT32)g_TxAppFollow_len, ENUM_2x2_MSG_APP_FOLLOW); - MSCP_LOG_MSG("Iam master partner is offline send appfollow, cyc:%d, len = %d, reallen = %d\n", g_MSCP_SysCount, g_TxAppFollow_len, CM_LongFromChar(g_TxAppFollow + 4)); + SFM_2x2_Send(g_TxAppFollow + 8, (CM_UINT32)g_TxAppFollow_len, ENUM_2x2_MSG_APP_FOLLOW); + MSCP_LOG_MSG("Iam master partner is offline send appfollow\n"); } curTickTest[1] = CM_GetTick(); break; @@ -3097,19 +3045,7 @@ void SFM_2x2_EndProc(void) curTickTest[0] = CM_GetTick(); if (s_2x2_Ctrl.RxAppFollowSysCyc >= sysCyc) { - cmp_ret = CM_Memcmp(g_TxAppFollow, g_RxAppFollowCrc, 8);//濡傛灉鍚屾澶辫触 澶囩郴闄嶄负绂荤嚎 - if(0 == cmp_ret) - { - /*- 璺熼殢鏁版嵁鍜屼富绯讳竴鑷*/ - s_2x2_Ctrl.AppFollowCmpFlag = 0u; - MSCP_LOG_MSG("CRC cmp is OK\n"); - } - else - { - /*- 姣旇緝澶辫触 闄嶇绾*/ - s_2x2_Ctrl.AppFollowCmpFlag = 1u; - MSCP_LOG_MSG("CRC cmp is fail\n"); - } + s_2x2_AppFollow_SyncCheck(); } else { @@ -3347,8 +3283,9 @@ CM_UINT8 SFM_2x2_SetFollowData(IN const CM_UINT8 Data[], IN CM_UINT32 Len) g_TxAppFollow_len = (CM_INT32)CM_UNSIGNED_INT_EXP(Len + 4u); crc = CM_Crc32(Data, Len); CM_LongToChar(crc, g_TxAppFollow); - CM_LongToChar(Len, g_TxAppFollow + 4); - (void)CM_Memcpy((void*)(g_TxAppFollow + 8), sizeof(g_TxAppFollow) - 8u, Data, (CM_SIZE_T)Len); + /* 棰勭暀4瀛楄妭璁板綍鍙︿竴CPU鐨凜RC */ + CM_LongToChar(Len, g_TxAppFollow + 8); + (void)CM_Memcpy((void*)(g_TxAppFollow + 12), sizeof(g_TxAppFollow) - 12u, Data, (CM_SIZE_T)Len); rt = 1u; } else @@ -4225,4 +4162,259 @@ static CM_UINT8 s_2x2_CommNormalNum(void) } return num; +} +/** + * @brief 杈撳叆闃舵骞冲彴璺熼殢鏁版嵁鐨2oo2姣旇緝 + */ +static void s_2x2_BaseFollow_2oo2Check_Send(void) +{ + CM_UINT32 crc = 0u; + CM_UINT8 mine_buf[8u] = {0}, peer_buf[8u] = {0}; + CM_INT32 ret = 0; + /*- 璁$畻鏈満璺熼殢鏁版嵁涓崗璁儴鍒嗙殑CRC鍊 */ + crc = CM_Crc32(g_TxBaseFollow, g_TxBaseFollow_len - BASE_FOLLOW_ALL_LEN); + CM_LongToChar(g_TxBaseFollow_len, &mine_buf[0]); + CM_LongToChar(crc, &mine_buf[4]); + ret = SFM_2oo2_Exchange_Currency(mine_buf, 8u, peer_buf, 8u, ENUM_2oo2_INPUT_EX); + /*- 璁$畻瀵规満璺熼殢鏁版嵁鐨凜RC鍊 */ + CM_RE_ASSERT(ret == 8, SFM_2x2_MODE, DARK_FAULT_CODE_FUN_ORDER_23, TSCP_DARK_ASSERT_1); + /*- 姣旇緝鏈満鍜屽鏈鸿窡闅忔暟鎹殑CRC鍊 */ + if(0 != CM_Memcmp(mine_buf, peer_buf, (CM_SIZE_T)8u)) + { + MSCP_LOG_DATALEN(g_TxBaseFollow, g_TxBaseFollow_len, "PFM_InputProc g_TxBaseFollow_len"); + CM_RE_ASSERT(0, SFM_2x2_MODE, DARK_FAULT_CODE_FUN_ORDER_23, TSCP_DARK_ASSERT_2); + } + /*- 姣旇緝鎴愬姛锛屽~鍏RC鍚庡彂閫 */ + if(g_TxBaseFollow_len <= (sizeof(g_TxBaseFollow) - 4u)) + { + (void)CM_Memcpy(&g_TxBaseFollow[g_TxBaseFollow_len], sizeof(g_TxBaseFollow) - g_TxBaseFollow_len - 4u, &mine_buf[4], 4u); + g_TxBaseFollow_len += 4u; + if(s_2x2_Ctrl.LocalState == ENUM_2x2_MASTER) + { + SFM_2x2_Send(g_TxBaseFollow, (CM_UINT32)g_TxBaseFollow_len, ENUM_2x2_MSG_BASE_FOLLOW); + } + } + +} +/** + * @brief 鍛ㄦ湡鏈樁娈碉紝澶囩郴鎺ユ敹涓荤郴搴旂敤璺熼殢CRC鍚庣殑姣旇緝閫昏緫 + */ +static void s_2x2_AppFollow_SyncCheck(void) +{ + CM_UINT32 mine_crc = 0u, partner_crc1 = 0u, partner_crc2 = 0u; + static CM_UINT32 error_tolerate = 1u; + mine_crc = CM_LongFromChar(&g_TxAppFollow[0]); + partner_crc1 = CM_LongFromChar(&g_RxAppFollowCrc[0]); + partner_crc2 = CM_LongFromChar(&g_RxAppFollowCrc[4]); + + /* 涓荤郴鍙孋PU鐨凜RC涓嶄竴鑷 */ + if(partner_crc1 != partner_crc2) + { + /* 澶囩郴鏈満涓庝富绯诲叾涓竴涓狢RC涓鑷 瀹瑰繊*/ + if(mine_crc == partner_crc1 || mine_crc == partner_crc2) + { + if(error_tolerate++ >= 1u) + { + MSCP_LOG_MSG("MASTER APPFOLLOW CRC ERROR OVER TOLERATE %d\n", error_tolerate); + s_2x2_Ctrl.AppFollowCmpFlag = 1u; + } + else + { + s_2x2_Ctrl.AppFollowCmpFlag = 0u; + MSCP_LOG_MSG("MASTER APPFOLLOW CRC ERROR TOLERATE %d\n", error_tolerate); + } + } + /* 澶囩郴鏈満涓庝富绯婚兘涓嶄竴鑷 姣旇緝澶辫触瀹曟満*/ + else + { + MSCP_LOG_MSG("APPFOLLOW CRC cmp is fail 1\n"); + s_2x2_Ctrl.AppFollowCmpFlag = 1u; + CM_RE_ASSERT(0, SFM_2x2_MODE, DARK_FAULT_CODE_FUN_ORDER_24, TSCP_DARK_ASSERT_1); + } + } + /* 涓荤郴鍙孋PU鐨凜RC涓鑷 浣嗕笌澶囩郴鏈満涓嶄竴鑷 姣旇緝澶辫触*/ + else if(mine_crc != partner_crc1) + { + s_2x2_Ctrl.AppFollowCmpFlag = 1u; + MSCP_LOG_MSG("APPFOLLOW CRC cmp is fail 2\n"); + } + /* 涓荤郴鍙孋PU鐨凜RC涓鑷 涓斾笌澶囩郴鏈満涓鑷 姣旇緝鎴愬姛*/ + else + { + MSCP_LOG_MSG("APPFOLLOW CRC cmp is OK\n"); + s_2x2_Ctrl.AppFollowCmpFlag = 0u; + error_tolerate = 0u; + } + + if(1u == s_2x2_Ctrl.AppFollowCmpFlag) + { + /* 姣旇緝澶辫触鍒欒缃蹇嶆鏁板ぇ浜0锛堝彲鑳芥湰鍛ㄦ湡澶囩郴鏍¢獙閿欒闄嶄负绂荤嚎锛屼絾涓嬪懆鏈熶富绯诲け鏁堬紝瀵艰嚧澶囩郴杩涘叆瀹瑰繊鍒嗘敮锛岃涓烘牎楠屾垚鍔熷張鍗囧锛 */ + error_tolerate = ((error_tolerate >= 1u) ? error_tolerate : 1u); + MSCP_LOG_DATALEN(&g_TxAppFollow[8], g_TxAppFollow_len, "PFM_AppFollow_SyncCheck g_TxAppFollow"); + } +} +/** + * @brief 杈撳嚭闃舵锛屽绯绘帴鏀朵富绯昏緭鍑烘暟鎹瓹RC鍚庣殑姣旇緝閫昏緫 + */ +static void s_2x2_Output_SyncCheck(IN const CM_UINT8 *CheckBuf, CM_INT32 CheckLen) +{ + CM_UINT32 i = 0u; + CM_INT32 ret = -1, ret_p1p2 = -1, ret_m1p1 = -1, ret_m1p2 = -1; /* 璁板綍瀵圭郴鍙孋RC姣旇緝銆佹湰鏈哄拰瀵圭郴cpu1銆佹湰鏈哄拰瀵圭郴cpu2姣旇緝缁撴灉 */ + CM_UINT32 singleCheckLen = CheckLen / 2u; /* checkbuf璁板綍浜嗕袱涓狢PU鐨勬牎楠屼俊鎭紝闀垮害鐨勪竴鍗婁负鍗曚釜CPU鏍¢獙鏁版嵁闀垮害 */ + static CM_UINT32 error_tolerate = 1u; + CM_UINT32 offset = 0u; /* 鐢ㄤ簬鏃ュ織鎵撳嵃鏃讹紝鍒ゆ柇閫氶亾*/ + /*- 鍏ュ弬妫鏌 */ + CM_ASSERT(NULL != CheckBuf, SFM_2x2_MODE, DARK_FAULT_CODE_FUN_ORDER_25, TSCP_DARK_ASSERT_1); + /* 鎺ユ敹鐨勬牎楠屾暟鎹暱搴︽牎楠 */ + CM_RE_ASSERT(CheckLen == s_2x2_Ctrl.RxCheckLen, SFM_2x2_MODE, DARK_FAULT_CODE_FUN_ORDER_25, TSCP_DARK_ASSERT_2); + /* 姣旇緝鎺ユ敹鐨勪富绯绘牎楠屽抚涓紝涓荤郴鐨勪袱涓狢PU鐨凜RC锛岃褰曠粨鏋渞et_p1p2 */ + ret_p1p2 = CM_Memcmp((const void*)&s_2x2_Ctrl.RxCheckFrame[0], (const void*)&s_2x2_Ctrl.RxCheckFrame[singleCheckLen], (CM_SIZE_T)singleCheckLen); + /* 姣旇緝澶囩郴鏈満涓庝富绯绘煇涓涓狢PU鐨凜RC锛岃褰曠粨鏋渞et_m1p1 */ + ret_m1p1 = CM_Memcmp((const void*)CheckBuf, (const void*)&s_2x2_Ctrl.RxCheckFrame[0], (CM_SIZE_T)singleCheckLen); + /* 姣旇緝澶囩郴鏈満涓庝富绯诲彟涓涓狢PU鐨凜RC锛岃褰曠粨鏋渞et_m1p2 */ + ret_m1p2 = CM_Memcmp((const void*)CheckBuf, (const void*)&s_2x2_Ctrl.RxCheckFrame[singleCheckLen], (CM_SIZE_T)singleCheckLen); + /* 瀵圭郴锛堜富绯伙級鍙戦佺殑鍙孋PU鐨凜RC涓嶄竴鑷 */ + if(0 != ret_p1p2) + { + /* 澶囩郴鏈満涓庝富绯诲叾涓竴涓狢RC涓鑷 瀹瑰繊*/ + if(0 == ret_m1p1 || 0 == ret_m1p2) + { + if(error_tolerate++ >= 1u) + { + MSCP_LOG_MSG("MASTER OUTPUT CRC ERROR OVER TOLERATE %d\n", error_tolerate); + s_2x2_Ctrl.OutPutCheckFailFlag = 1u; + } + else + { + s_2x2_Ctrl.OutPutCheckFailFlag = 0u; + s_2x2_Ctrl.LastCheckOKCount = SFM_2x2_GetSysCount(); + MSCP_LOG_MSG("MASTER OUTPUT CRC ERROR TOLERATE %d\n", error_tolerate); + } + } + /* 澶囩郴鏈満涓庝富绯婚兘涓嶄竴鑷 姣旇緝澶辫触*/ + else + { + MSCP_LOG_MSG("OUTPUT CRC cmp is fail 1\n"); + s_2x2_Ctrl.OutPutCheckFailFlag = 1u; + } + } + /* 瀵圭郴锛堜富绯伙級鍙戦佺殑鍙孋PU鐨凜RC涓鑷达紝姣旇緝澶辫触 */ + else if(0 != ret_m1p1) + { + MSCP_LOG_MSG("OUTPUT CRC cmp is fail 2\n"); + s_2x2_Ctrl.OutPutCheckFailFlag = 1u; + for(i = 0u;i < singleCheckLen;i++) + { + if(CheckBuf[i] == s_2x2_Ctrl.RxCheckFrame[i]) + { + + } + else + { + /*- 璺冲嚭 */ + break; + } + } + /*璁板綍鏆楁枃鏃ュ織*/ + (void)CFM_DarkLog_Multiple(DARK_LOG_HEX, TSCP_DARK_2X2_OUT_CHECK_FAIL,3u, + sizeof(CM_UINT8),s_2x2_Ctrl.OutPutCheckFailFlag, + sizeof(CM_UINT32),i, + sizeof(CM_UINT32),s_2x2_Ctrl.RxCheckSysCyc); + } + /* 涓荤郴鍙孋PU鐨凜RC涓鑷 涓斾笌澶囩郴鏈満涓鑷 姣旇緝鎴愬姛*/ + else + { + MSCP_LOG_MSG("OUTPUT CRC cmp is OK\n"); + /*- 鏇存柊杈撳嚭姣旇緝鐘舵 */ + s_2x2_Ctrl.LastCheckOKCount = SFM_2x2_GetSysCount(); + s_2x2_Ctrl.OutPutCheckFailFlag = 0u; + error_tolerate = 0u; + } + /* 澶囩郴姣旇緝澶辫触瀹曟満*/ + if(1u == s_2x2_Ctrl.OutPutCheckFailFlag) + { + /* 姣旇緝澶辫触鍒欒缃蹇嶆鏁板ぇ浜0锛堝彲鑳芥湰鍛ㄦ湡澶囩郴鏍¢獙閿欒闄嶄负绂荤嚎锛屼絾涓嬪懆鏈熶富绯诲け鏁堬紝瀵艰嚧澶囩郴杩涘叆瀹瑰繊鍒嗘敮锛岃涓烘牎楠屾垚鍔熷張鍗囧锛 */ + error_tolerate = ((error_tolerate >= 1u) ? error_tolerate : 1u); + if(ENUM_2x2_SLAVE == s_2x2_Ctrl.LocalState) + { + /* 鎵撳嵃姣旇緝涓嶄竴鑷寸殑閫氶亾鏁版嵁 */ + for (i = 1; i <= g_2x2oo2_data_num; i++) + { + if ((CM_UINT32)CM_TRUE == g_2x2oo2_tx[g_2x2oo2_base][i].b_2x2_Enable) + { + offset = (CM_UINT32)(i - 1) * 8 + 4u; + ret = CM_Memcmp(CheckBuf + offset, &s_2x2_Ctrl.RxCheckFrame[offset], 8); + if(ret != 0) + { + MSCP_LOG_MSG("2x2 output compare err, INDEX = %d, len = %d\n", i, (CM_SIZE_T)g_2x2oo2_tx[g_2x2oo2_base][i].buf_len); + MSCP_LOG_BIN(g_2x2oo2_tx[g_2x2oo2_base][i].p_buf, (CM_SIZE_T)g_2x2oo2_tx[g_2x2oo2_base][i].buf_len); + } + } + else + { + /*浜屽彇鏍囧織鏈娇鑳*/ + } + } + CM_RE_ASSERT(0, SFM_2x2_MODE, DARK_FAULT_CODE_FUN_ORDER_25, TSCP_DARK_ASSERT_3); + } + } +} +/** + * @brief 杈撳叆闃舵锛岄潪涓荤郴杩涜鐩稿叧CRC鏍¢獙鍚庤窡闅 + */ +static void s_2x2_BaseFollow_Sync(void) +{ + CM_UINT32 len_prtcl = 0u; /* 鍗忚璺熼殢鏁版嵁闀垮害 */ + CM_UINT32 len_sfprtcl = 0u; /* 鍗忚璺熼殢鏁版嵁闀垮害 */ + CM_UINT32 len_pfm = 0u; /* 骞冲彴璺熼殢鏁版嵁闀垮害 */ + CM_UINT32 calcCrc = 0u, rxCrc = 0u, txCrc = 0u; /* CRC鐩稿叧鍙橀噺 */ + CM_UINT32 offset = 0u; /* 瑙e寘鐢╫ffset*/ + /*- 閫傞厤灞傚崗璁暟鎹窡闅*/ + g_RxBaseFollow_len -= 4;/*鍘婚櫎CRC鐨勯暱搴*/ + calcCrc = CM_Crc32(g_RxBaseFollow, (CM_UINT32)g_RxBaseFollow_len - BASE_FOLLOW_ALL_LEN); + offset = (CM_UINT32)g_RxBaseFollow_len; + rxCrc = CM_LongFromChar(&g_RxBaseFollow[offset]); + offset = (CM_UINT32)g_TxBaseFollow_len - 4u; + txCrc = CM_LongFromChar(&g_TxBaseFollow[offset]); + if((ENUM_2x2_SLAVE == s_2x2_Ctrl.LocalState) && (txCrc != rxCrc)) + { + /* 澶囩郴鑷繁浜х敓鐨勫钩鍙拌窡闅忔暟鎹笌涓荤郴涓嶄竴鑷达紝鍋氭棩蹇楄褰 */ + MSCP_LOG_MSG("2x2 BaseFollow CRC Err,TxCrc = %d,RxCrc = %d,Time:%d us\r\n", txCrc,rxCrc,NOW_USED_TIME); + } + /*- 姣旇緝鏀跺埌鐨勮窡闅忔暟鎹笌鍙戦佺殑璺熼殢鏁版嵁*/ + if(calcCrc == rxCrc) + { + offset = 0u; + len_prtcl = CM_LongFromChar((void*)&g_RxBaseFollow[offset]); + offset += 4u; + CM_RE_ASSERT(len_prtcl <= ((CM_UINT32)g_RxBaseFollow_len - 4u), SFM_2x2_MODE, DARK_FAULT_CODE_FUN_ORDER_26, TSCP_DARK_ASSERT_1); + SFM_SetPrtclFollowData((void*)&g_RxBaseFollow[offset]); + offset += len_prtcl; + + /*- sfp鍗忚鏁版嵁璺熼殢*/ + len_sfprtcl = CM_LongFromChar((void*)&g_RxBaseFollow[offset]); + offset += 4u; + CM_RE_ASSERT(len_prtcl + len_sfprtcl <= ((CM_UINT32)g_RxBaseFollow_len - 8u), SFM_2x2_MODE, DARK_FAULT_CODE_FUN_ORDER_26, TSCP_DARK_ASSERT_2); + SFM_SetSfpPrtclFollowData(len_sfprtcl, (void*)&g_RxBaseFollow[offset]); + offset += len_sfprtcl; + + /*- 骞冲彴鏁版嵁璺熼殢*/ + len_pfm = CM_LongFromChar((void*)&g_RxBaseFollow[offset]); + offset += 4u; + CM_RE_ASSERT(len_pfm == ((CM_UINT32)g_RxBaseFollow_len - len_prtcl - len_sfprtcl - 12u), SFM_2x2_MODE, DARK_FAULT_CODE_FUN_ORDER_26, TSCP_DARK_ASSERT_3); + CM_RE_ASSERT(len_pfm == BASE_FOLLOW_DATA_LEN, SFM_2x2_MODE, DARK_FAULT_CODE_FUN_ORDER_26, TSCP_DARK_ASSERT_4); + } + /*姝ゅ浣跨敤涓存椂鍛ㄦ湡鍙锋帴鏀,鍦ㄥ懆鏈熸湯鍚屾*/ + offset = (CM_UINT32)g_RxBaseFollow_len - BASE_FOLLOW_ALL_LEN; + offset += 4u; + s_2x2_Ctrl.SysCycSync = CM_LongFromChar(&g_RxBaseFollow[offset]); /* parasoft-suppress BD-PB-CHECKRET "姝ゅ鏃犻渶妫鏌M_LongFromChar()鐨勮繑鍥炲" */ + offset += 4u; + SFM_SetTxSn(CM_LongFromChar(&g_RxBaseFollow[offset])); + offset += 4u; + s_2x2_Ctrl.AreaCycSync = CM_LongFromChar(&g_RxBaseFollow[offset]); + offset += 4u; + s_2x2_Ctrl.TimeSyncFlag_Area = g_RxBaseFollow[offset]; + offset += 1u; + s_2x2_Ctrl.AreaTimeOffset = (CM_INT64)CM_64FromChar(&g_RxBaseFollow[offset]); + offset += 8u; } \ No newline at end of file diff --git a/TSCP/src/dqu_common/dqu_cbtc_common/dquCbtcConfigData.c b/TSCP/src/dqu_common/dqu_cbtc_common/dquCbtcConfigData.c index 6a1e017..e1bb363 100644 --- a/TSCP/src/dqu_common/dqu_cbtc_common/dquCbtcConfigData.c +++ b/TSCP/src/dqu_common/dqu_cbtc_common/dquCbtcConfigData.c @@ -55,8 +55,10 @@ UINT8 dfsInitSubSystemCommonConfigData_DG(UINT8 *pDataAddr, UINT32 dataSize, UIN #endif /*初始化[各子系统公用数据配置]-CC(要求有且仅有1行数据)*/ UINT8 dfsInitSubSystemCommonConfigData_CC(UINT8 *pDataAddr, UINT32 dataSize, UINT16 rowCount); +#if 0 /*车辆段配置数据结构体4-FAO ,互联互通与此版本一至*/ UINT8 dfsInitTrainDepotConfigData(UINT8 *pDataAddr, UINT32 dataSize, UINT16 rowCount); +#endif /* 边界计轴区段配置数据结构体 */ UINT8 dfsInitBoundaryAxleConfigData(UINT8* pDataAddr, UINT32 dataSize, UINT16 rowCount); /*初始化[出入段线脱轨防护区域表]*/ @@ -76,7 +78,7 @@ static INIT_TASK_TAB_STRU g_struInitTaskTab[]= {DQU_QFUN_TRUE, CBTC_CONFIG_DATA_ID, NULL, 5,1,0}, {DQU_QFUN_TRUE, CBTC_CONFIG_DATA_ID, dfsInitSubSystemCommonConfigData_HLT, 5,1,0}, {DQU_QFUN_TRUE, CBTC_CONFIG_DATA_ID, NULL, 5,1,0}, - {DQU_QFUN_TRUE, CBTC_CONFIG_DEPOT_ID, dfsInitTrainDepotConfigData, 5,1,0}, + {DQU_QFUN_TRUE, CBTC_CONFIG_DEPOT_ID, NULL, 5,1,0}, {DQU_QFUN_TRUE, CBTC_CONFIG_DATA_ID, dfsInitSubSystemCommonConfigData_CC, 5,1,0}, {DQU_QFUN_TRUE, CBTC_CONFIG_BOUNDARY_AXLE_ID,dfsInitBoundaryAxleConfigData, 5,1,0}, {DQU_QFUN_TRUE, CBTC_SPECIAL_EA_ID, dfsInitSpecialEaConfigData, 5,1,0}, @@ -180,10 +182,11 @@ static UINT8 initConfigCbtcInfoTaskTab(void) } else { - g_struInitTaskTab[2].bIsEffective = DQU_QFUN_FASLE;/*主线默认不执行,各子系统公用数据配置结构体3-CPK*/ - g_struInitTaskTab[3].bIsEffective = DQU_QFUN_FASLE;/*主线默认不执行,各子系统公用数据配置结构体3-FAO*/ - g_struInitTaskTab[4].bIsEffective = DQU_QFUN_FASLE;/*主线默认不执行,各子系统公用数据配置结构体3-HLT*/ - g_struInitTaskTab[5].bIsEffective = DQU_QFUN_FASLE;/*主线默认不执行,各子系统公用数据配置结构体3-DG*/ + g_struInitTaskTab[2].bIsEffective = DQU_QFUN_FASLE; /*主线默认不执行,各子系统公用数据配置结构体3-CPK*/ + g_struInitTaskTab[3].bIsEffective = DQU_QFUN_FASLE; /*主线默认不执行,各子系统公用数据配置结构体3-FAO*/ + g_struInitTaskTab[4].bIsEffective = DQU_QFUN_FASLE; /*主线默认不执行,各子系统公用数据配置结构体3-HLT*/ + g_struInitTaskTab[5].bIsEffective = DQU_QFUN_FASLE; /*主线默认不执行,各子系统公用数据配置结构体3-DG*/ + g_struInitTaskTab[6].bIsEffective = DQU_QFUN_FASLE; /*主线默认不执行,车辆段配置*/ } rtnValue = 1u; } @@ -320,10 +323,10 @@ UINT8 dfsInitTrainModelConfigData(UINT8 *pDataAddr, UINT32 dataSize, UINT16 rowC || ((0x3du == CI_SYSTEM_TYPE_RCI) && (0x10u == (UINT8)(tempTrainName >> 8u)))) { /*CI只初始化0x14类型的車,RC只初始化0x10类型的車*/ - g_pCbtcConfigDataStru->cbtcTrainTypeConfig[i].TrainName = ShortFromChar(pData); + g_pCbtcConfigDataStru->cbtcTrainTypeConfig[TrainCount].TrainName = ShortFromChar(pData); pData += 2u; - g_pCbtcConfigDataStru->cbtcTrainTypeConfig[i].TrainType = *pData; + g_pCbtcConfigDataStru->cbtcTrainTypeConfig[TrainCount].TrainType = *pData; pData += 1u; TrainCount += 1u; @@ -340,8 +343,16 @@ UINT8 dfsInitTrainModelConfigData(UINT8 *pDataAddr, UINT32 dataSize, UINT16 rowC /*nothing*/ } - g_pCbtcConfigDataStru->TrainTypeConfigLen = (UINT32)TrainCount; - rtnValue = 1u; + if (200u >= TrainCount) + { + g_pCbtcConfigDataStru->TrainTypeConfigLen = (UINT32)TrainCount; + rtnValue = 1u; + } + else + { + /*车数超过限制,返回失败*/ + rtnValue = 0U; + } } else { @@ -1086,8 +1097,7 @@ UINT8 dfsInitSubSystemCommonConfigData_CC(UINT8 *pDataAddr, UINT32 dataSize, UIN g_pCbtcConfigDataStru->cbtcConfigData.TmcOcCommunicationErrorTime = LongFromChar(pDataAddr); pDataAddr += 4u; - /*IVOC-RC通信故障判断时间(ms)*/ - g_pCbtcConfigDataStru->cbtcConfigData.IvocOcCommunicationErrorTime = LongFromChar(pDataAddr); + /*IVOC-RC通信故障判断时间(ms),跳过,使用CI-VOBC的*/ pDataAddr += 4u; /*RC-TSL通信故障判断时间(ms)*/ @@ -1109,7 +1119,7 @@ UINT8 dfsInitSubSystemCommonConfigData_CC(UINT8 *pDataAddr, UINT32 dataSize, UIN g_pCbtcConfigDataStru->cbtcConfigData.cAwakeCheckSpksSwitch = *pDataAddr; /*唤醒过程中检查SPKS状态开关*/ pDataAddr += 1U; - g_pCbtcConfigDataStru->cbtcConfigData.dwVobcCiackUpCommErrorTime = LongFromChar(pDataAddr); /*RC与IVOC后备通道通信故障判断时间*/ + /*RC与IVOC后备通道通信故障判断时间,跳过,统一使用VOBC的*/ pDataAddr += 4U; g_pCbtcConfigDataStru->cbtcConfigData.cHitSoftWallSwitch = *pDataAddr; /*撞软墙功能开关*/ @@ -1132,7 +1142,7 @@ UINT8 dfsInitSubSystemCommonConfigData_CC(UINT8 *pDataAddr, UINT32 dataSize, UIN return rtnValue; } - +#if 0 /********************************************** 函数功能:初始化[车辆段配置信息] 输入参数:pDataAddr:表数据首地址 @@ -1181,7 +1191,7 @@ UINT8 dfsInitTrainDepotConfigData(UINT8 *pDataAddr, UINT32 dataSize, UINT16 rowC } return rtnValue; } - +#endif /*-----------------------------数据查询接口函数-----------------------*/ /*设置当前查询函数据源*/ @@ -1285,7 +1295,7 @@ UINT8 dquGetCbtcConfigData (CBTC_CONFIG_DATA_STRU* pCbtcConfigDataStru) } return rtnValue; } - +#if 0 /********************************************* *函数功能:获得车辆段配置信息 *输入参数:无 @@ -1323,7 +1333,7 @@ UINT8 dquGetCbtcDepotInfo(CBTC_DEPOT_INFO_STRU *pCbtcDepotInfo, UINT16 *Length) return rtnValue; } - +#endif /********************************************** * 函数功能:初始化[边界计轴区段配置]-CC * 输入参数:pDataAddr: 表数据首地址 diff --git a/TSCP/src/dqu_common/dqu_cbtc_common/dquCbtcConfigData.h b/TSCP/src/dqu_common/dqu_cbtc_common/dquCbtcConfigData.h index ab74793..56ac14d 100644 --- a/TSCP/src/dqu_common/dqu_cbtc_common/dquCbtcConfigData.h +++ b/TSCP/src/dqu_common/dqu_cbtc_common/dquCbtcConfigData.h @@ -67,7 +67,6 @@ extern "C" { UINT32 dwLineMinTrainLength; /*系统配置数据,线路最小车长*/ UINT8 chWLSFunSwitch; /* 是否支持全线免筛功能,0x55 不支持 0xAA支持 */ UINT32 TmcOcCommunicationErrorTime; /*TMC-OC通信故障判断时间(ms),add by yt,2022年3月1日,适配车车系统配置数据*/ - UINT32 IvocOcCommunicationErrorTime; /*IVOC-OC通信故障判断时间(ms),add by yt,2022年3月1日,适配车车系统配置数据*/ UINT32 OcTslCommunicationErrorTime; /*OC-TSL通信故障判断时间(ms),add by yt,2022年3月1日,适配车车系统配置数据*/ UINT32 MaxMALength; /*线路最差情况下紧急制动距离(单位m),add by yt,2022年3月1日,适配车车系统配置数据*/ UINT8 chDynamicTestSwitch; /*是否支持动态测试开关 配置中 aa关闭 55打开*/ @@ -153,10 +152,10 @@ extern "C" { CBTC_TRAIN_INFO_STRU cbtcTrainInfo[10]; /*列车性能参数配置结构体数组,初始化函数完成填充*/ UINT32 TrainInfoLen; /*数组长度*/ - +#if 0 CBTC_DEPOT_INFO_STRU cbtcDepotInfo[10]; /*车辆段配置信息结构体数组,初始化函数完成填充*/ UINT32 DepotConfigLen; /*数组长度*/ - +#endif CBTC_CONFIG_DATA_STRU cbtcConfigData; /*各子系统公用数据配置结构体数组,初始化函数完成填充*/ CBTC_BOUNDARY_AXLE_CONFIG_STRU cbtcBoundaryAxleInfo[100]; /*边界计轴区段配置信息结构体数组,初始化函数完成填充*/ @@ -199,7 +198,7 @@ extern "C" { /*获取各子系统公用数据配置表*/ UINT8 dquGetCbtcConfigData (CBTC_CONFIG_DATA_STRU* pCbtcConfigDataStru); - +#if 0 /* 函数功能:获得车辆段配置信息 输入参数:无 @@ -207,7 +206,7 @@ extern "C" { Length配置信息数量 返回值: 0失败 1成功 */ UINT8 dquGetCbtcDepotInfo(CBTC_DEPOT_INFO_STRU *pCbtcDepotInfo, UINT16 *Length); - +#endif #ifdef __cplusplus } diff --git a/TSCP/src/dqu_common/dqu_emap_common/dquEmapInit.c b/TSCP/src/dqu_common/dqu_emap_common/dquEmapInit.c index a9c0b9e..b8b3781 100644 --- a/TSCP/src/dqu_common/dqu_emap_common/dquEmapInit.c +++ b/TSCP/src/dqu_common/dqu_emap_common/dquEmapInit.c @@ -86,6 +86,48 @@ UINT16 wMiddleLinkId[MIDDLE_LINK_MAX_NUM]; ************************************/ static UINT8 AxleSgmtStru_CC(); +/*根据版本配置数据处理过程函数 +**修改记录: +**1、依据互联互通数据结构V18.0.0修改,m by sds 20200211 +**2、修改不需要初始化的表格信息项 m by sds 2020-8-19 +**3、增加车车初始化的表格信息 m by qw.liu 2022-2-22 +*/ +static UINT8 initConfigEmapTaskTab(); + +/********************************************* +*函数功能:进路表数据结构 +*参数说明:无 +*返回值:0,失败;1,成功 +UINT16 wIncludeAxleSgmtNum; 进路包含的计轴区段数目 +UINT16 wIncludeAxleSgmtId[8]; 包含的计轴区段编号 +UINT16 wAxleSgmtLockStatus[8]; 包含的计轴区段锁闭状态 + +UINT16 wObsNum; 进路包含障碍物数目 +UINT16 wObsType[8]; 障碍物类型 +UINT16 wObsID[8]; 障碍物ID +UINT16 wObsNeedLockStatus[8]; 障碍物需要联锁状态 +备注:内部调用函数,合库、燕房、单轨使用 +*********************************************/ +static UINT8 RouteStru_DFT(); + +/********************************************* +*函数功能:进路表数据结构 +*参数说明:无 +*返回值:0,失败;1,成功 +UINT16 wIncludeAxleSgmtNum; 进路包含的计轴区段数目 +UINT16 wIncludeAxleSgmtId[8]; 包含的计轴区段编号 +UINT16 wAxleSgmtLockStatus[8]; 包含的计轴区段锁闭状态 + +UINT16 wObsNum; 进路包含障碍物数目 +UINT16 wObsType[8]; 障碍物类型 +UINT16 wObsID[8]; 障碍物ID +UINT16 wObsNeedLockStatus[8]; 障碍物需要联锁状态 +备注:内部调用函数,互联互通使用 +修改记录: +1、更新进路范围内CBTC接近区段的范围判断 使用宏值信息替代,防止遗忘更新,不修复编码规范问题 m by sds 2020-8-21 +*********************************************/ +static UINT8 RouteStru_CC(); + /* 函数功能:删除数组中重复的数,内部使用函数 参数说明:输入参数:input 输入数组;len 输入数组大小; @@ -93,7 +135,7 @@ static UINT8 AxleSgmtStru_CC(); 返回值:去重后数组的长度 author: qxt 20180716 */ -static UINT8 RemoveRep(UINT16 input[],UINT8 len,UINT16 output[]); +static UINT16 RemoveRep(UINT16 input[],UINT16 len,UINT16 output[]); /*----------内部函数声明结束--------------*/ @@ -577,7 +619,6 @@ void SetFilterStopPointAttr(UINT32 filterAttr) UINT8 dfsEmapInitExp(UINT8 *pDataBuf,DSU_EMAP_STRU *dsuEmapStru,DSU_STC_LIMIT_LINKIDX_STRU *dsuLimitStcLinkIdx,UINT8 mode,UINT16 timeSlice) { UINT32 DataID=0U; - UINT16 wPos=0U; UINT8 rtnValue=2U; UINT16 wFreqTimes=0U; UINT8 bExeState=DQU_QFUN_FASLE; @@ -6402,7 +6443,6 @@ static UINT8 LogicSgmtStru_CC(void) { UINT16 ii = UINT16_MAX; /*循环变量*/ UINT16 jj = UINT16_MAX; /*循环变量*/ - UINT16 nn = UINT16_MAX; /*循环变量*/ UINT16 kk = UINT16_MAX; DSU_LOGIC_SGMT_STRU * pTempLogicSgmtStru = NULL; /*临时变量*/ DSU_AXLE_SGMT_STRU *pTempAxleSgmtStru = NULL; /*临时变量*/ @@ -6547,7 +6587,7 @@ static UINT8 LogicSgmtStru_CC(void) if ((UINT32_MAX != dwLen) && (MAX_LOGSEC_INCLUDE_LINK_NUM >= wlinkNum)) { - linkInfo.cLinkCnt = wlinkNum; + linkInfo.cLinkCnt = (UINT8)wlinkNum; for (mm = 0U; mm < wlinkNum; mm++) { @@ -7957,7 +7997,6 @@ UINT8 GetPointInfoFromAccessLink(UINT16 AccessLinkId, UINT16 Dirction, UINT16* DSU_CBTC_ACCESS_LINK_STRU* pCBTCAccessLinkStru=NULL; /*临时变量*/ UINT16 i, j = 0; /*循环变量*/ DSU_LOGIC_SGMT_STRU* pLogicSgmtStru=NULL; /*临时变量*/ - DSU_AXLE_SGMT_STRU* pAxleSgmtStru=NULL; /*临时变量--计轴区段*/ UINT8 rtnValue = 0U; /*电子地图数据*/ @@ -12497,13 +12536,10 @@ UINT8 initRC(UINT8 *pDataAddr, UINT32 dataSize, UINT16 rowCount) UINT8 rtnValue = 2U; UINT8 *pData = NULL; UINT8 initFlag = 0U; - UINT8 checkFlag = 0U; DSU_CI_STRU *pCurrentStru = NULL; /*结构体临时指针变量*/ DSU_CI_STRU stru = { 0 }; /*结构体临时指针变量*/ UINT16 j = 0U; static UINT32 rowDataLen = 0U; - UINT16 wStruDataLen = 0U; - UINT16 wDataIndexLen = 0U; /*电子地图数据*/ DSU_EMAP_INDEX_STRU *dsuEmapIndexStru = NULL; @@ -12552,6 +12588,70 @@ UINT8 initRC(UINT8 *pDataAddr, UINT32 dataSize, UINT16 rowCount) initFlag = EmapInitFunStepCtrl(0x02); if ((2U == rtnValue) && (DQU_QFUN_TRUE == initFlag)) + { + /*降低复杂度*/ + rtnValue = initRCSndStep(dsuEmapIndexStru, dsuStaticHeadStru, dsuDataLenStru); + } + + initFlag = EmapInitFunStepCtrl(0x03); + if ((2U == rtnValue) && (DQU_QFUN_TRUE == initFlag)) + { + /*解析数据到 结构体数组 */ + for (j = g_struInitTaskTab[g_wCurInitStruProg].wCurInitPos; j < dsuDataLenStru->wRCLen; j++) + { + pCurrentStru = dsuStaticHeadStru->pRCStruStru + j; + + pData = pDataAddr + rowDataLen*j; + /*填充数据结构体*/ + initFlag = RC_STRU_init(pData, pCurrentStru); + if (0U == initFlag) + { + /*init函数参数空指针*/ + rtnValue = 0U; + } + else + { + /*完成对应填充索引*/ + dsuEmapIndexStru->dsuRCIndex[pCurrentStru->wIndex] = j; + initFlag = EmapInitLoopStepLenCtrl(j); + } + /*循环分步切割处理*/ + if ((0U == rtnValue) || (DQU_QFUN_TRUE == initFlag)) + { + break; + } + } + + if ((0U != rtnValue) && (j == dsuDataLenStru->wRCLen)) + { + rtnValue = 1; + } + } + + return rtnValue; +} + +/********************************************** +函数功能:初始化[电子地图-RC表信息]:计算索引---拆分复杂度使用 +输入参数:无 +输出参数: +电子地图数据 +DSU_EMAP_INDEX_STRU *dsuEmapIndexStru +DSU_STATIC_HEAD_STRU *dsuStaticHeadStru +DSU_DATA_LEN_STRU *dsuDataLenStru +返回值:2处理中,0失败 +**********************************************/ +UINT8 initRCSndStep(DSU_EMAP_INDEX_STRU *dsuEmapIndexStru, DSU_STATIC_HEAD_STRU *dsuStaticHeadStru, DSU_DATA_LEN_STRU *dsuDataLenStru) +{ + UINT8 rtnValue = 2U; + UINT16 wStruDataLen = 0; + UINT16 wDataIndexLen = 0; + UINT8 checkFlag = 0U; + if ((NULL == dsuEmapIndexStru) || (NULL == dsuStaticHeadStru) || (NULL == dsuDataLenStru)) + { + rtnValue = 0U; + } + else { if (0x01 == g_IsEmapAllocMemory) { @@ -12608,42 +12708,6 @@ UINT8 initRC(UINT8 *pDataAddr, UINT32 dataSize, UINT16 rowCount) } } } - - initFlag = EmapInitFunStepCtrl(0x03); - if ((2U == rtnValue) && (DQU_QFUN_TRUE == initFlag)) - { - /*解析数据到 结构体数组 */ - for (j = g_struInitTaskTab[g_wCurInitStruProg].wCurInitPos; j < dsuDataLenStru->wRCLen; j++) - { - pCurrentStru = dsuStaticHeadStru->pRCStruStru + j; - - pData = pDataAddr + rowDataLen*j; - /*填充数据结构体*/ - initFlag = RC_STRU_init(pData, pCurrentStru); - if (0U == initFlag) - { - /*init函数参数空指针*/ - rtnValue = 0U; - } - else - { - /*完成对应填充索引*/ - dsuEmapIndexStru->dsuRCIndex[pCurrentStru->wIndex] = j; - initFlag = EmapInitLoopStepLenCtrl(j); - } - /*循环分步切割处理*/ - if ((0U == rtnValue) || (DQU_QFUN_TRUE == initFlag)) - { - break; - } - } - - if ((0U != rtnValue) && (j == dsuDataLenStru->wRCLen)) - { - rtnValue = 1; - } - } - return rtnValue; } @@ -16032,12 +16096,9 @@ UINT8 GetDeviceInfoInLink() DSU_LINK_STRU *pLinkStru=NULL; /*Link临时变量结结构体*/ DSU_SIGNAL_STRU *pSignalStru=NULL; /*信号机临时变量结构体*/ - DSU_BALISE_STRU *pBaliseStru=NULL; /*应答器临时变量结结构体*/ DSU_SCREEN_STRU *pScreenStru=NULL; /*安全屏蔽门临时变量结结构体*/ DSU_EMERG_STOP_STRU *pESBStru=NULL;/*紧急停车按钮临时变量结结构体*/ DSU_STATION_STRU *pStationStru=NULL;/*停车区域临时变量结结构体*/ - DSU_STOPPOINT_STRU *pStopPointStru=NULL;/*停车点临时变量结结构体*/ - DSU_PLAT_FORM_STRU *pPlatformStru=NULL;/*站台临时变量结结构体*/ DSU_DEVICE_IN_LINK_STRU *pTempDeviceStru=NULL; @@ -16564,29 +16625,29 @@ UINT8 GetGradeInfoCrossLink() 返回值:去重后数组的长度 author: qxt 20180716 */ -static UINT8 RemoveRep(UINT16 input[],UINT8 len,UINT16 output[]) +static UINT16 RemoveRep(UINT16 input[],UINT16 len,UINT16 output[]) { - UINT8 i=0U , j=0U; - UINT8 flag=1;/*重复标记,1代表无重复,0代表有重复*/ - UINT8 count=0U;/*返回值*/ + UINT16 i=0U , j=0U; + UINT8 flag=1U;/*重复标记,1代表无重复,0代表有重复*/ + UINT16 count=0U;/*返回值*/ /*参数检查*/ - if (len>0) + if (0U < len) { output[count++]=input[0];/*先给数组的第一个值赋值*/ - for (i=1;iwRouteType = ShortFromChar(pData); + pRouteStru->dwRouteType = ShortFromChar(pData); pData += 2; /*起始信号机编号*/ @@ -1884,77 +1884,77 @@ static UINT8 ROUTE_STRU_init_HLT(UINT8 * pDataAdd, DSU_ROUTE_STRU * pRouteStru) if((NULL != pDataAdd) && (NULL != pRouteStru)) { UINT8 * pData = pDataAdd; - UINT8 i=0U; + UINT16 i=0U; static UINT8 runCount=0U;/*执行该函数的次数 用于判定是否为第一次进入*/ - static UINT8 maxBlocAccessLinkNum=MAX_BLOC_ACCESS_LINK_NUM;/*进路包含的实际点式接近区段最大数量*/ - static UINT8 maxCBTCAccessLinkNum=MAX_BLOC_ACCESS_LINK_NUM;/*进路包含的实际CBTC接近区段最大数量*/ - static UINT8 maxBlocTRGAreLinkNum=MAX_BLOC_ACCESS_LINK_NUM;/*进路包含的实际点式触发区段最大数量*/ + static UINT16 maxBlocAccessLinkNum=MAX_BLOC_ACCESS_LINK_NUM;/*进路包含的实际点式接近区段最大数量*/ + static UINT16 maxCBTCAccessLinkNum=MAX_BLOC_ACCESS_LINK_NUM;/*进路包含的实际CBTC接近区段最大数量*/ + static UINT16 maxBlocTRGAreLinkNum=MAX_BLOC_ACCESS_LINK_NUM;/*进路包含的实际点式触发区段最大数量*/ /*进路ID*/ pRouteStru->wId = ShortFromChar(pData); - pData += 2; + pData += 2U; /*进路名称*/ - for (i = 0; i<24; i++) + for (i = 0U; i< 24U; i++) { pRouteStru->szCaption[i] = *pData; - pData += 1; + pData += 1U; } /*进路性质*/ - pRouteStru->wRouteType = ShortFromChar(pData); - pData += 2; + pRouteStru->dwRouteType = ShortFromChar(pData); + pData += 2U; /*起始信号机编号*/ pRouteStru->wStartSignalId = ShortFromChar(pData); - pData += 2; + pData += 2U; /*终止信号机编号*/ pRouteStru->wEndSignalId = ShortFromChar(pData); - pData += 2; + pData += 2U; /*起点所处link编号*/ /*新增---严广学*/ pRouteStru->wOrgnLkId = ShortFromChar(pData); - pData += 2; + pData += 2U; /*终点所处link编号*/ /*新增---严广学*/ pRouteStru->wTmnlLkId = ShortFromChar(pData); - pData += 2; + pData += 2U; /*包含道岔数目*/ pRouteStru->wIncludePointNum = ShortFromChar(pData); - pData += 2; + pData += 2U; - for (i = 0; i<16; i++) + for (i = 0U; i<16U; i++) { /*道岔编号*/ pRouteStru->wPointId[i] = ShortFromChar(pData); - pData += 2; + pData += 2U; /*道岔状态*/ pRouteStru->wPointStatus[i] = ShortFromChar(pData); - pData += 2; + pData += 2U; } /*保护区段数目*/ pRouteStru->wProtectLinkNum = ShortFromChar(pData); - pData += 2; + pData += 2U; - for (i = 0; i<4; i++) + for (i = 0U; i<4U; i++) { /*保护区段编号*/ pRouteStru->wProtectLinkId[i] = ShortFromChar(pData); - pData += 2; + pData += 2U; /*保护区段关联道岔编号*/ pRouteStru->wProtectLinkRelatePointId[i] = ShortFromChar(pData); - pData += 2; + pData += 2U; /*保护区段关联道岔状态*/ pRouteStru->wProtectLinkRelatePointStatus[i] = ShortFromChar(pData); - pData += 2; + pData += 2U; } @@ -1967,20 +1967,20 @@ static UINT8 ROUTE_STRU_init_HLT(UINT8 * pDataAdd, DSU_ROUTE_STRU * pRouteStru) /* 获取点式接近区段数目 */ pRouteStru->wBlogAccessLinkNum = ShortFromChar(pData); maxBlocAccessLinkNum = ShortFromChar(pData); - pData += 2; + pData += 2U; /* 根据获取到的点式接近区段数目进行数据填充 */ - for (i = 0; iwBlogAccessLinkNum; i++) + for (i = 0U; iwBlogAccessLinkNum; i++) { pRouteStru->wBlogAccessLinkId[i] = ShortFromChar(pData); - pData += 2; + pData += 2U; } /*获取CBTC接近区段数目*/ - for (i = 0; iwCBTCAccessLinkNum = ShortFromChar(pData); - pData += 2; + pData += 2U; /* 不断读取数据,丢弃无效值,直到读取到正确的值时,退出 */ if ((pRouteStru->wCBTCAccessLinkNum != DSU_NULL_16) @@ -1998,17 +1998,17 @@ static UINT8 ROUTE_STRU_init_HLT(UINT8 * pDataAdd, DSU_ROUTE_STRU * pRouteStru) } /* 根据获取到的CBTC接近区段数目进行数据填充 */ - for (i = 0; iwCBTCAccessLinkNum; i++) + for (i = 0U; iwCBTCAccessLinkNum; i++) { pRouteStru->wCBTCAccessLinkId[i] = ShortFromChar(pData); - pData += 2; + pData += 2U; } /*所属CI区域编号*/ - for (i = 0; iwManageCI = ShortFromChar(pData); - pData += 2; + pData += 2U; /* 不断读取数据,丢弃无效值,直到读取到正确的值时,退出 */ if (pRouteStru->wManageCI != DSU_NULL_16) @@ -2024,26 +2024,26 @@ static UINT8 ROUTE_STRU_init_HLT(UINT8 * pDataAdd, DSU_ROUTE_STRU * pRouteStru) /*进路属性*/ pRouteStru->wAttribute = ShortFromChar(pData); - pData += 2; + pData += 2U; /*点式触发区段数量 */ pRouteStru->wBlocTrgAreaNum = ShortFromChar(pData); maxBlocTRGAreLinkNum = ShortFromChar(pData); - pData += 2; + pData += 2U; /*点式触发区段ID*/ - for (i = 0; iwBlocTrgAreaNum; i++) + for (i = 0U; iwBlocTrgAreaNum; i++) { pRouteStru->wBlocTrgAreaId[i] = ShortFromChar(pData); - pData += 2; + pData += 2U; } /*cbtc触发区段数量 */ - for (i = 0; iwCbtcTrgAreaNum = ShortFromChar(pData); - pData += 2; + pData += 2U; /* 不断读取数据,丢弃无效值,直到读取到正确的值时,退出 */ if ((pRouteStru->wCbtcTrgAreaNum != DSU_NULL_16) @@ -2059,10 +2059,10 @@ static UINT8 ROUTE_STRU_init_HLT(UINT8 * pDataAdd, DSU_ROUTE_STRU * pRouteStru) } /*cbtc触发区段ID*/ - for (i = 0; iwCbtcTrgAreaNum; i++) + for (i = 0U; iwCbtcTrgAreaNum; i++) { pRouteStru->wCbtcTrgAreaId[i] = ShortFromChar(pData); - pData += 2; + pData += 2U; } /*执行次数+1*/ @@ -2073,58 +2073,58 @@ static UINT8 ROUTE_STRU_init_HLT(UINT8 * pDataAdd, DSU_ROUTE_STRU * pRouteStru) /* 获取点式接近区段数目 */ pRouteStru->wBlogAccessLinkNum = ShortFromChar(pData); - pData += 2; + pData += 2U; /* 根据获取到的点式接近区段数目进行数据填充 */ - for (i = 0; iwBlogAccessLinkId[i] = ShortFromChar(pData); - pData += 2; + pData += 2U; } /*获取CBTC接近区段数目*/ pRouteStru->wCBTCAccessLinkNum = ShortFromChar(pData); - pData += 2; + pData += 2U; /* 根据获取到的CBTC接近区段数目进行数据填充 */ - for (i = 0; iwCBTCAccessLinkId[i] = ShortFromChar(pData); - pData += 2; + pData += 2U; } /*所属CI区域编号*/ pRouteStru->wManageCI = ShortFromChar(pData); - pData += 2; + pData += 2U; /*进路属性*/ pRouteStru->wAttribute = ShortFromChar(pData); - pData += 2; + pData += 2U; /*点式触发区段数量 */ pRouteStru->wBlocTrgAreaNum = ShortFromChar(pData); - pData += 2; + pData += 2U; /*点式触发区段ID*/ - for (i = 0; iwBlocTrgAreaId[i] = ShortFromChar(pData); - pData += 2; + pData += 2U; } /*cbtc触发区段数量 */ pRouteStru->wCbtcTrgAreaNum = ShortFromChar(pData); - pData += 2; + pData += 2U; /*cbtc触发区段ID-依据实际数量进行数据获取*/ - for (i = 0; iwCbtcTrgAreaNum; i++) + for (i = 0U; iwCbtcTrgAreaNum; i++) { pRouteStru->wCbtcTrgAreaId[i] = ShortFromChar(pData); - pData += 2; + pData += 2U; } } - rtnValue = 1; + rtnValue = 1U; } return rtnValue; } @@ -2148,7 +2148,7 @@ static UINT8 ROUTE_STRU_init_CPK(UINT8 * pDataAdd, DSU_ROUTE_STRU * pRouteStru) } /*进路性质*/ - pRouteStru->wRouteType = ShortFromChar(pData); + pRouteStru->dwRouteType = ShortFromChar(pData); pData += 2; /*起始信号机编号*/ @@ -2268,78 +2268,90 @@ static UINT8 ROUTE_STRU_init_CPK(UINT8 * pDataAdd, DSU_ROUTE_STRU * pRouteStru) static UINT8 ROUTE_STRU_init_CC(UINT8 * pDataAdd, DSU_ROUTE_STRU * pRouteStru) { UINT8 * pData = pDataAdd; - UINT8 i = 0; - static UINT8 runCount = 0;/*执行该函数的次数 用于判定是否为第一次进入*/ - static UINT8 maxCBTCAccessLinkNum = MAX_CBTC_ACCESS_LINK_NUM;/*进路包含的实际CBTC接近区段最大数量*/ - static UINT8 maxBLOCAccessLinkNum = MAX_BLOC_ACCESS_LINK_NUM;/*进路包含的实际点式接近区段最大数量*/ + UINT16 i = 0U; + static UINT8 runCount = 0U;/*执行该函数的次数 用于判定是否为第一次进入*/ + static UINT16 maxCBTCAccessLinkNum = MAX_CBTC_ACCESS_LINK_NUM;/*进路包含的实际CBTC接近区段最大数量*/ + static UINT16 maxBLOCAccessLinkNum = MAX_BLOC_ACCESS_LINK_NUM;/*进路包含的实际点式接近区段最大数量*/ UINT8 reval = 0U;/*初始赋值为失败*/ + UINT8 chDataType = 0U; + chDataType = GetLocalPublicDataType(); /*区分分支,与主线*/ + /*输入参数空指针防护*/ if ((NULL != pDataAdd) && (NULL != pRouteStru)) { pRouteStru->wId = ShortFromChar(pData); - pData += 2; + pData += 2U; /*进路名称*/ - for (i = 0; i < 24; i++) + for (i = 0U; i < 24U; i++) { pRouteStru->szCaption[i] = *pData; - pData += 1; + pData += 1U; } /*进路性质*/ - pRouteStru->wRouteType = ShortFromChar(pData); - pData += 2; + if (0x01 == chDataType) + { + /*主线扩大字段*/ + pRouteStru->dwRouteType = LongFromChar(pData); + pData += 4U; + } + else + { + pRouteStru->dwRouteType = ShortFromChar(pData); + pData += 2U; + } /*起始信号机编号*/ pRouteStru->wStartSignalId = ShortFromChar(pData); - pData += 2; + pData += 2U; /*终止信号机编号*/ pRouteStru->wEndSignalId = ShortFromChar(pData); - pData += 2; + pData += 2U; /*起点所处link编号*/ /*新增---严广学*/ pRouteStru->wOrgnLkId = ShortFromChar(pData); - pData += 2; + pData += 2U; /*终点所处link编号*/ /*新增---严广学*/ pRouteStru->wTmnlLkId = ShortFromChar(pData); - pData += 2; + pData += 2U; /*包含道岔数目*/ pRouteStru->wIncludePointNum = ShortFromChar(pData); - pData += 2; + pData += 2U; - for (i = 0; i < 16; i++) + for (i = 0U; i < 16U; i++) { /*道岔编号*/ pRouteStru->wPointId[i] = ShortFromChar(pData); - pData += 2; + pData += 2U; /*道岔状态*/ pRouteStru->wPointStatus[i] = ShortFromChar(pData); - pData += 2; + pData += 2U; } /*保护区段数目*/ pRouteStru->wProtectLinkNum = ShortFromChar(pData); - pData += 2; + pData += 2U; - for (i = 0; i < 4; i++) + for (i = 0U; i < 4U; i++) { /*保护区段编号*/ pRouteStru->wProtectLinkId[i] = ShortFromChar(pData); - pData += 2; + pData += 2U; /*保护区段关联道岔编号*/ pRouteStru->wProtectLinkRelatePointId[i] = ShortFromChar(pData); - pData += 2; + pData += 2U; /*保护区段关联道岔状态*/ pRouteStru->wProtectLinkRelatePointStatus[i] = ShortFromChar(pData); - pData += 2; + pData += 2U; } /* 程序中"CBTC接近区段数目"为固定值,导致一旦数据表中数据增加就要修改代码,为优化此问题修改结构体添充逻辑, by cgh 2023-4-14 */ @@ -2348,7 +2360,7 @@ static UINT8 ROUTE_STRU_init_CC(UINT8 * pDataAdd, DSU_ROUTE_STRU * pRouteStru) { /*点式接近区段数目*/ pRouteStru->wBlogAccessLinkNum = ShortFromChar(pData); - pData += 2; + pData += 2U; if (MAX_BLOC_ACCESS_LINK_NUM >= pRouteStru->wBlogAccessLinkNum) { @@ -2356,17 +2368,17 @@ static UINT8 ROUTE_STRU_init_CC(UINT8 * pDataAdd, DSU_ROUTE_STRU * pRouteStru) maxBLOCAccessLinkNum = pRouteStru->wBlogAccessLinkNum; /*点式接近区段编号*/ - for (i = 0; i < pRouteStru->wBlogAccessLinkNum; i++) + for (i = 0U; i < pRouteStru->wBlogAccessLinkNum; i++) { pRouteStru->wBlogAccessLinkId[i] = ShortFromChar(pData); - pData += 2; + pData += 2U; } /*获取CBTC接近区段数目*/ - for (i = 0; i < MAX_BLOC_ACCESS_LINK_NUM; i++) + for (i = 0U; i < MAX_BLOC_ACCESS_LINK_NUM; i++) { pRouteStru->wCBTCAccessLinkNum = ShortFromChar(pData); - pData += 2; + pData += 2U; /* 不断读取数据,丢弃无效值,直到读取到正确的值时,退出 */ if (pRouteStru->wCBTCAccessLinkNum != DSU_NULL_16) @@ -2386,17 +2398,17 @@ static UINT8 ROUTE_STRU_init_CC(UINT8 * pDataAdd, DSU_ROUTE_STRU * pRouteStru) maxCBTCAccessLinkNum = pRouteStru->wCBTCAccessLinkNum; /* 根据获取到的CBTC接近区段数目进行数据填充 */ - for (i = 0; i < pRouteStru->wCBTCAccessLinkNum; i++) + for (i = 0U; i < pRouteStru->wCBTCAccessLinkNum; i++) { pRouteStru->wCBTCAccessLinkId[i] = ShortFromChar(pData); - pData += 2; + pData += 2U; } /*所属CI区域编号*/ - for (i = 0; i < MAX_CBTC_ACCESS_LINK_NUM; i++) + for (i = 0U; i < MAX_CBTC_ACCESS_LINK_NUM; i++) { pRouteStru->wManageCI = ShortFromChar(pData); - pData += 2; + pData += 2U; /* 不断读取数据,丢弃无效值,直到读取到正确的值时,退出 */ if (pRouteStru->wManageCI != DSU_NULL_16) @@ -2411,20 +2423,20 @@ static UINT8 ROUTE_STRU_init_CC(UINT8 * pDataAdd, DSU_ROUTE_STRU * pRouteStru) } /*进路属性*/ pRouteStru->wAttribute = ShortFromChar(pData); - pData += 2; + pData += 2U; /*cbtc触发区段数量 */ pRouteStru->wCbtcTrgAreaNum = ShortFromChar(pData); - pData += 2; + pData += 2U; if (MAX_CBTC_TRG_AREA_NUM >= pRouteStru->wCbtcTrgAreaNum) { /*CBTC触发区段数量合法,继续读取*/ - for (i = 0; i < pRouteStru->wCbtcTrgAreaNum; i++) + for (i = 0U; i < pRouteStru->wCbtcTrgAreaNum; i++) { /*cbtc触发区段ID*/ pRouteStru->wCbtcTrgAreaId[i] = ShortFromChar(pData); - pData += 2; + pData += 2U; } reval = 1U; /*数据均合法,返回成功*/ @@ -2446,55 +2458,55 @@ static UINT8 ROUTE_STRU_init_CC(UINT8 * pDataAdd, DSU_ROUTE_STRU * pRouteStru) { /*点式接近区段数目*/ pRouteStru->wBlogAccessLinkNum = ShortFromChar(pData); - pData += 2; + pData += 2U; if (MAX_BLOC_ACCESS_LINK_NUM >= pRouteStru->wBlogAccessLinkNum) { /*点式接近区段数量合法,继续读取*/ - for (i = 0; i < maxBLOCAccessLinkNum; i++) + for (i = 0U; i < maxBLOCAccessLinkNum; i++) { /*点式接近区段编号*/ pRouteStru->wBlogAccessLinkId[i] = ShortFromChar(pData); - pData += 2; + pData += 2U; } /*CBTC接近区段数目*/ pRouteStru->wCBTCAccessLinkNum = ShortFromChar(pData); - pData += 2; + pData += 2U; if (MAX_CBTC_ACCESS_LINK_NUM >= pRouteStru->wCBTCAccessLinkNum) { /*CBTC接近区段数量合法,继续读取*/ - for (i = 0; i < maxCBTCAccessLinkNum; i++) + for (i = 0U; i < maxCBTCAccessLinkNum; i++) { /*CBTC接近区段编号*/ pRouteStru->wCBTCAccessLinkId[i] = ShortFromChar(pData); - pData += 2; + pData += 2U; } /*所属CI区域编号*/ pRouteStru->wManageCI = ShortFromChar(pData); - pData += 2; + pData += 2U; /*进路属性*/ pRouteStru->wAttribute = ShortFromChar(pData); - pData += 2; + pData += 2U; #if 0 /*点式触发区段数量 */ pRouteStru->wBlocTrgAreaNum = ShortFromChar(pData); - pData += 2; + pData += 2U; /*点式触发区段ID*/ - for (i = 0; i < 13; i++) + for (i = 0U; i < 13; i++) { pRouteStru->wBlocTrgAreaId[i] = ShortFromChar(pData); - pData += 2; + pData += 2U; } #endif /*cbtc触发区段数量 */ pRouteStru->wCbtcTrgAreaNum = ShortFromChar(pData); - pData += 2; + pData += 2U; if (MAX_CBTC_TRG_AREA_NUM < pRouteStru->wCbtcTrgAreaNum) { @@ -2504,10 +2516,10 @@ static UINT8 ROUTE_STRU_init_CC(UINT8 * pDataAdd, DSU_ROUTE_STRU * pRouteStru) else { /*cbtc触发区段ID*/ - for (i = 0; i < pRouteStru->wCbtcTrgAreaNum; i++) + for (i = 0U; i < pRouteStru->wCbtcTrgAreaNum; i++) { pRouteStru->wCbtcTrgAreaId[i] = ShortFromChar(pData); - pData += 2; + pData += 2U; } reval = 1U; /*数据均合法,返回成功*/ @@ -3492,7 +3504,11 @@ static UINT8 CI_STRU_init_CC(UINT8 * pDataAdd, DSU_CI_STRU * pCIStru) pCIStru->chCldAndScxMergeFlag = *pData; pData += 1U; - rtnValue = 1; + /*联锁厂商定义*/ + pCIStru->chCiFactoryType = *pData; + pData += 1U; + + rtnValue = 1U; } return rtnValue; } @@ -4171,8 +4187,8 @@ UINT8 DSU_FLOOD_GATE_STRU_init(UINT8 * pDataAdd, DSU_FLOOD_GATE_STRU * pFloodGat { UINT8 rtnValue = 0U; static UINT8 runCount = 0U;/*执行该函数的次数 用于判定是否为第一次进入*/ - static UINT8 maxProtectAxisNum = MAX_PROTECT_AXIS_NUM;/*进路包含的实际点式接近区段最大数量*/ - UINT8 i = 0; + static UINT16 maxProtectAxisNum = MAX_PROTECT_AXIS_NUM;/*进路包含的实际点式接近区段最大数量*/ + UINT16 i = 0U; UINT8 chDataType = gLocalPublicDataType; /*输入参数空指针防护*/ if ((NULL != pDataAdd) && (NULL != pFloodGateStru)) diff --git a/TSCP/src/dqu_common/dqu_emap_common/dsuStruct.h b/TSCP/src/dqu_common/dqu_emap_common/dsuStruct.h index c6a5d90..0d93e59 100644 --- a/TSCP/src/dqu_common/dqu_emap_common/dsuStruct.h +++ b/TSCP/src/dqu_common/dqu_emap_common/dsuStruct.h @@ -502,7 +502,7 @@ typedef struct DSU_RouteStruct { UINT16 wId; /*编号*/ CHAR szCaption [24]; /*进路名称*/ - UINT16 wRouteType; /*进路性质*/ + UINT32 dwRouteType; /*进路性质*/ UINT16 wStartSignalId; /*起始信号机编号*/ UINT16 wEndSignalId; /*终止信号机编号*/ UINT16 wOrgnLkId; /*起点所处link编号*/ /*新增---严广学*/ @@ -755,6 +755,7 @@ typedef struct DSU_CIStruct UINT8 cWLScreenType; /* 全线免筛有效属性 0x55无效 0xAA有效 */ UINT32 dwLocalShareCheckData; /*与本控区RC/CI校验信息----20250827北京10需求新增 */ UINT8 chCldAndScxMergeFlag;/*试车线与车辆段合设开关*/ + UINT8 chCiFactoryType; /*联锁厂商定义*/ }DSU_CI_STRU; @@ -933,7 +934,7 @@ typedef struct DSU_SpksButton UINT16 wManageCI; /*所属CI区域编号*/ UINT16 wManageVirCI; /*所属虚拟CI区域编号*/ /* 以下项在数据代码分离项目中,从数据文件中删除,它的值需要动态计算---祁晓婷 */ - UINT8 wLinkNum;/*包含LINK数量*/ + UINT16 wLinkNum;/*包含LINK数量*/ UINT16 wIncLinkId[SPKS_INCLUDE_LINK_NUM];/*包含LINK编号*/ UINT16 wPlatFormId; /*站台ID*/ }DSU_SPKS_BUTTON_STRU; diff --git a/TSCP/src/dqu_common/dqu_idmap_common/dquIdmapInit.c b/TSCP/src/dqu_common/dqu_idmap_common/dquIdmapInit.c index 4725c3f..85cd96b 100644 --- a/TSCP/src/dqu_common/dqu_idmap_common/dquIdmapInit.c +++ b/TSCP/src/dqu_common/dqu_idmap_common/dquIdmapInit.c @@ -86,10 +86,10 @@ UINT8 dfsIdmapInit(CHAR * FSName) /*28.0.0.14不具备RC/IVOC编号对照表*/ funcRtn = dquGetPublicFSVersion(FSName, szFSPUBVersionFS); funcRtn &= CheckTiocPublicFsVersion(szFSPUBVersionFS); - if (NULL!=g_dsuIdmapStru) + if (NULL != g_dsuIdmapStru) { /*初始化一次就行了*/ - if (dfsIdmapInitFlag == 1) + if (1U == dfsIdmapInitFlag) { rtnValue = 1U; return rtnValue; @@ -110,7 +110,7 @@ UINT8 dfsIdmapInit(CHAR * FSName) } else { - rtnValue = 0U;; + rtnValue = 0U; } @@ -125,7 +125,7 @@ UINT8 dfsIdmapInit(CHAR * FSName) } else { - rtnValue = 0U;; + rtnValue = 0U; } @@ -140,7 +140,7 @@ UINT8 dfsIdmapInit(CHAR * FSName) } else { - rtnValue = 0U;; + rtnValue = 0U; } @@ -213,7 +213,6 @@ UINT8 dfsIdmapInit(CHAR * FSName) UINT8 dfsIdmapInitExp(UINT8 * pDataBuf,DSU_IDMAP_STRU *dsuIdmapStru,UINT8 mode,UINT16 timeSlice) { UINT32 DataID; - UINT16 wPos=0U; UINT8 rtnValue=0U; UINT16 wFreqTimes=0U; UINT8 bExeState=DQU_QFUN_FASLE; @@ -793,13 +792,10 @@ UINT8 initRCNum(UINT8 *pDataAddr, UINT32 dataSize, UINT16 rowCount) UINT8 rtnValue = 2U; UINT8 *pData = NULL; UINT8 initFlag = 0U; - UINT8 checkFlag = 0U; DSU_CI_NUM_STRU *pCurrentStru = NULL; /*结构体临时指针变量*/ DSU_CI_NUM_STRU stru = { 0 }; /*结构体临时指针变量*/ UINT16 j = 0U; static UINT32 rowDataLen = 0; - UINT16 wStruDataLen = 0; - UINT16 wDataIndexLen = 0; /*编号对照表数据*/ DSU_IDMAP_INDEX_STRU *dsuIdmapIndexStru = NULL; @@ -848,6 +844,68 @@ UINT8 initRCNum(UINT8 *pDataAddr, UINT32 dataSize, UINT16 rowCount) initFlag = IdmapInitFunStepCtrl(0x02); if ((2U == rtnValue) && (DQU_QFUN_TRUE == initFlag)) + { + /*降低复杂度*/ + rtnValue = initRCNumSndStep(dsuIdmapLenStru, dsuIdmapIndexStru, dsuStaticIdmapStru); + } + + initFlag = IdmapInitFunStepCtrl(0x03); + if ((2U == rtnValue) && (DQU_QFUN_TRUE == initFlag)) + { + /*解析数据到结构体数组 */ + for (j = g_struInitTaskTab[g_wCurInitStruProg].wCurInitPos; j < dsuIdmapLenStru->wRCNumLen; j++) + { + pCurrentStru = dsuStaticIdmapStru->pRCNumStru + j; + + pData = pDataAddr + rowDataLen*j; + /*填充数据结构体*/ + initFlag = CINumStru_init(pData, pCurrentStru); + if (0U == initFlag) + { + /*init函数参数空指针*/ + rtnValue = 0U;; + } + else + { + /*完成对应填充索引*/ + dsuIdmapIndexStru->dsuRCNumIndex[pCurrentStru->wIndexId] = j; + initFlag = IdmapInitLoopStepLenCtrl(j); + } + /*循环分步切割处理*/ + if ((0U == initFlag) || (DQU_QFUN_TRUE == initFlag)) + { + break; + } + } + + if ((0U != rtnValue) && (j == dsuIdmapLenStru->wRCNumLen)) + { + rtnValue = 1; + } + } + + return rtnValue; +} + +/********************************************** +函数功能:初始化[编号对照表-RC]:计算索引--拆圈复杂度使用 +输出参数: +DSU_IDMAP_INDEX_STRU *dsuIdmapIndexStru +DSU_STATIC_IDMAP_STRU *dsuStaticIdmapStru +DSU_IDMAP_LEN_STRU *dsuIdmapLenStru +返回值:2处理中 0失败 +**********************************************/ +UINT8 initRCNumSndStep(DSU_IDMAP_LEN_STRU *dsuIdmapLenStru, DSU_IDMAP_INDEX_STRU *dsuIdmapIndexStru, DSU_STATIC_IDMAP_STRU *dsuStaticIdmapStru) +{ + UINT8 rtnValue = 2U; + UINT16 wStruDataLen = 0; + UINT16 wDataIndexLen = 0; + UINT8 checkFlag = 0U; + if ((NULL == dsuIdmapIndexStru) || (NULL == dsuStaticIdmapStru) || (NULL == dsuIdmapLenStru)) + { + rtnValue = 0U; + } + else { if (0x01 == g_IsIdmapAllocMemory) { @@ -904,42 +962,6 @@ UINT8 initRCNum(UINT8 *pDataAddr, UINT32 dataSize, UINT16 rowCount) } } } - - initFlag = IdmapInitFunStepCtrl(0x03); - if ((2U == rtnValue) && (DQU_QFUN_TRUE == initFlag)) - { - /*解析数据到结构体数组 */ - for (j = g_struInitTaskTab[g_wCurInitStruProg].wCurInitPos; j < dsuIdmapLenStru->wRCNumLen; j++) - { - pCurrentStru = dsuStaticIdmapStru->pRCNumStru + j; - - pData = pDataAddr + rowDataLen*j; - /*填充数据结构体*/ - initFlag = CINumStru_init(pData, pCurrentStru); - if (0U == initFlag) - { - /*init函数参数空指针*/ - rtnValue = 0U;; - } - else - { - /*完成对应填充索引*/ - dsuIdmapIndexStru->dsuRCNumIndex[pCurrentStru->wIndexId] = j; - initFlag = IdmapInitLoopStepLenCtrl(j); - } - /*循环分步切割处理*/ - if ((0U == initFlag) || (DQU_QFUN_TRUE == initFlag)) - { - break; - } - } - - if ((0U != rtnValue) && (j == dsuIdmapLenStru->wRCNumLen)) - { - rtnValue = 1; - } - } - return rtnValue; } @@ -2414,13 +2436,10 @@ UINT8 initIvocNum(UINT8 *pDataAddr, UINT32 dataSize, UINT16 rowCount) UINT8 rtnValue = 2U; UINT8 *pData = NULL; UINT8 initFlag = 0U; - UINT8 checkFlag = 0U; DSU_VOBC_NUM_STRU *pCurrentStru = NULL; /*结构体临时指针变量*/ DSU_VOBC_NUM_STRU stru = { 0 }; /*结构体临时指针变量*/ UINT16 j = 0U; static UINT32 rowDataLen = 0; - UINT16 wStruDataLen = 0; - UINT16 wDataIndexLen = 0; /*编号对照表数据*/ DSU_IDMAP_INDEX_STRU *dsuIdmapIndexStru = NULL; @@ -2469,6 +2488,68 @@ UINT8 initIvocNum(UINT8 *pDataAddr, UINT32 dataSize, UINT16 rowCount) initFlag = IdmapInitFunStepCtrl(0x02); if ((2U == rtnValue) && (DQU_QFUN_TRUE == initFlag)) + { + rtnValue = initIvocNumSndStep(dsuIdmapIndexStru, dsuStaticIdmapStru, dsuIdmapLenStru); + } + + initFlag = IdmapInitFunStepCtrl(0x03); + if ((2U == rtnValue) && (DQU_QFUN_TRUE == initFlag)) + { + /*解析数据到结构体数组 */ + for (j = g_struInitTaskTab[g_wCurInitStruProg].wCurInitPos; j < dsuIdmapLenStru->wIvocNumLen; j++) + { + pCurrentStru = dsuStaticIdmapStru->pIvocNumStru + j; + + pData = pDataAddr + rowDataLen*j; + /*填充数据结构体*/ + initFlag = VOBCNumStru_init(pData, pCurrentStru); + if (0U == initFlag) + { + /*init函数参数空指针*/ + rtnValue = 0U;; + } + else + { + /*完成对应填充索引*/ + dsuIdmapIndexStru->dsuIvocNumIndex[pCurrentStru->wIndexId] = j; + initFlag = IdmapInitLoopStepLenCtrl(j); + } + /*循环分步切割处理*/ + if ((0U == rtnValue) || (DQU_QFUN_TRUE == initFlag)) + { + break; + } + } + + if ((0U != rtnValue) && (j == dsuIdmapLenStru->wIvocNumLen)) + { + rtnValue = 1; + } + } + + return rtnValue; +} + +/********************************************** +函数功能:初始化[编号对照表IVOC]:计算索引----拆分复杂度使用 +输出参数: +编号对照表数据 +DSU_IDMAP_INDEX_STRU *dsuIdmapIndexStru; +DSU_STATIC_IDMAP_STRU *dsuStaticIdmapStru; +DSU_IDMAP_LEN_STRU *dsuIdmapLenStru; +返回值:2处理中,0失败 +**********************************************/ +UINT8 initIvocNumSndStep(DSU_IDMAP_INDEX_STRU *dsuIdmapIndexStru,DSU_STATIC_IDMAP_STRU *dsuStaticIdmapStru,DSU_IDMAP_LEN_STRU *dsuIdmapLenStru) +{ + UINT8 rtnValue = 2U; + UINT16 wStruDataLen = 0; + UINT16 wDataIndexLen = 0; + UINT8 checkFlag = 0U; + if ((NULL == dsuIdmapIndexStru) || (NULL == dsuStaticIdmapStru) || (NULL == dsuIdmapLenStru)) + { + rtnValue = 0U; + } + else { if (0x01 == g_IsIdmapAllocMemory) { @@ -2483,7 +2564,7 @@ UINT8 initIvocNum(UINT8 *pDataAddr, UINT32 dataSize, UINT16 rowCount) else { /*初始化为0xFF*/ - (void)CommonMemSet(dsuIdmapIndexStru->dsuIvocNumIndex,(UINT32)(dsuIdmapIndexStru->IVOCNUMINDEXSIZE * 2 + 2),0xFF, (UINT32)(dsuIdmapIndexStru->IVOCNUMINDEXSIZE * 2 + 2)); + (void)CommonMemSet(dsuIdmapIndexStru->dsuIvocNumIndex, (UINT32)(dsuIdmapIndexStru->IVOCNUMINDEXSIZE * 2 + 2), 0xFF, (UINT32)(dsuIdmapIndexStru->IVOCNUMINDEXSIZE * 2 + 2)); } if (2U == rtnValue) @@ -2525,42 +2606,6 @@ UINT8 initIvocNum(UINT8 *pDataAddr, UINT32 dataSize, UINT16 rowCount) } } } - - initFlag = IdmapInitFunStepCtrl(0x03); - if ((2U == rtnValue) && (DQU_QFUN_TRUE == initFlag)) - { - /*解析数据到结构体数组 */ - for (j = g_struInitTaskTab[g_wCurInitStruProg].wCurInitPos; j < dsuIdmapLenStru->wIvocNumLen; j++) - { - pCurrentStru = dsuStaticIdmapStru->pIvocNumStru + j; - - pData = pDataAddr + rowDataLen*j; - /*填充数据结构体*/ - initFlag = VOBCNumStru_init(pData, pCurrentStru); - if (0U == initFlag) - { - /*init函数参数空指针*/ - rtnValue = 0U;; - } - else - { - /*完成对应填充索引*/ - dsuIdmapIndexStru->dsuIvocNumIndex[pCurrentStru->wIndexId] = j; - initFlag = IdmapInitLoopStepLenCtrl(j); - } - /*循环分步切割处理*/ - if ((0U == rtnValue) || (DQU_QFUN_TRUE == initFlag)) - { - break; - } - } - - if ((0U != rtnValue) && (j == dsuIdmapLenStru->wIvocNumLen)) - { - rtnValue = 1; - } - } - return rtnValue; } @@ -4658,9 +4703,7 @@ UINT8 initIteNum(UINT8* pDataAddr, UINT32 dataSize, UINT16 rowCount) UINT8* pData = NULL; UINT8 initFlag = 0U; UINT8 checkFlag = 0U; - DSU_ITE_NUM_STRU* pCurrentStru = NULL; /*结构体临时指针变量*/ DSU_ITE_NUM_STRU stru = { 0U }; /*结构体临时指针变量*/ - UINT16 j = 0U; static UINT32 rowDataLen = 0U; UINT16 wStruDataLen = 0U; UINT16 wDataIndexLen = 0U; diff --git a/TSCP/src/dqu_common/dqu_idmap_common/dquIdmapInit.h b/TSCP/src/dqu_common/dqu_idmap_common/dquIdmapInit.h index 86bdce0..2d7023a 100644 --- a/TSCP/src/dqu_common/dqu_idmap_common/dquIdmapInit.h +++ b/TSCP/src/dqu_common/dqu_idmap_common/dquIdmapInit.h @@ -84,6 +84,16 @@ rowCount: **********************************************/ UINT8 initRCNum(UINT8 *pDataAddr, UINT32 dataSize, UINT16 rowCount); +/********************************************** +函数功能:初始化[编号对照表-RC]:计算索引--拆圈复杂度使用 +输出参数: +DSU_IDMAP_INDEX_STRU *dsuIdmapIndexStru +DSU_STATIC_IDMAP_STRU *dsuStaticIdmapStru +DSU_IDMAP_LEN_STRU *dsuIdmapLenStru +返回值:2处理中 0失败 +**********************************************/ +UINT8 initRCNumSndStep(DSU_IDMAP_LEN_STRU *dsuIdmapLenStru, DSU_IDMAP_INDEX_STRU *dsuIdmapIndexStru, DSU_STATIC_IDMAP_STRU *dsuStaticIdmapStru); + /********************************************** 函数功能:初始化[ATS]:计算索引 输入参数:pDataAddr:表数据首地址 @@ -184,6 +194,17 @@ rowCount: **********************************************/ UINT8 initIvocNum(UINT8 *pDataAddr, UINT32 dataSize, UINT16 rowCount); +/********************************************** +函数功能:初始化[编号对照表IVOC]:计算索引----拆分复杂度使用 +输出参数: +编号对照表数据 +DSU_IDMAP_INDEX_STRU *dsuIdmapIndexStru; +DSU_STATIC_IDMAP_STRU *dsuStaticIdmapStru; +DSU_IDMAP_LEN_STRU *dsuIdmapLenStru; +返回值:2处理中,0失败 +**********************************************/ +UINT8 initIvocNumSndStep(DSU_IDMAP_INDEX_STRU *dsuIdmapIndexStru, DSU_STATIC_IDMAP_STRU *dsuStaticIdmapStru, DSU_IDMAP_LEN_STRU *dsuIdmapLenStru); + /********************************************** 函数功能:初始化[防淹门]:计算索引 输入参数:pDataAddr:表数据首地址 diff --git a/TSCP/src/dqu_common/dqu_idmap_common/dquIdmapQuery.h b/TSCP/src/dqu_common/dqu_idmap_common/dquIdmapQuery.h index d1efd69..82a5423 100644 --- a/TSCP/src/dqu_common/dqu_idmap_common/dquIdmapQuery.h +++ b/TSCP/src/dqu_common/dqu_idmap_common/dquIdmapQuery.h @@ -380,6 +380,14 @@ UINT16 dquGetIvocIndex(UINT16 dataPos); ***************************************************/ UINT8 dquQueryOutAxleDevId(UINT16 devIndex, UINT32 szOutDevId[2U]); +/************************************************** +*函数功能:获取数据库中VOBC编号表的结构体的数量 +*输入参数:无 +*输出参数:无 +*返 回 值:VOBC编号表的结构体的数量 +***************************************************/ +UINT16 dquGetVobcNumLen(void); + #ifdef __cplusplus } #endif diff --git a/TSCP/src/protocol/fsfb/common_fsfb/FsfbMessageInfo.c b/TSCP/src/protocol/fsfb/common_fsfb/FsfbMessageInfo.c index 58eadb7..4733fee 100644 --- a/TSCP/src/protocol/fsfb/common_fsfb/FsfbMessageInfo.c +++ b/TSCP/src/protocol/fsfb/common_fsfb/FsfbMessageInfo.c @@ -977,18 +977,26 @@ static UINT8 CreateTsdOrSbtMsg(const UINT8* pAppData, UINT16 DataLen, UINT8 appl ret = 1u; /*-< 锟斤拷锟矫猴拷锟斤拷锟斤拷锟斤拷值为锟缴癸拷*/ break; /*-< 锟剿筹拷*/ case APPLCAT_TDM: /*-< TD锟斤拷锟斤拷*/ - *outPutDataLen = TSD_SIZE; /*-< 锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷莩锟斤拷锟*/ /*锟斤拷路状态锟斤拷锟斤拷*/ pPNode->FsfbLinInfo.RecvLinkStatus = Fsfb_WaitSse; /*-< 锟斤拷锟矫斤拷锟斤拷锟斤拷路状态为锟斤拷SSE*/ /* 锟斤拷锟斤拷TSD帧头 */ SetFsfbMsgHead(applyCat, FSFB_TSD_MSG, pPNode->FsfbLinInfo.sendSrcAdd, pPNode->FsfbLinInfo.sendDestAdd, OutTsdOrSbtMsg); /*-< 锟斤拷锟矫猴拷锟斤拷锟斤拷锟斤拷TSD帧头*/ /*锟叫讹拷锟斤拷锟捷筹拷锟斤拷锟角凤拷为TSD 锟斤拷锟斤拷锟捷筹拷锟斤拷 */ - if (DataLen != TSD_DF_SIZE) /*-< 锟斤拷锟捷筹拷锟饺达拷锟斤拷*/ + if ((TSD_DF_SIZE != DataLen) && (TSD_DF_TWO_SIZE != DataLen)) /*-< 锟斤拷锟捷筹拷锟饺达拷锟斤拷*/ { ret = 0u; /*-< 锟斤拷锟矫猴拷锟斤拷锟斤拷锟斤拷值为失锟斤拷*/ } else { + if ((TSD_DF_SIZE == DataLen)) + { + (*outPutDataLen) = TSD_SIZE; /*-< 锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷莩锟斤拷锟*/ + } + else + { + (*outPutDataLen) = TSD_TWO_SIZE; /*-< 锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷莩锟斤拷锟*/ + } + ret = 1u; /*-< 锟斤拷锟矫猴拷锟斤拷锟斤拷锟斤拷值为锟缴癸拷*/ } break; /*-< 锟剿筹拷*/ diff --git a/TSCP/src/protocol/fsfb/common_fsfb/FsfbProtcl.c b/TSCP/src/protocol/fsfb/common_fsfb/FsfbProtcl.c index a43e1b9..55df05c 100644 --- a/TSCP/src/protocol/fsfb/common_fsfb/FsfbProtcl.c +++ b/TSCP/src/protocol/fsfb/common_fsfb/FsfbProtcl.c @@ -706,6 +706,7 @@ static UINT8 FsfbStructInit(FSFB_INFO_STRU* pFsfbStruct) } else { + ComMemSet(pFsfbStruct->AppArray, sizeof(UINT8) * pFsfbStruct->AppArraySize, 0U); /*-< 锟斤拷锟斤拷锟斤拷锟斤拷锟*/ LongToChar(0, pFsfbStruct->AppArray); /*-< 锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷槌わ拷锟轿0*/ } @@ -720,6 +721,7 @@ static UINT8 FsfbStructInit(FSFB_INFO_STRU* pFsfbStruct) } else { + ComMemSet(pFsfbStruct->VarArray, sizeof(UINT8) * pFsfbStruct->VarArraySize, 0U); /*-< 锟斤拷锟斤拷锟叫硷拷锟斤拷锟斤拷锟斤拷锟*/ ShortToChar(0u, pFsfbStruct->VarArray); /*-< 锟斤拷锟斤拷锟叫硷拷锟斤拷锟斤拷锟斤拷槌わ拷锟轿0*/ } diff --git a/TSCP/src/protocol/fsfb/common_fsfb/FsfbProtclConfigMessage.h b/TSCP/src/protocol/fsfb/common_fsfb/FsfbProtclConfigMessage.h index 1a49282..ee86911 100644 --- a/TSCP/src/protocol/fsfb/common_fsfb/FsfbProtclConfigMessage.h +++ b/TSCP/src/protocol/fsfb/common_fsfb/FsfbProtclConfigMessage.h @@ -35,6 +35,7 @@ /* 消息帧长度 */ #define TSD_SIZE 58 +#define TSD_TWO_SIZE (74U) /*扩充后TSD长度*/ #define SSE_SIZE 20 #define SSR_SIZE 25 #define SBT_SIZE 138 @@ -45,6 +46,7 @@ /* 报文data feild Size */ #define TSD_DF_SIZE 36 +#define TSD_DF_TWO_SIZE (52U) /*扩充后TSD_DF长度*/ #define BTC_DF_SIZE 8 #define SBT_DF_SIZE 116 #define ABT_DF_SIZE 0 diff --git a/TSCP/src/protocol/fsfb/common_fsfb/FsfbRecordDelare.h b/TSCP/src/protocol/fsfb/common_fsfb/FsfbRecordDelare.h index b22288c..c42065f 100644 --- a/TSCP/src/protocol/fsfb/common_fsfb/FsfbRecordDelare.h +++ b/TSCP/src/protocol/fsfb/common_fsfb/FsfbRecordDelare.h @@ -1,15 +1,15 @@ /******************************************************** * -* 文件名 : FsfbRecordDelare.h -* 版权说明: 北京交控科技有限工司 -* 版本号 : 1.0 -* 创建时间: 2013.09.09 -* 作者 : 王佩佩 -* 功能描述: FSFB协议记录相关宏定义。 -* 使用注意: +* 锟侥硷拷锟紽sfbRecordDelare.hare.h +* 锟斤拷权说锟斤拷锟斤拷 锟斤拷锟斤拷锟斤拷锟截科硷拷锟斤拷锟睫癸拷司 +* 锟芥本锟斤拷 锟斤拷 1.0 +* 锟斤拷锟斤拷时锟戒: 2013.09.09 +* 锟斤拷锟斤拷 锟斤拷 锟斤拷锟斤拷锟斤拷 +* 锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷 FSFB协锟斤拷锟铰硷拷锟截宏定锟藉。 +* 使锟斤拷注锟解: * -* 修改记录: -* 2010.05.10 修改 追加FSFB新周期开始标识。 +* 锟睫改硷拷录锟斤拷 +* 2010.05.10 锟睫革拷 追锟斤拷FSFB锟斤拷锟斤拷锟节匡拷始锟斤拷识锟斤拷 * ********************************************************/ @@ -19,93 +19,93 @@ /******************************************************************************** -宏定义 +锟疥定锟斤拷 ********************************************************************************/ -/* 各个标志位 */ -#define FSFB_CYCLE_TAG (0xF4FB) /* FSFB新周期开始标识 */ -#define IN_RED (0x01) /*输入红网处理*/ -#define IN_BLUE (0x02) /*输入蓝网处理*/ -#define IN_FRAME_LEN_ERR (0x03) /*输入数据帧长度错误*/ -#define IN_READ_FRAME_ERR (0x04) /*读取数据帧长度错误*/ -#define IN_READ_FRAME (0x05) /*读取数据帧*/ -#define IN_CRC_ERR (0x06) /*CRC错误*/ -#define IN_NO_LNK (0x07) /*无链路*/ -#define IN_CAT_ERR (0x08) /*输入帧种类错误*/ -#define IN_ADDR_ERR (0x09) /*输入帧种类错误*/ -#define IN_SSR_STATUS_ERR (0x0A) /*输入SSR收状态错误*/ -#define IN_SSR_SSE_TC_ERR (0x0B) /*输入SSR的SSE序号错误*/ -#define IN_ABT_STATUS (0x0C) /*输入ABT收状态*/ -#define IN_ABT_SVC_ERR (0x0D) /*输入ABT的SVC错误*/ -#define IN_ABT_OLD_ERR (0x0E) /*输入ABT旧序号错误*/ -#define IN_ABT_SSE_BTC (0x0F) /*输入ABT发SSE或BTC*/ -#define IN_BTD_LEN_ERR (0x10) /*输入BTD的长度错误*/ -#define IN_BTD_STATUS (0x11) /*输入BTD收状态*/ -#define IN_BTD_LOST_ERR (0x12) /*输入BTD丢失超容忍*/ -#define IN_BTD_DELAY_ERR (0x13) /*输入BTD延迟超容忍*/ -#define IN_BTD_SVC_ERR (0x14) /*输入BTD的SVC错误*/ -#define OUT_APP (0x15) /*输出数据*/ -#define OUT_FRAME_LEN_ERR (0x16) /*输出应用帧数据长度错误*/ -#define OUT_READ_ERR (0x17) /*输出读应用数据错误*/ -#define OUT_APP_FRAME (0x18) /*输出应用帧数据*/ -#define OUT_FRAME_TYPE_ERR (0x19) /*输出帧类型错误*/ -#define OUT_ADDR_ERR (0x1A) /*输出地址错误*/ -#define OUT_FIND_LNK_ERR (0x1B) /*输出查询链路错误*/ -#define OUT_INSERT_NODE_ERR (0x1C) /*输出插入节点错误*/ -#define OUT_INIT_NODE_ERR (0x1D) /*输出初始化节点错误*/ -#define OUT_DATA_TYPE (0x1E) /*输出数据类型*/ -#define OUT_LNK (0x1F) /*输出链路*/ -#define OUT_RP_LNK (0x20) /*输出RP链路*/ -#define OUT_ALL_LEN_ERR (0x21) /*输出数据总长度错误*/ +/* 锟斤拷锟斤拷锟斤拷志位 */ +#define FSFB_CYCLE_TAG (0xF4FB) /* FSFB锟斤拷锟斤拷锟节匡拷始锟斤拷识 */ +#define IN_RED (0x01) /*锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟*/ +#define IN_BLUE (0x02) /*锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷*/ +#define IN_FRAME_LEN_ERR (0x03) /*锟斤拷锟斤拷锟斤拷锟斤拷帧锟斤拷锟饺达拷锟斤拷*/ +#define IN_READ_FRAME_ERR (0x04) /*锟斤拷取锟斤拷锟斤拷帧锟斤拷锟饺达拷锟斤拷*/ +#define IN_READ_FRAME (0x05) /*锟斤拷取锟斤拷锟斤拷帧*/ +#define IN_CRC_ERR (0x06) /*CRC锟斤拷锟斤拷*/ +#define IN_NO_LNK (0x07) /*锟斤拷锟斤拷路*/ +#define IN_CAT_ERR (0x08) /*锟斤拷锟斤拷帧锟斤拷锟斤拷锟斤拷锟*/ +#define IN_ADDR_ERR (0x09) /*锟斤拷锟斤拷帧锟斤拷锟斤拷锟斤拷锟*/ +#define IN_SSR_STATUS_ERR (0x0A) /*锟斤拷锟斤拷SSR锟斤拷状态锟斤拷锟斤拷*/ +#define IN_SSR_SSE_TC_ERR (0x0B) /*锟斤拷锟斤拷SSR锟斤拷SSE锟斤拷糯锟斤拷锟*/ +#define IN_ABT_STATUS (0x0C) /*锟斤拷锟斤拷ABT锟斤拷状态*/ +#define IN_ABT_SVC_ERR (0x0D) /*锟斤拷锟斤拷ABT锟斤拷SVC锟斤拷锟斤拷*/ +#define IN_ABT_OLD_ERR (0x0E) /*锟斤拷锟斤拷ABT锟斤拷锟斤拷糯锟斤拷锟*/ +#define IN_ABT_SSE_BTC (0x0F) /*锟斤拷锟斤拷ABT锟斤拷SSE锟斤拷BTC*/ +#define IN_BTD_LEN_ERR (0x10) /*锟斤拷锟斤拷BTD锟侥筹拷锟饺达拷锟斤拷*/ +#define IN_BTD_STATUS (0x11) /*锟斤拷锟斤拷BTD锟斤拷状态*/ +#define IN_BTD_LOST_ERR (0x12) /*锟斤拷锟斤拷BTD锟斤拷失锟斤拷锟斤拷锟斤拷*/ +#define IN_BTD_DELAY_ERR (0x13) /*锟斤拷锟斤拷BTD锟接迟筹拷锟斤拷锟斤拷*/ +#define IN_BTD_SVC_ERR (0x14) /*锟斤拷锟斤拷BTD锟斤拷SVC锟斤拷锟斤拷*/ +#define OUT_APP (0x15) /*锟斤拷锟斤拷锟斤拷锟*/ +#define OUT_FRAME_LEN_ERR (0x16) /*锟斤拷锟接︼拷锟街★拷锟斤拷莩锟斤拷却锟斤拷锟*/ +#define OUT_READ_ERR (0x17) /*锟斤拷锟斤拷锟接︼拷锟斤拷锟斤拷荽锟斤拷锟*/ +#define OUT_APP_FRAME (0x18) /*锟斤拷锟接︼拷锟街★拷锟斤拷锟*/ +#define OUT_FRAME_TYPE_ERR (0x19) /*锟斤拷锟街★拷锟斤拷痛锟斤拷锟*/ +#define OUT_ADDR_ERR (0x1A) /*锟斤拷锟斤拷锟街凤拷锟斤拷锟*/ +#define OUT_FIND_LNK_ERR (0x1B) /*锟斤拷锟斤拷锟窖拷锟铰凤拷锟斤拷锟*/ +#define OUT_INSERT_NODE_ERR (0x1C) /*锟斤拷锟斤拷锟斤拷锟节碉拷锟斤拷锟*/ +#define OUT_INIT_NODE_ERR (0x1D) /*锟斤拷锟斤拷锟绞硷拷锟斤拷诘锟斤拷锟斤拷*/ +#define OUT_DATA_TYPE (0x1E) /*锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟*/ +#define OUT_LNK (0x1F) /*锟斤拷锟斤拷锟铰*/ +#define OUT_RP_LNK (0x20) /*锟斤拷锟絉P锟斤拷路*/ +#define OUT_ALL_LEN_ERR (0x21) /*锟斤拷锟斤拷锟斤拷锟斤拷艹锟斤拷却锟斤拷锟*/ -#define FSFB_RCV_TAG 0xF4 /* FSFB输入单元标识 */ -#define FSFB_OUT_TAG 0xF5 /* FSFB输出单元标识 */ -#define FSFB_MSG_IN_TAG 0x04 /* FSFB输入一帧消息起始标识(B 0000 0100) */ -#define FSFB_MSG_OUT_TAG 0x08 /* FSFB输出一帧消息起始标识(B 0000 1000) */ -#define FSFB_NODE_OUT_TAG 0x0C /* FSFB输出一帧消息起始标识(B 0000 1100) */ -#define FSFB_OUT_E_TAG 0x0F /* FSFB输出单元结束标识(B 0000 1111) */ +#define FSFB_RCV_TAG 0xF4 /* FSFB锟斤拷锟诫单元锟斤拷识 */ +#define FSFB_OUT_TAG 0xF5 /* FSFB锟斤拷锟斤拷锟皆拷锟绞 */ +#define FSFB_MSG_IN_TAG 0x04 /* FSFB锟斤拷锟斤拷一帧锟斤拷息锟斤拷始锟斤拷识(B 0000 0100) */ +#define FSFB_MSG_OUT_TAG 0x08 /* FSFB锟斤拷锟揭恢★拷锟较拷锟绞硷拷锟绞(B 0000 1000) */ +#define FSFB_NODE_OUT_TAG 0x0C /* FSFB锟斤拷锟揭恢★拷锟较拷锟绞硷拷锟绞(B 0000 1100) */ +#define FSFB_OUT_E_TAG 0x0F /* FSFB锟斤拷锟斤拷锟皆拷锟斤拷锟斤拷锟绞(B 0000 1111) */ /************************************************************************ - * 错误码编码原则,协议错误码一共16bit - * D15~D12:保留 - * D11~D10:错误等级 - * D9~D8:模块位置 - * D7~D4:包括各个模块特有的错误,在模块不同时次4位代表的含义不同 - * 区别于队列链表等底层错误 - * D3~D0:函数出错处理,不论模块是否相同此4位代表的含义相同 + * 锟斤拷锟斤拷锟斤拷锟斤拷锟皆拷锟叫拷锟斤拷锟斤拷锟斤拷一锟斤拷16bit + * D15~D12锟斤拷锟斤拷锟斤拷 + * D11~D10锟斤拷锟斤拷锟斤拷燃锟 + * D9~D8锟斤拷模锟斤拷位锟斤拷 + * D7~D4锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷模锟斤拷锟斤拷锟叫的达拷锟斤拷锟斤拷模锟介不同时锟斤拷4位锟斤拷锟斤拷锟侥猴拷锟藉不同 + * 锟斤拷锟斤拷锟节讹拷锟斤拷锟斤拷锟斤拷锟饺底诧拷锟斤拷锟 + * D3~D0锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷模锟斤拷锟角凤拷锟斤拷同锟斤拷4位锟斤拷锟斤拷锟侥猴拷锟斤拷锟斤拷同 ************************************************************************/ -/* 错误等级 */ +/* 锟斤拷锟斤拷燃锟 */ #define FSFB_ERR 0x0800 #define FSFB_WARN 0x0400 -/* 模块位置 */ -#define FSFB_RECEIVE 0x0200 /* 输入模块 */ -#define FSFB_OUTPUT 0x0100 /* 输出模块 */ +/* 模锟斤拷位锟斤拷 */ +#define FSFB_RECEIVE 0x0200 /* 锟斤拷锟斤拷模锟斤拷 */ +#define FSFB_OUTPUT 0x0100 /* 锟斤拷锟侥o拷锟 */ -/* 各模块特有错误 */ +/* 锟斤拷模锟斤拷锟斤拷锟叫达拷锟斤拷 */ #define FSFB_ERROR_NULL 0x0000 -/* 输入 */ -#define FSFB_MSG_TYPE_ILLEGAL 0x0010 /* 不是FSFB消息 */ -#define FSFB_MSG_OLD_ERR 0x0020 /* 非最新报文 */ -#define FSFB_DEL_MSG_LNK_ERR 0x0030 /* 临时报文删除失败 */ -#define FSFB_MSG_NOT_NODE_ERR 0x0040 /* 报文信息与通信节点信息不一致 */ -#define FSFB_MSG_LEN_ERR 0x0050 /* 报文长度不正 */ -#define FSFB_MSG_FMT_ILLEGAL 0x0060 /* 报文格式不对 */ -#define FSFB_SSR_NOT_ILLEGAL 0x0070 /* 不是对应SSR报文信息 */ -#define FSFB_MSG_REPLACE_ERR 0x0080 /* 覆盖节点失败 */ -#define FSFB_MSG_NO_REPLACENODE 0x0090 /* 不存在覆盖节点 */ -#define FSFB_MSG_NO_INVALID 0x00A0 /* BSD解码失败 */ +/* 锟斤拷锟斤拷 */ +#define FSFB_MSG_TYPE_ILLEGAL 0x0010 /* 锟斤拷锟斤拷FSFB锟斤拷息 */ +#define FSFB_MSG_OLD_ERR 0x0020 /* 锟斤拷锟斤拷锟铰憋拷锟斤拷 */ +#define FSFB_DEL_MSG_LNK_ERR 0x0030 /* 锟斤拷时锟斤拷锟斤拷删锟斤拷失锟斤拷 */ +#define FSFB_MSG_NOT_NODE_ERR 0x0040 /* 锟斤拷锟斤拷锟斤拷息锟斤拷通锟脚节碉拷锟斤拷息锟斤拷一锟斤拷 */ +#define FSFB_MSG_LEN_ERR 0x0050 /* 锟斤拷锟侥筹拷锟饺诧拷锟斤拷 */ +#define FSFB_MSG_FMT_ILLEGAL 0x0060 /* 锟斤拷锟侥革拷式锟斤拷锟斤拷 */ +#define FSFB_SSR_NOT_ILLEGAL 0x0070 /* 锟斤拷锟角讹拷应SSR锟斤拷锟斤拷锟斤拷息 */ +#define FSFB_MSG_REPLACE_ERR 0x0080 /* 锟斤拷锟角节碉拷失锟斤拷 */ +#define FSFB_MSG_NO_REPLACENODE 0x0090 /* 锟斤拷锟斤拷锟节革拷锟角节碉拷 */ +#define FSFB_MSG_NO_INVALID 0x00A0 /* BSD锟斤拷锟斤拷失锟斤拷 */ #define FSFB_MSG_CRC_ERR 0x00B0 -/* 输出 */ -#define FSFB_DBGET_ERR 0x0050 /* 数据库查询错误 */ -/* 函数出错处理,底层处理错误 */ -#define FSFB_QUEUE_READ 0x0001 /* 队列读有错 */ -#define FSFB_QUEUE_WRITE 0x0002 /* 队列写有错 */ -#define FSFB_QUEUE_INTEGRITY 0x0003 /* 队列中数据不完整(包括scan有错,应用给出错误)*/ -#define FSFB_LNK_PUSH 0x0004 /* 链路管理表节点压栈错误 */ -#define FSFB_LNK_POP 0x0005 /* 序列号缓存链表节点出栈错误 */ +/* 锟斤拷锟 */ +#define FSFB_DBGET_ERR 0x0050 /* 锟斤拷锟捷匡拷锟窖拷锟斤拷锟 */ +/* 锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟阶层处锟斤拷锟斤拷锟斤拷 */ +#define FSFB_QUEUE_READ 0x0001 /* 锟斤拷锟叫讹拷锟叫达拷 */ +#define FSFB_QUEUE_WRITE 0x0002 /* 锟斤拷锟斤拷写锟叫达拷 */ +#define FSFB_QUEUE_INTEGRITY 0x0003 /* 锟斤拷锟斤拷锟斤拷锟斤拷锟捷诧拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷scan锟叫达拷锟斤拷应锟矫革拷锟斤拷锟斤拷锟斤拷*/ +#define FSFB_LNK_PUSH 0x0004 /* 锟斤拷路锟斤拷锟斤拷锟斤拷锟节碉拷压栈锟斤拷锟斤拷 */ +#define FSFB_LNK_POP 0x0005 /* 锟斤拷锟叫号伙拷锟斤拷锟斤拷锟斤拷锟节碉拷锟秸伙拷锟斤拷锟 */ diff --git a/TSCP/src/protocol/fsfb/common_fsfb/fsfbProtclStruct.h b/TSCP/src/protocol/fsfb/common_fsfb/fsfbProtclStruct.h index 4dab339..48f71df 100644 --- a/TSCP/src/protocol/fsfb/common_fsfb/fsfbProtclStruct.h +++ b/TSCP/src/protocol/fsfb/common_fsfb/fsfbProtclStruct.h @@ -170,7 +170,7 @@ typedef struct UINT8 *RecordArray; /* Fsfb层记录数组 */ UINT16 RecordArraySize; /* Fsfb层记录数组大小 */ UINT8 *AppArray; /* 输出模块的出口1,表示外网输出数据 */ - UINT16 AppArraySize; /* Fsfb层输出模块的出口数组长度 */ + UINT32 AppArraySize; /* Fsfb层输出模块的出口数组长度 */ UINT8 *VarArray; UINT16 VarArraySize; QueueStruct DataToApp; /* Fsfb层协议输入给应用的数据队列 */ diff --git a/TSCP/src/protocol/protocol_cbtc/common_dqu_protocol/dsuProtclFun.c b/TSCP/src/protocol/protocol_cbtc/common_dqu_protocol/dsuProtclFun.c index f6f171e..9260ac3 100644 --- a/TSCP/src/protocol/protocol_cbtc/common_dqu_protocol/dsuProtclFun.c +++ b/TSCP/src/protocol/protocol_cbtc/common_dqu_protocol/dsuProtclFun.c @@ -41,6 +41,7 @@ static UINT8 StDsuPtclFindSheet(SheetInfo* sheetInfo, UINT8 data[], const UINT32 static void StDsuPtclSetDevNum(UINT8 locType, UINT8 oppType, SheetInfo* outDevIpSheet, SheetInfo* inDevIpSheet, UINT16* dupOppHlhtIdLen, UINT32* dupOppHlhtId, UINT16 outInDevIpRowCount, UINT8* devNum); static UINT8 GetCommOppDevTypes(SheetInfo* commSheet, UINT8 locType, UINT8* oppTypes, UINT8* oppTypePtls, UINT16* oppTypeNum, const UINT16 maxOppTypeNum); static void GetCommOppDevNum(SheetInfo* devIpSheet, UINT8 oppType, UINT16* dupOppHlhtIdsLen, UINT32* dupOppHlhtIds, const UINT16 maxDupOppHlhtIdsLen, UINT8* devNum); +static void StDsuPtclCommRelSetDevNum(UINT16 locTypeId, UINT8 oppType, UINT8* devNum); /** * @brief DsuCommonInfoInit 适配层查询函数初始化 @@ -255,7 +256,20 @@ UINT8 DsuGetProtclTypeInfo(UINT16 locTypeId, DSU_PROTCL_TYPE_STRU* dsuProtclType } devNum = 0u; /*-< 清设备数量为0*/ - StDsuPtclSetDevNum(locType, oppType[i], &outDevIpSheet, &inDevIpSheet, &dupOppHlhtIdLen, dupOppHlhtId, (UINT16)(outInDevIpRowCount), &devNum); /*-< 调用设置设备数量函数*/ + + StDsuPtclCommRelSetDevNum(locTypeId, oppType[i], &devNum); /*-< 调用根据设备通信关系得到设备数量函数*/ + if (0U == devNum) /*-< 得到设备数量*/ + { + StDsuPtclSetDevNum(locType, oppType[i], &outDevIpSheet, &inDevIpSheet, &dupOppHlhtIdLen, dupOppHlhtId, (UINT16)(outInDevIpRowCount), &devNum); /*-< 调用设置设备数量函数*/ + } + else + { + if (LEU_TYPE == oppType[i]) /*-< 通信类型为LEU*/ + { + devNum *= 2U; /*-< LEU链路数需乘2,有两种通道*/ + } + devNum += 1U; /*-< 统一富裕出一个链路*/ + } /*加到对应协议类型的通信设备数量上*/ switch (oppTypePtl[i]) /*-< 判断对方协议类型*/ @@ -717,3 +731,48 @@ static void GetCommOppDevNum(SheetInfo* devIpSheet, UINT8 oppType, UINT16* dupOp } } } + +/** + * @brief StDsuPtclCommRelSetDevNum 根据设备通信关系得到设备数量 + * @param locTypeId 本方类型ID 取值范围:0x0000-0xFFFF + * @param oppType 对方类型 取值范围:0x00-0xFF + * @param devNum 设备数量 取值范围:0x00-0xFF + */ +static void StDsuPtclCommRelSetDevNum(UINT16 locTypeId, UINT8 oppType, UINT8* devNum) +{ + SheetInfo commRelSheet = { 0U }; + UINT16 rowIdx = 0U; + UINT16 curLocTypeId = 0U; + UINT8 comDevNum = 0U; + UINT8 comIdx = 0U; + UINT16 comTypeId = 0U; + UINT8 comType = 0U; + + if ((NULL != devNum) && (NULL != g_pDataBuf))/*-< 参数是否非空*/ + { + (*devNum) = 0u; /*-< 清设备数量为0*/ + + InitSheet(&commRelSheet, g_pDataBuf, g_DataBufLen, DSU_DEVICE_IP_CONFIG_TYPE, DSU_DATA_IP_ZCDSU_COMM_ID); /*-< 读取地面设备通信关系配置表*/ + if (NULL != commRelSheet.Data) /*-< 检查内网-RSSP链接信息表-长度合法*/ + { + for (rowIdx = 0U; rowIdx < commRelSheet.RowCount; rowIdx++) + { + curLocTypeId = ShortFromChar(&commRelSheet.Data[rowIdx * commRelSheet.ColLen]); /*-< 得到当前类型ID*/ + if (curLocTypeId == locTypeId) + { + comDevNum = (UINT8)ShortFromChar(&commRelSheet.Data[(rowIdx * commRelSheet.ColLen) + 2U]); /*-< 得到通信数量*/ + for (comIdx = 0U; comIdx < comDevNum; comIdx++) + { + comTypeId = ShortFromChar(&commRelSheet.Data[(rowIdx * commRelSheet.ColLen) + 4U + (2U * comIdx)]); /*-< 得到通信类型ID*/ + comType = (UINT8)((comTypeId >> 8U) & 0x00FFU); + if (comType == oppType) + { + (*devNum)++; + } + } + break; + } + } + } + } +} diff --git a/TSCP/src/protocol/protocol_cbtc/common_dqu_protocol/dsuProtclFun.h b/TSCP/src/protocol/protocol_cbtc/common_dqu_protocol/dsuProtclFun.h index a670c48..5df16d8 100644 --- a/TSCP/src/protocol/protocol_cbtc/common_dqu_protocol/dsuProtclFun.h +++ b/TSCP/src/protocol/protocol_cbtc/common_dqu_protocol/dsuProtclFun.h @@ -47,6 +47,7 @@ extern "C" { #define PSC_TYPE ((UINT8)0x61) /*PSC设备类型*/ #define ITE_TYPE ((UINT8)0x18) /*ITE设备类型*/ #define OC_TYPE ((UINT8)0x64) /*OCC设备类型*/ +#define LEU_TYPE ((UINT8)0x5E) /*LEU设备类型*/ /*设备通信协议表0x4002*/ typedef struct diff --git a/鏁版嵁/data_line_BJL10_宸ョ▼鏁版嵁(1.2).0.20260210-ts.zip b/鏁版嵁/data_line_BJL10_宸ョ▼鏁版嵁(1.2).0.20260210-ts.zip deleted file mode 100644 index 2461dbe..0000000 --- a/鏁版嵁/data_line_BJL10_宸ョ▼鏁版嵁(1.2).0.20260210-ts.zip +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f2a23966aba7a8761bccf9fe2821d66bb5d2103340030baed8530a81fbc7957a -size 8172278 diff --git a/鏁版嵁/鏍囧噯绔欒溅杞8.0+鍏叡V31.5+V54.0IVOC+V50.0RCI_CI+V37.0RCI_OC+V22.0ATS+V1.0TMC+V9.0AIM鍙夾ID-20260401(1).zip b/鏁版嵁/鏍囧噯绔欒溅杞8.0+鍏叡V31.5+V54.0IVOC+V50.0RCI_CI+V37.0RCI_OC+V22.0ATS+V1.0TMC+V9.0AIM鍙夾ID-20260401(1).zip deleted file mode 100644 index 9660e41..0000000 --- a/鏁版嵁/鏍囧噯绔欒溅杞8.0+鍏叡V31.5+V54.0IVOC+V50.0RCI_CI+V37.0RCI_OC+V22.0ATS+V1.0TMC+V9.0AIM鍙夾ID-20260401(1).zip +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9abd7242a4fcafef099eadcb600e771b6fc1c2a7b34cf698479245dee5db2d1a -size 33112105 diff --git a/鏁版嵁/鏍囧噯绔欒溅杞8.2+鍏叡V31.8+V56.0IVOC+V53.0RCI_CI+V38.0RCI_OC+V22.0ATS+V1.0TMC+V13.0AIM鍙夾ID-20260612(1).zip b/鏁版嵁/鏍囧噯绔欒溅杞8.2+鍏叡V31.8+V56.0IVOC+V53.0RCI_CI+V38.0RCI_OC+V22.0ATS+V1.0TMC+V13.0AIM鍙夾ID-20260612(1).zip new file mode 100644 index 0000000..cf19332 --- /dev/null +++ b/鏁版嵁/鏍囧噯绔欒溅杞8.2+鍏叡V31.8+V56.0IVOC+V53.0RCI_CI+V38.0RCI_OC+V22.0ATS+V1.0TMC+V13.0AIM鍙夾ID-20260612(1).zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d1dc9a95e598cdd85b0bbf171c66ebe17a1aeb460fe964094ca2bdce987ce6d7 +size 70112826 diff --git a/鏁版嵁/鐢靛瓙鍦板浘鏁版嵁V2.2-CBTC-14-鍏叡31.5+CI50.0+OC37.0-8.zip b/鏁版嵁/鐢靛瓙鍦板浘鏁版嵁V2.2-CBTC-14-鍏叡31.5+CI50.0+OC37.0-8.zip deleted file mode 100644 index 4ed92a4..0000000 --- a/鏁版嵁/鐢靛瓙鍦板浘鏁版嵁V2.2-CBTC-14-鍏叡31.5+CI50.0+OC37.0-8.zip +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4443bef5ed0eaf019894e13525d37d1ebe3390060ee4090b0d3b043412c01b20 -size 5611876 diff --git a/鏁版嵁/鐢靛瓙鍦板浘鏁版嵁V2.2-杞﹁溅-11-鍏叡31.5+CI50.0+OC37.0+IVOC54.0-6.zip b/鏁版嵁/鐢靛瓙鍦板浘鏁版嵁V2.2-杞﹁溅-11-鍏叡31.5+CI50.0+OC37.0+IVOC54.0-6.zip deleted file mode 100644 index df5b392..0000000 --- a/鏁版嵁/鐢靛瓙鍦板浘鏁版嵁V2.2-杞﹁溅-11-鍏叡31.5+CI50.0+OC37.0+IVOC54.0-6.zip +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cc54ffd8691e818718c10702f8cb80c536c3c644ac312aedb068930f0783a011 -size 4259937 diff --git a/鏁版嵁/鐢靛瓙鍦板浘鏁版嵁V2.3-CBTC-26 -璋冭瘯鏁版嵁-2.rar b/鏁版嵁/鐢靛瓙鍦板浘鏁版嵁V2.3-CBTC-26 -璋冭瘯鏁版嵁-2.rar new file mode 100644 index 0000000..79580b9 --- /dev/null +++ b/鏁版嵁/鐢靛瓙鍦板浘鏁版嵁V2.3-CBTC-26 -璋冭瘯鏁版嵁-2.rar @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5ef182bc4393b037277d199adce26bc5a730b6c6c18552f449a2a09204448419 +size 6703137 diff --git a/鏁版嵁/鐢靛瓙鍦板浘鏁版嵁V2.3-杞﹁溅-16 -璋冭瘯鏁版嵁-2.rar b/鏁版嵁/鐢靛瓙鍦板浘鏁版嵁V2.3-杞﹁溅-16 -璋冭瘯鏁版嵁-2.rar new file mode 100644 index 0000000..d95ddca --- /dev/null +++ b/鏁版嵁/鐢靛瓙鍦板浘鏁版嵁V2.3-杞﹁溅-16 -璋冭瘯鏁版嵁-2.rar @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7ece85f8102a1245506c3cd2bb6ef40a3fdc1ded0274715aeb1e702d8a8505b8 +size 5345627