diff --git a/TSCP/Makefile b/TSCP/Makefile index 7580ed5..60cef12 100644 --- a/TSCP/Makefile +++ b/TSCP/Makefile @@ -20,77 +20,23 @@ LD = $(CC) #INCLUDES += -I/path/to/my/lib/include #INCLUDES += -I../mylib/public -INCLUDES += -I ./src/APP \ - -I ./src/APP/ciapp/2oo2 \ - -I ./src/APP/ciapp/AllAutoReturn \ - -I ./src/APP/ciapp/AutoReturn \ - -I ./src/APP/ciapp/AutoRoute \ - -I ./src/APP/ciapp/AxisAssert \ - -I ./src/APP/ciapp/AxisSort \ - -I ./src/APP/ciapp/CutoffPoint \ - -I ./src/APP/ciapp/DataManage \ - -I ./src/APP/ciapp/DebugPrint \ - -I ./src/APP/ciapp/Deployment \ - -I ./src/APP/ciapp/DiffLineDev \ - -I ./src/APP/ciapp/EnvelopeManage \ - -I ./src/APP/ciapp/ERROR \ - -I ./src/APP/ciapp/ESB \ - -I ./src/APP/ciapp/FloodGate \ - -I ./src/APP/ciapp/Garagedoor \ - -I ./src/APP/ciapp/HLHTMsgHead \ - -I ./src/APP/ciapp/Indicator \ - -I ./src/APP/ciapp/Initial \ - -I ./src/APP/ciapp/InvadeSection \ - -I ./src/APP/ciapp/IO \ - -I ./src/APP/ciapp/LogicManage \ - -I ./src/APP/ciapp/LogicProcess \ - -I ./src/APP/ciapp/LogRecord \ - -I ./src/APP/ciapp/Main \ - -I ./src/APP/ciapp/Mask \ - -I ./src/APP/ciapp/NonAutoReturn \ - -I ./src/APP/ciapp/NonRoute \ - -I ./src/APP/ciapp/Overlap \ - -I ./src/APP/ciapp/ParsePack \ - -I ./src/APP/ciapp/PSC \ - -I ./src/APP/ciapp/PSD \ - -I ./src/APP/ciapp/QueryFiles \ - -I ./src/APP/ciapp/Relay \ - -I ./src/APP/ciapp/RemoteRM \ - -I ./src/APP/ciapp/ReverseCut \ - -I ./src/APP/ciapp/ReverseRoute \ - -I ./src/APP/ciapp/Route \ - -I ./src/APP/ciapp/Section \ - -I ./src/APP/ciapp/SectionStateProcess \ - -I ./src/APP/ciapp/SGBJ \ - -I ./src/APP/ciapp/Signal \ - -I ./src/APP/ciapp/SPKS \ - -I ./src/APP/ciapp/Switch \ - -I ./src/APP/ciapp/System \ - -I ./src/APP/ciapp/Train \ - -I ./src/APP/ciapp/Transmit \ - -I ./src/APP/ciapp/VirtualDevice \ - -I ./src/APP/ciapp/WashMachine \ - -I ./src/APP/ciapp/WLScreen \ - -I ./src/APP/ciapp/WLBrake \ - -I ./src/APP/PU13_integration_config \ - -I ./src/commoncode/common \ +INCLUDES += -I ./src/commoncode/common \ -I ./src/commoncode/commoncode_config_vxworks \ -I ./src/dqu_common/dqu_idmap_common \ -I ./src/dqu_common/dqu_emap_common \ -I ./src/dqu_common/dqu_dfs_common \ -I ./src/dqu_common/dqu_cbtc_common \ - -I .\src\protocol\fsfb\common_dqu_fsfb \ - -I .\src\protocol\fsfb\common_fsfb \ -I .\src\protocol\protocol_cbtc\common_protocol_config \ -I .\src\protocol\protocol_cbtc\common_dqu_protocol \ -I .\src\protocol\protocol_cbtc\common_protocol \ + -I .\src\protocol\protocol_cbtc\common_protocol_sfp_rsspi-config \ -I .\src\protocol\redun_record_cbtc\common_dqu_rp \ -I .\src\protocol\redun_record_cbtc\common_redun \ -I .\src\protocol\redun_record_cbtc\common_redun_record_config \ -I .\src\protocol\rsr_record_cbtc\common_dqu_rsr \ - -I .\src\protocol\rsr_record_cbtc\common_rsr \ -I .\src\protocol\rsr_record_cbtc\common_rsr\rssp \ -I .\src\protocol\rsr_record_cbtc\common_rsr\sig \ + -I .\src\protocol\rsr_record_cbtc\common_rsr \ -I .\src\protocol\rsr_record_cbtc\common_rsr_record_config \ -I .\src\protocol\rssp_record_cbtc1\common_dqu_rssp \ -I .\src\protocol\rssp_record_cbtc1\common_rssp \ @@ -101,6 +47,8 @@ INCLUDES += -I ./src/APP \ -I .\src\protocol\sfp_record_cbtc1\common_dqu_sfp \ -I .\src\protocol\sfp_record_cbtc1\common_sfp \ -I .\src\protocol\sfp_record_cbtc1\common_sfp_nr_config \ + -I .\src\protocol\fsfb\common_dqu_fsfb \ + -I .\src\protocol\fsfb\common_fsfb \ -I ./src/DRV \ -I ./src/MSCP \ -I ./src/MSCP/CM \ @@ -109,7 +57,60 @@ INCLUDES += -I ./src/APP \ -I ./src/MSCP/SFM \ -I ./src/MSCP/PFM \ -I ./src/MSCP_CFG \ - + -I ./src/APP \ + -I ./src/APP/ciapp/2oo2 \ + -I ./src/APP/ciapp/AllAutoReturn \ + -I ./src/APP/ciapp/AutoReturn \ + -I ./src/APP/ciapp/AutoRoute \ + -I ./src/APP/ciapp/DataManage \ + -I ./src/APP/ciapp/DebugPrint \ + -I ./src/APP/ciapp/DiffLineDev \ + -I ./src/APP/ciapp/ERROR \ + -I ./src/APP/ciapp/ESB \ + -I ./src/APP/ciapp/FloodGate \ + -I ./src/APP/ciapp/Garagedoor \ + -I ./src/APP/ciapp/HLHTMsgHead \ + -I ./src/APP/ciapp/Indicator \ + -I ./src/APP/ciapp/Initial \ + -I ./src/APP/ciapp/InvadeSection \ + -I ./src/APP/ciapp/IO \ + -I ./src/APP/ciapp/LightTestButtonManage \ + -I ./src/APP/ciapp/LogicManage \ + -I ./src/APP/ciapp/LogicProcess \ + -I ./src/APP/ciapp/LogRecord \ + -I ./src/APP/ciapp/Main \ + -I ./src/APP/ciapp/Mask \ + -I ./src/APP/ciapp/NonRoute \ + -I ./src/APP/ciapp/Overlap \ + -I ./src/APP/ciapp/ParsePack \ + -I ./src/APP/ciapp/PSC \ + -I ./src/APP/ciapp/PSD \ + -I ./src/APP/ciapp/QueryFiles \ + -I ./src/APP/ciapp/Relay \ + -I ./src/APP/ciapp/ReverseRoute \ + -I ./src/APP/ciapp/Route \ + -I ./src/APP/ciapp/Section \ + -I ./src/APP/ciapp/Signal \ + -I ./src/APP/ciapp/SPKS \ + -I ./src/APP/ciapp/Switch \ + -I ./src/APP/ciapp/System \ + -I ./src/APP/ciapp/Transmit \ + -I ./src/APP/ciapp/VirtualDevice \ + -I ./src/APP/ciapp/WashMachine \ + -I ./src/APP/PU13_integration_config \ + -I ./src/APP/ciapp/AxisSort \ + -I ./src/APP/ciapp/Train \ + -I ./src/APP/ciapp/EnvelopeManage \ + -I ./src/APP/ciapp/CutoffPoint \ + -I ./src/APP/ciapp/SectionStateProcess \ + -I ./src/APP/ciapp/AxisAssert \ + -I ./src/APP/ciapp/ReverseCut \ + -I ./src/APP/ciapp/WLScreen \ + -I ./src/APP/ciapp/WLBrake \ + -I ./src/APP/ciapp/RemoteRM \ + -I ./src/APP/ciapp/NonAutoReturn \ + -include stdarg.h + #LIBS += -L/path/to/my/lib/$(PLATFORM)/usr/lib -lmylib #LIBS += -L../mylib/$(OUTPUT_DIR) -lmylib 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 47e13e4..cae2711 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 112 /*集成次数编号*/ +#define VER_INTE_TIME 116 /*集成次数编号*/ #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 dc8a571..5e9fbfe 100644 --- a/TSCP/src/APP/ciapp/2oo2/2oo2DataTransferManage.c +++ b/TSCP/src/APP/ciapp/2oo2/2oo2DataTransferManage.c @@ -443,17 +443,17 @@ UINT32 CopyValidSetRcVobcDataStru(const UINT8* pCurCiAppDataPointer, void* pData for (i = 0u; i < ValidIdNum; i++) { - pDstAddr = (UINT8*)pDataStru + struLength * i; - - /*锟结构锟斤拷元锟斤拷前锟斤拷锟斤拷锟街斤拷ID为0时锟斤拷锟斤拷锟斤拷效锟斤拷锟斤拷,锟剿达拷锟斤拷锟剿碉拷锟斤拷锟斤拷锟叫э拷锟*/ - if (0u != ShortFromCharLE(pDstAddr)) + if (i < struNum) { - (void)memcpy(pDstAddr, pCurCiAppDataPointer + curIndex, struLength); + pDstAddr = (UINT8*)pDataStru + struLength * i; + (void)CommonMemCpy((void*)pDstAddr, (UINT32)struLength, (const void*)(pCurCiAppDataPointer + curIndex), (UINT32)struLength); curIndex += (UINT32)struLength; } else { - /*锟斤拷执锟斤拷锟轿何诧拷锟斤拷*/ + curIndex += (UINT32)struLength; + + debug_infor_printf((const)"ERROR: SetValidIdNum = %d\n", i); } } } @@ -1618,19 +1618,22 @@ UINT32 GetCiAppData(UINT8 *pCiAppDataPointer) pCiAppDataPointer[curIndex] = gDyTestNum; curIndex += 1U; - /*锟斤拷锟斤拷锟叫筹拷远锟斤拷筛选锟结构锟斤拷锟斤拷锟斤拷*/ - (void)CommonMemCpy((void*)(pCiAppDataPointer + curIndex), (UINT32)(sizeof(TrainAtsScreenStru)* TRAIN_SUM_MAX), (void*)(&gszAtsScreenInfo), (UINT32)(sizeof(TrainAtsScreenStru)* TRAIN_SUM_MAX)); - curIndex = curIndex + (UINT32)(sizeof(TrainAtsScreenStru) * TRAIN_SUM_MAX); + /*ZC锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷CBTC锟叫筹拷锟斤拷压锟斤拷息*/ + pCiAppDataPointer[curIndex] = gCbtcCrossNumZc; + curIndex += 1u; - - /*锟斤拷锟斤拷远锟斤拷筛选锟叫筹拷锟斤拷锟斤拷*/ - pCiAppDataPointer[curIndex] = gAtsScreenNum; - curIndex += 1U; + for (ii = 0u; ii < gCbtcCrossNumZc; ii++) + { + ShortToChar(gCbtcCrossStructZc[ii].wSignalId, &pCiAppDataPointer[curIndex]); + curIndex += 2u; + pCiAppDataPointer[curIndex] = gCbtcCrossStructZc[ii].wTrainId; + curIndex += 1u; + } /*锟斤拷锟斤拷一锟斤拷CRC*/ crcLength = curIndex - crcIndex; crcResult = Tioc_CommonCrc32(pCiAppDataPointer + crcIndex, crcLength); - debug_infor_printf((const)"2oo2 RecvCiCmdDataStruCurSum-szNeighborCiInfo CRC:%x, Length:%d\n", crcResult, crcLength); + debug_infor_printf((const)"2oo2 RecvCiCmdDataStruCurSum-gDyTestNum CRC:%x, Length:%d\n", crcResult, crcLength); } return curIndex; } @@ -2463,9 +2466,17 @@ UINT8 SetCiAppData(const UINT8 *pCiAppDataPointer,const UINT32 len) gDyTestNum = pCiAppDataPointer[curIndex]; curIndex += 1U; - /*锟斤拷锟斤拷锟叫筹拷远锟斤拷筛选锟结构锟斤拷锟斤拷锟斤拷*/ - (void)CommonMemCpy((void*)(&gszAtsScreenInfo), (UINT32)(sizeof(TrainAtsScreenStru)* TRAIN_SUM_MAX), (const void*)(pCiAppDataPointer + curIndex), (UINT32)(sizeof(TrainAtsScreenStru)* TRAIN_SUM_MAX)); - curIndex = curIndex + (UINT32)(sizeof(TrainAtsScreenStru) * TRAIN_SUM_MAX); + /*ZC锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷CBTC锟叫筹拷锟斤拷压锟斤拷息*/ + gCbtcCrossNumZc = pCiAppDataPointer[curIndex]; + curIndex += 1u; + + for (ii = 0u; ii < gCbtcCrossNumZc; ii++) + { + gCbtcCrossStructZc[ii].wSignalId = ShortFromChar(&pCiAppDataPointer[curIndex]); + curIndex += 2u; + gCbtcCrossStructZc[ii].wTrainId = pCiAppDataPointer[curIndex]; + curIndex += 1u; + } rtn = 1U; } @@ -2921,12 +2932,12 @@ UINT32 GetCiGeneralData(UINT8* pCiAppDataPointer) curIndex = curIndex + curResult; /*同锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷雪锟斤拷锟斤拷锟斤拷息*/ - curResult = CopyValidGetDataStru(pCiAppDataPointer + curIndex, (void*)(szSendCiAreaSnow), CI_COM_CI_MAX_NUM, (UINT16)sizeof(ToCiAreaSnowStruct)); - curIndex = curIndex + curResult; + (void)CommonMemCpy((void*)(pCiAppDataPointer + curIndex), (UINT32)(sizeof(ToCiAreaSnowStruct)* CI_COM_CI_MAX_NUM), (void*)(szSendCiAreaSnow), (UINT32)(sizeof(ToCiAreaSnowStruct)* CI_COM_CI_MAX_NUM)); + curIndex = curIndex + (UINT32)(sizeof(ToCiAreaSnowStruct) * CI_COM_CI_MAX_NUM); /*同锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟窖╋拷锟较*/ - curResult = CopyValidGetDataStru(pCiAppDataPointer + curIndex, (void*)(szRecvCiAreaSnow), CI_COM_CI_MAX_NUM, (UINT16)sizeof(ToCiAreaSnowStruct)); - curIndex = curIndex + curResult; + (void)CommonMemCpy((void*)(pCiAppDataPointer + curIndex), (UINT32)(sizeof(ToCiAreaSnowStruct)* CI_COM_CI_MAX_NUM), (void*)(szRecvCiAreaSnow), (UINT32)(sizeof(ToCiAreaSnowStruct)* CI_COM_CI_MAX_NUM)); + curIndex = curIndex + (UINT32)(sizeof(ToCiAreaSnowStruct) * CI_COM_CI_MAX_NUM); /* 锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷雪锟斤拷锟斤拷 */ (void)CommonMemCpy((void*)(pCiAppDataPointer + curIndex), (UINT32)sizeof(UINT8), (const void*)(&g_LocalSnowModel), (UINT32)sizeof(UINT8)); @@ -2958,6 +2969,56 @@ UINT32 GetCiGeneralData(UINT8* pCiAppDataPointer) /*锟诫本CI通锟脚碉拷Rc锟斤拷锟斤拷锟斤拷通锟斤拷锟斤拷头锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷*/ curResult = CopyValidGetHlhtHeadCtxs(pCiAppDataPointer + curIndex, CI_SUM_MAX, (UINT16)sizeof(HLHTHeadContextStru), gSzRcHLHTHeadCtxs); curIndex = curIndex + curResult; + + /*ZC锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷CBTC锟叫筹拷锟斤拷压锟斤拷息*/ + pCiAppDataPointer[curIndex] = gCbtcCrossNumZc; + curIndex += 1u; + + for (ii = 0u; ii < gCbtcCrossNumZc; ii++) + { + ShortToChar(gCbtcCrossStructZc[ii].wSignalId, &pCiAppDataPointer[curIndex]); + curIndex += 2u; + pCiAppDataPointer[curIndex] = gCbtcCrossStructZc[ii].wTrainId; + curIndex += 1u; + } + /*锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷*/ + for (ii = 0U; ii < g_VirtualCIStructData.virtualCiNum; ii++) + { + (void)CommonMemCpy((void*)(pCiAppDataPointer + curIndex), (UINT32)sizeof(UINT8), (const void*)(&g_VirtualCIStructData.virtualCi[ii].virtualCiId), (UINT32)sizeof(UINT8)); + curIndex = curIndex + (UINT32)sizeof(UINT8); + + (void)CommonMemCpy((void*)(pCiAppDataPointer + curIndex), (UINT32)sizeof(UINT8), (const void*)(&g_VirtualCIStructData.virtualCi[ii].chAllSignalBrightFlag) , (UINT32)sizeof(UINT8)); + curIndex = curIndex + (UINT32)sizeof(UINT8); + + (void)CommonMemCpy((void*)(pCiAppDataPointer + curIndex), (UINT32)sizeof(UINT8), (const void*)(&g_VirtualCIStructData.virtualCi[ii].chAllSwitchYLockFlag), (UINT32)sizeof(UINT8)); + curIndex = curIndex + (UINT32)sizeof(UINT8); + + + (void)CommonMemCpy((void*)(pCiAppDataPointer + curIndex), (UINT32)sizeof(UINT8) , (const void*)(&g_VirtualCIStructData.virtualCi[ii].autoTriggerflag) , (UINT32)sizeof(UINT8)); + curIndex = curIndex + (UINT32)sizeof(UINT8); + + (void)CommonMemCpy((void*)(pCiAppDataPointer + curIndex), (UINT32)sizeof(UINT8), (const void*)(&g_VirtualCIStructData.virtualCi[ii].cimode), (UINT32)sizeof(UINT8)); + curIndex = curIndex + (UINT32)sizeof(UINT8); + + (void)CommonMemCpy((void*)(pCiAppDataPointer + curIndex), (UINT32)sizeof(UINT8), (const void*)(&g_VirtualCIStructData.virtualCi[ii].chLabourCancelLinShiXianState) , (UINT32)sizeof(UINT8)); + curIndex = curIndex + (UINT32)sizeof(UINT8); + + (void)CommonMemCpy((void*)(pCiAppDataPointer + curIndex), (UINT32)sizeof(UINT8), (const void*)(&g_VirtualCIStructData.virtualCi[ii].ZfwFlag), (UINT32)sizeof(UINT8)); + curIndex = curIndex + (UINT32)sizeof(UINT8); + + (void)CommonMemCpy((void*)(pCiAppDataPointer + curIndex), (UINT32)sizeof(UINT8), (const void*)(&g_VirtualCIStructData.virtualCi[ii].ZfwjHunXianFLag) , (UINT32)sizeof(UINT8)); + curIndex = curIndex + (UINT32)sizeof(UINT8); + + (void)CommonMemCpy((void*)(pCiAppDataPointer + curIndex), (UINT32)sizeof(UINT32), (const void*)(&g_VirtualCIStructData.virtualCi[ii].ZfwStartCycNum) , (UINT32)sizeof(UINT32)); + curIndex = curIndex + (UINT32)sizeof(UINT32); + + (void)CommonMemCpy((void*)(pCiAppDataPointer + curIndex), (UINT32)sizeof(UINT32), (const void*)(&g_VirtualCIStructData.virtualCi[ii].ZfwValidCycNum) , (UINT32)sizeof(UINT32)); + curIndex = curIndex + (UINT32)sizeof(UINT32); + + /*指示锟斤拷状态锟斤拷锟斤拷*/ + (void)CommonMemCpy((void*)(pCiAppDataPointer + curIndex), (UINT32)(VIRTUAL_CI_INDICATOR_SUM_MAX) * sizeof(IndicatorDataStruct) ,(const void*)(&g_VirtualCIStructData.virtualCi[ii].IndicatorData) , (UINT32)(VIRTUAL_CI_INDICATOR_SUM_MAX) * sizeof(IndicatorDataStruct)); + curIndex = curIndex + (UINT32)((VIRTUAL_CI_INDICATOR_SUM_MAX) * sizeof(IndicatorDataStruct)); + } } return curIndex; @@ -3216,12 +3277,12 @@ UINT8 SetCiGeneralData(const UINT8* pCiAppDataPointer, const UINT32 len) curIndex = curIndex + curResult; /*同锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷雪锟斤拷锟斤拷锟斤拷息*/ - curResult = CopyValidSetDataStru(pCiAppDataPointer + curIndex, (void*)(szSendCiAreaSnow), CI_COM_CI_MAX_NUM, (UINT16)sizeof(ToCiAreaSnowStruct)); - curIndex = curIndex + curResult; + (void)CommonMemCpy((void*)(szSendCiAreaSnow), (UINT32)(sizeof(ToCiAreaSnowStruct)* CI_COM_CI_MAX_NUM), (const void*)(pCiAppDataPointer + curIndex), (UINT32)(sizeof(ToCiAreaSnowStruct)* CI_COM_CI_MAX_NUM)); + curIndex = curIndex + (UINT32)(sizeof(ToCiAreaSnowStruct) * CI_COM_CI_MAX_NUM); /*同锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟窖╋拷锟较*/ - curResult = CopyValidSetDataStru(pCiAppDataPointer + curIndex, (void*)(szRecvCiAreaSnow), CI_COM_CI_MAX_NUM, (UINT16)sizeof(ToCiAreaSnowStruct)); - curIndex = curIndex + curResult; + (void)CommonMemCpy((void*)(szRecvCiAreaSnow), (UINT32)(sizeof(ToCiAreaSnowStruct)* CI_COM_CI_MAX_NUM), (const void*)(pCiAppDataPointer + curIndex), (UINT32)(sizeof(ToCiAreaSnowStruct)* CI_COM_CI_MAX_NUM)); + curIndex = curIndex + (UINT32)(sizeof(ToCiAreaSnowStruct) * CI_COM_CI_MAX_NUM); /* 锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷雪锟斤拷锟斤拷 */ (void)CommonMemCpy((void*)(&g_LocalSnowModel), (UINT32)sizeof(UINT8), (const void*)(pCiAppDataPointer + curIndex), (UINT32)sizeof(UINT8)); @@ -3254,6 +3315,56 @@ UINT8 SetCiGeneralData(const UINT8* pCiAppDataPointer, const UINT32 len) curResult = CopyValidSetHlhtHeadCtxs(pCiAppDataPointer + curIndex, CI_SUM_MAX, (UINT16)sizeof(HLHTHeadContextStru), gSzRcHLHTHeadCtxsCiToRc); curIndex = curIndex + curResult; + /*ZC锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷CBTC锟叫筹拷锟斤拷压锟斤拷息*/ + gCbtcCrossNumZc = pCiAppDataPointer[curIndex]; + curIndex += 1u; + + for (ii = 0u; ii < gCbtcCrossNumZc; ii++) + { + gCbtcCrossStructZc[ii].wSignalId = ShortFromChar(&pCiAppDataPointer[curIndex]); + curIndex += 2u; + gCbtcCrossStructZc[ii].wTrainId = pCiAppDataPointer[curIndex]; + curIndex += 1u; + } + + /*锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷*/ + for (ii = 0U; ii < g_VirtualCIStructData.virtualCiNum; ii++) + { + (void)CommonMemCpy((void*)(&g_VirtualCIStructData.virtualCi[ii].virtualCiId) , (UINT32)sizeof(UINT8), (const void*)(pCiAppDataPointer + curIndex), (UINT32)sizeof(UINT8)); + curIndex = curIndex + (UINT32)sizeof(UINT8); + + (void)CommonMemCpy((void*)(&g_VirtualCIStructData.virtualCi[ii].chAllSignalBrightFlag), (UINT32)sizeof(UINT8), (const void*)(pCiAppDataPointer + curIndex), (UINT32)sizeof(UINT8)); + curIndex = curIndex + (UINT32)sizeof(UINT8); + + (void)CommonMemCpy((void*)(&g_VirtualCIStructData.virtualCi[ii].chAllSwitchYLockFlag), (UINT32)sizeof(UINT8), (const void*)(pCiAppDataPointer + curIndex), (UINT32)sizeof(UINT8)); + curIndex = curIndex + (UINT32)sizeof(UINT8); + + (void)CommonMemCpy((void*)(&g_VirtualCIStructData.virtualCi[ii].autoTriggerflag), (UINT32)sizeof(UINT8), (const void*)(pCiAppDataPointer + curIndex), (UINT32)sizeof(UINT8)); + curIndex = curIndex + (UINT32)sizeof(UINT8); + + (void)CommonMemCpy((void*)(&g_VirtualCIStructData.virtualCi[ii].cimode) , (UINT32)sizeof(UINT8), (const void*)(pCiAppDataPointer + curIndex), (UINT32)sizeof(UINT8)); + curIndex = curIndex + (UINT32)sizeof(UINT8); + + (void)CommonMemCpy((void*)(&g_VirtualCIStructData.virtualCi[ii].chLabourCancelLinShiXianState) , (UINT32)sizeof(UINT8), (const void*)(pCiAppDataPointer + curIndex), (UINT32)sizeof(UINT8)); + curIndex = curIndex + (UINT32)sizeof(UINT8); + + (void)CommonMemCpy((void*)(&g_VirtualCIStructData.virtualCi[ii].ZfwFlag), (UINT32)sizeof(UINT8), (const void*)(pCiAppDataPointer + curIndex), (UINT32)sizeof(UINT8)); + curIndex = curIndex + (UINT32)sizeof(UINT8); + + (void)CommonMemCpy((void*)(&g_VirtualCIStructData.virtualCi[ii].ZfwjHunXianFLag), (UINT32)sizeof(UINT8), (const void*)(pCiAppDataPointer + curIndex), (UINT32)sizeof(UINT8)); + curIndex = curIndex + (UINT32)sizeof(UINT8); + + (void)CommonMemCpy((void*)(&g_VirtualCIStructData.virtualCi[ii].ZfwStartCycNum) , (UINT32)sizeof(UINT32), (const void*)(pCiAppDataPointer + curIndex), (UINT32)sizeof(UINT32)); + curIndex = curIndex + (UINT32)sizeof(UINT32); + + (void)CommonMemCpy((void*)(&g_VirtualCIStructData.virtualCi[ii].ZfwValidCycNum), (UINT32)sizeof(UINT32), (const void*)(pCiAppDataPointer + curIndex), (UINT32)sizeof(UINT32)); + curIndex = curIndex + (UINT32)sizeof(UINT32); + + /*指示锟斤拷状态锟斤拷锟斤拷*/ + (void)CommonMemCpy((void*)(g_VirtualCIStructData.virtualCi[ii].IndicatorData), (UINT32)(VIRTUAL_CI_INDICATOR_SUM_MAX) * sizeof(IndicatorDataStruct), (const void*)(pCiAppDataPointer + curIndex), (UINT32)(VIRTUAL_CI_INDICATOR_SUM_MAX) * sizeof(IndicatorDataStruct)); + curIndex = curIndex + (UINT32)((VIRTUAL_CI_INDICATOR_SUM_MAX) * sizeof(IndicatorDataStruct)); + } + rtn = 1u; } else @@ -3409,6 +3520,8 @@ UINT32 CopyValidGetSigDataCC(UINT8* pCurCiAppDataPointer, UINT16 struNum, Signal curIndex++; *(pCurCiAppDataPointer + curIndex) = pstSignalDataStruCC[i].SignalCrossState; curIndex++; + *(pCurCiAppDataPointer + curIndex) = pstSignalDataStruCC[i].wCrossTacsTrainId; + curIndex++; } else { @@ -3475,6 +3588,8 @@ UINT32 CopyValidSetSigDataCC(UINT8* pCurCiAppDataPointer, UINT16 struNum, Signal curIndex++; pstSignalDataStruCC[devId].SignalCrossState = *(pCurCiAppDataPointer + curIndex); curIndex++; + pstSignalDataStruCC[devId].wCrossTacsTrainId = *(pCurCiAppDataPointer + curIndex); + curIndex++; } else @@ -3648,19 +3763,19 @@ UINT32 CopyValidGetLogicSecDataCC(UINT8* pCurCiAppDataPointer, UINT16 struNum,Lo for (j = 0U; j < pstLogSecDataStruCC[i].chTrainInfoSum; j++) { - ShortToChar(pstLogSecDataStruCC[i].szTrainResData->wTrainId, (pCurCiAppDataPointer + curIndex)); + ShortToChar(pstLogSecDataStruCC[i].szTrainResData[j].wTrainId, (pCurCiAppDataPointer + curIndex)); curIndex += 2U; - *(pCurCiAppDataPointer + curIndex) = pstLogSecDataStruCC[i].szTrainResData->chTrainApplyState; + *(pCurCiAppDataPointer + curIndex) = pstLogSecDataStruCC[i].szTrainResData[j].chTrainApplyState; curIndex++; - *(pCurCiAppDataPointer + curIndex) = pstLogSecDataStruCC[i].szTrainResData->chLogicResUsable; + *(pCurCiAppDataPointer + curIndex) = pstLogSecDataStruCC[i].szTrainResData[j].chLogicResUsable; curIndex++; - *(pCurCiAppDataPointer + curIndex) = pstLogSecDataStruCC[i].szTrainResData->chLogicReturnState; + *(pCurCiAppDataPointer + curIndex) = pstLogSecDataStruCC[i].szTrainResData[j].chLogicReturnState; curIndex++; - *(pCurCiAppDataPointer + curIndex) = pstLogSecDataStruCC[i].szTrainResData->chLogicUnlockState; + *(pCurCiAppDataPointer + curIndex) = pstLogSecDataStruCC[i].szTrainResData[j].chLogicUnlockState; curIndex++; - *(pCurCiAppDataPointer + curIndex) = pstLogSecDataStruCC[i].szTrainResData->chTrainLevel; + *(pCurCiAppDataPointer + curIndex) = pstLogSecDataStruCC[i].szTrainResData[j].chTrainLevel; curIndex++; - LongToChar(pstLogSecDataStruCC[i].szTrainResData->dwRcvUnlockCmdCyc, (pCurCiAppDataPointer + curIndex)); + LongToChar(pstLogSecDataStruCC[i].szTrainResData[j].dwRcvUnlockCmdCyc, (pCurCiAppDataPointer + curIndex)); curIndex += 4U; } *(pCurCiAppDataPointer + curIndex) = pstLogSecDataStruCC[i].cResReqOtherCIId; @@ -4586,6 +4701,7 @@ UINT32 CopyValidSetOcOrginData(UINT8* pCurCiAppDataPointer, UINT16 struNum, OcTo { m_OcToCiOrginDataNum = (UINT8)ValidIdNum; /*锟斤拷锟斤拷*/ + //printf("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++) { @@ -4621,6 +4737,8 @@ UINT32 CopyValidSetOcOrginData(UINT8* pCurCiAppDataPointer, UINT16 struNum, OcTo curIndex++; pOcDevice->BoardState[j] = *(pCurCiAppDataPointer + curIndex); curIndex++; + pOcDevice->MainStandbyState[j] = *(pCurCiAppDataPointer + curIndex); + curIndex++; } } @@ -4786,6 +4904,7 @@ 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++) @@ -4819,6 +4938,8 @@ UINT32 CopyValidGetOcOrginData(UINT8* pCurCiAppDataPointer, UINT16 struNum, OcTo curIndex++; *(pCurCiAppDataPointer + curIndex) = pOcDevice->BoardState[j]; curIndex++; + *(pCurCiAppDataPointer + curIndex) = pOcDevice->MainStandbyState[j]; + curIndex++; } } ShortToChar(OcRecvData[i].OcGdNum, (pCurCiAppDataPointer + curIndex)); diff --git a/TSCP/src/APP/ciapp/DataManage/DeviceConfigDataManage.c b/TSCP/src/APP/ciapp/DataManage/DeviceConfigDataManage.c index 8a6c0e9..e227eb9 100644 --- a/TSCP/src/APP/ciapp/DataManage/DeviceConfigDataManage.c +++ b/TSCP/src/APP/ciapp/DataManage/DeviceConfigDataManage.c @@ -204,7 +204,7 @@ UINT32 GetCiTranCiDataCheckVer(const UINT8 ciId, const UINT16 deviceName) UINT8 ii = 0U; UINT8 chBreakFlag = 0U; UINT8 chDevType = 0U; - chDevType = (UINT8)((deviceName & 0xFF00) >> 8U); + chDevType = (UINT8)((deviceName & 0xFF00u) >> 8U); if ((ciId > 0U) && (ciId < CI_SUM_MAX) && ((RC_WORK_MODE_CI == chDevType)||(RC_WORK_MODE_TIOC == chDevType))) { diff --git a/TSCP/src/APP/ciapp/DataManage/DeviceDataManage.c b/TSCP/src/APP/ciapp/DataManage/DeviceDataManage.c index 625513f..595d022 100644 --- a/TSCP/src/APP/ciapp/DataManage/DeviceDataManage.c +++ b/TSCP/src/APP/ciapp/DataManage/DeviceDataManage.c @@ -1292,17 +1292,13 @@ edit cgh 20241203 UINT8 RouteLockDriveSwitch(const UINT16 routeId, const UINT8 NeedForDrvRoutAssoSwit) { UINT8 ii = 0u; - UINT8 switchSum = 0u; UINT16 switchId = 0u; UINT8 switchExpPosition = SWITCH_POSITION_INVALID; /*道岔期望位置*/ UINT8 switchDancaoPosition = SWITCH_POSITION_INVALID; /*单操有效位置*/ - RouteSwitchStruct* pRouteSwitchStru = NULL; /*道岔数据结构指针*/ UINT8 innerSwitchRetVal = CI_ERROR; /*检查进路内道岔是否可被驱动的结果*/ UINT8 assocSwitchRetVal = CI_ERROR; /*检查带动道岔是否可被驱动的结果*/ UINT8 assocSwitchSum = 0u; /*道岔数目*/ RouteAssocSwitchStruct routeAssocSwitchStru = {0,0}; /*道岔数据*/ - UINT8 routeProtectSwitchSum = 0u; /*防护道岔数目*/ - RouteProtectSwitchStruct* pRouteProtectSwitchStru = NULL; /*防护道岔数据*/ UINT8 chAutoCheck = 0U; UINT8 chSendLevel = 0U; chAutoCheck = AutoSignalOrRouteValid(routeId); @@ -3236,7 +3232,6 @@ UINT8 GetSwitchRouteLockState(UINT16 switchId) { UINT16 bufIndex = 0u; /*数组下标*/ UINT16 belongSecId = 0u; /*所属区段ID*/ - UINT16 doubleSwitchId = 0u; /*双动道岔ID*/ UINT8 belongPhySecState = 0u; /*所属物理区段的进路状态*/ UINT8 reVal = CI_ERROR; @@ -3258,21 +3253,7 @@ UINT8 GetSwitchRouteLockState(UINT16 switchId) } else { - doubleSwitchId = GetDSwitchOtherId(switchId);/*获取双动道岔ID*/ - if (doubleSwitchId != 0u) - {/*双动道岔非空*/ - - belongSecId = GetSwitchPhySectionId(doubleSwitchId); - belongPhySecState = GetPhySecLockState(belongSecId); - - if ((PHYSICAL_SECTION_LOCK_NORMAL == belongPhySecState) || - (PHYSICAL_SECTION_LOCK_PROTECT == belongPhySecState) || - (PHYSICAL_SECTION_LOCK_DELAY == belongPhySecState) || - (PHYSICAL_SECTION_LOCK_FAULTDELAY == belongPhySecState)) - { - reVal = CI_SUCCESS; - } - } + /*双动道岔锁闭状态不处理*/ } } return reVal; @@ -5128,8 +5109,9 @@ UINT8 GetOtherCiDevStatus(UINT16 const devType,UINT16 const devId,UINT16 const c devState = 0u; } break; - case CI_DEVICE_TYPE_PSD_EXCEPT_OPEN: /*站台屏蔽门(异常打开)*/ - devState = GePsdExceptOpenState(devId); + case CI_DEVICE_TYPE_PSD_EXCEPT_OPEN: /*站台屏蔽门(异常)*/ + devState = GePsdExceptState(devId); + /*宁象需求:屏蔽门异常打开又关闭、尚未取消异常状态时不开放信号*/ break; case CI_DEVICE_TYPE_GARAGEDOOR: /*车库门*/ tmpDevState = GetGaragedoorState(devId); @@ -5928,6 +5910,8 @@ UINT8 CheckJumpLockApply(UINT16 axisSectionId) UINT8 routeTrainNear = 0u; UINT8 physicalCheck = 0u; UINT8 phyPLockRouteState = 0u; + UINT16 devId = 0u; /*设备ID*/ + UINT8 devState = 0u; /*设备状态*/ physicalSecId = GetAxisSecRelativePhySecId(axisSectionId); routeRlockId = GetPhySecRLockBelongRouteId(physicalSecId);/*物理区段进路锁闭所属进路ID*/ @@ -6072,6 +6056,21 @@ UINT8 CheckJumpLockApply(UINT16 axisSectionId) } } } + + if (CI_SUCCESS == reVal) + {/*检查防护道岔位置*/ + devId = 0u; + devState = 0u; + reVal = AxisSecAllProtSwitchPosCheck(axisSectionId, &devId, &devState); + } + + if (CI_SUCCESS == reVal) + {/*检查防护道岔封锁状态*/ + devId = 0u; + devState = 0u; + reVal = AxisSecProtSwitchFLockCheck(axisSectionId, &devId, &devState); + } + return reVal; } @@ -6466,6 +6465,20 @@ UINT8 CheckLogJumpLockApply(UINT16 logSectionId) reVal = CI_SUCCESS; } } + + if (CI_SUCCESS == reVal) + {/*防护道岔封锁状态检查*/ + devId = 0u; /*设备ID*/ + devState = 0u; /*设备状态*/ + reVal = LogicSecRltvPrtctSwFlockCheck(logSectionId, &devId, &devState);/*封锁检查*/ + } + if (CI_SUCCESS == reVal) + {/*防护道岔位置检查*/ + devId = 0u; /*设备ID*/ + devState = 0u; /*设备状态*/ + reVal = LogicSecRltvPrtctSwPosCheck(logSectionId, &devId, &devState);/*位置检查*/ + } + } else { @@ -6767,10 +6780,17 @@ UINT8 JumpLockDriveSwitch(const UINT16 axisSecId) AxisSwitchStruct* pRouteSwitchStru = NULL; /*道岔数据结构指针*/ UINT8 innerSwitchRetVal = CI_ERROR; /*检查计轴区段内道岔是否可被驱动的结果*/ + + AxisSwitchStruct* pProtectSwitchStru = NULL; /*防护道岔数据结构指针*/ + UINT8 protectSwitchSum = 0u; + switchSum = GetAxisSwitchSum(axisSecId); pRouteSwitchStru = GetAxisSwitchIdStru(axisSecId); - if((0u == axisSecId) || (axisSecId >= AXIS_SECTION_SUM_MAX)) + protectSwitchSum = GetAxisSecRelateProSwSum(axisSecId); + pProtectSwitchStru = GetAxisSecRelateProSwStru(axisSecId); + + if((0u == axisSecId) || (axisSecId >= AXIS_SECTION_SUM_MAX)||(NULL == pRouteSwitchStru) || (NULL == pProtectSwitchStru)) { innerSwitchRetVal = CI_ERROR; } @@ -6798,6 +6818,32 @@ UINT8 JumpLockDriveSwitch(const UINT16 axisSecId) break; } } + + if (innerSwitchRetVal == CI_SUCCESS) + { + /* 单操相反位置取消驱动检查 */ + for (ii = 0u; ii < protectSwitchSum; ii++) + { + switchId = pProtectSwitchStru[ii].SwitchId; + switchExpPosition = pProtectSwitchStru[ii].SwitchPosition; + switchDancaoPosition = GetSwitchDanCaoPostition(switchId); + + if ((SWITCH_POSITION_INVALID == switchDancaoPosition) + || + (switchDancaoPosition == switchExpPosition)) + {/*单操无效 或者 单操位置与动作位置一样*/ + innerSwitchRetVal = CI_SUCCESS; + } + else + { + /*单操到相反位置取消道岔的驱动*/ + innerSwitchRetVal = CI_ERROR; + break; + } + } + } + + if(innerSwitchRetVal == CI_SUCCESS) { @@ -6831,20 +6877,35 @@ void AxisSecDrvInnerSwitch(const UINT16 axisSecId, const UINT8 DrivFlag) UINT8 ii = 0u; /*循环变量*/ UINT8 funRtn = CI_ERROR; + AxisSwitchStruct* pProtectSwitchStru = NULL; /*防护道岔数据结构指针*/ + UINT8 protectSwitchSum = 0u; + switchSum = GetAxisSwitchSum(axisSecId); /*获取计轴区段道岔数目*/ pAxisSecSwitchStru = GetAxisSwitchIdStru(axisSecId); /*获取计轴区段内道岔数据*/ + protectSwitchSum = GetAxisSecRelateProSwSum(axisSecId); + pProtectSwitchStru = GetAxisSecRelateProSwStru(axisSecId); - if(SWITCH_NEED_DRIV_TRUE == DrivFlag) - {/*需要驱动计轴区段内道岔*/ + if ((NULL != pAxisSecSwitchStru) && (NULL != pProtectSwitchStru)) + { + if (SWITCH_NEED_DRIV_TRUE == DrivFlag) + {/*需要驱动计轴区段内道岔*/ + + for (ii = 0u; ii < switchSum; ii++) + { + switchId = pAxisSecSwitchStru[ii].SwitchId; + switchExpPos = pAxisSecSwitchStru[ii].SwitchPosition; + funRtn = SwitchDriveProcess(switchId, switchExpPos); /*设置计轴区段内道岔的驱动状态为驱动中*/ + } + + for (ii = 0u; ii < protectSwitchSum; ii++) + { + switchId = pProtectSwitchStru[ii].SwitchId; + switchExpPos = pProtectSwitchStru[ii].SwitchPosition; + (void) SwitchDriveProcess(switchId, switchExpPos); /*设置计轴区段防护道岔的驱动状态为驱动中*/ + } - for(ii = 0u; ii < switchSum; ii++) - { - switchId = pAxisSecSwitchStru[ii].SwitchId; - switchExpPos = pAxisSecSwitchStru[ii].SwitchPosition; - funRtn = SwitchDriveProcess(switchId, switchExpPos); /*设置计轴区段内道岔的驱动状态为驱动中*/ } - } } @@ -7298,7 +7359,7 @@ UINT8 GetSwitchLogSecLockState(UINT16 switchId, UINT16* logOccOrLockId, UINT8* p UINT8 retValue = CI_ERROR; UINT8 chLogSecLogLockState = 0U; /*逻辑区段逻辑锁闭状态*/ UINT8 cLockBelongLogicRouteNum = 0U; /*逻辑区段逻辑锁闭所属逻辑进路数量*/ - + UINT8 chLogSecJumpLockState = 0U; /*获取道岔关联逻辑区段信息*/ logSecSum = GetSwitchLogSecSum(switchId); logSecBuf = GetSwitchLogSecBuf(switchId); @@ -7322,8 +7383,9 @@ UINT8 GetSwitchLogSecLockState(UINT16 switchId, UINT16* logOccOrLockId, UINT8* p /*检查逻辑区段逻辑锁闭状态*/ chLogSecLogLockState = GetLogSecLogLockState(logSecBuf[i]); cLockBelongLogicRouteNum = GetLogSecLockBelLogRouteSum(logSecBuf[i]); + chLogSecJumpLockState = GetLogSecJumpLockState(logSecBuf[i]); - if ((LOG_SECTION_LOGLOCK_NO == chLogSecLogLockState) && (0U == cLockBelongLogicRouteNum)) + if ((LOG_SECTION_LOGLOCK_NO == chLogSecLogLockState) && (0U == cLockBelongLogicRouteNum)&&(LOGIC_SECTION_JUMP_LOCK_NO== chLogSecJumpLockState)) { retValue = CI_SUCCESS; } @@ -11591,4 +11653,48 @@ UINT8 GetLocalVirCiType(UINT8 chVirCiId) } return ret; +} +/* +* 功能描述:判断本联锁临时限速状态 +* 参数说明:无 +* 返 回 值:临时限速有效返回失败,清除或与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) + { + chRet = CI_SUCCESS; + } + else + { + /*临时限速未确认,判断是否做了限速确认*/ + for (i = 0U; i < chVirCINum; i++) + { + chVirtualCIid = GetVirtualCIid(i); + chXiansuState = GetVirCILabourCancelLSXianSta(chVirtualCIid); + if ((LINSHIXIANSU_COMM_GOOD_STATE == chXiansuState) || (LINSHIXIANSU_LABOURCANCLE_YES_STATE == chXiansuState)) + { + chRet = CI_SUCCESS; + } + else + { + chRet = CI_ERROR; + break; + } + } + } + + return chRet; } \ 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 3c8947d..8bfe439 100644 --- a/TSCP/src/APP/ciapp/DataManage/DeviceDataManage.h +++ b/TSCP/src/APP/ciapp/DataManage/DeviceDataManage.h @@ -72,8 +72,13 @@ typedef struct S_AreaSnowInfoStruct * 其他联锁条件状态定义 *--------------------------------------------------------------------------*/ /* 其他联锁条件检查配置状态相关定义 */ -#define LOCAL_AREA_SNOW_SUM_MAX ((UINT8)20) /*本控区及相邻控区发送的区间雨雪站台数量*/ -#define ALL_AREA_SNOW_SUM_MAX ((UINT8)254) /*TMC发送的全线区间雨雪站台数量*/ +#define LOCAL_AREA_SNOW_SUM_MAX ((UINT8)20) /*本控区及相邻控区发送的区间雨雪站台数量*/ +#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 CBTC_CROSS_ID_MAX ((UINT8)253) /*CBTC跨压最大列车ID*/ +#define TACS_CROSS_ID_MAX ((UINT8)253) /*TACS跨压最大列车ID*/ /* 1 信号机 开放0x55 @@ -1975,4 +1980,12 @@ void SetLocalSnowModelCC(UINT8 setmodle); add by mpt 20260104 */ UINT8 GetLocalVirCiType(UINT8 chVirCiId); +/* +* 功能描述:判断本联锁临时限速状态 +* 参数说明:无 +* 返 回 值:临时限速有效返回失败,清除或与ZC通信正常返回成功 +* Created :LYJ +*/ + +UINT8 CheckLocalCiLSXSStata(void); #endif diff --git a/TSCP/src/APP/ciapp/EnvelopeManage/ELMDataPrepare.c b/TSCP/src/APP/ciapp/EnvelopeManage/ELMDataPrepare.c index aaf25b5..ceb020e 100644 --- a/TSCP/src/APP/ciapp/EnvelopeManage/ELMDataPrepare.c +++ b/TSCP/src/APP/ciapp/EnvelopeManage/ELMDataPrepare.c @@ -1529,7 +1529,7 @@ UINT8 elm_PrepareEnvelopeIsSelf(IN const EnvelopeStruct* ptemp) /** 在一个OC*/ ret = ELM_BELONG_OWNER; } - else if((localOCid != pointABelongOcid) && (localOCid != pointBBelongOcid)) + else if ((localOCid != pointABelongOcid) && (localOCid != pointBBelongOcid)) { /** 不在同一OC*/ ret = ELM_BELONG_OTHER; diff --git a/TSCP/src/APP/ciapp/IO/DeviceRelayDataProcess.c b/TSCP/src/APP/ciapp/IO/DeviceRelayDataProcess.c index 57d8a05..469a7cf 100644 --- a/TSCP/src/APP/ciapp/IO/DeviceRelayDataProcess.c +++ b/TSCP/src/APP/ciapp/IO/DeviceRelayDataProcess.c @@ -76,6 +76,11 @@ void OcSwitchDeviceOutput(void) UINT8 lineIdentity = GetCiFunctionSwitchConfig(LINE_RAILWAY_TYPE_CONF);/*获取线路标识:0x55:城轨交通;0xAA:单轨交通*/ UINT32 curNum = Get2oo2CurCycleNum(); UINT8 chSwitchJichaState = 0U;/*道岔挤岔状态*/ + UINT8 mainOcId = 0u;/*主控OCId*/ + UINT8 chLocalCiOCSswitch = 0U; + UINT8 chSwitchLastValidDrvPos = 0U; + + chLocalCiOCSswitch = GetLocalCiOCSswitch(); switchCurSum = GetSwitchCurSum(); /*获取道岔总数*/ localCiId = GetSystemParaLocalCiId(); /*获取本机联锁ID*/ @@ -355,8 +360,26 @@ void OcSwitchDeviceOutput(void) driveSwitchPos = GetSwitchDrivePostion(switchId); if ((SWITCH_DRIVE_POS_DINGWEI == driveSwitchPos) || (SWITCH_DRIVE_POS_FANWEI == driveSwitchPos)) { - (void)SetSwitchLastValidDrvPos(switchId, driveSwitchPos); - (void)SetSwitchLastValidPosDrivCycNum(switchId, curNum); + + + if (OC_S_ON == chLocalCiOCSswitch) + {/*OC-S开关打开*/ + mainOcId = GetSwitchMainCotrolOCId(switchId);/*获取主控OCID*/ + if (0u < mainOcId) + {/*有主控OC*/ + (void)SetSwitchLastValidDrvPos(switchId, driveSwitchPos); + (void)SetSwitchLastValidPosDrivCycNum(switchId, curNum); + } + else + { + /*无处理*/ + } + } + else + { + (void)SetSwitchLastValidDrvPos(switchId, driveSwitchPos); + (void)SetSwitchLastValidPosDrivCycNum(switchId, curNum); + } } chSwitchJichaState = GetSwitchPrompylyAlarmInfo(switchId); @@ -369,6 +392,29 @@ void OcSwitchDeviceOutput(void) } } } + + for (ii = 0U; ii < switchCurSum; ii++) + { + switchId = GetSwitchId(ii); /*获取道岔ID*/ + if ((0u < switchId) && (switchId < SWITCH_SUM_MAX)) + { + belongCiId = GetSwitchBelongCiId(switchId); /*获取道岔所属联锁ID*/ + if ((belongCiId == localCiId) && (0u != localCiId)) + { + curSwitchPos = GetSwitchCurPosition(switchId);/*获取道岔当前位置*/ + chSwitchLastValidDrvPos = GetSwitchLastValidDrvPos(switchId); + if (((SWITCH_POSITION_DINGWEI == curSwitchPos) && (SWITCH_DRIVE_POS_DINGWEI == chSwitchLastValidDrvPos)) + || ((SWITCH_POSITION_FANWEI == curSwitchPos) && (SWITCH_DRIVE_POS_FANWEI == chSwitchLastValidDrvPos))) + {/*之前驱动的定且当前采集定 或 之前驱动反且当前采集反*/ + SetSwitchOutputDrvCmdCycNum(switchId, 0u);/*驱动到位置了,清除驱动周期*/ + } + else + { + /*nothing do*/ + } + } + } + } } @@ -380,13 +426,14 @@ void OcSwitchDeviceOutput(void) * 功能描述: 获取OC道岔设备状态 * 参数说明: UINT16 switchId:道岔id + UINT8 mainControlOCId 主控OCId * 返回值 : * ((UINT8)0x01) 道岔定位 * ((UINT8)0x02) 道岔反位 * ((UINT8)0x04) 道岔四开 * ((UINT8)0x08) 道岔移动 */ -UINT8 GetOcSwitchState(UINT16 switchId) +UINT8 GetOcSwitchState(UINT16 switchId,UINT8 mainControlOCId) { UINT8 rtnSwitchState = 0u; UINT16 belongOcId = 0u; /*道岔所属oc ID*/ @@ -407,10 +454,13 @@ UINT8 GetOcSwitchState(UINT16 switchId) for (i = 0u; i < m_SwitchNum; i++) { if (m_Switches[i].DeviceId == switchId) - { - flagFind = 1u; - indexFind = i; - break; + {/*匹配到对应OC,对应道岔*/ + if ((0U == mainControlOCId) || (m_Switches[i].OcId == mainControlOCId)) + {/*当前无OC-S或有主控OC*/ + flagFind = 1u; + indexFind = i; + break; + } } } } @@ -517,7 +567,17 @@ UINT8 GetOcSwitchState(UINT16 switchId) void OcSwitchDeviceInput(void) { UINT16 switchCurSum = 0u; /*道岔总数目*/ + UINT8 chLocalCiOCSswitch = 0u; + chLocalCiOCSswitch = GetLocalCiOCSswitch(); + + switchCurSum = GetSwitchCurSum(); /*获取道岔总数*/ + + if (OC_S_ON == chLocalCiOCSswitch) + { + /*计算当前主控OC*/ + SetAllSwitchCurMainControlOC(switchCurSum); + } /*设置所有道岔单独位置*/ SetAllSingleSwitchCurPosition(switchCurSum); @@ -675,14 +735,16 @@ UINT8 GetOcSignalColor(UINT16 signalId) UINT8 sigCurShowColor = 0u;/*信号机当前显示的颜色*/ UINT8 sigColorLevel = 0u;/*信号机颜色级别*/ UINT8 funSwitchGreenYellow = GetCiFunctionSwitchConfig(CI_FUNCTION_SWITCH_SHOW_SIGNAL_GreenYellow);/*显示绿黄功能开关是否打开*/ - UINT8 ciType = GetLocalCiType(); + UINT8 ciType = 0U; UINT8 signalState = 0U; UINT16 bufIndex = 0U; UINT8 funSwitchALLCloseUseBlue = GetCiFunctionSwitchConfig(FUNC_SWITCH_ZX_ALLCLOSE_USEBLUE);/*杭德正线灭灯均转蓝灯功能开关*/ UINT8 chBlueDsFlag = FLAG_UNSET; + UINT8 chSigBelongRtuId = 0U; bufIndex = GetSignalConfigBufIndex(signalId); /*获取道岔数组下标*/ belongOcId = (UINT8)GetSignalBelongOcId(signalId);/*获取信号机所属Oc id*/ - + chSigBelongRtuId = GetSignalBelongVirCiId(signalId);/*获取信号机所属rtu id*/ + ciType = GetLocalVirCiType(chSigBelongRtuId); if ((0u < belongOcId) && (OC_SUM_MAX> belongOcId)) { /*m_OcToCiOrginDataArr[belongOcId].OcDevices*/ @@ -948,7 +1010,7 @@ UINT8 GetOcBoardFaultSignalColor(UINT16 signalId, UINT8 ocId) /*如果是灭灯,获取之前驱动的颜色*/ /*之前驱动无效*/ - if (SIGNAL_SHOWCOLOUR_INVALID == sigPreDriveColor) + if (SIGNAL_DRIVECOLOUR_NULL == sigPreDriveColor) { rtnSigColor = SIGNAL_SHOWCOLOUR_REDCLOSE; } @@ -2564,7 +2626,6 @@ void SignalRelayToDeviceStateProc(void) UINT16 detainRelayId = 0u;/*扣车继电器ID*/ UINT8 relayBelongCIId = 0u;/*继电器所属联锁ID*/ UINT8 relayCollState = 0u;/*继电器采集状态*/ - UINT8 signalType = 0u;/*信号机驱采类型*/ UINT8 signalBlockOpenColor = 0u;/*信号机后备开放颜色*/ UINT8 commState = 0u;/*通信状态*/ /*相邻联锁是否支持继电接口*/ @@ -2792,8 +2853,7 @@ void SignalRelayToDeviceStateProc(void) lxRelaySta = GetRelayCollState(lxRelayId);/*信号机列车信号继电器采集状态*/ if (RELAY_STATE_UP == lxRelaySta) { - signalType = GetSignalType(signalId);/*获取信号机驱采类型*/ - signalBlockOpenColor = GetSignalBlockOpenColorValue((UINT16)signalType);/*获取信号机后备开放颜色*/ + signalBlockOpenColor = GetSignalBlockOpenColorValue(signalId);/*获取信号机后备开放颜色*/ (void)SetSignalCurColor(signalId, signalBlockOpenColor);/*设置信号机当前颜色*/ } @@ -6113,7 +6173,7 @@ void PhySecRelayToDeviceStateProc(void) } } - +#if 0 /* * 功能描述: 更新区段计轴复位继电器状态 * 参数说明: void @@ -6355,6 +6415,7 @@ void PhySecResetToRelayStateProc(void) } } } +#endif /* * 功能描述: 更新区段计轴复位继电器状态 * 参数说明: void @@ -6365,7 +6426,7 @@ void PhySecResetToRelayStateProc_Vir(UINT8 virCIid) UINT8 const functionId = EFUNC_PHYSEC_RESET_TO_RELAY_STATE_PROC; /*函数故障码*/ UINT16 phySecId = 0u; /*物理区段ID*/ UINT16 ii = 0u; - UINT16 retValid = CI_ERROR; /*计轴总复位继电器状态有效性值,默认为无效*/ + UINT8 retValid = CI_ERROR; UINT8 retGeneralResetFlag = CI_PHYSEC_GENERAL_RESET_NO; UINT8 localCi = 0u;/*本CI编号*/ UINT16 relayZFWId = 0u; /*总复位继电器ID*/ @@ -6381,20 +6442,18 @@ void PhySecResetToRelayStateProc_Vir(UINT8 virCIid) UINT8 checkRelayRes = CI_TIME_OUT; UINT8 checkZFWValidRes = CI_TIME_OUT; UINT8 checkZFWcmdRes = CI_TIME_OUT; - UINT8 tmpRet = CI_ERROR; UINT8 occupyState = 0u; /*占用状态*/ UINT32 startCycNum = 0u; /*开始周期号*/ UINT8 resetType = 0u; /*计轴复位类型*/ - UINT8 preResetState = 0u; /*计轴预复位状态*/ UINT8 overTimeCheck = 0u; UINT8 belongVirCIid = 0u; UINT8 chCurSystemAreaState = 0U; /*系统当前区域状态*/ - + UINT16 wPhySecCurSum = 0U; localCi = GetSystemParaLocalCiId(); relayZFWId = GetZFWRelayId_UseVirCI(localCi, virCIid); /*总复位继电器ID*/ retGeneralResetFlag = GetVirCIZfwFlag(virCIid); /*获取物理区段计轴总复位继电器状态有效性*/ chCurSystemAreaState = GetLocalCiBackUpPattern(); - if (relayZFWId > 0u) + if (0U < relayZFWId) { relayZFWState = GetRelayCollState(relayZFWId); /*ZFWJ继电器采集状态*/ relayDrvAddrA = GetRelayDrvAddrA(relayZFWId); /*ZFWJ继电器A系驱动地址*/ @@ -6411,35 +6470,27 @@ void PhySecResetToRelayStateProc_Vir(UINT8 virCIid) {/*采集到ZFWJ吸起*/ if (CI_PHYSEC_GENERAL_RESET_YES == retGeneralResetFlag) {/*采集到ZFWJ吸起,且收到计轴总复位命令*/ - tmpRet = SetRelayStateUpdateCycNum(relayZFWId, 0u); /*清除ZFW总复位继电器有效起始周期号*/ - if (CI_ERROR == tmpRet) - { - /*错误处理*/ - retValid = CI_ERROR; + (void)SetRelayStateUpdateCycNum(relayZFWId, 0u); /*清除ZFW总复位继电器有效起始周期号*/ + checkZFWValidRes = SystemOverTimeCheck(rZFWValidCycNum, GetZFWJRelayDriveTimeCount()); + if (CI_TIME_NO == checkZFWValidRes) + {/*若未计时,则设置起始周期*/ + SetVirCIZfwValidCycNum(virCIid, curCycNum); /*设置ZFW总复位有效周期*/ + /*有效,执行计轴总复位功能*/ + (void)SetRelayDriveState(relayZFWId, RELAY_STATE_UP);/*设置计轴总复位继电器吸起*/ + + } + else if (CI_TIME_OUT == checkZFWValidRes) + {/*计轴总复位命令驱动超过最长时间*/ + SetVirCIZfwValidCycNum(virCIid, 0u); /*设置ZFW总复位无效周期*/ + /*执行取消计轴总复位功能*/ + SetPhySecZfwManage(virCIid, CI_PHYSEC_GENERAL_RESET_NO); /*清除物理区段计轴总复位继电器状态有效性*/ + (void)SetRelayDriveState(relayZFWId, RELAY_STATE_DOWN);/*设置计轴总复位继电器落下*/ + } else - { - checkZFWValidRes = SystemOverTimeCheck(rZFWValidCycNum, GetZFWJRelayDriveTimeCount()); - if (CI_TIME_NO == checkZFWValidRes) - {/*若未计时,则设置起始周期*/ - SetVirCIZfwValidCycNum(virCIid, curCycNum); /*设置ZFW总复位有效周期*/ - /*有效,执行计轴总复位功能*/ - (void)SetRelayDriveState(relayZFWId, RELAY_STATE_UP);/*设置计轴总复位继电器吸起*/ - retValid = CI_SUCCESS; - } - else if (CI_TIME_OUT == checkZFWValidRes) - {/*计轴总复位命令驱动超过最长时间*/ - SetVirCIZfwValidCycNum(virCIid, 0u); /*设置ZFW总复位无效周期*/ - /*执行取消计轴总复位功能*/ - SetPhySecZfwManage(virCIid, CI_PHYSEC_GENERAL_RESET_NO); /*清除物理区段计轴总复位继电器状态有效性*/ - (void)SetRelayDriveState(relayZFWId, RELAY_STATE_DOWN);/*设置计轴总复位继电器落下*/ - retValid = CI_ERROR; - } - else - {/*有效,执行计轴总复位功能*/ - (void)SetRelayDriveState(relayZFWId, RELAY_STATE_UP);/*设置计轴总复位继电器吸起*/ - retValid = CI_SUCCESS; - } + {/*有效,执行计轴总复位功能*/ + (void)SetRelayDriveState(relayZFWId, RELAY_STATE_UP);/*设置计轴总复位继电器吸起*/ + } } else @@ -6447,28 +6498,23 @@ void PhySecResetToRelayStateProc_Vir(UINT8 virCIid) checkRelayRes = SystemOverTimeCheck(relayZFWCycNum, ZFWJ_REYLAY_VALID_CYCLE_NUM); if (CI_TIME_NO == checkRelayRes) {/*若未计时,则设置起始周期*/ - tmpRet = SetRelayStateUpdateCycNum(relayZFWId, curCycNum);/*设置ZFWJ总复位继电器有效周期*/ - if (CI_ERROR == tmpRet) - { - /*错误处理*/ - retValid = CI_ERROR; - } + (void)SetRelayStateUpdateCycNum(relayZFWId, curCycNum);/*设置ZFWJ总复位继电器有效周期*/ } else if (CI_TIME_OUT == checkRelayRes) {/*计轴总复位命令驱动超过最长时间*/ - if ((relayDrvAddrA > 0u) && (relayDrvPosA > 0u) && (relayDrvAddrB > 0u) && (relayDrvPosB > 0u)) + if ((0U < relayDrvAddrA) && (0U < relayDrvPosA) && (0U < relayDrvAddrB) && (0U < relayDrvPosB)) {/*若联锁没有驱动ZFWJ,但是连续三个周期采集到ZFWJ吸起时,联锁增加给现地的报警提示“计轴总复位继电器混线”*/ - retValid = CI_ERROR; + SetVirCIZfwHunxianFlag(virCIid, ZFWJ_HUN_XIAN_YES); } else - {/*未配置驱动ZFWJ,采集到吸起可以继续执行计轴复位命令*/ - retValid = CI_SUCCESS; + { + /*未配置驱动ZFWJ*/ } } else - {/*未超过超时周期数*/ - retValid = CI_ERROR; + { + /*未超过超时周期数*/ } SetVirCIZfwValidCycNum(virCIid, 0u); /*设置ZFW总复位无效周期*/ /*执行取消计轴总复位功能*/ @@ -6476,115 +6522,112 @@ void PhySecResetToRelayStateProc_Vir(UINT8 virCIid) } } else - {/*采集到ZFWJ落下,不执行计轴复位逻辑处理*/ - retValid = CI_ERROR; - tmpRet = SetRelayStateUpdateCycNum(relayZFWId, 0u); /*清除ZFW总复位继电器有效起始周期号*/ - if (CI_ERROR == tmpRet) - { - /*错误处理*/ - } - else - { - SetVirCIZfwValidCycNum(virCIid, 0u); /*设置ZFW总复位无效周期*/ - if (CI_PHYSEC_GENERAL_RESET_YES == retGeneralResetFlag) - {/*有效,执行计轴总复位功能*/ - /*检查收到计轴总复位命令起始周期数*/ - checkZFWcmdRes = SystemOverTimeCheck(rZFWcmdStartCycNum, ZFWJ_REYLAY_VALID_CYCLE_NUM); - if (CI_TIME_OUT == checkZFWcmdRes) - {/*计轴总复位命令驱动超过最长时间*/ - /*无效,不执行计轴总复位功能*/ - SetPhySecZfwManage(virCIid, CI_PHYSEC_GENERAL_RESET_NO); /*计轴总复位命令无效*/ - (void)SetRelayDriveState(relayZFWId, RELAY_STATE_DOWN);/*设置计轴总复位继电器落下*/ - } - else - {/*未超过超时周期数*/ - (void)SetRelayDriveState(relayZFWId, RELAY_STATE_UP);/*设置计轴总复位继电器吸起*/ - } - } - else - {/*无效,不执行计轴总复位功能*/ + { + /*采集到ZFWJ落下*/ + (void)SetRelayStateUpdateCycNum(relayZFWId, 0u); /*清除ZFW总复位继电器有效起始周期号*/ + SetVirCIZfwValidCycNum(virCIid, 0u); /*设置ZFW总复位无效周期*/ + if (CI_PHYSEC_GENERAL_RESET_YES == retGeneralResetFlag) + {/*有效,执行计轴总复位功能*/ + /*检查收到计轴总复位命令起始周期数*/ + checkZFWcmdRes = SystemOverTimeCheck(rZFWcmdStartCycNum, ZFWJ_REYLAY_VALID_CYCLE_NUM); + if (CI_TIME_OUT == checkZFWcmdRes) + {/*计轴总复位命令驱动超过最长时间*/ + /*无效,不执行计轴总复位功能*/ + SetPhySecZfwManage(virCIid, CI_PHYSEC_GENERAL_RESET_NO); /*计轴总复位命令无效*/ (void)SetRelayDriveState(relayZFWId, RELAY_STATE_DOWN);/*设置计轴总复位继电器落下*/ } + else + {/*未超过超时周期数*/ + (void)SetRelayDriveState(relayZFWId, RELAY_STATE_UP);/*设置计轴总复位继电器吸起*/ + } + } + else + {/*无效,不执行计轴总复位功能*/ + (void)SetRelayDriveState(relayZFWId, RELAY_STATE_DOWN);/*设置计轴总复位继电器落下*/ } } } else - {/*无总复位继电器继续执行计轴复位功能*/ - retValid = CI_SUCCESS; + { + /*无总复位继电器继续执行计轴复位功能*/ } - if (CI_SUCCESS == retValid) - {/*有效,执行计轴复位功能*/ - for (ii = 0u; ii < GetPhySecCurSum(); ii++) - { - retValid = CI_ERROR; /*计轴总复位继电器状态有效性值置位为无效*/ - phySecId = GetPhySecId(ii);/*获取物理区段ID*/ - belongVirCIid = GetPhySecBelongVirCiId(phySecId); + /*执行计轴复位/预复位功能*/ + wPhySecCurSum = GetPhySecCurSum(); + for (ii = 0u; ii < wPhySecCurSum; ii++) + { + phySecId = GetPhySecId(ii); /*获取物理区段ID*/ + belongVirCIid = GetPhySecBelongVirCiId(phySecId); - if (SYSTEM_WORK_MODE_MAIN != chCurSystemAreaState) + if (SYSTEM_WORK_MODE_MAIN != chCurSystemAreaState) + { + /*当前系统不为主系,设置计轴复位起始周期号为0,不处理及对外组包计轴复位命令*/ + SetPhySecResetStartCycNum(phySecId, 0U); + } + else + { + ; + } + startCycNum = GetPhySecResetStartCycNum(phySecId); + if ((startCycNum > 0u) && (belongVirCIid == virCIid)) /*计轴复位*/ + { + occupyState = GetPhySecCurOccupyState(phySecId); + if (SECTION_OCCUPY_NO == occupyState) /*采集空闲*/ { - /*当前系统不为主系,设置计轴复位起始周期号为0,不处理及对外组包计轴复位命令*/ - SetPhySecResetStartCycNum(phySecId, 0U); + SetPhySecResetStartCycNum(phySecId, 0u);/*修改计轴复位起始周期号*/ + (void)SetRelayDriveState(GetPhySecFWRelayId(phySecId), RELAY_STATE_DOWN);/*设置计轴复位继电器落下*/ } - else + else /*采集占用*/ { - ; - } - startCycNum = GetPhySecResetStartCycNum(phySecId); - if ((startCycNum > 0u) && (belongVirCIid == virCIid)) /*计轴复位*/ - { - occupyState = GetPhySecCurOccupyState(phySecId); - if (SECTION_OCCUPY_NO == occupyState) /*采集空闲*/ + occupyState = GetPhySecCurTxOccupyState(phySecId); /*m by yt,修改缺陷:开始非通信车占用,在计轴复位过程中,有通信车占用后,未处理问题,2022年8月3日*/ + if (LOGICSECTION_OCCUPY_TX == occupyState) /*通信车占用*/ { SetPhySecResetStartCycNum(phySecId, 0u);/*修改计轴复位起始周期号*/ (void)SetRelayDriveState(GetPhySecFWRelayId(phySecId), RELAY_STATE_DOWN);/*设置计轴复位继电器落下*/ + SetErrorData(functionId, CI_DEVICE_TYPE_PHYSEC, phySecId, ETYPE_PS_NO_UT_CT_OCU_STATE, occupyState, ESEND_LEVEL_ATS); } - else /*采集占用*/ + else { - occupyState = GetPhySecCurTxOccupyState(phySecId); /*m by yt,修改缺陷:开始非通信车占用,在计轴复位过程中,有通信车占用后,未处理问题,2022年8月3日*/ - if (LOGICSECTION_OCCUPY_TX == occupyState) /*通信车占用*/ - { + overTimeCheck = SystemOverTimeCheck(GetPhySecResetStartCycNum(phySecId), GetSystemParaSectionResetCount()); + if (CI_TIME_OUT == overTimeCheck) + {/*区段计轴复位超时*/ + SetPhySecResetStartCycNum(phySecId, 0u);/*修改计轴复位起始周期号*/ (void)SetRelayDriveState(GetPhySecFWRelayId(phySecId), RELAY_STATE_DOWN);/*设置计轴复位继电器落下*/ - SetErrorData(functionId, CI_DEVICE_TYPE_PHYSEC, phySecId, ETYPE_PS_NO_UT_CT_OCU_STATE, occupyState, ESEND_LEVEL_ATS); +#if 0 + SetCiSendCmdBackInfoData(CI_BACK_PSEC_RESET_ERROR, CI_DEVICE_TYPE_PHYSEC, phySecId, 0u, 0u);/*反馈计轴复位失败*/ +#endif } else { - overTimeCheck = SystemOverTimeCheck(GetPhySecResetStartCycNum(phySecId), GetSystemParaSectionResetCount()); - if (CI_TIME_OUT == overTimeCheck) - {/*区段计轴复位超时*/ - - SetPhySecResetStartCycNum(phySecId, 0u);/*修改计轴复位起始周期号*/ - (void)SetRelayDriveState(GetPhySecFWRelayId(phySecId), RELAY_STATE_DOWN);/*设置计轴复位继电器落下*/ -#if 0 - SetCiSendCmdBackInfoData(CI_BACK_PSEC_RESET_ERROR, CI_DEVICE_TYPE_PHYSEC, phySecId, 0u, 0u);/*反馈计轴复位失败*/ -#endif - + resetType = GetPhySecSectionResetType(phySecId); + if (PHYSICAL_SECTION_PRE_RESET_YES != resetType) + { + retValid = GetZFWValidByPhySecId(phySecId); /*计轴复位:检查物理区段计轴总复位继电器状态有效性*/ } else { - retValid = GetZFWValidByPhySecId(phySecId); /*获取物理区段计轴总复位继电器状态有效性*/ - if (CI_SUCCESS == retValid) /*有效,执行计轴复位功能*/ - { - resetType = GetPhySecSectionResetType(phySecId); + retValid = CI_SUCCESS; /*计轴预复位不检查总复位有效性*/ + } - if ((PHYSICAL_SECTION_PRE_RESET_NO == resetType) || (PHYSICAL_SECTION_PRE_RESET_YES == resetType)) /*直接复位或者预复位*/ - { - (void)SetRelayDriveState(GetPhySecFWRelayId(phySecId), RELAY_STATE_UP);/*设置计轴复位继电器吸起,依赖超时驱动继电器落下*/ - } - else /*否则*/ - { - SetPhySecResetStartCycNum(phySecId, 0u);/*修改计轴复位起始周期号*/ - (void)SetRelayDriveState(GetPhySecFWRelayId(phySecId), RELAY_STATE_DOWN);/*设置计轴复位继电器落下*/ - } + if (CI_SUCCESS == retValid) /*有效,执行计轴复位功能*/ + { + if ((PHYSICAL_SECTION_PRE_RESET_NO == resetType) || (PHYSICAL_SECTION_PRE_RESET_YES == resetType)) /*直接复位或者预复位*/ + { + (void)SetRelayDriveState(GetPhySecFWRelayId(phySecId), RELAY_STATE_UP);/*设置计轴复位继电器吸起,依赖超时驱动继电器落下*/ } - else /*无效*/ + else /*否则*/ { SetPhySecResetStartCycNum(phySecId, 0u);/*修改计轴复位起始周期号*/ (void)SetRelayDriveState(GetPhySecFWRelayId(phySecId), RELAY_STATE_DOWN);/*设置计轴复位继电器落下*/ - SetCiSendCmdBackInfoData(CI_BACK_PSEC_RESET_ZFW_ERROR, CI_DEVICE_TYPE_PHYSEC, phySecId, 0u, 0u);/*反馈计轴复位失败:总复位继电器落下*/ } } + else /*无效*/ + { + SetPhySecResetStartCycNum(phySecId, 0u);/*修改计轴复位起始周期号*/ + (void)SetRelayDriveState(GetPhySecFWRelayId(phySecId), RELAY_STATE_DOWN);/*设置计轴复位继电器落下*/ + SetCiSendCmdBackInfoData(CI_BACK_PSEC_RESET_ZFW_ERROR, CI_DEVICE_TYPE_PHYSEC, phySecId, 0u, 0u);/*反馈计轴复位失败:总复位继电器落下*/ + } } } } @@ -7861,13 +7904,12 @@ UINT8 WashMachineDevToRelayStaProc(void) UINT16 WashTrainRequestRelayId = 0u; /*洗车请求继电器*/ UINT16 TrainHeadStopSteadyRelayId = 0u; /*车头停稳继电器*/ UINT16 TrainTailStopSteadyRelayId = 0u; /*车尾停稳继电器*/ + UINT16 wCoupingStopSteadyRelayId = 0u; /*联挂端停稳继电器*/ UINT16 pauseTrainWashRelayId = 0u; /*暂停洗车继电器*/ UINT16 passRequestRelayId = 0u; /*通过请求继电器*/ UINT8 retVal = CI_SUCCESS; UINT8 lineIdentity = 0u; /*CI-VOBC接口标识*/ - UINT8 xtaLogicState = 0u;/*洗车同意按钮逻辑状态*/ - lineIdentity = GetCiFunctionSwitchConfig(VOBC_INTERFACE_IDENTITY);/*获取CI-VOBC接口标识*/ washMachineSum = GetWashMachineSum(); /*获取洗车机当前总数*/ @@ -7985,6 +8027,41 @@ UINT8 WashMachineDevToRelayStaProc(void) /*未配置该继电器,继续执行*/ } + } + if (CI_SUCCESS == retVal) + { + wCoupingStopSteadyRelayId = GetCoupingStopSteadyRelayId(washMachineId); /*获取联挂端停稳继电器*/ + + if (0u != wCoupingStopSteadyRelayId) + {/*联挂端洗位停稳继电器ID有效*/ + if (WASHMACHINE_TAIL_STEADY_YES == GetCoupingStopSteadyDrvState(washMachineId)) + { + if (CI_ERROR == SetRelayDriveState(wCoupingStopSteadyRelayId, RELAY_STATE_UP)) + {/*联挂端停稳继电器*/ + retVal = CI_ERROR; + } + } + else if (WASHMACHINE_TAIL_STEADY_NO == GetCoupingStopSteadyDrvState(washMachineId)) + { + if (CI_ERROR == SetRelayDriveState(wCoupingStopSteadyRelayId, RELAY_STATE_DOWN)) + {/*联挂端停稳继电器*/ + retVal = CI_ERROR; + } + + } + else + { + if (CI_ERROR == SetRelayDriveState(wCoupingStopSteadyRelayId, RELAY_STATE_DOWN)) + {/*联挂端停稳继电器*/ + retVal = CI_ERROR; + } + } + } + else + { + /*未配置该继电器,继续执行*/ + } + } if (CI_SUCCESS == retVal) { @@ -8227,8 +8304,15 @@ UINT8 EsbRelayToDeviceStateProc(void) } } - /*同站紧急按钮及旁路按钮状态处理*/ - OnePlatEsbAndCutBtnProc(); + if (FUNC_SWITCH_ESB_NINGXIANG_RAIL == funcswitchZfsBtn) + { + /*同站紧急按钮及旁路按钮状态处理*/ + OnePlatEsbAndCutBtnProc(); + } + else + { + /*不处理*/ + } return reVal; } @@ -9414,7 +9498,6 @@ void WashMachinePassButtonUpdate(const UINT16 washMachineId) UINT8 chDownWashButtonGzType = CI_TIME_OUT; /*降级模式洗车同意按钮故障超时类型*/ UINT8 chDownWashReqState = WASH_REQ_STATE_ALLOW_NO; /*降级模式洗车请求状态*/ UINT32 dwDownWashPassReqCycle = 0U; /*降级模式反向洗车请求周期*/ - UINT32 dwDownWashApplyCycle = 0U; /*降级模式洗车请求起始周期*/ UINT32 dwWashButtonPressCycle = 0U; /*洗车同意按钮按下起始周期*/ UINT32 dwSelfCollSnCount = GetSelfButCollCount(); /*自复式按钮对应继电器采集有效周期数*/ UINT32 dwZfsBtnFaultCycNum = GetSelfButErrCount(); /*自复式扣车/紧急/调车同意按钮/降级模式洗车同意按钮/降级模式反向通过同意按钮故障判断时间*/ @@ -9908,6 +9991,7 @@ UINT8 WashMachineToDeviceStateProc(void) UINT16 headWashAllowRelayId = 0u; /*洗车机允许车头清洗继电器ID*/ UINT16 emergencyStopRelayId = 0u; /*洗车机列车紧急停车ID*/ UINT16 tailWashAllowRelayId = 0u; /*洗车机允许车尾清洗继电器ID*/ + UINT16 coupingWashAllowRelayId = 0u; /*洗车机允许联挂端清洗继电器ID*/ UINT16 outWashTrainPortAllowRelayId = 0u; /*洗车机允许出洗车库继电器ID*/ UINT8 ret = CI_SUCCESS; UINT8 lineIdentity = 0u; /*CI-VOBC接口标识*/ @@ -10030,6 +10114,41 @@ UINT8 WashMachineToDeviceStateProc(void) } } + if (CI_SUCCESS == ret) + { + /*联挂端洗车允许状态更新*/ + coupingWashAllowRelayId = GetCoupingWashAllowRelayId(washMachineId); + if (0U != coupingWashAllowRelayId) + { + /*洗车机允许联挂端清洗继电器ID有效*/ + relayCollState = GetRelayCollState(coupingWashAllowRelayId); + if (RELAY_STATE_UP == relayCollState) + { + retRsult = SetCoupingWashAllowState(washMachineId, WASHMACHINE_COL_COUPINGWASH_YES); + if (CI_ERROR == retRsult) + { + ret = CI_ERROR; + } + } + else if (RELAY_STATE_DOWN == relayCollState) + { + retRsult = SetCoupingWashAllowState(washMachineId, WASHMACHINE_COL_COUPINGWASH_NO); + if (CI_ERROR == retRsult) + { + ret = CI_ERROR; + } + } + else + { + ret = CI_ERROR; + } + } + else + { + /*若不配置该继电器,继续执行*/ + } + } + if (CI_SUCCESS == ret) { /*洗车机故障状态更新*/ @@ -11078,8 +11197,6 @@ void RouteDCTYRelayToDeviceStateProc(void) UINT16 routeId = 0U; /*进路ID*/ UINT8 localCi = 0U; UINT8 belongCi = 0U; - UINT8 tmpExecRes = CI_ERROR;/*临时执行结果*/ - UINT8 reVal = CI_ERROR;/*返回值*/ UINT16 routeDCTYId = 0U;/*调车同意继电器id*/ UINT8 relayCollState = 0U;/*继电器采集状态*/ UINT8 chRouteType = 0U; /*进路类型*/ @@ -11266,7 +11383,6 @@ void SetNoDriveSignalCurColor(const UINT16 signalId) UINT16 replxRelayId = 0u; /*复示列车信号继电器ID*/ UINT16 ddRelayId = 0u; /*点灯继电器ID*/ UINT8 blockOpenColor = 0u; /*后备模式需要开放颜色*/ - UINT8 signalType = 0u; /*信号机点灯电路类型*/ UINT8 repLxRelaySta = RELAY_STATE_DOWN; /*复示列车信号继电器状态*/ firDsRelayId = GetSignalFirstDsRelayId(signalId); /*获取信号机1灯丝继电器ID*/ @@ -11280,7 +11396,6 @@ void SetNoDriveSignalCurColor(const UINT16 signalId) blueRelayId = GetSignalBlueRelayId(signalId); /*蓝灯继电器ID*/ replxRelayId = GetSignalRepLxRelayId(signalId); ddRelayId = GetSignalDdRelayId(signalId); /*获取信号机点灯继电器ID*/ - signalType = GetSignalType(signalId); /*获取信号机点灯逻辑类型*/ repLxRelaySta = GetRelayCollState(replxRelayId); /*获取复示列车信号继电器继电器状态*/ /*只有采集:判断除了LXJ,其他继电器ID全为0u;武汉5-8号线联络线需求*/ @@ -11291,7 +11406,7 @@ void SetNoDriveSignalCurColor(const UINT16 signalId) if (RELAY_STATE_UP == repLxRelaySta) { /*获取信号机后背模式开放颜色*/ - blockOpenColor = GetSignalBlockOpenColorValue((UINT16)signalType); + blockOpenColor = GetSignalBlockOpenColorValue(signalId); /*设置灯色*/ (void)SetSignalCurColor(signalId, blockOpenColor); } @@ -12796,7 +12911,7 @@ void EsbRelateDelayDriveOutputProc(void) { if (FUNC_SWITCH_ON == funcswitchZfsBtn) { - /***** 自复式/宁象市域铁路ESB蜂鸣继电器驱动处理 *****/ + /***** 自复式ESB蜂鸣继电器驱动处理 *****/ /*1.设置自复式ESB蜂鸣继电器驱动状态*/ esbBuzzRelayId = GetEsbBuzzRelayId(esbId); if ((0u < esbBuzzRelayId) && (UINT16_MAX > esbBuzzRelayId)) @@ -15133,6 +15248,9 @@ void SetAllSingleSwitchCurPosition(UINT16 switchCurSum) UINT16 ii = 0U; /*循环索引*/ UINT8 chSwitchColPos = SWITCH_POSITION_INVALID; /*道岔当前位置*/ UINT8 chSwitchTolPos = SWITCH_POSITION_INVALID; /*道岔容忍后位置*/ + UINT8 ocId = 0u; + UINT8 chLocalCiOCSswitch = 0u; + chLocalCiOCSswitch = GetLocalCiOCSswitch(); localCiId = GetSystemParaLocalCiId(); /*获取本机联锁ID*/ for (ii = 0U; ii < switchCurSum; ii++) { @@ -15147,10 +15265,21 @@ void SetAllSingleSwitchCurPosition(UINT16 switchCurSum) if ((belongCiId == localCiId) && (0U != localCiId)) { - chSwitchColPos = GetOcSwitchState(switchId); - SetSwitchCollPos(switchId, chSwitchColPos); - chSwitchTolPos = GetSwitchCollToleratePos(switchId); - SetSingleSwitchCurPosition(switchId, chSwitchTolPos);/*设置道岔单独位置*/ + /*通过主控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);/*设置道岔单独位置*/ + } } } } @@ -16885,39 +17014,62 @@ void PsdExceptOpenProc(void) UINT8 cPsdState = 0U; /*PSD开关门状态*/ UINT16 wPsdRelPhySecId = 0U; /*PSD所处物理区段ID*/ UINT8 cPhySecMerOccState = 0U; /*站台轨融合占用状态*/ - + UINT8 startLockFlag = 0U;/*上电解锁标志*/ + UINT8 chCancleExceptType = GetCiFunctionSwitchConfig(FUNC_PSD_EXCEPT_CANCLE_TYPE);/*取消异常方式*/ + UINT8 chCancleCheck = CI_ERROR;/*是否异常状态*/ + startLockFlag = GetStartLockFlag(); wPsdCurNum = GetPsdSum(); - for (ii = 0U; ii < wPsdCurNum; ii++) + /*初始化未异常、解锁后设置、需人工取消*/ + if (CI_START_LOCK_NO == startLockFlag) { - wPsdId = GetPsdId(ii); - cPsdVirtualAttr = GetPsdVirtualAttribute(wPsdId); /*获取PSD虚拟属性*/ - if (PSD_VIRTUAL_ATTR_NO == cPsdVirtualAttr) + for (ii = 0U; ii < wPsdCurNum; ii++) { - cPsdMutualLockRemoveState = GetPsdMutualLockRemoveState(wPsdId); /*获取PSD互锁解除状态*/ - if (PSD_MUTUALLOCK_REMOVE_NO == cPsdMutualLockRemoveState) + wPsdId = GetPsdId(ii); + chCancleCheck = CI_ERROR; + cPsdVirtualAttr = GetPsdVirtualAttribute(wPsdId); /*获取PSD虚拟属性*/ + if(PSD_VIRTUAL_ATTR_NO == cPsdVirtualAttr) { - cPsdState = GetPsdState(wPsdId); /*获取PSD开关门状态*/ - wPsdRelPhySecId = GetPsdRelatedPhySecId(wPsdId); - cPhySecMerOccState = GetPhySecCurMergeState(wPsdRelPhySecId); - if ((PSD_STATE_OPEN == cPsdState) && (SECTION_OCCUPY_YES != cPhySecMerOccState)) + cPsdMutualLockRemoveState = GetPsdMutualLockRemoveState(wPsdId); /*获取PSD互锁解除状态*/ + if ((PSD_MUTUALLOCK_REMOVE_YES == cPsdMutualLockRemoveState) || (PSD_ATS_MUTUALLOCK_REMOVE_YES == cPsdMutualLockRemoveState) + || (PSD_ATS_AND_JD_MUTUALLOCK_REMOVE_YES == cPsdMutualLockRemoveState)) { - SetPsdExceptOpenState(wPsdId, PSD_EXCEPT_OPEN_YES); /*PSD打开且未占用,设置PSD异常打开*/ + chCancleCheck = CI_SUCCESS;/*互锁解除可取消*/ } else { - SetPsdExceptOpenState(wPsdId, PSD_EXCEPT_OPEN_NO); /*设置PSD未异常打开*/ + cPsdState = GetPsdState(wPsdId); /*获取PSD开关门状态*/ + wPsdRelPhySecId = GetPsdRelatedPhySecId(wPsdId); + cPhySecMerOccState = GetPhySecCurMergeState(wPsdRelPhySecId); + if ((PSD_STATE_CLOSE != cPsdState) && (SECTION_OCCUPY_YES != cPhySecMerOccState)) + { + SetPsdExceptState(wPsdId, PSD_EXCEPT_YES); /*PSD打开且未占用,设置PSD异常不可取消*/ + chCancleCheck = CI_ERROR; + } + else + { + chCancleCheck = CI_SUCCESS; + } + } + + if ((CI_SUCCESS == chCancleCheck) && (PSD_EXCEPT_CANCLE_RCI == chCancleExceptType)) + { + SetPsdExceptState(wPsdId, PSD_EXCEPT_NO); /*PSD未异常打开,配置联锁自动解除异常,设置PSD未异常*/ + } + else + { + ;/*维持异常打开或未配置联锁自动取消异常,需ATS命令解除异常*/ } } else { - SetPsdExceptOpenState(wPsdId, PSD_EXCEPT_OPEN_NO); /*互锁解除,设置PSD未异常打开*/ + SetPsdExceptState(wPsdId, PSD_EXCEPT_NO); /*虚拟PSD,设置PSD未异常*/ } } - else - { - SetPsdExceptOpenState(wPsdId, PSD_EXCEPT_OPEN_NO); /*虚拟PSD,设置PSD未异常打开*/ - } } + else + { + ;/*未解锁 不设置异常打开*/ + } } /* @@ -17736,4 +17888,633 @@ void OnePlatEsbAndCutBtnProc(void) /*不处理(不可达分支)*/ } } +} + +/* +* 功能描述:取消当前未异常打开的站台门的异常状态 +* 参数说明: const UINT16 doorId,屏蔽门ID +* 返回值 :无 +*Create fan 2026.03.26 +*/ +void CancelPsdExceptState(UINT16 doorId) +{ + UINT8 chPsdState = 0U; + UINT8 chPsdPlState = 0U;/*屏蔽门互锁解除状态*/ + UINT8 chExceptCheck = CI_ERROR;/*可否取消异常检查*/ + UINT16 wPsdRelPhySecId = 0U; /*PSD所处物理区段ID*/ + UINT8 cPhySecMerOccState = 0U; /*站台轨融合占用状态*/ + chPsdPlState = GetPsdMutualLockRemoveState(doorId); + chPsdState = GetPsdState(doorId); + if (CI_ERROR != chPsdPlState) + { + /*检查可否取消异常打开状态*/ + if ((PSD_MUTUALLOCK_REMOVE_YES == chPsdPlState) || (PSD_ATS_MUTUALLOCK_REMOVE_YES == chPsdPlState) || (PSD_ATS_AND_JD_MUTUALLOCK_REMOVE_YES == chPsdPlState)) + { + /*屏蔽门互锁解除*/ + chExceptCheck = CI_SUCCESS; + } + else if (PSD_STATE_CLOSE == chPsdState) + { + /*屏蔽门关*/ + chExceptCheck = CI_SUCCESS; + } + else + { + wPsdRelPhySecId = GetPsdRelatedPhySecId(doorId); + cPhySecMerOccState = GetPhySecCurMergeState(wPsdRelPhySecId); + if (SECTION_OCCUPY_YES == cPhySecMerOccState) + { + chExceptCheck = CI_SUCCESS; + } + else + { + /*站台区段未占用、且打开时 无法取消*/ + chExceptCheck = CI_ERROR; + } + } + if (CI_SUCCESS == chExceptCheck) + { + SetPsdExceptState(doorId, PSD_EXCEPT_NO); + } + else + { + ;/*无法取消异常的报警预留*/ + } + } + else + { + ;/*获取失败*/ + } +} + +/* +* 功能描述: 仲裁当前道岔的主控OC +* 参数说明: UINT16 switchCurSum 道岔总数 +* 返回值 : 无 +* add by mpt 20260326 +*/ +void SetAllSwitchCurMainControlOC(UINT16 switchCurSum) +{ + UINT8 localCiId = 0U; /*本地联锁ID*/ + UINT16 switchId = 0U; /*道岔ID*/ + UINT8 belongCiId = 0U; /*道岔所属联锁ID*/ + UINT16 ii = 0U; /*循环索引*/ + UINT8 ocId = 0u; + UINT8 chOcCotrolMode = 0U; + UINT8 otherOcId = 0U; + UINT8 chOtherOcCotrolMode = 0U; + + localCiId = GetSystemParaLocalCiId(); /*获取本机联锁ID*/ + for (ii = 0U; ii < switchCurSum; ii++) + { + switchId = 0U; /*道岔ID*/ + belongCiId = 0U; /*道岔所属联锁ID*/ + + switchId = GetSwitchId(ii); /*获取道岔ID*/ + + if ((0U != switchId) && (SWITCH_SUM_MAX > switchId)) + { + belongCiId = GetSwitchBelongCiId(switchId); /*获取道岔所属联锁ID*/ + + if ((belongCiId == localCiId) && (0U != localCiId)) + { + SetOcSwitchControlState(switchId);/*设置道岔关联所有OC的主控状态*/ + + ocId = GetSwitchIncludeOCId(switchId, 0u); + chOcCotrolMode = GetSwitchThisOcCotrolMode(switchId, ocId); + + otherOcId = GetSwitchThisOcOtherOCId(switchId, ocId); + chOtherOcCotrolMode = GetSwitchThisOcCotrolMode(switchId, otherOcId); + + if ((MAIN_CONTROL == chOcCotrolMode) && (STANDBY_CONTROL == chOtherOcCotrolMode)) + { + SetSwitchMainCotrolOCId(switchId, ocId);/*设置当前主控OC*/ + } + else if ((STANDBY_CONTROL == chOcCotrolMode) && (MAIN_CONTROL == chOtherOcCotrolMode)) + { + SetSwitchMainCotrolOCId(switchId, otherOcId);/*设置当前主控OC*/ + } + else + { + SetSwitchMainCotrolOCId(switchId, 0u);/*每周期将OC的主控状态清空*/ + } + + } + else + { + /*无处理*/ + } + } + else + { + /*无处理*/ + } + } +} + +/* +* 功能描述: 设置道岔的每一个OC的主控状态 +* 参数说明: + UINT16 switchId:道岔id +* 返回值 :void +* add by mpt 20260326 +*/ +void SetOcSwitchControlState(UINT16 switchId) +{ + UINT8 i = 0u; + UINT16 j = 0u; + UINT8 k = 0u; + UINT8 chIncludeOcNum = 0u; + UINT8 ocId = 0u; + UINT8 mainControlNum = 0u; + UINT8 chStanbyControlNum = 0u; + UINT8 chNoControlfunNum = 0u; + UINT8 chSwitchThisOCBoardNum = 0u; + UINT8 transmitState = 0u; + UINT8 chThisOcCotrolMode = 0U; + + chIncludeOcNum = GetSwitchIncludeOcNum(switchId); + + for (i = 0u; i < chIncludeOcNum; i++) + { + mainControlNum = 0u; + chStanbyControlNum = 0u; + chNoControlfunNum=0u; + ocId = GetSwitchIncludeOCId(switchId, i); + transmitState = GetCiTransmitState(CI_SYSTEM_TYPE_OC, ocId);/*OC通信状态采用报文头更新*/ + if (0u < ocId) + { + chSwitchThisOCBoardNum = GetSwitchThisOCBoardNum(switchId, ocId); + for (j = 0u; j < m_SwitchNum; j++) + { + if ((m_Switches[j].DeviceId == switchId)&&(m_Switches[j].OcId== ocId)) + { + for (k = 0u; k < m_Switches[j].BoardNum; k++) + { + if (MAIN_CONTROL == m_Switches[j].MainStandbyState[k]) + { + mainControlNum++; + } + else if (STANDBY_CONTROL == m_Switches[j].MainStandbyState[k]) + { + chStanbyControlNum++; + } + else if (NO_CONTROL_FUN == m_Switches[j].MainStandbyState[k]) + { + chNoControlfunNum++; + } + else + { + /*无处理*/ + } + } + + if (m_Switches[j].BoardNum == chSwitchThisOCBoardNum) + {/*保证OC发过来的和CI计算的一致*/ + if (m_Switches[j].BoardNum == mainControlNum) + {/*所有转辙机板都主控,并且OC发送板卡数等于联锁自身读取到的板卡数*/ + SetSwitchThisOcCotrolMode(switchId, ocId, MAIN_CONTROL); + } + else if (m_Switches[j].BoardNum == chStanbyControlNum) + {/*所有转辙机板都备控*/ + chThisOcCotrolMode = GetSwitchThisOcCotrolMode(switchId, ocId); + if (MAIN_CONTROL == chThisOcCotrolMode) + { + SetSwitchOutMainContrCmdCycNum(switchId, ocId, 0u);/*之前主控,当前备控则清除,通信中断导致的备控不会进入本分支,因为在通信中断处理模块已经清主控了*/ + } + SetSwitchThisOcCotrolMode(switchId, ocId, STANDBY_CONTROL); + + } + else if (m_Switches[j].BoardNum == chNoControlfunNum) + {/*所有转辙机板都无主备功能*/ + SetSwitchThisOcCotrolMode(switchId, ocId, NO_CONTROL_FUN); + } + else + {/*部分主部分备,则置为错误控制状态*/ + SetSwitchThisOcCotrolMode(switchId, ocId, ERR_MODE_CONTROL); + } + } + else + {/*防护代码,正常不会进入该分支*/ + if (TRANSMIT_STATE_GOOD == transmitState) + {/*有可能板卡没发全*/ + SetSwitchThisOcCotrolMode(switchId, ocId, ERR_MODE_CONTROL); + } + else + {/*通信中断,统一按备控处理*/ + SetSwitchThisOcCotrolMode(switchId, ocId, STANDBY_CONTROL); + } + } + break; + } + } + } + } +} + +/* +* 功能描述: OC道岔主控状态管理 +* 参数说明: void +* 返回值 : void +* add by mpt 20260328 +*/ +void OcSwitchControlModeCmdOutput(void) +{ + UINT16 switchCurSum = 0u; /*道岔总数目*/ + UINT8 localCiId = 0u; /*本地联锁ID*/ + UINT16 switchId = 0u; /*道岔ID*/ + UINT16 ii = 0u; /*循环索引*/ + + + switchCurSum = GetSwitchCurSum(); /*获取道岔总数*/ + localCiId = GetSystemParaLocalCiId(); /*获取本机联锁ID*/ + + + for (ii = 0u; ii < switchCurSum; ii++) + { + switchId = GetSwitchId(ii); /*获取道岔ID*/ + + if ((0u < switchId) && (SWITCH_SUM_MAX > switchId)) + { + /*主控命令生成模块*/ + OutSwitchControlModeCmd(switchId); + + /*双主状态校验模块*/ + SwitchDoubleMainProtect(switchId); + + /*寻表处理*/ + FindSwitchPostionCmdOut(switchId); + } + } +} + +/* +* 功能描述: OC道岔主控命令生成处理 +* 参数说明: UINT16 switchId 道岔ID +* 返回值 : void +* add by mpt 20260328 +*/ +void OutSwitchControlModeCmd(UINT16 switchId) +{ + UINT8 ocId = 0u; + UINT8 chPlusBoxSateState = 0u; + UINT8 chOCBoardState = 0U; + UINT8 otherOcId = 0u; + UINT32 chCurCycleNum = 0u; + UINT8 i = 0u; + UINT8 chSwitchIncludeOcNum = 0u; + UINT8 chOcCotrolMode = 0U; + UINT8 chOtherOcCotrolMode = 0U; + UINT8 chThisOcCmd = 0U; + UINT8 chOtherOcCmd = 0U; + + + chCurCycleNum = Get2oo2CurCycleNum(); + ocId = GetSwitchMainCotrolOCId(switchId);/*获取主控OCID*/ + + if (0u < ocId) + {/*当前存在主控OC*/ + chPlusBoxSateState = GetSwitchOcPlusBoxSateState(switchId, ocId); + chOCBoardState = GetSwitchThisOCBoardState(switchId, ocId); + otherOcId = GetSwitchThisOcOtherOCId(switchId, ocId); + if((SWITCH_BOX_NORMAL == chPlusBoxSateState)&&(SWITCH_BOARD_NORMAL == chOCBoardState)) + { + /*维持之前的输出命令,并刷新主控命令周期号*/ + SetSwitchThisOcOutControlCmd(switchId, ocId, MAIN_CONTROL); + SetSwitchOutMainContrCmdCycNum(switchId, ocId, chCurCycleNum); + + /*设置另一OC备控*/ + SetSwitchThisOcOutControlCmd(switchId, otherOcId, STANDBY_CONTROL); + + } + else + {/*生成备控命令*/ + SetSwitchThisOcOutControlCmd(switchId, ocId, STANDBY_CONTROL); + SetSwitchThisOcOutControlCmd(switchId, otherOcId, STANDBY_CONTROL); + } + } + else + {/*当前无主控,但是不能代表所有OC的所有板卡都是备,可能一个OC部分板卡主部分板卡备也进这个分支*/ + + 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); + + + chThisOcCmd = GetSwitchThisOcOutControlCmd(switchId, ocId); + chOtherOcCmd = GetSwitchThisOcOutControlCmd(switchId, otherOcId); + + if ((STANDBY_CONTROL == chThisOcCmd) && (STANDBY_CONTROL == chOtherOcCmd)) + {/*之前输出的双备*/ + if ((STANDBY_CONTROL == chOcCotrolMode) && (STANDBY_CONTROL == chOtherOcCotrolMode)) + {/*当前是双备状态*/ + /*当前OC主控命令输出处理*/ + SwitchMainControlCmdOut(switchId, ocId); + } + else + {/*输出本OC备控*/ + SetSwitchThisOcOutControlCmd(switchId, ocId, STANDBY_CONTROL); + } + } + else + {/*已经开始输出主控了,则需要卡不能有另OC主控即可*/ + if ((STANDBY_CONTROL == chOtherOcCotrolMode) && (STANDBY_CONTROL == chOtherOcCmd)) + {/*另OC为备控,且为备控命令*/ + /*当前OC主控命令输出处理*/ + SwitchMainControlCmdOut(switchId, ocId); + } + else + {/*输出本OC备控*/ + SetSwitchThisOcOutControlCmd(switchId, ocId, STANDBY_CONTROL); + } + } + } + } +} + +/* +* 功能描述: 道岔无主控时产生主备控命令处理 +* 参数说明: UINT16 switchId +* 返回值 : void +* add by mpt 20260328 +*/ +void SwitchMainControlCmdOut(UINT16 switchId,UINT8 ocId) +{ + UINT8 chPlusBoxSateState = 0U; + UINT8 chOCBoardState = 0U; + UINT8 otherOcId = 0u; + UINT32 chOutMainContrCmdCycNum = 0U; + UINT32 dwSwitchOutputDrvCmdCycNum = 0U;/*道岔驱动命令下发周期*/ + UINT32 dwDrvCutMaxCycNum = 0u; + UINT8 timeCheckRet = 0u; + UINT32 chCurCycleNum = 0u; + UINT8 ret = CI_ERROR; + + + chCurCycleNum = Get2oo2CurCycleNum(); + + chPlusBoxSateState = GetSwitchOcPlusBoxSateState(switchId, ocId); + chOCBoardState = GetSwitchThisOCBoardState(switchId, ocId); + otherOcId = GetSwitchThisOcOtherOCId(switchId, ocId); + + if ((SWITCH_BOX_NORMAL == chPlusBoxSateState) && (SWITCH_BOARD_NORMAL == chOCBoardState)) + {/*插箱正常且双系板卡正常*/ + if (0u < otherOcId) + {/*另一OC*/ + chOutMainContrCmdCycNum = GetSwitchOutMainContrCmdCycNum(switchId, otherOcId); + if (0U < chOutMainContrCmdCycNum) + {/*当前另一OC有升主操作*/ + dwDrvCutMaxCycNum = GetSwitchMachineCutInterval();/*道岔未在驱动期间的主控切换间隔时间*/ + timeCheckRet = SystemOverTimeCheck(chOutMainContrCmdCycNum, dwDrvCutMaxCycNum); + + if ((CI_TIME_OUT == timeCheckRet)&&(0u= dwSystemUpdateMainUseCycNum) { - dwRemainValidiy = HLHTCommonMsgRemainingValidity(dwTimeOutCout, dwCurCycleNum, dwCiCurappCycleTime, gSzRcAxleHLHTHeadCtxs[axisSysId].sourceRecvOppMsgSN, gSzRcAxleHLHTHeadCtxs[axisSysId].sourceCrntOwnMsgSN, gSzRcAxleHLHTHeadCtxs[axisSysId].sourcePreOwnMsgSN, gSzRcAxleHLHTHeadCtxs[axisSysId].sourceComPeriod); - dwSystemUpdateMainUseCycNum = GetSystemUpdateMainUseCycNum(); - /*通用报文头校验合法*/ - if (gSzRcAxleHLHTHeadCtxs[axisSysId].sourceRecvOppMsgSN >= dwSystemUpdateMainUseCycNum) - { - /* RC与计轴报文头有效,对方收到上一次RC周期号大于等于升主周期号 */ - } - else - { - debug_infor_printf((const)"\nProcessAxleToCiData Error CI HLHTCommonMsgRemainingValidity Fail,sourceRecvOppMsgSN = %d,dwRemainValidiy = %d \n", gSzRcAxleHLHTHeadCtxs[axisSysId].sourceRecvOppMsgSN, dwRemainValidiy); - /* RC与计轴报文头无效*/ - dwRemainValidiy = -1; - } - } - - if (0 < dwRemainValidiy) - { - if ((axisSysId < AXIS_TO_CI_SUM_MAX) && (dwCurCycleNum == axisToCiDataStru[axisSysId].dwLastRecvDataCycNum)) - { - /*CI与AXIS通信良好*/ - for (jj = 0u; jj < axisToCiDataStru[axisSysId].SectionSum; jj++) - { - secId = axisToCiDataStru[axisSysId].axisDataStr[jj].PhySecId; - colAxisRelaySta = axisToCiDataStru[axisSysId].axisDataStr[jj].gdRelayState; - - if (RELAY_STATE_UP == colAxisRelaySta) - { - secOccupySta = SECTION_OCCUPY_NO; - } - else if (RELAY_STATE_DOWN == colAxisRelaySta) - { - secOccupySta = SECTION_OCCUPY_YES; - } - else - { - secOccupySta = SECTION_OCCUPY_YES; - } - (void)SetPhySecCurAxisGdOccupyState(secId, secOccupySta); - - /*计轴预复位*/ - acFty = GetCiFunctionSwitchConfig(FUNC_SWITCH_AC_FACTORY); - if (AXIS_TYPE_KEANDA == acFty) - { - if (RELAY_STATE_UP == axisToCiDataStru[axisSysId].axisDataStr[jj].PreResetRst) - { - /*计轴预复位继电器吸起*/ - SetPhySecPreResetState(secId, PHYSICAL_SECTION_PRE_RESET_YES); /*设置计轴预复位状态有效*/ - } - else if (RELAY_STATE_DOWN == axisToCiDataStru[axisSysId].axisDataStr[jj].PreResetRst) - { - /*计轴预复位继电器落下*/ - SetPhySecPreResetState(secId, PHYSICAL_SECTION_PRE_RESET_NO); /*设置计轴预复位状态无效*/ - } - else - { - /*异常值*/ - SetPhySecPreResetState(secId, PHYSICAL_SECTION_PRE_RESET_NO); /*设置计轴预复位状态无效*/ - } - - /*科安达无直接复位状态接口,但后面为了计轴复位统一处理,这里设置成无效*/ - SetPhySecDirectResetState(secId, PHYSICAL_DIRECT_RESET_NO); /*设置计轴直接复位状态无效*/ - } - else if (AXIS_TYPE_FUHAOSHENG == acFty) - { - if ((RELAY_STATE_UP == axisToCiDataStru[axisSysId].axisDataStr[jj].PreResetRst) - && (RELAY_STATE_UP == axisToCiDataStru[axisSysId].axisDataStr[jj].chDirectResetRst)) - { - /*预复位和立即复位同时有效,导向异常*/ - SetPhySecPreResetState(secId, PHYSICAL_SECTION_PRE_RESET_NO); /*设置计轴预复位状态无效*/ - SetPhySecDirectResetState(secId, PHYSICAL_DIRECT_RESET_NO); /*设置计轴直接复位状态无效*/ - SetPhySecPreResetBack(secId, PHY_RESET_BACK_RECIVE_YES); - SetPhySecDirectResetBack(secId, PHY_RESET_BACK_RECIVE_YES); - } - else - { - if (RELAY_STATE_UP == axisToCiDataStru[axisSysId].axisDataStr[jj].PreResetRst) - { - /*计轴预复位继电器吸起*/ - SetPhySecPreResetState(secId, PHYSICAL_SECTION_PRE_RESET_YES); /*设置计轴预复位状态有效*/ - } - else if (RELAY_STATE_DOWN == axisToCiDataStru[axisSysId].axisDataStr[jj].PreResetRst) - { - /*计轴预复位继电器落下*/ - SetPhySecPreResetState(secId, PHYSICAL_SECTION_PRE_RESET_NO); /*设置计轴预复位状态无效*/ - } - else - { - /*异常值*/ - SetPhySecPreResetState(secId, PHYSICAL_SECTION_PRE_RESET_NO); /*设置计轴预复位状态无效*/ - } - - if (RELAY_STATE_UP == axisToCiDataStru[axisSysId].axisDataStr[jj].chPreResetBack) - { - /*计轴预复位反馈-接收到*/ - SetPhySecPreResetBack(secId, PHY_RESET_BACK_RECIVE_YES); - } - else if (RELAY_STATE_DOWN == axisToCiDataStru[axisSysId].axisDataStr[jj].chPreResetBack) - { - /**计轴预复位反馈-未接收到*/ - SetPhySecPreResetBack(secId, PHY_RESET_BACK_RECIVE_NO); - } - else - { - /*异常值*/ - SetPhySecPreResetBack(secId, PHY_RESET_BACK_RECIVE_YES); - } - - if (RELAY_STATE_UP == axisToCiDataStru[axisSysId].axisDataStr[jj].chDirectResetRst) - { - /*计轴直接复位继电器吸起*/ - SetPhySecDirectResetState(secId, PHYSICAL_DIRECT_RESET_YES); /*设置计轴直接复位状态有效*/ - } - else if (RELAY_STATE_DOWN == axisToCiDataStru[axisSysId].axisDataStr[jj].chDirectResetRst) - { - /*计轴直接复位继电器落下*/ - SetPhySecDirectResetState(secId, PHYSICAL_DIRECT_RESET_NO); /*设置计轴直接复位状态无效*/ - } - else - { - /*异常值*/ - SetPhySecDirectResetState(secId, PHYSICAL_DIRECT_RESET_NO); /*设置计轴直接复位状态无效*/ - } - - if (RELAY_STATE_UP == axisToCiDataStru[axisSysId].axisDataStr[jj].chDirectResetBack) - { - /*计轴直接复位反馈-接收到*/ - SetPhySecDirectResetBack(secId, PHY_RESET_BACK_RECIVE_YES); - } - else if (RELAY_STATE_DOWN == axisToCiDataStru[axisSysId].axisDataStr[jj].chDirectResetBack) - { - /**计轴直接复位反馈-未接收到*/ - SetPhySecDirectResetBack(secId, PHY_RESET_BACK_RECIVE_NO); - } - else - { - /*异常值*/ - SetPhySecDirectResetBack(secId, PHY_RESET_BACK_RECIVE_YES); - } - } - - } - else if (AXIS_TYPE_STANDARD_INTERFACE == acFty) - { - if (RELAY_STATE_UP == axisToCiDataStru[axisSysId].axisDataStr[jj].PreResetRst) - { - /*计轴预复位继电器吸起*/ - SetPhySecPreResetState(secId, PHYSICAL_SECTION_PRE_RESET_YES); /*设置计轴预复位状态有效*/ - } - else if (RELAY_STATE_DOWN == axisToCiDataStru[axisSysId].axisDataStr[jj].PreResetRst) - { - /*计轴预复位继电器落下*/ - SetPhySecPreResetState(secId, PHYSICAL_SECTION_PRE_RESET_NO); /*设置计轴预复位状态无效*/ - } - else - { - /*异常值*/ - SetPhySecPreResetState(secId, PHYSICAL_SECTION_PRE_RESET_NO); /*设置计轴预复位状态无效*/ - } - - /*设置计轴直接复位状态无效-目前不使用该状态,仅为了逻辑统一*/ - SetPhySecDirectResetState(secId, PHYSICAL_DIRECT_RESET_NO); - - /*接口已经校验,这里直接设置*/ - SetPhySecResetCmdTagBack(secId, axisToCiDataStru[axisSysId].axisDataStr[jj].chResetCmdTagBack); - } - else - { - ; /*其他接口不处理*/ - } - } - - - } - else - { - ; - /*不处理*/ - } + /* RC与计轴报文头有效,对方收到上一次RC周期号大于等于升主周期号 */ } else { - debug_infor_printf((const)"\nProcessAxleToCiData Error HLHTCommonMsgRemainingValidity Fail,\n"); - /*CI与AXIS通信中断,把AXIS设备状态导向安全侧*/ - dwCurCycNum = Get2oo2CurCycleNum(); - dwLastRecvAxisDataCycNum = GetCiTransmitRecvDataCycNum(localCiId, CI_SYSTEM_TYPE_AXIS, axisSysId); - dwCommBadEnsureCount = GetCiAndAxleTransBadEnsureCnt(); + debug_infor_printf((const)"\nProcessAxleToCiData Error CI HLHTCommonMsgRemainingValidity Fail,sourceRecvOppMsgSN = %d,dwRemainValidiy = %d \n", gSzRcAxleHLHTHeadCtxs[axisSysId].sourceRecvOppMsgSN, dwRemainValidiy); + /* RC与计轴报文头无效*/ + dwRemainValidiy = -1; + } + } + + if (0 < dwRemainValidiy) + { + if ((axisSysId < AXIS_TO_CI_SUM_MAX) && (dwCurCycleNum == axisToCiDataStru[axisSysId].dwLastRecvDataCycNum) && (SYSTEM_WORK_MODE_MAIN == chCurSystemAreaState)) + { + /*CI与AXIS通信良好*/ for (jj = 0u; jj < axisToCiDataStru[axisSysId].SectionSum; jj++) { secId = axisToCiDataStru[axisSysId].axisDataStr[jj].PhySecId; + colAxisRelaySta = axisToCiDataStru[axisSysId].axisDataStr[jj].gdRelayState; - (void)SetPhySecCurAxisGdOccupyState(secId, SECTION_OCCUPY_FAULT); - SetPhySecPreResetState(secId, PHYSICAL_SECTION_PRE_RESET_NO); /*设置计轴预复位状态无效*/ - SetPhySecDirectResetState(secId, PHYSICAL_DIRECT_RESET_NO); /*设置计轴直接复位状态无效*/ - SetPhySecPreResetBack(secId, PHY_RESET_BACK_RECIVE_YES); - SetPhySecDirectResetBack(secId, PHY_RESET_BACK_RECIVE_YES); - - if (dwCurCycNum == (dwLastRecvAxisDataCycNum + dwCommBadEnsureCount + 1U)) + if (RELAY_STATE_UP == colAxisRelaySta) { - SetSecColOccupyStartCycNum(secId, dwCurCycNum); + secOccupySta = SECTION_OCCUPY_NO; + } + else if (RELAY_STATE_DOWN == colAxisRelaySta) + { + secOccupySta = SECTION_OCCUPY_YES; } else { - /*仅通信中断当周期更新一次物理区段采集占用起始周期*/ + secOccupySta = SECTION_OCCUPY_YES; + } + (void)SetPhySecCurAxisGdOccupyState(secId, secOccupySta); + + /*计轴预复位*/ + acFty = GetCiFunctionSwitchConfig(FUNC_SWITCH_AC_FACTORY); + if (AXIS_TYPE_KEANDA == acFty) + { + if (RELAY_STATE_UP == axisToCiDataStru[axisSysId].axisDataStr[jj].PreResetRst) + { + /*计轴预复位继电器吸起*/ + SetPhySecPreResetState(secId, PHYSICAL_SECTION_PRE_RESET_YES); /*设置计轴预复位状态有效*/ + } + else if (RELAY_STATE_DOWN == axisToCiDataStru[axisSysId].axisDataStr[jj].PreResetRst) + { + /*计轴预复位继电器落下*/ + SetPhySecPreResetState(secId, PHYSICAL_SECTION_PRE_RESET_NO); /*设置计轴预复位状态无效*/ + } + else + { + /*异常值*/ + SetPhySecPreResetState(secId, PHYSICAL_SECTION_PRE_RESET_NO); /*设置计轴预复位状态无效*/ + } + + /*科安达无直接复位状态接口,但后面为了计轴复位统一处理,这里设置成无效*/ + SetPhySecDirectResetState(secId, PHYSICAL_DIRECT_RESET_NO); /*设置计轴直接复位状态无效*/ + } + else if (AXIS_TYPE_FUHAOSHENG == acFty) + { + if ((RELAY_STATE_UP == axisToCiDataStru[axisSysId].axisDataStr[jj].PreResetRst) + && (RELAY_STATE_UP == axisToCiDataStru[axisSysId].axisDataStr[jj].chDirectResetRst)) + { + /*预复位和立即复位同时有效,导向异常*/ + SetPhySecPreResetState(secId, PHYSICAL_SECTION_PRE_RESET_NO); /*设置计轴预复位状态无效*/ + SetPhySecDirectResetState(secId, PHYSICAL_DIRECT_RESET_NO); /*设置计轴直接复位状态无效*/ + SetPhySecPreResetBack(secId, PHY_RESET_BACK_RECIVE_YES); + SetPhySecDirectResetBack(secId, PHY_RESET_BACK_RECIVE_YES); + } + else + { + if (RELAY_STATE_UP == axisToCiDataStru[axisSysId].axisDataStr[jj].PreResetRst) + { + /*计轴预复位继电器吸起*/ + SetPhySecPreResetState(secId, PHYSICAL_SECTION_PRE_RESET_YES); /*设置计轴预复位状态有效*/ + } + else if (RELAY_STATE_DOWN == axisToCiDataStru[axisSysId].axisDataStr[jj].PreResetRst) + { + /*计轴预复位继电器落下*/ + SetPhySecPreResetState(secId, PHYSICAL_SECTION_PRE_RESET_NO); /*设置计轴预复位状态无效*/ + } + else + { + /*异常值*/ + SetPhySecPreResetState(secId, PHYSICAL_SECTION_PRE_RESET_NO); /*设置计轴预复位状态无效*/ + } + + if (RELAY_STATE_UP == axisToCiDataStru[axisSysId].axisDataStr[jj].chPreResetBack) + { + /*计轴预复位反馈-接收到*/ + SetPhySecPreResetBack(secId, PHY_RESET_BACK_RECIVE_YES); + } + else if (RELAY_STATE_DOWN == axisToCiDataStru[axisSysId].axisDataStr[jj].chPreResetBack) + { + /**计轴预复位反馈-未接收到*/ + SetPhySecPreResetBack(secId, PHY_RESET_BACK_RECIVE_NO); + } + else + { + /*异常值*/ + SetPhySecPreResetBack(secId, PHY_RESET_BACK_RECIVE_YES); + } + + if (RELAY_STATE_UP == axisToCiDataStru[axisSysId].axisDataStr[jj].chDirectResetRst) + { + /*计轴直接复位继电器吸起*/ + SetPhySecDirectResetState(secId, PHYSICAL_DIRECT_RESET_YES); /*设置计轴直接复位状态有效*/ + } + else if (RELAY_STATE_DOWN == axisToCiDataStru[axisSysId].axisDataStr[jj].chDirectResetRst) + { + /*计轴直接复位继电器落下*/ + SetPhySecDirectResetState(secId, PHYSICAL_DIRECT_RESET_NO); /*设置计轴直接复位状态无效*/ + } + else + { + /*异常值*/ + SetPhySecDirectResetState(secId, PHYSICAL_DIRECT_RESET_NO); /*设置计轴直接复位状态无效*/ + } + + if (RELAY_STATE_UP == axisToCiDataStru[axisSysId].axisDataStr[jj].chDirectResetBack) + { + /*计轴直接复位反馈-接收到*/ + SetPhySecDirectResetBack(secId, PHY_RESET_BACK_RECIVE_YES); + } + else if (RELAY_STATE_DOWN == axisToCiDataStru[axisSysId].axisDataStr[jj].chDirectResetBack) + { + /**计轴直接复位反馈-未接收到*/ + SetPhySecDirectResetBack(secId, PHY_RESET_BACK_RECIVE_NO); + } + else + { + /*异常值*/ + SetPhySecDirectResetBack(secId, PHY_RESET_BACK_RECIVE_YES); + } + } + + } + else if (AXIS_TYPE_STANDARD_INTERFACE == acFty) + { + if (RELAY_STATE_UP == axisToCiDataStru[axisSysId].axisDataStr[jj].PreResetRst) + { + /*计轴预复位继电器吸起*/ + SetPhySecPreResetState(secId, PHYSICAL_SECTION_PRE_RESET_YES); /*设置计轴预复位状态有效*/ + } + else if (RELAY_STATE_DOWN == axisToCiDataStru[axisSysId].axisDataStr[jj].PreResetRst) + { + /*计轴预复位继电器落下*/ + SetPhySecPreResetState(secId, PHYSICAL_SECTION_PRE_RESET_NO); /*设置计轴预复位状态无效*/ + } + else + { + /*异常值*/ + SetPhySecPreResetState(secId, PHYSICAL_SECTION_PRE_RESET_NO); /*设置计轴预复位状态无效*/ + } + + /*设置计轴直接复位状态无效-目前不使用该状态,仅为了逻辑统一*/ + SetPhySecDirectResetState(secId, PHYSICAL_DIRECT_RESET_NO); + + /*接口已经校验,这里直接设置*/ + SetPhySecResetCmdTagBack(secId, axisToCiDataStru[axisSysId].axisDataStr[jj].chResetCmdTagBack); + } + else + { + ; /*其他接口不处理*/ } } - } + + } + else + { + ; + /*不处理*/ + } } - } - else - { - ; + else + { + debug_infor_printf((const)"\nProcessAxleToCiData Error HLHTCommonMsgRemainingValidity Fail,\n"); + /*CI与AXIS通信中断,把AXIS设备状态导向安全侧*/ + dwCurCycNum = Get2oo2CurCycleNum(); + dwLastRecvAxisDataCycNum = GetCiTransmitRecvDataCycNum(localCiId, CI_SYSTEM_TYPE_AXIS, axisSysId); + dwCommBadEnsureCount = GetCiAndAxleTransBadEnsureCnt(); + for (jj = 0u; jj < axisToCiDataStru[axisSysId].SectionSum; jj++) + { + secId = axisToCiDataStru[axisSysId].axisDataStr[jj].PhySecId; + + (void)SetPhySecCurAxisGdOccupyState(secId, SECTION_OCCUPY_FAULT); + SetPhySecPreResetState(secId, PHYSICAL_SECTION_PRE_RESET_NO); /*设置计轴预复位状态无效*/ + SetPhySecDirectResetState(secId, PHYSICAL_DIRECT_RESET_NO); /*设置计轴直接复位状态无效*/ + SetPhySecPreResetBack(secId, PHY_RESET_BACK_RECIVE_YES); + SetPhySecDirectResetBack(secId, PHY_RESET_BACK_RECIVE_YES); + + if (dwCurCycNum == (dwLastRecvAxisDataCycNum + dwCommBadEnsureCount + 1U)) + { + SetSecColOccupyStartCycNum(secId, dwCurCycNum); + } + else + { + /*仅通信中断当周期更新一次物理区段采集占用起始周期*/ + } + } + } + } } else { - ; /*备系不处理*/ + ; } + } /* @@ -959,6 +967,8 @@ void ProcessOcToCiData(void) UINT8 chSwitchZzjIndex = 0U; UINT8 chOcId = 0U; UINT8 transmitState = 0U; + UINT8 chThisOcCotrolMode = 0u; + localCiId = GetSystemParaLocalCiId(); curCycle = Get2oo2CurCycleNum(); @@ -1004,6 +1014,12 @@ void ProcessOcToCiData(void) { pTempOc->OcDevices[jj].szSwitchIncldeZzjState[chSwitchZzjIndex] = OC_SWITCH_POSITION_SIKAI; } + + for (kk = 0u; kk < MAX_OC_SWITCH_INCLUDE_BOARD_NUM; kk++) + { + pTempOc->OcDevices[jj].MainStandbyState[kk] = STANDBY_CONTROL;/*备控制权*/ + } + } else { @@ -1012,6 +1028,14 @@ void ProcessOcToCiData(void) } + /*通信中断,设置插箱故障*/ + for (jj = 0u; jj < pTempOc->chPbNum; jj++) + { + /* 插箱故障 */ + pTempOc->szPlusBox[jj].chAsState = SWITCH_BOX_FAULT; + } + + /*把转换后的信号机数据重置状态*/ for (jj = 0u; jj < CI_SIGNAL_MAX; jj++) { @@ -1041,6 +1065,28 @@ void ProcessOcToCiData(void) { m_Switches[jj].szSwitchIncldeZzjState[j] = OC_SWITCH_POSITION_SIKAI;/*四开*/ } + + for (j = 0U; j < MAX_OC_SWITCH_INCLUDE_BOARD_NUM; j++) + { + m_Switches[jj].MainStandbyState[j] = STANDBY_CONTROL;/*备控*/ + } + + SetSwitchOcPlusBoxSateState(m_Switches[jj].DeviceId, 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); + } + + /*通信中断降状态为备控并设置周期号*/ + chThisOcCotrolMode = GetSwitchThisOcCotrolMode(m_Switches[jj].DeviceId, 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做升主控操作时需延时一定时间*/ + } + } } @@ -1083,7 +1129,6 @@ void ProcessOcToCiData(void) SetAllCleFarePCBButKeepSta(pTempOc->OcId,QK_PSD_BUTTON_STATE_UP); /*与OC通信中断,清除屏蔽门信息*/ - SetOcToCiDefaultDataStru(ii); } @@ -1308,13 +1353,11 @@ void ProcessZcToCiData(void) UINT16 floodId = 0u; UINT8 dianshiLinshixiansuFlag = 0u; UINT8 jizhongqulsxsFlag = 0u;/*ZC通信中断后是否设置集中区临时限速开关 0x55设置 0xaa不设置*/ - UINT8 labourCancelLinShiXian = 0u; UINT16 signalCurSum = 0u; UINT16 logicSecCurSum = 0u; UINT16 axisSecCurSum = 0u; UINT16 phySecCurSum = 0u; UINT16 routeCurSum = 0u; - UINT8 logSecLinShiXianSuSetState = 0u; UINT8 phySecJumpDelayUnlockFlag = 0u; UINT8 belongCiId = 0u; UINT16 garagedoorSum = 0u; @@ -1329,7 +1372,7 @@ void ProcessZcToCiData(void) UINT16* pAxisSectionIdBuf = NULL;/*物理区段对应计轴区段ID*/ UINT8 cTsrSureFlag = CI_TSR_SURE_NO; ZcToCiDataStruct* pZcToCiDataStru = NULL; /*ZC信息数据结构体*/ - UINT8 indIcatorDevId = 0U; /*指示灯设备ID*/ + UINT16 indIcatorDevId = 0U; /*指示灯设备ID*/ UINT16 wNonAutoReturnCurSum = 0U;/*无人折返当前总数*/ localCiId = GetSystemParaLocalCiId(); @@ -1403,6 +1446,8 @@ void ProcessZcToCiData(void) tmpPhyId = GetAxisSecRelativePhySecId(deviceId); SetPhySecArbState(tmpPhyId,AXIS_SECTION_ARB_NO); + + SetAxisSecArbStateZc(deviceId, AXIS_SECTION_ARB_NO); } phySecCurSum = GetPhySecCurSum(); for (ii = 0u; ii < phySecCurSum; ii++) @@ -1460,6 +1505,9 @@ void ProcessZcToCiData(void) } } + + /*清空跨压结构体*/ + SetCbtcCrossInfo(0u, NULL, NULL); } /*else if( TRANSMIT_STATE_GOOD == GetCiTransmitState(CI_SYSTEM_TYPE_ZC, 0u))*/ else if(1U == dataValidFlag) @@ -1519,6 +1567,7 @@ void ProcessZcToCiData(void) { SetAxisJumpLockState(pAxisSectionIdBuf[jj], AXIS_SECTION_JUMPLOCK_STATE_IDLE);/*通信中断设置计轴区段跳跃锁闭状态为空闲*/ (void)SetAxisSecJumpLockApplyCylce(pAxisSectionIdBuf[jj], 0U);/*清零计轴区段跳跃锁闭申请周期号*/ + SetAxisRelProSwitchLockSta(pAxisSectionIdBuf[jj], SWITCH_LOCK_PROTECT_CANCEL);/*取消防护锁闭*/ } } } @@ -1644,6 +1693,25 @@ void ProcessZcToCiData(void) { /*不处理*/ } + + /*处理ZC发送的CBTC主控列车跨压信息*/ + if (CI_SUCCESS == reVal) + { + if ((1u == dataValidFlag) && (ALL_CBTC_CROSS_SUM_MAX >= pZcToCiDataStru->wCbtcCrossNum)) + { + /*设置*/ + SetCbtcCrossInfo(pZcToCiDataStru->wCbtcCrossNum, + pZcToCiDataStru->wCbtcCrossSignalId, pZcToCiDataStru->wCbtcCrossTrainId); + } + else + { + reVal = CI_ERROR; + } + } + else + { + /*不处理*/ + } } } #endif @@ -1791,33 +1859,15 @@ void ProcessVobcToCiData(void) UINT8 ii = 0u; UINT8 jj = 0u; UINT8 kk = 0u; - UINT16 wRouteIndex = 0u; - UINT16 wRouteSum = 0u; UINT8 vobcToCiDataSum = GetVobcToCiSum(); VobcToCiDataStruct* vobcToCiDataStru = GetVobcToCiDataStru(); UINT8 chLineIdentity = GetCiFunctionSwitchConfig(VOBC_INTERFACE_IDENTITY);/*获取线路标识*/ UINT8 dataValid = 0u; - UINT8 bufIndex = 0u; - UINT16 psdId = 0u; UINT8 localCiId = 0u; - UINT8 belongCiId = 0u; - UINT8 deviceSum =0u;/*通信设备总数*/ - UINT8* deviceIdBuf = NULL;/*通信设备ID数组*/ - UINT8 platformId = 0u; - UINT16 platformPsdId = 0u; - UINT16 wRouteId = 0u; - UINT16 wTrainId = 0u; - UINT32 dwDelayTime = 0u; - UINT32 dwVobcBrkTime = 0u; - UINT16 phySecCurSum = 0u; - UINT16 deviceId = 0u; - UINT8 funRet = CI_ERROR; UINT8 getResult = CI_ERROR; UINT32 dwCurCycNum = 0U; UINT32 dwTransmitBadEnsureCount = 0U; /*CI与VOBC通信中断判断时间*/ - UINT8 cTrainReportState = 0U; - UINT8 cCheckFlag = CI_ERROR; localCiId = GetSystemParaLocalCiId(); @@ -1872,6 +1922,10 @@ void ProcessVobcToCiData(void) ClearPsdVobcContext(vobcToCiDataStru[ii].VobcId); break; } + if (TRAIN_MAIN_MODE != vobcToCiDataStru[ii].controlMode) + {/*非主控,清除命令*/ + vobcToCiDataStru[ii].PsdData[jj].CmdType = 0u; + } if ((PSD_INVALID_ID != vobcToCiDataStru[ii].PsdData[jj].PsdId)&&(TRAIN_MAIN_MODE ==vobcToCiDataStru[ii].controlMode)) {/*PSD ID有效*/ @@ -2027,7 +2081,7 @@ void ProcessVobcToCiData(void) /*清除洗车机VOBC的驱动状态*/ ClearWashVobcDriveState(&(vobcToCiDataStru[ii])); - /*清除列车接口信息*/ + /*清除列车接口信息--(含点连式信息)*/ VobcConnectDataClear(vobcToCiDataStru[ii].VobcId); /*删除该VOBC到CI的数据*/ @@ -2339,7 +2393,6 @@ UINT8 ProcessAtsOrXianDiToCiData(void) UINT32 commandId = 0u; /*命令id*/ UINT16 terminalId = 0u; /*终端id*/ UINT16 ii = 0u; /*游标*/ - UINT8 localCiType = GetLocalCiType(); UINT8 checkRetVal = CI_FALSE; UINT16 cmd_idx = 0u; UINT16 wATSToCiCmdReturnToTRCurSum = 0u;/*信号特开命令数目*/ @@ -2363,7 +2416,6 @@ UINT8 ProcessAtsOrXianDiToCiData(void) UINT8 startFLockFlag =0u; UINT8 startLockFlag = 0u; UINT8 ciTrainTestState =0u; - UINT8 allSwitchYLockFlag = 0u; UINT8 OrderCheckReVal = 0u; UINT8 belongVirCIid = 0u; UINT8 virCiID = 0u; @@ -2385,6 +2437,7 @@ UINT8 ProcessAtsOrXianDiToCiData(void) UINT8 jkjRelayValidFlag = 0U; UINT8 chCldAndScxMergeFlag = 0U; UINT8 interfaceType = 0U; + UINT8 chVirtualAttribute = 0U; localCiId = GetSystemParaLocalCiId(); /*获取本机联锁ID*/ /*解析ATS或联锁命令*/ @@ -4469,6 +4522,16 @@ UINT8 ProcessAtsOrXianDiToCiData(void) checkRetVal = AFFIRM_FAIL; } + break; + case ATS_CMD_CANCEL_PSD_EXCEPT:/*解除屏蔽门异常*/ + belongVirCIid = GetPsdbelongVirCIid(CmdDeviceId); + chVirtualAttribute = GetPsdVirtualAttribute(CmdDeviceId); + OrderCheckReVal = CheckOrderWhetherDoing(virCiID, belongVirCIid, cmdType, CmdDeviceId);/*检查命令能否被执行*/ + if((CI_SUCCESS == OrderCheckReVal)&& (PSD_VIRTUAL_ATTR_NO == chVirtualAttribute)) + { + /*非虚拟站台门 检查并设置未异常*/ + (void)CancelPsdExceptState(CmdDeviceId); + } break; default: localVirCiType = GetLocalVirCiType(virCiID); @@ -4862,8 +4925,6 @@ UINT8 MaskDataProcess(const UINT8 systemType,const UINT8* maskBuf, const UINT16 UINT16 ii = 0u; /*游标*/ UINT16 jj = 0u; UINT16 maskConfigSum = 0u; /*码位配置中码位的总数*/ - UINT8 indicatorContainRelaySum = 0u;/*表示灯包含继电器数目*/ - UINT16* indicatorContainRelayIdBuf = NULL;/*表示灯包含继电器ID数组*/ UINT8 returnValue = CI_SUCCESS;/*返回值默认成功*/ UINT8 funcSwitchJumpLockDriveSwitch = 0u;/*功能开关:跳跃锁闭是否驱道岔*/ @@ -4878,7 +4939,6 @@ UINT8 MaskDataProcess(const UINT8 systemType,const UINT8* maskBuf, const UINT16 UINT16 *pPhyAxisIDBuf = NULL; UINT16 numAxisHaveJumpLockApply = 0u;/*计轴区段有跳跃锁闭申请的数量*/ UINT8 applyFlag = 0u;/*申请标志*/ - UINT8 chRtnIndcDevId = 0U;/*无人折返指示灯设备ID*/ ciid = GetSystemParaLocalCiId();/*获取本联锁ID*/ phyNum = GetPhySecCurSum(); @@ -4989,10 +5049,12 @@ UINT8 MaskDataProcess(const UINT8 systemType,const UINT8* maskBuf, const UINT16 if (1U == maskBuf[ii]) { SetAxisSecArbState(DeviceId, AXIS_SECTION_ARB_YES); /*设置ARB*/ + SetAxisSecArbStateZc(DeviceId, AXIS_SECTION_ARB_YES); } else { SetAxisSecArbState(DeviceId, AXIS_SECTION_ARB_NO); /*设置未ARB*/ + SetAxisSecArbStateZc(DeviceId, AXIS_SECTION_ARB_NO); } break; case MASK_TYPE_LIECHE_STOPSTATE:/*列车停稳信息状态码位*/ @@ -5310,7 +5372,7 @@ void ProcessCiToCiData(void) if (0U != chMainMode) { ClearNearRCISendInfo(tranCiIdBuf[jj], chMainMode); - debug_infor_printf((const)"\ProcessCiToCiData Near CI%x %d TRANSMIT_STATE_BAD.\n", chMainMode, tranCiIdBuf[jj]); + debug_infor_printf((const)"\n ProcessCiToCiData Near CI%x %d TRANSMIT_STATE_BAD.\n", chMainMode, tranCiIdBuf[jj]); } else { @@ -6587,6 +6649,8 @@ static void HLHTVOBCDataProc(VobcToCiDataStruct* vobcToCiDataStru) { ClearVobcStopSteadyData(vobcToCiDataStru->VobcId); StopSteadyDataProc(vobcToCiDataStru); /*处理VOBC停稳信息数据*/ + /*处理VOBC点连式信息数据*/ + VobcBlocLinkDataProc(vobcToCiDataStru); } } /* @@ -6604,8 +6668,6 @@ static void StopSteadyDataProc(VobcToCiDataStruct* vobcToCiDataStru) UINT8 utOrCtOccFlag = SECTION_OCCUPY_YES; UINT8 phyBelongCiId = 0u; UINT8 chRCMode = GetLocalRcWorkMode(); - UINT8 chControlMode = 0U; - UINT8 chMainControl = 0u; if (NULL != vobcToCiDataStru) { if (VOBC_CI_STOP_TW == vobcToCiDataStru->trainStopSteadyState) @@ -8245,14 +8307,6 @@ static void ResetCiDevStateHlht(UINT8 const ciId) void ClearPsdVobcContext(const UINT16 vobcId) { UINT16 bufIndex = 0u; /*数组下标*/ - UINT16 psdId = 0u; - UINT8 ii = 0u; - UINT8 jj = 0u; - UINT8 deviceSum =0u;/*通信设备总数*/ - UINT8* deviceIdBuf = NULL;/*通信设备ID数组*/ - UINT8 platformId = 0u; - UINT8 psdSum = 0u; - UINT16 platformPsdId = 0u; for(bufIndex=0u;bufIndexcouplingWashStopSteadyInfo) + { + /*尾端停稳请求有效*/ + SetCoupingStopSteadyDrvState(washMachineId, WASHMACHINE_TAIL_STEADY_YES); + } + else + { + SetCoupingStopSteadyDrvState(washMachineId, WASHMACHINE_TAIL_STEADY_NO); + } + if (WASHMACHINE_PAUSE_DRVREQ_TRUE == vobcToCiDataStru->washPauseRequest) { /*暂停洗车请求有效*/ @@ -10015,6 +10073,7 @@ void ClearWashVobcDriveState(VobcToCiDataStruct* vobcToCiDataStru) SetWashTrainRequestDrvState(washMachineId, WASHMACHINE_DRVSTATE_REQ_FALSE); SetTrainHeadStopSteadyDrvState(washMachineId, WASHMACHINE_HEAD_STEADY_NO); SetTrainTailStopSteadyDrvState(washMachineId, WASHMACHINE_TAIL_STEADY_NO); + SetCoupingStopSteadyDrvState(washMachineId, WASHMACHINE_COUPING_STEADY_NO); SetPauseTrainWashRequestDrvSta(washMachineId, WASHMACHINE_PAUSE_DRVREQ_FALSE); SetPassWashMachineReqtDrvSta(washMachineId, PASS_WASHMACHINE_DRVREQ_FALSE); SetWashMachineWorkModeDrvState(washMachineId, WASHMACHINE_WORKMODE_INVALID_DRV); @@ -11510,12 +11569,18 @@ void ProcessOcToCiRelayDiffData(void) } else { - /*点位采集不一致容忍超时,记录*/ - pTempIODiffData[i].OcId = (UINT8)ocId; /*OC ID*/ - pTempIODiffData[i].LocalBoardAdd[pTempIODiffData[i].DiffPointNum] = BoardAddress_ForProcess;/*点位对应的板卡地址*/ - pTempIODiffData[i].OtherBoardAdd[pTempIODiffData[i].DiffPointNum] = BoardAddress_ForProcessOther;/*对系板卡地址*/ - pTempIODiffData[i].TheDiffPoint[pTempIODiffData[i].DiffPointNum] = k + 1u;/*不一致的点位*/ - pTempIODiffData[i].DiffPointNum++; /*点位数量*/ + if (IO_COLL_DIFF_MAX > pTempIODiffData[i].DiffPointNum) + { + /*点位采集不一致容忍超时,记录*/ + pTempIODiffData[i].OcId = (UINT8)ocId; /*OC ID*/ + pTempIODiffData[i].LocalBoardAdd[pTempIODiffData[i].DiffPointNum] = BoardAddress_ForProcess;/*点位对应的板卡地址*/ + pTempIODiffData[i].OtherBoardAdd[pTempIODiffData[i].DiffPointNum] = BoardAddress_ForProcessOther;/*对系板卡地址*/ + pTempIODiffData[i].TheDiffPoint[pTempIODiffData[i].DiffPointNum] = k + 1u;/*不一致的点位*/ + pTempIODiffData[i].DiffPointNum++; /*点位数量*/ + } + else + {/*不处理*/ + } } } else @@ -11611,6 +11676,18 @@ void ProcessCiAndRcInfo(void) /*非本控区RC,不处理*/ } } + else if (CI_SYSTEM_TYPE_RC == CI_SYSTEM_TYPE_RCI) + { + if (cLocalCiId == pTransDecIdBuf[ii]) + { + /*RC与本CI通信中断,清空ZC跨压信息*/ + SetCbtcCrossInfo(0u, NULL, NULL); + } + else + { + /*非本控区CI,不处理*/ + } + } else { /*不处理*/ @@ -12179,17 +12256,12 @@ void SignalInfoMergeDeal(void) static void ProcessVobcToRcData(void) { UINT16 ii = 0U; - UINT8 jj = 0U; UINT8 chValid = CI_ERROR; - UINT8 mainValid = CI_ERROR; - UINT8 headCheck = CI_ERROR; - UINT8 psdCmdCode = 0U; - UINT8 cRcWorkMode = 0U; UINT8 vobcToRcDataSum = 0u; UINT32 dwDelayTime = 0U; UINT32 dwVobcBrkTime = 0U; - UINT8 funRet = 0u; + UINT8 tempVobcNum = 0U; vobcToRcDataSum = GetVobcToRcSum(); @@ -12261,15 +12333,11 @@ static void ProcessVobcToRcData(void) static void VobcInputRefreshTrain(const VobcToRcDataStruct stvobcToRcData) { UINT16 wTrainId = 0U; - UINT32 dwCurCycle = 0U; - UINT8 chIndex = 0U; - TrainEaStru szTmp[EA_MAX_NUM] = { 0U }; UINT8 chRet = 0U; wTrainId = ((UINT16)(CI_SYSTEM_TYPE_VOBC * 256U)) + stvobcToRcData.VobcId; - chRet = SetTrainTransmitStat(wTrainId, TRAIN_COMM_STATE_GOOD); chRet &= SetVobcTrainDir(wTrainId, stvobcToRcData.trainDirection); chRet &= SetVobcTrainSpeed(wTrainId, stvobcToRcData.wTrainSpeed); chRet &= SetVobcTrainSpeedDir(wTrainId, stvobcToRcData.chSpeedDir); @@ -12292,7 +12360,6 @@ static void VobcInputRefreshTrain(const VobcToRcDataStruct stvobcToRcData) SetVobcTrainMode(wTrainId, stvobcToRcData.chTrainMode);/*列车驾驶模式*/ - SetTrainMsgFromTiocId(wTrainId, 0U); if (CI_ERROR == chRet) { @@ -12315,7 +12382,7 @@ static void VobcToRcDataClear(const UINT16 wTrainId) if ((TRAIN_SUM_MAX > wTrainId) && (0U < wTrainId)) { (void)SetVobcTrainSpeed(wTrainId, 0u); - (void)SetVobcTrainLevel(wTrainId, TRAIN_LEVEL_BACKUP_UNKNOWN); + (void)SetVobcTrainLevel(wTrainId, TRAIN_LEVEL_UR); (void)SetVobcTrainMaxHeadLink(wTrainId, 0u); (void)SetVobcTrainMaxTailLink(wTrainId, 0u); @@ -12350,8 +12417,6 @@ void SignalTrainCrossPro(void) UINT16 ii = 0U; UINT16 wSignalId = 0U; /*信号机ID*/ UINT8 cSignalBelongCiId = 0U; /*信号机所属控区*/ - UINT8 cSignalCurColor = 0U; /*信号机当前颜色*/ - UINT8 cSignalOpenState = 0U; /*信号机开放状态*/ UINT16 wStartRelRouteSum = 0U; /*以该信号机为始端信号机的进路数量*/ UINT16* pStartRelRouteId = NULL; /*以该信号机为始端信号机的进路ID*/ UINT16 jj = 0U; @@ -12361,68 +12426,87 @@ void SignalTrainCrossPro(void) UINT8 cRouteResTrainSum = 0U; /*进路资源列车数量*/ UINT16 szRouteResTrainId[LOGIC_SECTION_RES_SUM_MAX] = { 0U }; /*进路资源列车ID*/ UINT8 cTrainEnterState = 0U; /*列车驶入进路状态*/ + UINT16 cTrainCtrlState = TRAIN_NO_MODE; /*列车主控VOBC*/ + UINT8 wTacsCrossTrainId = 0u; /*TACS主控跨压列车ID*/ + UINT8 cPrevCrossState = 0u; /*之前跨压状态*/ cLocalCiId = GetSystemParaLocalCiId(); wSignalCurSum = GetSignalCurSum(); for (ii = 0U; ii < wSignalCurSum; ii++) { + /*先将信号机跨压状态置为未跨压,列车ID清零*/ + cSignalCrossState = SIGNAL_CROSS_STATE_NO; + wTacsCrossTrainId = 0u; + wSignalId = GetSignalId(ii); cSignalBelongCiId = GetSignalBelongCiId(wSignalId); if (cLocalCiId == cSignalBelongCiId) { - cSignalCurColor = GetSignalCurColor(wSignalId); /*获取信号机颜色和开放状态*/ - cSignalOpenState = GetSignalOpenCloseState(cSignalCurColor); - if (SIGNAL_OPEN == cSignalOpenState) + wStartRelRouteSum = GetStartSignalRouteSum(wSignalId); /*获取以该信号机为始端信号机的进路数目*/ + pStartRelRouteId = GetStartSignalRouteBuf(wSignalId); /*获取以该信号机为始端信号机的进路ID数组*/ + cPrevCrossState = GetSignalCrossStateCC(wSignalId); + if ((0U < wStartRelRouteSum) && (NULL != pStartRelRouteId)) { - wStartRelRouteSum = GetStartSignalRouteSum(wSignalId); /*获取以该信号机为始端信号机的进路数目*/ - pStartRelRouteId = GetStartSignalRouteBuf(wSignalId); /*获取以该信号机为始端信号机的进路ID数组*/ - if ((0U < wStartRelRouteSum) && (NULL != pStartRelRouteId)) + for (jj = 0U; jj < wStartRelRouteSum; jj++) { - for (jj = 0U; jj < wStartRelRouteSum; jj++) + cRouteState = GetRouteState(pStartRelRouteId[jj]); /*获取进路状态*/ + cRouteLevel = GetRouteLevel(pStartRelRouteId[jj]); /*获取进路级别*/ + if (((ROUTE_STATE_NEAR_OPEN == cRouteState) || (SIGNAL_CROSS_STATE_YES == cPrevCrossState)) + && (ROUTE_LEVEL_CBTC == cRouteLevel)) { - cRouteState = GetRouteState(pStartRelRouteId[jj]); /*获取进路状态*/ - cRouteLevel = GetRouteLevel(pStartRelRouteId[jj]); /*获取进路级别*/ - if ((ROUTE_STATE_NEAR_OPEN == cRouteState) && (ROUTE_LEVEL_CBTC == cRouteLevel)) - { - cFunRet = GetRouteInOutFstLgcTrainInfo(pStartRelRouteId[jj], &cRouteResTrainSum, szRouteResTrainId); /*获取进路资源列车信息*/ + cFunRet = GetRouteInOutFstLgcTrainInfo(pStartRelRouteId[jj], &cRouteResTrainSum, szRouteResTrainId); /*获取进路资源列车信息*/ - if ((CI_SUCCESS == cFunRet) && (1U == cRouteResTrainSum)) + if ((CI_SUCCESS == cFunRet) && (1U == cRouteResTrainSum)) + { + cTrainEnterState = dsuTrainMinHeadCrossSignal(szRouteResTrainId[0], pStartRelRouteId[jj], CI_ERROR); /*计算列车驶入进路状态*/ + if (TRAIN_ENTER_ROUTE_CROSS == cTrainEnterState) { - cTrainEnterState = dsuTrainMinHeadCrossSignal(szRouteResTrainId[0], pStartRelRouteId[jj]); /*计算列车驶入进路状态*/ - if (TRAIN_ENTER_ROUTE_CROSS == cTrainEnterState) - { - /*设置跨压*/ - cSignalCrossState = SIGNAL_CROSS_STATE_YES; - } - else - { - /*设置未跨压*/ - } + /*设置跨压*/ + cSignalCrossState = SIGNAL_CROSS_STATE_YES; } else { - /*获取进路资源列车信息失败或无资源列车,设置未跨压*/ + /*设置未跨压*/ } - break; } else { - /*进路未接近开放或非CBTC级别,设置未跨压*/ + /*获取进路资源列车信息失败或无资源列车,设置未跨压*/ } + break; + } + else + { + /*进路未接近开放/接近锁闭,或非CBTC级别,设置未跨压*/ } - } - else - { - /*获取数据失败,不处理*/ } } else { - /*信号机未开放,设置未跨压*/ + /*获取数据失败,不处理*/ } /*根据计算结果,设置RC的信号机跨压状态*/ - SetSignalCrossStateCC(wSignalId, cSignalCrossState); + wTacsCrossTrainId = 0u; + if (SIGNAL_CROSS_STATE_YES == cSignalCrossState) + { + cTrainCtrlState = GetTrainControlMode(szRouteResTrainId[0]); + if (TRAIN_IVOC_MODE == cTrainCtrlState) + { + /*PB-TACS VOBC主控,记录列车ID*/ + wTacsCrossTrainId = (UINT8)szRouteResTrainId[0]; + } + else + { + /*非TACS主控,不记录列车ID*/ + } + } + else + { + /*未跨压,不记录列车ID*/ + } + + SetSignalCrossStateCC(wSignalId, cSignalCrossState, wTacsCrossTrainId); } else { @@ -12441,7 +12525,6 @@ static void ProIvocToRcLocationData(void) UINT8 ii = 0u; UINT8 chIvocSum = GetIvocToRcSum(); IvocToRcDataStruct* pIvocToCiDataStru = GetVobcToCiDataStru(); - UINT8 dataValid = 0u; UINT8 getResult = CI_ERROR; UINT16 wTrainId = 0U; UINT32 dwDelayTime = 0U; @@ -12473,9 +12556,9 @@ static void ProIvocToRcLocationData(void) } else { - /*清除缓存信息*/ + /*清除缓存信息*/ (void)SetIvocTrainSpeed(wTrainId, 0u); - (void)SetIvocTrainLevel(wTrainId, TRAIN_LEVEL_BACKUP_UNKNOWN); + (void)SetIvocTrainLevel(wTrainId, TRAIN_LEVEL_UR); SetIvocControlMode(wTrainId, 0U);/*控车模式*/ (void)SetIvocTrainMsgDelayTime(wTrainId, 0u);/*列车消息延迟时间*/ SetIvocTrainMode(wTrainId, 0u);/*列车驾驶模式*/ @@ -12592,28 +12675,21 @@ static void PsdCmdMergeDeal(void) void ProcessIvocToRCData(void) { UINT8 ii = 0u; - UINT8 jj = 0u; - UINT8 kk = 0u; + UINT16 wRouteIndex = 0u; UINT16 wRouteSum = 0u; UINT8 chIvocToCiDataSum = GetIvocToRcSum(); IvocToRcDataStruct* pIvocToRcDataStru = GetVobcToCiDataStru(); - UINT8 chLineIdentity = GetCiFunctionSwitchConfig(VOBC_INTERFACE_IDENTITY);/*获取线路标识*/ + UINT8 dataValid = 0u; - UINT8 bufIndex = 0u; - UINT16 psdId = 0u; + UINT8 localCiId = 0u; UINT8 belongCiId = 0u; - UINT8 deviceSum = 0u;/*通信设备总数*/ - UINT8* deviceIdBuf = NULL;/*通信设备ID数组*/ - UINT8 platformId = 0u; - UINT16 platformPsdId = 0u; + UINT16 wRouteId = 0u; - UINT32 dwDelayTime = 0u; - UINT32 dwVobcBrkTime = 0u; UINT16 phySecCurSum = 0u; UINT16 deviceId = 0u; - UINT8 chRCMode = GetLocalRcWorkMode(); + UINT32 dwCurCycNum = 0U; UINT32 dwTransmitBadEnsureCount = 0U; /*CI与VOBC通信中断判断时间*/ UINT8 cTrainReportState = 0U; @@ -12847,6 +12923,7 @@ static void ProcessVobcOrIvocData(void) { UINT8 cRcWorkMode = 0U; + cRcWorkMode = GetLocalRcWorkMode(); /*清除屏蔽门命令*/ @@ -12916,14 +12993,11 @@ static void RefreshIvocInputlocation(const IvocToRcDataStruct stIvocToCiData) { UINT16 wTrainId = 0U; UINT32 dwCurCycle = 0U; - UINT8 chIndex = 0U; - TrainEaStru szTmp[EA_MAX_NUM] = { 0U }; UINT8 chRet = 0U; dwCurCycle = Get2oo2CurCycleNum(); wTrainId = ((UINT16)(CI_SYSTEM_TYPE_IVOC * 256U)) + stIvocToCiData.VobcId; - chRet = SetTrainTransmitStat(wTrainId, TRAIN_COMM_STATE_GOOD); chRet &= SetIvocTrainDir(wTrainId, stIvocToCiData.trainDirection); chRet &= SetIvocTrainSpeed(wTrainId, stIvocToCiData.wTrainSpeed); chRet &= SetIvocTrainSpeedDir(wTrainId, stIvocToCiData.chSpeedDir); @@ -12942,7 +13016,6 @@ static void RefreshIvocInputlocation(const IvocToRcDataStruct stIvocToCiData) SetIvocControlMode(wTrainId, stIvocToCiData.controlMode);/*控车模式*/ SetIvocTrainMode(wTrainId, stIvocToCiData.chTrainMode);/*列车驾驶模式*/ - SetTrainMsgFromTiocId(wTrainId, 0U); SetTrainSleepCancleFlag(wTrainId, TRAIN_SLEEP_CANCLE_YES); @@ -12950,6 +13023,62 @@ static void RefreshIvocInputlocation(const IvocToRcDataStruct stIvocToCiData) } +/* +* 功能描述: Vobc点连式接口信息处理 +* 参数说明: vobcToCiDataStru:VOBC数据结构体指针 +* 返回值 : void +* by lyj 20260316 +*/ + +static void VobcBlocLinkDataProc(VobcToCiDataStruct* vobcToCiDataStru) +{ + UINT32 dwCurCycle = 0U; + + if (NULL != vobcToCiDataStru) + { + /*清掉列车点连式信息*/ + VobcBlocLinkDataClear(vobcToCiDataStru->VobcId); + dwCurCycle = Get2oo2CurCycleNum(); + if ((dwCurCycle == vobcToCiDataStru->strBlocLinkData.chBlocLinkCycle) + && ((VOBC_CI_BLOCLINK_BLOCK_CTRL == vobcToCiDataStru->strBlocLinkData.chBlocLinkTrainLevel) || (VOBC_CI_BLOCLINK_CI_CTRL == vobcToCiDataStru->strBlocLinkData.chBlocLinkTrainLevel))) + { + /*记录点连式列车方向和位置,复用ABL后备通道结构*/ + SetAblTrainDir(vobcToCiDataStru->VobcId, vobcToCiDataStru->strBlocLinkData.chTrainDirection); + SetAblTrainMaxHeadLink(vobcToCiDataStru->VobcId, vobcToCiDataStru->strBlocLinkData.wTrainMaxSafeHeadLink); + SetAblTrainMaxHeadOffset(vobcToCiDataStru->VobcId, vobcToCiDataStru->strBlocLinkData.dwTrainMaxSafeHeadOffset); + SetAblTrainMinTailLink(vobcToCiDataStru->VobcId, vobcToCiDataStru->strBlocLinkData.wTrainMinSafeTailLink); + SetAblTrainMinTailOffset(vobcToCiDataStru->VobcId, vobcToCiDataStru->strBlocLinkData.dwTrainMinSafeTailOffset); + } + else + { + /*不处理*/ + } + + } + else + { + /*不处理*/ + } +} - +/* +* 功能描述: Vobc点连式信息清除 +* 参数说明: UINT16 wTrainId:VOBCid +* 返回值 : void +* by lyj 20260316 +*/ +void VobcBlocLinkDataClear(const UINT16 wTrainId) +{ + if ((TRAIN_SUM_MAX > wTrainId) && (0U < wTrainId)) + { + SetAblTrainMaxHeadLink(wTrainId, 0U); + SetAblTrainMaxHeadOffset(wTrainId, UINT32_MAX); + SetAblTrainMinTailLink(wTrainId, 0U); + SetAblTrainMinTailOffset(wTrainId, UINT32_MAX); + } + else + { + /*不处理*/ + } +} \ No newline at end of file diff --git a/TSCP/src/APP/ciapp/IO/InputDataProcess.h b/TSCP/src/APP/ciapp/IO/InputDataProcess.h index 263d1ab..f3fa1e0 100644 --- a/TSCP/src/APP/ciapp/IO/InputDataProcess.h +++ b/TSCP/src/APP/ciapp/IO/InputDataProcess.h @@ -537,6 +537,13 @@ void SignalTrainCrossPro(void); * 返回值 : void */ void ProcessIvocToRCData(void); +/* +* 功能描述: Vobc点连式信息清除 +* 参数说明: UINT16 wTrainId:VOBCid +* 返回值 : void +* by lyj 20260316 +*/ +void VobcBlocLinkDataClear(const UINT16 wTrainId); #ifdef __cplusplus } diff --git a/TSCP/src/APP/ciapp/IO/OutputDataProcess.c b/TSCP/src/APP/ciapp/IO/OutputDataProcess.c index bec2baa..a133410 100644 --- a/TSCP/src/APP/ciapp/IO/OutputDataProcess.c +++ b/TSCP/src/APP/ciapp/IO/OutputDataProcess.c @@ -81,10 +81,12 @@ void OutputDataProcess(void) UINT8 CiPattern = 0u; UINT8 chDsnLinSwitch = 0U; UINT8 chTiocSysMode = 0U; + UINT8 chLocalCiOCSswitch = 0U; chTiocSysMode = GetTiocSystemMode(); chDsnLinSwitch = GetCiFunctionSwitchConfig(FUNC_DSN_LINE_SWITCH); CiPattern = GetLocalCiPattern(); + chLocalCiOCSswitch = GetLocalCiOCSswitch(); if (REVERSE_MODE_MAIN != chTiocSysMode) { @@ -118,6 +120,12 @@ void OutputDataProcess(void) /*道岔输出处理*/ OcSwitchDeviceOutput(); + if (OC_S_ON == chLocalCiOCSswitch) + {/*OCS开关打开*/ + /*道岔主控命令和寻表命令输出管理*/ + OcSwitchControlModeCmdOutput(); + } + /*信号机输出处理*/ OcSignalDeviceOutput(); } @@ -217,6 +225,9 @@ void OutputDataProcess(void) /*后备列车发送数据处理*/ VobcBackUpOutputProcess(); + /*点连式列车发送数据处理*/ + VobcBlocLinkOutputProcess(); + /*资源对顶点数据计算*/ (void)ReqAlignmentInfoCalc(); @@ -441,11 +452,11 @@ UINT8 GetAtsBackInfoParam(const UINT8 functionId,const UINT8 deviceStateType, co case ETYPE_SIG_CLOSE_OVER_TIME: returnValue = CI_BACK_SIG_CLOSE_OT; /*信号机关闭超时*/ break; - +#if 0 case ETYPE_SIG_RETURN_OPENED_STATE: returnValue = CI_BACK_AS_RETR_ENDSIG_RT_SET;/*以该信号机为终端信号机的折返进路已经办理*/ break; - +#endif case ETYPE_SIG_LEAD_ALL_LOCK: returnValue = CI_BACK_SIG_LEAD_OPEN_FAIL; /*引导信号开放条件不满足,全站已下发引导总锁*/ break; @@ -3538,6 +3549,7 @@ void NonRouteRelayStateProc(void) UINT8 interfaceType = FUNC_SWITCH_UNDEF;/*试车线与车辆段接口类型*/ UINT8 i = 0u; UINT16 agreeTryTrainRelayId = 0u;/*同意试车继电器ID*/ + UINT16 wColWaysideTryTrainIndRelayId = 0u;/*轨旁试车指示器继电器ID*/ NonRouteDataStruct* pNonRoute = NULL; UINT8 localCiId = 0U; /*本联锁ID*/ UINT8 nonRouteBelongCiId = 0U; /*非进路所属联锁ID*/ @@ -3564,6 +3576,7 @@ void NonRouteRelayStateProc(void) { /*试信号模式且试车线与车辆段采用继电器接口*/ agreeTryTrainRelayId = GetNonRouteAgreeTryRelayIdById(pNonRoute->NonRouteId); (void)SetRelayDriveState(agreeTryTrainRelayId, RELAY_DRIVE_STATE_UP); /*设置同意试车继电器吸起*/ + } else if ((NONROUTE_RUN_MODE_APPLY == pNonRoute->RunMode) && (SCX_CLD_INTERFACE_COMM == interfaceType)) {/*试信号模式且试车线与车辆段采用通信接口*/ @@ -3577,6 +3590,17 @@ void NonRouteRelayStateProc(void) { /*不处理*/ } + wColWaysideTryTrainIndRelayId = GetWaysideTryTrainIndRelayId(pNonRoute->NonRouteId); + if (0 != wColWaysideTryTrainIndRelayId) + { + /*设置轨旁试车指示器继电器吸起*/ + (void)SetRelayDriveState(wColWaysideTryTrainIndRelayId, RELAY_DRIVE_STATE_UP); + } + else + { + /*不处理*/ + } + } else {/*车辆段非进路不是开放状态时,发送试车线不同意试车(继电接口:驱同意试车继电器落下;串口和网口:发送同意试车无效状态)*/ @@ -3586,6 +3610,7 @@ void NonRouteRelayStateProc(void) /*驱动非进路同意试车继电器落下 非进路同意试车继电器常态落下,相当于恢复默认态*/ agreeTryTrainRelayId = GetNonRouteAgreeTryRelayIdById(pNonRoute->NonRouteId); (void)SetRelayDriveState(agreeTryTrainRelayId, RELAY_DRIVE_STATE_DOWN); + } else if ((SCX_CLD_INTERFACE_COMM == interfaceType) || (SCX_CLD_SERIAL_PORT_COMM == interfaceType)) { @@ -3595,6 +3620,16 @@ void NonRouteRelayStateProc(void) { ; /*不处理*/ } + wColWaysideTryTrainIndRelayId = GetWaysideTryTrainIndRelayId(pNonRoute->NonRouteId); + if (0 != wColWaysideTryTrainIndRelayId) + { + /*设置轨旁试车指示器继电器落下*/ + (void)SetRelayDriveState(wColWaysideTryTrainIndRelayId, RELAY_DRIVE_STATE_DOWN); + } + else + { + /*不处理*/ + } } break; @@ -5722,6 +5757,8 @@ void VobcBackUpOutputProcess(void) UINT8 chBackUpValid = 0U;/*备用通信有效标志*/ UINT8 cRcWorkMode = 0U; + cRcWorkMode = GetLocalRcWorkMode(); + for (ii = 0U; ii < TRAIN_SUM_MAX; ii++) { wTrainId = GetTrainId(ii); @@ -8629,4 +8666,285 @@ void SetSCOverIndicator(const UINT16 wIndicatorId) { SetIndicatorState(wIndicatorId, INDICATOR_SHOW_SC_NO); /*设置申结束试车指示灯无效*/ } +} + +/* +* 功能描述: 处理点连式列车发送数据信息 +* 参数说明: void +* 返回值 : 无 +* by lyj 20260314 +*/ +void VobcBlocLinkOutputProcess(void) +{ + UINT16 wTrainId = 0U; /*列车ID*/ + UINT8 chXiansuState = 0U; /*临时限速状态*/ + UINT8 chlineIdentity = 0U; /*线路标识*/ + UINT8 ii = 0U; /*循环变量*/ + UINT8 chResult = 0U; /*临时承接变量*/ + + /*目前仅互联互通线路具备点连式接口*/ + chlineIdentity = GetCiFunctionSwitchConfig(VOBC_INTERFACE_IDENTITY); /*获取线路标识*/ + + if (LINE_HLHT == chlineIdentity) + { + /*限速确认之后或者限速清除之后*/ + chXiansuState = CheckLocalCiLSXSStata(); + if (CI_SUCCESS == chXiansuState) + { + for (ii = 0U; ii < TRAIN_SUM_MAX; ii++) + { + wTrainId = GetTrainId(ii); + wTrainId = wTrainId & 0x00ffU; + /*先清除要发送列车的点连式信息,然后重新计算*/ + ClearBlocLinkTrainInfo(wTrainId); + + /*互联互通线路使用消息剩余有效期来判断CI与VOBC通信是否中断*/ + chResult = GetHLHTHeadCtxValid(CI_SYSTEM_TYPE_VOBC, (UINT8)wTrainId); + if (CI_SUCCESS == chResult) + { + /*计算列车进路信息*/ + chResult = BlocLinkTrainRouteMange(wTrainId); + + /*计算列车逻辑区段信息*/ + chResult &= BlocLinkTrainLogSecMange(wTrainId); + if (CI_SUCCESS != chResult) + { + /*清除要发送列车的点连式信息*/ + ClearBlocLinkTrainInfo(wTrainId); + } + else + { + /*不做处理*/ + } + } + else + { + /*不做处理*/ + } + + } + } + else + { + /*清除要发送列车的点连式信息*/ + for (ii = 0U; ii < TRAIN_SUM_MAX; ii++) + { + wTrainId = GetTrainId(ii); + wTrainId = wTrainId & 0x00ffU; + ClearBlocLinkTrainInfo(wTrainId); + } + debug_infor_printf((const)"\nCheckLocalCiLSXSStata ERROR\n"); + } + + + } + else + { + /*不做处理*/ + } + +} +/* +* 功能描述: 处理点连式列车进路信息 +* 参数说明: const UINT16 wTrainId 列车ID +* 返回值 : 计算结果 +* by lyj 20260316 +*/ + +UINT8 BlocLinkTrainRouteMange(const UINT16 wTrainId) +{ + UINT8 chRetVal = CI_ERROR; + struct_PathPoint end = { 0U }; /*列车逻辑终点*/ + UINT16 wTempLogSecId = 0U; /*车头逻辑区段*/ + UINT16 wLogSecRLockRouteId = 0U; /*逻辑区段锁闭所属进路*/ + UINT8 chLocalCiId = 0U; /*本机联锁ID*/ + UINT16 wRouteEndSigId = 0U; /*进路终端信号机ID*/ + UINT8 chSigBelongCiId = 0U; /*信号机所属联锁ID*/ + UINT8 chRouteType = 0U; /*进路类型*/ + UINT16 wLastSectionId = 0U; /*进路最后一个物理区段*/ + UINT16 wValidReturnSigId = 0U; /*有效折返信号机*/ + UINT8 ii = 0U; + UINT16 wSigInFirstPhyId = 0U; /*信号机内方物理区段*/ + UINT16 wTempRouteId = 0U; + UINT8 chTempRouteState = 0U; + UINT8 chRouteDir = 0U; + UINT8 chTrainDir = 0U; + + UINT8 chLogSecLockState = 0U; + if ((0U < wTrainId) && (TRAIN_SUM_MAX > wTrainId)) + { + /*车头位置*/ + end.wLinkId = GetAblTrainMaxHeadLink(wTrainId); + end.dwOffset = GetAblTrainMaxHeadOffset(wTrainId); + + /*判断车头所属逻辑区段是否锁闭*/ + wTempLogSecId = GetPointBelongLogSec(end); + wLogSecRLockRouteId = GetLogSecLockBelongRoute(wTempLogSecId); + chLogSecLockState = GetLogSecLockState(wTempLogSecId); + chRouteType = GetRouteType(wLogSecRLockRouteId); + if ((LOG_SECTION_LOCK_NORMAL == chLogSecLockState) && (0U < wLogSecRLockRouteId) && (ROUTE_SUM_MAX > wLogSecRLockRouteId) && (ROUTE_TYPE_DIAOCHE != chRouteType)) + { + chRetVal = CI_SUCCESS; + /*记录脚下进路*/ + SetBlocLinkRouteData(wTrainId, wLogSecRLockRouteId); + chLocalCiId = GetSystemParaLocalCiId(); + + for (ii = 0U; ii < (CI_VOBC_ROUTE_MAX -1U); ii++) + { + wRouteEndSigId = GetRouteEndSignalId(wLogSecRLockRouteId); + chSigBelongCiId = GetSignalBelongCiId(wRouteEndSigId); + if (chLocalCiId == chSigBelongCiId) + { + /*进路终端信号机所属联锁是本联锁,继续匹配*/ + chRouteType = GetRouteType(wLogSecRLockRouteId); + if (ROUTE_TYPE_RETURN == chRouteType) + { + wLastSectionId = GetRouteLastPhySectionId(wLogSecRLockRouteId); /*获取进路最后一个物理区段*/ + wValidReturnSigId = GetValidReturnSinalId(wLogSecRLockRouteId, wLastSectionId); /*有效折返信号机*/ + wRouteEndSigId = wValidReturnSigId; + } + else + { + /*直通进路-直接获取终端信号机*/ + wRouteEndSigId = GetRouteEndSignalId(wLogSecRLockRouteId); + } + /*进路开放并且不是调车进路*/ + wSigInFirstPhyId = GetSignalInFirstLockedPhySecId(wRouteEndSigId); + wTempRouteId = GetPhySecRLockBelongRouteId(wSigInFirstPhyId); + chTempRouteState = GetRouteState(wTempRouteId); + + chRouteDir = GetRouteConfigDirection(wTempRouteId); + chTrainDir = GetAblTrainDir(wTrainId); + if (((ROUTE_STATE_YUXIAN_OPEN == chTempRouteState) || (ROUTE_STATE_NEAR_OPEN == chTempRouteState)) && (chRouteDir == chTrainDir) && (ROUTE_TYPE_DIAOCHE != chRouteType)) + { + /*进路状态是接近开放或者预先开放(不匹配引导进路);列车换端之后再匹配折出进路*/ + SetBlocLinkRouteData(wTrainId, wTempRouteId); + wLogSecRLockRouteId = wTempRouteId; + } + else + { + break; + } + + } + else + { + break; + } + } + + } + else + { + /*不匹配进路*/ + } + + } + else + { + /*不处理*/ + } + + return chRetVal; +} + +/* +* 功能描述: 处理点连式列车逻辑区段信息 +* 参数说明: const UINT16 wTrainId 列车ID +* 返回值 : 计算结果 +* by lyj 20260316 +*/ + +UINT8 BlocLinkTrainLogSecMange(const UINT16 wTrainId) +{ + /*计算列车逻辑区段--车脚下以及车头所处进路(往终端信号机)剩下的全部逻辑区段*/ + + struct_PathPoint start = { 0U }; /*列车逻辑起点*/ + struct_PathPoint end = { 0U }; /*列车逻辑终点*/ + UINT8 chRetVal = CI_ERROR; + UINT16 wTrainLogSecSum = 0U; /*列车逻辑区段数量*/ + UINT16 wTrainLogSecBuf[TRAIN_ABL_LOGSEC_SUM] = { 0U }; /*列车逻辑区段ID*/ + UINT16 wTempLogSecId = 0U; /*车头逻辑区段*/ + UINT16 wLogSecRLockRouteId = 0U; /*逻辑区段锁闭所属进路*/ + UINT16 wRouteLogSectionSum = 0U; /*进路逻辑区段数量*/ + UINT16* pRouteLogSectionIdBuf = NULL; /*进路逻辑区段数组*/ + UINT16 ii = 0U; + UINT16 jj = 0U; + UINT8 chFlag = 0U; /*开始记录进路的标志*/ + + /*车尾位置*/ + start.wLinkId = GetAblTrainMinTailLink(wTrainId);; + start.dwOffset = GetAblTrainMinTailOffset(wTrainId); + + /*车头位置*/ + end.wLinkId = GetAblTrainMaxHeadLink(wTrainId); + end.dwOffset = GetAblTrainMaxHeadOffset(wTrainId); + + /*获取车脚下逻辑区段*/ + chRetVal = GetLogSecBtwTwoPoints(start, end, &wTrainLogSecSum, wTrainLogSecBuf); + if (CI_SUCCESS == chRetVal) + { + /*查车头所在进路的所有逻辑区段*/ + wTempLogSecId = GetPointBelongLogSec(end); /*车头逻辑区段*/ + wLogSecRLockRouteId = GetLogSecLockBelongRoute(wTempLogSecId); /*逻辑区段锁闭所属进路*/ + wRouteLogSectionSum = GetRouteLogSectionSum(wLogSecRLockRouteId); /*进路逻辑区段数量*/ + pRouteLogSectionIdBuf = GetRouteLogSectionIdBuf(wLogSecRLockRouteId); /*进路逻辑区段数组*/ + if (TRAIN_ABL_LOGSEC_SUM > (wTrainLogSecSum + wRouteLogSectionSum)) + { + if (NULL != pRouteLogSectionIdBuf) + { + for (ii = 0U; ii < wRouteLogSectionSum; ii++) + { + /*查进路的所有逻辑区段,查到了车头所在逻辑区段位置,往后开始记录逻辑区段*/ + if ((wTempLogSecId == pRouteLogSectionIdBuf[ii]) && (0U == chFlag)) + { + chFlag = 1U; + for (jj = 0U; jj < wTrainLogSecSum; jj++) + { + if (wTempLogSecId == wTrainLogSecBuf[jj]) + { + break; /*车头已存入,不再存*/ + } + } + /*车头未存入,需要存一次*/ + if ((jj == wTrainLogSecSum) && (TRAIN_ABL_LOGSEC_SUM > wTrainLogSecSum)) + { + wTrainLogSecBuf[wTrainLogSecSum] = pRouteLogSectionIdBuf[ii]; + wTrainLogSecSum++; + } + } + else + { + /*继续查找*/ + } + /*找到了车头,开始存,车头所在逻辑区段已存入,不再存入*/ + if ((1U == chFlag) && (TRAIN_ABL_LOGSEC_SUM > wTrainLogSecSum) && (wTempLogSecId != pRouteLogSectionIdBuf[ii])) + { + wTrainLogSecBuf[wTrainLogSecSum] = pRouteLogSectionIdBuf[ii]; + wTrainLogSecSum++; + } + else + { + /*继续查找*/ + } + + } + SetBlocLinkOccLogSecData(wTrainId, wTrainLogSecSum, wTrainLogSecBuf); + + } + else + { + chRetVal = CI_ERROR; + } + } + else + { + chRetVal = CI_ERROR;/*进路逻辑区段超标*/ + } + } + else + { + /*不处理*/ + } + return chRetVal; } \ No newline at end of file diff --git a/TSCP/src/APP/ciapp/IO/OutputDataProcess.h b/TSCP/src/APP/ciapp/IO/OutputDataProcess.h index 7c69a01..ab22f4d 100644 --- a/TSCP/src/APP/ciapp/IO/OutputDataProcess.h +++ b/TSCP/src/APP/ciapp/IO/OutputDataProcess.h @@ -524,6 +524,29 @@ void SetSCAllowIndicator(const UINT16 wIndicatorId); * by lyj 20260106 */ void SetSCOverIndicator(const UINT16 wIndicatorId); +/* +* 功能描述: 处理点连式列车发送数据信息 +* 参数说明: void +* 返回值 : 无 +* by lyj 20260314 +*/ +void VobcBlocLinkOutputProcess(void); +/* +* 功能描述: 处理点连式列车进路信息 +* 参数说明: const UINT16 wTrainId 列车ID +* 返回值 : 计算结果 +* by lyj 20260316 +*/ + +UINT8 BlocLinkTrainRouteMange(const UINT16 wTrainId); +/* +* 功能描述: 处理点连式列车逻辑区段信息 +* 参数说明: const UINT16 wTrainId 列车ID +* 返回值 : 计算结果 +* by lyj 20260316 +*/ + +UINT8 BlocLinkTrainLogSecMange(const UINT16 wTrainId); #ifdef __cplusplus } diff --git a/TSCP/src/APP/ciapp/Initial/ConfigDataReadManage.c b/TSCP/src/APP/ciapp/Initial/ConfigDataReadManage.c index 4dd9a28..71fc38d 100644 --- a/TSCP/src/APP/ciapp/Initial/ConfigDataReadManage.c +++ b/TSCP/src/APP/ciapp/Initial/ConfigDataReadManage.c @@ -1119,10 +1119,11 @@ UINT8 ReadConfigureData(void) if (0u == rtnVal) { /*设置试车线与车辆段合设配置*/ - g_ret = SetCldAndScxMergeConfig(); - if (CI_ERROR == g_ret) + g_ret = (INT16)SetCldAndScxMergeConfig(); + if (0 == g_ret) { debug_infor_printf((const)"SetCldAndScxMergeConfig fail.\r\n"); + rtnVal = 44u; } } diff --git a/TSCP/src/APP/ciapp/Initial/InitialProcess.c b/TSCP/src/APP/ciapp/Initial/InitialProcess.c index 5e50b95..f95dafa 100644 --- a/TSCP/src/APP/ciapp/Initial/InitialProcess.c +++ b/TSCP/src/APP/ciapp/Initial/InitialProcess.c @@ -683,6 +683,7 @@ UINT8 InitialSignalData(void) SignalDataStruCC[signalId].cSleepTrainLightUpFlag = SIGNAL_SLEEP_TRAIN_LIGHTUP_NO; /*初始化休眠车点亮信号机标志无效*/ SignalDataStruCC[signalId].LightExtinctState = SIGNAL_LIGHT_EXTICT_STATE_YES; /*信号机亮灭状态CC(0x55:灭灯,0xaa:亮灯)*/ SignalDataStruCC[signalId].SignalCrossState = SIGNAL_CROSS_STATE_NO; /*通信车跨压通过信号机状态CC(0x55:未跨压,0xaa:跨压)*/ + SignalDataStruCC[signalId].wCrossTacsTrainId = 0u; /*通信车跨压通过信号机TACS主控列车ID*/ /*初始化ZC发送的信号机动态数据*/ gZcToCiDymDataStru.szSignalDataStruZc[signalId].SignalId = signalId; @@ -733,9 +734,11 @@ UINT8 InitialWashMachineData(void) WashMachineDataStru[washMachinelId].TrainEmergencyStopState = WASHMACHINE_COL_FALUT_YES; WashMachineDataStru[washMachinelId].HeadWashAllowState = WASHMACHINE_COL_HEADWASH_NO; WashMachineDataStru[washMachinelId].TailWashAllowState = WASHMACHINE_COL_TAILWASH_NO; + WashMachineDataStru[washMachinelId].chCoupingWashAllowState = WASHMACHINE_COL_COUPINGWASH_NO; WashMachineDataStru[washMachinelId].WashTrainRequestDrvState = WASHMACHINE_DRVSTATE_REQ_FALSE; WashMachineDataStru[washMachinelId].TrainHeadStopSteadyDrvState = WASHMACHINE_HEAD_STEADY_NO; WashMachineDataStru[washMachinelId].TrainTailStopSteadyDrvState = WASHMACHINE_TAIL_STEADY_NO; + WashMachineDataStru[washMachinelId].chCoupingStopSteadyDrvState = WASHMACHINE_COUPING_STEADY_NO; WashMachineDataStru[washMachinelId].TrainOutWashTrainPortAllowState = WASHMACHINE_COL_OUT_NO; WashMachineDataStru[washMachinelId].PauseTrainWashRequestDrvState = WASHMACHINE_PAUSE_DRVREQ_FALSE; WashMachineDataStru[washMachinelId].PaseWashMachineRequesDrvtState = PASS_WASHMACHINE_DRVREQ_FALSE; @@ -787,67 +790,88 @@ UINT8 InitialSwitchData(void) UINT16 ii = 0u; /*游标*/ UINT16 jj = 0u; /*游标*/ UINT8 reVal = CI_ERROR; + UINT8 chSwitchIncludeOcNum = 0U; + UINT8 ocId = 0u; + UINT8 kk = 0u; switchDataSum = GetTotalSwitchCurNum(); /*本联锁和相邻联锁发送给本联锁的道岔总数目*/ /*数值大于SWITCH_SUM_MAX会返回0*/ for (ii = 0u; ii < switchDataSum; ii++) - { - switchId = GetSwitchId(ii);/*获取配置文件中该索引下的道岔ID*/ + { + switchId = GetSwitchId(ii);/*获取配置文件中该索引下的道岔ID*/ - SwitchDataStru[switchId].SwitchId = switchId; - SwitchDataStruCC[switchId].SwitchId = switchId; - SwitchDataStru[switchId].YLockState = SWITCH_LOCK_YINZONG_NO; - SwitchDataStru[switchId].LockStatus = SWITCH_LOCK_STATUS_NO; - SwitchDataStru[switchId].FLockState = SWITCH_LOCK_FENGSUO_NO; - SwitchDataStru[switchId].SwitchPrePosition = SWITCH_POSITION_SIKAI; - SwitchDataStru[switchId].SwitchCurPosition = SWITCH_POSITION_SIKAI; - SwitchDataStru[switchId].SingleSwitchCurPosition = SWITCH_POSITION_SIKAI; - SwitchDataStru[switchId].SwitchDrivePos = SWITCH_DRIVE_POS_INVALID; - SwitchDataStru[switchId].SwitchExpDrvPos = SWITCH_DRIVE_POS_INVALID; - SwitchDataStru[switchId].switchPreExpDrvPos = SWITCH_DRIVE_POS_INVALID; - SwitchDataStru[switchId].SwitMoveStartCycNum = 0u; - SwitchDataStru[switchId].SwitDriveStartCycNum = 0u; - SwitchDataStru[switchId].chSwitchDrivedFlag = SWITCH_DRIVED_FLAG_NO; - SwitchDataStru[switchId].SwitchDanCaoPostition = SWITCH_POSITION_INVALID; - SwitchDataStru[switchId].switchDrivingState = SWIT_DRIV_IDLE_TIME; - SwitchDataStru[switchId].switchDrivOvtmDrvPos = SWITCH_DRIVE_POS_INVALID; - SwitchDataStru[switchId].switchFaultState = SWITCH_FAULT_STATE_YES; - /* zt 删除单轨相关代码 2022-02-15 */ - SwitchDataStru[switchId].switchKRState = SWITCH_KERAO_STATE_YES; - SwitchDataStru[switchId].switchLastValidDrvPosCycleNum = 0u; - SwitchDataStru[switchId].switchLastValidDrvPos = SWITCH_DRIVE_POS_INVALID; - SwitchDataStru[switchId].UsingBelongOverlapId = 0u; - SwitchDataStru[switchId].DFHRelayValidCycNum = 0u; - SwitchDataStru[switchId].SigleDFHRelayValidCycNum = 0u; - SwitchDataStru[switchId].PLockedRouteNum = 0u; - SwitchDataStruCC[switchId].PLockedLogRouteNum = 0u; - SwitchDataStru[switchId].PLockedOverlapNum = 0u; - SwitchDataStru[switchId].PLockedNonRouteNum = 0u; - SwitchDataStru[switchId].YCRelayValidCycNum = 0u; - SwitchDataStru[switchId].SigleYCRelayValidCycNum = 0u; - SwitchDataStru[switchId].ConnetSwitchDsState = CONNECT_SWITCH_DANSUO_NO; - SwitchDataStru[switchId].SwitchByPassState = SWITCH_BYPASS_NO; - SwitchDataStru[switchId].SwitchBypassStartCycNum = 0u; - SwitchDataStru[switchId].chSwitchJichaState = 0U; - SwitchDataStru[switchId].cSwitchUsingState = SWITCH_USING_NO; - SwitchDataStru[switchId].SwitchCollTolerateCycNum = 0U; - SwitchDataStru[switchId].SwitchColPosition = SWITCH_POSITION_SIKAI; - SwitchDataStru[switchId].switchFaultState = SWITCH_FAULT_STATE_YES; /*置为板卡故障*/ - /*初始化被防护锁闭的进路、保护区段、非进路数量及数组*/ - for (jj=0; jj 0u) && (devId < OVERLAP_SUM_MAX)) + if((chOverlapCiId == ciId)) { OverlapDataStru[devId].BelongRouteId = 0u; OverlapDataStru[devId].UnlockStartCycNum = 0u; @@ -2586,7 +2613,7 @@ void ResetDynamicState(const UINT8 ciId) OverlapDataStru[devId].chPreLaborUnlockState = PRO_PRE_LABOR_UNLOCK_STATE_NO; OverlapDataStru[devId].dwAtsLastTimeLockCyc = 0U; } - else if ((chOverlapCiId == localCi) && (devId > 0U) && (devId < OVERLAP_SUM_MAX)) + else if ((chOverlapCiId == localCi)) { cOverlapRelProSwNum = GetOverlapRelatedProtSwitSum(devId); /*获取保护区段关联的防护道岔信息*/ pOverlapRelProSwStru = GetOverlapRelatedProtSwitStru(devId); @@ -3411,7 +3438,7 @@ void ResetLocalRcDynamicState(void) if (cBelongCiId == cLocalCiId) { SetSignalLightExtinctStateCC(wSignalId, SIGNAL_LIGHT_EXTICT_STATE_YES); /*设置RC信号机亮灭状态为亮灯*/ - SetSignalCrossStateCC(wSignalId, SIGNAL_CROSS_STATE_NO); /*设置RC信号机跨压状态为未跨压*/ + SetSignalCrossStateCC(wSignalId, SIGNAL_CROSS_STATE_NO, 0u); /*设置RC信号机跨压状态为未跨压*/ } else { diff --git a/TSCP/src/APP/ciapp/LogRecord/LogRecord.c b/TSCP/src/APP/ciapp/LogRecord/LogRecord.c index b9da4ee..49b5a67 100644 --- a/TSCP/src/APP/ciapp/LogRecord/LogRecord.c +++ b/TSCP/src/APP/ciapp/LogRecord/LogRecord.c @@ -505,6 +505,7 @@ UINT8 RecordDeviceDataLog(UINT8 Flag) UINT16 wNonAutoReturnCurSum = 0U;/*无人折返按钮当前总数*/ NonAutoReturnDataStruct* pNonAutoReturnData = NULL; /*无人折返数据结构体指针*/ NonAutoReturnDataStructCC* pNonReturnDataStruCC = NULL; /*无人折返数据结构体指针-CC*/ + UINT8 chThisOCBoardState = 0U; /*************************************打印物理区段数据********************************************/ /*打印区段数据*/ @@ -955,6 +956,36 @@ UINT8 RecordDeviceDataLog(UINT8 Flag) outString[outStringLength++] = newSwitchData[deviceId].chSwitchJichaState; /*道岔挤岔状态*/ LongToChar(newSwitchData[deviceId].SwitchCollTolerateCycNum, &outString[outStringLength]);/*容忍周期号*/ outStringLength += 4u; + + LongToChar(newSwitchData[deviceId].SwitchOutputDrvCmdCycNum, &outString[outStringLength]);/*驱动起始周期*/ + outStringLength += 4u; + + outString[outStringLength++] = newSwitchData[deviceId].mainControlOcId;/*主控OC*/ + + outString[outStringLength++] = newSwitchData[deviceId].chSwitchBelongOcNum;/*道岔所属OC数*/ + for (jj = 0U; jj < newSwitchData[deviceId].chSwitchBelongOcNum; jj++) + { + outString[outStringLength++] = newSwitchData[deviceId].belongOCData[jj].OcId;/*道岔所属OC*/ + outString[outStringLength++] = newSwitchData[deviceId].belongOCData[jj].controlMode;/*OC当前主控状态*/ + outString[outStringLength++] = newSwitchData[deviceId].belongOCData[jj].OutControlCmd;/*发送OC当前主控命令*/ + outString[outStringLength++] = newSwitchData[deviceId].belongOCData[jj].PlusBoxSate;/*插箱状态*/ + chThisOCBoardState = GetSwitchThisOCBoardState(deviceId, newSwitchData[deviceId].belongOCData[jj].OcId); + outString[outStringLength++] = chThisOCBoardState;/*双系板卡故障状态*/ + + LongToChar(newSwitchData[deviceId].belongOCData[jj].OutMainControlCmdCycNum, &outString[outStringLength]);/*升主控命令周期*/ + outStringLength += 4u; + outString[outStringLength++] = newSwitchData[deviceId].belongOCData[jj].FindPostionCmd;/*寻表命令*/ + LongToChar(newSwitchData[deviceId].belongOCData[jj].FindCmdStartCycNum, &outString[outStringLength]);/*寻表命令起始周期*/ + outStringLength += 4u; + } + + outString[outStringLength++] = newSwitchData[deviceId].PLockedAxisSecNum;/*被防护锁闭的计轴区段ID*/ + for (jj = 0; jj < SWITCH_MAX_PROTECT_LOCKED_NUM; jj++) + { + ShortToChar(newSwitchData[deviceId].PLockedAxisSecIdArr[jj], &outString[outStringLength]); + outStringLength += 2u; + } + } } else @@ -1344,6 +1375,9 @@ UINT8 RecordDeviceDataLog(UINT8 Flag) outStringLength++; outString[outStringLength] = pLogicSecDataCC[deviceId].TXOccupyState;/*逻辑区段通信车占用状态CC(0x55-无车或非通信车占用,0xAA-通信车占用)*/ outStringLength++; + outString[outStringLength++] = newLogicSecData[deviceId].chLogSecCbtcArbState;/*逻辑区段CBTC_ARB状态*/ + outString[outStringLength++] = newLogicSecData[deviceId].chLogSecPbTacsArbState;/*逻辑区段PB_TACS_ARB状态*/ + outString[outStringLength++] = newLogicSecData[deviceId].chArbState;/*逻辑区段ARB状态*/ outString[outStringLength++] = newLogicSecData[deviceId].LogLockState;/*逻辑区段锁闭状态*/ outString[outStringLength++] = newLogicSecData[deviceId].LogLockDir;/*逻辑区段锁闭方向*/ outString[outStringLength++] = pLogicSecDataCC[deviceId].chResShareFlag;/*逻辑区段共享标志 0x55共享 0xAA非共享*/ diff --git a/TSCP/src/APP/ciapp/LogicManage/InterlockCommonManage.c b/TSCP/src/APP/ciapp/LogicManage/InterlockCommonManage.c index 049c3c0..f44d4c6 100644 --- a/TSCP/src/APP/ciapp/LogicManage/InterlockCommonManage.c +++ b/TSCP/src/APP/ciapp/LogicManage/InterlockCommonManage.c @@ -595,7 +595,7 @@ void SetRouteRelProSwitchLockSta(const UINT16 routeId, const UINT8 lockCommand) cSwitchCurPos = GetSwitchCurPosition(protectSwitchId); cFuncRet = checkSwtLastValDrvPosStayorNot(protectSwitchId, routeProtectSwitchStru[ii].ProtectPosition); if ((SWITCH_LOCK_PROTECT_CANCEL == lockCommand) - || ((SWITCH_LOCK_PROTECT_SET == lockCommand) && (cSwitchCurPos == routeProtectSwitchStru[ii].ProtectPosition) && (CI_SUCCESS == cFuncRet))) + || ((cSwitchCurPos == routeProtectSwitchStru[ii].ProtectPosition) && (CI_SUCCESS == cFuncRet))) { SetSwitchLockStatus(SWITCH_PLOCKTYPE_ROUTE, routeId, protectSwitchId, lockCommand); /*设置道岔防护锁闭状态*/ /*RC 13.0.0 修:不检查防护道岔中双动道岔另一端*/ diff --git a/TSCP/src/APP/ciapp/LogicManage/InterlockLogicManage.c b/TSCP/src/APP/ciapp/LogicManage/InterlockLogicManage.c index 515dbdb..807e4fb 100644 --- a/TSCP/src/APP/ciapp/LogicManage/InterlockLogicManage.c +++ b/TSCP/src/APP/ciapp/LogicManage/InterlockLogicManage.c @@ -16,7 +16,6 @@ #include "TrainDataManage.h" #include "HLHTHeadContexManage.h" #include "TrainOnAcManage.h" -#include "TrainDataManage.h" #include "SectionStateProcess_define.h" #include "DynamicRouteDataManage.h" #include "LogicalRouteDataManage.h" @@ -2014,8 +2013,10 @@ void RouteNearLockManage(const UINT16 routeId) UINT16 returnSecId = 0U; /*折返区段*/ UINT8 localCiType = 0U;/*联锁类型*/ UINT8 cFuncRetVal = CI_ERROR; + UINT8 chRouteBelongVirCiId = 0U; - localCiType = GetLocalCiType(); + chRouteBelongVirCiId = GetRouteBelongVirCiId(routeId); + localCiType = GetLocalVirCiType(chRouteBelongVirCiId); /*获取进路始端信号机ID*/ startSignalId = GetRouteStartSignalId(routeId); autoSigRouteState = GetRouteAutoSigSetState(routeId); /*获取自动信号进路状态*/ @@ -2141,6 +2142,7 @@ void RouteNearLockManage(const UINT16 routeId) validReturnSigId = GetValidReturnSinalId(routeId, logBelongPhyId); returnSecId = GetSignalOutFirstPhySecId(validReturnSigId); + /*逻辑区段当前CT占用,或者之前CT占用,当前空闲 且逻辑区段不是道岔区段,且非折返进路或为折返进路但非折返轨*/ if (((LOGICSECTION_OCCUPY_CT == logCurOccupyState) || ((LOGICSECTION_OCCUPY_NO == logCurOccupyState) && (LOGICSECTION_OCCUPY_CT == logPreOccupyState))) @@ -2254,7 +2256,6 @@ void RouteNearLockManage(const UINT16 routeId) */ void RouteDelayUnlockManage(const UINT16 routeId) { - UINT8 routeLevel = 0u; /*进路监督级别*/ UINT16 startSignalId = 0u; /*进路始端信号机ID*/ UINT32 delayStartCycNum = 0u; /*延时解锁起始周期号*/ UINT32 delayTotalCycSum = 0u; /*延时解锁总周期数*/ @@ -2267,13 +2268,10 @@ void RouteDelayUnlockManage(const UINT16 routeId) UINT16 wTrainId = 0u; UINT16 wLastTrainId = 0u; UINT32 curCycle = 0u; - UINT8 chRouteState = 0u; /*获取进路动态字段*/ - routeLevel = GetRouteLevel(routeId); /*获取进路监督级别*/ startSignalId = GetRouteStartSignalId(routeId); /*获取进路始端信号机ID*/ curCycle = Get2oo2CurCycleNum(); - chRouteState = GetRouteType(routeId); (void)DriveSignalClose(startSignalId); /*驱动信号关闭*/ @@ -4515,7 +4513,10 @@ void RouteZongRenJieProc(const UINT16 routeId) if (CI_SUCCESS == checkResultSecAndQXZC) { /*所有区段空闲或最后一个区段占用*/ - SetRouteStateManage(routeId, ROUTE_STATE_IDLE); /*-->设置进路空闲*/ + /*总人解办理*/ + 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)) {/*当总人解引导进路时,有取消照查继电器且未吸起则不能解锁引导进路*/ @@ -4904,6 +4905,7 @@ UINT8 RouteLTrainEnter(const UINT16 routeId) UINT8 chRCMode = 0u; UINT8 cRoutePreLevel = 0U; /*进路之前级别*/ UINT8 chLocalCiType = 0U;/*联锁类型*/ + UINT8 chRouteBelongVirCiId = 0U; /* 联锁逻辑检查 */ @@ -5048,7 +5050,8 @@ UINT8 RouteLTrainEnter(const UINT16 routeId) chDevState = GetPhySecCurMergeState(inPhySecId); if (SECTION_OCCUPY_YES == chDevState) { /*内方区段占用,进路为CBTC非车辆段时,考虑为列车高速跨压,只需要考虑内方第一区段的占压,不用管外方*/ - chLocalCiType = GetLocalCiType(); + chRouteBelongVirCiId = GetRouteBelongVirCiId(routeId); + chLocalCiType = GetLocalVirCiType(chRouteBelongVirCiId); if ((ROUTE_LEVEL_CBTC == routeLevel) && (CI_TYPE_CLD != chLocalCiType)) { chRetVal = CI_SUCCESS; @@ -8368,7 +8371,14 @@ void SetSectionResetLogicManage(const UINT16 phySecId, const UINT8 resetType) } else { - retValid = GetZFWValidByPhySecId(phySecId); /*获取物理区段计轴总复位继电器状态有效性*/ + if (PHYSICAL_SECTION_PRE_RESET_YES != resetType) + { + retValid = GetZFWValidByPhySecId(phySecId); /*计轴复位:检查物理区段计轴总复位继电器状态有效性*/ + } + else + { + retValid = CI_SUCCESS;/*计轴预复位不检查总复位继电器*/ + } if (CI_SUCCESS == retValid) /*有效,执行计轴复位功能*/ { dwResetStartCycNum = GetPhySecResetStartCycNum(phySecId); @@ -11117,6 +11127,7 @@ void UnlockSwitchLogicManage(void) UINT8 unlockFlag = 0U;/*解锁标志*/ UINT8 funcSwitch = 0U; UINT8 chPhySecLogLockState = 0U;/*物理区段逻辑锁闭状态*/ + UINT8 chPhySecJumpLockState = 0U; localCiId = GetSystemParaLocalCiId(); /*获取本机联锁ID*/ funcSwitch = GetCiFunctionSwitchConfig(FUNC_ROUTE_DRV_SWITCH_EARLY); @@ -11147,10 +11158,11 @@ void UnlockSwitchLogicManage(void) phyLockStatus = GetPhySecLockState(hostPhyId);/*获取物理区段锁闭状态*/ chFuncRet1 = GetSwitchLogSecLockState(hostSwitchId, &wDevId, &chDevState); chPhySecLogLockState = PhySecLogLockStateCheck(hostPhyId); + chPhySecJumpLockState = GetPhySecJumpLockState(hostPhyId); if ((PHYSICAL_SECTION_LOCK_NO == phyLockStatus) && (CI_SUCCESS == chFuncRet1) - && (LOG_SECTION_LOGLOCK_NO == chPhySecLogLockState)) - {/*区段锁闭状态为未锁闭(物理区段未被进路锁,逻辑区段未被进路锁,物理区段未被逻辑进路锁)*/ + && (LOG_SECTION_LOGLOCK_NO == chPhySecLogLockState)&&(PHYSICAL_SECTION_JUMP_LOCK_NO == chPhySecJumpLockState)) + {/*区段锁闭状态为未锁闭(物理区段未被进路锁,逻辑区段未被进路锁,物理区段未被逻辑进路锁,未被跳跃锁闭)*/ unlockFlag = 1u; } else @@ -11413,6 +11425,9 @@ void CheckLogSecJumpLockManage(void) UINT8 logJumpLockState = LOGIC_SECTION_JUMP_LOCK_NO; UINT8 localCi = 0u;/*本联锁*/ UINT16 logJumpLockTrainId = 0u; + UINT16 devId = 0u; /*设备ID*/ + UINT8 devState = 0u; /*设备状态*/ + UINT8 retVal = CI_ERROR; localCi = GetSystemParaLocalCiId(); @@ -11432,8 +11447,19 @@ void CheckLogSecJumpLockManage(void) checkResult = CheckLogJumpLockApply(logicSecId); if (CI_SUCCESS == checkResult) { - /** 检查条件满足,设置跳跃锁闭允许标志为允许 */ - SetLogSecJumpLockPermFlag(logicSecId, LOGIC_JUMPUNLOCK_PERMISSIVE_YES); + devId = 0u; + devState = 0u; + retVal = LogicSecRltvPrtctSwLockCheck(logicSecId, &devId, &devState); + if (CI_SUCCESS == retVal) + { + /** 检查条件满足,设置跳跃锁闭允许标志为允许 */ + SetLogSecJumpLockPermFlag(logicSecId, LOGIC_JUMPUNLOCK_PERMISSIVE_YES); + } + else + { + /** 检查条件不满足,设置跳跃锁闭允许标志为禁止 */ + SetLogSecJumpLockPermFlag(logicSecId, LOGIC_JUMPUNLOCK_PERMISSIVE_NO); + } } else { @@ -11488,7 +11514,6 @@ void AxisSecJumpLockLogicManage(void) UINT8 applyFlag = 0u;/*申请标志*/ UINT8 cancelApplyFlag = 0u;/*取消申请标志*/ UINT16 phyId = 0u;/*物理区段ID*/ - UINT8 phyUseState = 0u;/*物理区段征用状态*/ UINT8 jumpLockState = 0u;/*跳跃锁闭状态*/ UINT8 secBelongCi = 0u;/*区段所属联锁*/ UINT8 localCi = 0u;/*本联锁*/ @@ -11501,6 +11526,7 @@ void AxisSecJumpLockLogicManage(void) UINT32 applyCycle = 0u;/*跳跃锁闭申请周期*/ UINT32 curCycle = 0u;/*当前周期号*/ UINT8 chPhySecJmpState = 0U; + UINT8 chJumpPhySectionUseCheck = 0U; localCi = GetSystemParaLocalCiId(); axisSectionDataSum = GetTotalAxisCurNum(); @@ -11516,7 +11542,6 @@ void AxisSecJumpLockLogicManage(void) jumpLockState = GetAxisJumpLockState(axisSectionId);/*获取跳跃锁闭状态*/ phyId = GetAxisSecRelativePhySecId(axisSectionId);/*获取相关物理区段ID*/ - phyUseState = GetPhySecUseState(phyId);/*获取物理区段征用状态*/ secBelongCi = GetPhySecBelongCiId(phyId); @@ -11554,10 +11579,12 @@ void AxisSecJumpLockLogicManage(void) (AXSEC_CANCEL_JUMPLOCK_APPLY_NO == cancelApplyFlag)) {/*有跳跃锁闭申请*/ - if (PHYSICAL_SECTION_USING_NO == phyUseState) + chJumpPhySectionUseCheck = JumpPhySectionUseCheck(axisSectionId); + if (CI_SUCCESS == chJumpPhySectionUseCheck) {/*未征用*/ /*设置征用*/ SetPhySecUseState(phyId, PHYSICAL_SECTION_USING_YES, 0); + SetJumpPhySectionPortectSecUse(phyId, PHYSICAL_SECTION_USING_YES);/*设置物理区段关联防护道岔的区段征用*/ /*转为选排*/ SetAxisJumpLockState(axisSectionId, AXIS_SECTION_JUMPLOCK_STATE_XUANPAI); } @@ -11583,6 +11610,7 @@ void AxisSecJumpLockLogicManage(void) (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); } @@ -11603,6 +11631,7 @@ void AxisSecJumpLockLogicManage(void) (AXSEC_CANCEL_JUMPLOCK_APPLY_YES == cancelApplyFlag)) {/*有取消跳跃申请*/ SetAxisJumpLockState(axisSectionId, AXIS_SECTION_JUMPLOCK_STATE_IDLE); + SetAxisRelProSwitchLockSta(axisSectionId, SWITCH_LOCK_PROTECT_CANCEL); } } break; @@ -11645,12 +11674,14 @@ void AxisJumpLockXuanPaiManage(const UINT16 axisSecId) { rtVal = LockAxisSecProc(axisSecId);/*跳跃锁闭联锁条件检查*/ } - axisSecSwitDrvOvtmFlag = ChekJumpLockSwitDrivOvtmStat(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);/*设置物理区段的防护道岔所在区段取消防护征用*/ } else if ((RETURN_LOCK_ERR_SWITPOS == rtVal) && (CI_SUCCESS == axisSecSwitDrvOvtmFlag)) {/*位置错误可驱动且驱动道岔没有超时*/ @@ -11661,6 +11692,8 @@ void AxisJumpLockXuanPaiManage(const UINT16 axisSecId) { /*设置未征用*/ SetPhySecUseState(phyId, PHYSICAL_SECTION_USING_NO, 0); + SetJumpPhySectionPortectSecUse(phyId, PHYSICAL_SECTION_USING_NO);/*设置物理区段的防护道岔所在区段取消防护征用*/ + /*设置计轴区段跳跃状态空闲*/ SetAxisJumpLockState(axisSecId, AXIS_SECTION_JUMPLOCK_STATE_IDLE); } @@ -11669,6 +11702,8 @@ void AxisJumpLockXuanPaiManage(const UINT16 axisSecId) {/*其它*/ /*设置未征用*/ SetPhySecUseState(phyId, PHYSICAL_SECTION_USING_NO, 0); + SetJumpPhySectionPortectSecUse(phyId, PHYSICAL_SECTION_USING_NO);/*设置物理区段的防护道岔所在区段取消防护征用*/ + /*设置计轴区段跳跃状态空闲*/ SetAxisJumpLockState(axisSecId, AXIS_SECTION_JUMPLOCK_STATE_IDLE); } @@ -12393,8 +12428,11 @@ void RoutePhyOrLogSecAutoUnlocManage(const UINT16 routeId) UINT8 chPhyIncSwitchSum = 0U; UINT16* pPhySecSwitchId = NULL; UINT8 localCiType = 0U;/*联锁类型*/ + UINT8 chRouteBelongVirCiId = 0U; - localCiType = GetLocalCiType(); + + chRouteBelongVirCiId = GetRouteBelongVirCiId(routeId); + localCiType = GetLocalVirCiType(chRouteBelongVirCiId); /*获取进路锁闭的第一逻辑区段占用状态*/ @@ -12562,7 +12600,6 @@ void LogicSecResManage(void) startLockState = GetStartLockFlag(); /*获取上电解锁标志*/ startFlockFlag = GetStartFLockFlag(); /*获取上电解封标志*/ - if (0u == localCiId) { rtVal = CI_ERROR; @@ -13730,6 +13767,8 @@ static void TrainTransitmitStatJumpLockProcess(const UINT16 logSectionId, const /** 清除区段跳跃锁闭延时解锁起始周期号和延时解锁设置标志*/ SetLogSecJumpDelayUnlocStartCyc(logSectionId, 0u); SetLogSecJumpDelayUnlockFlag(logSectionId, LOGIC_JUMPUNLOCK_DELAY_SET_NO); + /*取消防护锁闭*/ + SetLogSecRelProSwitchLockSta(logSectionId, SWITCH_LOCK_PROTECT_CANCEL); } else { @@ -14434,6 +14473,8 @@ void PhySecJumpLockLogicManage(void) UINT32 dwApplyCycle = 0U;/*跳跃锁闭申请周期号*/ UINT8 chPhySecFLockType = 0U;/*物理区段封锁类型*/ UINT8 chPhySecJempState = 0U;/*物理区段跳跃锁闭状态*/ + UINT16 devId = 0u; /*设备ID*/ + UINT8 devState = 0u; /*设备状态*/ wAxisSectionDataSum = GetTotalAxisCurNum(); @@ -14457,7 +14498,8 @@ void PhySecJumpLockLogicManage(void) if ((PHY_SEC_FLOCK_TYPE_NONE == chPhySecFLockType)) { SetPhySecJumpLockState(wPhyId, PHYSICAL_SECTION_JUMP_LOCK_YES); - SetPhySecJumpLockStateToZC(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); } else @@ -14480,8 +14522,13 @@ void PhySecJumpLockLogicManage(void) } else { /*联锁内部锁闭,当持续检查锁闭条件满足时,再次给ZC发锁闭*/ - - SetPhySecJumpLockStateToZC(wPhyId, PHYSICAL_SECTION_JUMP_LOCK_YES); + devId = 0u; + devState = 0u; + chTempcheck = AxisRelatedProSwitchLockCheck(wAxisSectionId, &devId, &devState); + if (CI_SUCCESS == chTempcheck) + { + SetPhySecJumpLockStateToZC(wPhyId, PHYSICAL_SECTION_JUMP_LOCK_YES); + } } } } @@ -14490,6 +14537,7 @@ void PhySecJumpLockLogicManage(void) {/*有取消跳跃申请*/ SetPhySecJumpLockState(wPhyId, PHYSICAL_SECTION_JUMP_LOCK_NO); SetPhySecJumpLockStateToZC(wPhyId, PHYSICAL_SECTION_JUMP_LOCK_NO); + SetAxisRelProSwitchLockSta(wAxisSectionId, SWITCH_LOCK_PROTECT_CANCEL);/*取消防护锁闭*/ } } } @@ -15607,7 +15655,7 @@ void SetNormalRouteLogicResUsable(const UINT16 wLogSectionId, const UINT16 wTrai if ((LOG_SECTION_LOCK_NORMAL == chLogicLockState) || (LOG_SECTION_LOCK_DELAY == chLogicLockState)) { - chRouteTrainEnterFlag = dsuTrainMinHeadCrossSignal(wTrainId, wLogicRLockRouteId); + chRouteTrainEnterFlag = dsuTrainMinHeadCrossSignal(wTrainId, wLogicRLockRouteId, CI_SUCCESS); chTrainMaxHeadCross = dsuTrainCrossSignal(wTrainId, wLogicRLockRouteId);/*判断列车大前是否驶入进路*/ diff --git a/TSCP/src/APP/ciapp/LogicManage/RouteRecoverManage.c b/TSCP/src/APP/ciapp/LogicManage/RouteRecoverManage.c index b39599c..ca7464f 100644 --- a/TSCP/src/APP/ciapp/LogicManage/RouteRecoverManage.c +++ b/TSCP/src/APP/ciapp/LogicManage/RouteRecoverManage.c @@ -3161,14 +3161,14 @@ static UINT8 OtherCiValidErrCheck(UINT16 const routeId) { if (psdIdBuf[j] == tmpOtherCiDevInfo->DevId) { - cPsdExceptOpenState = GePsdExceptOpenState(tmpOtherCiDevInfo->DevId); - if (PSD_EXCEPT_OPEN_NO == cPsdExceptOpenState) + cPsdExceptOpenState = GePsdExceptState(tmpOtherCiDevInfo->DevId); + if (PSD_EXCEPT_NO == cPsdExceptOpenState) { - toOpenCheckFlag = 1U; /*PSD未异常打开,设置可自动重开*/ + toOpenCheckFlag = 1U; /*PSD未异常,设置可自动重开*/ } else { - toOpenCheckFlag = 0U; /*存在PSD异常打开,停止遍历,设置不可自动重开*/ + toOpenCheckFlag = 0U; /*存在PSD异常,停止遍历,设置不可自动重开*/ break; } } @@ -4171,12 +4171,15 @@ static UINT8 KeepCbtcRouteSectionErrCheck(const UINT16 routeId) UINT8 preLogDevState = 0u; /*之前逻辑区段占用状态*/ UINT8 LogSecCurCtOrUtOcc = 0U; /*逻辑区段当前占用状态*/ UINT8 cLocalCiType = 0U; /*本控区类型*/ + UINT8 chRouteBelongVirCiId = 0U; rcWorkMode = GetLocalRcWorkMode(); /* 联锁逻辑检查 */ reResult = CI_SUCCESS; cLocalCiType = GetLocalCiType(); + chRouteBelongVirCiId = GetRouteBelongVirCiId(routeId); + cLocalCiType = GetLocalVirCiType(chRouteBelongVirCiId); if (CI_TYPE_CLD != cLocalCiType) { /*非车辆段,按CBTC既有逻辑处理*/ @@ -4324,10 +4327,12 @@ static UINT8 OpenCbtcRouteSectionErrCheck(const UINT16 routeId) UINT8 cLocalCiType = 0U; /*本控区类型*/ UINT8 chRouteCouplinkFlag = 0U; UINT8 chSigCrossState = 0U; + UINT8 chRouteBelongVirCiId = 0U; rcWorkMode = GetLocalRcWorkMode(); /* 联锁逻辑检查 */ - cLocalCiType = GetLocalCiType(); + chRouteBelongVirCiId = GetRouteBelongVirCiId(routeId); + cLocalCiType = GetLocalVirCiType(chRouteBelongVirCiId); if (CI_TYPE_CLD != cLocalCiType) { /*非车辆段,按CBTC既有逻辑处理*/ diff --git a/TSCP/src/APP/ciapp/LogicManage/TradInterlockLogicManage.c b/TSCP/src/APP/ciapp/LogicManage/TradInterlockLogicManage.c index 6412aea..dff2d7a 100644 --- a/TSCP/src/APP/ciapp/LogicManage/TradInterlockLogicManage.c +++ b/TSCP/src/APP/ciapp/LogicManage/TradInterlockLogicManage.c @@ -229,6 +229,7 @@ void NonRouteLogicProcess(void) { NonRouteCancelDeal(pNonRoute->NonRouteId); /*非进路取消处理*/ } + } } @@ -240,22 +241,42 @@ void NonRouteLogicProcess(void) */ void NonRouteXuanPaiDeal(UINT8 nonRouteId) { + UINT8 reResult = CI_ERROR; NonRouteDataStruct *pNonRoute = GetNonRouteDataById(nonRouteId); - if (CI_SUCCESS == LockNonRouteP(nonRouteId)) + reResult = LockNonRouteP(nonRouteId); + if (CI_SUCCESS == reResult) { /*锁闭成功*/ - - if (CI_SUCCESS == CheckNonRouteSwitchPosRight(nonRouteId,0u,0u)) - { /*进路道岔位置正确*/ - SetNonRouteStateDeal(nonRouteId,NONROUTE_STATE_LOCK); /*设置非进路为锁闭*/ + reResult = CheckNonRouteSwitchPosRight(nonRouteId, 0U, 0U); + if (CI_SUCCESS == reResult) + { + /*进路道岔位置正确*/ + /*侵限区段侵限条件不满足检查*/ + reResult = NonRouteIntruSecVainCheck(nonRouteId, EFUNC_CLD_LOCK_NONROUTE, ESEND_LEVEL_ATS); + if (CI_SUCCESS == reResult) + { + SetNonRouteStateDeal(nonRouteId, NONROUTE_STATE_LOCK); /*设置非进路为锁闭*/ + } + else + { + SetNonRouteStateDeal(nonRouteId, NONROUTE_STATE_IDLE); /*设置非进路为空闲*/ + /* NonRouteIntruSecVainCheck函数已经有故障码,不再记录*/ + } + + } else { /*道岔未动作到位*/ /*非进路锁闭驱动道岔*/ - if (CI_ERROR == NonRouteLockDrvSwitchDeal(nonRouteId)) + reResult = NonRouteLockDrvSwitchDeal(nonRouteId); + if (CI_SUCCESS == reResult) { - SetNonRouteStateDeal(nonRouteId,NONROUTE_STATE_IDLE); /*设置非进路为空闲*/ + /*继续驱动道岔*/ } + else + { + SetNonRouteStateDeal(nonRouteId, NONROUTE_STATE_IDLE); /*设置非进路为空闲*/ + } } } @@ -6026,6 +6047,8 @@ void DTrainReturnUnlockP(void) UINT16 routeId = 0u; /*进路ID*/ UINT8 belongCiId = 0u; /*进路所属联锁ID*/ UINT16 ii = 0u; /*循环索引*/ + UINT8 belongVirCIid = 0U; + UINT8 chLocalVirCiType = 0U; routeCurSum = GetRouteCurSum(); /*获取进路总数*/ @@ -6047,9 +6070,13 @@ void DTrainReturnUnlockP(void) { continue; } - - /*调车中途折返进路完整锁闭处理*/ - DTrainReturnUnlockRouteAllLockP(routeId); + belongVirCIid = GetRouteBelongVirCiId(routeId); + chLocalVirCiType = GetLocalVirCiType(belongVirCIid); + if (CI_TYPE_CLD == chLocalVirCiType) + { + /*调车中途折返进路完整锁闭处理*/ + DTrainReturnUnlockRouteAllLockP(routeId); + } } /*处理调车中途折返*/ @@ -6068,9 +6095,13 @@ void DTrainReturnUnlockP(void) { continue; } - - /*调车中途折返进路部分锁闭处理*/ - DTrainRtnUnlockRoutePartLockP(routeId); + belongVirCIid = GetRouteBelongVirCiId(routeId); + chLocalVirCiType = GetLocalVirCiType(belongVirCIid); + if (CI_TYPE_CLD == chLocalVirCiType) + { + /*调车中途折返进路部分锁闭处理*/ + DTrainRtnUnlockRoutePartLockP(routeId); + } } } @@ -6089,6 +6120,11 @@ UINT16 GetReturnId(const UINT16 routeId) UINT8 preRouteState = 0u; /* 之前进路状态 */ UINT16 ii = 0u; UINT8 toGo = CI_SUCCESS; + UINT8 chRouteState = 0U; + UINT8 chRoutePhysicalType = 0U; + UINT8 chAllLockSecNoOccupyCheck = 0U; + UINT8 chTrainEnterRouteFlag = 0U; + routeState = GetRouteState(routeId); /*获取进路状态*/ preRouteState = GetRoutePreState(routeId);/*获取进路前一状态*/ @@ -6098,7 +6134,8 @@ UINT16 GetReturnId(const UINT16 routeId) toGo = CI_ERROR; } - if ((CI_ERROR == RouteAllLockSecNoOccupyCheck(routeId)) && (CI_SUCCESS == toGo)) + chAllLockSecNoOccupyCheck = RouteAllLockSecNoOccupyCheck(routeId); + if ((CI_ERROR == chAllLockSecNoOccupyCheck) && (CI_SUCCESS == toGo)) { /*进路区段不是都空闲*/ toGo = CI_ERROR; @@ -6119,8 +6156,10 @@ UINT16 GetReturnId(const UINT16 routeId) /*获取所有满足道岔条件的进路ID*/ for (ii = 0u; ii < starSigRouteSum; ii++) { + chRouteState = GetRouteState(starSigRouteBuf[ii]); + chRoutePhysicalType = CheckRoutePhysicalType(starSigRouteBuf[ii]); /*B库改为两条进路,当8编组车占压两条进路时,此时BG2进路解锁需要检查以差值信号机为始端的进路的状态*/ - if ((ROUTE_STATE_IDLE == GetRouteState(starSigRouteBuf[ii])) &&(CI_SUCCESS == CheckRoutePhysicalType(starSigRouteBuf[ii]))) + if ((ROUTE_STATE_IDLE == chRouteState) &&(CI_SUCCESS == chRoutePhysicalType)) { /*以并置信号机为始端的进路均为空闲且进路包含的区段均为列检库区段,且并置信号机为虚拟信号机, 该种算法目前只限制在库线中中途折返场景(SIGNAL_VIRTUAL_YES == GetSignalVirtualAttr(returnSigId))*/ @@ -6148,7 +6187,8 @@ UINT16 GetReturnId(const UINT16 routeId) /* 如果是差至,如果列车驶入过进路,同时之前状态必须为接近锁闭开放 * 否则不认为是同一列车跨入中途折返处理 */ - if((ROUTE_STATE_NEAR_OPEN == preRouteState) && (TRAIN_ENTER_ROUTE_FLAG_YES == GetTrainEnterRouteFlag(routeId))) + chTrainEnterRouteFlag = GetTrainEnterRouteFlag(routeId); + if((ROUTE_STATE_NEAR_OPEN == preRouteState) && (TRAIN_ENTER_ROUTE_FLAG_YES == chTrainEnterRouteFlag)) { returnSigId = GetRouteChaZhiSignalId(routeId); /*获取差置信号机ID*/ } diff --git a/TSCP/src/APP/ciapp/LogicProcess/InterlockLogicCheck.c b/TSCP/src/APP/ciapp/LogicProcess/InterlockLogicCheck.c index eb8f672..242afef 100644 --- a/TSCP/src/APP/ciapp/LogicProcess/InterlockLogicCheck.c +++ b/TSCP/src/APP/ciapp/LogicProcess/InterlockLogicCheck.c @@ -5249,14 +5249,7 @@ UINT8 CheckDTrainKeepSigPhySecOccupy(const UINT16 routeId,UINT8 functionId,UINT8 } else { - if (0u == outPhySecId) - {/*外方区段不存在*/ - devState = SECTION_OCCUPY_YES;/*默认为占用*/ - } - else - { - devState = GetPhySecCurMergeState(outPhySecId); - } + devState = GetPhySecCurMergeState(outPhySecId); SetErrorData(functionId,CI_DEVICE_TYPE_PHYSEC,outPhySecId,ETYPE_PS_MERGY_OCU_STATE,devState,sendLevel); } } @@ -7636,9 +7629,9 @@ UINT8 OtherCiValidCheck(UINT16 const routeId,UINT8 const functionId,UINT8 const UINT8 OtherCiDevStatusCheck(UINT16 const routeId,const RouteOtherCheckStruct *pOtherDevInfo, UINT16 *pDevId,UINT8 *pDevState) { - UINT16 devId = pOtherDevInfo->DevId; - UINT16 chkDevStatus = pOtherDevInfo->DevStatus; - UINT16 devType = pOtherDevInfo->DevType; + UINT16 devId = 0U; + UINT16 chkDevStatus = 0U; + UINT16 devType = 0U; UINT8 devState = 0u; UINT8 ret = CI_ERROR; UINT8 routeLeadProperty = 0u; /*进路引导属性*/ @@ -7654,130 +7647,142 @@ UINT8 OtherCiDevStatusCheck(UINT16 const routeId,const RouteOtherCheckStruct *pO UINT8 cFuncSwitchEsb = FUNC_SWITCH_ON; /*引导进路是否检查ESB开关*/ UINT8 cRouteToLeadFlag = 0U; /*进路转引导进路标志*/ - devState = GetOtherCiDevStatus(devType,devId,chkDevStatus); + if (NULL != pOtherDevInfo) + { + devId = pOtherDevInfo->DevId; + chkDevStatus = pOtherDevInfo->DevStatus; + devType = pOtherDevInfo->DevType; - if (CI_DEVICE_TYPE_SIGNAL != devType) - { /* 信号机外的状态 */ - /* 状态不满足,则返回失败 */ - if (chkDevStatus != devState) - { - routeLeadProperty = GetRouteLeadProperty(routeId);/*获取进路引导属性*/ - routeState = GetRouteState(routeId);/*获取进路状态*/ - cRouteToLeadFlag = GetRouteToLeadFlag(routeId); /*获取引导进路转换标志*/ - if (((ROUTE_LEAD_PROPERTY_YES == routeLeadProperty) || (ROUTE_LEAD_PROPERTY_CBTC_YES == routeLeadProperty)) - && (((ROUTE_STATE_LEAD_LOCK == routeState) || (ROUTE_STATE_LEAD_LOCKERR == routeState) || (ROUTE_STATE_LEAD_OPEN == routeState)) || (ROUTE_TO_LEAD_FLAG_YES == cRouteToLeadFlag))) + devState = GetOtherCiDevStatus(devType, devId, chkDevStatus); + + if (CI_DEVICE_TYPE_SIGNAL != devType) + { /* 信号机外的状态 */ + /* 状态不满足,则返回失败 */ + if (chkDevStatus != devState) { - /*引导进路其他联锁条件只检查进路外方计轴区段的占用状态、联络线道岔、道岔、防淹门(根据“引导进路是否检查防淹门状态”开关确定是否检查) - 和ESB(根据“引导进路是否检查ESB状态”开关确定是否检查)*/ - cFuncSwitchFloodGate = GetCiFunctionSwitchConfig(FUNC_LEADROUTE_FLOODGATE_CHECK); - cFuncSwitchEsb = GetCiFunctionSwitchConfig(FUNC_LEADROUTE_ESB_CHECK); + routeLeadProperty = GetRouteLeadProperty(routeId);/*获取进路引导属性*/ + routeState = GetRouteState(routeId);/*获取进路状态*/ + cRouteToLeadFlag = GetRouteToLeadFlag(routeId); /*获取引导进路转换标志*/ - if ((CI_DEVICE_TYPE_AXISSEC == devType) || (CI_DEVICE_TYPE_CONNECT_SWITCH == devType) || (CI_DEVICE_TYPE_SWITCH == devType) - || ((CI_DEVICE_TYPE_FLOODGATE == devType) && (FUNC_SWITCH_OFF != cFuncSwitchFloodGate)) - || ((CI_DEVICE_TYPE_ESB == devType) && (FUNC_SWITCH_OFF != cFuncSwitchEsb))) - { - ret = CI_ERROR; + if (((ROUTE_LEAD_PROPERTY_YES == routeLeadProperty) || (ROUTE_LEAD_PROPERTY_CBTC_YES == routeLeadProperty)) + && (((ROUTE_STATE_LEAD_LOCK == routeState) || (ROUTE_STATE_LEAD_LOCKERR == routeState) || (ROUTE_STATE_LEAD_OPEN == routeState)) || (ROUTE_TO_LEAD_FLAG_YES == cRouteToLeadFlag))) + { + /*引导进路其他联锁条件只检查进路外方计轴区段的占用状态、联络线道岔、道岔、防淹门(根据“引导进路是否检查防淹门状态”开关确定是否检查) + 和ESB(根据“引导进路是否检查ESB状态”开关确定是否检查)*/ + cFuncSwitchFloodGate = GetCiFunctionSwitchConfig(FUNC_LEADROUTE_FLOODGATE_CHECK); + cFuncSwitchEsb = GetCiFunctionSwitchConfig(FUNC_LEADROUTE_ESB_CHECK); + + if ((CI_DEVICE_TYPE_AXISSEC == devType) || (CI_DEVICE_TYPE_CONNECT_SWITCH == devType) || (CI_DEVICE_TYPE_SWITCH == devType) + || ((CI_DEVICE_TYPE_FLOODGATE == devType) && (FUNC_SWITCH_OFF != cFuncSwitchFloodGate)) + || ((CI_DEVICE_TYPE_ESB == devType) && (FUNC_SWITCH_OFF != cFuncSwitchEsb))) + { + ret = CI_ERROR; + } + else + { + ret = CI_SUCCESS; + } } else { - ret = CI_SUCCESS; - } - } - else - { - if (CI_DEVICE_TYPE_AXISSEC == devType) /*针对站外直轨,需要将计轴单独判断*/ - { - AxisSecLinXianFlag = GetAxisSecLinXianFlag(devId); - - if (AXIS_SEC_LINXIAN_NO == AxisSecLinXianFlag) + if (CI_DEVICE_TYPE_AXISSEC == devType) /*针对站外直轨,需要将计轴单独判断*/ { - /*获取进路外方第一离去逻辑区段*/ - leaveLogicSecId = GetRouteLeaveLogicSecId(routeId); - /*进路存在外方离去区段*/ - if (0U != leaveLogicSecId) - { - /*逻辑区段包含的道岔*/ - logSwichSum = GetLogicSecSwitchSum(leaveLogicSecId); - routeOverlapSum = GetRouteOverlapSum(routeId); - /*逻辑区段关联的计轴区段*/ - logBelogAxisNum = GetLgcSecRelativeAxleSecSum(leaveLogicSecId); - logBelogAxisBuff = GetLgcSecRltvAxleSecIdBuf(leaveLogicSecId); + AxisSecLinXianFlag = GetAxisSecLinXianFlag(devId); - /*当前进路无保护区段,且离去逻辑区段不包含道岔*/ - if ((0U == logSwichSum) && (0U == routeOverlapSum) && (1U == logBelogAxisNum)) + if (AXIS_SEC_LINXIAN_NO == AxisSecLinXianFlag) + { + /*获取进路外方第一离去逻辑区段*/ + leaveLogicSecId = GetRouteLeaveLogicSecId(routeId); + /*进路存在外方离去区段*/ + if (0U != leaveLogicSecId) { - /*所配置的计轴为本进路离去计轴区段,可检查进路离去ABL列车条件*/ - if (logBelogAxisBuff[0] == devId) + /*逻辑区段包含的道岔*/ + logSwichSum = GetLogicSecSwitchSum(leaveLogicSecId); + routeOverlapSum = GetRouteOverlapSum(routeId); + /*逻辑区段关联的计轴区段*/ + logBelogAxisNum = GetLgcSecRelativeAxleSecSum(leaveLogicSecId); + logBelogAxisBuff = GetLgcSecRltvAxleSecIdBuf(leaveLogicSecId); + + /*当前进路无保护区段,且离去逻辑区段不包含道岔*/ + if ((0U == logSwichSum) && (0U == routeOverlapSum) && (1U == logBelogAxisNum)) { - ret = TrainLeaveLogSecABLTrainCheck(leaveLogicSecId); + /*所配置的计轴为本进路离去计轴区段,可检查进路离去ABL列车条件*/ + if (logBelogAxisBuff[0] == devId) + { + ret = TrainLeaveLogSecABLTrainCheck(leaveLogicSecId); + } + else + { + ret = CI_ERROR; + } + } else { ret = CI_ERROR; } - } else { - ret = CI_ERROR; + ret = CI_ERROR; /*进路无离去区段,无需再检查是否有VBL接近,直接返回失败*/ } } else { - ret = CI_ERROR; /*进路无离去区段,无需再检查是否有VBL接近,直接返回失败*/ + ret = CI_ERROR; /*计轴非本线路,无需再检查是否有VBL接近,直接返回失败*/ } } else { - ret = CI_ERROR; /*计轴非本线路,无需再检查是否有VBL接近,直接返回失败*/ + if (OTHER_CI_PSD_STATUS_OCCUPY_OPEN == devState) + { + /* 正常收到VOBC打开屏蔽门命令打开屏蔽门 只记录不发送*/ + ret = CI_ROUTE_RECOVER_ERR; + } + else + { + /* 屏蔽门异常打开 */ + ret = CI_ERROR; + } } } - else - { - if (OTHER_CI_PSD_STATUS_OCCUPY_OPEN == devState) - { - /* 正常收到VOBC打开屏蔽门命令打开屏蔽门 只记录不发送*/ - ret = CI_ROUTE_RECOVER_ERR; - } - else - { - /* 屏蔽门异常打开 */ - ret = CI_ERROR; - } - } - } - } - else - { - ret = CI_SUCCESS; - } - } - else - { - /* 信号机状态 */ - if ((OTHER_CI_SIGNAL_STATUS_SAME == chkDevStatus)||(OTHER_CI_SIGNAL_STATUS_OPEN == chkDevStatus)) - { - retVal = CheckRelationSignalOnSameOpen(routeId, devId, (UINT8)chkDevStatus); - if (CI_SUCCESS == retVal) - { - ret = CI_SUCCESS; } else { - ret = CI_ERROR; + ret = CI_SUCCESS; } } else { - /*异常值防护,信号机只可配置开放条件0x55或者0xbb*/ - ret = CI_ERROR; + /* 信号机状态 */ + if ((OTHER_CI_SIGNAL_STATUS_SAME == chkDevStatus) || (OTHER_CI_SIGNAL_STATUS_OPEN == chkDevStatus)) + { + retVal = CheckRelationSignalOnSameOpen(routeId, devId, (UINT8)chkDevStatus); + if (CI_SUCCESS == retVal) + { + ret = CI_SUCCESS; + } + else + { + ret = CI_ERROR; + } + } + else + { + /*异常值防护,信号机只可配置开放条件0x55或者0xbb*/ + ret = CI_ERROR; + } + } + if (CI_ERROR == ret) + { + *pDevId = devId; + *pDevState = devState; } } - if (CI_ERROR == ret) - { - *pDevId = devId; - *pDevState = devState; + else + {/*防护代码,实际不进入*/ + ret = CI_ERROR; } return ret; @@ -8452,7 +8457,7 @@ UINT8 KeepBlocRouteOtherSignalCheck(UINT16 routeId,UINT8 functionId,UINT8 sendLe /*进路开放信号机需检查相关折返进路*/ UINT8 const zheFanRouteSum = GetRtnEndSigAsStartSigRouteSum(routeId); UINT16 * const zheFanRouteIdBuf = GetReturnEndSigAsStartSigRoute(routeId); - + UINT16 const startSignalId = GetRouteStartSignalId(routeId); /* 联锁逻辑检查 */ @@ -8530,8 +8535,9 @@ UINT8 KeepBlocRouteOtherSignalCheck(UINT16 routeId,UINT8 functionId,UINT8 sendLe else { /* 记录故障码 */ - SetErrorData(functionId,CI_DEVICE_TYPE_ROUTE,devId,ETYPE_SIG_RETURN_OPENED_STATE,devState,sendLevel); - reResult = CI_ERROR; + /*原报警ETYPE_SIG_RETURN_OPENED_STATE,出现因进路id顺序出现报警不一致*/ + SetErrorData(functionId, CI_DEVICE_TYPE_SIGNAL, startSignalId, ETYPE_SIG_START_OPEN_STATE, SIGNAL_CLOSE, sendLevel); + reResult = CI_ERROR; } } @@ -8701,6 +8707,7 @@ UINT8 OpenBlocRouteOtherSignalCheck(UINT16 routeId,UINT8 functionId,UINT8 sendLe UINT8 signalVirtualAttr = SIGNAL_VIRTUAL_NO;/*虚拟信号机属性*/ UINT8 repeatOpenFlag = ROUTE_REPEATOPEN_SET_NO;/*重开标志*/ + UINT16 const startSignalId = GetRouteStartSignalId(routeId); /* 联锁逻辑检查 */ cRouteLeadProperty = GetRouteLeadProperty(routeId); @@ -8837,7 +8844,8 @@ UINT8 OpenBlocRouteOtherSignalCheck(UINT16 routeId,UINT8 functionId,UINT8 sendLe else { /* 记录故障码 */ - SetErrorData(functionId,CI_DEVICE_TYPE_ROUTE,devId,ETYPE_SIG_RETURN_OPENED_STATE,devState,sendLevel); + /*原报警ETYPE_SIG_RETURN_OPENED_STATE 出现因进路id顺序出现报警不一致 */ + SetErrorData(functionId, CI_DEVICE_TYPE_SIGNAL, startSignalId, ETYPE_SIG_START_OPEN_STATE, SIGNAL_CLOSE, sendLevel); reResult = CI_ERROR; } } @@ -8887,7 +8895,7 @@ UINT8 OpenCbtcRouteOtherSignalCheck(UINT16 routeId, UINT8 functionId, UINT8 send UINT8 signalVirtualAttr = SIGNAL_VIRTUAL_NO;/*虚拟信号机属性*/ UINT8 repeatOpenFlag = ROUTE_REPEATOPEN_SET_NO;/*重开标志*/ UINT8 needOpenNotTrueRepeatFlag = ROUTE_NEEDOPEN_REOPEN_NO;/*需开放不满足重开标志*/ - + UINT16 const startSignalId = GetRouteStartSignalId(routeId);/*始端信号机*/ routeState = GetRouteState(routeId);/*获取进路状态*/ /* 联锁逻辑检查 */ @@ -9013,7 +9021,8 @@ UINT8 OpenCbtcRouteOtherSignalCheck(UINT16 routeId, UINT8 functionId, UINT8 send else { /* 记录故障码 */ - SetErrorData(functionId, CI_DEVICE_TYPE_ROUTE, devId, ETYPE_SIG_RETURN_OPENED_STATE, devState, sendLevel); + /*原报警ETYPE_SIG_RETURN_OPENED_STATE,出现因进路id顺序出现报警不一致*/ + SetErrorData(functionId, CI_DEVICE_TYPE_SIGNAL, startSignalId, ETYPE_SIG_START_OPEN_STATE, SIGNAL_CLOSE, sendLevel); reResult = CI_ERROR; } } @@ -11815,7 +11824,6 @@ UINT8 CheckRouteEndSignalNotCbtc(UINT16 routeId,UINT8 functionId,UINT8 sendLevel UINT8 confirmRelayInterfaceFlag = GetCiCiRelayInterfConfirmFlag();/*继电接口确认状态*/ UINT8 sigalMaintainState = 0U;/*信号机维修点灯状态*/ UINT8 belongVirCI = 0u; - UINT8 allSignalBrightFlag = 0u; /*全站亮灯*/ bCiSwitchShowGreenYellow = GetCiFunctionSwitchConfig(CI_FUNCTION_SWITCH_SHOW_SIGNAL_GreenYellow); @@ -11841,9 +11849,6 @@ UINT8 CheckRouteEndSignalNotCbtc(UINT16 routeId,UINT8 functionId,UINT8 sendLevel sigalMaintainState = GetSignalMaintainState(routeEndSignalId);/*信号机维修点灯状态*/ - belongVirCI = GetSignalBelongVirCiId(routeEndSignalId); - allSignalBrightFlag = GetVirCIAllSignalBrightState(belongVirCI);/*本虚拟联锁全站亮灯标志*/ - if ((SIGNAL_LIGHT_EXTICT_STATE_NO == endSignalLightExtinctState )&&(MAINTAIN_STATE_NO == sigalMaintainState)) { routeState = GetRouteState(routeId); @@ -13431,21 +13436,24 @@ UINT8 checkSwtLastValDrvPosStayorNot(const UINT16 switchId,const UINT8 swtCurPos UINT8 retVal = CI_ERROR;/*返回值*/ UINT8 lastValidDrvSta = 0u;/*道岔最近一次的有效驱动状态*/ UINT32 lastValidDrvCycNum = 0u;/*道岔最近一次的有效驱动状态起始周期*/ + UINT32 dwLastDrvValidTime = 0u; + UINT8 timeOut = 0u; lastValidDrvSta = GetSwitchLastValidDrvPos(switchId); lastValidDrvCycNum = GetSwitchLastValDrvPosStartCyc(switchId); - + dwLastDrvValidTime = GetSwitchLastDrvValidTime();/*道岔上一次驱动在有效期间周期数*/ if (SWITCH_POSITION_DINGWEI == swtCurPos) {/*道岔定位*/ if (SWITCH_DRIVE_POS_FANWEI == lastValidDrvSta) {/*最近一次有效驱动为反位*/ - if ((Get2oo2CurCycleNum() - lastValidDrvCycNum) <= SWITCH_LAST_DRV_STAY_MAX_NUM ) - {/*驱动持续*/ - retVal = CI_ERROR; + timeOut = SystemOverTimeCheck(lastValidDrvCycNum, dwLastDrvValidTime); + if (CI_TIME_OUT == timeOut) + {/*驱动超时*/ + retVal = CI_SUCCESS; } else { - retVal = CI_SUCCESS; + retVal = CI_ERROR; } } else if((SWITCH_DRIVE_POS_DINGWEI == lastValidDrvSta) @@ -13463,13 +13471,14 @@ UINT8 checkSwtLastValDrvPosStayorNot(const UINT16 switchId,const UINT8 swtCurPos {/*道岔反位*/ if (SWITCH_DRIVE_POS_DINGWEI == lastValidDrvSta) {/*最近一次有效驱动为定位*/ - if ((Get2oo2CurCycleNum() - lastValidDrvCycNum) <= SWITCH_LAST_DRV_STAY_MAX_NUM ) - {/*驱动持续*/ - retVal = CI_ERROR; + timeOut = SystemOverTimeCheck(lastValidDrvCycNum, dwLastDrvValidTime); + if (CI_TIME_OUT == timeOut) + {/*驱动超时*/ + retVal = CI_SUCCESS; } else { - retVal = CI_SUCCESS; + retVal = CI_ERROR; } } else if ((SWITCH_DRIVE_POS_FANWEI == lastValidDrvSta) @@ -15309,6 +15318,7 @@ UINT8 ChekJumpLockSwitDrivOvtmStat(const UINT16 axisSecId) UINT8 SwitchPos = SWITCH_POSITION_INVALID; UINT8 SwitchDrivOvtmDrvPos = SWITCH_DRIVE_POS_INVALID; + if (NULL == dataIdBuf) { /*无检查项*/ @@ -15351,6 +15361,81 @@ UINT8 ChekJumpLockSwitDrivOvtmStat(const UINT16 axisSecId) } } + if (CI_SUCCESS == retVal) + {/*检查防护道岔是否驱动超时*/ + retVal = ChekJumpLockProtectSwitDrivOvtmStat(axisSecId); + } + + return retVal; +} + +/* +* 功能描述: 检查计轴区段跳跃锁闭是否有防护道岔驱动超时 +* 参数说明: const UINT16 routeId, 计轴区段ID +* 返回值 : UINT8 + CI_SUCCESS:计轴区段防护道岔无道岔驱动超时 + CI_ERROR:计轴区段防护道岔驱动超时 +add by mpt 20260331 +*/ +UINT8 ChekJumpLockProtectSwitDrivOvtmStat(const UINT16 axisSecId) +{ + UINT8 retVal = CI_ERROR; + + UINT8 checkSum = 0u; + AxisSwitchStruct* dataIdBuf = NULL; + + /* 局部变量定义初始化 */ + UINT16 i = 0u; /* 循环变量 */ + UINT16 SwitchId = 0u; + UINT8 SwitchPos = SWITCH_POSITION_INVALID; + UINT8 SwitchDrivOvtmDrvPos = SWITCH_DRIVE_POS_INVALID; + + + checkSum = GetAxisSecRelateProSwSum(axisSecId); + dataIdBuf = GetAxisSecRelateProSwStru(axisSecId); + + if (NULL == dataIdBuf) + { + /*无检查项*/ + retVal = CI_ERROR; + } + else + { + retVal = CI_SUCCESS; + /*开始检查计轴区段内道岔*/ + for (i = 0u; i < checkSum; i++) + { + SwitchId = dataIdBuf[i].SwitchId; + SwitchPos = dataIdBuf[i].SwitchPosition; + SwitchDrivOvtmDrvPos = GetSwitchDrivOvtmDrvPosition(SwitchId); + + if (SWITCH_POSITION_DINGWEI == SwitchPos) + { + /*道岔位置正确*/ + if (SWITCH_DRIVE_POS_DINGWEI == SwitchDrivOvtmDrvPos) + { + retVal = CI_ERROR; + break; + } + + } + else if (SWITCH_POSITION_FANWEI == SwitchPos) + { + /*道岔位置正确*/ + if (SWITCH_DRIVE_POS_FANWEI == SwitchDrivOvtmDrvPos) + { + retVal = CI_ERROR; + break; + } + + } + else + { + /*什么也不做*/ + } + } + } + return retVal; } @@ -15516,6 +15601,10 @@ UINT8 JumpLockSwitchCheck(const UINT16 axisSecId,UINT8 funcId,UINT8 sendLevel) UINT16 devId = 0u; /*设备ID*/ UINT8 devState = 0u; /*设备状态*/ UINT8 reVal = CI_ERROR; + UINT16 phyId = 0u; + UINT8 chPhySecJmpState = 0U; + + phyId = GetAxisSecRelativePhySecId(axisSecId);/*获取相关物理区段ID*/ /*计轴区段内所有道岔未引导总锁*/ devId = 0u; @@ -15541,6 +15630,22 @@ UINT8 JumpLockSwitchCheck(const UINT16 axisSecId,UINT8 funcId,UINT8 sendLevel) } } + /*计轴区段的防护道岔未封锁*/ + if (CI_SUCCESS == reVal) + { + devId = 0u; + devState = 0u; + reVal = AxisSecProtSwitchFLockCheck(axisSecId, &devId, &devState); + if (CI_ERROR == reVal) + { + /* 记录故障码 */ + SetErrorData(funcId, CI_DEVICE_TYPE_SWITCH, devId, ETYPE_SWT_FLOCK_STATE, devState, sendLevel); + } + } + + + + /*计轴区段内所有道岔位置正确且如有最后一次驱动一致或位置不正确但可动作*/ if (CI_SUCCESS == reVal) { @@ -15553,6 +15658,35 @@ UINT8 JumpLockSwitchCheck(const UINT16 axisSecId,UINT8 funcId,UINT8 sendLevel) SetErrorData(funcId,CI_DEVICE_TYPE_SWITCH,devId,ETYPE_SWT_FLOCK_STATE,devState,sendLevel); } } + + /*计轴区段防护道岔位置正确且如有最后一次驱动一致或位置不正确但可动作*/ + if (CI_SUCCESS == reVal) + { + devId = 0u; + devState = 0u; + reVal = AxisSecPorteSwitchPosMoveCheck(axisSecId, &devId, &devState, funcId, sendLevel); + if (CI_ERROR == reVal) + { + /* 记录故障码 */ + SetErrorData(funcId, CI_DEVICE_TYPE_SWITCH, devId, ETYPE_SWT_FLOCK_STATE, devState, sendLevel); + } + } + + if (CI_SUCCESS == reVal) + { + chPhySecJmpState = GetPhySecJumpLockState(phyId); + if (PHYSICAL_SECTION_JUMP_LOCK_YES == chPhySecJmpState) + {/*检查防护道岔锁闭状态*/ + devId = 0u; + devState = 0u; + reVal = AxisRelatedProSwitchLockCheck(axisSecId, &devId, &devState); + } + else + { + /*此时尚未锁闭区段,尚未锁闭防护道岔,故不检查*/ + } + } + /*计轴区段内所有道岔位置正确 不正确:RETURN_LOCK_ERR_SWITPOS 正确:CI_SUCCESS*/ @@ -15567,6 +15701,18 @@ UINT8 JumpLockSwitchCheck(const UINT16 axisSecId,UINT8 funcId,UINT8 sendLevel) } } + /*计轴区段防护道岔所有道岔位置正确 不正确:RETURN_LOCK_ERR_SWITPOS 正确:CI_SUCCESS*/ + if (CI_SUCCESS == reVal) + { + devId = 0u; + devState = 0u; + reVal = AxisSecAllProtSwitchPosCheck(axisSecId, &devId, &devState); + if (CI_ERROR == reVal) + { + reVal = RETURN_LOCK_ERR_SWITPOS; + } + } + return reVal; } @@ -15781,7 +15927,108 @@ UINT8 AxisSecSwitchPosMoveValCheck(UINT16 const axisSecId,UINT16 *pDevId,UINT8 * return reVal; } +/* +* 功能描述: 计轴区段的防护道岔位置和动作有效性检查 +* 参数说明: UINT16 const axisSecId, 计轴区段编号 +* UINT16 *pDevId, 设备Id(返回) +* UINT8 *pDevState, 设备状态(返回) +* 返回值 : CI_ERROR +* CI_SUCCESS +* add by mpt 20260331 +*/ +UINT8 AxisSecPorteSwitchPosMoveCheck(UINT16 const axisSecId, UINT16* pDevId, UINT8* pDevState, UINT8 funcId, UINT8 sendLevel) +{ + /* 计轴区段道岔 */ + /* 局部变量定义初始化 */ + UINT16 i = 0u; /* 循环变量 */ + UINT16 devId = 0u; + UINT8 devState = 0u; + UINT8 switchPos = 0u; + + UINT8 switchMoveState = 0u; + UINT8 reVal = CI_ERROR; + UINT8 checkResult = 0u; + + UINT8 checkSum = 0U; + AxisSwitchStruct* dataIdBuf = NULL; + + + checkSum = GetAxisSecRelateProSwSum(axisSecId); + dataIdBuf = GetAxisSecRelateProSwStru(axisSecId); + /*联锁检查*/ + if (NULL == dataIdBuf) + { + /*无检查项*/ + reVal = CI_ERROR; + } + else + { + reVal = CI_SUCCESS; + /*开始检查*/ + /* 进路内所有道岔位置正确 且不为【挤岔】 或位置不正确道岔可动作*/ + for (i = 0u; i < checkSum; i++) + { + devId = dataIdBuf[i].SwitchId; + devState = GetSwitchCurPosition(devId); + switchPos = dataIdBuf[i].SwitchPosition; + if (devState == switchPos) + { + /* 道岔位置正确 */ + /*如果最近一次产生的有效驱动仍在延续,则返回失败*/ + checkResult = checkSwtLastValDrvPosStayorNot(devId, switchPos); + if (CI_SUCCESS == checkResult) + { + } + else + { + reVal = CI_ERROR; + } + } + else if (SWITCH_POSITION_SIKAI == devState) + { + /*四开*/ + *pDevId = devId; + *pDevState = devState; + /* 记录故障码 */ + SetErrorData(funcId, CI_DEVICE_TYPE_SWITCH, devId, ETYPE_SWT_POSTION_STATE, devState, sendLevel); + reVal = CI_ERROR; + } + else if (SWITCH_POSITION_JICHA == devState) + { + /*挤岔*/ + *pDevId = devId; + *pDevState = devState; + /* 记录故障码 */ + SetErrorData(funcId, CI_DEVICE_TYPE_SWITCH, devId, ETYPE_SWT_POSTION_STATE, devState, sendLevel); + reVal = CI_ERROR; + } + else + { + /* 道岔位置不正确 */ + switchMoveState = GetSwitchMoveValidState(devId, SWITCH_OPER_NO_DANCAO, sendLevel); + if (CI_SUCCESS == switchMoveState) + { + /*道岔可动*/ + } + else + { + /*道岔位置不正确 且 道岔不可动作*/ + *pDevId = devId; + *pDevState = devState; + reVal = CI_ERROR; + } + } + if (CI_ERROR == reVal) + { + break; + } + } + } + + /*全部通过检查*/ + return reVal; +} /* * 功能描述: 计轴区段内所有道岔位置正确检查 * 参数说明: UINT16 const axisSecId, 计轴区段编号 @@ -15836,6 +16083,63 @@ UINT8 AxisSecAllSwitchPosCheck(UINT16 const axisSecId,UINT16 *pDevId,UINT8 *pDev return reVal; } /* +* 功能描述: 计轴区段所有防护道岔位置正确检查 +* 参数说明: UINT16 const axisSecId, 计轴区段编号 +* UINT16 *pDevId, 设备Id(返回) +* UINT8 *pDevState, 设备状态(返回) +* 返回值 : CI_ERROR +* CI_SUCCESS +* add mpt 20260331 +*/ +UINT8 AxisSecAllProtSwitchPosCheck(UINT16 const axisSecId, UINT16* pDevId, UINT8* pDevState) +{ + /* 计轴区段道岔 */ + UINT8 checkSum = 0u; + AxisSwitchStruct* dataIdBuf =NULL; + + /* 局部变量定义初始化 */ + UINT16 i = 0u; /* 循环变量 */ + UINT16 devId = 0u; + UINT8 devState = 0u; + UINT8 reVal = CI_ERROR; + + checkSum = GetAxisSecRelateProSwSum(axisSecId); + dataIdBuf = GetAxisSecRelateProSwStru(axisSecId); + + /* 检查封锁状态 */ + if (NULL == dataIdBuf) + { + /*无检查项*/ + reVal = CI_ERROR; + } + else + { + reVal = CI_SUCCESS; + /*开始检查*/ + for (i = 0u; i < checkSum; i++) + { + devId = dataIdBuf[i].SwitchId; + devState = GetSwitchCurPosition(devId); + if (devState == dataIdBuf[i].SwitchPosition) + { + /*道岔位置正确*/ + + } + else + { + /*道岔位置不正确*/ + *pDevId = devId; + *pDevState = devState; + reVal = CI_ERROR; + break; + } + } + } + + /*全部通过检查*/ + return reVal; +} +/* * 功能描述: 指定进路信号机外方第一物理区段道岔位置检查 * 参数说明: UINT16 const routeId, 进路编号 * 返回值 : CI_ERROR @@ -18413,7 +18717,7 @@ UINT8 RouteCbtcFirstLgcSecCheck(UINT16 const routeId, UINT16 *pDevId, UINT8 *pDe } else if (1U == chReadyEnterRouteTrainSum) { - chTrainEnterState = dsuTrainMinHeadCrossSignal(wszReadyEtRouteTrainId[0], routeId); + chTrainEnterState = dsuTrainMinHeadCrossSignal(wszReadyEtRouteTrainId[0], routeId, CI_ERROR); if ((TRAIN_ENTER_ROUTE_FULL == chTrainEnterState) || (TRAIN_ENTER_ROUTE_TAIL == chTrainEnterState)) { /*列车完全驶入进路/短车高速车头驶出进路车尾还在进路,关灯 by cgh 20250102*/ @@ -18596,7 +18900,7 @@ UINT8 RouteCbtcReturnFirstLgcSecCheck(UINT16 const routeId, UINT16 *pDevId, UINT /*跨压之后关信号*/ if ((CI_SUCCESS == chRetVal)&&(0u != wCrossTrainId)) { - chTrainEnterState = dsuTrainMinHeadCrossSignal(wCrossTrainId, routeId); + chTrainEnterState = dsuTrainMinHeadCrossSignal(wCrossTrainId, routeId, CI_ERROR); if ((TRAIN_ENTER_ROUTE_FULL == chTrainEnterState) || (TRAIN_ENTER_ROUTE_TAIL == chTrainEnterState)) { @@ -19467,7 +19771,7 @@ UINT8 RouteCbtcTiranEnterCheck(UINT16 const routeId) { wInFirstSecId = GetRouteInFirstLogSecId(routeId); chLogSecCurOccupySta = GetLogSecCurOccupyState(wInFirstSecId); - chTrainEnterState = dsuTrainMinHeadCrossSignal(wCrossTrainId, routeId); + chTrainEnterState = dsuTrainMinHeadCrossSignal(wCrossTrainId, routeId, CI_ERROR); wStartSignalId = GetRouteStartSignalId(routeId); wOutFirstPhySecId = GetSignalOutFirstPhySecId(wStartSignalId); @@ -19984,6 +20288,7 @@ UINT8 KeepCBTCRouteOtherSignalCheck(UINT16 routeId,UINT8 functionId,UINT8 sendLe UINT16* pNeedCloseBuf = NULL; UINT8 zheFanRouteSum = 0U; UINT16 * zheFanRouteIdBuf = NULL; + UINT16 const startSignalId = GetRouteStartSignalId(routeId);/*始端信号机*/ /* 进路内设备数据 */ /*进路相关需开放信号机*/ @@ -20077,7 +20382,8 @@ UINT8 KeepCBTCRouteOtherSignalCheck(UINT16 routeId,UINT8 functionId,UINT8 sendLe else { /* 记录故障码 */ - SetErrorData(functionId,CI_DEVICE_TYPE_ROUTE,devId,ETYPE_SIG_RETURN_OPENED_STATE,devState,sendLevel); + /*原报警ETYPE_SIG_RETURN_OPENED_STATE,出现因进路id顺序出现报警不一致*/ + SetErrorData(functionId, CI_DEVICE_TYPE_SIGNAL, startSignalId, ETYPE_SIG_START_OPEN_STATE, SIGNAL_CLOSE, sendLevel); reResult = CI_ERROR; } } @@ -26888,7 +27194,6 @@ UINT8 KeepCouplinkRouteSecOccCheck(const UINT16 wRouteId, UINT16* pDevId, UINT8* UINT16* pDataIdBuf = NULL; UINT16 i = 0U; UINT8 chLogOccState = 0U; - UINT16 wLastLogId = 0U; if ((NULL != pDevId) && (NULL != pDevState)) { @@ -27947,3 +28252,564 @@ UINT8 AllAutoReturnRCouplinkCheck(const UINT16 wAutoRouteId, const UINT8 chFunct return chReval; } + + +/* +* 功能描述: 区段征用、区段防护道岔区段征用、区段内道岔道岔征用检查、区段内防护道岔道岔征用 +* 参数说明:const UINT16 axisSecId 计轴区段ID +* 返回值 : CI_ERROR +* CI_SUCCESS +* add by mpt 20260331 +*/ +UINT8 JumpPhySectionUseCheck(const UINT16 axisSecId) +{ + /* 局部变量定义初始化 */ + UINT8 reResult = CI_ERROR; /*返回值*/ + UINT8 phyUseState = 0u;/*物理区段征用检查*/ + UINT8 phyId = 0u; + + + + /*跳跃锁闭所属物理区段*/ + phyId = GetAxisSecRelativePhySecId(axisSecId);/*获取相关物理区段ID*/ + phyUseState = GetPhySecUseState(phyId);/*获取物理区段征用状态*/ + if (PHYSICAL_SECTION_USING_NO == phyUseState) + { + reResult = CI_SUCCESS; + } + else + { + /*无处理*/ + } + + /*检查计轴区段的防护道岔所在区段的征用*/ + if (CI_SUCCESS == reResult) + { + reResult = JumpPhySectionPortectUseCheck(axisSecId); + } + + + /*检查计轴区段的道岔征用*/ + if (CI_SUCCESS == reResult) + { + reResult = JumpPhySectionSwitchUseCheck(axisSecId); + } + + /*检查计轴区段的防护道岔道岔征用*/ + if (CI_SUCCESS == reResult) + { + reResult = JumpPhySectionSwitchUseCheck(axisSecId); + } + + + + return reResult; +} + +/* +* 功能描述:区段防护道岔区段、防护道岔征用检查 +* 参数说明:const UINT16 axisSecId 计轴区段ID +* 返回值 : CI_ERROR +* CI_SUCCESS +* add by mpt 20260331 +*/ +UINT8 JumpPhySectionPortectUseCheck(const UINT16 axisSecId) +{ + UINT16* pLogSectionIdBuf = NULL; + UINT8 chLogSectionSum = 0U; + UINT8 ii = 0U; + UINT8 chRetVal = CI_ERROR; + + pLogSectionIdBuf = GetAxisSecLogSectionIdBuf(axisSecId); + chLogSectionSum = GetAxisSecLogSectionSum(axisSecId); + + if (NULL != pLogSectionIdBuf) + { + for (ii = 0U; ii < chLogSectionSum; ii++) + { + /*检查逻辑区段防护道岔区段、道岔的征用*/ + chRetVal = JumpLogicSecPortectUseCheck(pLogSectionIdBuf[ii]); + if (CI_SUCCESS != chRetVal) + { + break; + } + } + } + return chRetVal; +} + +/* +* 功能描述:逻辑区段防护道岔区段征用、道岔征用检查 +* 参数说明:const UINT16 axisSecId 计轴区段ID +* 返回值 : CI_ERROR +* CI_SUCCESS +* add by mpt 20260331 +*/ +UINT8 JumpLogicSecPortectUseCheck(const UINT16 wLgcId) +{ + /* 局部变量定义初始化 */ + UINT8 chRetVal = CI_ERROR; + UINT8 ii = 0U; + UINT16 chDevId = 0U; + UINT8 chCheckSum = 0U; + LogsecSwitchStruct* pstLogicSecSwitchBuf = NULL; + UINT16 phyId = 0U; + UINT8 phyUseState = 0U; + UINT8 cSwitchUsingState = 0U; + + chCheckSum = GetLgcRelateProSwSum(wLgcId);/*获取指定ID逻辑区段关联防护道岔数目*/ + pstLogicSecSwitchBuf = GetLgcRelateProSwStru(wLgcId); + if ((NULL != pstLogicSecSwitchBuf) + && (LOGSEC_RELATE_PRO_SW_SUM_MAX > chCheckSum)) + { + chRetVal = CI_SUCCESS; + /*遍历逻辑区段关联防护道岔*/ + for (ii = 0U; ii < chCheckSum; ii++) + { + + chDevId = pstLogicSecSwitchBuf[ii].SwitchId; + cSwitchUsingState = GetSwitchUsingState(chDevId); + phyId = GetSwitchPhySectionId(chDevId); + phyUseState = GetPhySecUseState(phyId); + if((PHYSICAL_SECTION_USING_NO != phyUseState)||(SWITCH_USING_NO !=cSwitchUsingState)) + {/**/ + chRetVal = CI_ERROR; + break; + } + else + { + /*无处理*/ + } + } + } + else + { + chRetVal = CI_ERROR; + } + + return chRetVal; +} + +/* +* 功能描述:计轴区段所在道岔道岔征用检查 +* 参数说明:const UINT16 axisSecId 计轴区段ID +* 返回值 : CI_ERROR +* CI_SUCCESS +* add by mpt 20260331 +*/ +UINT8 JumpPhySectionSwitchUseCheck(const UINT16 axisSecId) +{ + UINT8 retVal = CI_ERROR; + + UINT8 checkSum = GetAxisSwitchSum(axisSecId); + AxisSwitchStruct* dataIdBuf = GetAxisSwitchIdStru(axisSecId); + + /* 局部变量定义初始化 */ + UINT8 i = 0u; /* 循环变量 */ + UINT16 SwitchId = 0u; + UINT8 cSwitchUsingState = 0U; + + + if (NULL == dataIdBuf) + { + /*无检查项*/ + retVal = CI_ERROR; + } + else + { + retVal = CI_SUCCESS; + /*开始检查计轴区段内道岔*/ + for (i = 0u; i < checkSum; i++) + { + SwitchId = dataIdBuf[i].SwitchId; + cSwitchUsingState = GetSwitchUsingState(SwitchId); + if (SWITCH_USING_NO != cSwitchUsingState) + { + retVal = CI_ERROR; + break; + } + else + { + /*继续循环*/ + } + + } + } + + return retVal; +} + +/* +* 功能描述:设置跳跃锁闭防护道岔区段征用状态 +* 参数说明:const UINT16 axisSecId 计轴区段ID +* const UINT8 state 状态 +* 返回值 : void +* add by mpt 20260331 +*/ +void SetJumpPhySectionPortectSecUse(const UINT16 axisSecId,const UINT8 state) +{ + UINT16* pLogSectionIdBuf = NULL; + UINT8 chLogSectionSum = 0U; + UINT8 ii = 0U; + UINT8 chRetVal = CI_ERROR; + + pLogSectionIdBuf = GetAxisSecLogSectionIdBuf(axisSecId); + chLogSectionSum = GetAxisSecLogSectionSum(axisSecId); + + if (NULL != pLogSectionIdBuf) + { + for (ii = 0U; ii < chLogSectionSum; ii++) + { + /*设置逻辑区段防护道岔区段征用*/ + SetJumpLogicSecPortectUse(pLogSectionIdBuf[ii], state); + } + } +} + +/* +* 功能描述:设置逻辑区段的防护道岔区段征用 +* 参数说明:const UINT16 axisSecId 计轴区段ID +* const UINT8 state 状态 +* 返回值 : void +* add by mpt 20260331 +*/ +void SetJumpLogicSecPortectUse(const UINT16 wLgcId,const UINT8 state) +{ + /* 局部变量定义初始化 */ + UINT8 chRetVal = CI_ERROR; + UINT8 ii = 0U; + UINT16 chDevId = 0U; + UINT8 chCheckSum = 0U; + LogsecSwitchStruct* pstLogicSecSwitchBuf = NULL; + UINT16 phyId = 0U; + UINT8 phyUseState = 0U; + + chCheckSum = GetLgcRelateProSwSum(wLgcId);/*获取指定ID逻辑区段关联防护道岔数目*/ + pstLogicSecSwitchBuf = GetLgcRelateProSwStru(wLgcId); + if ((NULL != pstLogicSecSwitchBuf) + && (LOGSEC_RELATE_PRO_SW_SUM_MAX > chCheckSum)) + { + chRetVal = CI_SUCCESS; + /*遍历逻辑区段关联防护道岔*/ + for (ii = 0U; ii < chCheckSum; ii++) + { + chDevId = pstLogicSecSwitchBuf[ii].SwitchId; + phyId = GetSwitchPhySectionId(chDevId); + /*设置物理区段征用*/ + SetPhySecUseState(phyId, state, 0U); + } + } + else + { + chRetVal = CI_ERROR; + } +} +/* +* 功能描述: 计轴区段防护道岔封锁状态检查 +* 参数说明: UINT16 const axisSecId, 计轴区段编号 +* UINT16 *pDevId, 设备Id(返回) +* UINT8 *pDevState, 设备状态(返回) +* 返回值 : CI_ERROR +* CI_SUCCESS +* Add by mpt 20260331 +*/ +UINT8 AxisSecProtSwitchFLockCheck(UINT16 const axisSecId, UINT16* pDevId, UINT8* pDevState) +{ + /* 进路道岔 */ + UINT8 checkSum =0u; + AxisSwitchStruct* dataIdBuf = NULL; + + /* 局部变量定义初始化 */ + UINT16 i = 0u; /* 循环变量 */ + UINT16 devId = 0u; + UINT8 devState = 0u; + UINT8 reVal = CI_ERROR; + + + checkSum = GetAxisSecRelateProSwSum(axisSecId); + dataIdBuf = GetAxisSecRelateProSwStru(axisSecId); + /* 检查封锁状态 */ + if (NULL == dataIdBuf) + { + /*无检查项*/ + reVal = CI_ERROR; + } + else + { + reVal = CI_SUCCESS; + /*开始检查*/ + for (i = 0u; i < checkSum; i++) + { + devId = dataIdBuf[i].SwitchId; + devState = GetSwitchFLockState(devId); + if (SWITCH_LOCK_FENGSUO_NO == devState) + { + /* 通过检查*/ + + } + else + { + /*状态不一致返回故障状态*/ + *pDevId = devId; + *pDevState = devState; + reVal = CI_ERROR; + break; + } + } + } + + /*全部通过检查*/ + return reVal; +} + +/* +* 功能描述: 设置计轴区段关联防护道岔防护锁闭状态 +* 参数说明: const UINT16 axisSecId, 计轴区段ID +* const UINT8 lockCommand, 锁闭状态 +* 返回值 : void +* add by mpt 20260331 +*/ +void SetAxisRelProSwitchLockSta(const UINT16 axisSecId, const UINT8 lockCommand) +{ + UINT8 ii = 0u; /*遍历变量*/ + UINT8 retVal = CI_ERROR; /*返回值*/ + UINT16 protectSwitchId = 0u; /*防护道岔ID*/ + UINT8 cSwitchCurPos = 0U; /*道岔当前位置*/ + UINT8 cFuncRet = CI_ERROR; + + UINT8 checkSum = 0u; + AxisSwitchStruct* dataIdBuf = NULL; + + + checkSum = GetAxisSecRelateProSwSum(axisSecId); + dataIdBuf = GetAxisSecRelateProSwStru(axisSecId); + + if (NULL == dataIdBuf) + { + retVal = CI_ERROR; + } + else + { + retVal = CI_SUCCESS; + } + + if (CI_SUCCESS == retVal) + { + if ((SWITCH_LOCK_PROTECT_SET != lockCommand) && (SWITCH_LOCK_PROTECT_CANCEL != lockCommand)) + { + retVal = CI_ERROR; + } + else + { + } + } + + if (CI_SUCCESS == retVal) + { + for (ii = 0u; ii < checkSum; ii++) + { + protectSwitchId = dataIdBuf[ii].SwitchId; + cSwitchCurPos = GetSwitchCurPosition(protectSwitchId); + 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); /*设置道岔防护锁闭状态*/ + + } + else + { + /*防护道岔不在防护位置或防护道岔存在反向驱动,不设置防护锁闭*/ + } + } + } + else + { + retVal = CI_ERROR; + } +} + +/* +* 功能描述: 计轴区段关联防护道岔防护锁闭检查 +* 参数说明: UINT16 const routeId, 计轴区段号 +* UINT16 *pDevId, 设备Id(返回) +* UINT8 *pDevState, 设备状态(返回) +* 返回值 : CI_ERROR +* CI_SUCCESS +* add mpt 20260331 +*/ +UINT8 AxisRelatedProSwitchLockCheck(UINT16 const axisSecId, UINT16* pDevId, UINT8* pDevState) +{ + + /* 局部变量定义初始化 */ + UINT16 i = 0u; /* 循环变量 */ + UINT16 devId = 0u; + UINT8 devState = 0u; + UINT8 reVal = CI_ERROR; + UINT8 checkSum = 0u; + AxisSwitchStruct* dataIdBuf = NULL; + + + checkSum = GetAxisSecRelateProSwSum(axisSecId); + dataIdBuf = GetAxisSecRelateProSwStru(axisSecId); + + if (NULL == dataIdBuf) + { + reVal = CI_ERROR; + } + else + { + reVal = CI_SUCCESS; + } + + if (CI_SUCCESS == reVal) + { + /*开始检查*/ + for (i = 0u; i < checkSum; i++) + { + devId = dataIdBuf[i].SwitchId; + devState = GetSwitchLockStatus(devId); + if ((SWITCH_LOCK_STATUS_PROTECT == devState) || (SWITCH_LOCK_STATUS_DAP == devState)) + { + /*道岔已【防护锁闭】或【单锁且防护锁闭】*/ + } + else + { + /*道岔未【防护锁闭】且未【单锁且防护锁闭】*/ + *pDevId = devId; + *pDevState = SWITCH_LOCK_STATUS_PROTECT_NO; + reVal = CI_ERROR; + break; + } + } + } + /*全部通过检查*/ + 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; +} + +/* +* 功能描述: 设置逻辑区段关联防护道岔防护锁闭状态 +* 参数说明: const UINT16 axisSecId, 计轴区段ID +* const UINT8 lockCommand, 锁闭状态 +* 返回值 : void +* add by mpt 20260331 +*/ +void SetLogSecRelProSwitchLockSta(const UINT16 wLgcId, const UINT8 lockCommand) +{ + UINT8 ii = 0u; /*遍历变量*/ + UINT8 retVal = CI_ERROR; /*返回值*/ + UINT16 protectSwitchId = 0u; /*防护道岔ID*/ + UINT8 cSwitchCurPos = 0U; /*道岔当前位置*/ + UINT8 cFuncRet = CI_ERROR; + + UINT8 checkSum = 0u; + LogsecSwitchStruct* dataIdBuf = NULL; + UINT16* pLgcSecRltvAxleSecIdBuf = NULL; + + + checkSum = GetLgcRelateProSwSum(wLgcId);/*获取指定ID逻辑区段关联防护道岔数目*/ + dataIdBuf = GetLgcRelateProSwStru(wLgcId); + pLgcSecRltvAxleSecIdBuf = GetLgcSecRltvAxleSecIdBuf(wLgcId); + + + if ((NULL == dataIdBuf)||(NULL == pLgcSecRltvAxleSecIdBuf)) + { + retVal = CI_ERROR; + } + else + { + retVal = CI_SUCCESS; + } + + if (CI_SUCCESS == retVal) + { + if ((SWITCH_LOCK_PROTECT_SET != lockCommand) && (SWITCH_LOCK_PROTECT_CANCEL != lockCommand)) + { + retVal = CI_ERROR; + } + else + { + } + } + + if (CI_SUCCESS == retVal) + { + for (ii = 0u; ii < checkSum; ii++) + { + protectSwitchId = dataIdBuf[ii].SwitchId; + cSwitchCurPos = GetSwitchCurPosition(protectSwitchId); + cFuncRet = checkSwtLastValDrvPosStayorNot(protectSwitchId, dataIdBuf[ii].SwitchPosition); + if ((SWITCH_LOCK_PROTECT_CANCEL == lockCommand) + || ((cSwitchCurPos == dataIdBuf[ii].SwitchPosition) && (CI_SUCCESS == cFuncRet))) + { + + SetSwitchLockStatus(SWITCH_PLOCKTYPE_AXISSEC, pLgcSecRltvAxleSecIdBuf[0], protectSwitchId, lockCommand); /*设置道岔防护锁闭状态*/ + + } + else + { + /*防护道岔不在防护位置或防护道岔存在反向驱动,不设置防护锁闭*/ + } + } + } + else + { + retVal = CI_ERROR; + } +} \ No newline at end of file diff --git a/TSCP/src/APP/ciapp/LogicProcess/InterlockLogicCheck.h b/TSCP/src/APP/ciapp/LogicProcess/InterlockLogicCheck.h index 00248c7..49f4527 100644 --- a/TSCP/src/APP/ciapp/LogicProcess/InterlockLogicCheck.h +++ b/TSCP/src/APP/ciapp/LogicProcess/InterlockLogicCheck.h @@ -2919,7 +2919,128 @@ UINT8 AutoReturnRouteCouplinkCheck(const UINT16 wAutoRouteId, const UINT8 chFunc * by lyj 20250929 */ UINT8 AllAutoReturnRCouplinkCheck(const UINT16 wAutoRouteId, const UINT8 chFunctionId); - - +/* +* 功能描述: 区段征用、区段防护道岔区段征用、区段内道岔道岔征用检查、区段内防护道岔道岔征用 +* 参数说明:const UINT16 axisSecId 计轴区段ID +* 返回值 : CI_ERROR +* CI_SUCCESS +* add by mpt 20260331 +*/ +UINT8 JumpPhySectionUseCheck(const UINT16 axisSecId); +/* +* 功能描述:区段防护道岔区段、防护道岔征用检查 +* 参数说明:const UINT16 axisSecId 计轴区段ID +* 返回值 : CI_ERROR +* CI_SUCCESS +* add by mpt 20260331 +*/ +UINT8 JumpPhySectionPortectUseCheck(const UINT16 axisSecId); +/* +* 功能描述:逻辑区段防护道岔区段征用、道岔征用检查 +* 参数说明:const UINT16 axisSecId 计轴区段ID +* 返回值 : CI_ERROR +* CI_SUCCESS +* add by mpt 20260331 +*/ +UINT8 JumpLogicSecPortectUseCheck(const UINT16 wLgcId); +/* +* 功能描述:计轴区段所在道岔道岔征用检查 +* 参数说明:const UINT16 axisSecId 计轴区段ID +* 返回值 : CI_ERROR +* CI_SUCCESS +* add by mpt 20260331 +*/ +UINT8 JumpPhySectionSwitchUseCheck(const UINT16 axisSecId); +/* +* 功能描述:设置跳跃锁闭防护道岔区段征用状态 +* 参数说明:const UINT16 axisSecId 计轴区段ID +* const UINT8 state 状态 +* 返回值 : void +* add by mpt 20260331 +*/ +void SetJumpPhySectionPortectSecUse(const UINT16 axisSecId, const UINT8 state); +/* +* 功能描述:设置逻辑区段的防护道岔区段征用 +* 参数说明:const UINT16 axisSecId 计轴区段ID +* const UINT8 state 状态 +* 返回值 : void +* add by mpt 20260331 +*/ +void SetJumpLogicSecPortectUse(const UINT16 wLgcId, const UINT8 state); +/* +* 功能描述: 检查计轴区段跳跃锁闭是否有防护道岔驱动超时 +* 参数说明: const UINT16 routeId, 进路ID +* 返回值 : UINT8 + CI_SUCCESS:计轴区段防护道岔无道岔驱动超时 + CI_ERROR:计轴区段防护道岔驱动超时 +add by mpt 20260331 +*/ +UINT8 ChekJumpLockProtectSwitDrivOvtmStat(const UINT16 axisSecId); +/* +* 功能描述: 计轴区段道岔封锁状态检查 +* 参数说明: UINT16 const axisSecId, 计轴区段编号 +* UINT16 *pDevId, 设备Id(返回) +* UINT8 *pDevState, 设备状态(返回) +* 返回值 : CI_ERROR +* CI_SUCCESS +* Add by mpt 20260331 +*/ +UINT8 AxisSecProtSwitchFLockCheck(UINT16 const axisSecId, UINT16* pDevId, UINT8* pDevState); +/* +* 功能描述: 计轴区段的防护道岔位置和动作有效性检查 +* 参数说明: UINT16 const axisSecId, 计轴区段编号 +* UINT16 *pDevId, 设备Id(返回) +* UINT8 *pDevState, 设备状态(返回) +* 返回值 : CI_ERROR +* CI_SUCCESS +* add by mpt 20260331 +*/ +UINT8 AxisSecPorteSwitchPosMoveCheck(UINT16 const axisSecId, UINT16* pDevId, UINT8* pDevState, UINT8 funcId, UINT8 sendLevel); +/* +* 功能描述: 计轴区段所有防护道岔位置正确检查 +* 参数说明: UINT16 const axisSecId, 计轴区段编号 +* UINT16 *pDevId, 设备Id(返回) +* UINT8 *pDevState, 设备状态(返回) +* 返回值 : CI_ERROR +* CI_SUCCESS +* add mpt 20260331 +*/ +UINT8 AxisSecAllProtSwitchPosCheck(UINT16 const axisSecId, UINT16* pDevId, UINT8* pDevState); +/* +* 功能描述: 设置计轴区段关联防护道岔防护锁闭状态 +* 参数说明: const UINT16 axisSecId, 计轴区段ID +* const UINT8 lockCommand, 锁闭状态 +* 返回值 : void +* add by mpt 20260331 +*/ +void SetAxisRelProSwitchLockSta(const UINT16 axisSecId, const UINT8 lockCommand); +/* +* 功能描述: 计轴区段关联防护道岔防护锁闭检查 +* 参数说明: UINT16 const routeId, 计轴区段号 +* UINT16 *pDevId, 设备Id(返回) +* UINT8 *pDevState, 设备状态(返回) +* 返回值 : CI_ERROR +* CI_SUCCESS +* add mpt 20260331 +*/ +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); #endif diff --git a/TSCP/src/APP/ciapp/LogicProcess/InterlockLogicProcess.c b/TSCP/src/APP/ciapp/LogicProcess/InterlockLogicProcess.c index 2a146ab..8ce766f 100644 --- a/TSCP/src/APP/ciapp/LogicProcess/InterlockLogicProcess.c +++ b/TSCP/src/APP/ciapp/LogicProcess/InterlockLogicProcess.c @@ -9604,11 +9604,13 @@ UINT8 OpenBlocRouteSectionCheck(UINT16 routeId,UINT8 functionId,UINT8 sendLevel) UINT8 chDsnFuncSwitch = 0U; /* 无直轨计轴占用功能开关 */ UINT8 chXianSuFuncSwitch = 0U; /*后备模式信号开放是否检查区段临时限速开关*/ UINT8 cCrossState = 0U; /*信号机跨压状态*/ + UINT8 chRouteBelongVirCiId = 0U; chDsnFuncSwitch = GetCiFunctionSwitchConfig(FUNC_TOA_SWITCH); chXianSuFuncSwitch = GetCiFunctionSwitchConfig(FUNC_XIANSU_SWITCH); - ciType = GetCiType(LocalCiId); + chRouteBelongVirCiId = GetRouteBelongVirCiId(routeId); + ciType = GetLocalVirCiType(chRouteBelongVirCiId); /* 联锁逻辑检查 */ /* 进路内所有区段未被封锁 */ @@ -9635,6 +9637,8 @@ UINT8 OpenBlocRouteSectionCheck(UINT16 routeId,UINT8 functionId,UINT8 sendLevel) devState = 0u; startSignalId = GetRouteStartSignalId(routeId);/*获取进路始端信号机ID*/ checkResult = RouteAllSecOccuClearCheck(routeId,&devId, &cPhySecCurMergeState); + + routeState = GetRouteState(routeId); if ((CI_TYPE_CLD == ciType) && ((ROUTE_STATE_YUXIAN_OPEN == routeState) ||(ROUTE_STATE_NEAR_OPEN == routeState))) {/*车辆段进路预先开放或接近开放*/ @@ -9873,8 +9877,6 @@ UINT8 CLDKeepOpenSecCheck(UINT16 routeId, UINT8 functionId, UINT8 sendLevel) { /*进路内区段,有UT占用,信号保持失败*/ /*进路内区段,有CT,且第一逻辑区段和外方第一物理区段最后一个逻辑区段CT占用,信号保持成功,其它失败*/ - hasUtFlag = 0u; - hasCtFlag = 0u; for (ii = 0u; ii < routePhyNum; ii++) { phyId = pRoutePhySecData[ii].PhysicalSectionId; @@ -9916,7 +9918,7 @@ UINT8 CLDKeepOpenSecCheck(UINT16 routeId, UINT8 functionId, UINT8 sendLevel) chFunRet = GetRouteInOutFstLgcTrainInfo(routeId, &chReadyEnterRouteTrainSum, wszReadyEtRouteTrainId); if (CI_SUCCESS == chFunRet) { - chTrainEnterState = dsuTrainMinHeadCrossSignal(wszReadyEtRouteTrainId[0], routeId); + chTrainEnterState = dsuTrainMinHeadCrossSignal(wszReadyEtRouteTrainId[0], routeId, CI_ERROR); if (TRAIN_ENTER_ROUTE_FULL == chTrainEnterState) { /*列车完全驶入进路,关灯 by cgh 20231128*/ @@ -10038,6 +10040,7 @@ UINT8 OpenCbtcRouteSectionCheck(UINT16 routeId,UINT8 functionId,UINT8 sendLevel) UINT16 startSignalId = 0u; UINT8 signalCrossState = 0u; UINT8 chRouteCouplinkFlag = 0U; + UINT8 chRouteBelongVirCiId = 0U; /* 联锁逻辑检查 */ /* 进路内所有区段未被封锁 */ @@ -10060,7 +10063,8 @@ UINT8 OpenCbtcRouteSectionCheck(UINT16 routeId,UINT8 functionId,UINT8 sendLevel) /*CBTC进路内方第一逻辑区段条件检查,车辆段进路需内方区段空闲*/ if (CI_SUCCESS == reResult) { - cLocalCiType = GetLocalCiType(); + chRouteBelongVirCiId = GetRouteBelongVirCiId(routeId); + cLocalCiType = GetLocalVirCiType(chRouteBelongVirCiId); if (CI_TYPE_CLD != cLocalCiType) { /*非车辆段,按CBTC既有逻辑处理*/ @@ -10138,6 +10142,8 @@ UINT8 OpenCbtcRouteSectionCheck(UINT16 routeId,UINT8 functionId,UINT8 sendLevel) } else { + devId = GetRouteInFirstLogSecId(routeId); + devState = GetLogSecCurOccupyState(devId); reResult = CheckEngineerVehicleNear(routeId);/*检查是否是工程车接近的跨压*/ if (CI_SUCCESS == reResult) { @@ -10384,6 +10390,7 @@ UINT8 KeepCbtcRouteSectionCheck(UINT16 routeId,UINT8 functionId,UINT8 sendLevel) UINT8 outPhySecState = 0U; UINT8 cLocalCiType = 0U; /*本控区类型*/ UINT8 chRouteCouplinkFlag = 0U; + UINT8 chRouteBelongVirCiId = 0U; /* 联锁逻辑检查 */ /* 进路内所有区段未被封锁 */ @@ -10406,7 +10413,8 @@ UINT8 KeepCbtcRouteSectionCheck(UINT16 routeId,UINT8 functionId,UINT8 sendLevel) /*CBTC进路内方第一逻辑区段条件检查*/ if(CI_SUCCESS == reResult) { - cLocalCiType = GetLocalCiType(); + chRouteBelongVirCiId = GetRouteBelongVirCiId(routeId); + cLocalCiType = GetLocalVirCiType(chRouteBelongVirCiId); if (CI_TYPE_CLD != cLocalCiType) { /*非车辆段,按CBTC既有逻辑处理*/ @@ -10443,7 +10451,12 @@ UINT8 KeepCbtcRouteSectionCheck(UINT16 routeId,UINT8 functionId,UINT8 sendLevel) if (ROUTE_COUPLINK_FLAG_YES == chRouteCouplinkFlag) { reResult = KeepCouplinkRouteSecOccCheck(routeId,&devId,&devState); - if (CI_ERROR == reResult) + if (CI_SUCCESS == reResult) + { + /* 通过检查 */ + reResult = CI_SUCCESS; + } + else { /* 记录故障码 */ SetErrorData(functionId, CI_DEVICE_TYPE_PHYSEC, devId, SECTION_OCCUPY_YES, devState, sendLevel); @@ -10492,6 +10505,8 @@ UINT8 KeepCbtcRouteSectionCheck(UINT16 routeId,UINT8 functionId,UINT8 sendLevel) } else { + devId = GetRouteInFirstLogSecId(routeId); + devState = GetLogSecCurOccupyState(devId); reResult = CheckEngineerVehicleNear(routeId);/*检查是否是工程车接近的跨压以及列车的真实跨压*/ if (CI_SUCCESS == reResult) { @@ -11577,6 +11592,7 @@ void RouteLgcSecResReleaseProcess(const UINT16 wRouteId) wUnlockLgcSecId = routeLogIdBuf[ii]; wBelongRouteId = GetLogSecLockBelongRoute(wUnlockLgcSecId); wLgcBufIndex = GetlogSectionBufIndex(wUnlockLgcSecId); + chLgcResTrainSum = GetLogSecTrainInfoSum(wUnlockLgcSecId); chLogSecLogLockState = GetLogSecLogLockState(wUnlockLgcSecId); @@ -11594,7 +11610,6 @@ void RouteLgcSecResReleaseProcess(const UINT16 wRouteId) /*锁闭所属进路等于本进路或逻辑区段已解锁*/ if (wBelongRouteId == wRouteId) { - chLgcResTrainSum = GetLogSecTrainInfoSum(wUnlockLgcSecId); if (LOGIC_SECTION_RES_SUM_MAX > chLgcResTrainSum) { ; /*继续执行*/ diff --git a/TSCP/src/APP/ciapp/LogicProcess/TradInterlockLogicProcess.c b/TSCP/src/APP/ciapp/LogicProcess/TradInterlockLogicProcess.c index 51796e2..ef08102 100644 --- a/TSCP/src/APP/ciapp/LogicProcess/TradInterlockLogicProcess.c +++ b/TSCP/src/APP/ciapp/LogicProcess/TradInterlockLogicProcess.c @@ -1598,12 +1598,14 @@ UINT8 SetNonRouteP(UINT8 nonRouteId) reResult = NonRouteRelProSwiPosMovValCheck(nonRouteId,functionId,sendLevel); } +#if 0 + /*修复缺陷YF0083-2105---LYJ--20260128*/ if (CI_SUCCESS == reResult) {/*侵限区段侵限条件不满足检查*/ reResult = NonRouteIntruSecVainCheck(nonRouteId,functionId,sendLevel); } - +#endif return reResult; } @@ -1721,14 +1723,6 @@ UINT8 LockNonRouteP(UINT8 nonRouteId) reResult = NonRouteRelProSwiPosMovValCheck(nonRouteId,functionId,sendLevel); } - - if (CI_SUCCESS == reResult) - {/*侵限区段侵限条件不满足检查*/ - reResult = NonRouteIntruSecVainCheck(nonRouteId,functionId,sendLevel); - } - - - return reResult; } diff --git a/TSCP/src/APP/ciapp/Mask/MaskDefine.h b/TSCP/src/APP/ciapp/Mask/MaskDefine.h index 0506a00..b90bef2 100644 --- a/TSCP/src/APP/ciapp/Mask/MaskDefine.h +++ b/TSCP/src/APP/ciapp/Mask/MaskDefine.h @@ -118,6 +118,8 @@ #define MASK_TYPE_PHYSECTION_HEAD_XTD ((UINT8)0x31) /*定义物理区段运行方向下行状态码位*/ #define MASK_TYPE_PHYSECTION_HEAD_STD ((UINT8)0x32) /*定义物理区段运行方向上行状态码位*/ #define MASK_TYPE_LIECHE_STOPSTATE ((UINT8)0x3a) /*定义列车停稳信息状态码位*/ +#define MASK_TYPE_PHYSECTION_INTRUSION ((UINT8)0x5a) /*定义物理区段侵限状态码位(CI->ZC)*/ +#define MASK_TYPE_PHYSECTION_ATS_FLOCK ((UINT8)0x5b) /*定义物理区段由ATS封锁状态码位(CI->ZC)*/ #define MASK_TYPE_PHYSEC_CENTERDETAIN_UP ((UINT8)0x3d) /*定义物理区段CI-ATS中心上行扣车状态状态码位 (兼容28.0.0.14使用)*/ #define MASK_TYPE_PHYSEC_CENTERDETAIN_DOWN ((UINT8)0x3e) /*定义物理区段CI-ATS中心下行扣车状态状态码位 (兼容28.0.0.14使用)*/ #define MASK_TYPE_PHYSEC_STATIONDETAIN_UP ((UINT8)0x3f) /*定义物理区段CI-ATS车站上行扣车状态状态码位 (兼容28.0.0.14使用)*/ @@ -139,9 +141,10 @@ #define MASK_TYPE_DOWNWARD_DIRECTION ((UINT8)0x94) /*定义逻辑区段下行锁闭码位*/ #define MASK_TYPE_LOGICSECTION_PROTECTLOCK ((UINT8)0x99) /*定义逻辑区段防护锁闭码位*/ #define MASK_TYPE_LOGICSECTION_JUMPLOCK ((UINT8)0x9A) /*定义逻辑区段跳跃锁闭码位*/ -#define MASK_TYPE_LOGICSECTION_ARB ((UINT8)0x9B) /*定义逻辑区段ARB状态码位*/ +#define MASK_TYPE_LOGSEC_CBTC_ARB ((UINT8)0x9B) /*定义逻辑区段CBTC_ARB状态码位*/ #define MASK_TYPE_LOGICSECTION_SPKS_FLOCK ((UINT8)0x9C) /*定义逻辑区段SPKS封锁状态码位*/ #define MASK_TYPE_LOGICSECTION_EMERG_XIANSU ((UINT8)0x9D) /*定义逻辑区段紧急临时限速码位*/ +#define MASK_TYPE_LOGSEC_PB_TACS_ARB ((UINT8)0xB3) /*定义逻辑区段PB_TACS_ARB状态码位*/ /*保护区段相关码位*/ @@ -204,7 +207,7 @@ #define MASK_TYPE_PSD_PDB_FLASH_STATE ((UINT8)0xA0) /*定义清客确认箱PDB按钮指示灯闪灯状态码位*/ #define MASK_TYPE_PSD_VIDEO_QK_LU ((UINT8)0xA1) /*定义清客按钮箱视频清客表示灯(绿)状态码位*/ #define MASK_TYPE_PSD_VIDEO_QK_HONG ((UINT8)0xA2) /*定义清客按钮箱视频清客表示灯(红)状态码位*/ -#define MASK_TYPE_PSD_EXCEPT_OPEN ((UINT8)0xA5) /*定义站台安全门异常打开码位*/ +#define MASK_TYPE_PSD_EXCEPT ((UINT8)0xA5) /*定义站台安全门异常码位 CI-ATS、CI-ZC*/ #define MASK_TYPE_PSD_JXTCPANGLU_FAULT ((UINT8)0xAA) /*定义间隙探测旁路按钮故障码位*/ #define MASK_TYPE_PSD_IBP_STATE ((UINT8)0xAD) /*定义IBP盘按钮状态码位*/ #define MASK_TYPE_PSD_IBP_FAULT ((UINT8)0xAE) /*定义IBP盘按钮故障码位*/ diff --git a/TSCP/src/APP/ciapp/NonRoute/NonRouteConfigDataManage.c b/TSCP/src/APP/ciapp/NonRoute/NonRouteConfigDataManage.c index bfa3736..d9856f1 100644 --- a/TSCP/src/APP/ciapp/NonRoute/NonRouteConfigDataManage.c +++ b/TSCP/src/APP/ciapp/NonRoute/NonRouteConfigDataManage.c @@ -365,6 +365,24 @@ UINT16 GetSCXColAgreeTryRelayIdById(UINT8 nonRouteId) return collAgreeTryTrainRelayId; } +/* +* 功能描述: 获取试车线采集的轨旁试车指示器继电器ID +* 参数说明: UINT8 nonRouteId 非进路id +* 返回值 : 试车线采集的轨旁试车指示器继电器ID +*/ +UINT16 GetWaysideTryTrainIndRelayId(UINT8 nonRouteId) +{ + UINT16 collAgreeTryTrainRelayId = 0u; + + NonRouteConfigDataStruct* pNonRouteConfig = GetNonRouteConfigDataPtrById(nonRouteId); + if (pNonRouteConfig != NULL) + { + collAgreeTryTrainRelayId = pNonRouteConfig->ColWaysideTryTrainIndRelayId; /* 试车线采集的轨旁试车指示器继电器ID */ + } + + return collAgreeTryTrainRelayId; +} + /* * 功能描述:根据道岔id查找对应的非进路 * 参数说明:swId-道岔id diff --git a/TSCP/src/APP/ciapp/NonRoute/NonRouteConfigDataManage.h b/TSCP/src/APP/ciapp/NonRoute/NonRouteConfigDataManage.h index 5c784a3..3cbfbfe 100644 --- a/TSCP/src/APP/ciapp/NonRoute/NonRouteConfigDataManage.h +++ b/TSCP/src/APP/ciapp/NonRoute/NonRouteConfigDataManage.h @@ -82,6 +82,7 @@ typedef struct S_NonRouteConfigDataStruct UINT16 AgreeTryTrainRelayId; /*同意试车继电器ID (配置字段)*/ UINT16 DrvApplyTryTrainRelayId; /* 试车线驱动的申请试车继电器ID */ UINT16 ColAgreeTryTrainRelayId; /* 试车线采集的同意试车继电器ID */ + UINT16 ColWaysideTryTrainIndRelayId; /* 试车线采集的轨旁试车指示器继电器ID */ } NonRouteConfigDataStruct; /*******************************全局变量声明*******************************/ @@ -268,6 +269,14 @@ UINT8 GetnonRouteIdbelongVirCIid(UINT8 nonRouteId); */ UINT8 GetnonRouteIdbelongCIid(UINT8 nonRouteId); + +/* +* 功能描述: 获取试车线采集的轨旁试车指示器继电器ID +* 参数说明: UINT8 nonRouteId 非进路id +* 返回值 : 试车线采集的轨旁试车指示器继电器ID +*/ +UINT16 GetWaysideTryTrainIndRelayId(UINT8 nonRouteId); + #ifdef __cplusplus } #endif diff --git a/TSCP/src/APP/ciapp/NonRoute/NonRouteDefine.h b/TSCP/src/APP/ciapp/NonRoute/NonRouteDefine.h index 3c8e623..6bf5f45 100644 --- a/TSCP/src/APP/ciapp/NonRoute/NonRouteDefine.h +++ b/TSCP/src/APP/ciapp/NonRoute/NonRouteDefine.h @@ -28,7 +28,7 @@ /*非进路调车状态*/ -#define NONROUTE_STATE_INVALID ((UINT8)0x0) /*非进路状态无效*/ +#define NONROUTE_STATE_INVALID ((UINT8)0x0) /*非进路状态无效*/ #define NONROUTE_STATE_IDLE ((UINT8)0x01) /*非进路空闲*/ #define NONROUTE_STATE_XUANPAI ((UINT8)0x02) /*非进路选排*/ #define NONROUTE_STATE_LOCK ((UINT8)0x04) /*非进路锁闭*/ diff --git a/TSCP/src/APP/ciapp/Overlap/OverlapDataManage.c b/TSCP/src/APP/ciapp/Overlap/OverlapDataManage.c index 4f0b94d..656ff30 100644 --- a/TSCP/src/APP/ciapp/Overlap/OverlapDataManage.c +++ b/TSCP/src/APP/ciapp/Overlap/OverlapDataManage.c @@ -97,7 +97,7 @@ void SetOverlapRelateProtSwLockSta(const UINT16 overlapId, const UINT8 lockComma overlapProtectSwitchSum = GetOverlapRelatedProtSwitSum(overlapId); /*获取防护道岔数目*/ overlapProtectSwitchStru = GetOverlapRelatedProtSwitStru(overlapId); /*获取防护道岔数据*/ - if (0u == overlapProtectSwitchSum) + if ((0U == overlapProtectSwitchSum) || (NULL == overlapProtectSwitchStru)) { retVal = CI_ERROR; } diff --git a/TSCP/src/APP/ciapp/PSD/PSDDataManage.c b/TSCP/src/APP/ciapp/PSD/PSDDataManage.c index cc8ff8e..36eba83 100644 --- a/TSCP/src/APP/ciapp/PSD/PSDDataManage.c +++ b/TSCP/src/APP/ciapp/PSD/PSDDataManage.c @@ -1565,7 +1565,6 @@ UINT8 GetPsdPlFlag(const UINT16 doorId) void SetNearCiPscPlFlag(const UINT16 psdId,const UINT16 pscId,const UINT8 setFlag) { /*变量初始化*/ - UINT8 i = 0u; UINT8 transmitState = 0u; UINT8 localCiId = 0u; UINT8 psdCiId = 0u; @@ -2575,21 +2574,21 @@ UINT16 GePsdVideoQkRelateVobcId(const UINT16 wPsdId) } /* -* 功能描述:设置指定ID屏蔽门异常打开状态 +* 功能描述:设置指定ID屏蔽门异常状态 * 参数说明:const UINT16 wPsdId 屏蔽门ID -* const UINT8 cExceptOpenState 屏蔽门异常打开状态 +* const UINT8 cExceptOpenState 屏蔽门异常状态 * 返 回 值:无 * Created By LQ 2025.05.22 */ -void SetPsdExceptOpenState(const UINT16 wPsdId, const UINT8 cExceptOpenState) +void SetPsdExceptState(const UINT16 wPsdId, const UINT8 cExceptOpenState) { UINT16 bufIndex = 0U; - bufIndex = GetPsdConfigBufIndex(wPsdId); /*获取屏蔽门数组下标*/ + bufIndex = GetPsdConfigBufIndex(wPsdId); /*获取屏蔽门数组下标*/ - if ((PSD_SUM_MAX > bufIndex) && ((PSD_EXCEPT_OPEN_YES == cExceptOpenState) || (PSD_EXCEPT_OPEN_NO == cExceptOpenState))) + if ((PSD_SUM_MAX > bufIndex) && ((PSD_EXCEPT_YES == cExceptOpenState) || (PSD_EXCEPT_NO == cExceptOpenState))) { - PsdDataStru[bufIndex].cPsdExceptOpenState = cExceptOpenState; /*设置屏蔽门异常打开状态*/ + PsdDataStru[bufIndex].cPsdExceptOpenState = cExceptOpenState; /*设置屏蔽门异常状态*/ } else { @@ -2598,16 +2597,16 @@ void SetPsdExceptOpenState(const UINT16 wPsdId, const UINT8 cExceptOpenState) } /* -* 功能描述:获取指定ID屏蔽门异常打开状态 +* 功能描述:获取指定ID屏蔽门异常状态 * 参数说明:const UINT16 wPsdId 屏蔽门ID -* 返 回 值:0x55 异常打开 -* 0xAA 未异常打开 +* 返 回 值:0x55 异常(曾异常打开未解除) +* 0xAA 未异常 * Created By LQ 2025.05.22 */ -UINT8 GePsdExceptOpenState(const UINT16 wPsdId) +UINT8 GePsdExceptState(const UINT16 wPsdId) { UINT16 bufIndex = 0U; - UINT8 cRetVal = PSD_EXCEPT_OPEN_YES; + UINT8 cRetVal = PSD_EXCEPT_YES; bufIndex = GetPsdConfigBufIndex(wPsdId); /*获取屏蔽门数组下标*/ @@ -3375,4 +3374,46 @@ UINT32 GetIBPPressCycNum(const UINT16 doorId) retVal = CI_ERROR; } return retVal; +} + +/* +* 功能描述: 获取指定ID屏蔽门状态给 VOBC +* 参数说明: const UINT16 doorId,屏蔽门ID +* 返回值 :屏蔽门状态 +*/ +UINT8 GetPsdStateToVobc(const UINT16 doorId) +{ + UINT8 chPsdState = 0U; + UINT8 chPsdPlState = 0U; + UINT8 chExceptOpenState = 0U; + UINT8 chRet = 0U; + chPsdPlState = GetPsdMutualLockRemoveState(doorId); /*屏蔽门互锁解除*/ + if ((PSD_MUTUALLOCK_REMOVE_YES == chPsdPlState) || (PSD_ATS_MUTUALLOCK_REMOVE_YES == chPsdPlState) || (PSD_ATS_AND_JD_MUTUALLOCK_REMOVE_YES == chPsdPlState)) + { + /*屏蔽门互锁解除*/ + chRet = CI_IVOC_PSD_STATE_PANGLU; + } + else + { + chPsdState = GetPsdState(doorId); + if (PSD_STATE_CLOSE == chPsdState) + {/*屏蔽门关*/ + chRet = CI_IVOC_PSD_STATE_CLOSE; + } + else + { + /*屏蔽门开, 判断是否异常*/ + chExceptOpenState = GePsdExceptState(doorId); + if (PSD_EXCEPT_NO == chExceptOpenState) + { + chRet = CI_IVOC_PSD_STATE_OPEN; + } + else + { + /*屏蔽门异常打开*/ + chRet = CI_IVOC_PSD_STATE_OPEN_EXCEPT; + } + } + } + return chRet; } \ 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 d53456c..40963f7 100644 --- a/TSCP/src/APP/ciapp/PSD/PSDDataManage.h +++ b/TSCP/src/APP/ciapp/PSD/PSDDataManage.h @@ -925,22 +925,22 @@ void SetPsdVideoQkRelateVobcId(const UINT16 wPsdId, const UINT16 wVobcId); UINT16 GePsdVideoQkRelateVobcId(const UINT16 wPsdId); /* -* 功能描述:设置指定ID屏蔽门异常打开状态 +* 功能描述:设置指定ID屏蔽门异常状态 * 参数说明:const UINT16 wPsdId 屏蔽门ID -* const UINT8 cExceptOpenState 屏蔽门异常打开状态 +* const UINT8 cExceptOpenState 屏蔽门异常状态 * 返 回 值:无 * Created By LQ 2025.05.22 */ -void SetPsdExceptOpenState(const UINT16 wPsdId, const UINT8 cExceptOpenState); +void SetPsdExceptState(const UINT16 wPsdId, const UINT8 cExceptOpenState); /* -* 功能描述:获取指定ID屏蔽门异常打开状态 +* 功能描述:获取指定ID屏蔽门异常状态 * 参数说明:const UINT16 wPsdId 屏蔽门ID -* 返 回 值:0x55 异常打开 -* 0xAA 未异常打开 +* 返 回 值:0x55 异常(曾异常打开未解除) +* 0xAA 未异常 * Created By LQ 2025.05.22 */ -UINT8 GePsdExceptOpenState(const UINT16 wPsdId); +UINT8 GePsdExceptState(const UINT16 wPsdId); /* * 功能描述: 设置指定ID屏蔽门故障隔离信息 @@ -1179,6 +1179,12 @@ UINT8 GetPsdButtonIbpState(const UINT16 doorId); * >0: 设置数据成功 */ UINT8 SetIBPPressCycNum(const UINT16 doorId, const UINT32 startCycNum); +/* +* 功能描述: 获取指定ID屏蔽门状态给 VOBC +* 参数说明: const UINT16 doorId,屏蔽门ID +* 返回值 :屏蔽门状态 +*/ +UINT8 GetPsdStateToVobc(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 0a4f69d..ebc91b0 100644 --- a/TSCP/src/APP/ciapp/PSD/PSDDefine.h +++ b/TSCP/src/APP/ciapp/PSD/PSDDefine.h @@ -198,9 +198,13 @@ #define VIDEO_QK_DRIVE_STATE_TESTING ((UINT8)0xccU) /*视频清客驱动状态—检测中*/ #define VIDEO_QK_DRIVE_STATE_INVALID ((UINT8)0xffU) /*视频清客驱动状态—无效*/ -/*屏蔽门异常打开状态*/ -#define PSD_EXCEPT_OPEN_NO ((UINT8)0xAAU) /*未异常打开*/ -#define PSD_EXCEPT_OPEN_YES ((UINT8)0x55U) /*异常打开*/ +/*屏蔽门异常状态*/ +#define PSD_EXCEPT_NO ((UINT8)0xAAU) /*未异常*/ +#define PSD_EXCEPT_YES ((UINT8)0x55U) /*异常(曾异常打开未取消)*/ + +/*屏蔽门异常取消方式*/ +#define PSD_EXCEPT_CANCLE_ATS ((UINT8)0xAAU) /*ATS命令取消*/ +#define PSD_EXCEPT_CANCLE_RCI ((UINT8)0x55U) /*未异常打开时联锁自动取消异常*/ /*OC-P旁路状态确认*/ #define OC_PSC_PL_CONFIRM_YES ((UINT8)0xaaU) /*OC-P旁路状态已确认*/ @@ -218,4 +222,10 @@ #define PSD_INCLUDE_ESB_NUM ((UINT8)10U) /*ESB个数*/ + +/*CI-VOBC屏蔽门状态*/ +#define CI_IVOC_PSD_STATE_CLOSE ((UINT8)0xAAU) /*CI到IVOC屏蔽门关闭*/ +#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屏蔽门异常打开*/ #endif diff --git a/TSCP/src/APP/ciapp/ParsePack/CiInterfaceDefine.h b/TSCP/src/APP/ciapp/ParsePack/CiInterfaceDefine.h index d9ea0eb..96ca9c3 100644 --- a/TSCP/src/APP/ciapp/ParsePack/CiInterfaceDefine.h +++ b/TSCP/src/APP/ciapp/ParsePack/CiInterfaceDefine.h @@ -163,6 +163,7 @@ #define ATS_CMD_APPLY_XICHE ((UINT8)0xB1) /*降级模式洗车请求*/ #define ATS_CMD_APPLY_PASSXICHE ((UINT8)0xB2) /*现地请求反向洗车命令-降级模式*/ #define ATS_CMD_CANCEL_PASSXICHE ((UINT8)0xB3) /*现地取消反向洗车命令-降级模式*/ +#define ATS_CMD_CANCEL_PSD_EXCEPT ((UINT8)0xBA) /*现地取消站台门异常状态*/ /****联锁到其他联锁的命令宏定义****/ #define CI_CMD_PHYSEC_USING_APPLY ((UINT16)0x0001) /*物理区段征用申请*/ diff --git a/TSCP/src/APP/ciapp/ParsePack/ParsePackCiData.c b/TSCP/src/APP/ciapp/ParsePack/ParsePackCiData.c index 88d1bd3..0b2f1f5 100644 --- a/TSCP/src/APP/ciapp/ParsePack/ParsePackCiData.c +++ b/TSCP/src/APP/ciapp/ParsePack/ParsePackCiData.c @@ -16,6 +16,7 @@ #include "../QueryFiles/dquCIInterFace.h" #include "../CutoffPoint/CutoffPointDataManage.h" #include "ELMDataPrepare.h" +#include "../ParsePack/ParsePackZcData.h" #define RCI_GENERAL_DEFAULT_DEV_SUM_LEN (UINT16)38U /*当相邻RC/CI间不需要发送设备状态时,只发送命令时,相应的设备数量占的缓冲区位置需要填写0,每个设备数量2/1字节,通用设备信息帧共有18*2+2*1=38字节*/ #define RCI_PBTACS_DEFAULT_DEV_SUM_LEN (UINT16)8U /*当相邻RC间不需要发送设备状态、只发送区间疏散+命令时,相应的设备数量占的缓冲区位置需要填写0,每个设备数量2/1字节,PBTACS特有设备信息帧共4*2=8字节*/ @@ -1952,7 +1953,7 @@ UINT8 ParseCiToCiDataFrame(UINT8* dataBuf, UINT16 dataLength,UINT16 wSourceDevId belongCiId = GetLogSecBelongCiId(deviceId); if (belongCiId == localCiId) { - ii += 3U; /*跳过属于本联锁的逻辑区段状态信息*/ + ii += CICI_ONE_LOGSEC_LEN -2U; /*跳过属于本联锁的逻辑区段状态信息*/ } else { @@ -2055,7 +2056,30 @@ UINT8 ParseCiToCiDataFrame(UINT8* dataBuf, UINT16 dataLength,UINT16 wSourceDevId SetLogEmergXianSuOtherCi(deviceId, chTempState); /*设置相邻联锁临时限速速度值*/ - SetLogSecXiansuSpeed(deviceId, dataBuf[ii++]); + SetLogSecXiansuSpeed(deviceId, dataBuf[ii++]); + + chMergeBit = dataBuf[ii++]; + /* 逻辑区段CBTC_ARB状态 */ + if (((chMergeBit & BIT_PALCE00001100) >> 2U) == BIT_VAL_00000001B) + { + chTempState = LGC_SECTION_ARB_YES; + } + else + { + chTempState = LGC_SECTION_ARB_NO; + } + SetLogSecCbtcArbState(deviceId, chTempState); + + /* 逻辑区段PB_TACS_ARB状态 */ + if ((chMergeBit & BIT_PALCE00000011) == BIT_VAL_00000001B) + { + chTempState = LGC_SECTION_ARB_YES; + } + else + { + chTempState = LGC_SECTION_ARB_NO; + } + SetLogSecPbTacsArbState(deviceId, chTempState); } } @@ -2125,9 +2149,9 @@ UINT8 ParseCiToCiDataFrame(UINT8* dataBuf, UINT16 dataLength,UINT16 wSourceDevId (void)SetPsdState(deviceId, dataBuf[ii++]); /*屏蔽门开关状态状态*/ (void)SetPsdMutualLockRemoveState(deviceId, dataBuf[ii++]); /*屏蔽门互锁解除状态状态*/ - deviceInfo = dataBuf[ii]; /*解析PSD异常打开状态*/ + deviceInfo = dataBuf[ii]; /*解析PSD异常状态*/ ii++; - SetPsdExceptOpenState(deviceId, deviceInfo); + SetPsdExceptState(deviceId, deviceInfo); } } } @@ -4812,6 +4836,41 @@ UINT8 PackNearRciLogSecStateData(UINT8 dstCiId, UINT8* dataFrame, UINT16* dataLe dataFrame[ii] = GetLogSecXiansuSpeed(deviceId); /*逻辑区段临时限速取值*/ ii++; + + cCurPackDevState = 0U; /*重置组包设备状态为0*/ + + cDevState = GetLogSecCbtcArbState(deviceId); /*逻辑区段CBTC_ARB状态*/ + switch (cDevState) + { + case LGC_SECTION_ARB_YES: + cCurPackDevState |= (BIT_VAL_00000001B << 2U); + break; + case LGC_SECTION_ARB_NO: + cCurPackDevState |= (BIT_VAL_00000010B << 2U); + break; + default: + debug_infor_printf((const)"\nPackNearRciLogSecStateData Error: LogSec[%d] CBTC_ARB[%d] Error.\n", deviceId, cDevState); + cRetVal = CI_ERROR; + break; + } + + cDevState = GetLogSecPbTacsArbState(deviceId); /*逻辑区段PB_TACS_ARB状态*/ + switch (cDevState) + { + case LGC_SECTION_ARB_YES: + cCurPackDevState |= BIT_VAL_00000001B; + break; + case LGC_SECTION_ARB_NO: + cCurPackDevState |= BIT_VAL_00000010B; + break; + default: + debug_infor_printf((const)"\nPackNearRciLogSecStateData Error: LogSec[%d] PB_TACS_ARB[%d] Error.\n", deviceId, cDevState); + cRetVal = CI_ERROR; + break; + } + + dataFrame[ii] = cCurPackDevState; /*组逻辑区段CBTC_ARB+PB_TACS_ARB状态*/ + ii++; deviceSum++; } @@ -4958,7 +5017,7 @@ UINT8 PackNearRciPsdData(UINT8 dstCiId, UINT8* dataFrame, UINT16* dataLength) dataFrame[ii++] = GetPsdState(deviceId); /*屏蔽门状态*/ dataFrame[ii++] = GetPsdMutualLockRemoveState(deviceId); /*屏蔽门互锁解除状态*/ - deviceState = GePsdExceptOpenState(deviceId); /*PSD异常打开状态*/ + deviceState = GePsdExceptState(deviceId); /*PSD异常状态*/ dataFrame[ii] = deviceState; ii++; deviceSum++; @@ -6562,13 +6621,11 @@ UINT8 PackNearRciLogSecResLockData(UINT8 dstCiId, UINT8* dataFrame, UINT16* data UINT8 routeBelongCi = 0U; UINT8 chLogSecTrainInfoSum = 0U; UINT16 wTrainId = 0U; - UINT8 chTrainIndex = 0U; UINT8 cLogSecLogicLockState = LOG_SECTION_LOCK_NO; /*逻辑区段逻辑锁闭状态*/ UINT8 cLogSecLogicLockDir = CI_SYSTEM_DIRECTION_NONE; /*逻辑区段逻辑锁闭方向*/ UINT8 cLogLockBelLogRouteSum = 0U; UINT8 chLgcResShrFlag = 0U; UINT8 chLogSecIndex = 0U; - UINT8 chLogicTrainSum = 0U; /*征用逻辑区段的列车数量*/ UINT8 cCurPackDevState = 0U; localCi = GetSystemParaLocalCiId(); @@ -7178,7 +7235,7 @@ UINT8 InitPhySecIdBufOfOtherCiByConf(void) UINT8 chRouteProSwitchSum = 0U; /*防护道岔数目*/ RouteProtectSwitchStruct* pRouteProtectSwitchStru = NULL; /*防护道岔数据*/ UINT16 wProSwRelPhySecId = 0U;/*防护道岔关联物理区段ID*/ - UINT16 wPhySecIdCheck = 0U;/*物理区段ID检查*/ + UINT8 wPhySecIdCheck = 0U;/*物理区段ID检查*/ belongCiId = GetSystemParaLocalCiId(); @@ -8665,11 +8722,11 @@ static UINT8 ParseLogSecPacket(const UINT8 *pInputData, UINT16 *pItemLen,const U if ((LOG_SECTION_LOCK_NORMAL == sectionRouteLockState)) { SetLogSecLockStateHlht(logSecId, LOG_SECTION_LOCK_NORMAL); - SetLogSecRLockRouteIdHlht(logSecId, UINT16_MAX); + SetLogSecRLockRouteIdHlht(logSecId); } else { - SetLogSecRLockRouteIdHlht(logSecId, 0u); + SetLogSecRLockRouteIdHlht(logSecId); } /*异常锁闭的优先级最高*/ @@ -10270,7 +10327,7 @@ static UINT8 ParseStartLockPacket(const UINT8* pInputData, UINT16* pItemLen, con SetLogSecStartLockStateHlht(wLogSecId, LOG_SECTION_LOCK_START); SetLogSecLockDirHlht(wLogSecId, CI_SYSTEM_DIRECTION_NONE); SetLogSecPLockRouteIdHlht(wLogSecId, 0U); - SetLogSecRLockRouteIdHlht(wLogSecId, 0U); + SetLogSecRLockRouteIdHlht(wLogSecId); break; default: /*不可达分支*/ @@ -11845,7 +11902,7 @@ void ClearCiRevCiDrCmdData(void) * 返回值 : CI_ERROR:校验失败 * CI_SUCCESS:校验成功 */ -UINT8 ParseCiToCiDataCheck(UINT8* dataBuf, UINT16 dataLength,UINT8 *errNo, UINT16 srcDevTypeId) +UINT8 ParseCiToCiDataCheck(UINT8* dataBuf, UINT16 dataLength, UINT8* errNo, UINT16 srcDevTypeId) { UINT8 reVal = CI_ERROR; UINT8 errorNo_length = 0U; @@ -11859,431 +11916,421 @@ UINT8 ParseCiToCiDataCheck(UINT8* dataBuf, UINT16 dataLength,UINT8 *errNo, UINT1 if ((dataBuf != NULL) && (dataLength > 0U)) { reVal = CI_SUCCESS; - } - else - { - reVal = CI_ERROR; - } - /*版本号校验 防止接口版本不一致校验时越界*/ - if (CI_SUCCESS == reVal) - { - reVal = CheckCiIDAndVer(dataBuf, &ii); - if (CI_ERROR == reVal) + + /*版本号校验 防止接口版本不一致校验时越界*/ + if (CI_SUCCESS == reVal) { - *errNo = 0U; + reVal = CheckCiIDAndVer(dataBuf, &ii); + if (CI_ERROR == reVal) + { + *errNo = 0U; + } } - } -#if 0 - /*长度校验*/ - if (CI_SUCCESS == reVal) - { - reVal = CheckCi2CiDataLenValid(dataBuf, dataLength, &errorNo_length); - if (CI_ERROR == reVal) + + /*分帧类型进行校验*/ + wAppLen = ShortFromChar(&dataBuf[CICI_BEGIN_TO_STATION_LEN - 2U]); + if ((wAppLen < 6U) || ((wAppLen + CICI_BEGIN_TO_STATION_LEN) > CI_TO_CI_DATA_LEN_MAX)) { debug_infor_printf((const)"CheckCi2CiDataLenValid error:%d\n", errorNo_length); - *errNo = 2U; + *errNo = 29U; } - } -#endif - /*分帧类型进行校验*/ - wAppLen = ShortFromChar(&dataBuf[CICI_BEGIN_TO_STATION_LEN - 2U]); - if ((wAppLen < 6U)||((wAppLen+ CICI_BEGIN_TO_STATION_LEN)>CI_TO_CI_DATA_LEN_MAX)) - { - debug_infor_printf((const)"CheckCi2CiDataLenValid error:%d\n", errorNo_length); - *errNo = 29U; - } - while (wTotalLen < wAppLen) - { - wMsgLen = ShortFromChar(&dataBuf[ii]); - ii += 2U; - wMsgType = ShortFromChar(&dataBuf[ii]); - ii += 2U; - ii += 2U;/*预留字节*/ - if (NEAR_RCI_GENERAL_DEV_INFO== wMsgType) + while (wTotalLen < wAppLen) { - /*道岔数据校验*/ - if (CI_SUCCESS == reVal) + wMsgLen = ShortFromChar(&dataBuf[ii]); + ii += 2U; + wMsgType = ShortFromChar(&dataBuf[ii]); + ii += 2U; + ii += 2U;/*预留字节*/ + if (NEAR_RCI_GENERAL_DEV_INFO == wMsgType) { - reVal = CheckCiToCiSwitchData(dataBuf, &ii); - if (CI_ERROR == reVal) - { - *errNo = 1U; - } - } - - /*物理区段数据校验*/ - if (CI_SUCCESS == reVal) - { - reVal = CheckCiToCiPhySecData(dataBuf, &ii); - if (CI_ERROR == reVal) - { - *errNo = 2U; - } - } - - /*逻辑区段数据校验*/ - if (CI_SUCCESS == reVal) - { - reVal = CheckCiToCiLogSecData(dataBuf, &ii); - if (CI_ERROR == reVal) - { - *errNo = 3U; - } - } - - /*信号机数据校验*/ - if (CI_SUCCESS == reVal) - { - reVal = CheckCiToCiSignalData(dataBuf, &ii); - if (CI_ERROR == reVal) - { - *errNo = 4U; - } - } - - /*屏蔽门数据校验*/ - if (CI_SUCCESS == reVal) - { - reVal = CheckCiToCiPsdData(dataBuf, &ii); - if (CI_ERROR == reVal) - { - *errNo = 5U; - } - } - - /*紧急停车按钮数据校验*/ - if (CI_SUCCESS == reVal) - { - reVal = CheckCiToCiEsbData(dataBuf, &ii); - if (CI_ERROR == reVal) - { - *errNo = 6U; - } - } - - /*进路数据校验*/ - if (CI_SUCCESS == reVal) - { - reVal = CheckCiToCiRouteData(dataBuf, &ii); - if (CI_ERROR == reVal) - { - *errNo = 7U; - } - } - - /*本联锁中由其它联锁共同管理的物理区段锁闭状态数据校验*/ - if (CI_SUCCESS == reVal) - { - reVal = CheckCiToCiCommonPhyLockData(dataBuf, &ii); - if (CI_ERROR == reVal) - { - *errNo = 8U; - } - } - - /*SPKS数据校验*/ - if (CI_SUCCESS == reVal) - { - reVal = CheckCiToCiSpksData(dataBuf, &ii); - if (CI_ERROR == reVal) - { - *errNo = 9U; - } - } - - /*虚拟继电器数据校验*/ - if (CI_SUCCESS == reVal) - { - reVal = CheckCiToCiVirRelayData(dataBuf, &ii); - if (CI_ERROR == reVal) - { - *errNo = 10U; - } - } - - /*防淹门数据校验*/ - if (CI_SUCCESS == reVal) - { - reVal = CheckCiToCiFloodGateData(dataBuf, &ii); - if (CI_ERROR == reVal) - { - *errNo = 11U; - } - } - - /*保护区段数据校验*/ - if (CI_SUCCESS == reVal) - { - reVal = CheckCiToCiOverlapData(dataBuf, &ii); - if (CI_ERROR == reVal) - { - *errNo = 12U; - } - } - - /*自动通过进路数据校验*/ - if (CI_SUCCESS == reVal) - { - reVal = CheckCiToCiAutoRouteData(dataBuf, &ii); - if (CI_ERROR == reVal) - { - *errNo = 13U; - } - } - - /*本联锁中其他联锁管理的逻辑区段锁闭状态校验*/ - if (CI_SUCCESS == reVal) - { - reVal = CheckCiToCiLogicLockData(dataBuf, &ii); - if (CI_ERROR == reVal) - { - *errNo = 14U; - } - } - - /*区间雨雪数据校验*/ - if (CI_SUCCESS == reVal) - { - reVal = CheckCiToCiAreaSnowData(dataBuf, &ii); - if (CI_ERROR == reVal) - { - *errNo = 15U; - } - } - - /*区间ITE切除数据校验*/ - if (CI_SUCCESS == reVal) - { - reVal = CheckCiToCiAreaIteCutData(dataBuf, &ii); - if (CI_ERROR == reVal) - { - *errNo = 16U; - } - } - - /*进路离去逻辑区段数据校验*/ - if (CI_SUCCESS == reVal) - { - reVal = CheckCiToCiLeaveLogSecData(dataBuf, &ii); - if (CI_ERROR == reVal) - { - *errNo = 17U; - } - } - - /*需要检查道岔状态的进路数据校验*/ - if (CI_SUCCESS == reVal) - { - reVal = CheckCiToCiNeedCheckSwRouteData(dataBuf, &ii); - if (CI_ERROR == reVal) - { - *errNo = 18U; - } - } - - /*需要检查防护道岔状态的保护区段数据校验*/ - if (CI_SUCCESS == reVal) - { - reVal = CheckCiToCiNeedCheckSwOlpData(dataBuf, &ii); + /*道岔数据校验*/ if (CI_SUCCESS == reVal) + { + reVal = CheckCiToCiSwitchData(dataBuf, &ii); + if (CI_ERROR == reVal) + { + *errNo = 1U; + } + } + + /*物理区段数据校验*/ + if (CI_SUCCESS == reVal) + { + reVal = CheckCiToCiPhySecData(dataBuf, &ii); + if (CI_ERROR == reVal) + { + *errNo = 2U; + } + } + + /*逻辑区段数据校验*/ + if (CI_SUCCESS == reVal) + { + reVal = CheckCiToCiLogSecData(dataBuf, &ii); + if (CI_ERROR == reVal) + { + *errNo = 3U; + } + } + + /*信号机数据校验*/ + if (CI_SUCCESS == reVal) + { + reVal = CheckCiToCiSignalData(dataBuf, &ii); + if (CI_ERROR == reVal) + { + *errNo = 4U; + } + } + + /*屏蔽门数据校验*/ + if (CI_SUCCESS == reVal) + { + reVal = CheckCiToCiPsdData(dataBuf, &ii); + if (CI_ERROR == reVal) + { + *errNo = 5U; + } + } + + /*紧急停车按钮数据校验*/ + if (CI_SUCCESS == reVal) + { + reVal = CheckCiToCiEsbData(dataBuf, &ii); + if (CI_ERROR == reVal) + { + *errNo = 6U; + } + } + + /*进路数据校验*/ + if (CI_SUCCESS == reVal) + { + reVal = CheckCiToCiRouteData(dataBuf, &ii); + if (CI_ERROR == reVal) + { + *errNo = 7U; + } + } + + /*本联锁中由其它联锁共同管理的物理区段锁闭状态数据校验*/ + if (CI_SUCCESS == reVal) + { + reVal = CheckCiToCiCommonPhyLockData(dataBuf, &ii); + if (CI_ERROR == reVal) + { + *errNo = 8U; + } + } + + /*SPKS数据校验*/ + if (CI_SUCCESS == reVal) + { + reVal = CheckCiToCiSpksData(dataBuf, &ii); + if (CI_ERROR == reVal) + { + *errNo = 9U; + } + } + + /*虚拟继电器数据校验*/ + if (CI_SUCCESS == reVal) + { + reVal = CheckCiToCiVirRelayData(dataBuf, &ii); + if (CI_ERROR == reVal) + { + *errNo = 10U; + } + } + + /*防淹门数据校验*/ + if (CI_SUCCESS == reVal) + { + reVal = CheckCiToCiFloodGateData(dataBuf, &ii); + if (CI_ERROR == reVal) + { + *errNo = 11U; + } + } + + /*保护区段数据校验*/ + if (CI_SUCCESS == reVal) + { + reVal = CheckCiToCiOverlapData(dataBuf, &ii); + if (CI_ERROR == reVal) + { + *errNo = 12U; + } + } + + /*自动通过进路数据校验*/ + if (CI_SUCCESS == reVal) + { + reVal = CheckCiToCiAutoRouteData(dataBuf, &ii); + if (CI_ERROR == reVal) + { + *errNo = 13U; + } + } + + /*本联锁中其他联锁管理的逻辑区段锁闭状态校验*/ + if (CI_SUCCESS == reVal) + { + reVal = CheckCiToCiLogicLockData(dataBuf, &ii); + if (CI_ERROR == reVal) + { + *errNo = 14U; + } + } + + /*区间雨雪数据校验*/ + if (CI_SUCCESS == reVal) + { + reVal = CheckCiToCiAreaSnowData(dataBuf, &ii); + if (CI_ERROR == reVal) + { + *errNo = 15U; + } + } + + /*区间ITE切除数据校验*/ + if (CI_SUCCESS == reVal) + { + reVal = CheckCiToCiAreaIteCutData(dataBuf, &ii); + if (CI_ERROR == reVal) + { + *errNo = 16U; + } + } + + /*进路离去逻辑区段数据校验*/ + if (CI_SUCCESS == reVal) + { + reVal = CheckCiToCiLeaveLogSecData(dataBuf, &ii); + if (CI_ERROR == reVal) + { + *errNo = 17U; + } + } + + /*需要检查道岔状态的进路数据校验*/ + if (CI_SUCCESS == reVal) + { + reVal = CheckCiToCiNeedCheckSwRouteData(dataBuf, &ii); + if (CI_ERROR == reVal) + { + *errNo = 18U; + } + } + + /*需要检查防护道岔状态的保护区段数据校验*/ + if (CI_SUCCESS == reVal) + { + reVal = CheckCiToCiNeedCheckSwOlpData(dataBuf, &ii); + if (CI_SUCCESS == reVal) + { + /*不处理*/ + } + else + { + *errNo = 19U; + } + } + else { /*不处理*/ } - else - { - *errNo = 19U; - } - } - else - { - /*不处理*/ - } - /*被其它控区进路/保护区段防护锁闭的防护道岔数据校验*/ - if (CI_SUCCESS == reVal) - { - reVal = CheckCiToCiProSwPLockData(dataBuf, &ii); + /*被其它控区进路/保护区段防护锁闭的防护道岔数据校验*/ if (CI_SUCCESS == reVal) + { + reVal = CheckCiToCiProSwPLockData(dataBuf, &ii); + if (CI_SUCCESS == reVal) + { + /*不处理*/ + } + else + { + *errNo = 20U; + } + } + else { /*不处理*/ } - else - { - *errNo = 20U; - } - } - else - { - /*不处理*/ - } - /*相邻联锁间命令数据校验*/ - if (CI_SUCCESS == reVal) - { - reVal = CheckCiToCiCommandData(dataBuf, &ii); - if (CI_ERROR == reVal) + /*相邻联锁间命令数据校验*/ + if (CI_SUCCESS == reVal) { - *errNo = 21U; + reVal = CheckCiToCiCommandData(dataBuf, &ii); + if (CI_ERROR == reVal) + { + *errNo = 21U; + } } - } - if (CI_SUCCESS == reVal) - { - if ((ii - CICI_BEGIN_TO_STATION_LEN - wTotalLen - 2U) != wMsgLen) + if (CI_SUCCESS == reVal) { - reVal = CI_ERROR; - debug_infor_printf((const)"ParseCiToCiDataCheck NEAR_RCI_GENERAL_DEV_INFO Len Error \n"); - *errNo = 30U; + if ((ii - CICI_BEGIN_TO_STATION_LEN - wTotalLen - 2U) != wMsgLen) + { + reVal = CI_ERROR; + debug_infor_printf((const)"ParseCiToCiDataCheck NEAR_RCI_GENERAL_DEV_INFO Len Error \n"); + *errNo = 30U; + } } - } - if (CI_SUCCESS == reVal) - { - wTotalLen += wMsgLen; - wTotalLen += 2U; - } - else - { - wTotalLen = UINT16_MAX;/*不再解析,错误已记录*/ - } - } - else if (wMsgType == NEAR_RCI_PBTACS_DEV_INFO) - { - /*联锁模式校验*/ - if ((CI_SYSTEM_TYPE_RC == chSendType) && (CI_SYSTEM_TYPE_RC == CI_SYSTEM_TYPE_RCI)) - { - ;/*仅RC间存在*/ - } - else - { - reVal = CI_ERROR; - *errNo = 34U; - } - /*RC物理区段坏车占用数据校验*/ - if (CI_SUCCESS == reVal) - { - reVal = CheckCiToCiPhySecUtOccData(dataBuf, &ii); - if (CI_ERROR == reVal) + if (CI_SUCCESS == reVal) { - *errNo = 22U; + wTotalLen += wMsgLen; + wTotalLen += 2U; } else { - /*继续校验*/ + wTotalLen = UINT16_MAX;/*不再解析,错误已记录*/ } } - else + else if (wMsgType == NEAR_RCI_PBTACS_DEV_INFO) { - /*已校验失败,不处理*/ - } - - /*RC逻辑区段数据校验*/ - if (CI_SUCCESS == reVal) - { - reVal = CheckCiToCiLogSecDataRcOnly(dataBuf, &ii); - if (CI_ERROR == reVal) + /*联锁模式校验*/ + if ((CI_SYSTEM_TYPE_RC == chSendType) && (CI_SYSTEM_TYPE_RC == CI_SYSTEM_TYPE_RCI)) { - *errNo = 23U; + ;/*仅RC间存在*/ } - } - - /*本联锁中其他联锁管理的逻辑区段锁闭状态校验*/ - if (CI_SUCCESS == reVal) - { - reVal = CheckCiToCiLogicLockDataRcOnly(dataBuf, &ii); - if (CI_ERROR == reVal) - { - *errNo = 24U; - } - } - /*分界点数据校验*/ - if (CI_SUCCESS == reVal) - { - reVal = CheckCiToCiCfpData(dataBuf, &ii); - if (CI_ERROR == reVal) - { - *errNo = 25U; - } - } - - /*区间疏散数据校验*/ - if (CI_SUCCESS == reVal) - { - reVal = CheckCiToCiEaData(dataBuf, &ii); - if (CI_ERROR == reVal) - { - *errNo = 26U; - } - } - /*相邻联锁间命令数据校验*/ - if (CI_SUCCESS == reVal) - { - reVal = CheckCiToCiCommandDataRcOnly(dataBuf, &ii); - if (CI_ERROR == reVal) - { - *errNo = 27U; - } - } - - /*动态进路命令信息校验*/ - if (CI_SUCCESS == reVal) - { - reVal = CheckCiToCiDrCmdData(dataBuf, &ii); - if (CI_ERROR == reVal) - { - *errNo = 28U; - } - } - - if (CI_SUCCESS == reVal) - { - if ((ii - CICI_BEGIN_TO_STATION_LEN - wTotalLen - 2U) != wMsgLen) + else { reVal = CI_ERROR; - debug_infor_printf((const)"ParseCiToCiDataCheck NEAR_RCI_PBTACS_DEV_INFO Len Error \n"); - *errNo = 31U; + *errNo = 34U; + } + /*RC物理区段坏车占用数据校验*/ + if (CI_SUCCESS == reVal) + { + reVal = CheckCiToCiPhySecUtOccData(dataBuf, &ii); + if (CI_ERROR == reVal) + { + *errNo = 22U; + } + else + { + /*继续校验*/ + } + } + else + { + /*已校验失败,不处理*/ + } + + /*RC逻辑区段数据校验*/ + if (CI_SUCCESS == reVal) + { + reVal = CheckCiToCiLogSecDataRcOnly(dataBuf, &ii); + if (CI_ERROR == reVal) + { + *errNo = 23U; + } + } + + /*本联锁中其他联锁管理的逻辑区段锁闭状态校验*/ + if (CI_SUCCESS == reVal) + { + reVal = CheckCiToCiLogicLockDataRcOnly(dataBuf, &ii); + if (CI_ERROR == reVal) + { + *errNo = 24U; + } + } + /*分界点数据校验*/ + if (CI_SUCCESS == reVal) + { + reVal = CheckCiToCiCfpData(dataBuf, &ii); + if (CI_ERROR == reVal) + { + *errNo = 25U; + } + } + + /*区间疏散数据校验*/ + if (CI_SUCCESS == reVal) + { + reVal = CheckCiToCiEaData(dataBuf, &ii); + if (CI_ERROR == reVal) + { + *errNo = 26U; + } + } + /*相邻联锁间命令数据校验*/ + if (CI_SUCCESS == reVal) + { + reVal = CheckCiToCiCommandDataRcOnly(dataBuf, &ii); + if (CI_ERROR == reVal) + { + *errNo = 27U; + } + } + + /*动态进路命令信息校验*/ + if (CI_SUCCESS == reVal) + { + reVal = CheckCiToCiDrCmdData(dataBuf, &ii); + if (CI_ERROR == reVal) + { + *errNo = 28U; + } + } + + if (CI_SUCCESS == reVal) + { + if ((ii - CICI_BEGIN_TO_STATION_LEN - wTotalLen - 2U) != wMsgLen) + { + reVal = CI_ERROR; + debug_infor_printf((const)"ParseCiToCiDataCheck NEAR_RCI_PBTACS_DEV_INFO Len Error \n"); + *errNo = 31U; + } + } + if (CI_SUCCESS == reVal) + { + wTotalLen += wMsgLen; + wTotalLen += 2U; + } + else + { + wTotalLen = UINT16_MAX;/*不再解析,错误已记录*/ } } - if (CI_SUCCESS == reVal) + else if (wMsgType == NEAR_RCI_HEART_INFO) { - wTotalLen += wMsgLen; - wTotalLen += 2U; - } - else - { - wTotalLen = UINT16_MAX;/*不再解析,错误已记录*/ - } - } - else if (wMsgType == NEAR_RCI_HEART_INFO) - { - /*联锁模式校验*/ - if ((CI_SYSTEM_TYPE_RCI != chSendType) && - (4U == wMsgLen) && ((wMsgLen + 2U) == wAppLen)) - { - /*仅不同类型联锁间存在,无解析,心跳帧无内容 单独存在*/ - wTotalLen += wMsgLen; - wTotalLen += 2U; + /*联锁模式校验*/ + if ((CI_SYSTEM_TYPE_RCI != chSendType) && + (4U == wMsgLen) && ((wMsgLen + 2U) == wAppLen)) + { + /*仅不同类型联锁间存在,无解析,心跳帧无内容 单独存在*/ + wTotalLen += wMsgLen; + wTotalLen += 2U; + } + else + { + reVal = CI_ERROR; + *errNo = 35U; + wTotalLen = UINT16_MAX; + } } else { + wTotalLen = UINT16_MAX;/*不再解析*/ + *errNo = 32U;/*帧类型错误*/ + debug_infor_printf((const)"ParseCiToCiDataCheck MsgType:0x%x Error \n", wMsgType); reVal = CI_ERROR; - *errNo = 35U; - wTotalLen = UINT16_MAX; - } + } } - else + + if ((wTotalLen != wAppLen) && (wTotalLen != UINT16_MAX) && (CI_ERROR != reVal)) { - wTotalLen = UINT16_MAX;/*不再解析*/ - *errNo = 32U;/*帧类型错误*/ - debug_infor_printf((const)"ParseCiToCiDataCheck MsgType:0x%x Error \n", wMsgType); + *errNo = 33U;/*总长错误*/ + debug_infor_printf((const)"ParseCiToCiDataCheck ToTalLen:0x%x ,MsgCntLen:0x%x ; Error \n", wAppLen, wTotalLen); reVal = CI_ERROR; } } - - if ((wTotalLen != wAppLen) && (wTotalLen != UINT16_MAX)&&(CI_ERROR!= reVal)) + else { - *errNo = 33U;/*总长错误*/ - debug_infor_printf((const)"ParseCiToCiDataCheck ToTalLen:0x%x ,MsgCntLen:0x%x ; Error \n", wAppLen, wTotalLen); reVal = CI_ERROR; } return reVal; @@ -12908,7 +12955,6 @@ UINT8 CheckCiToCiLogSecData(const UINT8* dataBuf, UINT16* index) UINT8 retVal = CI_ERROR; UINT16 ii = 0U; UINT16 jj = 0U; - UINT16 kk = 0U; UINT16 wLogSecSum = 0U;/*逻辑区段数目*/ UINT16 wLogSecId = 0U;/*逻辑区段Id*/ UINT8 chLogSecBelongCiId = 0U;/*逻辑区段所属联锁*/ @@ -12988,6 +13034,19 @@ UINT8 CheckCiToCiLogSecData(const UINT8* dataBuf, UINT16* index) debug_infor_printf((const)"CheckCiToCiLogSecData wLogSecId %d Is Error: chLogSecXinsuSpeed Is %d\n", wLogSecId, chLogSecXinsuSpeed); } } + + /*逻辑区段CBTC_ARB+PB_TACS_ARB状态*/ + chMergeBit = dataBuf[ii++]; + if (((chMergeBit & BIT_PALCE00001100) != 0x00U) && ((chMergeBit & BIT_PALCE00001100) != BIT_PALCE00001100) + && ((chMergeBit & BIT_PALCE00000011) != 0x00U) && ((chMergeBit & BIT_PALCE00000011) != BIT_PALCE00000011)) + { + ;/*继续解析: ARB无00B 无11B*/ + } + else + { + retVal = CI_ERROR; + debug_infor_printf((const)"CheckCiToCiLogSecData wLogSecId %d State:0x%x Error Step 4;\n", wLogSecId, chMergeBit); + } } } else @@ -13040,7 +13099,6 @@ UINT8 CheckCiToCiLogSecDataRcOnly(const UINT8* dataBuf, UINT16* index) UINT8 chLogSecResTrainSum = 0U;/*逻辑区段资源列车数量*/ UINT16 wLogSecResTrainId = 0U;/*逻辑区段资源列车ID*/ UINT8 chLogSecTrainUseState = 0U;/*逻辑区段资源可用状态*/ - UINT8 chLogSecAblUseFlag = 0U; chLocalCiId = GetSystemParaLocalCiId(); if ((NULL != dataBuf) && (NULL != index)) @@ -16335,10 +16393,10 @@ UINT8 CheckCiToCiPsdData(const UINT8* dataBuf, UINT16* index) } } - /*屏蔽门异常打开状态*/ + /*屏蔽门异常状态*/ cPsdExceptOpenState = dataBuf[ii]; ii++; - if ((PSD_EXCEPT_OPEN_YES == cPsdExceptOpenState) || (PSD_EXCEPT_OPEN_NO == cPsdExceptOpenState)) + if ((PSD_EXCEPT_YES == cPsdExceptOpenState) || (PSD_EXCEPT_NO == cPsdExceptOpenState)) { ;/*校验通过,继续处理*/ } @@ -19024,6 +19082,7 @@ UINT8 PackManufacDefPacket(UINT8* pInputBuf, UINT16* pItemLen, const UINT8 dstCi UINT16 wSwitchRelPhySecId = 0U; /*道岔关联物理区段ID*/ UINT16 wLockedRouteId = 0U; /*锁闭所属进路ID*/ UINT8 chExiansuState = 0U; + UINT8 chLockDir = 0U; /*锁闭方向*/ pTmpCiTransInfo = GetDstCiTransInfo(dstCiId); if ((NULL != pInputBuf) && (NULL != pItemLen) && (NULL != pTmpCiTransInfo)) @@ -19241,6 +19300,72 @@ UINT8 PackManufacDefPacket(UINT8* pInputBuf, UINT16* pItemLen, const UINT8 dstCi /*不处理*/ } wPackedInfoNum++; /*组完一个信息,数量加1*/ + + /*组道岔区段保护区段锁闭状态*/ + cTempCounter = (UINT8)(wPackedInfoNum % DEV_NUM_PER_BYTE); /*每2位存一个信息,一个字节可存4个信息*/ + cBitOffset = cTempCounter * BIT_NUM_PER_DEV; + wLockedRouteId = GetPhySecPLockBelongRouteId(wSwitchRelPhySecId); /*获取道岔区段防护锁闭所属进路ID*/ + if ((0U < wLockedRouteId) && (ROUTE_SUM_MAX > wLockedRouteId)) + { + *(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*/ + + /*组道岔区段上行锁闭方向*/ + cTempCounter = (UINT8)(wPackedInfoNum % DEV_NUM_PER_BYTE); /*每2位存一个信息,一个字节可存4个信息*/ + cBitOffset = cTempCounter * BIT_NUM_PER_DEV; + chLockDir = GetPhySecLockDirection(wSwitchRelPhySecId);/*获取道岔所属物理区段锁闭方向*/ + if (CI_SYSTEM_DIRECTION_UP == chLockDir) + { + *(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*/ + + /*组道岔区段下行锁闭方向*/ + cTempCounter = (UINT8)(wPackedInfoNum % DEV_NUM_PER_BYTE); /*每2位存一个信息,一个字节可存4个信息*/ + cBitOffset = cTempCounter * BIT_NUM_PER_DEV; + if (CI_SYSTEM_DIRECTION_DOWN == chLockDir) + { + *(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*/ } /*组物理区段停准停稳状态*/ @@ -19443,7 +19568,10 @@ UINT8 ParseManufacDefPacket(const UINT8* pInputData, UINT16* pItemLen, const UIN UINT16 wPhySecId = 0U; /*物理区段ID*/ UINT8 cSignalAtsDetainFlag = 0U; /*信号机中心扣车标志*/ UINT8 cSignalXiandiDetainFlag = 0U; /*信号机车站扣车标志*/ - + UINT8 cSwitchPLockState = 0U; /*道岔区段防护锁闭标志*/ + UINT8 cSwitchPhyUpLockDir = 0U; /*道岔区段上行锁闭方向*/ + UINT8 cSwitchPhyDownLockDir = 0U; /*道岔区段下行锁闭方向*/ + UINT8 cSwitchPhyLockDir = 0U; /*道岔区段锁闭方向*/ cLocalCiId = GetSystemParaLocalCiId(); pCiRecptStru = GetSrcCiTransInfo(srcCiId); /*获取源联锁对应的结构数据*/ pstrAutoRouteData = GetAutoRouteDataStr(); /*获取自动进路动态数据结构体*/ @@ -19770,7 +19898,91 @@ UINT8 ParseManufacDefPacket(const UINT8* pInputData, UINT16* pItemLen, const UIN } wParsedInfoNum++; /*解析完一个信息,数量加1*/ - /*确定道岔区段最终CT/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) + { + 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) + { + 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) + { + 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*/ + + /*确定道岔区段最终CT/UT占用状态--暂时不用在物理区段0x0202帧设置*/ if ((LOGICSECTION_OCCUPY_NO == cPhySecCtOcc) && (LOGICSECTION_OCCUPY_NO == cPhySecUtOcc)) { cPhySecCtOrUtOcc = LOGICSECTION_OCCUPY_NO; /*CT/UT均空闲,则空闲*/ @@ -19789,10 +20001,17 @@ UINT8 ParseManufacDefPacket(const UINT8* pInputData, UINT16* pItemLen, const UIN cRetVal = CI_ERROR; /*信息异常,返回失败*/ } - /*确定道岔区段最终锁闭状态*/ + /*确定道岔区段最终锁闭状态--暂时不用在物理区段0x0202帧设置*/ if ((PHYSICAL_SECTION_LOCK_NO == cPhySecRouteLockState) && (PHYSICAL_SECTION_LOCK_NO == cPhySecExceptLockState)) { - cPhySecLockState = PHYSICAL_SECTION_LOCK_NO; /*进路锁闭和故障锁闭均未锁闭,则未锁闭*/ + 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)) { @@ -19808,6 +20027,21 @@ UINT8 ParseManufacDefPacket(const UINT8* pInputData, UINT16* pItemLen, const UIN 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]; @@ -19816,7 +20050,7 @@ UINT8 ParseManufacDefPacket(const UINT8* pInputData, UINT16* pItemLen, const UIN if ((cLocalCiId != cDevBelongCiId) && (0U != cDevBelongCiId)) { /*存储非本控区设备的状态*/ - wDevIndex = GetPhySecConfigBufIndex(wDevId); + wDevIndex = GetPhySecConfigBufIndex(wPhySecId); pstrPhySecData[wDevIndex].PhysicalSectionId = wPhySecId; /*暂时预留*/ @@ -20570,6 +20804,7 @@ UINT8 PackRcToLocalCiDataFrame(const UINT8 cCiId) UINT16 wSignalId = 0U; /*信号机ID*/ UINT8 cLightExtinctState = 0U; /*信号机亮灭状态*/ UINT8 cSignalCrossState = 0U; /*信号机跨压状态*/ + UINT8 wCrossTacsTainId = 0U; /*跨压TACS主控列车ID*/ UINT16 wAxisSecNum = 0U; /*计轴区段数量*/ UINT16 wAxisSecId = 0U; /*计轴区段ID*/ UINT8 cAxisArbState = 0U; /*计轴区段ARB状态*/ @@ -20712,6 +20947,11 @@ UINT8 PackRcToLocalCiDataFrame(const UINT8 cCiId) szRcToCiDataBuf[ii] = cSignalCrossState; ii++; + /*跨压TACS主控列车ID*/ + wCrossTacsTainId = GetSignalCrossTacsTrainIdCC(wSignalId); + szRcToCiDataBuf[ii] = wCrossTacsTainId; + ii++; + wNeedPackDevNum++; } else @@ -20995,6 +21235,7 @@ UINT8 ParseRcToLocalCiDataFrame(const UINT8* pDataBuf, const UINT16 dataLength, UINT16 wSignalId = 0U; /*信号机ID*/ UINT8 cLightExtinctState = 0U; /*信号机亮灭状态*/ UINT8 cSignalCrossState = 0U; /*信号机跨压状态*/ + UINT8 wTacsCrossTrainId = 0U; /*TACS主控跨压列车ID*/ UINT16 wAxisSecNum = 0U; /*计轴区段数量*/ UINT16 wAxisSecId = 0U; /*计轴区段ID*/ UINT8 cAxisArbState = 0U; /*计轴区段ARB状态*/ @@ -21099,8 +21340,11 @@ UINT8 ParseRcToLocalCiDataFrame(const UINT8* pDataBuf, const UINT16 dataLength, cSignalCrossState = pDataBuf[ii]; /*解析信号机跨压状态*/ ii++; + wTacsCrossTrainId = pDataBuf[ii]; /*解析跨压TACS主控列车ID*/ + ii++; + SetSignalLightExtinctStateCC(wSignalId, cLightExtinctState); /*设置信号机亮灭状态CC*/ - SetSignalCrossStateCC(wSignalId, cSignalCrossState); /*设置信号机跨压状态CC*/ + SetSignalCrossStateCC(wSignalId, cSignalCrossState, wTacsCrossTrainId); /*设置信号机跨压状态CC*/ } /****** 解析计轴区段数据 ******/ @@ -21696,6 +21940,7 @@ UINT8 CheckLocalRcToCiSignalData(const UINT8* dataBuf, UINT16* index) UINT16 wSignalId = 0U; /*信号机ID*/ UINT8 cLightExtinctState = 0U; /*信号机亮灭状态*/ UINT8 cSignalCrossState = 0U; /*信号机跨压状态*/ + UINT8 cCrossTacsTrainId = 0U; /*信号机跨压TACS主控列车ID*/ UINT8 cLocalCiId = 0U; /*本联锁ID*/ UINT8 cSignalBelongCiId = 0U; /*信号机所属控区ID*/ @@ -21755,6 +22000,27 @@ UINT8 CheckLocalRcToCiSignalData(const UINT8* dataBuf, UINT16* index) { /*不处理*/ } + + if (CI_SUCCESS == retVal) + { + cCrossTacsTrainId = dataBuf[ii]; /*解析信号机跨压TACS列车ID*/ + ii++; + + if (TACS_CROSS_ID_MAX >= cCrossTacsTrainId) + { + /*无问题*/ + } + else + { + /*信号机跨压TACS列车ID非法,返回失败*/ + debug_infor_printf((const)"\nCheckLocalRcToCiSignalData Is Error: wSignalId[%d] cCrossTacsTrainId Is %d\n", wSignalId, cCrossTacsTrainId); + retVal = CI_ERROR; + } + } + else + { + /*不处理*/ + } } else { diff --git a/TSCP/src/APP/ciapp/ParsePack/ParsePackCiData.h b/TSCP/src/APP/ciapp/ParsePack/ParsePackCiData.h index 71956ce..f9ae6ee 100644 --- a/TSCP/src/APP/ciapp/ParsePack/ParsePackCiData.h +++ b/TSCP/src/APP/ciapp/ParsePack/ParsePackCiData.h @@ -108,13 +108,13 @@ #define PHYSEC_LOCKDIRECTION_OPPST_YES ((UINT8)0xAA) /*取反*/ #define PHYSEC_LOCKDIRECTION_OPPST_DEFAULT ((UINT8)0xFF) /*默认值*/ -#define CICI_VERSION ((UINT8)31) /*cici接口版本号,每次修改接口需要升级版本号——Last Modified On 2026.01.04*/ +#define CICI_VERSION ((UINT8)32) /*cici接口版本号,每次修改接口需要升级版本号——Last Modified On 2026.03.10*/ #define CICI_BEGIN_TO_STATION_LEN ((UINT16)31) /*20251104更新为HLHT头长度+应用层保温内容前6字节*/ #define CICI_CICIVERINDEX (CICI_BEGIN_TO_STATION_LEN-3U) /*20251104更新后CI接口版本信息索引*/ #define CICI_ONE_SWITCH_LEN ((UINT16)13) /*一个道岔数据长度*/ #define CICI_ONE_PHYSEC_LEN ((UINT16)12U)/*一个物理区段数据长度*/ #define CICI_ONE_PHYSEC_UT_LEN ((UINT16)1U)/*一个物理区段坏车占用数据长度*/ -#define CICI_ONE_LOGSEC_LEN ((UINT16)9)/*一个逻辑区段数据长度*/ +#define CICI_ONE_LOGSEC_LEN ((UINT16)6)/*一个逻辑区段数据长度*/ #define CICI_ONE_SIGNAL_LEN ((UINT16)11)/*一个信号机数据长度*/ #define CICI_ONE_PSD_LEN ((UINT16)5)/*一个屏蔽门数据长度*/ #define CICI_ONE_ESB_LEN ((UINT16)4)/*一个ESB数据长度*/ diff --git a/TSCP/src/APP/ciapp/ParsePack/ParsePackCommon.c b/TSCP/src/APP/ciapp/ParsePack/ParsePackCommon.c index 480c80b..c303709 100644 --- a/TSCP/src/APP/ciapp/ParsePack/ParsePackCommon.c +++ b/TSCP/src/APP/ciapp/ParsePack/ParsePackCommon.c @@ -524,7 +524,6 @@ UINT8 SwitchMaskManage(UINT8 MaskType, UINT16 DeviceId, UINT16 MaskId, UINT8* da UINT16 indexFind = 0U; UINT8 devBelongThisLine = 0U; UINT8 switchBoardNum = 0U; - UINT8 switchStateCheck = CI_ERROR; switchLockStatus = GetSwitchLockStatus(DeviceId); @@ -1178,6 +1177,42 @@ UINT8 PhySectionMaskManage(UINT8 MaskType, UINT16 DeviceId, UINT16 MaskId, UINT8 ; } break; + case MASK_TYPE_PHYSECTION_INTRUSION: + /* 物理区段侵限状态码位 */ + phyIntruSecVainCheck = PhysicalIntruSecVainCheck(DeviceId); + if (CI_SUCCESS == phyIntruSecVainCheck) + { + /*未侵限,发1*/ + SetMaskValue(MaskId, dataBuf); + } + else + { + /*侵限,发0*/ + } + break; + case MASK_TYPE_PHYSECTION_ATS_FLOCK: + /* 物理区段由ATS封锁状态码位 */ + /*封锁状态码位(ATS设置) 封锁发0 未封锁以及SPKS命令封锁发1*/ + phySecState = GetPhySecFLockState(DeviceId); + if (PHYSICAL_SECTION_FLOCK_NO != phySecState) + { + phySecLockType = GetPhySecFLockType(DeviceId); + if (PHY_SEC_FLOCK_TYPE_SPKS != phySecLockType) + { + /*除了SPKS封锁 都发0*/ + } + else + { + /*SPKS命令的封锁 发1*/ + SetMaskValue(MaskId, dataBuf); + } + } + else + { + /*未封锁 发1*/ + SetMaskValue(MaskId, dataBuf); + } + break; default: returnValue = CI_ERROR; @@ -1204,13 +1239,16 @@ UINT8 LogicSectionMaskManage(UINT8 MaskType, UINT16 DeviceId, UINT16 MaskId, UIN UINT16 logLockBelongRoute = 0U;/*逻辑区段锁闭所属进路*/ UINT16 logProtectLockRoute = 0U;/*逻辑区段防护锁闭所属进路*/ UINT8 chJumpLockState = 0U;/*逻辑区段锁闭状态*/ - UINT8 cLogArbState = 0U; /* 逻辑区段ARB状态 */ + UINT8 cLogCbtcArbState = 0U; /* 逻辑区段CBTC_ARB状态 */ + UINT8 cLogPbTacsArbState = 0U; /* 逻辑区段PB_TACS_ARB状态 */ UINT8 chLogSecLockDirOpposedFlag = CI_ERROR;/*逻辑区段锁闭方向是否取反标志*/ UINT8 cLogSpksFlockState = 0U; /* 逻辑区段SPKS封锁状态 */ UINT8 cLogSecLogicLockState = LOG_SECTION_LOCK_NO; /*逻辑区段逻辑锁闭状态*/ UINT8 cLogSecLockDir = CI_SYSTEM_DIRECTION_NONE; /*逻辑区段锁闭方向*/ UINT8 chLogSecBelLogRouteSum = 0U;/*逻辑区段所属逻辑进路数目*/ UINT8 chLogSecEmergXianSu = 0U;/*逻辑区段紧急临时限速状态*/ + UINT8 chRcWorkMode = 0U; /*RC工作模式*/ + switch (MaskType) { case MASK_TYPE_LOGICSECTION_UTOCCUPY: @@ -1364,15 +1402,33 @@ UINT8 LogicSectionMaskManage(UINT8 MaskType, UINT16 DeviceId, UINT16 MaskId, UIN SetMaskValue(MaskId, dataBuf); } break; - case MASK_TYPE_LOGICSECTION_ARB: - /* 逻辑区段ARB状态 */ - cLogArbState = GetLgcArbState(DeviceId); - /*区段ARB*/ - if (LGC_SECTION_ARB_YES == cLogArbState) + case MASK_TYPE_LOGSEC_CBTC_ARB: + /* 逻辑区段CBTC_ARB状态 */ + cLogCbtcArbState = GetLogSecCbtcArbState(DeviceId); + /*当前系统为CI,获取逻辑区段ARB状态*/ + if (LGC_SECTION_ARB_YES == cLogCbtcArbState) { /*设置码位为1*/ SetMaskValue(MaskId, dataBuf); } + else + { + ; + } + break; + case MASK_TYPE_LOGSEC_PB_TACS_ARB: + /* 逻辑区段PC_TACS_ARB状态 */ + cLogPbTacsArbState = GetLogSecPbTacsArbState(DeviceId); + /*当前系统为RC,获取逻辑区段ARB状态*/ + if (LGC_SECTION_ARB_YES == cLogPbTacsArbState) + { + /*设置码位为1*/ + SetMaskValue(MaskId, dataBuf); + } + else + { + ; + } break; case MASK_TYPE_LOGICSECTION_SPKS_FLOCK: /* 逻辑区段SPKS封锁状态 */ @@ -1387,7 +1443,7 @@ UINT8 LogicSectionMaskManage(UINT8 MaskType, UINT16 DeviceId, UINT16 MaskId, UIN /*设置码位为1*/ SetMaskValue(MaskId, dataBuf); } - + break; case MASK_TYPE_LOGICSECTION_EMERG_XIANSU: /* 逻辑区段紧急临时限速状态 */ @@ -1906,11 +1962,10 @@ UINT8 PlatMaskManage(UINT8 MaskType, UINT16 DeviceId, UINT16 MaskId, UINT8* data UINT16 wRtnIndicatorDevId = 0U;/*无人折返报警灯设备ID*/ UINT8 chNonRrnAdhesionState = 0U;/*无人折返按钮粘连状态*/ UINT8 cEsbCutErrFlag = ESB_ERROR_FLAG_NO; /*紧急关闭旁路按钮故障标志*/ - UINT8 cPsdExceptOpenState = 0U; /*屏蔽门异常打开状态*/ + UINT8 cPsdExceptState = 0U; /*屏蔽门异常状态*/ UINT8 chJXTCMutualLockFaultState = 0U; /*间隙探测按钮故障状态*/ UINT8 chIBPBtnState = 0U; /*IBP按钮状态*/ UINT8 chIBPBtnFaultState = 0U; /*IBP按钮故障状态*/ - UINT8 chJXTCState = 0U; /*间隙探测状态*/ UINT8 cEsbCutBtnState = 0U; /*紧急关闭旁路按钮激活状态*/ UINT8 cOnePlatEsbState = 0U; /*同站紧急按钮激活状态*/ UINT8 cOnePlatEsbCutState = 0U; /*同站紧急旁路按钮激活状态*/ @@ -2308,15 +2363,15 @@ UINT8 PlatMaskManage(UINT8 MaskType, UINT16 DeviceId, UINT16 MaskId, UINT8* data /*视频清客驱动状态为无人或者无效,红灯码位无效*/ } break; - case MASK_TYPE_PSD_EXCEPT_OPEN: /*站台屏蔽门异常打开状态码位-给ZC/ATS用*/ - cPsdExceptOpenState = GePsdExceptOpenState(DeviceId); - if (PSD_EXCEPT_OPEN_NO == cPsdExceptOpenState) + case MASK_TYPE_PSD_EXCEPT: /*站台屏蔽门异常状态码位-给ATS/ZC用*/ + cPsdExceptState = GePsdExceptState(DeviceId); + if (PSD_EXCEPT_NO == cPsdExceptState) { - SetMaskValue(MaskId, dataBuf); /*PSD未异常打开,码位组1*/ + SetMaskValue(MaskId, dataBuf); /*PSD未异常,码位组1*/ } else { - /*PSD异常打开,码位组0*/ + /*PSD异常,码位组0*/ } break; case MASK_TYPE_PSD_JXTCPANGLU_FAULT: @@ -4833,6 +4888,7 @@ UINT8 ParasePlantCCUHeartFrame(UINT8* dataBuf) UINT16 curCoup = 0U; UINT32 tempera = 0U; UINT8 flagEEPROM = 0U; + UINT32 ccuSyn = 0u;/*通控请求序列号*/ UINT32 crcRecv = 0U; /*接收到平台心跳帧*/ @@ -4874,6 +4930,9 @@ UINT8 ParasePlantCCUHeartFrame(UINT8* dataBuf) /*EEPROM存储检验*/ flagEEPROM = dataBuf[ii]; ii += 1u; + /*通控请求序列号*/ + ccuSyn = LongFromChar(&dataBuf[ii]); + ii += 4u; /*CRC校验码*/ crcRecv = LongFromChar(&dataBuf[ii]); /*获取CRC*/ ii += 4u; @@ -4883,7 +4942,7 @@ UINT8 ParasePlantCCUHeartFrame(UINT8* dataBuf) { /*计算CRC校验码,除长度2和CRC4*/ - crcCheck = Tioc_PlatCommonCrc32(&dataBuf[2], 22U); + crcCheck = Tioc_PlatCommonCrc32(&dataBuf[2], 26U); if (crcCheck == crcRecv) @@ -4974,6 +5033,7 @@ UINT8 ParasePlantSEBHeartFrame(UINT8* dataBuf) UINT8 boardSEBId = 0U;/*扩展板ID */ UINT16 dataLengthRcv = 0U; /*帧长度*/ + UINT32 sebSyn = 0u; /*串口请求序列号*/ UINT32 crcRecv = 0U; /*CRC校验码*/ UINT32 rcvCyc = 0U; /*周期号*/ /*接收到平台心跳帧*/ @@ -4997,17 +5057,20 @@ UINT8 ParasePlantSEBHeartFrame(UINT8* dataBuf) /*数据内容 3字节*/ ii += 5U; + /*串口请求序列号*/ + sebSyn = LongFromChar(&dataBuf[ii]); + ii += 4U; /*CRC校验码*/ crcRecv = LongFromChar(&dataBuf[ii]); /*获取CRC*/ ii += 4u; - /*长度校验*/ /*总长度16字节*/ + /*长度校验*/ /*总长度20字节*/ if (dataLengthRcv == ii - 2U) { /*计算CRC校验码,除长度2和CRC4*/ - crcCheck = Tioc_PlatCommonCrc32(&dataBuf[2], 10U); + crcCheck = Tioc_PlatCommonCrc32(&dataBuf[2], 14U); if (crcCheck == crcRecv) diff --git a/TSCP/src/APP/ciapp/ParsePack/ParsePackManage.c b/TSCP/src/APP/ciapp/ParsePack/ParsePackManage.c index 9513035..812b205 100644 --- a/TSCP/src/APP/ciapp/ParsePack/ParsePackManage.c +++ b/TSCP/src/APP/ciapp/ParsePack/ParsePackManage.c @@ -989,7 +989,7 @@ UINT8 PackCiToOtherSysData(void) reVal = PackCiToCiData(cLocalDevType, deviceIdBuf[ii]); if (CI_ERROR == reVal) { - debug_infor_printf((const)"\nPackCiToCiData Error: DstDev[0x%x]", (UINT16)(cLocalDevType) +(UINT16)(deviceIdBuf[ii])); /*组包错误*/ + debug_infor_printf((const)"\nPackCiToCiData Error: DstDev[0x%x]", (UINT16)(cLocalDevType * 256U) + (UINT16)(deviceIdBuf[ii])); /*组包错误*/ } else { @@ -1002,7 +1002,7 @@ UINT8 PackCiToOtherSysData(void) reVal = PackHLHTCiToCiData(deviceIdBuf[ii]); if (CI_ERROR == reVal) { - debug_infor_printf((const)"\nPackHLHTCiToCiData Error: DstDev[0x%x]", (UINT16)(cLocalDevType)+(UINT16)(deviceIdBuf[ii]));/*组包错误*/ + debug_infor_printf((const)"\nPackHLHTCiToCiData Error: DstDev[0x%x]", (UINT16)(cLocalDevType * 256U) +(UINT16)(deviceIdBuf[ii]));/*组包错误*/ } else { @@ -1017,11 +1017,11 @@ UINT8 PackCiToOtherSysData(void) } - cSysType = GetSystemWorkType(); + cSysType = GetSystemWorkType(); cLocalCiType = GetLocalCiType(); - if ((SYSTEM_WORK_MODE_ALL == cSysType) && ((CI_TYPE_ZX == cLocalCiType) || (CI_TYPE_SCX == cLocalCiType))) + if (SYSTEM_WORK_MODE_ALL == cSysType) { - /*****双系统正线或试车线,组相邻控区另一个设备数据*****/ + /*****双系统,组相邻控区另一个设备数据*****/ if (CI_SYSTEM_TYPE_CI == cLocalDevType) { cNearOtherDevType = CI_SYSTEM_TYPE_RC; @@ -1048,7 +1048,7 @@ UINT8 PackCiToOtherSysData(void) reVal = PackCiToCiData(cNearOtherDevType, deviceIdBuf[ii]); if (CI_ERROR == reVal) { - debug_infor_printf((const)"\nPackCiToCiData Error: DstDev[0x%x]", (UINT16)(cNearOtherDevType) +(UINT16)(deviceIdBuf[ii])); /*组包错误*/ + debug_infor_printf((const)"\nPackCiToCiData Error: DstDev[0x%x]", (UINT16)(cNearOtherDevType * 256U) +(UINT16)(deviceIdBuf[ii])); /*组包错误*/ } else { @@ -1068,7 +1068,7 @@ UINT8 PackCiToOtherSysData(void) /*组本控区CI-RC数据*/ cStartLockFlag = GetStartLockFlag(); - if (CI_START_LOCK_NO == cStartLockFlag) + if ((CI_START_LOCK_NO == cStartLockFlag) && ((CI_TYPE_ZX == cLocalCiType) || (CI_TYPE_SCX == cLocalCiType))) { /*双系统下的正线和试车线才进行本控区CI-RC的组包*/ if (CI_SYSTEM_TYPE_CI == cLocalDevType) diff --git a/TSCP/src/APP/ciapp/ParsePack/ParsePackOcData.c b/TSCP/src/APP/ciapp/ParsePack/ParsePackOcData.c index 0482f13..622e8c6 100644 --- a/TSCP/src/APP/ciapp/ParsePack/ParsePackOcData.c +++ b/TSCP/src/APP/ciapp/ParsePack/ParsePackOcData.c @@ -94,7 +94,10 @@ UINT16 ConvertSigDrvColorToSigDrvCmd(const UINT16 signalId, const UINT8 drvColor UINT8 ocHasBlue = 0u; UINT8 funSwitchGreenYellow = GetCiFunctionSwitchConfig(CI_FUNCTION_SWITCH_SHOW_SIGNAL_GreenYellow);/*显示绿黄功能开关是否打开*/ UINT8 funSwitchALLCloseUseBlue = GetCiFunctionSwitchConfig(FUNC_SWITCH_ZX_ALLCLOSE_USEBLUE);/*杭德正线灭灯均转蓝灯功能开关*/ - UINT8 ciType = GetLocalCiType(); + UINT8 ciType = 0U; + UINT8 chSigBelongRtuId = 0U; + chSigBelongRtuId = GetSignalBelongVirCiId(signalId); + ciType = GetLocalVirCiType(chSigBelongRtuId); switch (drvColor) { case SIGNAL_DRIVECOLOUR_RED:/*红*/ @@ -247,6 +250,15 @@ UINT8 PackCiToOcData( UINT8 deviceId) UINT16 deviceSum = 0u; UINT16 kqChangeCommand = 0u;/*控权切换命令*/ UINT8 chCurSystemAreaState = 0u; /*主备用模式*/ + UINT8 chMainCotrolOCId = 0U; + UINT8 chControlCmd = 0U; + UINT8 chControlCmdNum = 0u; + UINT16 cmdIndex = 0u; + UINT8 chOcOutControlCmd = 0u; + UINT8 chOcFindPostionCmd = 0u; + UINT8 chLocalCiOCSswitch = 0u; + + chLocalCiOCSswitch = GetLocalCiOCSswitch(); #if 0 QueueClear(CiToOcDataQueue); /*清队列*/ #endif @@ -325,7 +337,25 @@ UINT8 PackCiToOcData( UINT8 deviceId) ShortToChar(pOcData->OcDevices[kk].DeviceId, &Ci2OcDataBuffer[ii]); ii += 2u; drvPos = GetSwitchDrivePostion(pOcData->OcDevices[kk].DeviceId); - drvCmd = ConvertSwitchDrvPosToSwDrvCmd(drvPos); + chMainCotrolOCId = GetSwitchMainCotrolOCId(pOcData->OcDevices[kk].DeviceId); + + + if ((chMainCotrolOCId == pOcData->OcId)||(OC_S_OFF == chLocalCiOCSswitch)) + {/*当前有主控OC或OC-S功能关闭*/ + drvCmd = ConvertSwitchDrvPosToSwDrvCmd(drvPos); + } + else + {/*有OC-S且当前无主控,需寻表*/ + drvCmd = OC_SWITCH_DRIVE_POS_KEEP;/*保持*/ + + chOcOutControlCmd = GetSwitchThisOcOutControlCmd(pOcData->OcDevices[kk].DeviceId, pOcData->OcId); + + if (MAIN_CONTROL == chOcOutControlCmd) + { + chOcFindPostionCmd = GetSwitchThisOcFindPostionCmd(pOcData->OcDevices[kk].DeviceId, pOcData->OcId); + drvCmd = ConvertSwitchFindPosToSwFindCmd(chOcFindPostionCmd); + } + } ShortToChar(drvCmd, &Ci2OcDataBuffer[ii]); ii += 2u; break; @@ -636,6 +666,50 @@ UINT8 PackCiToOcData( UINT8 deviceId) ii += ciSorToOcIdx; } + if (CI_SUCCESS == retVal) + { + cmdIndex = ii; + ii += 1u; + for (kk = 0u; kk < pOcData->OcDeviceNum; kk++)/*遍历设备*/ + { + switch (pOcData->OcDevices[kk].DeviceType) + { + case CI_DEVICE_TYPE_SWITCH:/*道岔设备*/ + { + ShortToChar(pOcData->OcDevices[kk].DeviceId, &Ci2OcDataBuffer[ii]); + 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)) + { + Ci2OcDataBuffer[ii] = chControlCmd; + } + else + { + Ci2OcDataBuffer[ii] = STANDBY_CONTROL; + } + } + else + {/*OC-S开关关闭*/ + Ci2OcDataBuffer[ii] = NO_CONTROL_FUN; + } + ii += 1u; + + chControlCmdNum++; + break; + } + default: + {/*无执行*/ + } + } + } + + Ci2OcDataBuffer[cmdIndex]= chControlCmdNum;/*设备数量*/ + } + + + #if 0 /*屏蔽型式实验,以后有需要再打开*/ if (curCycleNum == xingshiTestStartCycle && 1 == xingshiTestStart) { @@ -1124,6 +1198,10 @@ 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 chSwitchBelongOThisOCRet = 0U; + + (void)CommonMemSet(pTmpOcToCiData, (UINT32)sizeof(OcToCiOriginDataStruct),0U, (UINT32)sizeof(OcToCiOriginDataStruct));/*清内存,防止脏数据*/ chMainWorckMode = GetLocalCiBackUpPattern(); dwUpToMainCyc = GetSystemUpdateMainUseCycNum(); @@ -1253,9 +1331,9 @@ UINT8 ParseOcToCiDataFrame(const UINT8* dataBuf, const UINT16 dataLength,const U { tmpDeviceId = ShortFromChar(&dataBuf[ii]); /*设备Id 2B*/ ii += 2u; - chDevBelongOC = (UINT8)GetSwitchBelongOcId(tmpDeviceId); + chSwitchBelongOThisOCRet = (UINT8)GetSwitchWhetherBelongThisOc(tmpDeviceId, systemId); chDevBelongCI = GetSwitchBelongCiId(tmpDeviceId); - if ((chDevBelongOC != systemId)||(chDevBelongCI != localCiId)) + if ((CI_SUCCESS != chSwitchBelongOThisOCRet)||(chDevBelongCI != localCiId)) { retVal = CI_ERROR; debug_infor_printf((const)"Swicth devId:%d Belong OC/CI Error\n", tmpDeviceId); @@ -1319,20 +1397,39 @@ UINT8 ParseOcToCiDataFrame(const UINT8* dataBuf, const UINT16 dataLength,const U { switchBoardCheck = CI_SUCCESS; /*存在正常板卡*/ } - } - pTmpOcToCiData->OcDevices[j].DeviceType = tmpDeviceType; /*设备类型 1B*/ - pTmpOcToCiData->OcDevices[j].DeviceId = tmpDeviceId; /*设备Id 2B*/ - pTmpOcToCiData->OcDevices[j].DeviceState = tmpDeviceState; /*设备状态 1B*/ + dwMainStandbyState = dataBuf[ii++];/*板卡主控状态*/ + if ((MAIN_CONTROL == dwMainStandbyState) || (STANDBY_CONTROL == dwMainStandbyState) || (NO_CONTROL_FUN == dwMainStandbyState)) + { + pTmpOcToCiData->OcDevices[j].MainStandbyState[k] = dwMainStandbyState; + + } + else + { + retVal = CI_ERROR; + debug_infor_printf((const)"Swicth devId %d Board ControlMode ill, mode: %d\n", tmpDeviceId, dwMainStandbyState); + break; + } - if (CI_SUCCESS == switchBoardCheck) /*0为正常 存在正常板卡*/ + } + if (CI_SUCCESS == retVal) { + pTmpOcToCiData->OcDevices[j].DeviceType = tmpDeviceType; /*设备类型 1B*/ + pTmpOcToCiData->OcDevices[j].DeviceId = tmpDeviceId; /*设备Id 2B*/ pTmpOcToCiData->OcDevices[j].DeviceState = tmpDeviceState; /*设备状态 1B*/ - } - else - { - /*发送ats报警*/ + if (CI_SUCCESS == switchBoardCheck) /*0为正常 存在正常板卡*/ + { + pTmpOcToCiData->OcDevices[j].DeviceState = tmpDeviceState; /*设备状态 1B*/ + } + else + { + /*发送ats报警*/ + + } } + + + } else { @@ -2072,10 +2169,10 @@ INT16 GetIndexBySignalId(UINT16 sigId) /* * 功能描述: 通过道岔id获取索引 -* 参数说明: void -* 返回值 : void +* 参数说明: UINT16 swId 道岔ID,UINT8 ocId OCID +* 返回值 : 索引 */ -INT16 GetIndexBySwitchId(UINT16 swId) +INT16 GetIndexBySwitchId(UINT16 swId,UINT16 ocId) { INT16 retIndex = -1; @@ -2083,7 +2180,7 @@ INT16 GetIndexBySwitchId(UINT16 swId) for (i=0u;iDeviceId); + ind = GetIndexBySwitchId(pOcDevice->DeviceId, pOcDevice->OcId); if ((ind >=0) && (OC_DEVICE_TYPE_SWITCH == pOcDevice->DeviceType)) { if ((m_Switches[ind].OcId == pOcDevice->OcId) && @@ -2302,6 +2414,8 @@ void ConvertOcOriginDataToOcSigSwDev(UINT8 devId) { m_Switches[ind].BoardAddr[k] = pOcDevice->BoardAddr[k]; m_Switches[ind].BoardState[k] = pOcDevice->BoardState[k]; + + } /* 保存数据 */ m_Switches[ind].chSwitchIncldeZzjNum = pOcDevice->chSwitchIncldeZzjNum; @@ -2309,6 +2423,36 @@ void ConvertOcOriginDataToOcSigSwDev(UINT8 devId) { m_Switches[ind].szSwitchIncldeZzjState[k] = pOcDevice->szSwitchIncldeZzjState[k]; } + + for (k = 0U; k < MAX_OC_SWITCH_INCLUDE_BOARD_NUM; k++) + {/*给所有OC设置主控状态*/ + m_Switches[ind].MainStandbyState[k] = pOcDevice->MainStandbyState[k]; + } + + chSwitchszPlusBoxId = GetSwitchszPlusBoxId(m_Switches[ind].DeviceId, 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); + } + else + { + SetSwitchOcPlusBoxSateState(m_Switches[ind].DeviceId, m_Switches[ind].OcId, SWITCH_BOX_FAULT); + } + break; + } + } + + /*将板卡故障状态导入*/ + 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]); + + } + } else { @@ -2352,6 +2496,10 @@ void ConvertOcOriginDataToOcSigSwDev(UINT8 devId) } + + + + } else { @@ -2867,6 +3015,38 @@ UINT8 OcInputSignalStateCheck(const UINT8 chInput) } return retVal; } +/* +* 功能描述: 把道岔寻表状态转化为道岔寻表命令 +* 参数说明: +* 输入参数: +* UINT8 drvColor:道岔寻表位置 +* 返回值 : 0:道岔驱动命令转化失败 +* 1:道岔寻表命令 +* add by mpt 20260330 +*/ +UINT16 ConvertSwitchFindPosToSwFindCmd(UINT8 chFindPos) +{ + UINT16 retDrvCmd = 0u; + switch (chFindPos) + { + case FIND_DINGWEI_CMD: + retDrvCmd = OC_SWITCH_FIND_DINGWEI; + break; + case FIND_FANWEI_CMD: + retDrvCmd = OC_SWITCH_FIND_FANWEI; + break; + case INIT_FIND_CMD: + retDrvCmd = OC_SWITCH_ININ_FIAND; + break; + case NO_FIND_CMD: + retDrvCmd = OC_SWITCH_DRIVE_POS_KEEP; + break; + default: + retDrvCmd = OC_SWITCH_DRIVE_POS_KEEP; + break; + } + return retDrvCmd; +} diff --git a/TSCP/src/APP/ciapp/ParsePack/ParsePackOcData.h b/TSCP/src/APP/ciapp/ParsePack/ParsePackOcData.h index acf3995..08b273a 100644 --- a/TSCP/src/APP/ciapp/ParsePack/ParsePackOcData.h +++ b/TSCP/src/APP/ciapp/ParsePack/ParsePackOcData.h @@ -55,7 +55,7 @@ #define MAX_OC_PLUS_BOX_NUM ((UINT16)3) /*一个OC支持最大执行电插箱(可达最大值)*/ #define MAX_OC_DEVICE_SWAP_MAX ((UINT16)83) /*一个OC最大切系板卡数量(MAX_OC_DEVICE_NUM/2)(不可达最大值) */ #define MAX_OC_SWITCH_INCLUDE_ZZJ_NUM ((UINT16)10) /*一个道岔支持最大转辙机个数(可达最大值)*/ -#define MAX_OC_SWITCH_INCLUDE_BOARD_NUM ((UINT8)10) /*一个道岔支持最大板卡数量(不可达最大值)*/ + #define Max_OC_GD_NUM ((UINT16)252) /*一个oc支持最大多少个轨道区段(不可达最大值)*/ #define MAX_OC_DEVICE_PSD_MAX ((UINT8)2) /*一个OC最大屏蔽门数量(可达最大值)*/ @@ -95,6 +95,7 @@ typedef struct s_OcDevState UINT8 BoardNum; /*板卡数量*/ UINT8 BoardAddr[MAX_OC_SWITCH_INCLUDE_BOARD_NUM]; /*板卡地址*/ UINT8 BoardState[MAX_OC_SWITCH_INCLUDE_BOARD_NUM]; /*板卡状态 正常0x0000 错误发错误码*/ + UINT8 MainStandbyState[MAX_OC_SWITCH_INCLUDE_BOARD_NUM]; /*主备状态*/ }OcDeviceStruct; typedef struct s_OcDoBoardData @@ -436,12 +437,10 @@ INT16 GetIndexBySignalId(UINT16 sigId); /* * 功能描述: 通过道岔id获取索引 -* 参数说明: -* Id:道岔索引 -* 返回值 : -* Int16:道岔Id +* 参数说明: UINT16 swId 道岔ID,UINT8 ocId OCID +* 返回值 : 索引 */ -INT16 GetIndexBySwitchId(UINT16 swId); +INT16 GetIndexBySwitchId(UINT16 swId, UINT16 ocId); /* * 功能描述: 通过轨道id获取索引 @@ -513,7 +512,16 @@ UINT8 OcInputStateCheck(const UINT8 chInput, const UINT8 chOtherValid); * 返回值 : CI_ERROR CI_SUCCESS */ UINT8 OcInputSignalStateCheck(const UINT8 chInput); - +/* +* 功能描述: 把道岔寻表状态转化为道岔寻表命令 +* 参数说明: +* 输入参数: +* UINT8 drvColor:道岔寻表位置 +* 返回值 : 0:道岔驱动命令转化失败 +* 1:道岔寻表命令 +* add by mpt 20260330 +*/ +UINT16 ConvertSwitchFindPosToSwFindCmd(UINT8 chFindPos); #ifdef __cplusplus } #endif diff --git a/TSCP/src/APP/ciapp/ParsePack/ParsePackVobcData.c b/TSCP/src/APP/ciapp/ParsePack/ParsePackVobcData.c index f9ab6b0..2b35454 100644 --- a/TSCP/src/APP/ciapp/ParsePack/ParsePackVobcData.c +++ b/TSCP/src/APP/ciapp/ParsePack/ParsePackVobcData.c @@ -317,7 +317,7 @@ static UINT8 PassWashMachineRequestCheck(UINT8 Data); * CI_SUCCESS 成功 * by cgh 20230802 */ -static UINT8 PackCiToIvocReqAlignmentInfo(UINT8* pDataBuf, UINT16* wDataLength, UINT16 wTrnId); +static UINT8 PackCiToIvocReqAlignmentInfo(UINT8* pDataBuf, UINT16* wDataLength); /* * 功能描述: 组包Ci到Ivoc申请解锁保护区段信息 @@ -456,7 +456,110 @@ static UINT8 PackRcToIvocDataHLHTHeart(const UINT8 vobcId, const UINT16 logId); * 非-1 为站台关联ESB数量 */ static INT8 GetVobcSendPsdRelatESBId(const UINT16 psd1Id, const UINT16 psd2Id, UINT16* pEsbIdBuf); +/* +* 功能描述: 组下一CI Id +* 参数说明: UINT8* CiToVobcDataBuffer 存放信息的buffer +* UINT16* ii 偏移量 +* VobcToCiDataStruct* vobcToCiDataStru VOBC-CI数据 +* 返回值 :无 +* Create: lyj 20260314 +*/ +static void PackNextCiId(UINT8* CiToVobcDataBuffer, UINT16* ii, VobcToCiDataStruct* vobcToCiDataStru); +/* +* 功能描述: 组移动授权信息 +* 参数说明: UINT8* CiToVobcDataBuffer 存放信息的buffer +* UINT16* ii 偏移量 +* VobcToCiDataStruct* vobcToCiDataStru VOBC-CI数据 +* 返回值 :移动授权计算结果 +* Create: lyj 20260314 +*/ +static UINT8 PackMoveAuthorityData(UINT8* CiToVobcDataBuffer, UINT16* ii, VobcToCiDataStruct* vobcToCiDataStru); +/* +* 功能描述: 获取路径道岔信息 +* 参数说明:UINT16* pPathTempBuf 存放信息的buffer +* const UINT16 wTrainId 列车ID +* 返回值 :设备数量 +* Create: lyj 20260314 +*/ +static UINT8 GetPathSwitchData(UINT16* pPathTempBuf, const UINT16 wTrainId); +/* +* 功能描述: 获取路径屏蔽门信息 +* 参数说明: UINT16* pPathTempBuf 存放信息的buffer +* const UINT16 wTrainId 列车ID +* 返回值 :设备数量 +* Create: lyj 20260314 +*/ +static UINT8 GetPathPsdData(UINT16* pPathTempBuf, const UINT16 wTrainId); +/* +* 功能描述: 获取路径紧急停车按钮信息 +* 参数说明: UINT16* pPathTempBuf 存放信息的buffer +* const UINT16 wTrainId 列车ID +* 返回值 :设备数量 +* Create: lyj 20260314 +*/ +static UINT8 GetPathEsbData(UINT16* pPathTempBuf,const UINT16 wTrainId); +/* +* 功能描述: 获取路径SPKS信息 +* 参数说明: UINT16* pPathTempBuf 存放信息的buffer +* const UINT16 wTrainId 列车ID +* 返回值 :设备数量 +* Create: lyj 20260316 +*/ +static UINT8 GetPathSpksData(UINT16* pPathTempBuf, const UINT16 wTrainId); +/* +* 功能描述: 获取路径限速信息 +* 参数说明: +* const UINT16 wTrainId 列车ID +* 返回值 :设备数量 +* Create: lyj 20260316 +*/ +static UINT8 GetPathXianSuData(const UINT16 wTrainId); +/* +* 功能描述: 获取路径防淹门信息 +* 参数说明: UINT16* pPathTempBuf +* const UINT16 wTrainId 列车ID +* 返回值 :设备数量 +* Create: lyj 20260316 +*/ +static UINT8 GetPathFloodGateData(UINT16* pPathTempBuf, const UINT16 wTrainId); +/* +* 功能描述: 获取路径目的地属性 +* 参数说明: UINT8 chRouteNum,进路数量 +* UINT16* pRouteBuf,进路数组 +* 返回值 :设备数量 +* Create: lyj 20260316 +*/ +static UINT8 GetDestinationType(UINT8 chRouteNum, UINT16* pRouteBuf); + +/* +* 功能描述:组包Ci到Ivoc通信故障RC数目 +* 参数说明: UINT8* dataBuf, 数据缓冲区 +* UINT16 *dataLength, 数据长度 输出参数 +* 返 回 值:CI_ERROR 0 失败 +* CI_SUCCESS 1 成功 +* by cgh 20260327 +*/ +static UINT8 PackCiToIvocComErrRcInfo(UINT8* pDataBuf, UINT16* wDataLength); + +/* +* 功能描述: 组互联互通RC->VOBC状态数据 +* 参数说明: VobcToRcDataStruct * pstVobcToRcDataStru Vobc给RC的信息结构体 +* 返回值 : 0:组数据失败 +* 1:组数据成功 +* by cgh 20260328 +*/ +static UINT8 PackRcToVobcStateData(VobcToRcDataStruct* pstVobcToRcDataStru); + +/* +* 功能描述:组包RC到VOBC的ARB状态信息 +* 参数说明: UINT8* dataBuf, 数据缓冲区 +* UINT16 *dataLength, 数据长度 输出参数 +* 返 回 值:CI_ERROR 0 失败 +* CI_SUCCESS 1 成功 +* by cgh 20260328 +*/ +static UINT8 PackRcToVobcArbState(UINT8* pDataBuf, UINT16* wDataLength); /*解析组包使用*/ VobcToCiDataStruct VobcToCiDataStru[VOBC_TO_CI_SUM_MAX] = {0u};/*与联锁通信的Vobc信息,本变量在CI模式下,存储510车的信息。在RC模式下,仅存储车车系统的IVOC车信息。*/ @@ -622,7 +725,6 @@ UINT8 ParseVobcBackUpToCiDataFrame(const UINT8* dataBuf, const UINT16 dataLength UINT8 cmdType = 0U; /*屏蔽门控制信息,0x55开,0xAA关*/ UINT8 funRet = 0U; UINT8 galSaveTag = 0U; /*互联互通头保存标志*/ - UINT32 hlhtStationId = 0U; /*获取互联互通站台ID*/ UINT32 transmitBadEnsureTime = 0U; /*通信失效时间*/ UINT16 TrainSignalId = 0U; UINT8 errorNum = 0U; @@ -1448,29 +1550,33 @@ static void CopyVobcToCiMsg(const VobcToCiDataStruct* srcMsg,VobcToCiDataStruct* */ static UINT8 ParseVobcToCiDataFrameHLHT(const UINT8* dataBuf, const UINT16 dataLength, const UINT8 systemId, VobcToCiDataStruct* vobcToCiDataStru, UINT8* saveGalHead,const UINT16 logId) { - UINT8 cmdType = 0u; /*屏蔽门命令类型*/ - UINT8 trainStopSteadyState = 0u; /*列车停稳状态*/ - UINT8 psdSum = 0u; - UINT8 trainDirection = 0u; /*列车方向*/ - UINT8 ii = 0u; /*索引管理*/ - UINT8 jj = 0u; - UINT8 retVal = CI_SUCCESS; - UINT8 retValue = 0u; - UINT16 psdId = 0u; /*PSD的ID*/ - UINT16 appInfoType = 0u; /*应用信息类型*/ - UINT32 psdIdIntConnt = 0u; /*互联互通PSD的ID*/ - UINT32 trackSectionId = 0u; /*轨道区段ID*/ - UINT32 curntCycleNo = 0u; /*当前周期号*/ - UINT16 vobcName = 0u; /*VOBC设备名称:类型+ID*/ - UINT16 ciName = 0u; /*联锁设备名称:类型+ID*/ - UINT8 localCiId = GetSystemParaLocalCiId();/*联锁ID*/ - UINT32 errCode = 0u; - HLHTGALInfoStruct hlhtGalHead = { 0u }; + UINT8 cmdType = 0U; /*屏蔽门命令类型*/ + UINT8 trainStopSteadyState = 0U; /*列车停稳状态*/ + UINT8 psdSum = 0U; + UINT8 trainDirection = 0U; /*列车方向*/ + UINT8 ii = 0U; /*索引管理*/ + UINT8 jj = 0U; + UINT8 retVal = CI_ERROR; + UINT8 retValue = 0U; + UINT16 psdId = 0U; /*PSD的ID*/ + UINT16 appInfoType = 0U; /*应用信息类型*/ + UINT32 psdIdIntConnt = 0U; /*互联互通PSD的ID*/ + UINT32 trackSectionId = 0U; /*轨道区段ID*/ + UINT32 curntCycleNo = 0U; /*当前周期号*/ + UINT16 vobcName = 0U; /*VOBC设备名称:类型+ID*/ + UINT16 ciName = 0U; /*联锁设备名称:类型+ID*/ + UINT8 localCiId = GetSystemParaLocalCiId(); /*联锁ID*/ + UINT32 errCode = 0U; + HLHTGALInfoStruct hlhtGalHead = { 0U }; INT32 vobcInfoRemainValidiy = 0; UINT8 headRet = HLHT_HEAD_ERROR;/*互联互通检查结果*/ UINT8 cTempPsdCmdCode = 0U; - UINT32 signalId = 0u; /*VOBC->CI信号机ID*/ - UINT8 ci_vobcPrtclVersion = 0u; + UINT32 signalId = 0U; /*VOBC->CI信号机ID*/ + UINT8 ci_vobcPrtclVersion = 0U; + UINT16 wTmpDataLen = 0U; /*临时长度记录*/ + UINT16 wMsgLen = 0U; /*应用数据长度*/ + UINT32 dwCiAndVobcTransBadTime = 0U; /*ci和VOBC通信中断时间*/ + UINT32 dwAppCycleTime = 0U; /*ci周期*/ ci_vobcPrtclVersion = GetVersionOfVOBCToCI(); vobcName = (CI_SYSTEM_TYPE_VOBC)*256U + systemId; @@ -1509,152 +1615,182 @@ static UINT8 ParseVobcToCiDataFrameHLHT(const UINT8* dataBuf, const UINT16 dataL if (HLHT_HEAD_SUCCESS==headRet) { /*计算消息的时效性*/ - vobcInfoRemainValidiy = HLHTCommonMsgRemainingValidity(GetCiAndVobcTransBadEnsureTime(), curntCycleNo, GetSystemParaAppCycleTime(), hlhtGalHead.recvOppMsgSN, hlhtGalHead.crntOwnMsgSN, hlhtGalHead.preOwnMsgSN, hlhtGalHead.comPeriod); + dwCiAndVobcTransBadTime = GetCiAndVobcTransBadEnsureTime(); + dwAppCycleTime = GetSystemParaAppCycleTime(); + vobcInfoRemainValidiy = HLHTCommonMsgRemainingValidity(dwCiAndVobcTransBadTime, curntCycleNo, dwAppCycleTime, hlhtGalHead.recvOppMsgSN, hlhtGalHead.crntOwnMsgSN, hlhtGalHead.preOwnMsgSN, hlhtGalHead.comPeriod); if (0 < vobcInfoRemainValidiy) { - /*解析应用数据*/ - /*更新接收到上一条消息时的本方周期号*/ - ii += 2u;/*跳过应用报文长度2字节*/ - - appInfoType = ShortFromChar(&dataBuf[ii]);/*应用信息类型,屏蔽门控制信息或者心跳帧信息*/ - ii += 2u; - vobcToCiDataStru->appInfoType = appInfoType; - vobcToCiDataStru->VobcId = systemId; - - vobcToCiDataStru->controlMode = TRAIN_MAIN_MODE;/*适配无主控状态接口*/ -#if 0 - vobcToCiDataStru->vobcInfoStartCycNum = Get2oo2CurCycleNum();/*CI接收到VOBC发送的信息起始周期*/ -#endif - - ii += 2u;/*跳过两个预留字节*/ - - if (VOBC_CI_INFO_TYPE_PSD_CONTROL == appInfoType) - {/*只有当VOBC发送CI的信息类型是屏蔽门控制报文时才继续解析报文信息*/ - vobcToCiDataStru->ComStartCycle = Get2oo2CurCycleNum(); - /*列车运行方向判断*/ - trainDirection = dataBuf[ii]; - ii += 1u; - - if ((TRAIN_DIR_UP == trainDirection) || (TRAIN_DIR_DOWN == trainDirection) || (TRAIN_DIR_DEF == trainDirection)) + if (6U > hlhtGalHead.totalDataLen) + { + retVal = CI_ERROR; + } + else + { + while (wTmpDataLen < hlhtGalHead.totalDataLen) { - vobcToCiDataStru->trainDirection = trainDirection; - } - else - { - retVal = CI_ERROR; - } - - /*列车停稳停准信息判断*/ - if (CI_SUCCESS == retVal) - { - trainStopSteadyState = dataBuf[ii]; - ii += 1u; - - if ((VOBC_CI_STOP_TW == trainStopSteadyState) || (VOBC_CI_STOP_WTW == trainStopSteadyState)) - { - vobcToCiDataStru->trainStopSteadyState = trainStopSteadyState; - vobcToCiDataStru->stopSteadyStartCycNum = Get2oo2CurCycleNum();/*记录收到停稳或未停稳信息的周期*/ - } - else + /*解析应用数据*/ + wMsgLen = ShortFromChar(&dataBuf[ii]);/*应用报文长度2字节*/ + ii += 2U; + if (4U > wMsgLen) { retVal = CI_ERROR; } - } - else - { - } - - trackSectionId = LongFromChar(&dataBuf[ii]);/*获取轨道区段ID*/ - ii += 4u; - vobcToCiDataStru->trackSecID = trackSectionId; - - if (CI_SUCCESS == retVal) - { - vobcToCiDataStru->VobcId = systemId; /*VOBC的ID*/ - vobcToCiDataStru->psdCmdCode = dataBuf[ii++]; /*站台开门码,每个开门码对应CI需要开的一组站台门*/ - /*根据站台开门码获取编组信息,开门码的低5位表示列车实际编组数*/ - - /*因为在关门时VOBC发送车辆编组默认值,所以需要在开门时保存车辆编组数值*/ - cTempPsdCmdCode = 0x1Fu & vobcToCiDataStru->psdCmdCode; - if (0U != cTempPsdCmdCode) /*修缺陷YF0083-682,2023-07-03*/ - { - vobcToCiDataStru->trainEditGroupInfo = cTempPsdCmdCode; - } else { - ;/*不处理*/ - } + retVal = CI_SUCCESS; + wTmpDataLen = wTmpDataLen + wMsgLen + 2U; + appInfoType = ShortFromChar(&dataBuf[ii]);/*应用信息类型*/ + ii += 2U; + + vobcToCiDataStru->VobcId = systemId; + vobcToCiDataStru->controlMode = TRAIN_MAIN_MODE;/*适配无主控状态接口*/ + ii += 2U;/*跳过两个预留字节*/ - psdSum = dataBuf[ii]; - ii += 1u; - - if ((2u == psdSum) || (1u == psdSum) || (0u == psdSum)) - {/*接口定义:屏蔽门数量取值为0或1或2*/ - vobcToCiDataStru->PsdSum = psdSum; /*屏蔽门数量*/ - } - else - { - retVal = CI_ERROR; - } - } - else - { - } - - if (CI_SUCCESS == retVal) - { - for (jj = 0u; jj < 2u; jj++) - { - psdIdIntConnt = LongFromChar(&dataBuf[ii]);/*获取互联互通4字节屏蔽门ID*/ - ii += 4u; - vobcToCiDataStru->PsdData[jj].PsdIdInterConn = psdIdIntConnt; - - /*根据互联互通4字节ID获取屏蔽门ID*/ - retValue = dquQueryInDevIndex(QFUN_IDMAP_PSD_ID, psdIdIntConnt, &psdId); - - if (CI_SUCCESS == retValue) + switch (appInfoType) { - vobcToCiDataStru->PsdData[jj].PsdId = psdId; + case VOBC_CI_INFO_TYPE_PSD_CONTROL: /*解析屏蔽门控制帧*/ + { + vobcToCiDataStru->appInfoType = appInfoType; + vobcToCiDataStru->ComStartCycle = Get2oo2CurCycleNum(); + /*列车运行方向判断*/ + trainDirection = dataBuf[ii]; + ii += 1U; - cmdType = dataBuf[ii];/*获取屏蔽门命令*/ - ii += 1u; - if ((VOBCTOCI_COMMAND_TYPE_PSDOPEN == cmdType) || (VOBCTOCI_COMMAND_TYPE_PSDCLOSE == cmdType) || (VOBCTOCI_COMMAND_TYPE_PSDCHECK_FAOHLHT == cmdType)) /*修缺陷YF0083-682,2023-07-03*/ + if ((TRAIN_DIR_UP == trainDirection) || (TRAIN_DIR_DOWN == trainDirection) || (TRAIN_DIR_DEF == trainDirection)) { - vobcToCiDataStru->PsdData[jj].CmdType = cmdType; - - vobcToCiDataStru->PsdData[jj].CmdStartCycNum = Get2oo2CurCycleNum(); + vobcToCiDataStru->trainDirection = trainDirection; } else { retVal = CI_ERROR; } + + /*列车停稳停准信息判断*/ + if (CI_SUCCESS == retVal) + { + trainStopSteadyState = dataBuf[ii]; + ii += 1U; + + if ((VOBC_CI_STOP_TW == trainStopSteadyState) || (VOBC_CI_STOP_WTW == trainStopSteadyState)) + { + vobcToCiDataStru->trainStopSteadyState = trainStopSteadyState; + vobcToCiDataStru->stopSteadyStartCycNum = Get2oo2CurCycleNum();/*记录收到停稳或未停稳信息的周期*/ + } + else + { + retVal = CI_ERROR; + } + } + else + { + } + + trackSectionId = LongFromChar(&dataBuf[ii]);/*获取轨道区段ID*/ + ii += 4U; + vobcToCiDataStru->trackSecID = trackSectionId; + + if (CI_SUCCESS == retVal) + { + /*vobcToCiDataStru->VobcId = systemId; */ /*VOBC的ID*/ + vobcToCiDataStru->psdCmdCode = dataBuf[ii++]; /*站台开门码,每个开门码对应CI需要开的一组站台门*/ + /*根据站台开门码获取编组信息,开门码的低5位表示列车实际编组数*/ + + /*因为在关门时VOBC发送车辆编组默认值,所以需要在开门时保存车辆编组数值*/ + cTempPsdCmdCode = 0x1FU & vobcToCiDataStru->psdCmdCode; + if (0U != cTempPsdCmdCode) /*修缺陷YF0083-682,2023-07-03*/ + { + vobcToCiDataStru->trainEditGroupInfo = cTempPsdCmdCode; + } + else + { + ;/*不处理*/ + } + + psdSum = dataBuf[ii]; + ii += 1U; + + if ((2U == psdSum) || (1U == psdSum) || (0U == psdSum)) + {/*接口定义:屏蔽门数量取值为0或1或2*/ + vobcToCiDataStru->PsdSum = psdSum; /*屏蔽门数量*/ + } + else + { + retVal = CI_ERROR; + } + } + else + { + } + + if (CI_SUCCESS == retVal) + { + for (jj = 0U; jj < 2U; jj++) + { + psdIdIntConnt = LongFromChar(&dataBuf[ii]);/*获取互联互通4字节屏蔽门ID*/ + ii += 4U; + vobcToCiDataStru->PsdData[jj].PsdIdInterConn = psdIdIntConnt; + + /*根据互联互通4字节ID获取屏蔽门ID*/ + retValue = dquQueryInDevIndex(QFUN_IDMAP_PSD_ID, psdIdIntConnt, &psdId); + + if (CI_SUCCESS == retValue) + { + vobcToCiDataStru->PsdData[jj].PsdId = psdId; + + cmdType = dataBuf[ii];/*获取屏蔽门命令*/ + ii += 1U; + if ((VOBCTOCI_COMMAND_TYPE_PSDOPEN == cmdType) || (VOBCTOCI_COMMAND_TYPE_PSDCLOSE == cmdType) || (VOBCTOCI_COMMAND_TYPE_PSDCHECK_FAOHLHT == cmdType)) /*修缺陷YF0083-682,2023-07-03*/ + { + vobcToCiDataStru->PsdData[jj].CmdType = cmdType; + + vobcToCiDataStru->PsdData[jj].CmdStartCycNum = Get2oo2CurCycleNum(); + } + else + { + retVal = CI_ERROR; + } + } + else + { + ii++; + } + } + + /*增加新的接口:信号机的ID1~0xFFFFFFFF,0为默认值,VOBC最大安全前端前方沿列车运行方向可搜索到的最近的同向信号机。*/ + signalId = LongFromChar(&dataBuf[ii]); /*获取信号机ID*/ + ii += 4U; + + vobcToCiDataStru->signalID = signalId; /*将信号机ID保存到结构体*/ + + } + else + { + } + } - else + break; + case VOBC_CI_INFO_TYPE_HEART_FRAME: /*心跳帧或注销请求帧*/ + case VOBC_CI_INFO_TYPE_LOGOUT_ASK: { - ii++; + vobcToCiDataStru->appInfoType = appInfoType; + vobcToCiDataStru->ComStartCycle = Get2oo2CurCycleNum(); + } + break; + case VOBC_CI_INFO_TYPE_BLOCLINK: /*点连式信息帧*/ + { + retVal = ParseVobcBlocLinkData(&dataBuf[ii], wMsgLen-4U, vobcToCiDataStru); + } + break; + default: + retVal = CI_ERROR; + debug_infor_printf((const)"\nVOBC: %d VOBC_CI_appInfoType_Error:%d\n", systemId, appInfoType); + break; } } - - /*增加新的接口:信号机的ID1~0xFFFFFFFF,0为默认值,VOBC最大安全前端前方沿列车运行方向可搜索到的最近的同向信号机。*/ - signalId = LongFromChar(&dataBuf[ii]); /*获取信号机ID*/ - ii += 4u; - - vobcToCiDataStru->signalID = signalId; /*将信号机ID保存到结构体*/ - - } - else - { } } - else if ((VOBC_CI_INFO_TYPE_HEART_FRAME == appInfoType) || (VOBC_CI_INFO_TYPE_LOGOUT_ASK == appInfoType)) - {/*心跳帧或注销请求帧*/ - vobcToCiDataStru->ComStartCycle = Get2oo2CurCycleNum(); - } - else - { - retVal = CI_ERROR; - } + if (CI_SUCCESS == retVal) { @@ -1662,6 +1798,7 @@ static UINT8 ParseVobcToCiDataFrameHLHT(const UINT8* dataBuf, const UINT16 dataL if (ii > dataLength) { retVal = CI_ERROR; + debug_infor_printf((const)"\nVOBC: %d VOBC_CI_DataLength_Error:%d,%d\n", systemId, dataLength, ii); } else { @@ -1690,6 +1827,7 @@ static UINT8 ParseVobcToCiDataFrameHLHT(const UINT8* dataBuf, const UINT16 dataL else { retVal = CI_ERROR; + debug_infor_printf((const)"\nVOBC: %d RemainValidiy Check Error:%d ", systemId, vobcInfoRemainValidiy); } } else if (HLHT_HEAD_INIT ==headRet) @@ -1952,38 +2090,29 @@ static UINT8 ParseVobcToCiDataFrameFAO(const UINT8* dataBuf, const UINT16 dataLe */ static UINT8 PackCiToVobcDataHLHT(VobcToCiDataStruct *vobcToCiDataStru) { - UINT8 CiToVobcDataBuffer[VOBC_TO_CI_DATA_LEN_MAX] = {0u};/*CI到VOBC组帧数组*/ - UINT16 psdId = 0u; /*屏蔽门ID*/ - UINT32 psdIdInterConn = 0u; /*互联互通4字节屏蔽门ID*/ - UINT8 startSigColour = 0u; /*屏蔽门关联的出站进路始端信号机*/ - UINT8 psdState = 0u; /*屏蔽门状态*/ - UINT16 ii = 0u; - UINT8 kk = 0u; - UINT16 sigId = 0u; /*信号机ID*/ - UINT8 rowIndex = 0u; - UINT8 colIndex = 0u; + UINT8 CiToVobcDataBuffer[VOBC_TO_CI_DATA_LEN_MAX] = {0U};/*CI到VOBC组帧数组*/ + UINT16 psdId = 0U; /*屏蔽门ID*/ + UINT32 psdIdInterConn = 0U; /*互联互通4字节屏蔽门ID*/ + UINT8 startSigColour = 0U; /*屏蔽门关联的出站进路始端信号机*/ + UINT8 psdState = 0U; /*屏蔽门状态*/ + UINT16 ii = 0U; + UINT8 kk = 0U; + UINT16 sigId = 0U; /*信号机ID*/ UINT32 curCycleNum = Get2oo2CurCycleNum(); UINT32 appCycleTime = GetSystemParaAppCycleTime(); UINT8 retVal = CI_SUCCESS; UINT8 localCiId = GetSystemParaLocalCiId(); /*本地联锁ID*/ - UINT32 ciEtcsId = 0u; - UINT32 vobcEtcsId = 0u; - UINT32 emapCheckVer = 0u; -#if 0 - UINT8 sigIdx = 0u;/*信号机索引*/ - UINT8 sigDir = 0u;/*信号机运营方向*/ - UINT16 trackIdRelatePhySecId = 0u;/*轨道区段关联的物理区段ID*/ - UINT8 outStationSignalAllowOrNotUp = CI_VOBC_SIGNAL_DEFAULT; /*上行信号机的允许或禁止状态*/ - UINT8 outStationSignalAllowOrNotDown = CI_VOBC_SIGNAL_DEFAULT; /*下行信号机的允许或禁止状态*/ - UINT8 outStationSignalSum = 0u;/*出站信号机数目*/ -#endif - UINT8 ci_vobcPrtclVersion = 0u; - UINT8 mutualLockState = 0u; - UINT16 dstDevId = 0u; - UINT8 outnetSafeSendRtn = 0u; + UINT32 ciEtcsId = 0U; + UINT32 vobcEtcsId = 0U; + UINT32 emapCheckVer = 0U; + UINT8 ci_vobcPrtclVersion = 0U; + UINT8 mutualLockState = 0U; + UINT16 dstDevId = 0U; + UINT8 outnetSafeSendRtn = 0U; UINT8 chPsdBelongCiId = 0U; UINT8 outStationSignalAllowOrNot = CI_VOBC_SIGNAL_DEFAULT; /*信号机的允许或禁止状态*/ - UINT32 signalIdInterConn = 0u; /*互联互通4字节信号机ID*/ + UINT32 signalIdInterConn = 0U; /*互联互通4字节信号机ID*/ + UINT16 wTempIndex = 0U; /*临时记录下标*/ ci_vobcPrtclVersion = GetVersionOfVOBCToCI(); @@ -1999,45 +2128,45 @@ static UINT8 PackCiToVobcDataHLHT(VobcToCiDataStruct *vobcToCiDataStru) if (CI_SUCCESS == retVal) { - ii = 0u; + ii = 0U; /*开始组应用数据帧*/ ShortToChar(CI_VOBC_INTERFACE_INFOTYPE, &CiToVobcDataBuffer[ii]);/*接口信息类型*/ - ii += 2u; + ii += 2U; LongToChar(ciEtcsId, &CiToVobcDataBuffer[ii]);/*发送方标识信息*/ - ii += 4u; + ii += 4U; LongToChar(vobcEtcsId, &CiToVobcDataBuffer[ii]);/*接收方标识信息*/ - ii += 4u; + ii += 4U; LongToChar(emapCheckVer, &CiToVobcDataBuffer[ii]);/*电子地图版本校验信息*/ - ii += 4u; + ii += 4U; LongToChar(curCycleNum, &CiToVobcDataBuffer[ii]);/*本方消息序列号*/ - ii += 4u; + ii += 4U; ShortToChar((UINT16)appCycleTime, &CiToVobcDataBuffer[ii]);/*设备通讯周期*/ - ii += 2u; + ii += 2U; LongToChar(GetHLHTHeadCtxSrcCrntSN(CI_SYSTEM_TYPE_VOBC, (UINT8)(vobcToCiDataStru->VobcId)), &CiToVobcDataBuffer[ii]);/*对方消息序列号:recvOppMsgSN记录收到对方上一条消息中的对方消息序列号*/ - ii += 4u; + ii += 4U; LongToChar(GetHLHTHeadCtxCiRcvSN(CI_SYSTEM_TYPE_VOBC, (UINT8)(vobcToCiDataStru->VobcId)), &CiToVobcDataBuffer[ii]);/*收到上一条消息时本方序列号*/ - ii += 4u; + ii += 4U; CiToVobcDataBuffer[ii++] = ci_vobcPrtclVersion;/*CI_VOBC接口协议版本号*/ - ii += 2u;/*通用报文头中的应用层报文总长度*/ + ii += 2U;/*通用报文头中的应用层报文总长度*/ /*以下为应用层数据*/ - ii += 2u;/*报文长度*/ + ii += 2U;/*报文长度*/ - ii += 2u;/*应用报文类型*/ + ii += 2U;/*应用报文类型*/ - ii += 2u;/*预留两个字节*/ + ii += 2U;/*预留两个字节*/ if ((VOBC_CI_INFO_TYPE_PSD_CONTROL == vobcToCiDataStru->appInfoType) && (curCycleNum == vobcToCiDataStru->ComStartCycle)) {/*只有当VOBC发送的信息类型是屏蔽门控制信息时,才组包如下内容;若信息类型为心跳帧,则只发送报文帧头(31+6)*/ LongToChar(vobcToCiDataStru->trackSecID,&CiToVobcDataBuffer[ii]);/*回复收到的轨道区段ID,依据CI-VOBCV2.9接口文档修改*/ - ii += 4u; + ii += 4U; CiToVobcDataBuffer[ii++] = vobcToCiDataStru->psdCmdCode; /*回复收到的状态开门码*/ CiToVobcDataBuffer[ii++] = vobcToCiDataStru->PsdSum; /*屏蔽门数量*/ - for (kk = 0u; kk < 2u; kk++) + for (kk = 0U; kk < 2U; kk++) { psdId = vobcToCiDataStru->PsdData[kk].PsdId; psdIdInterConn = vobcToCiDataStru->PsdData[kk].PsdIdInterConn; @@ -2056,7 +2185,7 @@ static UINT8 PackCiToVobcDataHLHT(VobcToCiDataStruct *vobcToCiDataStru) else {/*此屏蔽门属于本联锁*/ LongToChar(psdIdInterConn, &CiToVobcDataBuffer[ii]); /*屏蔽门ID*/ - ii += 4u; + ii += 4U; mutualLockState = GetPsdMutualLockRemoveState(psdId); if ((PSD_MUTUALLOCK_REMOVE_YES == mutualLockState) || (PSD_ATS_MUTUALLOCK_REMOVE_YES == mutualLockState) || (PSD_ATS_AND_JD_MUTUALLOCK_REMOVE_YES == mutualLockState)) @@ -2089,7 +2218,7 @@ static UINT8 PackCiToVobcDataHLHT(VobcToCiDataStruct *vobcToCiDataStru) signalIdInterConn = vobcToCiDataStru->signalID; /*互联互通4字节信号机ID*/ /*回复收到的信号机ID,依据CI-VOBCV3.0接口文档修改*/ LongToChar(signalIdInterConn,&CiToVobcDataBuffer[ii]); - ii += 4u; + ii += 4U; /*根据互联互通4字节ID获取信号机ID*/ retVal = dquQueryInDevIndex(QFUN_IDMAP_SIGNAL_ID, signalIdInterConn, &sigId); @@ -2152,32 +2281,72 @@ static UINT8 PackCiToVobcDataHLHT(VobcToCiDataStruct *vobcToCiDataStru) CiToVobcDataBuffer[ii++] = outStationSignalAllowOrNotUp; /*CI_VOBC上行出站信号机状态*/ CiToVobcDataBuffer[ii++] = outStationSignalAllowOrNotDown; /*CI_VOBC下行出站信号机状态*/ #endif - ShortToChar(CI_VOBC_INFO_TYPE_PSD_STATE,&CiToVobcDataBuffer[33]);/*屏蔽门控制报文类型,两字节*/ + ShortToChar(CI_VOBC_INFO_TYPE_PSD_STATE,&CiToVobcDataBuffer[33U]);/*屏蔽门控制报文类型,两字节*/ + + /*应用层数据的报文长度 */ + CiToVobcDataBuffer[31U] = (UINT8)(((ii - 33U) >> 8U) & 0xffU); + CiToVobcDataBuffer[32U] = (UINT8)((ii - 33U) & 0xffU); } else if ((VOBC_CI_INFO_TYPE_HEART_FRAME == vobcToCiDataStru->appInfoType) && (curCycleNum == vobcToCiDataStru->ComStartCycle)) {/*组心跳帧*/ - ShortToChar(CI_VOBC_INFO_TYPE_HEART_FRAME,&CiToVobcDataBuffer[33]);/*心跳帧报文类型,两字节*/ + ShortToChar(CI_VOBC_INFO_TYPE_HEART_FRAME,&CiToVobcDataBuffer[33U]);/*心跳帧报文类型,两字节*/ + + /*应用层数据的报文长度 */ + CiToVobcDataBuffer[31U] = (UINT8)(((ii - 33U) >> 8U) & 0xffU); + CiToVobcDataBuffer[32U] = (UINT8)((ii - 33U) & 0xffU); } else if ((VOBC_CI_INFO_TYPE_LOGOUT_ASK == vobcToCiDataStru->appInfoType) && (curCycleNum == vobcToCiDataStru->ComStartCycle)) {/*组注销请求回复帧*/ - ShortToChar(CI_VOBC_INFO_TYPE_LOGOUT_ACK,&CiToVobcDataBuffer[33]);/*注销请求回复帧报文类型,两字节*/ + ShortToChar(CI_VOBC_INFO_TYPE_LOGOUT_ACK,&CiToVobcDataBuffer[33U]);/*注销请求回复帧报文类型,两字节*/ + + /*应用层数据的报文长度 */ + CiToVobcDataBuffer[31U] = (UINT8)(((ii - 33U) >> 8U) & 0xffU); + CiToVobcDataBuffer[32U] = (UINT8)((ii - 33U) & 0xffU); } else { /*信息类型错误,什么都不做*/ } + /*组点连式信息*/ + if (curCycleNum == vobcToCiDataStru->strBlocLinkData.chBlocLinkCycle) + { + /*-由于可以和屏蔽门控制帧同时发,所以判点连式周期-*/ + if (0U == CiToVobcDataBuffer[33U]) + { + /*没有组其他信息帧,填充预留*/ + ShortToChar(CI_VOBC_INFO_TYPE_BLOCLINK, &CiToVobcDataBuffer[33U]); /*报文类型,两字节*/ + PackVobcBlocLinkData(CiToVobcDataBuffer, &ii, vobcToCiDataStru); /*组点连式信息*/ + /*应用层数据的报文长度 */ + CiToVobcDataBuffer[31U] = (UINT8)(((ii - 33U) >> 8U) & 0xffu); + CiToVobcDataBuffer[32U] = (UINT8)((ii - 33U) & 0xffU); + } + else + { + /*已组其他信息帧,接着组*/ + wTempIndex = ii; /*预留报文长度,两字节*/ + ii += 2U; + ShortToChar(CI_VOBC_INFO_TYPE_BLOCLINK, &CiToVobcDataBuffer[ii]); /*报文类型,两字节*/ + ii += 2U; + ii += 2U; /*预留两个字节*/ + PackVobcBlocLinkData(CiToVobcDataBuffer, &ii, vobcToCiDataStru); + /*填充应用层信息长度*/ + CiToVobcDataBuffer[wTempIndex] = (UINT8)(((ii - wTempIndex - 2U) >> 8U) & 0xffU); + CiToVobcDataBuffer[wTempIndex + 1U] = (UINT8)((ii - wTempIndex - 2U) & 0xffU); + } + } + else + { + /*不处理*/ + } + /*通用报文头中应用层报文总长度*/ - 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); - /*应用层数据的报文长度 */ - CiToVobcDataBuffer[31U] = (UINT8) (((ii - 33U) >> 8u) & 0xffu); - CiToVobcDataBuffer[32U] = (UINT8) ((ii - 33U) & 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平台打印*/ @@ -2631,18 +2800,9 @@ static UINT8 PackCiToVobcDataHLHTHeart(const UINT8 vobcId, const UINT16 logId) */ static UINT8 ParseVobcToCiDataFrameFAOHLHT(const UINT8* dataBuf, const UINT16 dataLength, const UINT8 systemId, VobcToCiDataStruct* vobcToCiDataStru, UINT8* saveGalHead,const UINT16 logId) { - UINT8 cmdType = 0u; /*屏蔽门命令类型*/ - UINT8 trainStopSteadyState = 0u; /*列车停稳状态*/ - UINT8 psdSum = 0u; - UINT8 trainDirection = 0u; /*列车方向*/ UINT16 ii = 0u; /*索引管理*/ - UINT8 jj = 0u; UINT8 retVal = CI_SUCCESS; - UINT8 retValue = 0u; - UINT16 psdId = 0u; /*PSD的ID*/ UINT16 appInfoType = 0u; /*应用信息类型*/ - UINT32 psdIdIntConnt = 0u; /*互联互通PSD的ID*/ - UINT32 trackSectionId = 0u; /*轨道区段ID*/ UINT32 curntCycleNo = 0u; /*当前周期号*/ UINT16 vobcName = 0u; /*VOBC设备名称:类型+ID*/ UINT16 ciName = 0u; /*联锁设备名称:类型+ID*/ @@ -2651,12 +2811,6 @@ static UINT8 ParseVobcToCiDataFrameFAOHLHT(const UINT8* dataBuf, const UINT16 da HLHTGALInfoStruct hlhtGalHead = { 0u }; INT32 vobcInfoRemainValidiy = 0; UINT8 headRet = HLHT_HEAD_ERROR;/*互联互通检查结果*/ - UINT32 signalId = 0u; /*VOBC->CI信号机ID*/ - UINT8 gapDetCmdType = 0u; /*间隙探测命令类型*/ - UINT8 doorState = 0u; /*VOBC-CI关联车门状态*/ - UINT8 cTempPsdCmdCode = 0U; - UINT8 chVideoQkState = 0U;/*视频清客状态*/ - UINT8 chVideoQkResult = 0U;/*视频清客结果*/ UINT16 wMsgLen = 0U;/*一条应用数据长度*/ UINT16 wTmpDataLen = 0U;/*临时长度记录*/ UINT16 wMsgCheckLen = 0u; /* 用于解析校验的数据长度 */ @@ -2753,7 +2907,6 @@ static UINT8 ParseVobcToCiDataFrameFAOHLHT(const UINT8* dataBuf, const UINT16 da ; /*不更新*/ } vobcToCiDataStru->VobcId = systemId; - vobcToCiDataStru->controlMode = TRAIN_MAIN_MODE;/*适配无主控状态接口*/ ii += 2u;/*跳过两个预留字节*/ @@ -2917,7 +3070,6 @@ static UINT8 PackCiToVobcDataFAOHLHT(VobcToCiDataStruct *vobcToCiDataStru) UINT8 startSigColour = 0u; /*屏蔽门关联的出站进路始端信号机*/ UINT8 psdState = 0u; /*屏蔽门状态*/ UINT16 ii = 0u; - UINT16 jj = 0u; UINT8 kk = 0u; UINT16 sigId = 0u; /*信号机ID*/ UINT32 curCycleNum = Get2oo2CurCycleNum(); @@ -3422,7 +3574,6 @@ static UINT8 ParseIvocToCiDataFrameCC(const UINT8* pDataBuf, const UINT16 dataLe UINT8 chEaNum = 0U; UINT8 chLogOutState = 0U; UINT32 dwCyc = 0u; - UINT8 chGroupState = 0u; UINT16 wGroupOtherTrainId = 0u; UINT8 chTrainMode = 0u; UINT8 chTrainHeadScreenConfirm = 0u; @@ -4962,8 +5113,6 @@ static UINT8 PackCiToIvocDataCC(VobcToCiDataStruct *pstVobcToCiDataStru) { UINT8 cszCiToIvocDataBuf[VOBC_TO_CI_DATA_LEN_MAX] = { 0u };/*CI到VOBC组帧数组*/ UINT16 ii = 0u; - UINT16 jj = 0u; - UINT8 kk = 0u; UINT32 curCycleNum = Get2oo2CurCycleNum(); UINT32 appCycleTime = GetSystemParaAppCycleTime(); UINT8 chRetVal = CI_ERROR; @@ -4998,7 +5147,7 @@ static UINT8 PackCiToIvocDataCC(VobcToCiDataStruct *pstVobcToCiDataStru) } else { - debug_infor_printf((const)"\nPack IVOC %d HLHT_id or EmapCheckVer error, ciEmapCheckVer:%d \n", pstVobcToCiDataStru->VobcId, ciEmapCheckVer); + debug_infor_printf((const)"\nPack IVOC HLHT_id or EmapCheckVer error, ciEmapCheckVer:%d \n", ciEmapCheckVer); chRetVal = CI_ERROR; } if (CI_SUCCESS == chRetVal) @@ -5181,7 +5330,7 @@ static UINT8 PackCiToIvocDataCC(VobcToCiDataStruct *pstVobcToCiDataStru) if (CI_SUCCESS == chRetVal) { - chRetVal = PackCiToIvocReqAlignmentInfo(cszCiToIvocDataBuf, &ii, pstVobcToCiDataStru->VobcId); + chRetVal = PackCiToIvocReqAlignmentInfo(cszCiToIvocDataBuf, &ii); } else { @@ -5293,7 +5442,18 @@ static UINT8 PackCiToIvocDataCC(VobcToCiDataStruct *pstVobcToCiDataStru) else { /*发生组包错误*/ - debug_infor_printf((const)"\n VOBC: %d PackCiToIvocJumpBackReply Error \n", pstVobcToCiDataStru->VobcId); + debug_infor_printf((const)"\n IVOC: %d PackCiToIvocJumpBackReply Error \n", pstVobcToCiDataStru->VobcId); + } + + /*给IVOC组通信故障的RC信息*/ + if (CI_SUCCESS == chRetVal) + { + chRetVal = PackCiToIvocComErrRcInfo(cszCiToIvocDataBuf, &ii); + } + else + { + /*发生组包错误*/ + debug_infor_printf((const)"\n IVOC: %d PackCiToIvocOpenRouteNotNearInfo Error \n", pstVobcToCiDataStru->VobcId); } if (CI_SUCCESS == chRetVal) @@ -5303,7 +5463,7 @@ static UINT8 PackCiToIvocDataCC(VobcToCiDataStruct *pstVobcToCiDataStru) else { /*发生组包错误*/ - debug_infor_printf((const)"\n IVOC: %d PackCiToIvocOpenRouteNotNearInfo Error \n", pstVobcToCiDataStru->VobcId); + debug_infor_printf((const)"\n IVOC: %d PackCiToIvocComErrRcInfo Error \n", pstVobcToCiDataStru->VobcId); } /*预留10字节*/ @@ -5384,7 +5544,7 @@ static UINT8 PackCiToIvocDataCC(VobcToCiDataStruct *pstVobcToCiDataStru) { /*写队列成功*/ #ifdef LOGPRINT/*日志打印宏*/ #ifdef PLATFORM_2OO2/*2oo2平台打印*/ - debug_infor_printf((const)"\VOBC_PBTACS_SEND:%d", ii); + debug_infor_printf((const)"\nVOBC_PBTACS_SEND:%d", ii); debug_out_array(0xAA, cszCiToIvocDataBuf, ii); #endif/*平台打印结束*/ #endif @@ -5420,7 +5580,6 @@ static UINT8 PackCiToIvocBackUpDataCC(VobcBackUpToCiDataStruct *pstVobcBackUpToC { UINT8 cszCiToIvocDataBuf[VOBC_TO_CI_DATA_LEN_MAX] = { 0u };/*CI到VOBC组帧数组*/ UINT16 ii = 0u; - UINT8 psdIndex = 0U; /*PSD索引*/ UINT32 curCycleNum = Get2oo2CurCycleNum(); UINT32 appCycleTime = GetSystemParaAppCycleTime(); UINT8 chRetVal = CI_ERROR; @@ -5434,8 +5593,6 @@ static UINT8 PackCiToIvocBackUpDataCC(VobcBackUpToCiDataStruct *pstVobcBackUpToC UINT16 wAppInfoIndex = 0U; UINT16 dstDevId = 0u; UINT8 outnetSafeSendRtn = 0u; - UINT8 chFunRtn = CI_ERROR; - UINT8 chSwState = 0u; /*首先获取组包时所需的信息,获取成功才有必要继续组包*/ if (NULL != pstVobcBackUpToCiDataStru) @@ -5455,7 +5612,7 @@ static UINT8 PackCiToIvocBackUpDataCC(VobcBackUpToCiDataStruct *pstVobcBackUpToC } else { - debug_infor_printf((const)"\nPack vobc %d data check error", pstVobcBackUpToCiDataStru->VobcId); + debug_infor_printf((const)"\nPack vobc data check error"); chRetVal = CI_ERROR; } @@ -6591,7 +6748,6 @@ static UINT8 PackCiToIvocFloodGateInfo(UINT8* pDataBuf, UINT16 *wDataLength, UI UINT8 chRetVal = CI_ERROR; UINT8 chRet = CI_ERROR; UINT8 floodOpenState = 0U; /*开门锁定信息*/ - UINT8 floodCloseReq = 0U; /*关门请求信息*/ UINT8 floodCloseReqTempSta = 0U; if ((NULL == pDataBuf) @@ -7094,11 +7250,8 @@ static UINT8 PackCiToIvocFaultTrainInfo(UINT8* pDataBuf, UINT16 *wDataLength) UINT32 dwTmpOff = 0U; UINT16 wOrgnLinkId = 0u; UINT32 dwOrgnOffset = 0u; - UINT8 chTrainDir = 0U; UINT16 ii = 0U; UINT8 chRetVal = CI_ERROR; - UINT8 chHeadScreStat = 0u; /*列车前筛标志*/ - UINT8 chTailScreStat = 0u; /*列车后筛标志*/ UINT16 szEnvelopeIdBuf[ENVELOPE_SUM_MAX] = { 0u }; UINT16 wEnvelopeSum = 0u; UINT16 wEnvelopeIndex = 0u; @@ -7408,15 +7561,7 @@ static UINT8 PackCiToIvocSleepTrainInfo(UINT8* pDataBuf, UINT16 *wDataLength) */ static UINT8 PackCiToIvocTsrInfo(UINT8* pDataBuf, UINT16 *wDataLength) { - UINT8 chPhyFlockStat = 0U; /*记录状态*/ - UINT16 wTsrId = 0U; /*用作ID*/ - UINT16 wTsrIndex = 0U; UINT8 cTsrSum = 0U; - UINT16 wTmpLinkId = 0U; - UINT32 dwTmpOff = 0U; - UINT16 wTsrSpeed = 0U; - UINT16 wTsrSecSum = 0U; - UINT8 chTsrCommStat = 0U; UINT16 ii = 0U; UINT8 chRetVal = CI_ERROR; UINT8 jj = 0u; @@ -7654,7 +7799,6 @@ static UINT8 PackCiToIvocLgcSgmtInfo(UINT8* pDataBuf, UINT16 *wDataLength,UINT1 UINT16 wLogicSecSum = 0U; UINT16 wLogicSecSendIndex = 0U; UINT16 wLogicSecSendSum = 0U; - UINT16 wRouteId = 0U; UINT16 wPLockRouteId = 0U; UINT16 wRLockRouteId = 0U; UINT16 wRouteLockOverlapId = 0U; @@ -7674,7 +7818,6 @@ static UINT8 PackCiToIvocLgcSgmtInfo(UINT8* pDataBuf, UINT16 *wDataLength,UINT1 UINT16 wLogSecRLockRouteId = 0U;/*逻辑区段锁闭所属进路*/ UINT8 chRouteType = 0U;/*进路类型*/ UINT16 wRouteLastPhy = 0U;/*进路最后一个物理区段*/ - UINT8 chSendFlag = 0U; UINT16 wMinTailPointBelongLogSecId = 0U; struct_PathPoint strTrainMinTail = { 0u }; @@ -8085,7 +8228,6 @@ static UINT8 PackCiToIvocLgcSgmtInfo(UINT8* pDataBuf, UINT16 *wDataLength,UINT1 */ static UINT8 PackCiToIvocReqAndReplyInfo(UINT8* pDataBuf, UINT16 *wDataLength,UINT16 wTrnId) { - UINT8 chPhyFlockStat = 0U; /*记录状态*/ UINT16 wRouteId = 0U; /*用作ID*/ UINT16 wRouteBelongCiId = 0U; /*用作ID*/ UINT16 wCiId = 0U; /*用作ID*/ @@ -8517,8 +8659,6 @@ UINT8 PackCiToVobcDataFAOHLHToneSelf(VobcToCiDataStruct* vobcToCiDataStru) UINT16 ii = 0; UINT8 kk = 0; UINT16 sigId = 0; /*信号机ID*/ - UINT8 rowIndex = 0; - UINT8 colIndex = 0; UINT32 curCycleNum = Get2oo2CurCycleNum(); UINT32 appCycleTime = GetSystemParaAppCycleTime(); UINT8 retVal = CI_SUCCESS; @@ -8530,7 +8670,6 @@ UINT8 PackCiToVobcDataFAOHLHToneSelf(VobcToCiDataStruct* vobcToCiDataStru) UINT32 signalIdInterConn = 0u; /*互联互通4字节信号机ID*/ UINT16 washMachineCurSum = GetWashMachineSum(); /*获取当前联锁包含洗车机数量*/ UINT16 washMachineId = 0u; - UINT8 psdValidFlag[2] = { 0,0 }; /*0无效,1有效*/ UINT8 psdReopenButtState = 0u; /*站台再次开门按钮状态*/ UINT8 platDepartButtState = 0u; /*站台发车按钮状态*/ UINT8 psdCloseButtState = 0u; /*屏蔽门状态*/ @@ -8559,12 +8698,10 @@ UINT8 PackCiToVobcDataFAOHLHToneSelf(VobcToCiDataStruct* vobcToCiDataStru) UINT8 chWashWorkModeBack = WASH_WORKMODE_BACK_DEFAULT;/*洗车机工作模式设置反馈*/ UINT16 wTempSendIndex = 0U;/*发送数组临时索引*/ UINT8 chTempCheckFlag = CI_ERROR; - UINT16 esbId = 0; UINT8 chEsbState = 0u; UINT16 pEsbIdBuf[PSD_INCOUDE_ESB_NUM] = { 0U }; INT8 chEsbNum = -1; UINT32 dwEsbhlhtId = 0u; - UINT8 chRetVal = 0U; UINT8 chJXTCMutualLockFaultState = 0U; UINT32 dwJXTCMutualLockFaultTime = 0U; UINT16 wPsdObtacleRelayId = 0U; @@ -9162,8 +9299,6 @@ UINT8 PackCiToVobcDataFAOHLHToneSelfSecond(VobcToCiDataStruct* vobcToCiDataStru) UINT16 ii = 0U; UINT8 kk = 0U; UINT16 sigId = 0U; /*信号机ID*/ - UINT8 rowIndex = 0U; - UINT8 colIndex = 0U; UINT32 curCycleNum = Get2oo2CurCycleNum(); UINT32 appCycleTime = GetSystemParaAppCycleTime(); UINT8 retVal = CI_SUCCESS; @@ -9173,12 +9308,10 @@ UINT8 PackCiToVobcDataFAOHLHToneSelfSecond(VobcToCiDataStruct* vobcToCiDataStru) UINT32 emapCheckVer = 0u; UINT8 outStationSignalAllowOrNot = CI_VOBC_SIGNAL_DEFAULT; /*信号机的允许或禁止状态*/ UINT32 signalIdInterConn = 0u; /*互联互通4字节信号机ID*/ - UINT8 psdValidFlag[2U] = { 0U,0U }; /*0无效,1有效*/ UINT8 mutualLockState = 0u; /*互锁解除状态*/ UINT8 localhlhtId = 0u; UINT8 vobcHlhtId = 0u; UINT8 ciEmapCheckVer = 0u; - UINT8 flag = 0u; /*清客按钮按下后PDB状态组默认值*/ UINT8 chPsdBelongCiId = 0U; UINT16 wTempSendIndex = 0U; UINT8 chTempCheckFlag = CI_ERROR; @@ -9659,7 +9792,7 @@ static UINT8 PassWashMachineRequestCheck(UINT8 Data) * CI_SUCCESS 成功 * by cgh 20230802 */ -static UINT8 PackCiToIvocReqAlignmentInfo(UINT8* pDataBuf, UINT16* wDataLength, UINT16 wTrnId) +static UINT8 PackCiToIvocReqAlignmentInfo(UINT8* pDataBuf, UINT16* wDataLength) { UINT16 ii = 0U; UINT8 jj = 0U; @@ -10844,7 +10977,7 @@ static UINT8 PackCiToIvocBackUpTsrInfo(UINT8* pDataBuf, UINT16* wDataLength,UINT if ((0U < chPhySecRelAxisSecSum) && (NULL != szPhySecRelAxisId)) { - wTempAxisSum = GetAllAxisFromAxisSeqSafeSw(szPhySecRelAxisId, (UINT16)chPhySecRelAxisSecSum, &szAxisIdBuf); + wTempAxisSum = GetAllAxisFromAxisSeqSafeSw(szPhySecRelAxisId, (UINT16)chPhySecRelAxisSecSum, szAxisIdBuf); if (0U == wTempAxisSum) { @@ -11403,6 +11536,8 @@ UINT8 ParseFAOHLHTOtherTypeData(const UINT16 appInfoType, UINT8* dataBuf, UINT16 { chRetVal = CI_SUCCESS; + vobcToCiDataStru->controlMode = TRAIN_MAIN_MODE;/*适配无主控状态接口*/ + if (VOBC_CI_INFO_TYPE_PSD_CONTROL == appInfoType) { /*只有当VOBC发送CI的信息类型是屏蔽门控制报文时才继续解析报文信息*/ /*列车运行方向判断*/ @@ -13315,10 +13450,10 @@ UINT8 PackRcToVobcData(void) UINT8 initVobcSum = 0u; UINT8 cFuncRet = CI_ERROR; - debug_infor_printf((const)"\PackRcToVobcData VobcToRcSum = %d\n", VobcToRcSum); /*打印与RC通信的VOBC数目*/ + debug_infor_printf((const)"\nPackRcToVobcData VobcToRcSum = %d\n", VobcToRcSum); /*打印与RC通信的VOBC数目*/ for (ii = 0u; (ii < (UINT32)VobcToRcSum) && (ii < VOBC_TO_CI_SUM_MAX); ii++) { - retVal = PackRcToVobcDataHLHTHeart((UINT8)VobcToRcDataStru[ii].VobcId, VobcToRcDataStru[ii].vobcLogId); + retVal = PackRcToVobcStateData(&(VobcToRcDataStru[ii])); } @@ -13328,6 +13463,8 @@ UINT8 PackRcToVobcData(void) for (ii = 0u; ii < initVobcSum; ii++) { retVal &= PackRcToVobcDataHLHTHeart(initVobcIds[ii], initVobcIdLogIds[ii]); + debug_infor_printf((const)"\nPACK HEARTFARME TO VOBC %d", initVobcIds[ii]); /*打印信息*/ + } } else @@ -13889,4 +14026,2077 @@ UINT8 PackCiToIvocOpenRouteNotNearInfo(UINT8* pDataBuf, UINT16* wDataLength, UIN return chRetVal; -} \ No newline at end of file +} + +/* +* 功能描述: 组VOBC点连式数据 +* 参数说明: UINT8* CiToVobcDataBuffer 存放信息的buffer +* UINT16* ii 偏移量 +* VobcToCiDataStruct *vobcToCiDataStru VOBC-CI数据 +* 返回值 : 无 +* Create: lyj 20260314 +*/ +void PackVobcBlocLinkData(UINT8* CiToVobcDataBuffer, UINT16* ii, VobcToCiDataStruct* vobcToCiDataStru) +{ + UINT16 wIndex = 0U; + UINT16* pRouteBuf = NULL; + UINT8 chRouteNum = 0U; + UINT8 chRet = CI_ERROR; + UINT16 wSwitchBuffer[CI_VOBC_SWITCH_MAX] = { 0U }; /*CI到VOBC道岔数据*/ + UINT8 chTempNum = 0U; + UINT16 wTempBuffer[CI_VOBC_OTHER_EQUIPMENT_MAX] = { 0U }; /*CI到VOBC其他设备数据*/ + UINT8 chTempState = 0U; + UINT8 k = 0U; + UINT32 dwTempHLHTId = 0U; + UINT8 chEsbPLState = 0U; + wIndex = *ii; + if ((NULL != CiToVobcDataBuffer) && (NULL != ii) && (NULL != vobcToCiDataStru)) + { + /*判断是否匹配到进路,若未匹配到进路不组应用数据*/ + 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)) + { + /*1 组下一个CI互联互通编号*/ + PackNextCiId(CiToVobcDataBuffer, &wIndex,vobcToCiDataStru); + + /*2 组移动授权信息*/ + chRet = PackMoveAuthorityData(CiToVobcDataBuffer, &wIndex,vobcToCiDataStru); + if (CI_SUCCESS == chRet) + { + /*3 组路径道岔信息*/ + chTempNum = GetPathSwitchData(wSwitchBuffer, vobcToCiDataStru->VobcId); + ShortToChar(chTempNum, &CiToVobcDataBuffer[wIndex]); /*道岔数量*/ + wIndex += 2U; + for (k = 0U; k < chTempNum; k++) + { + chRet = dquQueryOutDevId(QFUN_IDMAP_SWITCH_ID, wSwitchBuffer[k], &dwTempHLHTId); + if (CI_SUCCESS == chRet) + { + LongToChar(dwTempHLHTId, &CiToVobcDataBuffer[wIndex]); /*组道岔ID*/ + wIndex += 4U; + chTempState = GetSwitchCurPosition(wSwitchBuffer[k]); /*组道岔状态D*/ + if (SWITCH_POSITION_DINGWEI == chTempState) + { + CiToVobcDataBuffer[wIndex++] = CI_IVOC_SWITCH_POSTION_DING; + } + else if (SWITCH_POSITION_FANWEI == chTempState) + { + CiToVobcDataBuffer[wIndex++] = CI_IVOC_SWITCH_POSTION_FAN; + } + else + { + CiToVobcDataBuffer[wIndex++] = CI_IVOC_SWITCH_POSTION_SHIBIAO; /*失表*/ + } + } + else + { + LongToChar(0U, &CiToVobcDataBuffer[wIndex]); /*组无效值*/ + wIndex += 4U; + CiToVobcDataBuffer[wIndex++] = CI_IVOC_SWITCH_POSTION_SHIBIAO; + } + } + + /*4 组路径PSD信息*/ + chTempNum = GetPathPsdData(wTempBuffer, vobcToCiDataStru->VobcId); + ShortToChar(chTempNum, &CiToVobcDataBuffer[wIndex]); /*数量*/ + wIndex += 2U; + for (k = 0U; k < chTempNum; k++) + { + chRet = dquQueryOutDevId(QFUN_IDMAP_PSD_ID, wTempBuffer[k], &dwTempHLHTId); + if (CI_SUCCESS == chRet) + { + LongToChar(dwTempHLHTId, &CiToVobcDataBuffer[wIndex]); /*组ID*/ + wIndex += 4U; + CiToVobcDataBuffer[wIndex++] = GetPsdStateToVobc(wTempBuffer[k]); /*组状态D*/ + } + else + { + LongToChar(0U, &CiToVobcDataBuffer[wIndex]); /*组无效值*/ + wIndex += 4U; + CiToVobcDataBuffer[wIndex++] = CI_IVOC_PSD_STATE_OPEN; + } + } + + /*5 组路径ESB信息*/ + chTempNum = GetPathEsbData(wTempBuffer, vobcToCiDataStru->VobcId); + ShortToChar(chTempNum, &CiToVobcDataBuffer[wIndex]); /*数量*/ + wIndex += 2U; + for (k = 0U; k < chTempNum; k++) + { + chRet = dquQueryOutDevId(QFUN_IDMAP_EMERGBTN_ID, wTempBuffer[k], &dwTempHLHTId); + if (CI_SUCCESS == chRet) + { + LongToChar(dwTempHLHTId, &CiToVobcDataBuffer[wIndex]); /*组ID*/ + wIndex += 4U; + chTempState = GetEsbState(wTempBuffer[k]); + chEsbPLState = GetEsbCutState(wTempBuffer[k]); + if ((ESB_STATE_VALID_NO == chTempState) || (ESB_CUT_YES == chEsbPLState)) + { + CiToVobcDataBuffer[wIndex++] = CI_IVOC_ESB_STATE_INVALID; /*组状态*/ + } + else + { + CiToVobcDataBuffer[wIndex++] = CI_IVOC_ESB_STATE_VALID; + } + + } + else + { + LongToChar(0U, &CiToVobcDataBuffer[wIndex]); /*组无效值*/ + wIndex += 4U; + CiToVobcDataBuffer[wIndex++] = CI_IVOC_ESB_STATE_VALID; + } + } + + /*6 组路径SPKS信息*/ + chTempNum = GetPathSpksData(wTempBuffer,vobcToCiDataStru->VobcId); + ShortToChar(chTempNum, &CiToVobcDataBuffer[wIndex]); /*数量*/ + 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; + } + } + + /*7 组路径临时限速信息*/ + CiToVobcDataBuffer[wIndex++] = GetPathXianSuData(vobcToCiDataStru->VobcId); + + /*8 组路径防淹门信息*/ + chTempNum = GetPathFloodGateData(wTempBuffer,vobcToCiDataStru->VobcId); + CiToVobcDataBuffer[wIndex++] = chTempNum; /*数量*/ + for (k = 0U; k < chTempNum; k++) + { + ShortToChar(wTempBuffer[k], &CiToVobcDataBuffer[wIndex]); /*ID*/ + wIndex += 2U; + chTempState = GetFloodGateCurLogicCloseState(wTempBuffer[k]); + if (FLOOD_GATE_OPEN == chTempState) + { + CiToVobcDataBuffer[wIndex++] = CI_VOBC_FLOOD_STATE_OPEN; + } + else + { + CiToVobcDataBuffer[wIndex++] = CI_VOBC_FLOOD_STATE_CLOSE; + } + } + + /*9 组路径运行目的地属性*/ + CiToVobcDataBuffer[wIndex++] = GetDestinationType(chRouteNum,pRouteBuf); + + /*10 预留10字节*/ + wIndex += 10U; + + *ii = wIndex; /*输出长度*/ + } + else + { + debug_infor_printf((const)"\nVOBC %d BlocLink MoveAuthority Error\n", VobcToCiDataStru->VobcId); + /*移动授权信息计算失败;不输出长度;清一下组包的数组*/ + (void)CommonMemSet((void*)&CiToVobcDataBuffer[*ii], (UINT32)(VOBC_TO_CI_DATA_LEN_MAX - *ii), 0U, (UINT32)(wIndex - *ii)); + } + + } + else + { + debug_infor_printf((const)"\nVOBC %d BlocLink NoRoute\n", VobcToCiDataStru->VobcId); + /*不处理*/ + } + } + else + { + /*不处理*/ + } +} +/* +* 功能描述: 解析VOBC点连式数据 +* 参数说明: const UINT8* dataBuf, 数据缓冲区 +* const UINT16 dataLength, 数据长度 +* VobcToCiDataStruct* vobcToCiDataStru VOBC到CI结构体数据 +* 返回值 : 解析结果 +* Create: lyj 20260314 +*/ +UINT8 ParseVobcBlocLinkData(const UINT8* dataBuf, const UINT16 dataLength, VobcToCiDataStruct* vobcToCiDataStru) +{ + UINT8 chRetVal = CI_ERROR; + UINT8 chTempCheck = 0U; + UINT8 ii = 0U; + UINT32 dwLinkHLHTId = 0U; + UINT16 wLinkId = 0U; + UINT32 dwLinkOff = 0U; + if ((NULL != dataBuf) && (NULL != vobcToCiDataStru)) + { + chRetVal = CI_SUCCESS; + /*由于点连式信息帧可以单独发也可以和屏蔽门控制帧一起发,所以不记录帧类型*/ + vobcToCiDataStru->ComStartCycle = Get2oo2CurCycleNum(); /*用于判中断*/ + + chTempCheck = dataBuf[ii++]; /*列车运行控制级别*/ + if ((VOBC_CI_BLOCLINK_BLOCK_CTRL == chTempCheck) || (VOBC_CI_BLOCLINK_CI_CTRL == chTempCheck) || (VOBC_CI_BLOCLINK_CI_DEFAULT == chTempCheck)) + { + vobcToCiDataStru->strBlocLinkData.chBlocLinkTrainLevel = chTempCheck; + } + else + { + debug_infor_printf((const)"\nVOBC %d ParseVobcBlocLinkData ERR:chBlocLinkTrainLevel:%d", vobcToCiDataStru->VobcId, chTempCheck); + chRetVal = CI_ERROR; + } + + chTempCheck = dataBuf[ii++]; /*运行方向*/ + if ((TRAIN_DIR_UP == chTempCheck) || (TRAIN_DIR_DOWN == chTempCheck) || (TRAIN_DIR_DEF == chTempCheck)) + { + vobcToCiDataStru->strBlocLinkData.chTrainDirection = chTempCheck; + } + else + { + debug_infor_printf((const)"\nVOBC %d ParseVobcBlocLinkData ERR:chTrainDirection:%d", vobcToCiDataStru->VobcId, chTempCheck); + chRetVal = CI_ERROR; + } + /*记录位置*/ + if (CI_SUCCESS == chRetVal) + { + dwLinkHLHTId = LongFromChar(&dataBuf[ii]); /*列车最大安全前端所处Link*/ + ii += 4U; + chTempCheck = dquQueryInDevIndex(QFUN_IDMAP_TRACKSEC_ID, dwLinkHLHTId, &wLinkId); + if (CI_SUCCESS == chTempCheck) + { + vobcToCiDataStru->strBlocLinkData.wTrainMaxSafeHeadLink = wLinkId; + debug_infor_printf((const)"\nwTrainMaxSafeHeadLink:%d\n", wLinkId); + } + else + { + chRetVal = CI_ERROR; + debug_infor_printf((const)"\nVOBC %d ParseVobcBlocLinkData ERR:wTrainMaxSafeHeadLink:%d", vobcToCiDataStru->VobcId, dwLinkHLHTId); + } + dwLinkOff = LongFromChar(&dataBuf[ii]); /*列车最大安全前端偏移量*/ + ii += 4U; + if (UINT32_MAX != dwLinkOff) + { + vobcToCiDataStru->strBlocLinkData.dwTrainMaxSafeHeadOffset = dwLinkOff; + } + else + { + chRetVal = CI_ERROR; + debug_infor_printf((const)"\nVOBC %d ParseVobcBlocLinkData ERR:dwTrainMaxSafeHeadOffset:%d", vobcToCiDataStru->VobcId, dwLinkOff); + } + + dwLinkHLHTId = LongFromChar(&dataBuf[ii]); /*列车最小安全后端所处Link*/ + ii += 4U; + chTempCheck = dquQueryInDevIndex(QFUN_IDMAP_TRACKSEC_ID, dwLinkHLHTId, &wLinkId); + if (CI_SUCCESS == chTempCheck) + { + vobcToCiDataStru->strBlocLinkData.wTrainMinSafeTailLink = wLinkId; + debug_infor_printf((const)"\nwTrainMinSafeTailLink:%d\n", wLinkId); + } + else + { + chRetVal = CI_ERROR; + debug_infor_printf((const)"\nVOBC %d ParseVobcBlocLinkData ERR:wTrainMinSafeTailLink:%d", vobcToCiDataStru->VobcId, dwLinkHLHTId); + } + dwLinkOff = LongFromChar(&dataBuf[ii]);/*列车最小安全后端偏移量*/ + if (UINT32_MAX != dwLinkOff) + { + vobcToCiDataStru->strBlocLinkData.dwTrainMinSafeTailOffset = dwLinkOff; + } + else + { + chRetVal = CI_ERROR; + debug_infor_printf((const)"\nVOBC %d ParseVobcBlocLinkData ERR:dwTrainMinSafeTailOffset:%d", vobcToCiDataStru->VobcId, dwLinkOff); + } + if (ii > dataLength) + { + chRetVal = CI_ERROR; + } + else + { + /*不处理*/ + } + } + else + { + /*不处理*/ + } + if (CI_SUCCESS == chRetVal) + { + vobcToCiDataStru->strBlocLinkData.chBlocLinkCycle = Get2oo2CurCycleNum(); /*用于判本周期是否发送点连式信息*/ + } + else + { + /*不处理*/ + } + } + else + { + /*不处理*/ + } + return chRetVal; + +} + +/* +* 功能描述: 组下一CI Id +* 参数说明: UINT8* CiToVobcDataBuffer 存放信息的buffer +* UINT16* ii 偏移量 +* VobcToCiDataStruct* vobcToCiDataStru VOBC-CI数据 +* 返回值 :无 +* Create: lyj 20260314 +*/ +static void PackNextCiId(UINT8* CiToVobcDataBuffer, UINT16* ii, VobcToCiDataStruct* vobcToCiDataStru) +{ + UINT16 wEndSigId = 0U; + UINT8 chSigBelongCiId = 0U; + UINT8 chlocalCiId = 0U; + UINT16 wIndex = 0U; + UINT8 chRet = CI_ERROR; + UINT32 dwCiHLHTId = 0U; + struct_PathPoint start = { 0U }; /*列车逻辑起点*/ + struct_PathPoint end = { 0U }; /*列车逻辑终点*/ + UINT16 wStartLogSecId = 0U; + UINT16 wEndLogSecId = 0U; + UINT16 wStartRouteId = 0U; /*逻辑区段锁闭所属进路*/ + UINT16 wEndRouteId = 0U; + UINT16* pRouteBuf = NULL; + UINT8 chRouteNum = 0U; + + if ((NULL != CiToVobcDataBuffer) && (NULL != ii) && (NULL != vobcToCiDataStru)) + { + wIndex = *ii; + chlocalCiId = GetSystemParaLocalCiId(); + chRouteNum = GetBlocLinkRouteNum(vobcToCiDataStru->VobcId); + pRouteBuf = GetBlocLinkRouteBuf(vobcToCiDataStru->VobcId); + if ((NULL != pRouteBuf) && (0U < chRouteNum)) + { + wEndSigId = GetRouteEndSignalId(pRouteBuf[chRouteNum - 1U]); + chSigBelongCiId = GetSignalBelongCiId(wEndSigId); + + /*车头位置*/ + end.wLinkId = GetAblTrainMaxHeadLink(vobcToCiDataStru->VobcId); + end.dwOffset = GetAblTrainMaxHeadOffset(vobcToCiDataStru->VobcId); + /*车尾位置*/ + start.wLinkId = GetAblTrainMinTailLink(vobcToCiDataStru->VobcId); + start.dwOffset = GetAblTrainMinTailOffset(vobcToCiDataStru->VobcId); + + /*获取车所处进路*/ + wStartLogSecId = GetPointBelongLogSec(start); + wEndLogSecId = GetPointBelongLogSec(end); + wStartRouteId = GetLogSecLockBelongRoute(wStartLogSecId); + wEndRouteId = GetLogSecLockBelongRoute(wEndLogSecId); + /*匹配的最后一条进路终端信号机所属联锁不是本联锁,且车尾或车头所在进路是最后一条进路;则发送下一CI为终端信号机所属CI*/ + if ((chlocalCiId != chSigBelongCiId) && ((wStartRouteId == pRouteBuf[chRouteNum - 1U]) || (wEndRouteId == pRouteBuf[chRouteNum - 1U]))) + { + chRet = dquQueryOutDevId(QFUN_IDMAP_CI_ID, (UINT16)chSigBelongCiId, &dwCiHLHTId); + if (CI_SUCCESS == chRet) + { + LongToChar(dwCiHLHTId, &CiToVobcDataBuffer[wIndex]); + wIndex += 4U; + } + else + { + LongToChar(0U, &CiToVobcDataBuffer[wIndex]); /*默认值*/ + wIndex += 4U; + } + } + else + { + LongToChar(0U, &CiToVobcDataBuffer[wIndex]); /*默认值*/ + wIndex += 4U; + } + *ii = wIndex; /*输出长度*/ + } + else + { + /*不处理*/ + } + + } + else + { + /*不处理*/ + } +} +/* +* 功能描述: 组移动授权信息 +* 参数说明: UINT8* CiToVobcDataBuffer 存放信息的buffer +* UINT16* ii 偏移量 +* VobcToCiDataStruct* vobcToCiDataStru VOBC-CI数据 +* 返回值 :移动授权计算结果 +* Create: lyj 20260314 +*/ +static UINT8 PackMoveAuthorityData(UINT8* CiToVobcDataBuffer, UINT16* ii, VobcToCiDataStruct* vobcToCiDataStru) +{ + UINT16 wIndex = 0U; + UINT16 wOverLapId = 0U; + UINT16 wEndSigId = 0U; + UINT8 chSigProtectDir = 0U; + UINT8 chOverlapLogSum = 0U; + UINT16* pOverlapLogBuf = NULL; + UINT16 wLinkId = 0U; + UINT8 chFlag = 0U; + UINT32 dwLinkHLHTId = 0U; + UINT32 dwlinkLength = 0U; + UINT8 chRet = CI_ERROR; + UINT16* pRouteBuf = NULL; + UINT8 chRouteNum = 0U; + + if ((NULL != CiToVobcDataBuffer) && (NULL != ii) && (NULL != vobcToCiDataStru)) + { + wIndex = *ii; + CiToVobcDataBuffer[wIndex++] = vobcToCiDataStru->strBlocLinkData.chTrainDirection; /*移动授权方向*/ + 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); + + 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; /*输出长度*/ + } + else + { + /*不处理*/ + } + } + else + { + chRet = CI_ERROR; + } + } + else + { + /*不处理*/ + } + + return chRet; +} +/* +* 功能描述: 获取路径道岔信息 +* 参数说明: UINT16* pPathTempBuf 存放信息的buffer +* const UINT16 wTrainId 列车ID +* 返回值 :设备数量 +* Create: lyj 20260314 +*/ +static UINT8 GetPathSwitchData(UINT16* pPathTempBuf, const UINT16 wTrainId) +{ + UINT8 chTempNum = 0U; + UINT8 chRet = CI_ERROR; + UINT8 chLogSecNum = 0U; + UINT16* pLogSecBuf = NULL; + UINT16* pRouteBuf = NULL; + UINT8 chRouteNum = 0U; + UINT8 chLogsecSwitchSum = 0U; + LogsecSwitchStruct* pLogsecSwitchBuf = NULL; + UINT8 j = 0U; + UINT8 k = 0U; + UINT16 chRouteLogSecNum = 0U; + UINT16* pRouteLogSecBuf = NULL; + UINT16 m = 0U; + UINT8 chCheckFlag = 0U; + UINT16 wOverlapId = 0U; + UINT8 chOverLapSwitchSum = 0U; + OverlapConditionSwitchStruct* pOverLapSwitch = NULL; + if (NULL != pPathTempBuf) + { + /*组车脚下和车头所属进路的道岔*/ + chLogSecNum = GetBlocLinkLogSecNum(wTrainId); + pLogSecBuf = GetBlocLinkLogSecBuf(wTrainId); + if (NULL != pLogSecBuf) + { + for (j = 0U;j < chLogSecNum;j++) + { + chLogsecSwitchSum = GetLogicSecSwitchSum(pLogSecBuf[j]); /*逻辑区段包含道岔*/ + pLogsecSwitchBuf = GetLogicSecSwitchIdStru(pLogSecBuf[j]); + if (NULL != pLogsecSwitchBuf) + { + if (CI_VOBC_SWITCH_MAX > (chLogsecSwitchSum + chTempNum)) + { + for (k = 0U; k < chLogsecSwitchSum; k++) + { + chCheckFlag = CheckRepeatData(pLogsecSwitchBuf[k].SwitchId, pPathTempBuf, chTempNum);/*去重*/ + if (CI_SUCCESS == chCheckFlag) + { + pPathTempBuf[chTempNum] = pLogsecSwitchBuf[k].SwitchId; + chTempNum++; + } + else + { + /*不添加*/ + } + } + } + else + { + break; + } + } + else + { + /*不处理*/ + } + + } + } + else + { + /*不处理*/ + } + + /*组后续匹配进路的道岔*/ + chRouteNum = GetBlocLinkRouteNum(wTrainId); + pRouteBuf = GetBlocLinkRouteBuf(wTrainId); + if (CI_VOBC_SWITCH_MAX > chTempNum) + { + chRet = CI_SUCCESS; + if (NULL != pRouteBuf) + { + /*从匹配的第2条进路开始*/ + for (j = 1U; j < chRouteNum; j++) + { + chRouteLogSecNum = GetRouteLogSectionSum(pRouteBuf[j]); + pRouteLogSecBuf = GetRouteLogSectionIdBuf(pRouteBuf[j]); + if (NULL != pRouteLogSecBuf) + { + for (m = 0U;m < chRouteLogSecNum;m++) + { + chLogsecSwitchSum = GetLogicSecSwitchSum(pRouteLogSecBuf[m]); + pLogsecSwitchBuf = GetLogicSecSwitchIdStru(pRouteLogSecBuf[m]); + if (NULL != pLogsecSwitchBuf) + { + if (CI_VOBC_SWITCH_MAX > (chLogsecSwitchSum + chTempNum)) + { + for (k = 0U; k < chLogsecSwitchSum; k++) + { + chCheckFlag = CheckRepeatData(pLogsecSwitchBuf[k].SwitchId, pPathTempBuf, chTempNum);/*去重*/ + if (CI_SUCCESS == chCheckFlag) + { + pPathTempBuf[chTempNum] = pLogsecSwitchBuf[k].SwitchId; + chTempNum++; + } + else + { + /*不添加*/ + } + } + } + else + { + chRet = CI_ERROR; + break; + } + } + else + { + chRet = CI_ERROR; + break; + } + } + if (CI_ERROR == chRet) + { + break; + } + else + { + /*继续*/ + } + + } + else + { + break; + } + + + } + } + else + { + /*不处理*/ + } + + } + else + { + /*不处理*/ + } + /*组最后一条进路保护区段道岔*/ + if (CI_VOBC_SWITCH_MAX > chTempNum) + { + if ((NULL != pRouteBuf) && (0U < chRouteNum)) + { + wOverlapId = GetRouteOverlapLockedId(pRouteBuf[chRouteNum-1U]); + if ((0U < wOverlapId) && (OVERLAP_SUM_MAX > wOverlapId)) + { + chOverLapSwitchSum = GetOverlapSwitchSum(wOverlapId); + pOverLapSwitch = GetOverlapCondSwitchStruct(wOverlapId); + if (NULL != pOverLapSwitch) + { + if (CI_VOBC_SWITCH_MAX > (chTempNum + chOverLapSwitchSum)) + { + for (k = 0U; k < chOverLapSwitchSum; k++) + { + chCheckFlag = CheckRepeatData(pOverLapSwitch[k].SwitchId, pPathTempBuf, chTempNum);/*去重*/ + if (CI_SUCCESS == chCheckFlag) + { + pPathTempBuf[chTempNum] = pOverLapSwitch[k].SwitchId; + chTempNum++; + } + else + { + /*不添加*/ + } + } + + } + else + { + /*不添加*/ + } + } + else + { + /*不处理*/ + } + } + else + { + /*不处理*/ + } + + } + } + } + else + { + /*不处理*/ + } + + return chTempNum; +} + +/* +* 功能描述: 获取路径屏蔽门信息 +* 参数说明: UINT16* pPathTempBuf 存放信息的buffer +* const UINT16 wTrainId 列车ID +* 返回值 :设备数量 +* Create: lyj 20260314 +*/ + +static UINT8 GetPathPsdData(UINT16* pPathTempBuf,const UINT16 wTrainId) +{ + UINT8 chTempNum = 0U; + UINT8 chRet = CI_ERROR; + UINT8 chLogSecNum = 0U; + UINT16* pLogSecBuf = NULL; + UINT16* pRouteBuf = NULL; + UINT8 chRouteNum = 0U; + UINT8 chLogsecPsdSum = 0U; + UINT16 wLogsecPsdId = 0U; + UINT8 j = 0U; + UINT8 k = 0U; + UINT16 wRouteLogSecNum = 0U; + UINT16* pRouteLogSecBuf = NULL; + UINT16 m = 0U; + UINT8 chCheckFlag = 0U; + UINT16 wOverlapId = 0U; + UINT8 chOverLapLogSecNum = 0U; + UINT16* pOverLapLogSecBuf = NULL; + if (NULL != pPathTempBuf) + { + /*组车脚下和车头所属进路的PSD*/ + chLogSecNum = GetBlocLinkLogSecNum(wTrainId); + pLogSecBuf = GetBlocLinkLogSecBuf(wTrainId); + if (NULL != pLogSecBuf) + { + for (j = 0U; j < chLogSecNum; j++) + { + chLogsecPsdSum = GetLogSecPsdSum(pLogSecBuf[j]); + if (CI_VOBC_OTHER_EQUIPMENT_MAX > (chTempNum + chLogsecPsdSum)) + { + for (k = 0U; k < chLogsecPsdSum; k++) + { + wLogsecPsdId = GetLogSecPsdByIdx(pLogSecBuf[j], k); + chCheckFlag = CheckRepeatData(wLogsecPsdId, pPathTempBuf, chTempNum); /*去重*/ + if (CI_SUCCESS == chCheckFlag) + { + pPathTempBuf[chTempNum] = wLogsecPsdId; + chTempNum++; + } + else + { + /*不添加*/ + } + } + } + else + { + break; + } + } + } + else + { + /*不处理*/ + } + /*组后续匹配进路的PSD*/ + chRouteNum = GetBlocLinkRouteNum(wTrainId); + pRouteBuf = GetBlocLinkRouteBuf(wTrainId); + if (CI_VOBC_OTHER_EQUIPMENT_MAX > chTempNum) + { + chRet = CI_SUCCESS; + + if (NULL != pRouteBuf) + { + for (j = 1U; j < chRouteNum; j++) + { + wRouteLogSecNum = GetRouteLogSectionSum(pRouteBuf[j]); + pRouteLogSecBuf = GetRouteLogSectionIdBuf(pRouteBuf[j]); + if (NULL != pRouteLogSecBuf) + { + for (m = 0U; m < wRouteLogSecNum; m++) + { + chLogsecPsdSum = GetLogSecPsdSum(pRouteLogSecBuf[m]); + if (CI_VOBC_OTHER_EQUIPMENT_MAX > (chTempNum + chLogsecPsdSum)) + { + for (k = 0U; k < chLogsecPsdSum; k++) + { + wLogsecPsdId = GetLogSecPsdByIdx(pRouteLogSecBuf[m], k); + chCheckFlag = CheckRepeatData(wLogsecPsdId, pPathTempBuf, chTempNum); /*去重*/ + if (CI_SUCCESS == chCheckFlag) + { + pPathTempBuf[chTempNum] = wLogsecPsdId; + chTempNum++; + } + else + { + /*不添加*/ + } + + } + } + else + { + chRet = CI_ERROR; + break; + } + } + if (CI_ERROR == chRet) + { + break; + } + else + { + /*继续*/ + } + } + else + { + break; + } + } + } + else + { + /*不处理*/ + } + } + /*组最后一条进路保护区段PSD*/ + if (CI_VOBC_OTHER_EQUIPMENT_MAX > chTempNum) + { + if ((NULL != pRouteBuf) && (0U < chRouteNum)) + { + wOverlapId = GetRouteOverlapLockedId(pRouteBuf[chRouteNum - 1U]); + if ((0U < wOverlapId) && (OVERLAP_SUM_MAX > wOverlapId)) + { + chOverLapLogSecNum = GetOverlapLogicSectionSum(wOverlapId); + pOverLapLogSecBuf = GetOverlapLogicSectionBuf(wOverlapId); + if (NULL != pOverLapLogSecBuf) + { + for (j = 0U; j < chOverLapLogSecNum; j++) + { + chLogsecPsdSum = GetLogSecPsdSum(pOverLapLogSecBuf[j]); + if (CI_VOBC_OTHER_EQUIPMENT_MAX > (chTempNum + chLogsecPsdSum)) + { + for (k = 0U; k < chLogsecPsdSum; k++) + { + wLogsecPsdId = GetLogSecPsdByIdx(pOverLapLogSecBuf[j], k); + chCheckFlag = CheckRepeatData(wLogsecPsdId, pPathTempBuf, chTempNum); /*去重*/ + if (CI_SUCCESS == chCheckFlag) + { + pPathTempBuf[chTempNum] = wLogsecPsdId; + chTempNum++; + } + else + { + /*不添加*/ + } + } + } + else + { + break; + } + } + } + else + { + /*不处理*/ + } + } + else + { + /*不处理*/ + } + } + } + else + { + /*不处理*/ + } + } + else + { + /*不处理*/ + } + + return chTempNum; +} + +/* +* 功能描述: 获取路径紧急停车按钮信息 +* 参数说明: UINT16* pPathTempBuf 存放信息的buffer +* const UINT16 wTrainId 列车ID +* 返回值 :设备数量 +* Create: lyj 20260314 +*/ + +static UINT8 GetPathEsbData(UINT16* pPathTempBuf,const UINT16 wTrainId) +{ + UINT8 chTempNum = 0U; + UINT8 chRet = CI_ERROR; + UINT8 chLogSecNum = 0U; + UINT16* pLogSecBuf = NULL; + UINT16* pRouteBuf = NULL; + UINT8 chRouteNum = 0U; + UINT8 chLogsecEsbSum = 0U; + UINT16 wLogsecEsbId = 0U; + UINT8 j = 0U; + UINT8 k = 0U; + UINT16 wRouteLogSecNum = 0U; + UINT16* pRouteLogSecBuf = NULL; + UINT16 m = 0U; + UINT8 chCheckFlag = 0U; + UINT16 wOverlapId = 0U; + UINT8 chOverLapLogSecNum = 0U; + UINT16* pOverLapLogSecBuf = NULL; + + if (NULL != pPathTempBuf) + { + /*组车脚下和车头所属进路的ESB*/ + chLogSecNum = GetBlocLinkLogSecNum(wTrainId); + pLogSecBuf = GetBlocLinkLogSecBuf(wTrainId); + if (NULL != pLogSecBuf) + { + for (j = 0U; j < chLogSecNum; j++) + { + chLogsecEsbSum = GetLogSecEsbSum(pLogSecBuf[j]); + if (CI_VOBC_OTHER_EQUIPMENT_MAX > (chLogsecEsbSum + chTempNum)) + { + for (k = 0U; k < chLogsecEsbSum; k++) + { + wLogsecEsbId = GetLogSecEsbByIdx(pLogSecBuf[j], k); + chCheckFlag = CheckRepeatData(wLogsecEsbId, pPathTempBuf, chTempNum); /*去重*/ + if (CI_SUCCESS == chCheckFlag) + { + pPathTempBuf[chTempNum] = wLogsecEsbId; + chTempNum++; + } + else + { + /*不添加*/ + } + } + } + else + { + break; + } + } + } + else + { + /*不处理*/ + } + /*组后续匹配进路的PSD*/ + chRouteNum = GetBlocLinkRouteNum(wTrainId); + pRouteBuf = GetBlocLinkRouteBuf(wTrainId); + if (CI_VOBC_OTHER_EQUIPMENT_MAX > chTempNum) + { + chRet = CI_SUCCESS; + if (NULL != pRouteBuf) + { + for (j = 1U; j < chRouteNum; j++) + { + wRouteLogSecNum = GetRouteLogSectionSum(pRouteBuf[j]); + pRouteLogSecBuf = GetRouteLogSectionIdBuf(pRouteBuf[j]); + if (NULL != pRouteLogSecBuf) + { + for (m = 0U; m < wRouteLogSecNum; m++) + { + chLogsecEsbSum = GetLogSecEsbSum(pRouteLogSecBuf[m]); + if (CI_VOBC_OTHER_EQUIPMENT_MAX > (chLogsecEsbSum + chTempNum)) + { + for (k = 0U; k < chLogsecEsbSum; k++) + { + wLogsecEsbId = GetLogSecEsbByIdx(pRouteLogSecBuf[m], k); + chCheckFlag = CheckRepeatData(wLogsecEsbId, pPathTempBuf, chTempNum); /*去重*/ + if (CI_SUCCESS == chCheckFlag) + { + pPathTempBuf[chTempNum] = wLogsecEsbId; + chTempNum++; + } + else + { + /*不添加*/ + } + + } + } + else + { + chRet = CI_ERROR; + break; + } + } + if (CI_ERROR == chRet) + { + break; + } + else + { + /*继续*/ + } + } + else + { + chRet = CI_ERROR; + break; + } + } + } + else + { + /*不处理*/ + } + } + else + { + /*不处理*/ + } + /*组最后一条进路保护区段PSD*/ + if (CI_VOBC_OTHER_EQUIPMENT_MAX > chTempNum) + { + if ((NULL != pRouteBuf) && (0U < chRouteNum)) + { + wOverlapId = GetRouteOverlapLockedId(pRouteBuf[chRouteNum - 1U]); + if ((0U < wOverlapId) && (OVERLAP_SUM_MAX > wOverlapId)) + { + chOverLapLogSecNum = GetOverlapLogicSectionSum(wOverlapId); + pOverLapLogSecBuf = GetOverlapLogicSectionBuf(wOverlapId); + if (NULL != pOverLapLogSecBuf) + { + for (j = 0U; j < chOverLapLogSecNum; j++) + { + chLogsecEsbSum = GetLogSecEsbSum(pOverLapLogSecBuf[j]); + if (CI_VOBC_OTHER_EQUIPMENT_MAX > (chLogsecEsbSum + chTempNum)) + { + for (k = 0U; k < chLogsecEsbSum; k++) + { + wLogsecEsbId = GetLogSecEsbByIdx(pOverLapLogSecBuf[j], k); + chCheckFlag = CheckRepeatData(wLogsecEsbId, pPathTempBuf, chTempNum); /*去重*/ + if (CI_SUCCESS == chCheckFlag) + { + pPathTempBuf[chTempNum] = wLogsecEsbId; + chTempNum++; + } + else + { + /*不添加*/ + } + + } + } + else + { + break; + } + } + } + else + { + /*不处理*/ + } + } + else + { + /*不处理*/ + } + } + else + { + /*不处理*/ + } + } + else + { + /*不处理*/ + } + } + else + { + /*不处理*/ + } + + return chTempNum; +} + +/* +* 功能描述: 获取路径SPKS信息 +* 参数说明: UINT16* pPathTempBuf 存放信息的buffer +* const UINT16 wTrainId 列车ID +* 返回值 :设备数量 +* Create: lyj 20260316 +*/ +static UINT8 GetPathSpksData(UINT16* pPathTempBuf, const UINT16 wTrainId) +{ + UINT8 chTempNum = 0U; + UINT8 chLogSecNum = 0U; + UINT16* pLogSecBuf = NULL; + UINT16 wLogBelongPhyId = 0U; + UINT8 j = 0U; + UINT8 chSpksNum = 0U; + UINT8 k = 0U; + UINT16 wTempSpksId = 0U; + UINT8 chCheckFlag = 0U; + UINT16* pRouteBuf = NULL; + UINT8 chRouteNum = 0U; + UINT8 chRoutePhySum = 0U; + UINT8 m = 0U; + UINT8 chSpksState = 0U; + UINT8 chSpksPLState = 0U; + UINT8 chRet = 0U; + RoutePhysicalSectionStruct* pRoutePhyBuf = NULL; + UINT16 wOverlapId = 0U; + UINT8 chOverLapPhyNum = 0U; + UINT16* pOverLapPhyBuf = NULL; + if (NULL != pPathTempBuf) + { + /*检查车脚下和车头所属进路的SPKS是否激活*/ + chLogSecNum = GetBlocLinkLogSecNum(wTrainId); + pLogSecBuf = GetBlocLinkLogSecBuf(wTrainId); + if (NULL != pLogSecBuf) + { + for (j = 0U;j< chLogSecNum;j++) + { + wLogBelongPhyId = GetLgcSecRelativePhySecId(pLogSecBuf[j]); + chSpksNum = GetPhySecSpksSum(wLogBelongPhyId); + if (CI_VOBC_OTHER_EQUIPMENT_MAX > (chTempNum + chSpksNum)) + { + for (k = 0U; k < chSpksNum;k++) + { + wTempSpksId = GetPhySecSpksIdBySpksIdx(wLogBelongPhyId,k); + chSpksState = GetSpksState(wTempSpksId); /*SPKS激活才添加*/ + chSpksPLState = GetSpksCutState(wTempSpksId); + chCheckFlag = CheckRepeatData(wTempSpksId, pPathTempBuf, chTempNum); /*去重*/ + if ((CI_SUCCESS == chCheckFlag) && (SPKS_STATUS_YES == chSpksState) && (SPKS_CUT_NO == chSpksPLState)) + { + pPathTempBuf[chTempNum] = wTempSpksId; + chTempNum++; + } + else + { + /*不添加*/ + } + } + } + else + { + break; + } + + } + + } + else + { + /*不处理*/ + } + /*检查后续匹配进路的SPKS*/ + chRouteNum = GetBlocLinkRouteNum(wTrainId); + pRouteBuf = GetBlocLinkRouteBuf(wTrainId); + if (CI_VOBC_OTHER_EQUIPMENT_MAX > chTempNum) + { + chRet = CI_SUCCESS; + + if (NULL != pRouteBuf) + { + for (j = 1U; j < chRouteNum; j++) + { + chRoutePhySum = GetRoutePhysicalSectionSum(pRouteBuf[j]); + pRoutePhyBuf = GetRouteSectionData(pRouteBuf[j]); + if (NULL != pRoutePhyBuf) + { + for (m =0U;m < chRoutePhySum;m++) + { + chSpksNum = GetPhySecSpksSum(pRoutePhyBuf[m].PhysicalSectionId); + if (CI_VOBC_OTHER_EQUIPMENT_MAX > (chTempNum + chSpksNum)) + { + for (k = 0U; k < chSpksNum; k++) + { + wTempSpksId = GetPhySecSpksIdBySpksIdx(pRoutePhyBuf[m].PhysicalSectionId, k); + chSpksState = GetSpksState(wTempSpksId); /*SPKS激活才添加*/ + chSpksPLState = GetSpksCutState(wTempSpksId); + chCheckFlag = CheckRepeatData(wTempSpksId, pPathTempBuf, chTempNum); /*去重*/ + if ((CI_SUCCESS == chCheckFlag) && (SPKS_STATUS_YES == chSpksState) && (SPKS_STATUS_NO == chSpksPLState)) + { + pPathTempBuf[chTempNum] = wTempSpksId; + chTempNum++; + } + else + { + /*不添加*/ + } + } + } + else + { + chRet = CI_ERROR; + break; + } + } + if (CI_ERROR == chRet) + { + break; + } + else + { + /*不处理*/ + } + + } + else + { + break; + } + } + } + else + { + /*不处理*/ + } + + } + else + { + /*不处理*/ + } + + /*检查最后一条进路保护区段的SPKS*/ + if (CI_VOBC_OTHER_EQUIPMENT_MAX > chTempNum) + { + if ((NULL != pRouteBuf) && (0U < chRouteNum)) + { + wOverlapId = GetRouteOverlapLockedId(pRouteBuf[chRouteNum - 1U]); + if ((0U < wOverlapId) && (OVERLAP_SUM_MAX > wOverlapId)) + { + chOverLapPhyNum = GetOverlapPhySecSum(wOverlapId); + pOverLapPhyBuf = GetOverlapPhySecIdBuf(wOverlapId); + if (NULL != pOverLapPhyBuf) + { + for (j = 0U;j < chOverLapPhyNum;j++) + { + chSpksNum = GetPhySecSpksSum(pOverLapPhyBuf[j]); + if (CI_VOBC_OTHER_EQUIPMENT_MAX > (chTempNum + chSpksNum)) + { + for (k = 0U; k < chSpksNum; k++) + { + wTempSpksId = GetPhySecSpksIdBySpksIdx(pOverLapPhyBuf[j], k); + chSpksState = GetSpksState(wTempSpksId); /*SPKS激活才添加*/ + chSpksPLState = GetSpksCutState(wTempSpksId); + chCheckFlag = CheckRepeatData(wTempSpksId, pPathTempBuf, chTempNum); /*去重*/ + if ((CI_SUCCESS == chCheckFlag) && (SPKS_STATUS_YES == chSpksState) && (SPKS_CUT_NO == chSpksPLState)) + { + pPathTempBuf[chTempNum] = wTempSpksId; + chTempNum++; + } + else + { + /*不添加*/ + } + } + } + else + { + break; + } + } + } + else + { + /*不处理*/ + } + } + else + { + /*不处理*/ + } + } + else + { + /*不处理*/ + } + } + else + { + /*不处理*/ + } + } + else + { + /*不处理*/ + } + return chTempNum; +} +/* +* 功能描述: 获取路径限速信息 +* 参数说明: +* const UINT16 wTrainId 列车ID +* 返回值 :限速状态 +* Create: lyj 20260316 +*/ +static UINT8 GetPathXianSuData(const UINT16 wTrainId) +{ + UINT8 chRet = CI_VOBC_XIANSU_YES; + UINT8 chLogSecNum = 0U; + UINT16* pLogSecBuf = NULL; + UINT8 chXianSuState = 0U; + UINT8 j = 0U; + UINT16* pRouteBuf = NULL; + UINT8 chRouteNum = 0U; + UINT16 chRouteLogSecNum = 0U; + UINT16* pRouteLogSecBuf = NULL; + UINT16 m = 0U; + UINT16 wOverlapId = 0U; + UINT8 chOverLapLogSecNum = 0U; + UINT16* pOverLapLogSecBuf = NULL; + /*检查车脚下和车头所属进路的区段是否存在限速*/ + chLogSecNum = GetBlocLinkLogSecNum(wTrainId); + pLogSecBuf = GetBlocLinkLogSecBuf(wTrainId); + if (NULL != pLogSecBuf) + { + for (j = 0U;j < chLogSecNum;j++) + { + chXianSuState = GetLogSecLinShiXianSuSetState(pLogSecBuf[j]); + if ((LOGSEC_LSXS_SET_STATE_NO == chXianSuState) || (LOGSEC_LSXS_SET_STATE_INVALID == chXianSuState)) + { + chRet = CI_VOBC_XIANSU_NOT; + } + else + { + chRet = CI_VOBC_XIANSU_YES; + break; + } + } + + } + else + { + chRet = CI_VOBC_XIANSU_YES; + } + /*检查后续匹配进路的区段是否存在限速*/ + chRouteNum = GetBlocLinkRouteNum(wTrainId); + pRouteBuf = GetBlocLinkRouteBuf(wTrainId); + if (CI_VOBC_XIANSU_NOT == chRet) + { + if (NULL != pRouteBuf) + { + for (j = 1U; j < chRouteNum; j++) + { + chRouteLogSecNum = GetRouteLogSectionSum(pRouteBuf[j]); + pRouteLogSecBuf = GetRouteLogSectionIdBuf(pRouteBuf[j]); + if (NULL != pRouteLogSecBuf) + { + for (m = 0U; m < chRouteLogSecNum; m++) + { + chXianSuState = GetLogSecLinShiXianSuSetState(pRouteLogSecBuf[m]); + if ((LOGSEC_LSXS_SET_STATE_NO == chXianSuState) || (LOGSEC_LSXS_SET_STATE_INVALID == chXianSuState)) + { + /*不处理*/ + } + else + { + chRet = CI_VOBC_XIANSU_YES; + break; + } + } + if (CI_VOBC_XIANSU_YES == chRet) + { + break; + } + else + { + /*不处理*/ + } + } + else + { + chRet = CI_VOBC_XIANSU_YES; + } + } + } + else + { + chRet = CI_VOBC_XIANSU_YES; + } + } + else + { + /*不处理*/ + } + /*检查最后一条进路的保护区段是否存在限速*/ + if (CI_VOBC_XIANSU_NOT == chRet) + { + if ((NULL != pRouteBuf) && (0U < chRouteNum)) + { + wOverlapId = GetRouteOverlapLockedId(pRouteBuf[chRouteNum - 1U]); + if ((0U < wOverlapId) && (OVERLAP_SUM_MAX > wOverlapId)) + { + chOverLapLogSecNum = GetOverlapLogicSectionSum(wOverlapId); + pOverLapLogSecBuf = GetOverlapLogicSectionBuf(wOverlapId); + if (NULL != pOverLapLogSecBuf) + { + for (j = 0U; j < chOverLapLogSecNum; j++) + { + chXianSuState = GetLogSecLinShiXianSuSetState(pOverLapLogSecBuf[j]); + if ((LOGSEC_LSXS_SET_STATE_NO == chXianSuState) || (LOGSEC_LSXS_SET_STATE_INVALID == chXianSuState)) + { + chRet = CI_VOBC_XIANSU_NOT; + } + else + { + chRet = CI_VOBC_XIANSU_YES; + break; + } + } + } + else + { + /*不处理*/ + } + } + else + { + /*不处理*/ + } + } + } + else + { + /*不处理*/ + } + return chRet; +} +/* +* 功能描述: 获取路径防淹门信息 +* 参数说明: UINT16* pPathTempBuf +* const UINT16 wTrainId 列车ID +* 返回值 :设备数量 +* Create: lyj 20260316 +*/ +static UINT8 GetPathFloodGateData(UINT16* pPathTempBuf, const UINT16 wTrainId) +{ + UINT8 chTempNum = 0U; + UINT8 chLogSecNum = 0U; + UINT16* pLogSecBuf = NULL; + UINT16* pRouteBuf = NULL; + UINT8 chRouteNum = 0U; + UINT8 j = 0U; + UINT16 wLogBelongPhyId = 0U; + UINT16 chFloodGateNum = 0U; + UINT16* phFloodGateBuf = 0U; + UINT16 m = 0U; + UINT8 k = 0U; + UINT8 chCheckFlag = 0U; + RoutePhysicalSectionStruct* pRoutePhyBuf = NULL; + UINT8 chRoutePhySum = 0U; + UINT8 chRet = 0U; + UINT16 wOverlapId = 0U; + UINT8 chOverLapPhyNum = 0U; + UINT16* pOverLapPhyBuf = NULL; + if (NULL != pPathTempBuf) + { + /*检查车脚下和车头所属物理区段是否存在防淹门*/ + chLogSecNum = GetBlocLinkLogSecNum(wTrainId); + pLogSecBuf = GetBlocLinkLogSecBuf(wTrainId); + if (NULL != pLogSecBuf) + { + for (j = 0U;j < chLogSecNum;j++) + { + wLogBelongPhyId = GetLgcSecRelativePhySecId(pLogSecBuf[j]); + chFloodGateNum = GetPhySecLocatedFloodSum(wLogBelongPhyId); + phFloodGateBuf = GetPhySecLocatedFloodId(wLogBelongPhyId); + if ((CI_VOBC_OTHER_EQUIPMENT_MAX > (chTempNum + chFloodGateNum)) && (NULL != phFloodGateBuf)) + { + for (m = 0U;m < chFloodGateNum;m++) + { + chCheckFlag = CheckRepeatData(phFloodGateBuf[m], pPathTempBuf, chTempNum); /*去重*/ + if (CI_SUCCESS == chCheckFlag) + { + pPathTempBuf[chTempNum] = phFloodGateBuf[m]; + chTempNum++; + } + else + { + /*不添加*/ + } + } + } + else + { + break; + } + } + } + else + { + /*不处理*/ + } + /*检查后续匹配进路的防淹门*/ + chRouteNum = GetBlocLinkRouteNum(wTrainId); + pRouteBuf = GetBlocLinkRouteBuf(wTrainId); + if (CI_VOBC_OTHER_EQUIPMENT_MAX > chTempNum) + { + chRet = CI_SUCCESS; + if (NULL != pRouteBuf) + { + for (j = 1U; j < chRouteNum; j++) + { + chRoutePhySum = GetRoutePhysicalSectionSum(pRouteBuf[j]); + pRoutePhyBuf = GetRouteSectionData(pRouteBuf[j]); + if (NULL != pRoutePhyBuf) + { + for (k = 0U;k < chRoutePhySum;k++) + { + chFloodGateNum = GetPhySecLocatedFloodSum(pRoutePhyBuf[k].PhysicalSectionId); + phFloodGateBuf = GetPhySecLocatedFloodId(pRoutePhyBuf[k].PhysicalSectionId); + if ((CI_VOBC_OTHER_EQUIPMENT_MAX > (chTempNum + chFloodGateNum)) && (NULL != phFloodGateBuf)) + { + for (m = 0U; m < chFloodGateNum; m++) + { + chCheckFlag = CheckRepeatData(phFloodGateBuf[m], pPathTempBuf, chTempNum); /*去重*/ + if (CI_SUCCESS == chCheckFlag) + { + pPathTempBuf[chTempNum] = phFloodGateBuf[m]; + chTempNum++; + } + else + { + /*不添加*/ + } + } + } + else + { + chRet = CI_ERROR; + break; + } + + } + if (CI_ERROR == chRet) + { + break; + } + else + { + /*不处理*/ + } + + } + else + { + break; + } + } + + } + else + { + /*不处理*/ + } + } + else + { + /*不处理*/ + } + + if (CI_VOBC_OTHER_EQUIPMENT_MAX > chTempNum) + { + if ((NULL != pRouteBuf) && (0U < chRouteNum)) + { + wOverlapId = GetRouteOverlapLockedId(pRouteBuf[chRouteNum - 1U]); + if ((0U < wOverlapId) && (OVERLAP_SUM_MAX > wOverlapId)) + { + chOverLapPhyNum = GetOverlapPhySecSum(wOverlapId); + pOverLapPhyBuf = GetOverlapPhySecIdBuf(wOverlapId); + if (NULL != pOverLapPhyBuf) + { + for (k = 0U; k < chOverLapPhyNum; k++) + { + chFloodGateNum = GetPhySecLocatedFloodSum(pOverLapPhyBuf[k]); + phFloodGateBuf = GetPhySecLocatedFloodId(pOverLapPhyBuf[k]); + if ((CI_VOBC_OTHER_EQUIPMENT_MAX > (chTempNum + chFloodGateNum)) && (NULL != phFloodGateBuf)) + { + for (m = 0U; m < chFloodGateNum; m++) + { + chCheckFlag = CheckRepeatData(phFloodGateBuf[m], pPathTempBuf, chTempNum); /*去重*/ + if (CI_SUCCESS == chCheckFlag) + { + pPathTempBuf[chTempNum] = phFloodGateBuf[m]; + chTempNum++; + } + else + { + /*不添加*/ + } + } + } + else + { + break; + } + } + } + else + { + /*不处理*/ + } + } + else + { + /*不处理*/ + } + } + else + { + /*不处理*/ + } + } + else + { + /*不处理*/ + } + + } + return chTempNum; +} +/* +* 功能描述: 获取路径目的地属性 +* 参数说明: UINT8 chRouteNum,进路数量 +* UINT16* pRouteBuf,进路数组 +* 返回值 :设备数量 +* Create: lyj 20260316 +*/ +static UINT8 GetDestinationType(UINT8 chRouteNum, UINT16* pRouteBuf) +{ + UINT8 chTempState = 0U; + UINT8 chRet = 0U; + if ((NULL != pRouteBuf) && (CI_VOBC_ROUTE_MAX >= chRouteNum) && (0U < chRouteNum)) + { + chTempState = GetRouteType(pRouteBuf[chRouteNum - 1U]); + if (ROUTE_TYPE_RETURN == chTempState) + { + chRet = CI_VOBC_DESTINATION_TYPE_RETURN; + } + else + { + chRet = CI_VOBC_DESTINATION_TYPE_LIECHE; + } + } + + return chRet; +} + +/* +* 功能描述:检查设备是否已经添加 +* 参数说明:const UINT16 wCheckDeviceId 检查设备ID +* const UINT16* pDeviceBuf 数组 +* const UINT8 wDeviceNum 数量 +* 返回值 :检查结果 +*/ +UINT8 CheckRepeatData(const UINT16 wCheckDeviceId, const UINT16* pDeviceBuf, const UINT8 wDeviceNum) +{ + UINT8 chRet = CI_ERROR; + UINT8 i = 0U; + if (NULL != pDeviceBuf) + { + for (i = 0U; i < wDeviceNum; i++) + { + if (wCheckDeviceId == pDeviceBuf[i]) + { + /*重复*/ + break; + } + else + { + /*继续查找*/ + } + } + if (wDeviceNum == i) + { + chRet = CI_SUCCESS; + } + else + { + /*不处理*/ + } + } + return chRet; +} + +/* +* 功能描述:组包Ci到Ivoc通信故障RC数目 +* 参数说明: UINT8* dataBuf, 数据缓冲区 +* UINT16 *dataLength, 数据长度 输出参数 +* 返 回 值:CI_ERROR 0 失败 +* CI_SUCCESS 1 成功 +* by cgh 20260327 +*/ +static UINT8 PackCiToIvocComErrRcInfo(UINT8* pDataBuf, UINT16* wDataLength) +{ + UINT8 chRetVal = CI_ERROR; + UINT16 ii = 0U;/*存储下标*/ + UINT16 wComErrRcNumIndex = 0U; /*通信故障RC数量所在索引*/ + UINT8 chTransRciSum = 0U; /*通信设备数量*/ + UINT8* pTransRciId = NULL; /*通信设备ID数组*/ + UINT8 jj = 0U; + UINT8 chNearRciCommState = 0U; /*相邻RC通信状态*/ + UINT8 chComErrRcNum = 0U; /*通信故障RC数量*/ + UINT16 wComRcId = 0U; /*通信设备ID*/ + + if ((NULL == pDataBuf) || (NULL == wDataLength)) + { + chRetVal = CI_ERROR; + } + else + { + ii = *wDataLength; + /*先记录通信故障RC数目在整个数据中的存储索引*/ + wComErrRcNumIndex = ii; + ii++; + + chTransRciSum = GetCiTransmitSpecifySysDevSum(CI_SYSTEM_TYPE_RC); + pTransRciId = GetCiTransmitSpecifySysDevBuf(CI_SYSTEM_TYPE_RC); + + /*数据合法*/ + if (NULL != pTransRciId) + { + 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 (CI_SUCCESS == chRetVal) + { + pDataBuf[wComErrRcNumIndex] = chComErrRcNum; /*组通信故障RC数量*/ + *wDataLength = ii; /*传出数据长度*/ + } + else + { + chRetVal = CI_ERROR; + } + + return chRetVal; +} + +/* +* 功能描述: 组互联互通RC->VOBC状态数据 +* 参数说明: VobcToRcDataStruct * pstVobcToRcDataStru Vobc给RC的信息结构体 +* 返回值 : 0:组数据失败 +* 1:组数据成功 +* by cgh 20260328 +*/ +static UINT8 PackRcToVobcStateData(VobcToRcDataStruct * pstVobcToRcDataStru) +{ + UINT8 retVal = CI_ERROR; + UINT8 chRcToVobcDataBuffer[VOBC_TO_CI_DATA_LEN_MAX] = { 0u };/*RC到VOBC组帧数组*/ + UINT32 curCycleNum = 0U; /*当前联锁周期号*/ + UINT32 appCycleTime = 0U; /*应用周期数*/ + UINT16 ii = 0U; + UINT8 localCiId = 0U; /*本地联锁ID*/ + UINT32 ciEtcsId = 0U; /*联锁互联互通ID*/ + UINT32 vobcEtcsId = 0U; /*VOBC互联互通ID*/ + UINT32 emapCheckVer = 0U; /*电子地图检验数据*/ + UINT16 dstDevId = 0U; /*目的设备地址*/ + UINT8 outnetSafeSendRtn = 0U; /*外网数据发送结果*/ + UINT32 chCtxSrcCrntSN = 0U; /*某个设备最近一次给RC发送数据时其当前的序号*/ + UINT32 chCtxCiRcvSN = 0U; /*RC最近收到某个设备的数据时RC自身当时的序号*/ + + localCiId = GetSystemParaLocalCiId(); + curCycleNum = Get2oo2CurCycleNum(); + appCycleTime = GetSystemParaAppCycleTime(); + + retVal = dquDevName2HlhtId(((UINT16)CI_SYSTEM_TYPE_RCI * 256U + localCiId), 0U, &ciEtcsId); + retVal &= dquDevName2HlhtId(((UINT16)(CI_SYSTEM_TYPE_VOBC * 256U) + pstVobcToRcDataStru->VobcId), pstVobcToRcDataStru->vobcLogId, &vobcEtcsId); + retVal &= GetCiEmapCheckVer(localCiId, &emapCheckVer, CI_SYSTEM_TYPE_VOBC);/*RC模式下,与IVOC,VOBC版本都使用RC表配置项*/ + +/*首先获取组包时所需的信息,获取成功才有必要继续组包*/ + if (CI_SUCCESS == retVal) + { + ii = 0U; + + /*开始组应用数据帧*/ + ShortToChar(VOBC_RC_INTERFACE_INFOTYPE, &chRcToVobcDataBuffer[ii]);/*接口信息类型*/ + ii += 2U; + + LongToChar(ciEtcsId, &chRcToVobcDataBuffer[ii]);/*发送方标识信息*/ + ii += 4U; + LongToChar(vobcEtcsId, &chRcToVobcDataBuffer[ii]);/*接收方标识信息*/ + ii += 4U; + LongToChar(emapCheckVer, &chRcToVobcDataBuffer[ii]);/*电子地图版本校验信息*/ + ii += 4U; + LongToChar(curCycleNum, &chRcToVobcDataBuffer[ii]);/*本方消息序列号*/ + ii += 4U; + ShortToChar((UINT16)appCycleTime, &chRcToVobcDataBuffer[ii]);/*设备通讯周期*/ + ii += 2U; + chCtxSrcCrntSN = GetHLHTHeadCtxSrcCrntSN(CI_SYSTEM_TYPE_VOBC, (UINT8)(pstVobcToRcDataStru->VobcId)); + LongToChar(chCtxSrcCrntSN, &chRcToVobcDataBuffer[ii]);/*对方消息序列号:收到对方上一条消息中的对方消息序列号*/ + ii += 4U; + chCtxCiRcvSN = GetHLHTHeadCtxCiRcvSN(CI_SYSTEM_TYPE_VOBC, (UINT8)(pstVobcToRcDataStru->VobcId)); + LongToChar(chCtxCiRcvSN, &chRcToVobcDataBuffer[ii]);/*收到上一条消息时本方序列号*/ + ii += 4U; + + chRcToVobcDataBuffer[ii++] = RC_VOBC_PRTCL_VER;/*RC_VOBC接口协议版本号*/ + /*通用报文头中的应用层报文总长度*/ + ii += 2U; + + /*以下为应用层数据*/ + ii += 2U;/*报文长度*/ + + ShortToChar(RC_VOBC_STATE_FRAME, &chRcToVobcDataBuffer[ii]); + ii += 2u;/*应用报文类型*/ + ii += 2u;/*预留两个字节*/ + + retVal = PackRcToVobcArbState(chRcToVobcDataBuffer,&ii); + + if (CI_SUCCESS == retVal) + { + /*组包成功*/ + } + else + { + /*发生组包错误*/ + debug_infor_printf((const)"\n VOBC: %d PackRcToVobcArbState Error \n", pstVobcToRcDataStru->VobcId); + } + + if (CI_SUCCESS == retVal) + { + if (CI_IVOC_PACKET_LENGTH_MAX > ii) + { + ; /*继续执行*/ + } + else + { + retVal = CI_ERROR; + debug_infor_printf((const)"\nPack vobc %d PackRcToVobcStateData Error, len: %d \n", pstVobcToRcDataStru->VobcId, ii); + } + } + + if (CI_SUCCESS == retVal) + { + /*通用报文头中应用层报文总长度*/ + chRcToVobcDataBuffer[29U] = (UINT8)((UINT8)((ii - 31U) >> 8u) & 0xffu); + chRcToVobcDataBuffer[30U] = (UINT8)((ii - 31U) & 0xffu); + + /*应用层数据的报文长度 */ + chRcToVobcDataBuffer[31U] = (UINT8)((UINT8)((ii - 33U) >> 8u) & 0xffu); + chRcToVobcDataBuffer[32U] = (UINT8)((ii - 33U) & 0xffu); + + dstDevId = ((UINT16)(CI_SYSTEM_TYPE_VOBC << 8U) | pstVobcToRcDataStru->VobcId); + outnetSafeSendRtn = OutnetSafeSend(dstDevId, pstVobcToRcDataStru->vobcLogId, &chRcToVobcDataBuffer[0U], ii); + if (1u == outnetSafeSendRtn) + { /*写队列成功*/ +#ifdef LOGPRINT/*日志打印宏*/ +#ifdef PLATFORM_2OO2/*2oo2平台打印*/ + debug_infor_printf((const)"\nRC_VOBC_CBTC_SEND:%d", ii); + debug_out_array(0xAA, chRcToVobcDataBuffer, ii); +#endif/*平台打印结束*/ +#endif + retVal = CI_SUCCESS; + } + else + { + /*写队列失败*/ + retVal = CI_ERROR; + } + } + else + { + ; + } + } + else + { + ; + } + + return retVal; +} + +/* +* 功能描述:组包RC到VOBC的ARB状态信息 +* 参数说明: UINT8* dataBuf, 数据缓冲区 +* UINT16 *dataLength, 数据长度 输出参数 +* 返 回 值:CI_ERROR 0 失败 +* CI_SUCCESS 1 成功 +* by cgh 20260328 +*/ +static UINT8 PackRcToVobcArbState(UINT8* pDataBuf, UINT16* wDataLength) +{ + UINT8 chRetVal = CI_ERROR; + UINT16 ii = 0U; + UINT8 cLocalCiId = 0U; /*本地联锁ID*/ + UINT16 wArbSecNumIndex = 0U; /*ARB区段数量所在索引*/ + UINT16 wAxisSecSum = 0U; /*本控区计轴区段数量*/ + UINT16 wAxisSecId = 0U; /*计轴区段ID*/ + UINT8 cAxisSecBlongCiId = 0U; /*计轴区段所属控区*/ + UINT8 chAcArbState = 0U; /*计轴区段ARB状态*/ + UINT16 wAxisSecIndex = 0U; /*计轴区段索引*/ + UINT16 wSendArbStateNum = 0U; /*发送ARB区段数目*/ + + if ((NULL == pDataBuf) || (NULL == wDataLength)) + { + chRetVal = CI_ERROR; + } + else + { + + ii = *wDataLength; + wArbSecNumIndex = ii; + ii += 2U; + + chRetVal = CI_SUCCESS; + + cLocalCiId = GetSystemParaLocalCiId(); + wAxisSecSum = GetAxisSecCurSum(); + /*遍历本控区计轴区段*/ + for (wAxisSecIndex = 0U; wAxisSecIndex < wAxisSecSum; wAxisSecIndex++) + { + wAxisSecId = GetAxisSecId(wAxisSecIndex); + cAxisSecBlongCiId = GetAxisSectionBelongCiId(wAxisSecId); + + if ((cLocalCiId == cAxisSecBlongCiId) && (0U != cAxisSecBlongCiId)) + { + chAcArbState = aam_GetAxisStatusAPI(wAxisSecId); + /* 计轴区段ARB,则逻辑区段ARB */ + if (AAM_STATUS_ARB == chAcArbState) + { + /*区段ARB,记录当前区段 ID*/ + ShortToChar(wAxisSecId, &pDataBuf[ii]); + ii += 2U; + wSendArbStateNum++; + } + else + { + ; /*继续查找*/ + } + } + else + { + ; /*不属于本控区,只是异常防护*/ + } + } + + } + + if (CI_SUCCESS == chRetVal) + { + ShortToChar(wSendArbStateNum, &pDataBuf[wArbSecNumIndex]); /*组ARB区段数量*/ + *wDataLength = ii; + } + else + { + chRetVal = CI_ERROR; + } + + return chRetVal; +} + diff --git a/TSCP/src/APP/ciapp/ParsePack/ParsePackVobcData.h b/TSCP/src/APP/ciapp/ParsePack/ParsePackVobcData.h index 8cef97a..960f44f 100644 --- a/TSCP/src/APP/ciapp/ParsePack/ParsePackVobcData.h +++ b/TSCP/src/APP/ciapp/ParsePack/ParsePackVobcData.h @@ -36,6 +36,8 @@ #include "../IO/DeviceRelayDataProcess.h" #include "dquIdmapQuery.h" #include "../Section/LogicSectionConfigDataManage.h" +#include "AxisAssertDefine.h" +#include "AxisAssertManageAPI.h" #define CI_PSD_COMM_STATE_GOOD ((UINT8)0x55) @@ -53,7 +55,7 @@ #define CI_VOBC_NO_LOCK ((UINT8)0x00) /*CI给后备通道发站外直轨锁闭方向,默认值*/ -#define CI_VOBC_INTERFACE_INFOTYPE ((UINT16)0x0206) /*互联互通CI_VOBC接口信息类型*/ +#define CI_VOBC_INTERFACE_INFOTYPE ((UINT16)0x0206) /*互联互通CI_VOBC接口信息类型*/ #define CI_VOBC_BACKUP_INTERFACE_INFOTYPE ((UINT16)0x0402) /*后备模式的CI_VOBC接口信息类型*/ #define VOBC_CI_INFO_TYPE_PSD_CONTROL ((UINT16)0x0201) /*VOBC_CI屏蔽门控制报文类型*/ #define VOBC_CI_INFO_TYPE_BACKUP ((UINT16)0x0308) /*VOBC_CI备用通道报文类型*/ @@ -73,6 +75,10 @@ #define CI_VOBC_BACKUP_STATE_INFO ((UINT16)0x0211) /*CI=>VOBC后备运行状态信息*/ #define VOBC_CI_INFO_TYPE_BACKUU_CONTROL ((UINT16)0x0212) /*VOBC=>CI后备运行控制信息*/ +/*VOBC_CI点连式信息帧-目前仅互联互通接口具备,帧类型与全自动运行洗车重复,若需要适配其他接口,需要重新排帧类型*/ +#define VOBC_CI_INFO_TYPE_BLOCLINK ((UINT16)0x020b) /*VOBC_CI点连式信息帧类型*/ +#define CI_VOBC_INFO_TYPE_BLOCLINK ((UINT16)0x020c) /*CI_VOBC点连式信息帧类型*/ + #define VOBC_CI_GAP_DETECT_CMD_START ((UINT8)0x55) /*VOBC2CI启动间隙探测命令*/ #define VOBC_CI_GAP_DETECT_CMD_STOP ((UINT8)0xAA) /*VOBC2CI停止间隙探测命令*/ #define VOBC_CI_GAP_DETECT_CMD_DEFAULT ((UINT8)0xFF) /*VOBC2CI默认间隙探测命令*/ @@ -106,7 +112,8 @@ #define VOBC_RC_INTERFACE_INFOTYPE ((UINT16)0x0217U) /*VOBC-RC接口,RC-VOBC接口*/ #define VOBC_RC_INFO_STATE ((UINT16)0x0201U) /*VOBC->RC控制信息,周期发送*/ -#define RC_VOBC_HEART_FRAME ((UINT16)0x0202U) /*RC->VOBC心跳信息,周期发送*/ +#define RC_VOBC_HEART_FRAME ((UINT16)0x0202U) /*RC->VOBC心跳信息,非周期发送*/ +#define RC_VOBC_STATE_FRAME ((UINT16)0x0205U) /*RC->VOBC设备状态信息,周期发送*/ #define CI_IVOC_PRTCL_VER ((UINT8)0x01U) /*CI_VOBC协议版本号*/ @@ -145,9 +152,9 @@ #define IVOC_CI_LOGOUT_NORMAL ((UINT8)0x00U) /*IVOC到IC 正常注销*/ #define IVOC_CI_LOGOUT_SLEEP ((UINT8)0x01U) /*IVOC到IC 休眠注销*/ -#define VOBC_CI_DIR_UP ((UINT8)0x55U) /*IVOC到IC 上行*/ -#define VOBC_CI_DIR_DOWN ((UINT8)0xAAU) /*IVOC到IC 下行*/ -#define VOBC_CI_DIR_DEF ((UINT8)0xFFU) /*IVOC到IC 默认*/ +#define VOBC_CI_DIR_UP ((UINT8)0x55U) /*VOBC-CI 上行*/ +#define VOBC_CI_DIR_DOWN ((UINT8)0xAAU) /*VOBC-CI 下行*/ +#define VOBC_CI_DIR_DEF ((UINT8)0xFFU) /*VOBC-CI 默认*/ #define CI_IVOC_SWITCH_POSTION_DING ((UINT8)0x55U) /*CI到IVOC道岔定位状态*/ #define CI_IVOC_SWITCH_POSTION_FAN ((UINT8)0xAAU) /*CI到IVOC道岔反位状态*/ @@ -225,6 +232,7 @@ #define IVOC_CI_FLOODGATE_CLOSE_ALLOW_SUM ((UINT8)50U) /*IVOC到CI防淹门关闭允许的数量最大值*/ #define IVOC_CI_GARAGEDOOR_CLOSE_ALLOW_SUM ((UINT8)50U) /*IVOC到CI车库门关闭允许的数量最大值*/ #define CI_IVOC_YUXIANOPEN_ROUTE_MAX ((UINT8)200U) /*CI到IVOC预先开放进路最大值*/ +#define CI_IVOC_COM_ERR_RC_NUM_MAX ((UINT8)5U) /*CI到IVOC通信故障RC最大值*/ #define CI_IVOC_URGENT_YES ((UINT8)0x55U) /*CI到IVOC 紧急制动状态有效*/ #define CI_IVOC_URGENT_NO ((UINT8)0xaaU) /*CI到IVOC 紧急制动状态无效*/ @@ -243,6 +251,23 @@ #define TRAIN_LEN_MIN 1000U /*最小车长*/ #define TRAIN_LEN_MAX 50000U /*最大车长*/ +#define VOBC_CI_BLOCLINK_BLOCK_CTRL ((UINT8)0x01) /*点式列车控制级别*/ +#define VOBC_CI_BLOCLINK_CI_CTRL ((UINT8)0x02) /*联锁控制级别*/ +#define VOBC_CI_BLOCLINK_CI_DEFAULT ((UINT8)0xFF) /*默认值*/ + +#define CI_VOBC_SWITCH_MAX ((UINT8)20U) /*CI-VOBC点连式道岔数量最大值*/ +#define CI_VOBC_OTHER_EQUIPMENT_MAX ((UINT8)10U) /*CI-VOBC点连式其他设备数量最大值*/ + +#define CI_VOBC_XIANSU_NOT ((UINT8)0xaaU) /*CI-VOBC点连式未设置临时限速*/ +#define CI_VOBC_XIANSU_YES ((UINT8)0x55U) /*CI-VOBC点连式已设置临时限速*/ + +#define CI_VOBC_DESTINATION_TYPE_RETURN ((UINT8)0xaaU) /*CI-VOBC点连式目的地属性-折返*/ +#define CI_VOBC_DESTINATION_TYPE_LIECHE ((UINT8)0x55U) /*CI-VOBC点连式目的地属性-直通*/ + +#define CI_VOBC_FLOOD_STATE_OPEN ((UINT8)0xaaU) /*CI-VOBC点连式防淹门开启锁定状态且无关门请求*/ +#define CI_VOBC_FLOOD_STATE_CLOSE ((UINT8)0x55U) /*CI-VOBC点连式防淹非开启锁定状态或有关门请求*/ + + #ifdef __cplusplus extern "C" { #endif @@ -286,6 +311,18 @@ typedef struct S_IvocToCiCmdStruct UINT16 wCmdDevId[IVOC_CI_CMD_DEVICE_MAX]; /* 命令设备ID数组*/ }IvocCmdStru; +/*点连式信息*/ +typedef struct S_VobcToCiBlocLinkStruct +{ + UINT8 chBlocLinkTrainLevel; /*点连式运行级别*/ + UINT32 chBlocLinkCycle; /*点连式通信周期*/ + UINT8 chTrainDirection; /*运行方向*/ + UINT16 wTrainMaxSafeHeadLink; /*列车最大安全前端所处Link*/ + UINT32 dwTrainMaxSafeHeadOffset; /*列车最大安全前端偏移量*/ + UINT16 wTrainMinSafeTailLink; /*列车最小安全后端所处link*/ + UINT32 dwTrainMinSafeTailOffset; /*列车最小安全后端偏移量*/ +}VobcToCiBlocLinkStruct; + /*与联锁通信的Vobc信息*/ typedef struct S_VobcToCiDataStruct { @@ -295,6 +332,7 @@ typedef struct S_VobcToCiDataStruct UINT8 washTrainRequest; /*洗车请求信息*/ UINT8 headWashStopSteadyInfo; /*头端洗位停稳信息,洗车停稳1*/ UINT8 tailWashStopSteadyInfo; /*尾端洗位停稳信息,洗车停稳2*/ + UINT8 couplingWashStopSteadyInfo; /*联挂端洗位停稳信息,洗车停稳3*/ UINT8 passWashMachineRequest; /*通过洗车机请求信息*/ UINT8 washPauseRequest; /*暂停洗车请求*/ UINT8 chWashMachineWorkMode; /*洗车机工作模式设置*/ @@ -309,7 +347,9 @@ typedef struct S_VobcToCiDataStruct UINT16 vobcLogId; /*互联互通4IP VOBC1端或2端标识*/ VobcToCiPsdDataStruct PsdData[VOBC_TO_CI_TRAIN_PSD_MAX]; /*关联屏蔽门数据*/ UINT32 signalID; /*VOBC->CI信号机ID*/ - + + VobcToCiBlocLinkStruct strBlocLinkData; /*VOBC->CI点连式信息*/ + /*add by qw.liu 2022-02-24 增加车车新接口字段*/ UINT8 chTrainLevel; /*列车运行级别:01:VBTC;02:ITC;03:UR;04:ABL*/ UINT8 chTrainMode; /*列车模式*/ @@ -809,6 +849,32 @@ UINT8 GetRecvVobcControlMode(const UINT16 wVobcId); * Create: fan 20250725 */ UINT8 PackCiToIvocOpenRouteNotNearInfo(UINT8* pDataBuf, UINT16* wDataLength, UINT16 wTrainId); +/* +* 功能描述: 组VOBC点连式数据 +* 参数说明: UINT8* CiToVobcDataBuffer 存放信息的buffer +* UINT16* ii 偏移量 +* VobcToCiDataStruct *vobcToCiDataStru VOBC-CI数据 +* 返回值 : 无 +* Create: lyj 20260314 +*/ +void PackVobcBlocLinkData(UINT8* CiToVobcDataBuffer, UINT16* ii, VobcToCiDataStruct* vobcToCiDataStru); +/* +* 功能描述: 解析VOBC点连式数据 +* 参数说明: const UINT8* dataBuf, 数据缓冲区 +* const UINT16 dataLength, 数据长度 +* VobcToCiDataStruct* vobcToCiDataStru VOBC到CI结构体数据 +* 返回值 : 解析结果 +* Create: lyj 20260314 +*/ +UINT8 ParseVobcBlocLinkData(const UINT8* dataBuf, const UINT16 dataLength, VobcToCiDataStruct* vobcToCiDataStru); +/* +* 功能描述:检查设备是否已经添加 +* 参数说明:const UINT16 wCheckDeviceId 检查设备ID +* const UINT16* pDeviceBuf 数组 +* const UINT8 wDeviceNum 数量 +* 返回值 :检查结果 +*/ +UINT8 CheckRepeatData(const UINT16 wCheckDeviceId, const UINT16* pDeviceBuf, const UINT8 wDeviceNum); #ifdef __cplusplus } #endif diff --git a/TSCP/src/APP/ciapp/ParsePack/ParsePackZcData.c b/TSCP/src/APP/ciapp/ParsePack/ParsePackZcData.c index 5c9ef07..98cc0c5 100644 --- a/TSCP/src/APP/ciapp/ParsePack/ParsePackZcData.c +++ b/TSCP/src/APP/ciapp/ParsePack/ParsePackZcData.c @@ -28,6 +28,11 @@ UINT8 lineIdentity = 0u; /* ZcToCiDynamicDataStruct gZcToCiDymDataStru = { 0U }; /*ZC动态数据结构体*/ +UINT8 gCbtcCrossNumZc = 0u; /*主控CBTC列车跨压数量*/ +CbtcCrossStructZC gCbtcCrossStructZc[ALL_CBTC_CROSS_SUM_MAX] = { 0u }; /*主控CBTC列车跨压信息*/ + +static UINT8 ParseZcCbtcCrossData(UINT8* pDataBuf, UINT16 dataLen); +static UINT16 PackRcTacsCrossData(UINT8 *pDataBuf); /* * 功能描述: 解析ZC单帧数据 @@ -41,8 +46,6 @@ UINT8 ParseZcToCiDataFrame(UINT8* dataBuf, UINT16 dataLength, UINT8 systemId) { UINT8* sourceId = NULL; /*源ID*/ UINT16 ii = 0u; - UINT16 jj = 0u; - UINT8 kk = 0u; UINT8 retVal = CI_SUCCESS; UINT32 dwStep = 0U; UINT8 galHeadSaved = 0u; /*通用头是否已保存标志,1保存;0未保存*/ @@ -133,7 +136,7 @@ UINT8 ParseZcToCiDataFrame(UINT8* dataBuf, UINT16 dataLength, UINT8 systemId) /*报文有效,继续解析*/ retVal = CI_SUCCESS; { - if (DATA_TYPE_NEW == chDataType) + if (DATA_TYPE_MAIN_BRANCH == chDataType) { while (wTmpDataLen < hlhtGalHead.totalDataLen) { @@ -191,6 +194,11 @@ UINT8 ParseZcToCiDataFrame(UINT8* dataBuf, UINT16 dataLength, UINT8 systemId) 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; @@ -1072,6 +1080,7 @@ UINT8 PackCiToZcData( UINT8 deviceId) UINT32 dwHlhtHSrcSN = 0u; UINT32 dwHlhtHRcvSN = 0u; UINT16 totallenIndex = 0U; + UINT16 wCrossFrameLen = 0U; UINT8 chDataType = 0U; localCi = GetSystemParaLocalCiId(); /*获取本地联锁ID*/ @@ -1151,7 +1160,7 @@ UINT8 PackCiToZcData( UINT8 deviceId) totallenIndex = ii; ii += 2u;/*通用报文头中的应用层报文总长度*/ - if (DATA_TYPE_NEW == chDataType) + if (DATA_TYPE_MAIN_BRANCH == chDataType) { ii += 2u;/*通用报文头中的应用层报文长度(0x202报文长度)*/ @@ -1167,16 +1176,27 @@ UINT8 PackCiToZcData( UINT8 deviceId) /*组码位信息*/ (void)MaskPack(CI_SYSTEM_TYPE_ZC,&CiToZcDataBuffer[ii]); - ii = (UINT16) (ii + SendMaskSum); + ii = (UINT16)(ii + SendMaskSum); - /*通用报文头中应用层报文总长度*/ - ShortToChar(ii - totallenIndex - 2U, &CiToZcDataBuffer[totallenIndex]); - if (DATA_TYPE_NEW == chDataType) + if (DATA_TYPE_MAIN_BRANCH == chDataType) { /*通用应用层报文长度(0x202报文长度)*/ - totallenIndex += 2U; - ShortToChar(ii - totallenIndex - 2U, &CiToZcDataBuffer[totallenIndex]); + /*刨去2字节应用报文总长度+2字节0202帧长度*/ + ShortToChar((ii - (totallenIndex + 4u)), &CiToZcDataBuffer[totallenIndex + 2u]); + + /*组TACS列车跨压信息*/ + wCrossFrameLen = PackRcTacsCrossData(&CiToZcDataBuffer[ii]); + ii += wCrossFrameLen; } + else + { + /*nothing*/ + } + + /*通用报文头中应用层报文总长度*/ + /*刨去2字节应用报文总长度*/ + ShortToChar(ii - (totallenIndex + 2u), &CiToZcDataBuffer[totallenIndex]); + /*清ZC数据*/ ClearZcData(); @@ -1244,6 +1264,101 @@ UINT8 PackCiToZcData( UINT8 deviceId) return retVal; } +/* +* 功能描述: 组发送给ZC的TACS主控列车跨压信息 +* 参数说明: UINT8 *pDataBuf 数据包 +* 返回值 : 数据长度 +*/ +static UINT16 PackRcTacsCrossData(UINT8 *pDataBuf) +{ + UINT16 Index = 0u; /*索引编号*/ + UINT16 i = 0u; /*循环变量*/ + UINT8 j = 0u; /*循环变量*/ + UINT16 wSignalCurSum = 0u; /*信号机数量*/ + UINT16 wSignalId = 0u; /*信号机ID*/ + UINT8 wSignalBelongCiId = 0u; /*信号机所属联锁ID*/ + UINT8 wLocalCiId = 0u; /*本机联锁ID*/ + UINT8 wCrossTacsTrainId = 0u; /*TACS跨压列车ID*/ + + UINT8 wTacsCrossTrainSum = 0u; /*TACS跨压列车数量*/ + UINT16 wTacsCrossSignalBuf[ALL_TACS_CROSS_SUM_MAX] = { 0u }; /*TACS跨压信号机ID数组*/ + UINT8 wTacsCrossTrainBuf[ALL_TACS_CROSS_SUM_MAX] = { 0u }; /*TACS跨压列车ID数组*/ + + /*Step1:TACS跨压信息准备*/ + wSignalCurSum = GetSignalCurSum(); + /*遍历所有本联锁信号机*/ + for (i = 0u; i < wSignalCurSum; i++) + { + wSignalId = GetSignalId(i); + wSignalBelongCiId = GetSignalBelongCiId(wSignalId); + wLocalCiId = GetSystemParaLocalCiId(); + if (wSignalBelongCiId == wLocalCiId) + { + /*判断跨压TACS主控列车ID是否为零*/ + wCrossTacsTrainId = GetSignalCrossTacsTrainIdCC(wSignalId); + + /*非法值防护*/ + if ((0u < wSignalId) && (CROSS_SIGNAL_ID_MAX >= wSignalId) + && (0u < wCrossTacsTrainId) && (TACS_CROSS_ID_MAX >= wCrossTacsTrainId) + && (ALL_TACS_CROSS_SUM_MAX >= wTacsCrossTrainSum)) + { + /*TACS主控列车ID有效,赋值至待发送数组*/ + wTacsCrossSignalBuf[wTacsCrossTrainSum] = wSignalId; + wTacsCrossTrainBuf[wTacsCrossTrainSum] = wCrossTacsTrainId; + wTacsCrossTrainSum += 1u; + } + else + { + /*不处理*/ + } + } + else + { + /*不处理*/ + } + } + + /*Step2:TACS跨压信息组包*/ + /*帧长度,最后赋值*/ + Index += 2u; + + /*帧类型*/ + ShortToChar(RC_TO_ZC_TACS_CROSS_MSG, &pDataBuf[Index]); + Index += 2u; + + /*预留2字节发0*/ + ShortToChar(0u, &pDataBuf[Index]); + Index += 2u; + + /*跨压TACS主控列车数量*/ + pDataBuf[Index] = wTacsCrossTrainSum; + Index += 1u; + + for (j = 0u; j < wTacsCrossTrainSum; j++) + { + /*跨压信号机ID*/ + ShortToChar(wTacsCrossSignalBuf[j], &pDataBuf[Index]); + Index += 2u; + + /*跨压列车ID*/ + pDataBuf[Index] = wTacsCrossTrainBuf[j]; + Index += 1u; + } + + /*最后赋值长度*/ + 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; +} + /* * 功能描述: 获取ZC码位值Buf @@ -1448,6 +1563,92 @@ UINT8 ParseZcIteCutData(UINT8* dataBuf, UINT16 dataLen) return cRetVal; } +/* +* 功能描述:解析ZC到CI的CBTC主控列车跨压数据 +* 参数说明:UINT8* pDataBuf 数据缓冲区 +* UINT16 dataLen 数据长度 +* 返 回 值:CI_ERROR 0 数据解析失败 +* CI_SUCCESS 1 数据解析成功 +* Edit By wyd 2026.3.26 +*/ +static UINT8 ParseZcCbtcCrossData(UINT8* pDataBuf, UINT16 dataLen) +{ + UINT8 cRetVal = CI_ERROR; /*函数返回值*/ + UINT8 wCrossNum = 0u; /*承接跨压状态*/ + UINT16 ii = 0U; /*数组下标变量*/ + UINT8 jj = 0U; /*循环变量*/ + UINT16 wSignalId = 0U; /*承接跨压信号机ID*/ + UINT8 wTrainId = 0U; /*承接跨压列车ID*/ + + if (NULL != pDataBuf) + { + cRetVal = CI_SUCCESS; + wCrossNum = pDataBuf[ii]; + ii++; + + if (ALL_CBTC_CROSS_SUM_MAX >= wCrossNum) + { + ZcToCiDataStru.wCbtcCrossNum = wCrossNum; + for (jj = 0U; jj < wCrossNum; jj++) + { + wSignalId = ShortFromChar(&pDataBuf[ii]); /*解析信号机ID*/ + ii += 2u; + + if ((0U < wSignalId) && (CROSS_SIGNAL_ID_MAX >= wSignalId)) + { + ZcToCiDataStru.wCbtcCrossSignalId[jj] = wSignalId; + } + else + { + debug_infor_printf((const)"ParseZcCbtcCrossData: wSignalId Error\n"); + cRetVal = CI_ERROR; /*Z信号机ID超限,返回失败*/ + } + + wTrainId = pDataBuf[ii]; /*解析列车ID*/ + ii += 1u; + + if ((0U < wTrainId) && (CBTC_CROSS_ID_MAX >= wTrainId)) + { + ZcToCiDataStru.wCbtcCrossTrainId[jj] = wTrainId; + } + else + { + debug_infor_printf((const)"ParseZcCbtcCrossData: wTrainId Error\n"); + cRetVal = CI_ERROR; /*列车ID超限,返回失败*/ + } + } + + if (CI_SUCCESS == cRetVal) + { + if (dataLen != ii) + { + debug_infor_printf((const)"ParseZcCbtcCrossData: Msg Len Error\n"); + cRetVal = CI_ERROR; + } + else + { + /*不处理*/ + } + } + else + { + /*不处理*/ + } + } + else + { + debug_infor_printf((const)"ParseZcCbtcCrossData Error: wCrossNum Error\n"); + cRetVal = CI_ERROR; /*状态非法,返回失败*/ + } + } + else + { + cRetVal = CI_ERROR; /*入参非法,返回失败*/ + } + + return cRetVal; +} + /** * @brief 获取ZC发送的进路停车保证标志 * @param[in] UINT16 wDeviceId 设备ID @@ -2017,4 +2218,61 @@ void SetLocalSnowModelZc(UINT8 setmodle) { ; /*不处理*/ } +} + +/* +* 功能描述:获取ZC发送的CBTC主控列车跨压数量 +* 参数说明:无 +* 返 回 值:跨压数量 +* Created By wyd 2026.3.27 +*/ +UINT8 GetCbtcCrossNumZc(void) +{ + return gCbtcCrossNumZc; +} + +/* +* 功能描述:获取ZC发送的CBTC主控列车跨压信息 +* 参数说明:无 +* 返 回 值:跨压信息 +* Created By wyd 2026.3.27 +*/ +CbtcCrossStructZC *GetCbtcCrossStructZc(void) +{ + return gCbtcCrossStructZc; +} + +/* +* 功能描述:设置ZC发送CBTC主控列车跨压信息 +* 参数说明:UINT8 wCrossNum 跨压数量 +* UINT16 wSignalId[ALL_CBTC_CROSS_SUM_MAX] 跨压信号机ID +* UINT8 wTrainId[ALL_CBTC_CROSS_SUM_MAX] 跨压列车ID +* 返 回 值:无 +* 注意事项:RC接收CI->RC同步过来的该信息时,是直接赋值,没调用该接口函数 +* Created By wyd 2026.3.26 +*/ +void SetCbtcCrossInfo(UINT8 wCrossNum, UINT16 wSignalId[ALL_CBTC_CROSS_SUM_MAX], + UINT8 wTrainId[ALL_CBTC_CROSS_SUM_MAX]) +{ + UINT8 i = 0u; + + /*先清空,防止残留脏数据*/ + (void)CommonMemSet(gCbtcCrossStructZc, ALL_CBTC_CROSS_SUM_MAX * sizeof(CbtcCrossStructZC), + 0x00u, ALL_CBTC_CROSS_SUM_MAX * sizeof(CbtcCrossStructZC)); + + /*赋值跨压数量和ID*/ + gCbtcCrossNumZc = wCrossNum; + + if ((NULL == wSignalId) || (NULL == wTrainId)) + { + /*不处理*/ + } + else + { + for (i = 0u; i < wCrossNum; i++) + { + gCbtcCrossStructZc[i].wSignalId = wSignalId[i]; + gCbtcCrossStructZc[i].wTrainId = wTrainId[i]; + } + } } \ No newline at end of file diff --git a/TSCP/src/APP/ciapp/ParsePack/ParsePackZcData.h b/TSCP/src/APP/ciapp/ParsePack/ParsePackZcData.h index 54c3f55..bbbca0e 100644 --- a/TSCP/src/APP/ciapp/ParsePack/ParsePackZcData.h +++ b/TSCP/src/APP/ciapp/ParsePack/ParsePackZcData.h @@ -26,15 +26,17 @@ #include "../ParsePack/ParsePackTmcData.h" -#define CI_ZC_INTERFACE_INFOTYPE ((UINT16)0x0106) /*互联互通CI_ZC接口信息类型*/ -#define CI_ZC_PRTCL_VER ((UINT16)0x65) /*CI_ZC协议版本号,根据《IFAO-3048-ZC-CI接口说明书》修改*/ -#define ZC_TO_TIOC_MASK_MSG ((UINT16)0x0201u) /*ZC发送TIOC码位信息类型*/ -#define TIOC_TO_ZC_MASK_MSG ((UINT16)0x0202u) /*TIOC发送ZC码位信息类型*/ -#define ZC_TO_TIOC_TSR_MSG ((UINT16)0x0203u) /*ZC发送TIOC临时限速信息类型*/ -#define ZC_TO_TIOC_WLB_MSG ((UINT16)0x0204u) /*ZC发送TIOC紧急制动信息类型*/ -#define ZC_TO_TIOC_SNOW_MSG ((UINT16)0x0205u) /*ZC发送TIOC雨雪模式信息类型*/ -#define ZC_TO_TIOC_ITELINECUT_MSG ((UINT16)0x0206U) /*ZC发送TIOC的全线ITE切除状态信息类型*/ -#define ZC_TSR_VALID ((UINT8)0x55U) /*ZC发送临时限速有效*/ +#define CI_ZC_INTERFACE_INFOTYPE ((UINT16)0x0106) /*互联互通CI_ZC接口信息类型*/ +#define CI_ZC_PRTCL_VER ((UINT16)0x65) /*CI_ZC协议版本号,根据《IFAO-3048-ZC-CI接口说明书》修改*/ +#define ZC_TO_TIOC_MASK_MSG ((UINT16)0x0201u) /*ZC发送TIOC码位信息类型*/ +#define TIOC_TO_ZC_MASK_MSG ((UINT16)0x0202u) /*TIOC发送ZC码位信息类型*/ +#define ZC_TO_TIOC_TSR_MSG ((UINT16)0x0203u) /*ZC发送TIOC临时限速信息类型*/ +#define ZC_TO_TIOC_WLB_MSG ((UINT16)0x0204u) /*ZC发送TIOC紧急制动信息类型*/ +#define ZC_TO_TIOC_SNOW_MSG ((UINT16)0x0205u) /*ZC发送TIOC雨雪模式信息类型*/ +#define ZC_TO_TIOC_ITELINECUT_MSG ((UINT16)0x0206U) /*ZC发送TIOC的全线ITE切除状态信息类型*/ +#define ZC_TO_RC_CBTC_CROSS_MSG ((UINT16)0x0207U) /*ZC发送给RC的主控CBTC列车跨压信息*/ +#define RC_TO_ZC_TACS_CROSS_MSG ((UINT16)0x0208u) /*RC发送给ZC的主控TACS列车跨压信息*/ +#define ZC_TSR_VALID ((UINT8)0x55U) /*ZC发送临时限速有效*/ #ifdef __cplusplus extern "C" { @@ -64,6 +66,9 @@ typedef struct S_ZcToCiDataStruct UINT8 cIteLineCutState; /* ITE全线切除状态 */ UINT8 cAreaIteCutNum; /*区间ITE切除数量*/ UINT16 szAreaIteCutId[ALL_AREA_SNOW_SUM_MAX]; /*区间ITE切除ID数组*/ + UINT8 wCbtcCrossNum; /*CBTC主控列车跨压数量*/ + UINT16 wCbtcCrossSignalId[ALL_CBTC_CROSS_SUM_MAX]; /*CBTC主控列车跨压信号机ID*/ + UINT8 wCbtcCrossTrainId[ALL_CBTC_CROSS_SUM_MAX]; /*CBTC主控列车跨压列车ID*/ } ZcToCiDataStruct; /*ZC发送的信号机动态数据结构体*/ @@ -87,7 +92,7 @@ typedef struct S_LogicSectionDataStructZC typedef struct S_AxisSectionDataStructZC { UINT16 AxisSectionId; /*计轴区段ID (初始化字段)*/ - UINT8 AxisArbState; /*计轴ARB状态CC(0x55-未ARB,0xaa-ARB)*/ + UINT8 AxisArbState; /*计轴ARB状态(0x55-未ARB,0xaa-ARB)*/ }AxisSectionDataStructZC; /*ZC发送的物理区段动态数据结构体*/ @@ -104,6 +109,13 @@ typedef struct S_RouteDataStructZC UINT8 StopensureFlag; /*停车保证标志ZC(0x55:已设置,0xAA:未设置) */ }RouteDataStructZC; +/*ZC发送的CBTC主控列车跨压结构体*/ +typedef struct S_CbtcCrossStructZC +{ + UINT16 wSignalId; /*跨压信号机ID*/ + UINT8 wTrainId; /*跨压列车ID*/ +}CbtcCrossStructZC; + /*存储ZC发送的动态数据结构体*/ typedef struct S_ZcToCiDynamicDataStruct { @@ -133,7 +145,8 @@ extern ComTrainPosDataStruct ComTrainPosDataStru[ZC_TO_CI_TRAIN_MAX]; extern UINT16 ComTrainSum; extern UINT8 lineIdentity; extern ZcToCiDynamicDataStruct gZcToCiDymDataStru; /*ZC动态数据结构体*/ - +extern UINT8 gCbtcCrossNumZc; +extern CbtcCrossStructZC gCbtcCrossStructZc[ALL_CBTC_CROSS_SUM_MAX]; #endif @@ -468,6 +481,34 @@ UINT8 GetLocalSnowModelZc(void); */ void SetLocalSnowModelZc(UINT8 setmodle); +/* +* 功能描述:获取ZC发送的CBTC主控列车跨压数量 +* 参数说明:无 +* 返 回 值:跨压数量 +* Created By wyd 2026.3.27 +*/ +UINT8 GetCbtcCrossNumZc(void); + +/* +* 功能描述:获取ZC发送的CBTC主控列车跨压信息 +* 参数说明:无 +* 返 回 值:跨压信息 +* Created By wyd 2026.3.27 +*/ +CbtcCrossStructZC *GetCbtcCrossStructZc(void); + +/* +* 功能描述:设置ZC发送CBTC主控列车跨压信息 +* 参数说明:UINT8 wCrossNum 跨压数量 +* UINT16 wSignalId[ALL_CBTC_CROSS_SUM_MAX] 跨压信号机ID +* UINT8 wTrainId[ALL_CBTC_CROSS_SUM_MAX] 跨压列车ID +* 返 回 值:无 +* 注意事项:RC接收CI->RC同步过来的该信息时,是直接赋值,没调用该接口函数 +* Created By wyd 2026.3.26 +*/ +void SetCbtcCrossInfo(UINT8 wCrossNum, UINT16 wSignalId[ALL_CBTC_CROSS_SUM_MAX], + UINT8 wTrainId[ALL_CBTC_CROSS_SUM_MAX]); + #ifdef __cplusplus } #endif diff --git a/TSCP/src/APP/ciapp/QueryFiles/dquCIInit.c b/TSCP/src/APP/ciapp/QueryFiles/dquCIInit.c index ff76510..de3aea2 100644 --- a/TSCP/src/APP/ciapp/QueryFiles/dquCIInit.c +++ b/TSCP/src/APP/ciapp/QueryFiles/dquCIInit.c @@ -138,7 +138,7 @@ UINT8 RelayInit(CHAR* FSName) tmpSpeedLimitType = GetCiFunctionSwitchConfig(BLK_TEMP_SPEED_LIM_CONF); /*获取临时限速数据类型*/ chDataType = GetLocalPublicDataType(); - if (DATA_TYPE_NEW == chDataType) + if (DATA_TYPE_MAIN_BRANCH == chDataType) { /* 新数据结构 */ funcRtn = TransmitDataStructInitNew(FSName); @@ -514,6 +514,9 @@ UINT8 RelayInit(CHAR* FSName) debug_infor_printf((const)"LinkSpecialEaDataInit fail.\r\n"); } + /*计轴区段防护道岔初始化*/ + funcRtn *= AxisSecProtectSwitchInit(); + return funcRtn; } @@ -687,60 +690,27 @@ UINT8 SystemParameterStructInit(CHAR* FSName) if (1u == rtnValue) { - /*紧急制动最高触发速度(单位已在dfsInitSubSystemCommonConfigData_CC函数中转换)*/ - dquCICfgDtStr.SystemParaStrNew.MaxLineLimitSpeed = pCbtcConfigDataStru.MaxLineLimitSpeed; - /*临时限速最高限速(km/h)(未进行单位转换)*/ dquCICfgDtStr.SystemParaStrNew.MaxTsrSpeed = pCbtcConfigDataStru.MaxTsrSpeed; - /*NTP校时时区差(小时)*/ - dquCICfgDtStr.SystemParaStrNew.TimeZoneDifference = pCbtcConfigDataStru.TimeZoneDifference; - - /*区间同向行驶双车间隔最小安全距离(cm))*/ - dquCICfgDtStr.SystemParaStrNew.MABackDistance = pCbtcConfigDataStru.MABackDistance; - /*一次设置的临时限速最大个数*/ dquCICfgDtStr.SystemParaStrNew.MaxTsrNum = pCbtcConfigDataStru.MaxTsrNum; /*一个临时限速报文中包含的最大限速区段数量*/ dquCICfgDtStr.SystemParaStrNew.MaxSectionOfTsr = pCbtcConfigDataStru.MaxSectionOfTsr; - /*IVOC-IVOC信故障判断时间(ms)*/ - dquCICfgDtStr.SystemParaStrNew.IvocIvocCommunicationErrorTime = pCbtcConfigDataStru.IvocIvocCommunicationErrorTime; - /*IVOC-OC通信故障判断时间(ms)*/ dquCICfgDtStr.SystemParaStrNew.IvocOcCommunicationErrorTime = pCbtcConfigDataStru.IvocOcCommunicationErrorTime; - /*VOBC-ITS通信故障判断时间(ms)*/ - dquCICfgDtStr.SystemParaStrNew.VobcAtsCommunicationErrorTime = pCbtcConfigDataStru.VobcAtsCommunicationErrorTime; - - /*TMC-ITS通信故障判断时间(ms)*/ - dquCICfgDtStr.SystemParaStrNew.TmcItsCommunicationErrorTime = pCbtcConfigDataStru.TmcItsCommunicationErrorTime; - - /*ITS-OC通信故障判断时间(ms)*/ - dquCICfgDtStr.SystemParaStrNew.ItsOcCommunicationErrorTime = pCbtcConfigDataStru.ItsOcCommunicationErrorTime; - /*OC-TMC通信故障判断时间(ms)*/ dquCICfgDtStr.SystemParaStrNew.TmcOcCommunicationErrorTime = pCbtcConfigDataStru.TmcOcCommunicationErrorTime; - /*OC-PSD通信故障判断时间(ms)*/ - dquCICfgDtStr.SystemParaStrNew.OcPsdCommunicationErrorTime = pCbtcConfigDataStru.OcPsdCommunicationErrorTime; - - /*IVOC-TSL通信故障判断时间(ms)*/ - dquCICfgDtStr.SystemParaStrNew.IvocTslCommunicationErrorTime = pCbtcConfigDataStru.IvocTslCommunicationErrorTime; - /*OC-TSL通信故障判断时间(ms)*/ dquCICfgDtStr.SystemParaStrNew.OcTslCommunicationErrorTime = pCbtcConfigDataStru.OcTslCommunicationErrorTime; - /*满足精确停车条件的MA延伸长度(cm)*/ - dquCICfgDtStr.SystemParaStrNew.MALengthForATOParking = pCbtcConfigDataStru.MALengthForATOParking; - /*本线系统定义逻辑方向与上下行方向的关系*/ dquCICfgDtStr.SystemParaStrNew.LinkLogicDirUpAndDown = pCbtcConfigDataStru.LinkLogicDirUpAndDown; - /*对向行驶双车间隔最小安全距离(cm)*/ - dquCICfgDtStr.SystemParaStrNew.OppositeTrackDistance = pCbtcConfigDataStru.OppositeTrackDistance; - /*线路最差情况下紧急制动距离(单位m)*/ dquCICfgDtStr.SystemParaStrNew.MaxMALength = pCbtcConfigDataStru.MaxMALength; @@ -1557,9 +1527,11 @@ UINT8 WashMachineCfgDtStruFromDquStr(Relay_WashMachineStruct * relayWashMachineS pWashMachineCfgDtStr->TrainEmergencyStopRelayId = relayWashMachineStruct->TrainEmergencyStopRelayId; pWashMachineCfgDtStr->HeadWashAllowRelayId = relayWashMachineStruct->HeadWashAllowRelayId; pWashMachineCfgDtStr->TailWashAllowRelayId = relayWashMachineStruct->TailWashAllowRelayId; + pWashMachineCfgDtStr->wCouplingWashAllowRelayId = relayWashMachineStruct->wCouplingWashAllowRelayId; pWashMachineCfgDtStr->WashTrainRequestRelayId = relayWashMachineStruct->WashTrainRequestRelayId; pWashMachineCfgDtStr->TrainHeadStopSteadyRelayId = relayWashMachineStruct->TrainHeadStopSteadyRelayId; pWashMachineCfgDtStr->TrainTailStopSteadyRelayId = relayWashMachineStruct->TrainTailStopSteadyRelayId; + pWashMachineCfgDtStr->wCoupingStopSteadyRelayId = relayWashMachineStruct->wCoupingStopSteadyRelayId; pWashMachineCfgDtStr->TrainPassRequestRelayId = relayWashMachineStruct->TrainPassRequestRelayId; pWashMachineCfgDtStr->TrainOutWashPortAllowRelayId = relayWashMachineStruct->TrainOutWashPortAllowRelayId; pWashMachineCfgDtStr->PauseTrainWashRequestRelayId = relayWashMachineStruct->PauseTrainWashRequestRelayId; @@ -1768,6 +1740,9 @@ UINT8 SwitchCfgDtStruFromDquPointStr(DSU_POINT_STRU* pPoint,SwitchConfigDataStru UINT16 i=0u; UINT16 j=0u; UINT8 rtnvalue = 0u; + UINT8 chDataType = DATA_TYPE_MAIN_BRANCH; + chDataType = GetLocalPublicDataType();/*数据结构*/ + /*入口参数防护*/ if((NULL == pPoint) || (NULL == pSwitchCfgDtStr)) @@ -1783,7 +1758,24 @@ UINT8 SwitchCfgDtStruFromDquPointStr(DSU_POINT_STRU* pPoint,SwitchConfigDataStru pSwitchCfgDtStr->chKiloType = pPoint->dwPointKiloPlueMinusSign; if (pSwitchCfgDtStr->SwitchId < SWITCH_SUM_MAX) { - pSwitchCfgDtStr->BelongOcId = dquCICfgDtStr.OCSwitchCfgStr[pSwitchCfgDtStr->SwitchId].BelongOcId; + + /*将OC配置表数据存储到道岔配置数据结构体*/ + rtnvalue = SwitchCfgDtStruFromOCconfigStr(pSwitchCfgDtStr); + if (DATA_TYPE_MAIN_BRANCH == chDataType) + { + /*通过板卡ID,计算该板卡在本OC中使用了哪些插箱*/ + rtnvalue &= CalcuSwitchInsertionBoxData(pSwitchCfgDtStr); + } + else + {/*无执行*/ + } + + if (0u == rtnvalue) + { + return rtnvalue; + } + + } pSwitchCfgDtStr->DSwitchOtherId = (pPoint->DPointOtherId != 0xffffu)?pPoint->DPointOtherId:0U; pSwitchCfgDtStr->SwitchPhySecId = 0xffu; @@ -2436,8 +2428,8 @@ UINT8 LogicSecCfgDtStruFromDquSgmtStr(DSU_LOGIC_SGMT_STRU* pLogicSgmt,LogicSecti UINT16 wSignalAttribute = 0U; UINT16 protectLinkId = 0u; INT16 intrtVal = -1; - - + UINT8 chDataType = 0U; + chDataType = GetLocalPublicDataType();/*用于28.0.0.14和23.1.2.X不进行逻辑区段部分字段初始化*/ /*入口参数防护*/ if ((NULL != pLogicSgmt) && (NULL != pLgScCfgDtStr)) { @@ -2924,107 +2916,117 @@ UINT8 LogicSecCfgDtStruFromDquSgmtStr(DSU_LOGIC_SGMT_STRU* pLogicSgmt,LogicSecti } } #endif - /*逻辑区段关联信号机计算*/ - if ((0U == pLgScCfgDtStr->dwOrgnOffset) || (dsuStaticHeadStru.pLinkStru[g_dsuEmapStru->dsuEmapIndexStru->dsuLinkIndex[pLgScCfgDtStr->wTmnlLink]].dwLength == pLgScCfgDtStr->dwTmnlOffset)) - {/*起点偏移量为0或者终点偏移量为对应LINK长度才具备关联信号机*/ - for (ii = 0; ii < dquCICfgDtStr.SgnlCfgDtStrLen; ii++) - { - wSignalAttribute = dsuStaticHeadStru.pSignalStru[g_dsuEmapStru->dsuEmapIndexStru->dsuSignalIndex[dquCICfgDtStr.SgnlCfgDtStr[ii].SignalId]].wAttribute; - if (0x4000U != (wSignalAttribute & 0x4000U)) + if (DATA_TYPE_MAIN_BRANCH == chDataType) + { + /*逻辑区段关联信号机计算*/ + if ((0U == pLgScCfgDtStr->dwOrgnOffset) || (dsuStaticHeadStru.pLinkStru[g_dsuEmapStru->dsuEmapIndexStru->dsuLinkIndex[pLgScCfgDtStr->wTmnlLink]].dwLength == pLgScCfgDtStr->dwTmnlOffset)) + {/*起点偏移量为0或者终点偏移量为对应LINK长度才具备关联信号机*/ + for (ii = 0; ii < dquCICfgDtStr.SgnlCfgDtStrLen; ii++) { - if (dquCICfgDtStr.SgnlCfgDtStr[ii].wOutFirstLinkId == dquCICfgDtStr.SgnlCfgDtStr[ii].wProtectLinkId) + wSignalAttribute = dsuStaticHeadStru.pSignalStru[g_dsuEmapStru->dsuEmapIndexStru->dsuSignalIndex[dquCICfgDtStr.SgnlCfgDtStr[ii].SignalId]].wAttribute; + if (0x4000U != (wSignalAttribute & 0x4000U)) { - /*信号机所处LINK与防护LINK是同一个LINK且此信号机不为尽头线的防护信号机*/ - if (dquCICfgDtStr.SgnlCfgDtStr[ii].InFirstPhySecId == pLgScCfgDtStr->wRelativePhySecId) + if (dquCICfgDtStr.SgnlCfgDtStr[ii].wOutFirstLinkId == dquCICfgDtStr.SgnlCfgDtStr[ii].wProtectLinkId) { - /*当前逻辑区段所属物理区段为待查询信号机的内方第一区段 - 且当前逻辑区段为此物理区段中第一个或者最后一个区段(第一层IF已经通过偏移量查询过)*/ - pLgScCfgDtStr->wRelateBeginSigId[pLgScCfgDtStr->chRelateBeginSigSum] = dquCICfgDtStr.SgnlCfgDtStr[ii].SignalId; - pLgScCfgDtStr->chRelateBeginSigSum++; - } - - if ((0U == pLgScCfgDtStr->dwOrgnOffset) && (dsuStaticHeadStru.pLinkStru[g_dsuEmapStru->dsuEmapIndexStru->dsuLinkIndex[pLgScCfgDtStr->wTmnlLink]].dwLength != pLgScCfgDtStr->dwTmnlOffset)) - {/*本逻辑区段起点偏移量为0,但是终点不是一个完整的LINK*/ - if (dquCICfgDtStr.SgnlCfgDtStr[ii].wProtectLinkId == pLgScCfgDtStr->wOrgnLink) - {/*信号机防护LINK与本逻辑区段起点相同*/ - pLgScCfgDtStr->wRelateEndSigId[pLgScCfgDtStr->chRelateEndSigSum] = dquCICfgDtStr.SgnlCfgDtStr[ii].SignalId; - pLgScCfgDtStr->chRelateEndSigSum++; + /*信号机所处LINK与防护LINK是同一个LINK且此信号机不为尽头线的防护信号机*/ + if (dquCICfgDtStr.SgnlCfgDtStr[ii].InFirstPhySecId == pLgScCfgDtStr->wRelativePhySecId) + { + /*当前逻辑区段所属物理区段为待查询信号机的内方第一区段 + 且当前逻辑区段为此物理区段中第一个或者最后一个区段(第一层IF已经通过偏移量查询过)*/ + pLgScCfgDtStr->wRelateBeginSigId[pLgScCfgDtStr->chRelateBeginSigSum] = dquCICfgDtStr.SgnlCfgDtStr[ii].SignalId; + pLgScCfgDtStr->chRelateBeginSigSum++; } - } - else if ((0U != pLgScCfgDtStr->dwOrgnOffset) && (dsuStaticHeadStru.pLinkStru[g_dsuEmapStru->dsuEmapIndexStru->dsuLinkIndex[pLgScCfgDtStr->wTmnlLink]].dwLength == pLgScCfgDtStr->dwTmnlOffset)) - {/*本逻辑区段起点不为一个完整的LINK,但是终点是一个完整的LINK*/ - if (dquCICfgDtStr.SgnlCfgDtStr[ii].wProtectLinkId == pLgScCfgDtStr->wTmnlLink) - {/*信号机防护LINK与本逻辑区段终点相同*/ - pLgScCfgDtStr->wRelateEndSigId[pLgScCfgDtStr->chRelateEndSigSum] = dquCICfgDtStr.SgnlCfgDtStr[ii].SignalId; - pLgScCfgDtStr->chRelateEndSigSum++; + + if ((0U == pLgScCfgDtStr->dwOrgnOffset) && (dsuStaticHeadStru.pLinkStru[g_dsuEmapStru->dsuEmapIndexStru->dsuLinkIndex[pLgScCfgDtStr->wTmnlLink]].dwLength != pLgScCfgDtStr->dwTmnlOffset)) + {/*本逻辑区段起点偏移量为0,但是终点不是一个完整的LINK*/ + if (dquCICfgDtStr.SgnlCfgDtStr[ii].wProtectLinkId == pLgScCfgDtStr->wOrgnLink) + {/*信号机防护LINK与本逻辑区段起点相同*/ + pLgScCfgDtStr->wRelateEndSigId[pLgScCfgDtStr->chRelateEndSigSum] = dquCICfgDtStr.SgnlCfgDtStr[ii].SignalId; + pLgScCfgDtStr->chRelateEndSigSum++; + } + } + else if ((0U != pLgScCfgDtStr->dwOrgnOffset) && (dsuStaticHeadStru.pLinkStru[g_dsuEmapStru->dsuEmapIndexStru->dsuLinkIndex[pLgScCfgDtStr->wTmnlLink]].dwLength == pLgScCfgDtStr->dwTmnlOffset)) + {/*本逻辑区段起点不为一个完整的LINK,但是终点是一个完整的LINK*/ + if (dquCICfgDtStr.SgnlCfgDtStr[ii].wProtectLinkId == pLgScCfgDtStr->wTmnlLink) + {/*信号机防护LINK与本逻辑区段终点相同*/ + pLgScCfgDtStr->wRelateEndSigId[pLgScCfgDtStr->chRelateEndSigSum] = dquCICfgDtStr.SgnlCfgDtStr[ii].SignalId; + pLgScCfgDtStr->chRelateEndSigSum++; + } + } + else + { + if ((dquCICfgDtStr.SgnlCfgDtStr[ii].wProtectLinkId == pLgScCfgDtStr->wOrgnLink) || (dquCICfgDtStr.SgnlCfgDtStr[ii].wProtectLinkId == pLgScCfgDtStr->wTmnlLink)) + {/*信号机防护LINK与逻辑区段起点或者终点LINK相同,即为逻辑区段关联终端信号机*/ + pLgScCfgDtStr->wRelateEndSigId[pLgScCfgDtStr->chRelateEndSigSum] = dquCICfgDtStr.SgnlCfgDtStr[ii].SignalId; + pLgScCfgDtStr->chRelateEndSigSum++; + } } } else { - if ((dquCICfgDtStr.SgnlCfgDtStr[ii].wProtectLinkId == pLgScCfgDtStr->wOrgnLink) || (dquCICfgDtStr.SgnlCfgDtStr[ii].wProtectLinkId == pLgScCfgDtStr->wTmnlLink)) - {/*信号机防护LINK与逻辑区段起点或者终点LINK相同,即为逻辑区段关联终端信号机*/ - pLgScCfgDtStr->wRelateEndSigId[pLgScCfgDtStr->chRelateEndSigSum] = dquCICfgDtStr.SgnlCfgDtStr[ii].SignalId; - pLgScCfgDtStr->chRelateEndSigSum++; + /*信号机所在LINK与防护LINK为同一个或者是尽头线的防护信号机*/ + if (((dquCICfgDtStr.SgnlCfgDtStr[ii].wProtectLinkId == pLgScCfgDtStr->wOrgnLink) || (dquCICfgDtStr.SgnlCfgDtStr[ii].wProtectLinkId == pLgScCfgDtStr->wTmnlLink)) + && ((pLgScCfgDtStr->dwOrgnOffset <= dquCICfgDtStr.SgnlCfgDtStr[ii].dwProtectOff) && (dquCICfgDtStr.SgnlCfgDtStr[ii].dwProtectOff <= pLgScCfgDtStr->dwTmnlOffset))) + {/*信号机防护LINK与逻辑区段起点或者终点LINK相同,并且信号机防护LINK的偏移量在本逻辑区段偏移量范围之内即为逻辑区段关联始端信号机*/ + pLgScCfgDtStr->wRelateBeginSigId[pLgScCfgDtStr->chRelateBeginSigSum] = dquCICfgDtStr.SgnlCfgDtStr[ii].SignalId; + pLgScCfgDtStr->chRelateBeginSigSum++; + } + if ((0U == pLgScCfgDtStr->dwOrgnOffset) && (dsuStaticHeadStru.pLinkStru[g_dsuEmapStru->dsuEmapIndexStru->dsuLinkIndex[pLgScCfgDtStr->wTmnlLink]].dwLength != pLgScCfgDtStr->dwTmnlOffset)) + {/*本逻辑区段起点偏移量为0,但是终点不是一个完整的LINK*/ + if ((dquCICfgDtStr.SgnlCfgDtStr[ii].wOutFirstLinkId == pLgScCfgDtStr->wOrgnLink) && (dquCICfgDtStr.SgnlCfgDtStr[ii].wProtectLinkId == dsuStaticHeadStru.pLinkStru[g_dsuEmapStru->dsuEmapIndexStru->dsuLinkIndex[pLgScCfgDtStr->wOrgnLink]].wOrgnJointMainLkId)) + {/*信号机外方第一LINK与本逻辑区段起点相同,且其防护LINK为本逻辑区段起点相连LINK*/ + pLgScCfgDtStr->wRelateEndSigId[pLgScCfgDtStr->chRelateEndSigSum] = dquCICfgDtStr.SgnlCfgDtStr[ii].SignalId; + pLgScCfgDtStr->chRelateEndSigSum++; + } + } + else if ((0U != pLgScCfgDtStr->dwOrgnOffset) && (dsuStaticHeadStru.pLinkStru[g_dsuEmapStru->dsuEmapIndexStru->dsuLinkIndex[pLgScCfgDtStr->wTmnlLink]].dwLength == pLgScCfgDtStr->dwTmnlOffset)) + {/*本逻辑区段起点不为一个完整的LINK,但是终点是一个完整的LINK*/ + if ((dquCICfgDtStr.SgnlCfgDtStr[ii].wOutFirstLinkId == pLgScCfgDtStr->wTmnlLink) && (dquCICfgDtStr.SgnlCfgDtStr[ii].wProtectLinkId == dsuStaticHeadStru.pLinkStru[g_dsuEmapStru->dsuEmapIndexStru->dsuLinkIndex[pLgScCfgDtStr->wTmnlLink]].wTmnlJointMainLkId)) + {/*信号机外方第一LINK与本逻辑区段终点相同,且其防护LINK为本逻辑区段终点相连LINK*/ + pLgScCfgDtStr->wRelateEndSigId[pLgScCfgDtStr->chRelateEndSigSum] = dquCICfgDtStr.SgnlCfgDtStr[ii].SignalId; + pLgScCfgDtStr->chRelateEndSigSum++; + } + } + else + { + if ((dquCICfgDtStr.SgnlCfgDtStr[ii].wOutFirstLinkId == pLgScCfgDtStr->wOrgnLink) || (dquCICfgDtStr.SgnlCfgDtStr[ii].wOutFirstLinkId == pLgScCfgDtStr->wTmnlLink)) + {/*信号机外方第一LINK与逻辑区段起点或者终点LINK相同,即为逻辑区段关联终端信号机*/ + pLgScCfgDtStr->wRelateEndSigId[pLgScCfgDtStr->chRelateEndSigSum] = dquCICfgDtStr.SgnlCfgDtStr[ii].SignalId; + pLgScCfgDtStr->chRelateEndSigSum++; + } } } } else { - /*信号机所在LINK与防护LINK为同一个或者是尽头线的防护信号机*/ - if (((dquCICfgDtStr.SgnlCfgDtStr[ii].wProtectLinkId == pLgScCfgDtStr->wOrgnLink) || (dquCICfgDtStr.SgnlCfgDtStr[ii].wProtectLinkId == pLgScCfgDtStr->wTmnlLink)) - && ((pLgScCfgDtStr->dwOrgnOffset <= dquCICfgDtStr.SgnlCfgDtStr[ii].dwProtectOff) && (dquCICfgDtStr.SgnlCfgDtStr[ii].dwProtectOff <= pLgScCfgDtStr->dwTmnlOffset))) - {/*信号机防护LINK与逻辑区段起点或者终点LINK相同,并且信号机防护LINK的偏移量在本逻辑区段偏移量范围之内即为逻辑区段关联始端信号机*/ - pLgScCfgDtStr->wRelateBeginSigId[pLgScCfgDtStr->chRelateBeginSigSum] = dquCICfgDtStr.SgnlCfgDtStr[ii].SignalId; - pLgScCfgDtStr->chRelateBeginSigSum++; - } - if ((0U == pLgScCfgDtStr->dwOrgnOffset) && (dsuStaticHeadStru.pLinkStru[g_dsuEmapStru->dsuEmapIndexStru->dsuLinkIndex[pLgScCfgDtStr->wTmnlLink]].dwLength != pLgScCfgDtStr->dwTmnlOffset)) - {/*本逻辑区段起点偏移量为0,但是终点不是一个完整的LINK*/ - if ((dquCICfgDtStr.SgnlCfgDtStr[ii].wOutFirstLinkId == pLgScCfgDtStr->wOrgnLink) && (dquCICfgDtStr.SgnlCfgDtStr[ii].wProtectLinkId == dsuStaticHeadStru.pLinkStru[g_dsuEmapStru->dsuEmapIndexStru->dsuLinkIndex[pLgScCfgDtStr->wOrgnLink]].wOrgnJointMainLkId)) - {/*信号机外方第一LINK与本逻辑区段起点相同,且其防护LINK为本逻辑区段起点相连LINK*/ - pLgScCfgDtStr->wRelateEndSigId[pLgScCfgDtStr->chRelateEndSigSum] = dquCICfgDtStr.SgnlCfgDtStr[ii].SignalId; - pLgScCfgDtStr->chRelateEndSigSum++; - } - } - else if ((0U != pLgScCfgDtStr->dwOrgnOffset) && (dsuStaticHeadStru.pLinkStru[g_dsuEmapStru->dsuEmapIndexStru->dsuLinkIndex[pLgScCfgDtStr->wTmnlLink]].dwLength == pLgScCfgDtStr->dwTmnlOffset)) - {/*本逻辑区段起点不为一个完整的LINK,但是终点是一个完整的LINK*/ - if ((dquCICfgDtStr.SgnlCfgDtStr[ii].wOutFirstLinkId == pLgScCfgDtStr->wTmnlLink) && (dquCICfgDtStr.SgnlCfgDtStr[ii].wProtectLinkId == dsuStaticHeadStru.pLinkStru[g_dsuEmapStru->dsuEmapIndexStru->dsuLinkIndex[pLgScCfgDtStr->wTmnlLink]].wTmnlJointMainLkId)) - {/*信号机外方第一LINK与本逻辑区段终点相同,且其防护LINK为本逻辑区段终点相连LINK*/ - pLgScCfgDtStr->wRelateEndSigId[pLgScCfgDtStr->chRelateEndSigSum] = dquCICfgDtStr.SgnlCfgDtStr[ii].SignalId; - pLgScCfgDtStr->chRelateEndSigSum++; - } - } - else - { - if ((dquCICfgDtStr.SgnlCfgDtStr[ii].wOutFirstLinkId == pLgScCfgDtStr->wOrgnLink) || (dquCICfgDtStr.SgnlCfgDtStr[ii].wOutFirstLinkId == pLgScCfgDtStr->wTmnlLink)) - {/*信号机外方第一LINK与逻辑区段起点或者终点LINK相同,即为逻辑区段关联终端信号机*/ - pLgScCfgDtStr->wRelateEndSigId[pLgScCfgDtStr->chRelateEndSigSum] = dquCICfgDtStr.SgnlCfgDtStr[ii].SignalId; - pLgScCfgDtStr->chRelateEndSigSum++; - } - } + /*按钮信号机,不计入逻辑区段关联的信号机中*/ + } + + if ((LOGSEC_RELATE_SIG_SUM_MAX < pLgScCfgDtStr->chRelateEndSigSum) || (LOGSEC_RELATE_SIG_SUM_MAX < pLgScCfgDtStr->chRelateBeginSigSum)) + { + rtnvalue = 0U; + debug_infor_printf((const)"LogicSecCfgDtStruFromDquSgmtStr Error: LogSec Rel Begin or End Signal Num Is Exceed Max\n"); + break; + } + else + { + /*继续初始化*/ } } - else - { - /*按钮信号机,不计入逻辑区段关联的信号机中*/ - } - - if ((LOGSEC_RELATE_SIG_SUM_MAX < pLgScCfgDtStr->chRelateEndSigSum) || (LOGSEC_RELATE_SIG_SUM_MAX < pLgScCfgDtStr->chRelateBeginSigSum)) - { - rtnvalue = 0U; - debug_infor_printf((const)"LogicSecCfgDtStruFromDquSgmtStr Error: LogSec Rel Begin or End Signal Num Is Exceed Max\n"); - break; - } - else - { - /*继续初始化*/ - } + } + else + {/*逻辑区段为同一物理区段中非头非尾区段*/ + pLgScCfgDtStr->chRelateBeginSigSum = 0U; + pLgScCfgDtStr->chRelateEndSigSum = 0U; } } else - {/*逻辑区段为同一物理区段中非头非尾区段*/ + { pLgScCfgDtStr->chRelateBeginSigSum = 0U; pLgScCfgDtStr->chRelateEndSigSum = 0U; + /*分支暂时不初始化此字段*/ } + #if 0 /* 联络线相关 预留*/ /*逻辑区段关联联络线道岔计算*/ @@ -3500,7 +3502,7 @@ UINT8 OverlapCfgDtStruFromDquStr(DSU_PROTECT_LINK_STRU * pProtectLink, OverlapCo { if (pOvlpCfgDtStr->SideProtecGroupData.GroupID == LSData.pLSSideProtecGroupStru[k].GroupID)/*根据侧防组ID匹配侧防条件*/ { - CommonMemCpy(&pOvlpCfgDtStr->SideProtecGroupData, sizeof(SideProtecGroupStru), &LSData.pLSSideProtecGroupStru[k], sizeof(SideProtecGroupStru)); + (void)CommonMemCpy(&pOvlpCfgDtStr->SideProtecGroupData, sizeof(SideProtecGroupStru), &LSData.pLSSideProtecGroupStru[k], sizeof(SideProtecGroupStru)); break; } } @@ -3918,6 +3920,8 @@ UINT8 PsdConfigDataStructInit(CHAR * FSName) UINT16 wLogSectionId = 0u; UINT8 k = 0u; INT16 rtVal = -1; + UINT16 wPhyIndex = 0U; + UINT16 wLogicSgmtIndex = 0U; callFun = dfsEmapInit (FSName); callFun *= InitRelay_ScreenStru (FSName); @@ -3976,8 +3980,16 @@ UINT8 PsdConfigDataStructInit(CHAR * FSName) dquCICfgDtStr.PsdCfgDtStr[i].PsdRelationPhySecId = dsuStaticHeadStru.pAxleSgmtStru[j].wRelatePhysicalSgmtId; break; } - } + if (j == dsuDataLenStru.wAxleSgmtLen) + { + rtnvalue = 0u; + } + else + { + /*无处理*/ + } + } @@ -3986,51 +3998,53 @@ UINT8 PsdConfigDataStructInit(CHAR * FSName) /*初始化站台门关联ESB数据*/ wPhySecId = 0U; wLogSectionId = 0U; - if (1u == rtnvalue) + wPhyIndex = 0U; + wLogicSgmtIndex = 0U; + if (1U == rtnvalue) { wPhySecId = dquCICfgDtStr.PsdCfgDtStr[i].PsdRelationPhySecId; - for (j = 0u; j < dquCICfgDtStr.PsclSgmtCfgDtStrLen; j++) + if ((0U < wPhySecId) && (PHYSICAL_SECTION_SUM_MAX > wPhySecId)) { - if (wPhySecId == dquCICfgDtStr.PsclSgmtCfgDtStr[j].PhysicalSectionId) + wPhyIndex = dsuPhysicalSgmtIndex[wPhySecId];/*获取物理区段索引*/ + wLogSectionId = dquCICfgDtStr.PsclSgmtCfgDtStr[wPhyIndex].LogSectionIdBuf[0];/*仅匹配第一个逻辑区段即可*/ + + if ((0U < wLogSectionId) && (LOGIC_SECTION_SUM_MAX > wLogSectionId)) { - wLogSectionId = dquCICfgDtStr.PsclSgmtCfgDtStr[j].LogSectionIdBuf[0];/*仅匹配第一个逻辑区段即可*/ - break; + wLogicSgmtIndex = dsuLogicSgmtIndex[wLogSectionId]; } - } - if (0u < wLogSectionId) - { - for (j = 0u; j < dquCICfgDtStr.lgcSctCfgDtStrLen; j++) + else { - if (wLogSectionId == dquCICfgDtStr.lgcSctCfgDtStr[j].LogicSectionId) - { - for (k = 0u; k < dquCICfgDtStr.lgcSctCfgDtStr[j].logSecRltEsbSum; k++) - { - rtVal = SetNoRepeatDataToBuf(dquCICfgDtStr.PsdCfgDtStr[i].IncloudeEsbIdBuf, PSD_INCLUDE_ESB_NUM, dquCICfgDtStr.lgcSctCfgDtStr[j].logSecRltEsbBuf[k], dquCICfgDtStr.PsdCfgDtStr[i].IncloudeEsbNum); - if (-1 != rtVal) - { - dquCICfgDtStr.PsdCfgDtStr[i].IncloudeEsbNum = (UINT8)rtVal; - } - else - { - rtnvalue = 0u; - } - } - break; - } + rtnvalue = 0U;/*非法值,初始化失败*/ } } else - {/*查询错误,返回失败*/ - rtnvalue = 0u; + { + 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; + } + } } } } - if ((0u == rtnvalue) || (j == dsuDataLenStru.wAxleSgmtLen)) + if (0u == rtnvalue) { break; } @@ -4547,6 +4561,7 @@ UINT8 NonRouteCfgDtStruFrmLSStr( LS_NoRouteDcStru * pLSNoRouteDcStr,NonRouteConf pNonRouteCfgDtStr->AgreeTryTrainRelayId = RelayData.pRelayNoRouteDcStr[i].wRelayTongYiScId; pNonRouteCfgDtStr->DrvApplyTryTrainRelayId = RelayData.pRelayNoRouteDcStr[i].wRelayDrvShiCheShengQingId; pNonRouteCfgDtStr->ColAgreeTryTrainRelayId = RelayData.pRelayNoRouteDcStr[i].wRelayColTongYiScId; + pNonRouteCfgDtStr->ColWaysideTryTrainIndRelayId = RelayData.pRelayNoRouteDcStr[i].wWaysideTryTrainIndRelayId; } } @@ -5007,7 +5022,7 @@ UINT8 RouteCfgDtStruFrmLSRouteStr( LS_RouteStruct * pLSRouteStr,RouteConfigDataS UINT8 isEachInvFlag = 0U; UINT16 wLgcSecIndex = 0U; /*逻辑区段索引*/ UINT8 chLocalCiPattern = 0u; /*本CI模式*/ - + UINT8 chRtuCiType = 0U; lineIdentity = GetCiFunctionSwitchConfig(LINE_RAILWAY_TYPE_CONF);/*??????:0x55:????;0xAA:????*/ /*入口参数防护*/ @@ -5019,7 +5034,7 @@ UINT8 RouteCfgDtStruFrmLSRouteStr( LS_RouteStruct * pLSRouteStr,RouteConfigDataS pRouteCfgDtStr->RouteId = pLSRouteStr->wRouteId; pRouteCfgDtStr->BelongCiId = (UINT8)pDsuRouteStr->wManageCI; - + pRouteCfgDtStr->chRouteConfigDirection = pLSRouteStr->wDir; if (pLSRouteStr->wDir == dquCICfgDtStr.SystemParaStrNew.LinkLogicDirUpAndDown) { pRouteCfgDtStr->RouteDirection = CI_SYSTEM_DIRECTION_DOWN; @@ -5057,7 +5072,18 @@ UINT8 RouteCfgDtStruFrmLSRouteStr( LS_RouteStruct * pLSRouteStr,RouteConfigDataS rtnvalue = CI_ERROR; } - ciType = GetdsuStaticDataCiType(pRouteCfgDtStr->BelongCiId);/*进路所属联锁类型*/ + chRtuCiType = GetLocalVirCiType(pRouteCfgDtStr->BelongVirCIid); + if (CI_TYPE_SCX == chRtuCiType) + { + /*判断RTU是否是合设试车线*/ + ciType = CI_TYPE_SCX; + } + else + { + ciType = GetdsuStaticDataCiType(pRouteCfgDtStr->BelongCiId);/*进路所属联锁类型*/ + } + + if ((CI_ERROR != ciType)&&(CI_ERROR!= rtnvalue)) { /*进路属性*/ @@ -7023,7 +7049,7 @@ UINT8 RouteCfgDtStruFrmLSRouteStr( LS_RouteStruct * pLSRouteStr,RouteConfigDataS { if (LSData.pLSSideProtecGroupStru[i].GroupID == pRouteCfgDtStr->RouteSideProtecData.GroupID) { - CommonMemCpy(&pRouteCfgDtStr->RouteSideProtecData, sizeof(SideProtecGroupStru), &LSData.pLSSideProtecGroupStru[i], sizeof(SideProtecGroupStru)); + (void)CommonMemCpy(&pRouteCfgDtStr->RouteSideProtecData, sizeof(SideProtecGroupStru), &LSData.pLSSideProtecGroupStru[i], sizeof(SideProtecGroupStru)); break; } } @@ -7093,7 +7119,7 @@ UINT8 RouteConfigDataStruLogDataInit(RouteConfigDataStruct * pRouteCfgDtStr, LS_ if(ROUTE_NOT_HAVE_DIR_CHANGE_POINT == pRouteCfgDtStr->HaveDirChangePointInRoute) { /*防护方向为0x55(与link方向相同)*/ - if(CI_SYSTEM_DIRECTION_UP == cRouteDir) + if(DIR_SAME == cRouteDir) { for(i = 0U; i < routeAxleNum; i++) { @@ -7109,7 +7135,7 @@ UINT8 RouteConfigDataStruLogDataInit(RouteConfigDataStruct * pRouteCfgDtStr, LS_ } } /*防护方向为0xaa(与link方向相反,逻辑区段取反方向)*/ - else if(CI_SYSTEM_DIRECTION_DOWN == cRouteDir) + else if(DIR_CONVERT == cRouteDir) { for(i = 0U; i < routeAxleNum; i++) { @@ -7137,7 +7163,7 @@ UINT8 RouteConfigDataStruLogDataInit(RouteConfigDataStruct * pRouteCfgDtStr, LS_ else { /*防护方向为0x55(与link方向相同)*/ - if(CI_SYSTEM_DIRECTION_UP == cRouteDir) + if(DIR_SAME == cRouteDir) { for(i = 0u; i < routeAxleNum; i++) { @@ -7182,7 +7208,7 @@ UINT8 RouteConfigDataStruLogDataInit(RouteConfigDataStruct * pRouteCfgDtStr, LS_ } } /*防护方向为0xaa(与link方向相反,逻辑区段取反方向)*/ - else if(CI_SYSTEM_DIRECTION_DOWN == cRouteDir) + else if(DIR_CONVERT == cRouteDir) { for(i = 0u; i < routeAxleNum; i++) { @@ -7255,7 +7281,7 @@ UINT8 RouteConfigDataStructInit(CHAR * FSName) UINT8 callFun = 0u; UINT16 i=0u; UINT8 execRet = 0u; - UINT8 chDataType = DATA_TYPE_NEW; + UINT8 chDataType = DATA_TYPE_MAIN_BRANCH; chDataType = GetLocalPublicDataType();/*用于28.0.0.14不进行逻辑区段关联进路初始化*/ callFun = dfsEmapInit(FSName); callFun *= InitLS_RouteStruct(FSName); @@ -7334,7 +7360,10 @@ UINT8 RouteConfigDataStructInit(CHAR * FSName) { rtnvalue = 0u; } - execRet = RouteOpposedConfigDataInite(dquCICfgDtStr.RouteCfgDtStr,&(dquCICfgDtStr.RouteCfgDtStr[i])); + else + { + execRet = RouteOpposedConfigDataInite(dquCICfgDtStr.RouteCfgDtStr, &(dquCICfgDtStr.RouteCfgDtStr[i])); + } /*抵触进路初始化*/ if(execRet > 0u) { @@ -7374,7 +7403,10 @@ UINT8 RouteConfigDataStructInit(CHAR * FSName) { rtnvalue = 0u; } - execRet = RouteOutLgcSecConfigDataInit(&(dquCICfgDtStr.RouteCfgDtStr[i])); + else + { + execRet = RouteOutLgcSecConfigDataInit(&(dquCICfgDtStr.RouteCfgDtStr[i])); + } /*抵触进路初始化*/ if (execRet > 0u) { @@ -7396,54 +7428,67 @@ UINT8 RouteConfigDataStructInit(CHAR * FSName) { for (i = 0u; i < LSDataLen.LSRouteStrLen; i++) { - if (i >= ROUTE_SUM_MAX) + if (ROUTE_SUM_MAX <= i) { rtnvalue = 0u; } else { - callFun = GetdsuStaticDataCiType(dquCICfgDtStr.RouteCfgDtStr[i].BelongCiId); - if (CI_ERROR != callFun) + if (DATA_TYPE_MAIN_BRANCH == chDataType) { - if ((CI_TYPE_ZX == callFun) || (CI_TYPE_SCX == callFun)) + callFun = GetdsuStaticDataCiType(dquCICfgDtStr.RouteCfgDtStr[i].BelongCiId); + if (CI_ERROR != callFun) { - execRet = RouteMainProConfigDataInit(dquCICfgDtStr.RouteCfgDtStr, &(dquCICfgDtStr.RouteCfgDtStr[i])); - if (execRet > 0u) + if ((CI_TYPE_ZX == callFun) || (CI_TYPE_SCX == callFun)) { + execRet = RouteMainProConfigDataInit(dquCICfgDtStr.RouteCfgDtStr, &(dquCICfgDtStr.RouteCfgDtStr[i])); + if (execRet > 0u) + { + } + else + {/*调用函数失败,返回0*/ + rtnvalue = 0u; + } + if (1U != rtnvalue) + { + break; + } } else - {/*调用函数失败,返回0*/ - rtnvalue = 0u; - } - if (1U != rtnvalue) { - break; + dquCICfgDtStr.RouteCfgDtStr[i].MainOrSubData.RouteBelMainSum = 0U; + dquCICfgDtStr.RouteCfgDtStr[i].MainOrSubData.RouteSubSum = 0U; + dquCICfgDtStr.RouteCfgDtStr[i].MainOrSubData.MainRouteProperty = ROUTE_INIT_PROPERTY; /*车辆段默认为普通进路*/ } } else { - dquCICfgDtStr.RouteCfgDtStr[i].MainOrSubData.RouteBelMainSum = 0U; - dquCICfgDtStr.RouteCfgDtStr[i].MainOrSubData.RouteSubSum = 0U; - dquCICfgDtStr.RouteCfgDtStr[i].MainOrSubData.MainRouteProperty = ROUTE_INIT_PROPERTY; /*车辆段默认为普通进路*/ + rtnvalue = 0u; /*联锁类型获取失败*/ } } else { - rtnvalue = 0u; /*联锁类型获取失败*/ + /*28.0.0.x和23.2.1.x数据结构暂不支持主进路与子进路相关数据初始化*/ + dquCICfgDtStr.RouteCfgDtStr[i].MainOrSubData.RouteBelMainSum = 0U; + dquCICfgDtStr.RouteCfgDtStr[i].MainOrSubData.RouteSubSum = 0U; + dquCICfgDtStr.RouteCfgDtStr[i].MainOrSubData.MainRouteProperty = ROUTE_INIT_PROPERTY; /*车辆段默认为普通进路*/ } - } + + } } + } /*逻辑区段关联进路及防护道岔计算*/ if (1u == rtnvalue) { - if (DATA_TYPE_NEW == chDataType) + if (DATA_TYPE_MAIN_BRANCH == chDataType) { for (i = 0u; i < dquCICfgDtStr.lgcSctCfgDtStrLen; i++) { execRet = LogRelateRouteDataInit(dquCICfgDtStr.RouteCfgDtStr, &(dquCICfgDtStr.lgcSctCfgDtStr[i]));/*逻辑区段关联进路计算*/ execRet *= LogRelateProSwDataInit(dquCICfgDtStr.RouteCfgDtStr, &(dquCICfgDtStr.lgcSctCfgDtStr[i]));/*逻辑区段关联防护道岔计算*/ + execRet *= LogRelateOverlapDataInit(dquCICfgDtStr.OvlapCfgDtStr, &(dquCICfgDtStr.lgcSctCfgDtStr[i]));/*逻辑区段关联防护道岔计算*/ if (execRet > 0u) { @@ -9497,6 +9542,10 @@ UINT8 CiPatternInit(CHAR* FSName) SetLocalWaysidePattern(pDataAddr[11]); rtnValue = SetSystemWorkType(pDataAddr[12]); + + /*是否支持OC-S开关*/ + rtnValue &=SetLocalCiOCSswitch(pDataAddr[13]); + } findFlag = 1u; } @@ -10189,44 +10238,6 @@ UINT8 OCConfigDataStructInit(UINT16* len, CHAR* FSName, UINT32 DataTypeID, UINT3 return rtnValue; } - -/********************************************* -*函数功能:初始化OC 道岔配置表数据 -*参数说明:FSName文件指针 -*返回值:0,失败;1,成功 -*********************************************/ -UINT8 OCSwitchConfigDataStructInit(CHAR *FSName) -{ - UINT8 rtnValue = 0u; - UINT16 len = 0u; - UINT16 i = 0u; - UINT8 ArrBuff[MEMBERA_SUM_MAX] = { 0u }; - OCSwitchConfigDataStruct OCSwitchCfgStrBuff[SWITCH_SUM_MAX] = { 0u }; - - /*index0:结构体成员个数,其他按顺序填充结构体成员长度*/ - ArrBuff[0] = OC_SWITCH_CFG_STR_MEMBER_NUM; - ArrBuff[1] = (UINT8)sizeof(OCSwitchCfgStrBuff[0].SwitchId); - ArrBuff[2] = (UINT8)sizeof(OCSwitchCfgStrBuff[0].BelongOcId); - (void)memset(dquCICfgDtStr.OCSwitchCfgStr, 0x00, sizeof(OCSwitchConfigDataStruct) * SWITCH_SUM_MAX); - - rtnValue = OCConfigDataStructInit(&len, FSName, OC_DATA_TYPE, OC_SWITCH_ID, SWITCH_SUM_MAX, \ - (void*)OCSwitchCfgStrBuff, ArrBuff); - - if (1u == rtnValue) - { - /*填充OCSwitchCfgStr数组长度*/ - dquCICfgDtStr.OCSwitchCfgStrLen = len; - for (i = 0u; i < len; i++) - { - if (OCSwitchCfgStrBuff[i].SwitchId < SWITCH_SUM_MAX) - { - dquCICfgDtStr.OCSwitchCfgStr[OCSwitchCfgStrBuff[i].SwitchId] = OCSwitchCfgStrBuff[i]; - } - } - } - - return rtnValue; -} /********************************************* *函数功能:初始化OC 道岔转辙机状态指示灯表 *参数说明:FSName文件指针 @@ -10298,6 +10309,83 @@ UINT8 OCSwitchCfgZzjDataStuInit(CHAR* FSName) return rtnValue; } + +/********************************************* +*函数功能:初始化OC 道岔配置表数据 +*参数说明:FSName文件指针 +*返回值:0,失败;1,成功 +*********************************************/ +UINT8 OCSwitchConfigDataStructInit(CHAR* FSName) +{ + UINT8 rtnValue = 0u; + UINT8* pDataAddr = NULL; /*数据地址*/ + UINT32 DataSize = 0u; /*数据大小(字节数)*/ + UINT8 funcRtn = 0u; + UINT16 realRowCount = 0u; /*实际表数据的行数*/ + UINT16 i = 0u; + UINT16 wDataLen = 0u; /*数据宽度*/ + + /*入口参数检查*/ + if (NULL == FSName) + { + ; /*入口参数不合法*/ + } + else + { + /*读取道岔转辙机状态指示灯表数据*/ + funcRtn = dquGetConfigDataNew(FSName, OC_DATA_TYPE, OC_SWITCH_ID, &pDataAddr, &DataSize, &realRowCount); + if (0u == funcRtn) + { + rtnValue = 0u; + } + else + { + rtnValue = 1u; + for (i = 0u; i < SWITCH_SUM_MAX; i++) + { + funcRtn &= CommonMemSet(dquCICfgDtStr.OCSwitchCfgStr, (UINT32)sizeof(OCSwitchConfigDataStruct), 0u, (UINT32)sizeof(OCSwitchConfigDataStruct)); + } + + if (1u == funcRtn) + { + /*不做处理*/ + } + if ((0u != DataSize) && (0u != realRowCount)) + { + if (0u == (DataSize % realRowCount)) + { + /*计算每行字节长度*/ + wDataLen = (UINT16)(DataSize / realRowCount); + for (i = 0u; i < realRowCount; i++) + { + /*道岔配置表*/ + (void)R_OCSwitchModeCfgDataFromChar(pDataAddr); + pDataAddr += wDataLen; + } + + if (dquCICfgDtStr.OCSwitchCfgStrLen != realRowCount) + { + /*数据错误*/ + rtnValue = 0u; + } + } + else + { + /*数据错误*/ + rtnValue = 0u; + } + } + else + { + ; /*不做处理*/ + } + + } + + } + + return rtnValue; +} #if 0 /********************************************* *函数功能:初始化OC 道岔配置表数据-----暂无适配兼容需求 屏蔽代码 @@ -11929,37 +12017,7 @@ UINT8 EaConfigDataStruFromDquEaStr(DSU_EMAP_EA_STRU* pEa, EaConfigStru* pEaCfgDt rtnvalue = 1u; return rtnvalue; } -/********************************************* -*函数功能:解析OC 道岔配置表数据 -*参数说明:pDataAddr 数据地址; -*返回值:0,失败;1,成功 -*备注:cgh-合并CID-2539-5::修改初始化《OC_配置数据表》中“物理区段模块配置表”、“信号机模块配置表”、“道岔模块配置表”的初始化方式,和其他表格的初始化方式一致 -*********************************************/ -void R_OCSwitchConfigDataFromChar(UINT8* pDataAddr) -{ - UINT8* pData = NULL; - UINT16 SwitchIdTemp = 0u; - if (NULL == pDataAddr) - { - ; /*入口参数为空,不进行解析操作*/ - } - else - { - pData = pDataAddr; - SwitchIdTemp = ShortFromChar(pData); - if (SwitchIdTemp < SWITCH_SUM_MAX) - { - /*道岔ID--2字节*/ - dquCICfgDtStr.OCSwitchCfgStr[SwitchIdTemp].SwitchId = SwitchIdTemp; - pData += 2u; - - /*所属OC--2字节*/ - dquCICfgDtStr.OCSwitchCfgStr[SwitchIdTemp].BelongOcId = ShortFromChar(pData); - pData += 2u; - } - } -} /********************************************* *函数功能:解析OC 道岔转辙机状态指示灯表 @@ -12388,6 +12446,11 @@ UINT8 LogRelateProSwDataInit(RouteConfigDataStruct* RouteCfgDtStr, LogicSectionC { rtnvalue = 1U; } + + if (1U == rtnvalue) + {/*将逻辑区段所属保护区段的防护道岔存储入逻辑区段结构体*/ + rtnvalue = LogRelateProSwDataByOverlapInit(pLgScCfgDtStr); + } return rtnvalue; } @@ -13698,4 +13761,584 @@ UINT8 SetCldAndScxMergeConfig(void) return ret; } + +/********************************************* +*函数功能:解析道岔模块配置表 +*参数说明:pDataAddr 数据地址; +*返回值:0,失败;1,成功 +* add by mpt 20260325 +*********************************************/ +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) + { + ; /*入口参数为空,不进行解析操作*/ + } + else + { + + pData = pDataAddr; + + wSwitchIdTemp = ShortFromChar(pData);/*道岔ID--2字节*/ + + + if (SWITCH_SUM_MAX > wSwitchIdTemp) + { + dquCICfgDtStr.OCSwitchCfgStr[dquCICfgDtStr.OCSwitchCfgStrLen].SwitchId = wSwitchIdTemp; + pData += 2u; + + 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; + pData += 1u;/*模块位置跳过*/ + + /*道岔模块-B板卡ID*/ + dquCICfgDtStr.OCSwitchCfgStr[dquCICfgDtStr.OCSwitchCfgStrLen].ModuleAddrB[i] = *pData; + pData += 1u; + pData += 1u;/*模块位置跳过*/ + + } + } + + dquCICfgDtStr.OCSwitchCfgStrLen++;/*数量增加*/ + + } + } +} + +/********************************************* +*函数功能:从道岔结构体计算道岔继电器结构体 +*参数说明:SwitchConfigDataStruct* pSwitchCfgDtStr 道岔配置数据结构体 +* add by mpt 20260325 +*返回值:0,失败;1,成功 +*********************************************/ +UINT8 SwitchCfgDtStruFromOCconfigStr(SwitchConfigDataStruct* pSwitchCfgDtStr) +{ + UINT16 j = 0u; + UINT8 rtnvalue = 0u; + UINT8 ocNum = 0u; + /*入口参数防护*/ + if (NULL == pSwitchCfgDtStr) + { + /*返回失败*/ + rtnvalue = 0u; + } + else + { + rtnvalue = 1u; + + if (SWITCH_SUM_MAX > pSwitchCfgDtStr->SwitchId) + { + + for (j = 0u; j < SWITCH_SUM_MAX; j++) + { + if (pSwitchCfgDtStr->SwitchId == dquCICfgDtStr.OCSwitchCfgStr[j].SwitchId) + { + if (SWITCH_BELONG_OC_MAX > ocNum) + { + rtnvalue = SwitchOcCfgStrFromOCconfigStr(&pSwitchCfgDtStr->belongOCConfigData[ocNum], &dquCICfgDtStr.OCSwitchCfgStr[j]); + + if (0u != pSwitchCfgDtStr->belongOCConfigData[ocNum].OcId) + { + pSwitchCfgDtStr->BelongOcId = pSwitchCfgDtStr->belongOCConfigData[ocNum].OcId;/*按照遍历到的最后一个OC区设置*/ + } + ocNum++; + pSwitchCfgDtStr->chSwitchBelongOcNum = ocNum; + + } + + if (0u == rtnvalue) + { + break; + } + + } + } + + + } + else + { + /*返回失败*/ + rtnvalue = 0u; + } + } + + return rtnvalue; +} + +/********************************************* +*函数功能:存储单个OC的板卡配置情况到道岔配置数据结构体 +*参数说明:SwitchBelongOCConfigDataStr* pSwitchOCcfgDtStr 道岔配置结构体 +* OCSwitchConfigDataStruct* pOcCfgDtStr OC配置表结构体 +*返回值:0,失败;1,成功 +* add by mpt 20260325 +*********************************************/ +UINT8 SwitchOcCfgStrFromOCconfigStr(SwitchBelongOCConfigDataStr* pSwitchOCcfgDtStr, OCSwitchConfigDataStruct* pOcCfgDtStr) +{ + UINT8 i = 0u; + UINT8 rtnvalue = 0u; + INT16 ret = 0; + UINT8 boardNum = 0u; + /*入口参数防护*/ + if ((NULL == pSwitchOCcfgDtStr)||(NULL == pOcCfgDtStr)) + { + /*返回失败*/ + rtnvalue = 0u; + } + else + { + pSwitchOCcfgDtStr->OcId = pOcCfgDtStr->BelongOcId; + rtnvalue =1u; + for (i = 0u; i < MAX_OC_SWITCH_INCLUDE_BOARD_NUM; i++) + { + /*先存A系板卡*/ + if ((0U != pOcCfgDtStr->ModuleAddrA[i]) && (UINT8_MAX != pOcCfgDtStr->ModuleAddrA[i])) + {/*板卡ID不等于0,不等于255*/ + ret = SetNoUINT8RepeatDataToBuf((UINT8 *)pSwitchOCcfgDtStr->ModuleAddr, MAX_OC_SWITCH_INCLUDE_BOARD_NUM, pOcCfgDtStr->ModuleAddrA[i], boardNum); + if (-1 != ret) + { + boardNum = ret; + } + else + { + /*返回失败*/ + rtnvalue = 0u; + } + } + /*A系板卡后面紧挨着B系板卡*/ + if (1u == rtnvalue) + { + if ((0U != pOcCfgDtStr->ModuleAddrB[i]) && (UINT8_MAX != pOcCfgDtStr->ModuleAddrB[i])) + {/*板卡ID不等于0,不等于255*/ + ret = SetNoUINT8RepeatDataToBuf((UINT8*)pSwitchOCcfgDtStr->ModuleAddr, MAX_OC_SWITCH_INCLUDE_BOARD_NUM, pOcCfgDtStr->ModuleAddrB[i], boardNum); + if (-1 != ret) + { + boardNum = ret; + } + else + { + /*返回失败*/ + rtnvalue = 0u; + } + } + } + + if (0u == rtnvalue) + { + break; + } + } + + + if (1u == rtnvalue) + { + pSwitchOCcfgDtStr->chSwitchBoardNum = boardNum; + } + else + { + /*无处理*/ + } + } + + return rtnvalue; +} + +/********************************************* +*函数功能:计算道岔关联每一个OC的插箱数 +*参数说明:SwitchConfigDataStruct* pSwitchCfgDtStr 道岔配置数据结构体 +*返回值:0,失败;1,成功 +* add by mpt 20260325 +*********************************************/ +UINT8 CalcuSwitchInsertionBoxData(SwitchConfigDataStruct* pSwitchCfgDtStr) +{ + UINT8 rtnvalue = 0u; + UINT8 i = 0u; + UINT8 j = 0u; + UINT8 chBoxId = 0u;/*插箱ID*/ + UINT8 cInsertionBoxNum = 0u; + INT16 ret = 0; + + /*入口参数防护*/ + if (NULL == pSwitchCfgDtStr) + { + /*返回失败*/ + rtnvalue = 0u; + } + else + { + rtnvalue = 1u; + + for (i = 0u; i < pSwitchCfgDtStr->chSwitchBelongOcNum; i++) + { + /*通过A系板卡地址,就可算出板卡所在插箱,不用考虑B系板卡*/ + for (j = 0u; j < pSwitchCfgDtStr->belongOCConfigData[i].chSwitchBoardNum; j++) + { + chBoxId = (pSwitchCfgDtStr->belongOCConfigData[i].ModuleAddr[j] >> 4) & 0x0F;/*只取数字的高字节位*/ + if ((0U < chBoxId)&&(SWITCH_BOX_NUM > chBoxId)) + { + /*填充本道岔在当前OC的插箱数*/ + if (0u == pSwitchCfgDtStr->belongOCConfigData[i].szPlusBoxId) + { + pSwitchCfgDtStr->belongOCConfigData[i].szPlusBoxId = chBoxId; + } + else + { + if (chBoxId != pSwitchCfgDtStr->belongOCConfigData[i].szPlusBoxId) + {/*若一个道岔的转辙机板不在同一插箱,则初始化失败*/ + /*返回失败*/ + rtnvalue = 0u; + } + } + } + else + { + /*返回失败*/ + rtnvalue = 0u; + } + + if (0u == rtnvalue) + { + break; + } + } + } + + } + + return rtnvalue; +} +/********************************************* +*函数功能:填充不重复的数据进入数组 +*参数说明:目标数组的指针 +* 待填入的数据 +*返回值:非-1为已填入的长度,-1为空间已满 +* add by mpt 20260330 +*********************************************/ +INT16 SetNoUINT8RepeatDataToBuf(UINT8* pBuf, UINT16 maxlen, UINT8 dwData, UINT16 currentLen) +{ + UINT16 i = 0u; + INT16 bufNewLen = -1; + + if ((NULL != pBuf) && (maxlen >= currentLen)) + { + for (i = 0u; i < currentLen; i++) + { + if (pBuf[i] == dwData) + { + break; + } + } + if (i == currentLen) + {/*存在新数据输入*/ + if (maxlen > currentLen) + { + pBuf[i] = dwData; + bufNewLen = (INT16)(currentLen + 1u); + } + else + { + bufNewLen = -1; + } + } + else + {/*无新数据*/ + bufNewLen = (INT16)currentLen; + } + } + else + { + /*无处理*/ + bufNewLen = -1; + } + return bufNewLen; +} +/********************************************* +*函数功能:逻辑区段关联防护道岔(遍历保护区段) +*参数说明:pLogCfgDtStr配置数据结构体指针 +*返回值:0,失败;1,成功 +* add mpt 20260331 +*********************************************/ +UINT8 LogRelateProSwDataByOverlapInit(LogicSectionConfigDataStruct* pLgScCfgDtStr) +{ + UINT8 rtnvalue = 0U; + UINT16 ii = 0U; + UINT16 jj = 0U; + UINT8 kk = 0U; + UINT8 hh = 0U; + UINT8 mm = 0U; + UINT16 wProtectSwSum = 0U;/*逻辑区段关联防护道岔数量计数*/ + UINT16 wProtectSwId = 0U;/*逻辑区段关联防护道岔ID过渡变量*/ + UINT8 chProtectSwFlag = 0U;/*逻辑区段关联防护道岔去重标志*/ + UINT8 chMaxCheck = CI_SUCCESS; + + 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; + 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) + { + break; + } + } + if (CI_ERROR == chMaxCheck) + { + break; + } + } + if (CI_ERROR == chMaxCheck) + { + rtnvalue = 0U; + } + else + { + rtnvalue = 1U; + } + } + + return rtnvalue; +} + +/********************************************* +*函数功能:逻辑区段关联保护区段相关数据初始化 +*参数说明:pOverlapCfgDtStr保护区段配置数据结构体指针 pLogCfgDtStr配置数据结构体指针 +*返回值:0,失败;1,成功 +* add by mpt 20260331 +*********************************************/ +UINT8 LogRelateOverlapDataInit(OverlapConfigDataStruct* pOverlapCfgDtStr, LogicSectionConfigDataStruct* pLogCfgDtStr) +{ + UINT16 i = 0U; + UINT16 j = 0U; + UINT8 rtnvalue = 0U; + UINT8 chMaxCheck = CI_SUCCESS; + + if ((NULL != pOverlapCfgDtStr) && (NULL != pLogCfgDtStr)) + { + /*逻辑区段包含保护区段数目初始化为0*/ + pLogCfgDtStr->chRelateOverLapSum = 0U; + for (i = 0U; i < dquCICfgDtStr.OvlapCfgDtStrLen; i++) + {/*遍历所有保护区段,若包含此逻辑区段,即此保护区段为本逻辑区段关联保护区段*/ + for (j = 0; j < pOverlapCfgDtStr[i].cLogicSectionSum; j++) + { + if (pOverlapCfgDtStr[i].szLogicSectionIdBuf[j] == pLogCfgDtStr->LogicSectionId) + { + if (LOGSEC_RELATE_OVERLAP_SUM_MAX > pLogCfgDtStr->chRelateOverLapSum) + { + pLogCfgDtStr->wRelateOverLapIdBuf[pLogCfgDtStr->chRelateOverLapSum] = pOverlapCfgDtStr[i].OverlapId; + pLogCfgDtStr->chRelateOverLapSum++; + } + else + { + chMaxCheck = CI_ERROR; + } + break; + } + if (CI_ERROR == chMaxCheck) + { + break; + } + } + if (CI_ERROR == chMaxCheck) + { + break; + } + } + if (CI_ERROR == chMaxCheck) + { + rtnvalue = 0U; + } + else + { + rtnvalue = 1U; + } + } + + return rtnvalue; +} + +/********************************************* +*函数功能:逻辑区段配置数据结构体计算 +*参数说明:LogsecSwitchStruct* pSrcSwitchStructBuf 源数据 + UINT8 chSrclen 源数据长度 + AxisSwitchStruct* pDstSwitchStructBuf 目标数据 + UINT8 dstLen 目标数据长度 +*返回值:-1,失败;其他为长度 +*add by mpt 20260331 +*********************************************/ +INT16 AxisSecCfgDtStruFromLogicSecStr(LogsecSwitchStruct* pSrcSwitchStructBuf,UINT8 chSrclen, AxisSwitchStruct* pDstSwitchStructBuf,UINT8 dstLen) +{ + UINT8 i = 0u; + UINT8 j = 0u; + INT16 rtnvalue = -1; + UINT8 tempLen = 0u; + + if ((NULL != pSrcSwitchStructBuf) && (NULL != pDstSwitchStructBuf)) + { + rtnvalue = 0; + tempLen = dstLen; + for (i = 0u; i < chSrclen; i++) + { + for (j = 0u; j < dstLen; j++) + { + if ((pSrcSwitchStructBuf[i].SwitchId == pDstSwitchStructBuf[j].SwitchId) && (pSrcSwitchStructBuf[i].SwitchPosition == pDstSwitchStructBuf[j].SwitchPosition)) + {/*输入的源数据在目标数据中已经找到了,则跳出*/ + break; + } + else + { + /*继续*/ + } + } + if (j == dstLen) + {/*在目标数据中未找到本条防护道岔配置*/ + if (AXIS_RELATE_PRO_SW_SUM_MAX > tempLen) + { + pDstSwitchStructBuf[tempLen].SwitchId = pSrcSwitchStructBuf[i].SwitchId; + pDstSwitchStructBuf[tempLen].SwitchPosition = pSrcSwitchStructBuf[i].SwitchPosition; + tempLen++; + } + else + { + rtnvalue = -1; + break; + } + } + else + { + /*充分数据无需添加*/ + } + } + } + else + { + /*返回失败*/ + rtnvalue = -1; + } + + if (0 == rtnvalue) + { + rtnvalue = (INT16)tempLen; + } + + return rtnvalue; +} + +/********************************************* +*函数功能:计轴区段防护道岔初始化 +*参数说明:void +*返回值:0,失败;1,成功 +* add mpt 20260331 +*********************************************/ +UINT8 AxisSecProtectSwitchInit(void) +{ + UINT16 j = 0u; + UINT16 i = 0u; + INT16 ret = 0; + UINT16 k = 0u; + UINT8 rtnvalue = 0u; + AxisSectionConfigDataStruct* pAxScCfgDtStr = NULL; + + for (k = 0u; k < dquCICfgDtStr.AxisCfgDtStrLen; k++) + { + pAxScCfgDtStr = &dquCICfgDtStr.AxisSctCfgDtStr[k]; + + + for (i = 0u; i < pAxScCfgDtStr->LogSectionSum; i++) + { + for (j = 0u; j < dquCICfgDtStr.lgcSctCfgDtStrLen; j++) + { + if (dquCICfgDtStr.lgcSctCfgDtStr[j].LogicSectionId == pAxScCfgDtStr->LogSectionIdBuf[i]) + { + /*拷贝拷贝*/ + ret = AxisSecCfgDtStruFromLogicSecStr(dquCICfgDtStr.lgcSctCfgDtStr[j].wRelateProSwId, dquCICfgDtStr.lgcSctCfgDtStr[j].chRelateProSwSum, pAxScCfgDtStr->wRelateProSwId, pAxScCfgDtStr->chRelateProSwSum); + if (-1 != ret) + { + pAxScCfgDtStr->chRelateProSwSum = ret;/*更新数量*/ + } + break; + } + } + if (-1 == ret) + { + break; + } + } + + + if (-1 == ret) + { + break; + } + } + + if (-1 == ret) + { + rtnvalue = 0u; + } + else + { + rtnvalue = 1u; + } + + return rtnvalue; +} + diff --git a/TSCP/src/APP/ciapp/QueryFiles/dquCIInit.h b/TSCP/src/APP/ciapp/QueryFiles/dquCIInit.h index d3f5f08..bb350af 100644 --- a/TSCP/src/APP/ciapp/QueryFiles/dquCIInit.h +++ b/TSCP/src/APP/ciapp/QueryFiles/dquCIInit.h @@ -49,9 +49,6 @@ /*4个字节*/ #define LONG_LEN ((UINT8)4) -/*dquCICfgDtStr.OCSwitchCfgStr中成员个数*/ -#define OC_SWITCH_CFG_STR_MEMBER_NUM ((UINT8)2) - /*dquCICfgDtStr.OCSwitchCfgStr中成员个数_旧版*/ #define OC_SWITCH_CFG_STR_MEMBER_NUM_OLD ((UINT8)6) @@ -839,14 +836,6 @@ UINT8 EaConfigDataStruFromDquEaStr(DSU_EMAP_EA_STRU* pEa, EaConfigStru* pEaCfgDt *返回值:0,失败;1,成功 *********************************************/ UINT8 EaConfigDataStructInit(CHAR * FSName); - -/********************************************* -*函数功能:解析OC 道岔配置表数据 -*参数说明:pDataAddr 数据地址; -*返回值:0,失败;1,成功 -*备注:cgh-合并CID-2539-5::修改初始化《OC_配置数据表》中“物理区段模块配置表”、“信号机模块配置表”、“道岔模块配置表”的初始化方式,和其他表格的初始化方式一致 -*********************************************/ -void R_OCSwitchConfigDataFromChar(UINT8* pDataAddr); /********************************************* *函数功能:解析OC 道岔转辙机状态指示灯表 *参数说明:pDataAddr 数据地址; @@ -1011,5 +1000,73 @@ INT16 SetNoRepeatDataToBuf(UINT16* pBuf, UINT16 maxlen, UINT16 dwData, UINT16 cu * add by mpt 20260104 *********************************************/ UINT8 SetCldAndScxMergeConfig(void); +/********************************************* +*函数功能:解析道岔模块配置表 +*参数说明:pDataAddr 数据地址; +*返回值:0,失败;1,成功 +* add by mpt 20260325 +*********************************************/ +void R_OCSwitchModeCfgDataFromChar(UINT8* pDataAddr); +/********************************************* +*函数功能:存储单个OC的板卡配置情况到道岔配置数据结构体 +*参数说明:SwitchBelongOCConfigDataStr* pSwitchOCcfgDtStr 道岔配置结构体 +* OCSwitchConfigDataStruct* pOcCfgDtStr OC配置表结构体 +*返回值:0,失败;1,成功 +* add by mpt 20260325 +*********************************************/ +UINT8 SwitchOcCfgStrFromOCconfigStr(SwitchBelongOCConfigDataStr* pSwitchOCcfgDtStr, OCSwitchConfigDataStruct* pOcCfgDtStr); +/********************************************* +*函数功能:从道岔结构体计算道岔继电器结构体 +*参数说明:SwitchConfigDataStruct* pSwitchCfgDtStr 道岔配置数据结构体 +*返回值:0,失败;1,成功 +* add by mpt 20260325 +*********************************************/ +UINT8 SwitchCfgDtStruFromOCconfigStr(SwitchConfigDataStruct* pSwitchCfgDtStr); +/********************************************* +*函数功能:计算道岔关联每一个OC的插箱数 +*参数说明:SwitchConfigDataStruct* pSwitchCfgDtStr 道岔配置数据结构体 +*返回值:0,失败;1,成功 +* add by mpt 20260325 +*********************************************/ +UINT8 CalcuSwitchInsertionBoxData(SwitchConfigDataStruct* pSwitchCfgDtStr); +/********************************************* +*函数功能:填充不重复的数据进入数组 +*参数说明:目标数组的指针 +* 待填入的数据 +*返回值:非-1为已填入的长度,-1为空间已满 +* add by mpt 20260330 +*********************************************/ +INT16 SetNoUINT8RepeatDataToBuf(UINT8* pBuf, UINT16 maxlen, UINT8 dwData, UINT16 currentLen); +/********************************************* +*函数功能:逻辑区段关联保护区段相关数据初始化 +*参数说明:pOverlapCfgDtStr保护区段配置数据结构体指针 pLogCfgDtStr配置数据结构体指针 +*返回值:0,失败;1,成功 +* add by mpt 20260331 +*********************************************/ +UINT8 LogRelateOverlapDataInit(OverlapConfigDataStruct* pOverlapCfgDtStr, LogicSectionConfigDataStruct* pLogCfgDtStr); +/********************************************* +*函数功能:逻辑区段关联防护道岔(遍历保护区段) +*参数说明:pLogCfgDtStr配置数据结构体指针 +*返回值:0,失败;1,成功 +* add mpt 20260331 +*********************************************/ +UINT8 LogRelateProSwDataByOverlapInit(LogicSectionConfigDataStruct* pLgScCfgDtStr); +/********************************************* +*函数功能:逻辑区段配置数据结构体计算 +*参数说明:LogsecSwitchStruct* pSrcSwitchStructBuf 源数据 + UINT8 chSrclen 源数据长度 + AxisSwitchStruct* pDstSwitchStructBuf 目标数据 + UINT8 dstLen 目标数据长度 +*返回值:-1,失败;其他为长度 +*add by mpt 20260331 +*********************************************/ +INT16 AxisSecCfgDtStruFromLogicSecStr(LogsecSwitchStruct* pSrcSwitchStructBuf, UINT8 chSrclen, AxisSwitchStruct* pDstSwitchStructBuf, UINT8 dstLen); +/********************************************* +*函数功能:计轴区段防护道岔初始化 +*参数说明:void +*返回值:0,失败;1,成功 +* add mpt 20260331 +*********************************************/ +UINT8 AxisSecProtectSwitchInit(void); #endif diff --git a/TSCP/src/APP/ciapp/QueryFiles/dquCIInterFace.c b/TSCP/src/APP/ciapp/QueryFiles/dquCIInterFace.c index 9a3d1bd..b3448cb 100644 --- a/TSCP/src/APP/ciapp/QueryFiles/dquCIInterFace.c +++ b/TSCP/src/APP/ciapp/QueryFiles/dquCIInterFace.c @@ -2369,57 +2369,25 @@ UINT8 ReadSystemParamConfDataNew(const UINT8 ciId,SystemParameterStructNew* Syst } if (1u == rtnVal) { /*给从公共查询函数中*/ - /*紧急制动最高触发速度(单位已在dfsInitSubSystemCommonConfigData_CC函数中转换)*/ - SystemParameterStru->MaxLineLimitSpeed = dquCICfgDtStr.SystemParaStrNew.MaxLineLimitSpeed; /*临时限速最高限速(km/h)(未进行单位转换)*/ SystemParameterStru->MaxTsrSpeed = dquCICfgDtStr.SystemParaStrNew.MaxTsrSpeed; - /*NTP校时时区差(小时)*/ - SystemParameterStru->TimeZoneDifference = dquCICfgDtStr.SystemParaStrNew.TimeZoneDifference; - - /*区间同向行驶双车间隔最小安全距离(cm))*/ - SystemParameterStru->MABackDistance = dquCICfgDtStr.SystemParaStrNew.MABackDistance; - /*一次设置的临时限速最大个数*/ SystemParameterStru->MaxTsrNum = dquCICfgDtStr.SystemParaStrNew.MaxTsrNum; /*一个临时限速报文中包含的最大限速区段数量*/ SystemParameterStru->MaxSectionOfTsr = dquCICfgDtStr.SystemParaStrNew.MaxSectionOfTsr; - /*IVOC-IVOC信故障判断时间(ms)*/ - SystemParameterStru->IvocIvocCommunicationErrorTime = dquCICfgDtStr.SystemParaStrNew.IvocIvocCommunicationErrorTime; - /*IVOC-OC通信故障判断时间(ms)*/ SystemParameterStru->IvocOcCommunicationErrorTime = dquCICfgDtStr.SystemParaStrNew.IvocOcCommunicationErrorTime; - /*VOBC-ITS通信故障判断时间(ms)*/ - SystemParameterStru->VobcAtsCommunicationErrorTime = dquCICfgDtStr.SystemParaStrNew.VobcAtsCommunicationErrorTime; - - /*TMC-ITS通信故障判断时间(ms)*/ - SystemParameterStru->TmcItsCommunicationErrorTime = dquCICfgDtStr.SystemParaStrNew.TmcItsCommunicationErrorTime; - - /*ITS-OC通信故障判断时间(ms)*/ - SystemParameterStru->ItsOcCommunicationErrorTime = dquCICfgDtStr.SystemParaStrNew.ItsOcCommunicationErrorTime; - - /*OC-PSD通信故障判断时间(ms)*/ - SystemParameterStru->OcPsdCommunicationErrorTime = dquCICfgDtStr.SystemParaStrNew.OcPsdCommunicationErrorTime; - - /*IVOC-TSL通信故障判断时间(ms)*/ - SystemParameterStru->IvocTslCommunicationErrorTime = dquCICfgDtStr.SystemParaStrNew.IvocTslCommunicationErrorTime; - /*OC-TSL通信故障判断时间(ms)*/ SystemParameterStru->OcTslCommunicationErrorTime = dquCICfgDtStr.SystemParaStrNew.OcTslCommunicationErrorTime; - /*满足精确停车条件的MA延伸长度(cm)*/ - SystemParameterStru->MALengthForATOParking = dquCICfgDtStr.SystemParaStrNew.MALengthForATOParking; - /*本线系统定义逻辑方向与上下行方向的关系*/ SystemParameterStru->LinkLogicDirUpAndDown = dquCICfgDtStr.SystemParaStrNew.LinkLogicDirUpAndDown; - /*对向行驶双车间隔最小安全距离(cm)*/ - SystemParameterStru->OppositeTrackDistance = dquCICfgDtStr.SystemParaStrNew.OppositeTrackDistance; - /*线路最差情况下紧急制动距离(单位m)*/ SystemParameterStru->MaxMALength = dquCICfgDtStr.SystemParaStrNew.MaxMALength; @@ -3465,7 +3433,7 @@ void ReadEmapCiConfig(EmapCiConfigStru emapVerArr[]) for (i = 0u; i < wCIStruSum; i++) { - ciId = (UINT8)(dsuStaticHeadStru.pCIStruStru[i].wID & 0x00FF); + ciId = (UINT8)(dsuStaticHeadStru.pCIStruStru[i].wID & 0x00FFu); emapVerArr[ciId].devId = ciId; emapVerArr[ciId].ciType = (UINT8)(dsuStaticHeadStru.pCIStruStru[i].wType); if (CI_TYPE_TCC == dsuStaticHeadStru.pCIStruStru[i].wType) @@ -3531,7 +3499,7 @@ void ReadEmapCiConfig(EmapCiConfigStru emapVerArr[]) for (i = 0u; i < wRCStruSum; i++) { /*并非所有联锁均包含在RC表,因此未配置在RC表中时根据CI表初始化*/ - ciId = (UINT8)(dsuStaticHeadStru.pRCStruStru[i].wID & 0x00FF); + ciId = (UINT8)(dsuStaticHeadStru.pRCStruStru[i].wID & 0x00FFu); emapVerArr[ciId].devId = ciId; emapVerArr[ciId].ciType = (UINT8)(dsuStaticHeadStru.pRCStruStru[i].wType); if (CI_TYPE_TCC == dsuStaticHeadStru.pRCStruStru[i].wType) diff --git a/TSCP/src/APP/ciapp/QueryFiles/dquCIJDQStruFrmChar.c b/TSCP/src/APP/ciapp/QueryFiles/dquCIJDQStruFrmChar.c index ce2f60a..5afb0b5 100644 --- a/TSCP/src/APP/ciapp/QueryFiles/dquCIJDQStruFrmChar.c +++ b/TSCP/src/APP/ciapp/QueryFiles/dquCIJDQStruFrmChar.c @@ -521,13 +521,16 @@ UINT8 R_WashMachineStructFromChar(UINT8* pDataAddr, Relay_WashMachineStruct* pWa pData += 2U; pWashMachineStr->TailWashAllowRelayId = dquCiShortFromChar(pData); /*出发2继电器ID*/ pData += 2U; + pWashMachineStr->wCouplingWashAllowRelayId = dquCiShortFromChar(pData); /*联挂端出发继电器ID*/ + pData += 2U; pWashMachineStr->WashTrainRequestRelayId = dquCiShortFromChar(pData); /*洗车请求继电器ID*/ pData += 2U; - pWashMachineStr->TrainHeadStopSteadyRelayId = dquCiShortFromChar(pData); /*列车停稳1继电器ID*/ pData += 2U; pWashMachineStr->TrainTailStopSteadyRelayId = dquCiShortFromChar(pData); /*列车停稳2继电器ID*/ pData += 2U; + pWashMachineStr->wCoupingStopSteadyRelayId = dquCiShortFromChar(pData); /*联挂端停稳继电器ID*/ + pData += 2U; pWashMachineStr->TrainOutWashPortAllowRelayId = dquCiShortFromChar(pData);/*允许出库继电器ID*/ pData += 2U; pWashMachineStr->PauseTrainWashRequestRelayId = dquCiShortFromChar(pData); /*暂停洗车继电器ID*/ @@ -611,6 +614,10 @@ UINT8 R_NoRouteDcStruFromChar(UINT8 * pDataAddr,Relay_NoRouteDcStruct* pNoRotStr pNoRotStr->wRelayColTongYiScId = dquCiShortFromChar(pData); /* 试车线采集同意试车继电器ID */ pData += 2u; + pNoRotStr->wWaysideTryTrainIndRelayId = dquCiShortFromChar(pData); /* 轨旁试车指示器继电器ID */ + pData += 2u; + + rtnvalue = 1u; return rtnvalue; diff --git a/TSCP/src/APP/ciapp/QueryFiles/dquCIPZStru.h b/TSCP/src/APP/ciapp/QueryFiles/dquCIPZStru.h index 885f82c..8d41f4a 100644 --- a/TSCP/src/APP/ciapp/QueryFiles/dquCIPZStru.h +++ b/TSCP/src/APP/ciapp/QueryFiles/dquCIPZStru.h @@ -40,7 +40,7 @@ #define CI_SYSTEM_OUTSIG_RALATE_AXIS_LEN ((UINT8)82) #define CI_SYSTEM_CI_PATTERN_ID ((UINT8)0x08) /*增加联锁类型配置表*/ -#define CI_SYSTEM_CI_PATTERN_LEN ((UINT8)13) /*修改为13,增加是否分布式联锁,UT/CT保护区段解锁停稳时间,UT/CT接近区段延时解锁超限时间*/ +#define CI_SYSTEM_CI_PATTERN_LEN ((UINT8)14) /*修改为14,增加是否分布式联锁,UT/CT保护区段解锁停稳时间,UT/CT接近区段延时解锁超限时间*/ #define CI_SYSTEM_VIRCI_INCLUDEOC_ID ((UINT8)0x09) /*增加虚拟联锁与OC对应关系表*/ #define CI_SYSTEM_VIRCI_INCLUDEOC_LEN ((UINT8)22) diff --git a/TSCP/src/APP/ciapp/QueryFiles/dquMaskInit.c b/TSCP/src/APP/ciapp/QueryFiles/dquMaskInit.c index 6042967..be8beab 100644 --- a/TSCP/src/APP/ciapp/QueryFiles/dquMaskInit.c +++ b/TSCP/src/APP/ciapp/QueryFiles/dquMaskInit.c @@ -304,7 +304,7 @@ UINT8 MaskCfgDtStruFrmCIATSPsdMask(UINT8* FSDataName) MASK_TYPE_PSD_PCB,MASK_TYPE_PSD_POB,MASK_TYPE_PSD_PSB,MASK_TYPE_PSD_PCB_INVALID, MASK_TYPE_PSD_POB_INVALID,MASK_TYPE_PSD_PSB_INVALID,MASK_TYPE_PSD_JXTC_PANGLU, MASK_TYPE_PSD_PCBPSBDPB_PANGLU_STATE,MASK_TYPE_PSD_PDB_FLASH_STATE, - MASK_TYPE_PSD_VIDEO_QK_LU,MASK_TYPE_PSD_VIDEO_QK_HONG,MASK_TYPE_PSD_EXCEPT_OPEN,MASK_TYPE_PSD_JXTCPANGLU_FAULT,MASK_TYPE_PSD_IBP_STATE,MASK_TYPE_PSD_IBP_FAULT,MASK_TYPE_PSD_JXTC_STATE,0U }; + MASK_TYPE_PSD_VIDEO_QK_LU,MASK_TYPE_PSD_VIDEO_QK_HONG,MASK_TYPE_PSD_EXCEPT,MASK_TYPE_PSD_JXTCPANGLU_FAULT,MASK_TYPE_PSD_IBP_STATE,MASK_TYPE_PSD_IBP_FAULT,MASK_TYPE_PSD_JXTC_STATE,0U }; #else UINT8 MaskType[] = { 0u,MASK_TYPE_PSD_STATE_ATS,MASK_TYPE_MUTUALLOCK_STATE,MASK_TYPE_REMORA_STATE, MASK_TYPE_PSD_PCB,MASK_TYPE_PSD_POB,MASK_TYPE_PSD_PSB,MASK_TYPE_PSD_PCB_INVALID,MASK_TYPE_PSD_POB_INVALID,MASK_TYPE_PSD_PSB_INVALID,0 }; #endif @@ -546,7 +546,7 @@ UINT8 MaskCfgDtStruFrmCIATSLogSgmtT(UINT8* FSDataName) MASK_TYPE_LOGICSECTION_JUMPLOCK, MASK_TYPE_UPWARD_DIRECTION, MASK_TYPE_DOWNWARD_DIRECTION, - MASK_TYPE_LOGICSECTION_ARB, + MASK_TYPE_LOGSEC_CBTC_ARB, MASK_TYPE_LOGICSECTION_EMERG_XIANSU,1u }; UINT16 BuChang = 0u; funcRtn = dquGetConfigDataNew(FSDataName, CI_ATS_MASK_TYPE, CI_ATS_LOGIC_SGMT_MASK_ID, &pDataAddr, &DataSize, &rowCount); @@ -594,7 +594,7 @@ UINT8 MaskCfgDtStruFrmCIATSLogSgmtT(UINT8* FSDataName) if ((0xFFFFu != tempMaskId) && (0u != tempMaskId)) { /*0和0xFFFF是无效的码位*/ - if ((CI_SUM_MAX > MaskRow) && (CI_TO_ATS_MASK_SUM_MAX > tempMaskId) && (0u < tempMaskId))/*检查是否为有效码位值*/ + if ((CI_SUM_MAX > MaskRow) && (CI_TO_ATS_MASK_SUM_MAX > tempMaskId))/*检查是否为有效码位值*/ { ConfigCiToAtsMaskConfigDataStru[MaskRow][tempMaskId].DeviceId = DeviceID; ConfigCiToAtsMaskConfigDataStru[MaskRow][tempMaskId].DeviceType = CI_DEVICE_TYPE_LOGICSEC; @@ -669,8 +669,9 @@ UINT8 MaskCfgDtStruFrmCIATSLogSgmt(UINT8 * FSDataName) MASK_TYPE_LOGICSECTION_JUMPLOCK, MASK_TYPE_UPWARD_DIRECTION, MASK_TYPE_DOWNWARD_DIRECTION, - MASK_TYPE_LOGICSECTION_ARB, + MASK_TYPE_LOGSEC_CBTC_ARB, MASK_TYPE_LOGICSECTION_SPKS_FLOCK, + MASK_TYPE_LOGSEC_PB_TACS_ARB, 1u}; UINT16 BuChang = 0u; funcRtn = dquGetConfigDataNew(FSDataName,CI_ATS_MASK_TYPE,CI_ATS_LOGIC_SGMT_MASK_ID,&pDataAddr,&DataSize,&rowCount); @@ -1426,7 +1427,7 @@ UINT8 MaskCfgDtStruFrmCIATSWashM(UINT8* FSDataName) UINT16 residue = 0u; UINT16 tempMaskId = 0u; /*码位ID临时变量*/ - UINT8 MaskType[] = { 0u,MASK_TYPE_WASHMACHINE_READYSTATE,MASK_TYPE_WASHMACHINE_WORKMODE,0u }; + UINT8 MaskType[] = { 0u,MASK_TYPE_WASHMACHINE_READYSTATE,0u }; UINT16 BuChang = 0u; funcRtn = dquGetConfigData(FSDataName, CI_ATS_MASK_TYPE, CI_ATS_WASHMACHINE_MASK_ID, &pDataAddr, &DataSize); if (0u == funcRtn) @@ -2459,7 +2460,7 @@ UINT8 MaskCfgDtStruFrmCIZCPsdMask(UINT8 * FSDataName) UINT16 DeviceID=0u; UINT16 tempMaskId = 0u; /*码位ID临时变量*/ - UINT8 MaskType[] = { 1u,MASK_TYPE_PSD_STATE,MASK_TYPE_PSD_EXCEPT_OPEN,1u }; + UINT8 MaskType[] = { 1u,MASK_TYPE_PSD_STATE,MASK_TYPE_PSD_EXCEPT,1u }; UINT16 BuChang = 0u; UINT16 wTempCount = 0U; funcRtn = dquGetConfigData(FSDataName,CI_ZC_MASK_TYPE,CI_ZC_PSD_MASK_ID,&pDataAddr,&DataSize); @@ -3333,7 +3334,7 @@ UINT8 MaskCfgStruFrmCIZCAxleSgmtMask(UINT8 * FSDataName) UINT8 MaskType[]={1u,MASK_TYPE_PHYSECTION_HEAD_STD,MASK_TYPE_PHYSECTION_HEAD_XTD,MASK_TYPE_PHYSECTION_OCCUPY, MASK_TYPE_PHYSECTION_ROUTELOCK,MASK_TYPE_PHYSECTION_JUMPLOCK_ZC,MASK_TYPE_AXISSECTION_ARB,MASK_TYPE_LIECHE_STOPSTATE, MASK_TYPE_PHYSECTION_HEAD_STD,MASK_TYPE_PHYSECTION_HEAD_XTD,MASK_TYPE_PHYSECTION_JUMPLOCK_APPLY, - MASK_TYPE_PHYSECTION_JUMPLOCK_CANCEL,1u}; + MASK_TYPE_PHYSECTION_JUMPLOCK_CANCEL,MASK_TYPE_PHYSECTION_INTRUSION,MASK_TYPE_PHYSECTION_ATS_FLOCK,1u}; UINT16 BuChang = 0u; funcRtn = dquGetConfigData(FSDataName,CI_ZC_MASK_TYPE,CI_ZC_AXLE_SGMT_MASK_ID,&pDataAddr,&DataSize); if(funcRtn==0u) @@ -3397,7 +3398,7 @@ UINT8 MaskCfgStruFrmCIZCAxleSgmtMask(UINT8 * FSDataName) } } } - else if((0u < residue )&&( residue < 6u)) + else if(((0u < residue )&&( residue < 6u))||((11U < residue)&&(residue < 14U))) { /*获取码位ID*/ tempMaskId = ShortFromChar(pDataAddr); @@ -3438,7 +3439,7 @@ UINT8 MaskCfgStruFrmCIZCAxleSgmtMask(UINT8 * FSDataName) BuChang++; } } - funcRtn = 1u; + funcRtn = 1u; return funcRtn; } @@ -3581,7 +3582,7 @@ UINT8 MaskCfgStruFrmZCCIAxleSgmtMask(UINT8 * FSDataName) UINT8 MaskType[]={1u,MASK_TYPE_PHYSECTION_HEAD_STD,MASK_TYPE_PHYSECTION_HEAD_XTD,MASK_TYPE_PHYSECTION_OCCUPY, MASK_TYPE_PHYSECTION_ROUTELOCK,MASK_TYPE_PHYSECTION_JUMPLOCK_ZC,MASK_TYPE_AXISSECTION_ARB,MASK_TYPE_LIECHE_STOPSTATE, MASK_TYPE_PHYSECTION_HEAD_STD,MASK_TYPE_PHYSECTION_HEAD_XTD,MASK_TYPE_PHYSECTION_JUMPLOCK_APPLY, - MASK_TYPE_PHYSECTION_JUMPLOCK_CANCEL,1u}; + MASK_TYPE_PHYSECTION_JUMPLOCK_CANCEL,MASK_TYPE_PHYSECTION_INTRUSION,MASK_TYPE_PHYSECTION_ATS_FLOCK,1u}; UINT16 BuChang = 0u; funcRtn = dquGetConfigData(FSDataName,CI_ZC_MASK_TYPE,CI_ZC_AXLE_SGMT_MASK_ID,&pDataAddr,&DataSize); if(0U == funcRtn) @@ -3658,7 +3659,7 @@ UINT8 MaskCfgStruFrmZCCIAxleSgmtMask(UINT8 * FSDataName) return funcRtn; } } - else if((6u <= residue)&&(residue <((CI_ZC_AXLE_SGMT_MASK_LEN/2u)-1u))) + else if((6u <= residue)&&(residue < 12U)) { /*获取码位ID*/ tempMaskId = ShortFromChar(pDataAddr); @@ -4697,7 +4698,7 @@ UINT8 MaskInit(UINT8 * FSDataName) ******CI到ATS码位表解析 ********/ /*CI-ATS道岔码位*/ - if (DATA_TYPE_NEW == chPulicData) + if (DATA_TYPE_MAIN_BRANCH == chPulicData) { /*CI-ATS道岔码位*/ funcRtn = MaskCfgDtStruFrmCIATSSwitchMask(FSDataName); @@ -4718,7 +4719,7 @@ UINT8 MaskInit(UINT8 * FSDataName) /*CI-ATS紧急停车按钮码位*/ funcRtn *= MaskCfgDtStruFrmCIATSEsbMask( FSDataName); /*CI-ATS逻辑区段码位*/ - if (DATA_TYPE_NEW == chPulicData) + if (DATA_TYPE_MAIN_BRANCH == chPulicData) { /*主线*/ funcRtn *= MaskCfgDtStruFrmCIATSLogSgmt(FSDataName); @@ -4742,7 +4743,7 @@ UINT8 MaskInit(UINT8 * FSDataName) funcRtn *= MaskCfgDtStruFrmCIATSSPKSMask(FSDataName); /*CI-ATS 洗车机码位*/ - if (DATA_TYPE_NEW == chPulicData) + if (DATA_TYPE_MAIN_BRANCH == chPulicData) { /*主线*/ funcRtn *= MaskCfgDtStruFrmCIATSWash(FSDataName); @@ -4773,7 +4774,7 @@ UINT8 MaskInit(UINT8 * FSDataName) if(RC_WORK_MODE_CI == ciPattern) { - if (DATA_TYPE_NEW == chPulicData) + if (DATA_TYPE_MAIN_BRANCH == chPulicData) { /*CI-ZC道岔码位*/ funcRtn *= MaskCfgDtStruFrmCIZCSwitchMask(FSDataName); @@ -4806,7 +4807,7 @@ UINT8 MaskInit(UINT8 * FSDataName) /*ZC-CI逻辑区段码位*/ funcRtn *= MaskCfgStruFrmZCCILogSgmtMask( FSDataName); /*CI-ZC逻辑区段码位*/ - if (DATA_TYPE_NEW == chPulicData) + if (DATA_TYPE_MAIN_BRANCH == chPulicData) { funcRtn *= MaskCfgDtStruFrmCI2ZCLogSgmt(FSDataName); } @@ -4818,7 +4819,7 @@ UINT8 MaskInit(UINT8 * FSDataName) /*CI-ZC进路码位*/ funcRtn *= MaskCfgStruFrmCIZCRouteMask( FSDataName); /*ZC-CI进路码位*/ - if (DATA_TYPE_NEW == chPulicData) + if (DATA_TYPE_MAIN_BRANCH == chPulicData) { funcRtn *= MaskCfgDtStruFrmZC2CiRouteMask(FSDataName); } diff --git a/TSCP/src/APP/ciapp/QueryFiles/dquMaskInit.h b/TSCP/src/APP/ciapp/QueryFiles/dquMaskInit.h index 75ac4e0..24a6e9d 100644 --- a/TSCP/src/APP/ciapp/QueryFiles/dquMaskInit.h +++ b/TSCP/src/APP/ciapp/QueryFiles/dquMaskInit.h @@ -53,7 +53,7 @@ #define CI_ZC_ROUTE_MASK_LEN ((UINT32)14) /*CI-ZC进路码位字节长度--1行长度*/ #define CI_ZC_AXLE_SGMT_MASK_ID ((UINT32)5) /*CI-ZC计轴区段码位*/ -#define CI_ZC_AXLE_SGMT_MASK_LEN ((UINT32)26) /*CI-ZC计轴区段码位字节长度--1行长度,Modified 20151015*/ +#define CI_ZC_AXLE_SGMT_MASK_LEN ((UINT32)30) /*CI-ZC计轴区段码位字节长度--1行长度,Modified 20151015*/ #define CI_ZC_OVER_LAP_MASK_ID ((UINT32)8) /*CI-ZC保护区段码位*/ #define CI_ZC_OVER_LAP_MASK_LEN ((UINT32)8) /*CI-ZC保护区段码位字节长度--1行长度*/ @@ -114,7 +114,7 @@ #define CI_ATS_SPKS_MASK_LEN ((UINT32)8) /*CI-ATS SPKS开关状态码位字节长度--1行长度;2018.03.19 由6改为8,CI_ATS SPKS开关码位表增加一列开关旁路状态码位*/ #define CI_ATS_WASHMACHINE_MASK_ID ((UINT32)11) /*CI-ATS 洗车机就绪状态码位*/ -#define CI_ATS_WASHMACHINE_MASK_LEN ((UINT32)8) /*CI-ATS 洗车机就绪状态码位字节长度--1行长度*/ +#define CI_ATS_WASHMACHINE_MASK_LEN ((UINT32)6) /*CI-ATS 洗车机就绪状态码位字节长度--1行长度*/ #define CI_ATS_AAR_ROUTE_MASK_ID ((UINT32)12) /*CI-ATS全自动折返进路码位*/ #define CI_ATS_AAR_ROUTE_MASK_LEN ((UINT32)6) /*CI-ATS全自动折返进路码位字节长度--1行长度*/ diff --git a/TSCP/src/APP/ciapp/QueryFiles/dqucijdqstru.h b/TSCP/src/APP/ciapp/QueryFiles/dqucijdqstru.h index 1ac7d24..58b202f 100644 --- a/TSCP/src/APP/ciapp/QueryFiles/dqucijdqstru.h +++ b/TSCP/src/APP/ciapp/QueryFiles/dqucijdqstru.h @@ -108,7 +108,8 @@ /*道岔配置表*/ #define OC_SWITCH_ID ((UINT8)2) -#define LEN_OC_SWITCH ((UINT8)8) +#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) @@ -171,7 +172,7 @@ /*非进路调车继电器表*/ #define OC_RELAY_NO_ROUTE_ID ((UINT8)20) -#define OC_LEN_RELAY_NO_ROUTE ((UINT8)10) +#define OC_LEN_RELAY_NO_ROUTE ((UINT8)12) /*车库门继电器表*/ #define OC_RELAY_GARAGE_DOOR_ID ((UINT8)21) @@ -340,6 +341,7 @@ typedef struct S_Relay_NoRouteDcStruct UINT16 wRelayTongYiScId; /*同意试车继电器ID*/ UINT16 wRelayDrvShiCheShengQingId; /* 试车线驱动的申请试车继电器ID */ UINT16 wRelayColTongYiScId; /* 试车线同意试车继电器ID */ + UINT16 wWaysideTryTrainIndRelayId; /* 轨旁试车指示器继电器ID */ } Relay_NoRouteDcStruct; /*照查继电器结构体*/ @@ -437,9 +439,11 @@ typedef struct S_Relay_WashMachineStruct UINT16 TrainEmergencyStopRelayId; /*全自动列车紧急停车继电器(配置字段:采集继电器)*/ UINT16 HeadWashAllowRelayId; /*全自动允许车头清洗继电器(配置字段:采集继电器)*/ UINT16 TailWashAllowRelayId; /*全自动允许车尾清洗继电器(配置字段:采集继电器)*/ + UINT16 wCouplingWashAllowRelayId; /*全自动允许联挂段清洗继电器(配置字段:采集继电器)*/ UINT16 WashTrainRequestRelayId; /*全自动洗车请求继电器(配置字段:驱动继电器)*/ UINT16 TrainHeadStopSteadyRelayId; /*全自动车头停稳继电器(配置字段:驱动继电器)*/ UINT16 TrainTailStopSteadyRelayId; /*全自动车尾停稳继电器(配置字段:驱动继电器)*/ + UINT16 wCoupingStopSteadyRelayId; /*全自动车尾停稳继电器(配置字段:驱动继电器)*/ UINT16 TrainPassRequestRelayId; /*全自动通过请求继电器(配置字段:驱动继电器)*/ UINT16 TrainOutWashPortAllowRelayId; /*全自动允许列车出库继电器(配置字段:采集继电器)*/ UINT16 PauseTrainWashRequestRelayId; /*全自动暂停洗车继电器(配置字段:驱动继电器)*/ diff --git a/TSCP/src/APP/ciapp/RemoteRM/RRMDataPrepare.c b/TSCP/src/APP/ciapp/RemoteRM/RRMDataPrepare.c index daae5b1..22f9bb8 100644 --- a/TSCP/src/APP/ciapp/RemoteRM/RRMDataPrepare.c +++ b/TSCP/src/APP/ciapp/RemoteRM/RRMDataPrepare.c @@ -900,6 +900,7 @@ UINT8 rrm_PrepareSwitchStatOfAC(UINT16 acID) UINT8 cycleESB = 0u; UINT8 chLinkNum = 0u; UINT8 ESBStatus = ESB_STATE_VALID_YES; + UINT8 chEsbCutState = 0U; /*ESB旁路状态*/ const UINT16 *pLinkIdBuf = NULL; const DSU_DEVICE_IN_LINK_STRU* pTempDeviceStru = NULL; @@ -932,14 +933,22 @@ UINT8 rrm_PrepareSwitchStatOfAC(UINT16 acID) for (cycleESB = 0u;cycleESB < pTempDeviceStru->struESBDev.wDevCount;cycleESB++) { ESBStatus = GetEsbState(pTempDeviceStru->struESBDev.wDevSetId[cycleESB]); + chEsbCutState = GetEsbCutState(pTempDeviceStru->struESBDev.wDevSetId[cycleESB]); - if (ESB_STATE_VALID_NO == ESBStatus) + if (ESB_CUT_YES == chEsbCutState) { - /** ESB未按下,继续遍历*/ + /* ESB旁路,认为按钮未按下*/ } else { - break; + if (ESB_STATE_VALID_NO == ESBStatus) + { + /** ESB未按下,继续遍历*/ + } + else + { + break; + } } } @@ -986,6 +995,7 @@ UINT8 rrm_PrepareSwitchStatOfAC(UINT16 acID) UINT8 PSDStatus = PSD_STATE_OPEN; const UINT16 *pLinkIdBuf = NULL; const DSU_DEVICE_IN_LINK_STRU* pTempDeviceStru = NULL; + UINT8 chPsdMutualLockStat = 0U; /*PSD互锁解除状态*/ chLinkNum = GetAxisLinkSum(acID); pLinkIdBuf = GetAxisLinkIdBuf(acID); @@ -1016,15 +1026,23 @@ UINT8 rrm_PrepareSwitchStatOfAC(UINT16 acID) for (cyclePSD = 0u;cyclePSD < pTempDeviceStru->struScreenDev.wDevCount;cyclePSD++) { PSDStatus = GetPsdState(pTempDeviceStru->struScreenDev.wDevSetId[cyclePSD]); + chPsdMutualLockStat = GetPsdMutualLockRemoveState(pTempDeviceStru->struScreenDev.wDevSetId[cyclePSD]); - if (PSD_STATE_CLOSE == PSDStatus) + if (PSD_MUTUALLOCK_REMOVE_YES == chPsdMutualLockStat) { - /** 屏蔽门关闭,继续遍历*/ + /*互锁解除认为PSD状态正常,继续检查*/ } else { - break; - } + if (PSD_STATE_CLOSE == PSDStatus) + { + /** 屏蔽门关闭,继续遍历*/ + } + else + { + break; + } + } } if (cyclePSD != pTempDeviceStru->struScreenDev.wDevCount) @@ -1182,20 +1200,13 @@ UINT8 rrm_PrepareSwitchStatOfAC(UINT16 acID) */ void rrm_SetRRMResult(UINT16 trainID,UINT8 rrmReply,UINT8 rrmReason,UINT8 nextOCId) { - UINT16 wRcIdWithType = 0U; - if (RC_WORK_MODE_CI == CI_SYSTEM_TYPE_RCI) - { - wRcIdWithType = 0x3C00U; - } - else - { - wRcIdWithType = 0x3D00U; - } + UINT16 wRcIdWithType = 0x3D00U; + wRcIdWithType |= (UINT16)nextOCId; SetTrainRrmState(trainID,rrmReply); SetTrainRrmReson(trainID,rrmReason); - SetTrainNextTioc(trainID, wRcIdWithType); /*设置下一控区ID需带0x3c,否则给IVOC组包时无法获取互联互通ID*/ + SetTrainNextTioc(trainID, wRcIdWithType); } /** diff --git a/TSCP/src/APP/ciapp/Route/RouteConfigDataManage.c b/TSCP/src/APP/ciapp/Route/RouteConfigDataManage.c index 792dbfa..f278152 100644 --- a/TSCP/src/APP/ciapp/Route/RouteConfigDataManage.c +++ b/TSCP/src/APP/ciapp/Route/RouteConfigDataManage.c @@ -3699,5 +3699,31 @@ UINT8 GetPhySecInRoutePosIndex(const UINT16 routeId, const UINT16 phySectionId) retVal = ROUTE_PHYSICALSECTION_SUM_MAX; /*返回失败*/ } + return retVal; +} + + +/* +* 功能描述: 获取指定ID进路配置方向 +* 参数说明: const UINT16 routeId, 进路ID +* 返回值 :0x55 与Link方向一致 +* 0xAA 与Link方向相反 +** by LYJ 20260330 +*/ +UINT8 GetRouteConfigDirection(const UINT16 routeId) +{ + UINT16 bufIndex = 0U; /*数组下标*/ + UINT8 retVal = CI_ERROR; + + bufIndex = GetRouteConfigBufIndex(routeId); /*获取进路数组下标*/ + + if (ROUTE_SUM_MAX > bufIndex) + { + retVal = RouteConfigDataStru[bufIndex].chRouteConfigDirection; + } + else + { + retVal = CI_ERROR; + } return retVal; } \ 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 dc3daaa..76ee4e4 100644 --- a/TSCP/src/APP/ciapp/Route/RouteConfigDataManage.h +++ b/TSCP/src/APP/ciapp/Route/RouteConfigDataManage.h @@ -188,7 +188,8 @@ typedef struct S_RouteConfigDataStruct UINT16 RouteId; /*进路ID (配置字段)*/ UINT8 BelongCiId; /*所属联锁ID (配置字段)*/ UINT8 BelongVirCIid; /*所属虚拟联锁ID*/ - UINT8 RouteDirection; /*进路方向(向左/向右) (配置字段)*/ + UINT8 RouteDirection; /*进路方向(向左/向右) (配置字段叠系统定义逻辑方向与上下行方向的关系计算的上下行)*/ + UINT8 chRouteConfigDirection; /*进路方向(向左/向右) (纯配置字段0x55 与Link方向一致 0xAA 与Link方向相反)*/ UINT8 RouteType; /*进路类型(列车进路/折返进路/调车进路) (配置字段)*/ UINT8 ConfigRouteType; /*配置进路类型(列车进路/折返进路/调车进路) (配置字段)*/ UINT8 LeadProperty; /*进路引导属性(不可引导/可引导) (配置字段)*/ @@ -1418,6 +1419,14 @@ UINT8 GetRouteThisPortecSwitchPos(const UINT16 wRouteId, const UINT16 wSwitchId) * 其它 位置所有 */ UINT8 GetPhySecInRoutePosIndex(const UINT16 routeId, const UINT16 phySectionId); +/* +* 功能描述: 获取指定ID进路配置方向 +* 参数说明: const UINT16 routeId, 进路ID +* 返回值 :0x55 与Link方向一致 +* 0xAA 与Link方向相反 +** by LYJ 20260330 +*/ +UINT8 GetRouteConfigDirection(const UINT16 routeId); #ifdef __cplusplus } diff --git a/TSCP/src/APP/ciapp/Route/RouteDataManage.h b/TSCP/src/APP/ciapp/Route/RouteDataManage.h index 6e477a9..4db2edf 100644 --- a/TSCP/src/APP/ciapp/Route/RouteDataManage.h +++ b/TSCP/src/APP/ciapp/Route/RouteDataManage.h @@ -72,7 +72,7 @@ typedef struct S_RouteDataStruct UINT8 RouteAssoSwitSingOperStat; /*进路带动道岔单操状态*/ UINT8 RouteInnerSwitDrivState; /*进路内道岔驱动状态*/ UINT8 RouteAssocSwitDrivState; /*进路带动道岔驱动状态*/ - UINT8 RouteStateFlag; /*进路状态标志(1:表示有效;0:表示无效)*/ + UINT8 RouteStateFlag; /*进路状态标志(0x55:表示有效;0xAA:表示无效)*/ UINT8 TrainEnterFlag; /*列车驶入标志*/ UINT8 ZongRenJieDelayType; /*总人解延时类型,分为:倒计时结束后立刻全部区段解锁,第一个占压的物理区段前变异常锁闭,所有的物理区段变异常锁闭*/ UINT8 RecoverOpenState; /*进路需要重开状态,用于处理PSD、SPKS、扣车恢复重开信号*/ diff --git a/TSCP/src/APP/ciapp/Section/AxisSectionConfigDataManage.c b/TSCP/src/APP/ciapp/Section/AxisSectionConfigDataManage.c index cbf9f51..7763775 100644 --- a/TSCP/src/APP/ciapp/Section/AxisSectionConfigDataManage.c +++ b/TSCP/src/APP/ciapp/Section/AxisSectionConfigDataManage.c @@ -17,7 +17,7 @@ AxisSectionConfigDataStruct AxisSectionConfigDataStru[AXIS_SECTION_SUM_MAX]; /*定义计轴区段配置数据结构体,cgh-合并CID-2539-1:此处声明不进行初始化,统一放到InitAllStaticDataStr函数中进行初始化,为解决生成内核过大得问题*/ UINT16 LocalCiAxisSectionIdBuf[AXIS_SECTION_SUM_MAX] = {0u}; /*定义本地联锁计轴区段ID映射数组*/ -INT16 AxisSectionCurSum = 0; /*逻辑区段当前总数*/ +INT16 AxisSectionCurSum = 0; /*计轴区段当前总数*/ UINT16 totalAxisNum = 0u; /*本联锁+相邻联锁的计轴区段ID数量*/ /* @@ -1150,4 +1150,56 @@ UINT8 GetAxisSecCbtcProperty(const UINT16 axisSectionId) } return retVal; -} \ No newline at end of file +} + +/* +* 功能描述: 获取指定ID计轴区段关联防护道岔数目 +* 参数说明: const UINT16 wLogicSecId, 计轴区段ID +* 返回值 : 0: 获取数据失败 +* >0: 道岔数目 +* 创建 : mpt 20260331 +*/ +UINT8 GetAxisSecRelateProSwSum(const UINT16 wAxisSecId) +{ + UINT16 wBufIndex = 0u; /*数组下标*/ + UINT8 retVal = CI_ERROR; + + wBufIndex = GetAxisSecConfigBufIndex(wAxisSecId); /*获取计轴区段数组下标*/ + + if (AXIS_SECTION_SUM_MAX > wBufIndex) + { + retVal = AxisSectionConfigDataStru[wBufIndex].chRelateProSwSum; + } + else + { + retVal = CI_ERROR; + } + return retVal; +} + + +/* +* 功能描述: 获取指定ID计轴区段关联防护道岔结构体 +* 参数说明: const UINT16 wLogicSecId, 计轴区段ID +* 返回值 : NULL: 获取数据失败 +* 非NULL: 道岔ID数组指针 +* 创建 : mpt 20260331 +*/ +AxisSwitchStruct* GetAxisSecRelateProSwStru(const UINT16 wAxisSecId) +{ + UINT16 wBufIndex = 0u; /*数组下标*/ + AxisSwitchStruct* retVal = NULL; + + wBufIndex = GetAxisSecConfigBufIndex(wAxisSecId); /*获取数组下标*/ + + if (AXIS_SECTION_SUM_MAX > wBufIndex) + { + retVal = AxisSectionConfigDataStru[wBufIndex].wRelateProSwId; + } + else + { + retVal = NULL; + } + return retVal; +} + diff --git a/TSCP/src/APP/ciapp/Section/AxisSectionConfigDataManage.h b/TSCP/src/APP/ciapp/Section/AxisSectionConfigDataManage.h index 7511d5e..33fba62 100644 --- a/TSCP/src/APP/ciapp/Section/AxisSectionConfigDataManage.h +++ b/TSCP/src/APP/ciapp/Section/AxisSectionConfigDataManage.h @@ -53,6 +53,8 @@ typedef struct S_AxisSectionConfigDataStruct UINT8 chAxisLinXian; /*计轴临线属性-是否为本线路-电子地图Link表获得*/ UINT32 dwAxisTotalLen; /*计轴关联link总长*/ UINT8 cAcCbtcAttr; /*计轴区段CBTC区域属性:0x55-具有CBTC区域属性,0xaa-不具有CBTC区域属性*/ + UINT8 chRelateProSwSum; /* add by mpt 20260331 计轴区段关联防护道岔数量*/ + AxisSwitchStruct wRelateProSwId[AXIS_RELATE_PRO_SW_SUM_MAX];/* add by mpt 20260331 计轴区段关联防护道岔ID数组*/ } AxisSectionConfigDataStruct; extern AxisSectionConfigDataStruct AxisSectionConfigDataStru[AXIS_SECTION_SUM_MAX]; /*定义计轴区段配置数据结构体,cgh-合并CID-2539-1:此处声明不进行初始化,统一放到InitAllStaticDataStr函数中进行初始化,为解决生成内核过大得问题*/ @@ -320,6 +322,22 @@ UINT8 GetAxisSecBorderProperty(const UINT16 axisSectionId); * Created By LQ 2025.08.05 */ UINT8 GetAxisSecCbtcProperty(const UINT16 axisSectionId); +/* +* 功能描述: 获取指定ID计轴区段关联防护道岔数目 +* 参数说明: const UINT16 wLogicSecId, 计轴区段ID +* 返回值 : 0: 获取数据失败 +* >0: 道岔数目 +* 创建 : mpt 20260331 +*/ +UINT8 GetAxisSecRelateProSwSum(const UINT16 wAxisSecId); +/* +* 功能描述: 获取指定ID计轴区段关联防护道岔结构体 +* 参数说明: const UINT16 wLogicSecId, 计轴区段ID +* 返回值 : NULL: 获取数据失败 +* 非NULL: 道岔ID数组指针 +* 创建 : mpt 20260331 +*/ +AxisSwitchStruct* GetAxisSecRelateProSwStru(const UINT16 wAxisSecId); #ifdef __cplusplus } diff --git a/TSCP/src/APP/ciapp/Section/AxisSectionDataManage.c b/TSCP/src/APP/ciapp/Section/AxisSectionDataManage.c index 5cbca15..b732dba 100644 --- a/TSCP/src/APP/ciapp/Section/AxisSectionDataManage.c +++ b/TSCP/src/APP/ciapp/Section/AxisSectionDataManage.c @@ -854,4 +854,49 @@ void SetAxisSecArbStateCC(const UINT16 axisSectionId, const UINT8 arbState) { ; /*不设置*/ } +} + +/* +* 功能描述:计轴区段状态处理 +* 参数说明:void +* 返 回 值:无 +* by cgh 20260327 +*/ +void AxisSecStateDeal(void) +{ + UINT8 cLocalCiId = 0U; /*本地联锁ID*/ + UINT16 ii = 0U; + UINT16 wAxisSecSum = 0U; /*本控区计轴区段数量*/ + UINT16 wAxisSecId = 0U; /*计轴区段ID*/ + UINT8 cAxisSecBlongCiId = 0U; /*计轴区段所属控区*/ + UINT8 chAcArbState = 0U; /*计轴区段ARB状态*/ + + cLocalCiId = GetSystemParaLocalCiId(); + wAxisSecSum = GetAxisSecCurSum(); + /*遍历本控区计轴区段*/ + for (ii = 0U; ii < wAxisSecSum; ii++) + { + wAxisSecId = GetAxisSecId(ii); + cAxisSecBlongCiId = GetAxisSectionBelongCiId(wAxisSecId); + + if ((cLocalCiId == cAxisSecBlongCiId) && (0U != cAxisSecBlongCiId)) + { + chAcArbState = aam_GetAxisStatusAPI(wAxisSecId); + /* 计轴区段ARB,则逻辑区段ARB */ + if (AAM_STATUS_ARB == chAcArbState) + { + /*设置RC计轴区段ARB状态为ARB*/ + SetAxisSecArbStateCC(wAxisSecId, AXIS_SECTION_ARB_YES); + } + else + { + /*设置RC计轴区段ARB状态为未ARB*/ + SetAxisSecArbStateCC(wAxisSecId, AXIS_SECTION_ARB_NO); + } + } + else + { + ; /*不属于本控区,只是异常防护*/ + } + } } \ No newline at end of file diff --git a/TSCP/src/APP/ciapp/Section/AxisSectionDataManage.h b/TSCP/src/APP/ciapp/Section/AxisSectionDataManage.h index 8945181..8c5eaa7 100644 --- a/TSCP/src/APP/ciapp/Section/AxisSectionDataManage.h +++ b/TSCP/src/APP/ciapp/Section/AxisSectionDataManage.h @@ -288,6 +288,14 @@ UINT8 GetAxisSecArbStateCC(const UINT16 axisSectionId); */ void SetAxisSecArbStateCC(const UINT16 axisSectionId, const UINT8 arbState); +/* +* 功能描述:计轴区段状态处理 +* 参数说明:void +* 返 回 值:无 +* by cgh 20260327 +*/ +void AxisSecStateDeal(void); + #ifdef __cplusplus } #endif diff --git a/TSCP/src/APP/ciapp/Section/LogicSectionConfigDataManage.h b/TSCP/src/APP/ciapp/Section/LogicSectionConfigDataManage.h index 094e152..c29a73e 100644 --- a/TSCP/src/APP/ciapp/Section/LogicSectionConfigDataManage.h +++ b/TSCP/src/APP/ciapp/Section/LogicSectionConfigDataManage.h @@ -89,6 +89,9 @@ typedef struct S_LogicSectionConfigDataStruct UINT16 logSecRltPsdBuf[LOGSEC_RELATE_PSD_MAX]; /*逻辑区段关联屏蔽门ID数组*/ UINT8 logSecRltEsbSum; /*关联紧急按钮数量*/ UINT16 logSecRltEsbBuf[LOGSEC_RELATE_ESB_MAX]; /*逻辑区段关联紧急按钮ID数组*/ + + UINT8 chRelateOverLapSum; /* add by mpt 20260330 逻辑区段关联保护区段数量*/ + UINT16 wRelateOverLapIdBuf[LOGSEC_RELATE_OVERLAP_SUM_MAX];/* add by mpt 20260330 逻辑区段关联保护区段ID数组*/ } LogicSectionConfigDataStruct; /*******************************全局变量声明*******************************/ diff --git a/TSCP/src/APP/ciapp/Section/LogicSectionDataManage.c b/TSCP/src/APP/ciapp/Section/LogicSectionDataManage.c index 4264328..7a1b4f1 100644 --- a/TSCP/src/APP/ciapp/Section/LogicSectionDataManage.c +++ b/TSCP/src/APP/ciapp/Section/LogicSectionDataManage.c @@ -1099,7 +1099,6 @@ void RemoveLogSecTrainInfoById(const UINT16 wLogSectionId, const UINT16 wTrnId) UINT8 chTrainSum = 0U; UINT8 ii = 0U; UINT8 chNeedKeepSum = 0U; - LogicTrainResStruct * pLogicTrainInfo = NULL; wBufIndex = GetlogSectionBufIndex(wLogSectionId); /*获取区段数组下标*/ @@ -1406,7 +1405,7 @@ void AddLogSecTrainResFromCI(const UINT16 wLogSectionId, const UINT16 wTrnId) if (TRANSMIT_STATE_GOOD == trainTransSta) { - trainInRoutePos = dsuTrainMinHeadCrossSignal(wTrnId, wRLockBelongRouteId); + trainInRoutePos = dsuTrainMinHeadCrossSignal(wTrnId, wRLockBelongRouteId, CI_ERROR); if ((ROUTE_AUTOROUTE_NORMAL == autoRouteType) || (ROUTE_AUTOROUTE_NORMAL == autoProtRouteType) || (ROUTE_AUTOSIGROUTE_YES == (ROUTE_AUTOSIGROUTE_YES & autoSigRouteType)) @@ -1589,7 +1588,6 @@ void ClearLgcSecResTrain(UINT16 wLogSecId) UINT8 chTrainResSum = 0U; UINT16 wBufIndex = 0U; UINT8 ii = 0U; - UINT8 logRouteSum = 0; UINT16 wTrainId = 0U; /*列车ID*/ UINT16 chFlag = 0U; UINT8 chNeedKeepSum = 0U; @@ -1620,7 +1618,7 @@ void ClearLgcSecResTrain(UINT16 wLogSecId) /*清0防脏*/ for (ii = chNeedKeepSum; ii < LOGIC_SECTION_RES_SUM_MAX; ii++) { - (void)ComMemSet(&(LogicSectionDataStruCC[wBufIndex].szTrainResData[ii]), (UINT16)sizeof(LogicTrainResStruct), 0U); + (void)ComMemSet((UINT8*)&(LogicSectionDataStruCC[wBufIndex].szTrainResData[ii]), (UINT16)sizeof(LogicTrainResStruct), 0U); } LogicSectionDataStruCC[wBufIndex].chTrainInfoSum = chNeedKeepSum; } @@ -1647,7 +1645,7 @@ void CpyLgcSecResTrain(UINT16 wLogSecId,UINT8 chTrainSum, LogicTrainResStruct *p } else { - (void)ComMemCopy(pstLgcResInfo, (LogicSectionDataStruCC[wBufIndex].szTrainResData), (UINT16)(sizeof(LogicTrainResStruct)*LOGIC_SECTION_RES_SUM_MAX)); + (void)ComMemCopy((UINT8*)pstLgcResInfo, (UINT8*)(LogicSectionDataStruCC[wBufIndex].szTrainResData), (UINT16)(sizeof(LogicTrainResStruct)*LOGIC_SECTION_RES_SUM_MAX)); LogicSectionDataStruCC[wBufIndex].chTrainInfoSum = chTrainSum; } } @@ -1774,7 +1772,7 @@ void SetLogSecTrainLockApply(const UINT16 wLogSectionId, const UINT16 wTrnId) } else { - trainInRoutePos = dsuTrainMinHeadCrossSignal(wTrnId, wRLockBelongRouteId); + trainInRoutePos = dsuTrainMinHeadCrossSignal(wTrnId, wRLockBelongRouteId, CI_ERROR); if ((TRAIN_ENTER_ROUTE_FULL == trainInRoutePos) || (TRAIN_ENTER_ROUTE_TAIL == trainInRoutePos)) { ; /*不处理 V12.0.2变更2*/ @@ -1900,17 +1898,10 @@ UINT8 GetLgcSecResCanAdd(const UINT16 wLogSectionId,const UINT16 wTrnId) UINT16 wBufIndex = 0u; /*数组下标*/ UINT16 wRLockBelongRouteId = 0U; UINT16 wRLockStartSignalId = 0U; - UINT16 wPLockStartSignalId = 0U; - UINT16 wPLockEndSignalId = 0U; UINT16 wRLockLightUpTrainId = 0U; - UINT16 wPLockLightUpTrainId = 0U; - UINT16 wRouteLockOverLapId = 0U; - UINT8 chOverLapBelongCiId = 0U; - UINT8 chTrainCrossPLockStt = 0U; UINT8 chTrainCrossRLockStt = 0U; UINT8 cRouteCId = 0u; UINT8 cLocalCiId = 0u; - UINT8 chLgcResShareFlag = 0U; UINT8 autoRouteType = 0U; UINT8 autoSigRouteType = 0U; UINT8 autoProtRouteType = 0U; @@ -2983,7 +2974,7 @@ UINT8 GetBackUpVobcMinTsr(UINT16* minSpeed, UINT16 logSum, UINT16 szLogId[]) { if (pTsrData[jj].cSpeed < *minSpeed) { - for (mm == 0U; mm < pTsrData[jj].cLogSecSum; mm++) + for (mm = 0U; mm < pTsrData[jj].cLogSecSum; mm++) { for (kk = 0U; kk < logSum; kk++) { @@ -3037,7 +3028,7 @@ void SetTsrSum(UINT8 cTsrSum) */ TsrDataStruct* GetTsrData(void) { - return &g_TsrDataStru; + return g_TsrDataStru; } /* @@ -3790,6 +3781,9 @@ void LogJumpLockCmdManage(const UINT16 logSectionId, const UINT8 jumpLockState) { UINT16 bufIndex = 0u; /*数组下标*/ UINT8 checkResult = CI_ERROR; + UINT16 devId = 0u; /*设备ID*/ + UINT8 devState = 0u; /*设备状态*/ + UINT8 retVal = 0u; /** 获取逻辑区段数组下标*/ bufIndex = GetlogSectionBufIndex(logSectionId); @@ -3811,9 +3805,20 @@ void LogJumpLockCmdManage(const UINT16 logSectionId, const UINT8 jumpLockState) else { /** 设置跳跃锁闭允许标志为允许 */ - SetLogSecJumpLockPermFlag(logSectionId, LOGIC_JUMPUNLOCK_PERMISSIVE_YES); + /** 设置逻辑区段跳跃锁闭 */ SetLogSecJumpLockState(logSectionId, LOGIC_SECTION_JUMP_LOCK_YES); + + SetLogSecRelProSwitchLockSta(logSectionId, SWITCH_LOCK_PROTECT_SET); + + devId = 0u; + devState = 0u; + retVal = LogicSecRltvPrtctSwLockCheck(logSectionId, &devId, &devState); + if (CI_SUCCESS == retVal) + { + SetLogSecJumpLockPermFlag(logSectionId, LOGIC_JUMPUNLOCK_PERMISSIVE_YES); + } + } } /** 逻辑区段跳跃锁闭未锁闭*/ @@ -3823,6 +3828,8 @@ void LogJumpLockCmdManage(const UINT16 logSectionId, const UINT8 jumpLockState) SetLogSecJumpLockPermFlag(logSectionId, LOGIC_JUMPUNLOCK_PERMISSIVE_NO); /** 设置跳跃锁闭未锁闭 */ SetLogSecJumpLockState(logSectionId, LOGIC_SECTION_JUMP_LOCK_NO); + + SetLogSecRelProSwitchLockSta(logSectionId, SWITCH_LOCK_PROTECT_CANCEL); } else { @@ -4283,7 +4290,7 @@ UINT8 GetLgcArbState(const UINT16 wLgcId) } /* -* 功能描述: 设置制定逻辑区段ARB状态 +* 功能描述: 设置指定逻辑区段ARB状态 * 参数说明: const UINT16 wLgcId, 逻辑区段ID * const UINT8 chArb ARB状态 * 返回值 : 无 @@ -4384,6 +4391,7 @@ void SetLgcArbStateProc(void) } } } + /* * 功能描述: 获取指定逻辑区段延时故障锁闭起始周期号 * 参数说明: const UINT16 logSectionId, 逻辑区段ID @@ -4460,7 +4468,6 @@ UINT8 GetLogicSupicTrainStat(UINT16 wLgcId) UINT8 chIndex = 0u; UINT8 chRtn = CI_ERROR; TRAIN_SEQUANCE_s strTmp[SIZE_MAX_TRAINOFAC] = { 0u }; - TRAIN_SEQUANCE_s strTmpB = { 0u }; UINT8 chTrainNum = 0u; chLinkNum = GetSecIntrudeLinkSum(wLgcId); pLinkId = GetSecIntrudeLinkIdBuf(wLgcId); @@ -4853,7 +4860,7 @@ UINT8 DelLogSecBelongLogRouteId(const UINT16 logSectionId, const UINT16 wLogRout } } /* 清0防止脏数据*/ - (void)ComMemSet(&logRoutBuf[chNeedKeepSum], (UINT16)sizeof(LogSecLockBelLogRouteStruct), 0U); + (void)ComMemSet((UINT8*)&logRoutBuf[chNeedKeepSum], (UINT16)sizeof(LogSecLockBelLogRouteStruct), 0U); LogicSectionDataStruCC[bufIndex].chLogSecLockBelLogRouteSum = chNeedKeepSum;/*修改所属逻辑进路数量*/ retVal = CI_SUCCESS; } @@ -4883,8 +4890,6 @@ UINT8 AddLogSecBelongLogRouteId(const UINT16 logSectionId, const UINT16 wLogRout LogSecLockBelLogRouteStruct* logRoutBuf = NULL; /*逻辑区段所属逻辑进路数组*/ UINT16 logRoutSum = 0U; /*逻辑区段所属逻辑进路数组数量*/ UINT8 retVal = CI_ERROR; - UINT8 ii = 0U; - UINT8 chNeedKeepSum = 0U; bufIndex = GetlogSectionBufIndex(logSectionId); /*获取区段数组下标*/ @@ -5647,7 +5652,6 @@ UINT8 GetLogSecLockBelLogRouteBuf(const UINT16 wLgcId,OUT LogSecLockBelLogRouteS void SetLogSecLockStateHlht(UINT16 wLogSectionId, const UINT8 lockState) { UINT16 bufIndex = 0u; /*数组下标*/ - UINT8 preLockState = 0u; bufIndex = GetlogSectionBufIndex(wLogSectionId); /*获取区段数组下标*/ @@ -5756,11 +5760,10 @@ void SetLogSecPLockRouteIdHlht(UINT16 wLogSectionId, const UINT16 routeId) /* * 功能描述:设置互联互通其它联锁逻辑区段锁闭所属的进路ID * 参数说明:UINT16 wLogSectionId, 逻辑区段ID - const UINT16 routeId,锁闭所属的进路ID * 返回值 :无 * by 20250117 */ -void SetLogSecRLockRouteIdHlht(UINT16 wLogSectionId, const UINT16 routeId) +void SetLogSecRLockRouteIdHlht(UINT16 wLogSectionId) { UINT16 bufIndex = 0u; /*数组下标*/ @@ -6396,4 +6399,218 @@ UINT8 ReqAlignmentInfoCalc(void) } return chRetVal; +} + +/* +* 功能描述: 获取给ATS的逻辑区段ARB状态 +* 参数说明: const UINT16 wLgcId 逻辑区段状态 +* const UINT8 chDevType 设备类型 +* 返回值 : LGC_SECTION_ARB_NO 逻辑区段未ARB +* LGC_SECTION_ARB_YES 逻辑区段ARB +* by cgh 20260327 +*/ +UINT8 GetToAtsLgcArbState(const UINT16 wLgcId,const UINT8 chDevType) +{ + UINT8 chReval = LGC_SECTION_ARB_NO; + UINT8 chAcNum = 0U; /*逻辑区段对应计轴区段数目*/ + UINT16* pAcId = NULL; /*逻辑区段关联计轴区段ID*/ + UINT8 chAcIndex = 0U; /*计轴区段循环索引*/ + UINT8 chAcArbState = 0U; /*计轴区段ARB状态*/ + + chAcNum = GetLgcSecRelativeAxleSecSum(wLgcId); + pAcId = GetLgcSecRltvAxleSecIdBuf(wLgcId); + + /*逻辑区段关联计轴区段数据合法*/ + if ((0U != chAcNum) && (NULL != pAcId) && ((RC_WORK_MODE_TIOC == chDevType) || (RC_WORK_MODE_CI == chDevType))) + { + /*遍历逻辑区段关联的所有计轴区段*/ + for (chAcIndex = 0U; chAcIndex < chAcNum; chAcIndex++) + { + /*当前系统工作模式为RC*/ + if (RC_WORK_MODE_TIOC == chDevType) + { + chAcArbState = GetAxisSecArbStateCC(pAcId[chAcIndex]); + } + /*当前系统工作模式为CI*/ + else + { + chAcArbState = GetAxisSecArbStateZc(pAcId[chAcIndex]); + } + + /* 计轴区段ARB,则逻辑区段ARB */ + if (AXIS_SECTION_ARB_YES == chAcArbState) + { + chReval = LGC_SECTION_ARB_YES; + /*找到逻辑区段关联的任意一个计轴区段ARB,则不再继续查找,认为逻辑区段ARB*/ + break; + } + else + { + /* 计轴区段非ARB,继续查找 */ + ; + } + } + } + else + { + /* 数据获取失败 */ + } + return chReval; +} + +/* +* 功能描述: 获取指定逻辑区段CBTC_ARB状态 +* 参数说明: const UINT16 wLgcId, 逻辑区段ID +* 返回值 : 0: 获取失败 +* >0: 逻辑区段CBTC_ARB状态 +* BY CGH 20260330 +*/ +UINT8 GetLogSecCbtcArbState(const UINT16 wLgcId) +{ + UINT16 bufIndex = LGC_SECTION_ARB_NO; /*数组下标*/ + UINT8 retVal = CI_ERROR; + + bufIndex = GetlogSectionBufIndex(wLgcId); /*获取区段数组下标*/ + + if (LOGIC_SECTION_SUM_MAX > bufIndex) + { + retVal = LogicSectionDataStru[bufIndex].chLogSecCbtcArbState; + } + else + { + ; + } + return retVal; +} + +/* +* 功能描述: 设置指定逻辑区段CBTC_ARB状态 +* 参数说明: const UINT16 wLgcId, 逻辑区段ID +* const UINT8 chArb ARB状态 +* 返回值 : 无 +* BY CGH 20260330 +*/ +void SetLogSecCbtcArbState(const UINT16 wLgcId, const UINT8 chArb) +{ + UINT16 bufIndex = 0U; /*数组下标*/ + + bufIndex = GetlogSectionBufIndex(wLgcId); /*获取区段数组下标*/ + + if ((LOGIC_SECTION_SUM_MAX > bufIndex) + && ((LGC_SECTION_ARB_NO == chArb) || (LGC_SECTION_ARB_YES == chArb))) + { + LogicSectionDataStru[bufIndex].chLogSecCbtcArbState = chArb; + } + else + { + ; + } +} + +/* +* 功能描述: 获取指定逻辑区段PB_TACS_ARB状态 +* 参数说明: const UINT16 wLgcId, 逻辑区段ID +* 返回值 : 0: 获取失败 +* >0: 逻辑区段PB_TACS_ARB状态 +* BY CGH 20260330 +*/ +UINT8 GetLogSecPbTacsArbState(const UINT16 wLgcId) +{ + UINT16 bufIndex = LGC_SECTION_ARB_NO; /*数组下标*/ + UINT8 retVal = CI_ERROR; + + bufIndex = GetlogSectionBufIndex(wLgcId); /*获取区段数组下标*/ + + if (LOGIC_SECTION_SUM_MAX > bufIndex) + { + retVal = LogicSectionDataStru[bufIndex].chLogSecPbTacsArbState; + } + else + { + ; + } + return retVal; +} + +/* +* 功能描述: 设置指定逻辑区段PB_TACS_ARB状态 +* 参数说明: const UINT16 wLgcId, 逻辑区段ID +* const UINT8 chArb ARB状态 +* 返回值 : 无 +* BY CGH 20260330 +*/ +void SetLogSecPbTacsArbState(const UINT16 wLgcId, const UINT8 chArb) +{ + UINT16 bufIndex = 0U; /*数组下标*/ + + bufIndex = GetlogSectionBufIndex(wLgcId); /*获取区段数组下标*/ + + if ((LOGIC_SECTION_SUM_MAX > bufIndex) + && ((LGC_SECTION_ARB_NO == chArb) || (LGC_SECTION_ARB_YES == chArb))) + { + LogicSectionDataStru[bufIndex].chLogSecPbTacsArbState = chArb; + } + else + { + ; + } +} + +/* +* 功能描述: 设置发送给ATS的逻辑区段ARB状态 +* 参数说明: 无 +* 返回值 : 无 +* by cgh 20260330 +*/ +void SetSendAtsLgcArbState(void) +{ + UINT8 chLocalId = 0U; /*本地联锁ID*/ + UINT8 chBelongCiId = 0U; /*所属联锁ID*/ + UINT16 wLgcNum = 0U; /*逻辑区段数目*/ + UINT16 wLgcIndex = 0U; /*逻辑区段索引ID*/ + UINT16 wLgcId = 0U; /*逻辑区段ID*/ + UINT8 chArbState = 0U; /*ARB状态*/ + + chLocalId = GetSystemParaLocalCiId(); + + /* 获取逻辑区段数量 */ + wLgcNum = GetLogicSecCurSum(); + + for (wLgcIndex = 0u; wLgcIndex < wLgcNum; wLgcIndex++) + { + wLgcId = GetLogicSecId(wLgcIndex); + chBelongCiId = GetLogSecBelongCiId(wLgcId); + + if ((chLocalId == chBelongCiId) && (0U != chBelongCiId)) + { + /*处理CBTC_ARB状态*/ + chArbState = GetToAtsLgcArbState(wLgcId, RC_WORK_MODE_CI); + + if (LGC_SECTION_ARB_YES == chArbState) + { + SetLogSecCbtcArbState(wLgcId, LGC_SECTION_ARB_YES); + } + else + { + SetLogSecCbtcArbState(wLgcId, LGC_SECTION_ARB_NO); + } + + /*处理PB_TACS_ARB状态*/ + chArbState = GetToAtsLgcArbState(wLgcId, RC_WORK_MODE_TIOC); + + if (LGC_SECTION_ARB_YES == chArbState) + { + SetLogSecPbTacsArbState(wLgcId, LGC_SECTION_ARB_YES); + } + else + { + SetLogSecPbTacsArbState(wLgcId, LGC_SECTION_ARB_NO); + } + + } + else + { + ; /* 数据获取失败 */ + } + } } \ No newline at end of file diff --git a/TSCP/src/APP/ciapp/Section/LogicSectionDataManage.h b/TSCP/src/APP/ciapp/Section/LogicSectionDataManage.h index 20c9870..4682b32 100644 --- a/TSCP/src/APP/ciapp/Section/LogicSectionDataManage.h +++ b/TSCP/src/APP/ciapp/Section/LogicSectionDataManage.h @@ -75,6 +75,8 @@ typedef struct S_LogicSectionDataStruct UINT8 chLogicSpksFLockState; /*逻辑区段被SPKS封锁状态 0x55 未封锁 0xaa 封锁*/ UINT8 chLogSecEmergXianSu; /*逻辑区段紧急临时限速*/ + UINT8 chLogSecCbtcArbState; /*逻辑区段CBTC_ARB状态*/ + UINT8 chLogSecPbTacsArbState; /*逻辑区段PB_TACS_ARB状态*/ } LogicSectionDataStruct; /*逻辑区段结构体-车车*/ @@ -1310,11 +1312,10 @@ void SetLogSecPLockRouteIdHlht(UINT16 wLogSectionId, const UINT16 routeId); /* * 功能描述:设置互联互通其它联锁逻辑区段锁闭所属的进路ID * 参数说明:UINT16 wLogSectionId, 逻辑区段ID - const UINT16 routeId,锁闭所属的进路ID * 返回值 :无 * by 20250117 */ -void SetLogSecRLockRouteIdHlht(UINT16 wLogSectionId, const UINT16 routeId); +void SetLogSecRLockRouteIdHlht(UINT16 wLogSectionId); /* * 功能描述: 设置逻辑区段关联的所有逻辑进路状态 @@ -1415,6 +1416,60 @@ void SetLogSecTXOccupyStateCC(const UINT16 logSectionId, const UINT8 curOccupySt */ UINT8 ReqAlignmentInfoCalc(void); +/* +* 功能描述: 获取给ATS的逻辑区段ARB状态 +* 参数说明: const UINT16 wLgcId 逻辑区段状态 +* const UINT8 chDevType 设备类型 +* 返回值 : LGC_SECTION_ARB_NO 逻辑区段未ARB +* LGC_SECTION_ARB_YES 逻辑区段ARB +* by cgh 20260327 +*/ +UINT8 GetToAtsLgcArbState(const UINT16 wLgcId, const UINT8 chDevType); + +/* +* 功能描述: 获取指定逻辑区段CBTC_ARB状态 +* 参数说明: const UINT16 wLgcId, 逻辑区段ID +* 返回值 : 0: 获取失败 +* >0: 逻辑区段CBTC_ARB状态 +* BY CGH 20260330 +*/ +UINT8 GetLogSecCbtcArbState(const UINT16 wLgcId); + +/* +* 功能描述: 设置指定逻辑区段CBTC_ARB状态 +* 参数说明: const UINT16 wLgcId, 逻辑区段ID +* const UINT8 chArb ARB状态 +* 返回值 : 无 +* BY CGH 20260330 +*/ +void SetLogSecCbtcArbState(const UINT16 wLgcId, const UINT8 chArb); + +/* +* 功能描述: 获取指定逻辑区段PB_TACS_ARB状态 +* 参数说明: const UINT16 wLgcId, 逻辑区段ID +* 返回值 : 0: 获取失败 +* >0: 逻辑区段PB_TACS_ARB状态 +* BY CGH 20260330 +*/ +UINT8 GetLogSecPbTacsArbState(const UINT16 wLgcId); + +/* +* 功能描述: 设置指定逻辑区段PB_TACS_ARB状态 +* 参数说明: const UINT16 wLgcId, 逻辑区段ID +* const UINT8 chArb ARB状态 +* 返回值 : 无 +* BY CGH 20260330 +*/ +void SetLogSecPbTacsArbState(const UINT16 wLgcId, const UINT8 chArb); + +/* +* 功能描述: 设置发送给ATS的逻辑区段ARB状态 +* 参数说明: 无 +* 返回值 : 无 +* by cgh 20260330 +*/ +void SetSendAtsLgcArbState(void); + #ifdef __cplusplus } #endif diff --git a/TSCP/src/APP/ciapp/Section/SectionDefine.h b/TSCP/src/APP/ciapp/Section/SectionDefine.h index c9b13bd..fc47938 100644 --- a/TSCP/src/APP/ciapp/Section/SectionDefine.h +++ b/TSCP/src/APP/ciapp/Section/SectionDefine.h @@ -26,7 +26,7 @@ #define PHYSICAL_INCLUDE_SWITCH_SUM_MAX ((UINT16)10) /*定义物理区段包含的道岔数量最大值*/ #define SEC_INVASECT_N_CONDSWIT_SUM_MAX ((UINT16)20) /*定义物理区段包含的侵限区段数量最大值*/ #define LOGSEC_INV_N_CONDSWIT_SUM_MAX ((UINT16)8) /*定义逻辑区段包含的侵限区段数量最大值*/ -#define LINK_SUM_MAX ((UINT16)1300) /*定义LINK数量最大值*//* add 2022.02.28 */ +#define LINK_SUM_MAX ((UINT16)1600) /*定义LINK数量最大值*//* add 2022.02.28 20260211增加置1600厦门3*/ #define LOGSEC_INCLUDE_AXIS_SUM_MAX ((UINT16)8) /*定义逻辑区段包含的计轴区段数量最大值*//* add 20220919 TIOC5.0*/ #define LOGSEC_INCLUDE_SWITCH_SUM_MAX ((UINT16)4) /*定义逻辑区段包含的道岔数量最大值*//* add 20220921 TIOC5.0*/ #define LOGSEC_LTRL_DFNC_SUM_MAX ((UINT16)8) /*定义逻辑区段侧防条件数量最大值*//* add 20220921 TIOC5.0*/ @@ -34,12 +34,14 @@ #define LOGSEC_NEXT_LOGSEC_SUM_MAX ((UINT16)16) /*定义逻辑区段相邻逻辑区段数量最大值*//* add 20230408 cgh*/ #define LOGSEC_RELATE_SIG_SUM_MAX ((UINT16)2) /*定义逻辑区段关联信号机数量最大值*//* add 20230504 cgh*/ #define LOGSEC_RELATE_ROUTE_SUM_MAX ((UINT16)200) /*定义逻辑区段关联进路数量最大值*//* add 20230504 cgh*/ -#define LOGSEC_RELATE_PRO_SW_SUM_MAX ((UINT16)8) /*定义逻辑区段关联防护道岔数量最大值*//* add 20230504 cgh*/ +#define LOGSEC_RELATE_PRO_SW_SUM_MAX ((UINT16)50) /*定义逻辑区段关联防护道岔数量最大值*//* add 20230504 cgh*/ #define LOGSEC_RELATE_CON_SW_SUM_MAX ((UINT16)4) /*定义逻辑区段关联联络线道岔数量最大值*//* add 20230504 cgh*/ #define PHYSEC_RELATE_ROUTE_SUM_MAX ((UINT16)24) /*定义物理区段关联进路数量最大值*//* add 20231113 lq*/ #define LOGSEC_RELATE_PSD_MAX ((UINT8)0X04U) /*定义逻辑区段关联屏蔽门数量最大值*//* add 20240410 fan*/ #define LOGSEC_RELATE_ESB_MAX ((UINT8)10U) /*定义逻辑区段关联紧急按钮数量最大值*//* add 20240410 fan*/ #define TRCAK_SECTION_SUM_MAX ((UINT16)5000) /*定义轨道区段数量最大值*/ +#define LOGSEC_RELATE_OVERLAP_SUM_MAX ((UINT16)200) /*定义逻辑区段关联保护区段数量最大值 add 20260330 mpt*/ +#define AXIS_RELATE_PRO_SW_SUM_MAX ((UINT16)100) /*定义计轴区段关联防护道岔数量最大值*/ #define QINXIAN_SWITCH_MAX_NUM ((UINT8)0X16U) /*定义侵限区段关联条件道岔的最大数量 add 20240607 LC */ diff --git a/TSCP/src/APP/ciapp/Signal/SignalDataManage.c b/TSCP/src/APP/ciapp/Signal/SignalDataManage.c index 8fad57a..6af206e 100644 --- a/TSCP/src/APP/ciapp/Signal/SignalDataManage.c +++ b/TSCP/src/APP/ciapp/Signal/SignalDataManage.c @@ -5646,9 +5646,9 @@ UINT32 GetDetainSndBtnPressCycNum(const UINT16 signalId) * 功能描述:获取指定ID信号机亮灭状态CC * 参数说明:const UINT16 signalId, 信号机ID * 返 回 值:0 获取数据失败 -* 0x55 未跨压 -* 0xaa 跨压 -* Created By LQ 2025.11.05 +* 0x55 灭灯 +* 0xaa 亮灯 +* EDIT By CGH 2026.02.01 */ UINT8 GetSignalLightExtinctStateCC(const UINT16 signalId) { @@ -5736,23 +5736,51 @@ UINT8 GetSignalCrossStateCC(const UINT16 signalId) return reVal; } +/* +* 功能描述:获取通信车跨压通过信号机 TACS主控列车ID +* 参数说明:const UINT16 signalId, 信号机ID +* 返 回 值:TACS主控列车ID +* Created By wyd 2026.3.27 +*/ +UINT8 GetSignalCrossTacsTrainIdCC(const UINT16 signalId) +{ + UINT16 bufIndex = 0U; /*数组下标*/ + UINT8 reVal = CI_ERROR; + + bufIndex = GetSignalConfigBufIndex(signalId); /*获取区段数组下标*/ + + if (SIGNAL_SUM_MAX > bufIndex) + { + reVal = SignalDataStruCC[bufIndex].wCrossTacsTrainId; + } + else + { + /*不处理*/ + } + return reVal; +} + /* * 功能描述:设置通信车跨压通过信号机状态CC * 参数说明:const UINT16 signalId, 信号机ID +* const UINT8 signalCrossState 信号机跨压状态 +* const UINT8 wTrainId 列车ID * 返 回 值:无 * Created By LQ 2025.11.05 */ -void SetSignalCrossStateCC(const UINT16 signalId, const UINT8 signalCrossState) +void SetSignalCrossStateCC(const UINT16 signalId, const UINT8 signalCrossState, const UINT8 wTrainId) { UINT16 bufIndex = 0U; /*数组下标*/ - bufIndex = GetSignalConfigBufIndex(signalId); /*获取道岔数组下标*/ + bufIndex = GetSignalConfigBufIndex(signalId); /*获取信号机数组下标*/ if (bufIndex < SIGNAL_SUM_MAX) { - if ((SIGNAL_CROSS_STATE_NO == signalCrossState) || (SIGNAL_CROSS_STATE_YES == signalCrossState)) + if (((SIGNAL_CROSS_STATE_NO == signalCrossState) || (SIGNAL_CROSS_STATE_YES == signalCrossState)) + && (TACS_CROSS_ID_MAX >= wTrainId)) { SignalDataStruCC[bufIndex].SignalCrossState = signalCrossState; /*设置通信车跨压通过信号机状态*/ + SignalDataStruCC[bufIndex].wCrossTacsTrainId = wTrainId; /*设置通信车跨压通过信号机列车ID*/ } else { diff --git a/TSCP/src/APP/ciapp/Signal/SignalDataManage.h b/TSCP/src/APP/ciapp/Signal/SignalDataManage.h index 35220c4..e426e20 100644 --- a/TSCP/src/APP/ciapp/Signal/SignalDataManage.h +++ b/TSCP/src/APP/ciapp/Signal/SignalDataManage.h @@ -111,6 +111,7 @@ typedef struct S_SignalDataStructCC UINT8 cSleepTrainLightUpFlag; /*休眠车点亮信号机标志:0x55 无效,0xAA 有效*/ UINT8 LightExtinctState; /*信号机亮灭状态CC(0x55:灭灯,0xaa:亮灯)*/ UINT8 SignalCrossState; /*通信车跨压通过信号机状态CC(0x55:未跨压,0xaa:跨压)*/ + UINT8 wCrossTacsTrainId; /*PB-TACS主控,通信车跨压通过信号机列车ID*/ }SignalDataStructCC; extern SignalDataStruct SignalDataStru[SIGNAL_SUM_MAX]; /*定义信号机数据结构体*/ @@ -1205,9 +1206,9 @@ UINT32 GetDetainSndBtnPressCycNum(const UINT16 signalId); * 功能描述:获取指定ID信号机亮灭状态CC * 参数说明:const UINT16 signalId, 信号机ID * 返 回 值:0 获取数据失败 -* 0x55 未跨压 -* 0xaa 跨压 -* Created By LQ 2025.11.05 +* 0x55 灭灯 +* 0xaa 亮灯 +* EDIT By CGH 2026.02.01 */ UINT8 GetSignalLightExtinctStateCC(const UINT16 signalId); @@ -1230,13 +1231,23 @@ void SetSignalLightExtinctStateCC(const UINT16 signalId, const UINT8 lightExtinc */ UINT8 GetSignalCrossStateCC(const UINT16 signalId); +/* +* 功能描述:获取通信车跨压通过信号机 TACS主控列车ID +* 参数说明:const UINT16 signalId, 信号机ID +* 返 回 值:TACS主控列车ID +* Created By wyd 2026.3.27 +*/ +UINT8 GetSignalCrossTacsTrainIdCC(const UINT16 signalId); + /* * 功能描述:设置通信车跨压通过信号机状态CC * 参数说明:const UINT16 signalId, 信号机ID +* const UINT8 signalCrossState 信号机跨压状态 +* const UINT8 wTrainId 列车ID * 返 回 值:无 * Created By LQ 2025.11.05 */ -void SetSignalCrossStateCC(const UINT16 signalId, const UINT8 signalCrossState); +void SetSignalCrossStateCC(const UINT16 signalId, const UINT8 signalCrossState, const UINT8 wTrainId); #ifdef __cplusplus } diff --git a/TSCP/src/APP/ciapp/Switch/SwitchConfigDataManage.c b/TSCP/src/APP/ciapp/Switch/SwitchConfigDataManage.c index 3d4f925..b8e9a87 100644 --- a/TSCP/src/APP/ciapp/Switch/SwitchConfigDataManage.c +++ b/TSCP/src/APP/ciapp/Switch/SwitchConfigDataManage.c @@ -1467,4 +1467,262 @@ UINT16 GetSwitchIbpDrvRelayId(const UINT16 switchId) retVal = CI_ERROR; } return retVal; -} \ No newline at end of file +} + +/* +* 功能描述: 获取指定道岔所属OC数 +* 参数说明: const UINT16 switchId, 道岔ID +* 返回值 :0 返回错误 +* >0 返回道岔所属OC数 +* add by mpt 20260326 +*/ +UINT8 GetSwitchIncludeOcNum(const UINT16 switchId) +{ + UINT16 bufIndex = 0u; /*数组下标*/ + UINT8 retVal = CI_ERROR; + + bufIndex = GetSwitchConfigBufIndex(switchId); /*获取道岔数组下标*/ + + if (SWITCH_SUM_MAX > bufIndex) + { + retVal = SwitchConfigDataStru[bufIndex].chSwitchBelongOcNum; + if (SWITCH_BELONG_OC_MAX < retVal) + { + retVal = CI_ERROR; + } + } + else + { + retVal = CI_ERROR; + } + return retVal; +} + +/* +* 功能描述: 获取指定道岔包含的OCID +* 参数说明: const UINT8 index +* 返回值 : 返回指定索引的OCID +* add by mpt 20260326 +*/ +UINT8 GetSwitchIncludeOCId(const UINT16 switchId,const UINT8 index) +{ + UINT16 bufIndex = 0u; /*数组下标*/ + UINT8 retVal = CI_ERROR; + + bufIndex = GetSwitchConfigBufIndex(switchId); /*获取道岔数组下标*/ + + if ((SWITCH_SUM_MAX >bufIndex )&&(SWITCH_BELONG_OC_MAX > index)) + { + retVal = SwitchConfigDataStru[bufIndex].belongOCConfigData[index].OcId; + } + else + { + retVal = CI_ERROR; + } + return retVal; +} + +/* +* 功能描述: 获取指定道岔的OC索引 +* 参数说明: const UINT8 index +* 返回值 :指定道岔的OC索引 +* add by mpt 20260326 +*/ +UINT8 GetSwitchThisOCIndex(const UINT16 switchId, const UINT8 ocId) +{ + UINT16 bufIndex = 0u; /*数组下标*/ + UINT8 retVal = SWITCH_BELONG_OC_MAX; + UINT8 i = 0u; + + bufIndex = GetSwitchConfigBufIndex(switchId); /*获取道岔数组下标*/ + + if ((SWITCH_SUM_MAX > bufIndex) && (OC_SUM_MAX > ocId)) + { + for (i = 0u; i < SWITCH_BELONG_OC_MAX;i++) + { + if (SwitchConfigDataStru[bufIndex].belongOCConfigData[i].OcId== ocId) + { + retVal = i; + break; + } + } + } + else + { + retVal = SWITCH_BELONG_OC_MAX; + } + return retVal; +} + +/* +* 功能描述: 获取指定道岔OC的插箱ID +* 参数说明: const UINT16 switchId 道岔ID +* const UINT8 ocId OCID +* 返回值 : 返回道岔指定OC的插箱号 +* add by mpt 20260326 +*/ +UINT8 GetSwitchszPlusBoxId(const UINT16 switchId, const UINT8 ocId) +{ + UINT16 bufIndex = 0u; /*数组下标*/ + UINT8 retVal = CI_ERROR; + UINT8 i = 0u; + + bufIndex = GetSwitchConfigBufIndex(switchId); /*获取道岔数组下标*/ + + if ((SWITCH_SUM_MAX > bufIndex) && (OC_SUM_MAX > ocId)) + { + for (i = 0u; i < SwitchConfigDataStru[bufIndex].chSwitchBelongOcNum; i++) + { + if (ocId == SwitchConfigDataStru[bufIndex].belongOCConfigData[i].OcId) + { + retVal = SwitchConfigDataStru[bufIndex].belongOCConfigData[i].szPlusBoxId; + break; + } + } + } + else + { + retVal = CI_ERROR; + } + return retVal; +} + +/* +* 功能描述: 获取指定道岔在该OC的转辙机板卡数 +* 参数说明: const UINT16 switchId 道岔ID +* const UINT8 ocId OCID +* 返回值 : 指定道岔在该OC的转辙机板卡数 +* add by mpt 20260326 +*/ +UINT8 GetSwitchThisOCBoardNum(const UINT16 switchId, const UINT8 ocId) +{ + UINT16 bufIndex = 0u; /*数组下标*/ + UINT8 retVal = CI_ERROR; + UINT8 i = 0u; + + bufIndex = GetSwitchConfigBufIndex(switchId); /*获取道岔数组下标*/ + + if ((SWITCH_SUM_MAX > bufIndex) && (OC_SUM_MAX > ocId)) + { + for (i = 0u; i < SwitchConfigDataStru[bufIndex].chSwitchBelongOcNum; i++) + { + if (ocId == SwitchConfigDataStru[bufIndex].belongOCConfigData[i].OcId) + { + retVal = SwitchConfigDataStru[bufIndex].belongOCConfigData[i].chSwitchBoardNum; + break; + } + } + } + else + { + retVal = CI_ERROR; + } + return retVal; +} + +/* +* 功能描述: 获取指定道岔在该OC的转辙机板卡ID的索引号 +* 参数说明: const UINT16 switchId 道岔ID +* const UINT8 ocId OCID +* 返回值 :指定道岔在该OC的转辙机板卡ID的索引号 +* add by mpt 20260326 +*/ +UINT8 GetSwitchThisOCBoardIDindex(const UINT16 switchId, const UINT8 ocId,const UINT8 boardId) +{ + UINT16 bufIndex = 0u; /*数组下标*/ + UINT8 num = 0u; + UINT8 i = 0u; + UINT8 j = 0u; + UINT8 retVal = MAX_OC_SWITCH_INCLUDE_BOARD_NUM; + + bufIndex = GetSwitchConfigBufIndex(switchId); /*获取道岔数组下标*/ + + if ((SWITCH_SUM_MAX > bufIndex) && (OC_SUM_MAX > ocId)) + { + for (i = 0u; i < SwitchConfigDataStru[bufIndex].chSwitchBelongOcNum; i++) + { + if (ocId == SwitchConfigDataStru[bufIndex].belongOCConfigData[i].OcId) + { + num = SwitchConfigDataStru[bufIndex].belongOCConfigData[i].chSwitchBoardNum; + for (j = 0u; j < num; j++) + { + if (boardId == SwitchConfigDataStru[bufIndex].belongOCConfigData[i].ModuleAddr[j]) + { + retVal = j; + break; + } + } + break; + } + } + } + else + { + retVal = CI_ERROR; + } + return retVal; +} + +/* +* 功能描述: 获取指定道岔指定OC的另一OCId +* 参数说明: const UINT16 switchId 道岔ID +* const UINT8 ocId OCID +* 返回值 :指定道岔指定OC的另一OCId +* add by mpt 20260326 +*/ +UINT8 GetSwitchThisOcOtherOCId(const UINT16 switchId, const UINT8 ocId) +{ + UINT16 bufIndex = 0u; /*数组下标*/ + UINT8 i = 0u; + UINT8 retVal = 0u; + + bufIndex = GetSwitchConfigBufIndex(switchId); /*获取道岔数组下标*/ + + if ((SWITCH_SUM_MAX > bufIndex) && (OC_SUM_MAX > ocId)&&(0u < ocId)) + { + for (i = 0u; i < SwitchConfigDataStru[bufIndex].chSwitchBelongOcNum; i++) + { + if ((ocId != SwitchConfigDataStru[bufIndex].belongOCConfigData[i].OcId)&&(0u < SwitchConfigDataStru[bufIndex].belongOCConfigData[i].OcId)) + { + retVal = SwitchConfigDataStru[bufIndex].belongOCConfigData[i].OcId; + break; + } + } + } + + return retVal; +} +/* +* 功能描述: 获取道岔是否属于本OC +* 参数说明: +* 输入参数: +* UINT16 switchId 道岔ID +* UINT8 ocId OCID +* 返回值 : 0:不是 +* 1:是 +* Add by mpt 20260330 +*/ +UINT8 GetSwitchWhetherBelongThisOc(UINT16 switchId, UINT8 ocId) +{ + UINT16 bufIndex = 0u; /*数组下标*/ + UINT8 i = 0u; + UINT8 retVal = CI_ERROR; + 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) + { + if (ocId == SwitchConfigDataStru[bufIndex].belongOCConfigData[chOCIndex].OcId) + { + retVal = CI_SUCCESS; + } + } + } + + return retVal; +} + diff --git a/TSCP/src/APP/ciapp/Switch/SwitchConfigDataManage.h b/TSCP/src/APP/ciapp/Switch/SwitchConfigDataManage.h index 39b8123..29829c8 100644 --- a/TSCP/src/APP/ciapp/Switch/SwitchConfigDataManage.h +++ b/TSCP/src/APP/ciapp/Switch/SwitchConfigDataManage.h @@ -33,6 +33,14 @@ typedef struct S_ZzjPowerConfigDataStruct UINT16 ZzjFanweiPower2; /*转辙机J1反表灯_供电2*/ }ZzjPowerConfigDataStruct; +typedef struct S_SwitchBelongOCConfigDataStr/*道岔所属OC配置数据*/ +{ + UINT8 OcId; /*当前OC*/ + UINT8 chSwitchBoardNum; /*道岔板卡数*/ + UINT8 ModuleAddr[MAX_OC_SWITCH_INCLUDE_BOARD_NUM]; /*地址ID*/ + UINT8 szPlusBoxId; /*转辙机板所在插箱ID*/ +}SwitchBelongOCConfigDataStr; + typedef struct S_SwitchConfigDataStruct { UINT16 SwitchId; /*道岔ID (配置字段)*/ @@ -99,6 +107,9 @@ typedef struct S_SwitchConfigDataStruct UINT16 DsDrvHRelayId; /*道岔单锁后节点驱动继电器ID (配置字段-联络线使用)*/ UINT16 IbpDrvRelayId; /*IBP盘道岔旁路驱动继电器ID (配置字段-联络线使用)*/ ZzjPowerConfigDataStruct ZzjPowerData[SWITCH_ZZJ_POWER_STATE_MAX_NUM]; /*转辙机供电配置数据*/ + + UINT8 chSwitchBelongOcNum;/*道岔所属OC数*/ + SwitchBelongOCConfigDataStr belongOCConfigData[SWITCH_BELONG_OC_MAX];/*道岔所属各OC的配置情况*/ } SwitchConfigDataStruct; @@ -107,6 +118,8 @@ typedef struct S_OC_SwitchConfigDataStruct { UINT16 SwitchId; /*道岔ID(配置字段)*/ UINT16 BelongOcId; /*所属OCID(配置字段)*/ + UINT8 ModuleAddrA[MAX_OC_SWITCH_INCLUDE_BOARD_NUM]; /*A系地址*/ + UINT8 ModuleAddrB[MAX_OC_SWITCH_INCLUDE_BOARD_NUM]; /*B系地址*/ }OCSwitchConfigDataStruct; /*旧版OC道岔配置数据表*/ @@ -592,8 +605,71 @@ ZzjPowerConfigDataStruct* GetSwitchZzjPowerConfigData(const UINT16 switchId); * >0: IBP盘道岔旁路表示灯驱动继电器ID */ UINT16 GetSwitchIbpDrvRelayId(const UINT16 switchId); - - +/* +* 功能描述: 获取指定道岔所属OC数 +* 参数说明: const UINT16 switchId, 道岔ID +* 返回值 :0 返回错误 +* >0 返回道岔所属OC数 +* add by mpt 20260326 +*/ +UINT8 GetSwitchIncludeOcNum(const UINT16 switchId); +/* +* 功能描述: 获取指定道岔包含的OCID +* 参数说明: const UINT8 index +* 返回值 : 返回指定索引的OCID +* add by mpt 20260326 +*/ +UINT8 GetSwitchIncludeOCId(const UINT16 switchId, const UINT8 index); +/* +* 功能描述: 获取指定道岔的OC索引 +* 参数说明: const UINT8 index +* 返回值 :指定道岔的OC索引 +* add by mpt 20260326 +*/ +UINT8 GetSwitchThisOCIndex(const UINT16 switchId, const UINT8 ocId); +/* +* 功能描述: 获取指定道岔OC的插箱ID +* 参数说明: const UINT16 switchId 道岔ID +* const UINT8 ocId OCID +* 返回值 : 返回道岔指定OC的插箱号 +* add by mpt 20260326 +*/ +UINT8 GetSwitchszPlusBoxId(const UINT16 switchId, const UINT8 ocId); +/* +* 功能描述: 获取指定道岔在该OC的转辙机板卡数 +* 参数说明: const UINT16 switchId 道岔ID +* const UINT8 ocId OCID +* 返回值 : 指定道岔在该OC的转辙机板卡数 +* add by mpt 20260326 +*/ +UINT8 GetSwitchThisOCBoardNum(const UINT16 switchId, const UINT8 ocId); +/* +* 功能描述: 获取指定道岔在该OC的转辙机板卡ID的索引号 +* 参数说明: const UINT16 switchId 道岔ID +* const UINT8 ocId OCID +* 返回值 :指定道岔在该OC的转辙机板卡ID的索引号 +* add by mpt 20260326 +*/ +UINT8 GetSwitchThisOCBoardIDindex(const UINT16 switchId, const UINT8 ocId, const UINT8 boardId); +/* +* 功能描述: 获取指定道岔指定OC的另一OCId +* 参数说明: const UINT16 switchId 道岔ID +* const UINT8 ocId OCID +* 返回值 :指定道岔指定OC的另一OCId +* add by mpt 20260326 +*/ +UINT8 GetSwitchThisOcOtherOCId(const UINT16 switchId, const UINT8 ocId); +/* +* 功能描述: 获取道岔是否属于本OC +* 参数说明: +* 输入参数: +* UINT16 switchId 道岔ID +* UINT8 ocId OCID +* 返回值 : 0:不是 +* 1:是 +* Add by mpt 20260330 +*/ +UINT8 GetSwitchWhetherBelongThisOc(UINT16 switchId, UINT8 ocId); #ifdef __cplusplus } #endif diff --git a/TSCP/src/APP/ciapp/Switch/SwitchDataManage.c b/TSCP/src/APP/ciapp/Switch/SwitchDataManage.c index 36c7602..fd57f0c 100644 --- a/TSCP/src/APP/ciapp/Switch/SwitchDataManage.c +++ b/TSCP/src/APP/ciapp/Switch/SwitchDataManage.c @@ -416,6 +416,73 @@ void SetSwitchLockStatus(const UINT8 pLockType,const UINT16 pLockId,const UINT16 retVal = CI_SUCCESS; } break; + case SWITCH_PLOCKTYPE_AXISSEC:/*锁闭类型为被计轴区段防护锁闭*/ + { + if (SWITCH_LOCK_PROTECT_SET == lockCommand) + {/*设置防护锁闭*/ + findFlag = 0u;/*置未找到*/ + emptyIndex = -1;/*空位索引*/ + /*查找被防护计轴区段id是否存在,存在,退出;不存在,找一个存放位置,更新被锁闭的计轴区段数量*/ + for (ii = 0u; ii < SWITCH_MAX_PROTECT_LOCKED_NUM; ii++) + { + if (emptyIndex < 0)/*空位索引小于0,才查找空位索引*/ + { + if (0u == SwitchDataStru[bufIndex].PLockedAxisSecIdArr[ii]) + { + emptyIndex = (INT16)ii;/*空位值为0,表示为空位,记住索引*/ + } + } + + if (pLockId == SwitchDataStru[bufIndex].PLockedAxisSecIdArr[ii]) + {/*找到被锁闭的id*/ + findFlag = 1u; + } + } + + if (0u == findFlag) + {/*没找到被锁闭id*/ + if (emptyIndex >= 0) + {/*且空位存在*/ + SwitchDataStru[bufIndex].PLockedAxisSecIdArr[emptyIndex] = pLockId;/*设置被锁闭id*/ + SwitchDataStru[bufIndex].PLockedAxisSecNum++; /*被锁闭id数量增加1个*/ + } + else + {/*超过软件支持的最大防护锁闭设备数目,输出打印信息*/ + debug_infor_printf((const)"Set switch id %d PLOCK by axis %d fail,no empty space\n", bufIndex, pLockId); + } + } + } + else if (SWITCH_LOCK_PROTECT_CANCEL == lockCommand) + {/*取消防护锁闭*/ + targetIndex = -1;/*目标索引*/ + /*如果没找到,返回*/ + /*找到,设为0,且把数量-1*/ + for (ii = 0u; ii < SWITCH_MAX_PROTECT_LOCKED_NUM; ii++) + { + if (SwitchDataStru[bufIndex].PLockedAxisSecIdArr[ii] == pLockId) + { + targetIndex = (INT16)ii; + SwitchDataStru[bufIndex].PLockedAxisSecIdArr[ii] = 0;/*设为0*/ + break; + } + } + + if (targetIndex >= 0)/*找到了*/ + { + if (SwitchDataStru[bufIndex].PLockedAxisSecNum > 0U) + { + SwitchDataStru[bufIndex].PLockedAxisSecNum--;/*减1处理*/ + } + } + + } + else + { + /*非法命令,不处理*/ + } + retVal = CI_SUCCESS; + break; + } default: { /*类型非法,置返回标志错误*/ @@ -432,7 +499,7 @@ void SetSwitchLockStatus(const UINT8 pLockType,const UINT16 pLockId,const UINT16 (SWITCH_LOCK_STATUS_DAP == SwitchDataStru[bufIndex].LockStatus))/*道岔状态包含单锁*/ { if (SwitchDataStru[bufIndex].PLockedNonRouteNum + SwitchDataStru[bufIndex].PLockedOverlapNum + - SwitchDataStru[bufIndex].PLockedRouteNum + SwitchDataStruCC[bufIndex].PLockedLogRouteNum > 0u) + SwitchDataStru[bufIndex].PLockedRouteNum + SwitchDataStruCC[bufIndex].PLockedLogRouteNum + SwitchDataStru[bufIndex].PLockedAxisSecNum > 0u) {/*被防护锁闭的设备数目大于0*/ SwitchDataStru[bufIndex].LockStatus = SWITCH_LOCK_STATUS_DAP; } @@ -451,7 +518,7 @@ void SetSwitchLockStatus(const UINT8 pLockType,const UINT16 pLockId,const UINT16 else {/*不包含单锁*/ if (SwitchDataStru[bufIndex].PLockedNonRouteNum + SwitchDataStru[bufIndex].PLockedOverlapNum + - SwitchDataStru[bufIndex].PLockedRouteNum + SwitchDataStruCC[bufIndex].PLockedLogRouteNum > 0u) + SwitchDataStru[bufIndex].PLockedRouteNum + SwitchDataStruCC[bufIndex].PLockedLogRouteNum + SwitchDataStru[bufIndex].PLockedAxisSecNum > 0u) {/*被防护锁闭的设备数目大于0*/ SwitchDataStru[bufIndex].LockStatus = SWITCH_LOCK_STATUS_PROTECT; } @@ -1092,11 +1159,14 @@ 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) { @@ -1120,7 +1190,9 @@ void SetSwitchDrivePostion(const UINT16 switchId, const UINT8 drivePosition) /*设置驱动位置*/ SwitchDataStru[bufIndex].SwitchDrivePos = drivePosition; /*道岔驱动开始时间*/ - SetSwitchDriveStartCycNum(switchId, Get2oo2CurCycleNum()); + SetSwitchDriveStartCycNum(switchId, dwCurCycleNum); + /*设置道岔驱动起始周期,直到有位置时才清0*/ + SetSwitchOutputDrvCmdCycNum(switchId, dwCurCycleNum); } } else @@ -1156,7 +1228,10 @@ void SetSwitchDrivePostion(const UINT16 switchId, const UINT8 drivePosition) /*设置驱动位置*/ SwitchDataStru[bufIndex2].SwitchDrivePos = drivePosition; /*道岔驱动开始时间*/ - SetSwitchDriveStartCycNum(switchOtherId, Get2oo2CurCycleNum()); + SetSwitchDriveStartCycNum(switchOtherId, dwCurCycleNum); + + /*设置道岔驱动起始周期,直到有位置时才清0*/ + SetSwitchOutputDrvCmdCycNum(switchOtherId, dwCurCycleNum); } } else @@ -3068,4 +3143,515 @@ UINT8 GetSwitchThisOverlapPLocked(const UINT16 switchId, const UINT16 overlapId) } return retVal; -} \ No newline at end of file +} + +/* +* 功能描述: 设置道岔指定OC的控制模式 +* 参数说明: const UINT16 switchId, 道岔ID +* const UINT8 ocId 指定OC +* const UINT8 controlMode 控制模式 +* 返回值 : void +* add by mpt 20260326 +*/ +void SetSwitchThisOcCotrolMode(const UINT16 switchId, const UINT8 ocId,const UINT8 controlMode) +{ + UINT16 bufIndex = 0u; /*数组下标*/ + UINT8 i = 0u; + UINT8 chSwitchIncludeOcNum = 0U; + + bufIndex = GetSwitchConfigBufIndex(switchId); /*获取道岔数组下标*/ + chSwitchIncludeOcNum = GetSwitchIncludeOcNum(switchId); + if ((SWITCH_SUM_MAX > bufIndex) && (0u < ocId)) + { + for (i = 0u; i < chSwitchIncludeOcNum; i++) + { + if (ocId == SwitchDataStru[bufIndex].belongOCData[i].OcId) + { + if ((MAIN_CONTROL == controlMode) || (STANDBY_CONTROL == controlMode) || (NO_CONTROL_FUN == controlMode) || (ERR_MODE_CONTROL == controlMode)) + { + SwitchDataStru[bufIndex].belongOCData[i].controlMode = controlMode; + } + break; + } + } + } + else + { + /*什么也不做*/ + } +} + +/* +* 功能描述: 获取道岔指定OC的控制模式 +* 参数说明: const UINT16 switchId, 道岔ID +* const UINT8 ocId 指定OC +* 返回值 : 控制模式 +* add by mpt 20260326 +*/ +UINT8 GetSwitchThisOcCotrolMode(const UINT16 switchId, const UINT8 ocId) +{ + UINT16 bufIndex = 0u; /*数组下标*/ + UINT8 retVal = CI_ERROR; + UINT8 i = 0u; + UINT8 chSwitchIncludeOcNum = 0U; + + bufIndex = GetSwitchConfigBufIndex(switchId); /*获取道岔数组下标*/ + chSwitchIncludeOcNum = GetSwitchIncludeOcNum(switchId); + if ((SWITCH_SUM_MAX > bufIndex) && (0u < ocId)) + { + for (i = 0u; i < chSwitchIncludeOcNum; i++) + { + if (ocId == SwitchDataStru[bufIndex].belongOCData[i].OcId) + { + retVal= SwitchDataStru[bufIndex].belongOCData[i].controlMode; + break; + } + } + } + else + { + /*什么也不做*/ + } + + return retVal; +} + +/* +* 功能描述: 设置道岔的主控OCID +* 参数说明: const UINT16 switchId, 道岔ID +* const UINT8 ocId 指定OC +* 返回值 : void +* add by mpt 20260326 +*/ +void SetSwitchMainCotrolOCId(const UINT16 switchId, const UINT8 ocId) +{ + UINT16 bufIndex = 0u; /*数组下标*/ + + bufIndex = GetSwitchConfigBufIndex(switchId); /*获取道岔数组下标*/ + if (SWITCH_SUM_MAX > bufIndex) + { + SwitchDataStru[bufIndex].mainControlOcId = ocId; + } + else + { + /*什么也不做*/ + } +} + +/* +* 功能描述: 获取道岔的主控OC +* 参数说明: const UINT16 switchId 道岔ID +* 返回值 : 主控OCId +* add by mpt 20260326 +*/ +UINT8 GetSwitchMainCotrolOCId(const UINT16 switchId) +{ + UINT16 bufIndex = 0u; /*数组下标*/ + UINT8 retVal = CI_ERROR; + + bufIndex = GetSwitchConfigBufIndex(switchId); /*获取道岔数组下标*/ + if (SWITCH_SUM_MAX > bufIndex) + { + retVal = SwitchDataStru[bufIndex].mainControlOcId; + } + else + { + /*什么也不做*/ + } + + return retVal; +} + +/* +* 功能描述: 设置道岔指定OC执行电插箱的状态 +* 参数说明: const UINT16 switchId, 道岔ID +* const UINT8 ocId 指定OC +* const UINT8 state 状态 +* 返回值 : void +* add by mpt 20260326 +*/ +void SetSwitchOcPlusBoxSateState(const UINT16 switchId, const UINT8 ocId, const UINT8 state) +{ + UINT16 bufIndex = 0u; /*数组下标*/ + UINT8 i = 0u; + UINT8 chOCIndex = 0U; + + bufIndex = GetSwitchConfigBufIndex(switchId); /*获取道岔数组下标*/ + chOCIndex = GetSwitchThisOCIndex(switchId, ocId); + if ((SWITCH_SUM_MAX > bufIndex) && (chOCIndex < SWITCH_BELONG_OC_MAX)) + { + SwitchDataStru[bufIndex].belongOCData[chOCIndex].PlusBoxSate = state; + } + else + { + /*什么也不做*/ + } +} + +/* +* 功能描述: 获取道岔在指定OC中的执行电插箱状态 +* 参数说明: const UINT16 switchId, 道岔ID +* const UINT8 ocId 指定OC +* const UINT8 state 状态 +* 返回值 : 0x55 转辙机执行电表示电均表示正常 +* 0xAA 转辙机存在执行电熔丝或表示电熔丝报警 +* 0 非法状态 +* add by mpt 20260326 +*/ +UINT8 GetSwitchOcPlusBoxSateState(const UINT16 switchId, const UINT8 ocId) +{ + UINT16 bufIndex = 0u; /*数组下标*/ + UINT8 ret = 0u; + UINT8 chOCIndex = 0U; + + bufIndex = GetSwitchConfigBufIndex(switchId); /*获取道岔数组下标*/ + chOCIndex = GetSwitchThisOCIndex(switchId, ocId); + if ((SWITCH_SUM_MAX > bufIndex) && (chOCIndex < SWITCH_BELONG_OC_MAX)) + { + ret = SwitchDataStru[bufIndex].belongOCData[chOCIndex].PlusBoxSate; + } + else + { + /*什么也不做*/ + } + return ret; +} + + +/* +* 功能描述: 设置指定道岔在该OC的转辙机板卡ID的状态 +* 参数说明: const UINT16 switchId 道岔ID +* const UINT8 ocId OCID +* const UINT8 boardId 板卡ID +* UINT8 state 板卡故障状态 +* 返回值 :void +* add by mpt 20260326 +*/ +void SetSwitchThisOCBoardState(const UINT16 switchId, const UINT8 ocId, const UINT8 boardId, const UINT8 state) +{ + UINT16 bufIndex = 0u; /*数组下标*/ + UINT8 chBoardIndex = 0u; + UINT8 chOCIndex = 0u; + + bufIndex = GetSwitchConfigBufIndex(switchId); /*获取道岔数组下标*/ + + if (SWITCH_SUM_MAX > bufIndex) + { + + chOCIndex = GetSwitchThisOCIndex(switchId, ocId); + chBoardIndex = GetSwitchThisOCBoardIDindex(switchId, ocId, boardId); + if ((MAX_OC_SWITCH_INCLUDE_BOARD_NUM > chBoardIndex)&&(SWITCH_BELONG_OC_MAX >chOCIndex)) + { + SwitchDataStru[bufIndex].belongOCData[chOCIndex].BoardStateBuf[chBoardIndex] = state; + } + else + { + /*nothing*/ + } + } + else + { + /*nothing*/ + } +} + +/* +* 功能描述: 获取指定道岔在该OC中是否存在某组转辙机板故障 +* 参数说明: const UINT16 switchId 道岔ID +* const UINT8 ocId OCID +* const UINT8 boardId 板卡ID +* UINT8 state 板卡故障状态 +* 返回值 :SWITCH_BOARD_FAULT 故障 +* SWITCH_BOARD_NORMAL 正常 +* add by mpt 20260326 +*/ +UINT8 GetSwitchThisOCBoardState(const UINT16 switchId, const UINT8 ocId) +{ + UINT16 bufIndex = 0u; /*数组下标*/ + UINT8 num = 0u; + UINT8 i = 0u; + UINT8 chSwitchThisOCBoardNum = 0u; + UINT8 chOCIndex = 0U; + UINT8 addrAState = 0u; + UINT8 addrBState = 0u; + UINT8 retVal = SWITCH_BOARD_FAULT; + + bufIndex = GetSwitchConfigBufIndex(switchId); /*获取道岔数组下标*/ + + if (SWITCH_SUM_MAX > bufIndex) + { + chOCIndex = GetSwitchThisOCIndex(switchId, ocId); + chSwitchThisOCBoardNum = GetSwitchThisOCBoardNum(switchId, ocId); + if (SWITCH_BELONG_OC_MAX > chOCIndex) + { + for (i = 0; i < (chSwitchThisOCBoardNum/2u); i+=2u) + { + 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_FAULT; + break; + } + } + + if ((0U < chSwitchThisOCBoardNum) && (i == chSwitchThisOCBoardNum)) + { + retVal = SWITCH_BOARD_NORMAL; + } + + } + + } + else + { + /*nothing*/ + } + return retVal; +} + +/* +* 功能描述: 设置道岔指定OC的主控命令 +* 参数说明: const UINT16 switchId, 道岔ID +* const UINT8 ocId 指定OC +* const UINT8 state 状态 +* 返回值 : void +* add by mpt 20260326 +*/ +void SetSwitchThisOcOutControlCmd(const UINT16 switchId, const UINT8 ocId, const UINT8 state) +{ + UINT16 bufIndex = 0u; /*数组下标*/ + UINT8 chOCIndex = 0U; + + bufIndex = GetSwitchConfigBufIndex(switchId); /*获取道岔数组下标*/ + chOCIndex = GetSwitchThisOCIndex(switchId, ocId); + if ((SWITCH_SUM_MAX > bufIndex) && (SWITCH_BELONG_OC_MAX >chOCIndex)) + { + if ((MAIN_CONTROL == state) || (STANDBY_CONTROL == state)||(NO_CONTROL_FUN == state)) + { + SwitchDataStru[bufIndex].belongOCData[chOCIndex].OutControlCmd = state; + } + } + else + { + /*什么也不做*/ + } +} + +/* +* 功能描述: 获取道岔指定OC的主控命令 +* 参数说明: const UINT16 switchId, 道岔ID +* const UINT8 ocId 指定OC +* const UINT8 state 状态 +* 返回值 : 0x55 主控 +* 0xaa 备控 +* add by mpt 20260326 +*/ +UINT8 GetSwitchThisOcOutControlCmd(const UINT16 switchId, const UINT8 ocId) +{ + UINT16 bufIndex = 0u; /*数组下标*/ + UINT8 chOCIndex = 0U; + UINT8 retVal = 0U; + + bufIndex = GetSwitchConfigBufIndex(switchId); /*获取道岔数组下标*/ + chOCIndex = GetSwitchThisOCIndex(switchId, ocId); + if ((SWITCH_SUM_MAX > bufIndex) && (SWITCH_BELONG_OC_MAX > chOCIndex)) + { + retVal = SwitchDataStru[bufIndex].belongOCData[chOCIndex].OutControlCmd; + } + else + { + /*什么也不做*/ + } + return retVal; +} + +/* +* 功能描述: 设置道岔指定OC的主控命令的设置周期 +* 参数说明: const UINT16 switchId, 道岔ID +* const UINT8 ocId 指定OC +* const UINT32 cycnum 周期 +* 返回值 : void +* add by mpt 20260326 +*/ +void SetSwitchOutMainContrCmdCycNum(const UINT16 switchId, const UINT8 ocId,const UINT32 cycnum) +{ + UINT16 bufIndex = 0u; /*数组下标*/ + UINT8 chOCIndex = 0U; + + bufIndex = GetSwitchConfigBufIndex(switchId); /*获取道岔数组下标*/ + chOCIndex = GetSwitchThisOCIndex(switchId, ocId); + if ((SWITCH_SUM_MAX > bufIndex) && (SWITCH_BELONG_OC_MAX > chOCIndex)) + { + SwitchDataStru[bufIndex].belongOCData[chOCIndex].OutMainControlCmdCycNum = cycnum; + } + else + { + /*什么也不做*/ + } +} + +/* +* 功能描述:获取道岔指定OC的主控命令的设置周期 +* 参数说明: const UINT16 switchId, 道岔ID +* const UINT8 ocId 指定OC +* 返回值 : void +* add by mpt 20260326 +*/ +UINT32 GetSwitchOutMainContrCmdCycNum(const UINT16 switchId, const UINT8 ocId) +{ + UINT16 bufIndex = 0u; /*数组下标*/ + UINT8 chOCIndex = 0U; + UINT32 retVal = 0u; + + bufIndex = GetSwitchConfigBufIndex(switchId); /*获取道岔数组下标*/ + chOCIndex = GetSwitchThisOCIndex(switchId, ocId); + if ((SWITCH_SUM_MAX > bufIndex) && (SWITCH_BELONG_OC_MAX > chOCIndex)) + { + retVal = SwitchDataStru[bufIndex].belongOCData[chOCIndex].OutMainControlCmdCycNum; + } + else + { + /*什么也不做*/ + } + + return retVal; +} + +/* +* 功能描述: 设置道岔驱动命令下发起始周期 +* 参数说明: const UINT16 switchId, 道岔ID +* const UINT32 cycNum 周期号 +* 返回值 : 无 +* add mpt by 20260327 +*/ +void SetSwitchOutputDrvCmdCycNum(const UINT16 switchId, const UINT32 cycNum) +{ + UINT16 bufIndex = 0u; /*数组下标*/ + bufIndex = GetSwitchConfigBufIndex(switchId); /*获取道岔数组下标*/ + if (bufIndex < SWITCH_SUM_MAX) + { + SwitchDataStru[bufIndex].SwitchOutputDrvCmdCycNum = cycNum; + } +} +/* +* 功能描述: 获取道岔驱动命令下发起始周期 +* 参数说明: const UINT16 switchId, 道岔ID +* 返回值 : 道岔操作命令起始周期 +* add mpt by 20260327 +*/ +UINT32 GetSwitchOutputDrvCmdCycNum(const UINT16 switchId) +{ + UINT16 bufIndex = 0u; /*数组下标*/ + UINT32 retVal = CI_ERROR; + + bufIndex = GetSwitchConfigBufIndex(switchId); /*获取道岔数组下标*/ + if (bufIndex < SWITCH_SUM_MAX) + { + retVal = SwitchDataStru[bufIndex].SwitchOutputDrvCmdCycNum; + } + return retVal; +} +/* +* 功能描述: 设置道岔寻找表示位置 +* 参数说明: const UINT16 switchId, 道岔ID +* const UINT8 ocId OCID +* const UINT8 chFindCmd 寻表命令 +* 返回值 : 无 +* add mpt by 20260327 +*/ +void SetSwitchThisOcFindPostionCmd(const UINT16 switchId, const UINT8 ocId, const UINT8 chFindCmd) +{ + UINT16 bufIndex = 0u; /*数组下标*/ + UINT8 chOCIndex = 0U; + + bufIndex = GetSwitchConfigBufIndex(switchId); /*获取道岔数组下标*/ + if (SWITCH_SUM_MAX > bufIndex) + { + chOCIndex = GetSwitchThisOCIndex(switchId, ocId); + if (SWITCH_BELONG_OC_MAX > chOCIndex) + { + if ((FIND_DINGWEI_CMD == chFindCmd)||(FIND_FANWEI_CMD == chFindCmd) || (INIT_FIND_CMD == chFindCmd)||(NO_FIND_CMD == chFindCmd)) + { + SwitchDataStru[bufIndex].belongOCData[chOCIndex].FindPostionCmd = chFindCmd; + } + else + { + /*无处理*/ + } + } + } +} +/* +* 功能描述: 获取道岔寻找表示命令 +* 参数说明: const UINT16 switchId, 道岔ID +* const UINT8 ocId OCID +* 返回值 : 道岔寻找表示位置 +* add mpt by 20260327 +*/ +UINT8 GetSwitchThisOcFindPostionCmd(const UINT16 switchId, const UINT8 ocId) +{ + UINT16 bufIndex = 0u; /*数组下标*/ + UINT8 chOCIndex = 0U; + UINT8 retVal = 0u; + bufIndex = GetSwitchConfigBufIndex(switchId); /*获取道岔数组下标*/ + if (SWITCH_SUM_MAX > bufIndex) + { + chOCIndex = GetSwitchThisOCIndex(switchId, ocId); + if (SWITCH_BELONG_OC_MAX > chOCIndex) + { + retVal = SwitchDataStru[bufIndex].belongOCData[chOCIndex].FindPostionCmd; + } + } + + return retVal; +} + + +/* +* 功能描述: 获取道岔寻找表示命令起始周期 +* 参数说明: const UINT16 switchId, 道岔ID +* const UINT8 ocId OCID +* 返回值 :道岔寻找表示命令起始周期 +* add mpt by 20260327 +*/ +UINT32 GetSwitchThisOcFindCmdCycNum(const UINT16 switchId, const UINT8 ocId) +{ + UINT16 bufIndex = 0u; /*数组下标*/ + UINT8 chOCIndex = 0U; + UINT32 retVal = 0u; + bufIndex = GetSwitchConfigBufIndex(switchId); /*获取道岔数组下标*/ + if (SWITCH_SUM_MAX > bufIndex) + { + chOCIndex = GetSwitchThisOCIndex(switchId, ocId); + if (SWITCH_BELONG_OC_MAX > chOCIndex) + { + retVal = SwitchDataStru[bufIndex].belongOCData[chOCIndex].FindCmdStartCycNum; + } + } + + return retVal; +} +/* +* 功能描述: 设置道岔寻找表示命令起始周期 +* 参数说明: const UINT16 switchId, 道岔ID +* const UINT8 ocId OCID +* UINT32 cycNum 周期号 +* 返回值 :void +* add mpt by 20260402 +*/ +void SetSwitchThisOcFindCmdCycNum(const UINT16 switchId, const UINT8 ocId, const UINT32 cycNum) +{ + UINT16 bufIndex = 0u; /*数组下标*/ + UINT8 chOCIndex = 0U; + bufIndex = GetSwitchConfigBufIndex(switchId); /*获取道岔数组下标*/ + if (SWITCH_SUM_MAX > bufIndex) + { + chOCIndex = GetSwitchThisOCIndex(switchId, ocId); + if (SWITCH_BELONG_OC_MAX > chOCIndex) + { + SwitchDataStru[bufIndex].belongOCData[chOCIndex].FindCmdStartCycNum = cycNum; + } + } +} + diff --git a/TSCP/src/APP/ciapp/Switch/SwitchDataManage.h b/TSCP/src/APP/ciapp/Switch/SwitchDataManage.h index db8527c..68b0d2e 100644 --- a/TSCP/src/APP/ciapp/Switch/SwitchDataManage.h +++ b/TSCP/src/APP/ciapp/Switch/SwitchDataManage.h @@ -28,6 +28,18 @@ extern "C" { #endif +/*道岔数据结构体*/ +typedef struct S_SwitchOcDataStruct +{ + UINT8 OcId; /*OC ID*/ + UINT8 controlMode; /*当前主备控制模式*/ + UINT8 OutControlCmd;/*控制主备命令*/ + UINT8 PlusBoxSate; /*插箱状态*/ + UINT8 BoardStateBuf[MAX_OC_SWITCH_INCLUDE_BOARD_NUM];/*板卡状态*/ + UINT32 OutMainControlCmdCycNum;/*升主命令周期,向外输出升主命令时设置(一直输出则一直设置),或当前通信中断主控->备控时设置,收到OC数据由主控->备控时清除*/ + UINT8 FindPostionCmd;/*1 寻定,2 寻反,3初始寻,0 无寻位置指令*/ + UINT32 FindCmdStartCycNum;/*寻表示命令起始周期*/ +}SwitchOCDataStr; /*道岔数据结构体*/ typedef struct S_SwitchDataStruct @@ -83,6 +95,16 @@ typedef struct S_SwitchDataStruct UINT8 chSwitchIncldeZzjNum; /*道岔对应转辙机数目,设备类型为信号机时,此个数为0*/ UINT8 szSwitchIncldeZzjState[SWITCH_ZZJ_POWER_STATE_MAX_NUM];/*转辙机状态*/ + + UINT32 SwitchOutputDrvCmdCycNum; /*道岔输出驱动命令起始周期*/ + UINT8 mainControlOcId;/*主控OCId*/ + UINT8 chSwitchBelongOcNum;/*道岔所属OC数*/ + SwitchOCDataStr belongOCData[SWITCH_BELONG_OC_MAX];/*道岔所属各OC的状态*/ + + UINT8 PLockedAxisSecNum;/*被防护锁闭的计轴区段id数量,只能在本文件使用*/ + UINT16 PLockedAxisSecIdArr[SWITCH_MAX_PROTECT_LOCKED_NUM];/*被防护锁闭的计轴区段id数组,只能在本文件使用*/ + + } SwitchDataStruct; /*道岔数据结构体*/ @@ -748,7 +770,163 @@ UINT8 GetSwitchThisRoutePLocked(const UINT16 switchId, const UINT16 routeId); * 返回值 : CI_SUCCESS 已经被锁闭或入参不合法,CI_ERROR 未被该保护区段防护锁闭 */ UINT8 GetSwitchThisOverlapPLocked(const UINT16 switchId, const UINT16 overlapId); +/* +* 功能描述: 设置道岔指定OC的控制模式 +* 参数说明: const UINT16 switchId, 道岔ID +* const UINT8 ocId 指定OC +* const UINT8 controlMode 控制模式 +* 返回值 : void +* add by mpt 20260326 +*/ +void SetSwitchThisOcCotrolMode(const UINT16 switchId, const UINT8 ocId, const UINT8 controlMode); +/* +* 功能描述: 获取道岔指定OC的控制模式 +* 参数说明: const UINT16 switchId, 道岔ID +* const UINT8 ocId 指定OC +* 返回值 : 控制模式 +* add by mpt 20260326 +*/ +UINT8 GetSwitchThisOcCotrolMode(const UINT16 switchId, const UINT8 ocId); +/* +* 功能描述: 设置道岔的主控OCID +* 参数说明: const UINT16 switchId, 道岔ID +* const UINT8 ocId 指定OC +* 返回值 : void +* add by mpt 20260326 +*/ +void SetSwitchMainCotrolOCId(const UINT16 switchId, const UINT8 ocId); +/* +* 功能描述: 获取道岔的主控OC +* 参数说明: const UINT16 switchId 道岔ID +* 返回值 : 主控OCId +* add by mpt 20260326 +*/ +UINT8 GetSwitchMainCotrolOCId(const UINT16 switchId); +/* +* 功能描述: 设置道岔指定OC执行电插箱的状态 +* 参数说明: const UINT16 switchId, 道岔ID +* const UINT8 ocId 指定OC +* const UINT8 state 状态 +* 返回值 : void +* add by mpt 20260326 +*/ +void SetSwitchOcPlusBoxSateState(const UINT16 switchId, const UINT8 ocId, const UINT8 state); +/* +* 功能描述: 获取道岔在指定OC中的执行电插箱状态 +* 参数说明: const UINT16 switchId, 道岔ID +* const UINT8 ocId 指定OC +* const UINT8 state 状态 +* 返回值 : > 0道岔指定OC执行电插箱的状态 +* =0 非法状态 +* add by mpt 20260326 +*/ +UINT8 GetSwitchOcPlusBoxSateState(const UINT16 switchId, const UINT8 ocId); +/* +* 功能描述: 设置指定道岔在该OC的转辙机板卡ID的状态 +* 参数说明: const UINT16 switchId 道岔ID +* const UINT8 ocId OCID +* const UINT8 boardId 板卡ID +* UINT8 state 板卡故障状态 +* 返回值 :void +* add by mpt 20260326 +*/ +void SetSwitchThisOCBoardState(const UINT16 switchId, const UINT8 ocId, const UINT8 boardId, const UINT8 state); +/* +* 功能描述: 获取指定道岔在该OC中是否存在某组转辙机板故障 +* 参数说明: const UINT16 switchId 道岔ID +* const UINT8 ocId OCID +* const UINT8 boardId 板卡ID +* UINT8 state 板卡故障状态 +* 返回值 :SWITCH_BOARD_FAULT 故障 +* SWITCH_BOARD_NORMAL 正常 +* add by mpt 20260326 +*/ +UINT8 GetSwitchThisOCBoardState(const UINT16 switchId, const UINT8 ocId); +/* +* 功能描述: 设置道岔指定OC的主控命令 +* 参数说明: const UINT16 switchId, 道岔ID +* const UINT8 ocId 指定OC +* const UINT8 state 状态 +* 返回值 : void +* add by mpt 20260326 +*/ +void SetSwitchThisOcOutControlCmd(const UINT16 switchId, const UINT8 ocId, const UINT8 state); +/* +* 功能描述: 获取道岔指定OC的主控命令 +* 参数说明: const UINT16 switchId, 道岔ID +* const UINT8 ocId 指定OC +* const UINT8 state 状态 +* 返回值 : 0x55 主控 +* 0xaa 备控 +* add by mpt 20260326 +*/ +UINT8 GetSwitchThisOcOutControlCmd(const UINT16 switchId, const UINT8 ocId); +/* +* 功能描述: 设置道岔指定OC的主控命令的设置周期 +* 参数说明: const UINT16 switchId, 道岔ID +* const UINT8 ocId 指定OC +* 返回值 : void +* add by mpt 20260326 +*/ +void SetSwitchOutMainContrCmdCycNum(const UINT16 switchId, const UINT8 ocId, const UINT32 cycnum); +/* +* 功能描述:获取道岔指定OC的主控命令的设置周期 +* 参数说明: const UINT16 switchId, 道岔ID +* const UINT8 ocId 指定OC +* 返回值 : void +* add by mpt 20260326 +*/ +UINT32 GetSwitchOutMainContrCmdCycNum(const UINT16 switchId, const UINT8 ocId); +/* +* 功能描述: 设置道岔驱动命令下发起始周期 +* 参数说明: const UINT16 switchId, 道岔ID +* const UINT32 cycNum 周期号 +* 返回值 : 无 +* add mpt by 20260327 +*/ +void SetSwitchOutputDrvCmdCycNum(const UINT16 switchId, const UINT32 cycNum); +/* +* 功能描述: 获取道岔驱动命令下发起始周期 +* 参数说明: const UINT16 switchId, 道岔ID +* 返回值 : 道岔操作命令起始周期 +* add mpt by 20260327 +*/ +UINT32 GetSwitchOutputDrvCmdCycNum(const UINT16 switchId); +/* +* 功能描述: 设置道岔寻找表示位置 +* 参数说明: const UINT16 switchId, 道岔ID +* const UINT8 ocId OCID +* const UINT8 chFindCmd 寻表命令 +* 返回值 : 无 +* add mpt by 20260327 +*/ +void SetSwitchThisOcFindPostionCmd(const UINT16 switchId, const UINT8 ocId, const UINT8 chFindCmd); +/* +* 功能描述: 获取道岔寻找表示命令 +* 参数说明: const UINT16 switchId, 道岔ID +* const UINT8 ocId OCID +* 返回值 : 道岔寻找表示位置 +* add mpt by 20260327 +*/ +UINT8 GetSwitchThisOcFindPostionCmd(const UINT16 switchId, const UINT8 ocId); +/* +* 功能描述: 获取道岔寻找表示命令起始周期 +* 参数说明: const UINT16 switchId, 道岔ID +* const UINT8 ocId OCID +* 返回值 :道岔寻找表示命令起始周期 +* add mpt by 20260327 +*/ +UINT32 GetSwitchThisOcFindCmdCycNum(const UINT16 switchId, const UINT8 ocId); +/* +* 功能描述: 设置道岔寻找表示命令起始周期 +* 参数说明: const UINT16 switchId, 道岔ID +* const UINT8 ocId OCID +* UINT32 cycNum 周期号 +* 返回值 :void +* add mpt by 20260402 +*/ +void SetSwitchThisOcFindCmdCycNum(const UINT16 switchId, const UINT8 ocId, const UINT32 cycNum); #ifdef __cplusplus } #endif diff --git a/TSCP/src/APP/ciapp/Switch/SwitchDefine.h b/TSCP/src/APP/ciapp/Switch/SwitchDefine.h index e249e95..d143ac3 100644 --- a/TSCP/src/APP/ciapp/Switch/SwitchDefine.h +++ b/TSCP/src/APP/ciapp/Switch/SwitchDefine.h @@ -74,6 +74,9 @@ #define OC_SWITCH_DRIVE_POS_DINGWEI ((UINT16)0x5555) /*道岔驱动定位*/ #define OC_SWITCH_DRIVE_POS_FANWEI ((UINT16)0xaaaa) /*道岔驱动反位*/ #define OC_SWITCH_DRIVE_POS_KEEP ((UINT16)0x55aa) /*道岔驱动位置保持*/ +#define OC_SWITCH_FIND_DINGWEI ((UINT16)0x555f) /*道岔寻定*/ +#define OC_SWITCH_FIND_FANWEI ((UINT16)0xaaaf) /*道岔寻反*/ +#define OC_SWITCH_ININ_FIAND ((UINT16)0x5faf) /*道岔初始寻*/ #define OC_SWITCH_OTHER_BJ_STATE ((UINT8)0xf6) /*OC转辙机其他报警(除了封连、开盖)状态(板卡状态)*/ #define OC_SWITCH_OPEN_CAP_STATE ((UINT8)0x01) /*OC转辙机开盖状态(板卡状态)*/ @@ -96,8 +99,6 @@ #define SWITCH_KERAO_STATE_NO ((UINT8)0xAA) /*道岔可绕*/ /* zt 删除单轨相关代码 2022-02-15 */ -#define SWITCH_LAST_DRV_STAY_MAX_NUM ((UINT8)10) /*道岔最近一次有效驱动位置延续最大周期数*/ - #define SWITCH_MOVE_FAIL (UINT8)0x55 /*道岔移动失败*/ #define SWITCH_USING_NORMAL (UINT8)0xaa /*道岔移动正常*/ @@ -109,6 +110,7 @@ #define SWITCH_PLOCKTYPE_NONROUTE ((UINT8)0x4) /*被非进路防护锁闭*/ #define SWITCH_PLOCKTYPE_NOROUTE_NOOVERLAP_NONONROUTE ((UINT8)0x5) /*解除道岔防护锁闭*/ #define SWITCH_PLOCKTYPE_LOGROUTE ((UINT8)0x6) /*被逻辑进路防护锁闭*/ +#define SWITCH_PLOCKTYPE_AXISSEC ((UINT8)0x7) /*被计轴区段防护锁闭*/ #define SWITCH_OPER_NO_DANCAO ((UINT8)0x55) /*非单操操作:进路锁闭、保护区段锁闭、非进路锁闭、自动进路办理*/ #define SWITCH_OPER_DANCAO ((UINT8)0xaa) /*单操操作*/ @@ -147,5 +149,28 @@ #define SWITCH_ZZJ_POWER_STATE_MAX_NUM 5U /*道岔转辙机标识灯状态最大数*/ +#define MAX_OC_SWITCH_INCLUDE_BOARD_NUM ((UINT8)10) /*一个道岔支持最大板卡数量(不可达最大值)*/ + +#define SWITCH_BOX_NUM 10U /*单个OC插箱最大数*/ + + +#define SWITCH_BELONG_OC_MAX 2U /*道岔所属OC最多数*/ + +#define MAIN_CONTROL 0x55U /*主控*/ +#define STANDBY_CONTROL 0xAAU /*备控*/ +#define NO_CONTROL_FUN 0x00U /*无此功能*/ +#define ERR_MODE_CONTROL 0xCCU /*异常控制模式,部分主控部分备控,或OC没有全所有板卡*/ + + +#define SWITCH_BOX_NORMAL ((UINT8)0x55) /*转辙机执行电表示电均表示正常*/ +#define SWITCH_BOX_FAULT ((UINT8)0xAA) /*转辙机存在执行电熔丝或表示电熔丝报警*/ + +#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) /*无寻位置指令*/ #endif diff --git a/TSCP/src/APP/ciapp/System/SystemConfigDefine.h b/TSCP/src/APP/ciapp/System/SystemConfigDefine.h index 695a462..05ca236 100644 --- a/TSCP/src/APP/ciapp/System/SystemConfigDefine.h +++ b/TSCP/src/APP/ciapp/System/SystemConfigDefine.h @@ -62,7 +62,7 @@ #define VER_MAIN_SUBCI_CI_CID ((UINT8)25) /*子系统主版本号*/ #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)0) /*子系统回归版本号*/ +#define VER_RETURN_SUBCI_CI_CID ((UINT8)2) /*子系统回归版本号*/ #ifdef SCADE_MODE /*SCADE软件版本号*/ @@ -76,20 +76,20 @@ #define VER_SOFT_PRODUCT ((UINT8)40) /*产品编号*/ #define VER_SOFT_MODUAL_APP ((UINT8)1) /*模块编号*/ #define VER_SOFT_MIANVERSION ((UINT8)25) /*主版本号*/ -#define VER_SOFT_SUBVERSION ((UINT8)1) /*子版本号*/ +#define VER_SOFT_SUBVERSION ((UINT8)3) /*子版本号*/ #endif /*可兼容的公共数据结构版本号*/ #define VER_1_PUBLIC_FS_1 ((UINT8)31) -#define VER_1_PUBLIC_FS_2 ((UINT8)4) +#define VER_1_PUBLIC_FS_2 ((UINT8)5) #define VER_1_PUBLIC_FS_3 ((UINT8)0) #define VER_1_PUBLIC_FS_4 ((UINT8)0) -#define VER_2_PUBLIC_FS_1 ((UINT8)0) -#define VER_2_PUBLIC_FS_2 ((UINT8)0) -#define VER_2_PUBLIC_FS_3 ((UINT8)0) -#define VER_2_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_3_PUBLIC_FS_1 ((UINT8)28) #define VER_3_PUBLIC_FS_2 ((UINT8)0) @@ -98,7 +98,7 @@ /*可兼容的私有数据结构版本号*/ -#define VER_1_PRIVATE_FS_1 ((UINT8)49) +#define VER_1_PRIVATE_FS_1 ((UINT8)50) #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)36) /*oc 3.0 较新数据版本*/ +#define VER_1_OCDATA_FS_1 ((UINT8)37) /*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 11a725c..0f90313 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; /*本联锁轨旁继电器接口类型*/ + +static UINT8 OCSswitch = 0u; /*OC-S开关*/ /* RC合并新增,用于区分TIOC功能或者联锁联锁 */ UINT8 CI_SYSTEM_TYPE_RCI = 0u; /*工作模式:0x3C-CI,0x3D-RC*/ static UINT8 gLocalRcLinkLineAttr = 0u; /* RC联络线属性 */ @@ -120,6 +122,10 @@ UINT32 wJXTCStopDetectTime = 0U; /* 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系统上一次驱动道岔有效时间*/ /* * 功能描述: 系统参数时间转周期数 * 参数说明: void @@ -342,6 +348,17 @@ void SystemParaTimeToCycleCount(void) paraVal = GetSystemParaValue(JXTC_STOP_DETECTION_TIME); wJXTCStopDetectTime = TimeToCycleCount((UINT32)paraVal * 1000U, appCycleTime); /*JXTC停止检测时间(s)*/ + + + paraVal = GetSystemParaValue(SWITCH_MACHINE_CUT_INTERVAL); + wSwitchMachineCutInterval = TimeToCycleCount((UINT32)paraVal * 1000U, appCycleTime); /*RC/CI系统控制转辙机板主控切换间隔时间(单位:S)*/ + + + paraVal = GetSystemParaValue(SWITCH_MACHINE_CUT_DRV_INTERVAL); + wSwitchMachineDrvingCutInterval = TimeToCycleCount((UINT32)paraVal * 1000U, appCycleTime); /*RC/CI系统驱动道岔后控制转辙机板主控切换时间(单位:S)*/ + + paraVal = GetSystemParaValue(SWITCH_LAST_DRV_TIME); + wSwitchLastDrvValidTime = TimeToCycleCount((UINT32)paraVal * 1000U, appCycleTime); /*RC/CI系统上一次驱动道岔有效时间*/ } /* @@ -1340,20 +1357,22 @@ UINT8 CheckTiocPublicFsVersion(UINT8* pSrcFsVersion) if (NULL != pSrcFsVersion) { - SetLocalPublicDataType(DATA_TYPE_NEW); - /*查询公共数据结构版本号是否属于可兼容的版本 - 28.0.0.14及其升级版本只支持配置到第三个兼容数据结构 VER_3_PUBLIC*/ + SetLocalPublicDataType(DATA_TYPE_MAIN_BRANCH); + /*查询公共数据结构版本号是否属于可兼容的版本 */ + /*28.0.0.14及其升级版本只支持配置到第三个兼容数据结构 VER_3_PUBLIC*/ + /*23.2.1.4 及其升级版本只支持配置到第二个兼容数据结构 VER_2_PUBLIC */ if ((VER_1_PUBLIC_FS_1 == pSrcFsVersion[0]) && (VER_1_PUBLIC_FS_2 == pSrcFsVersion[1]) && (VER_1_PUBLIC_FS_3 == pSrcFsVersion[2]) && (VER_1_PUBLIC_FS_4 == pSrcFsVersion[3])) { retVal = CI_SUCCESS; } else if ((VER_2_PUBLIC_FS_1 == pSrcFsVersion[0]) && (VER_2_PUBLIC_FS_2 == pSrcFsVersion[1]) && (VER_2_PUBLIC_FS_3 == pSrcFsVersion[2]) && (VER_2_PUBLIC_FS_4 == pSrcFsVersion[3])) { + SetLocalPublicDataType(DATA_TYPE_23_BRANCH); retVal = CI_SUCCESS; } else if ((VER_3_PUBLIC_FS_1 == pSrcFsVersion[0]) && (VER_3_PUBLIC_FS_2 == pSrcFsVersion[1]) && (VER_3_PUBLIC_FS_3 == pSrcFsVersion[2]) && (VER_3_PUBLIC_FS_4 == pSrcFsVersion[3])) { - SetLocalPublicDataType(DATA_TYPE_OLD); + SetLocalPublicDataType(DATA_TYPE_28_BRANCH); retVal = CI_SUCCESS; } else @@ -1421,11 +1440,11 @@ UINT8 CheckTiocOcFsVersion(UINT8* pSrcFsVersion) /*查询OC数据结构版本号是否属于可兼容的版本*/ if ((VER_1_OCDATA_FS_1 == pSrcFsVersion[0]) && (VER_1_OCDATA_FS_2 == pSrcFsVersion[1])) { - retVal = SetLocalOcPattern(DATA_TYPE_NEW); + retVal = CI_SUCCESS; } else if ((VER_2_OCDATA_FS_1 == pSrcFsVersion[0]) && (VER_2_OCDATA_FS_2 == pSrcFsVersion[1])) { - retVal = SetLocalOcPattern(DATA_TYPE_OLD); + retVal = CI_SUCCESS; } else { @@ -2426,6 +2445,55 @@ UINT16 GetTiocSystemParameterData(UINT32* pConfigDataAdderBuf, UINT16* pConfigDa { ;/* 无处理 */ } + /* OC-S开关 */ + wTmpLen = 1u + wTmpConfigDataSum; + if (wBufMaxLen >= wTmpLen) + { + pConfigDataAdderBuf[wTmpConfigDataSum] = &OCSswitch; + pConfigDataLenBuf[wTmpConfigDataSum] = (UINT16)sizeof(UINT8); + wTmpConfigDataSum++; + } + else + { + ;/* 无处理 */ + } + + /* RC/CI系统控制转辙机板主控切换间隔时间(单位:S) */ + wTmpLen = 1u + wTmpConfigDataSum; + if (wBufMaxLen >= wTmpLen) + { + pConfigDataAdderBuf[wTmpConfigDataSum] = &wSwitchMachineCutInterval; + pConfigDataLenBuf[wTmpConfigDataSum] = (UINT16)sizeof(UINT32); + wTmpConfigDataSum++; + } + else + { + ;/* 无处理 */ + } + /* RC/CI系统驱动道岔后控制转辙机板主控切换时间(单位:S) */ + wTmpLen = 1u + wTmpConfigDataSum; + if (wBufMaxLen >= wTmpLen) + { + pConfigDataAdderBuf[wTmpConfigDataSum] = &wSwitchMachineDrvingCutInterval; + pConfigDataLenBuf[wTmpConfigDataSum] = (UINT16)sizeof(UINT32); + wTmpConfigDataSum++; + } + else + { + ;/* 无处理 */ + } + /* RC/CI系统上一次驱动道岔有效时间*/ + wTmpLen = 1u + wTmpConfigDataSum; + if (wBufMaxLen >= wTmpLen) + { + pConfigDataAdderBuf[wTmpConfigDataSum] = &wSwitchLastDrvValidTime; + pConfigDataLenBuf[wTmpConfigDataSum] = (UINT16)sizeof(UINT32); + wTmpConfigDataSum++; + } + else + { + ;/* 无处理 */ + } } else @@ -2880,24 +2948,7 @@ UINT32 GetdwNonReturnBtnErrEnsureCount(void) return dwNonReturnBtnErrEnsureTime; } -/* -* 设置本联锁OC版本 -* 参数说明:OC版本 -* 返回值:成功 CI_SUCCESS 失败CI_ERROR -* Create: fan 20250210 -*/ -UINT8 SetLocalOcPattern(UINT8 localOcPattern) -{ - UINT8 rtn = CI_ERROR; /*返回值*/ - if ((DATA_TYPE_NEW == localOcPattern) || (DATA_TYPE_OLD == localOcPattern)) - { - gLocalOcType = localOcPattern; - rtn = CI_SUCCESS; - } - - return rtn; -} #if 0 /* * 获取本联锁OC版本 -----暂无适配兼容需求 屏蔽代码 @@ -2952,7 +3003,7 @@ UINT8 GetLocalRcLinkLineAttr(void) */ void SetLocalPublicDataType(UINT8 localPublicData) { - if ((DATA_TYPE_NEW == localPublicData) || (DATA_TYPE_OLD == localPublicData)) + if ((DATA_TYPE_MAIN_BRANCH == localPublicData) || (DATA_TYPE_28_BRANCH == localPublicData) || (DATA_TYPE_23_BRANCH == localPublicData)) { gLocalPublicDataType = localPublicData; } @@ -2961,7 +3012,9 @@ void SetLocalPublicDataType(UINT8 localPublicData) /* * 获取当前公共数据版本类型 * 参数说明:无 -* 返回值:0x55 较新版本 0xaa 较旧版本 +* 返回值:0x01 主线版本 + 0x02 28.0.0.x版本 + 0x03 23.2.1.x版本 * Create: fan 20250521 */ UINT8 GetLocalPublicDataType(void) @@ -3216,3 +3269,59 @@ void SetCiFunctionSwitchConfig(UINT8 chFunctionConfigIndex,UINT8 chSwitchVal) } } +/* +* 功能描述:获取RC/CI系统控制转辙机板主控切换间隔时间(单位:S) +* 参数说明:无 +* 返回值:RC/CI系统控制转辙机板主控切换间隔时间(单位:S) +* by mpt 20260324 +*/ +UINT32 GetSwitchMachineCutInterval(void) +{ + return wSwitchMachineCutInterval; +} +/* +* 功能描述:获取RC/CI系统驱动道岔后控制转辙机板主控切换时间(单位:S) +* 参数说明:无 +* 返回值:RC/CI系统驱动道岔后控制转辙机板主控切换时间(单位:S) +* by mpt 20260324 +*/ +UINT32 GetSwitchMachineDrvCutInterval(void) +{ + return wSwitchMachineDrvingCutInterval; +} +/* +* 功能描述:获取RC/CI系统上一次驱动道岔有效时间 +* 参数说明:无 +* 返回值:RC/CI系统上一次驱动道岔有效时间 +* by mpt 20260324 +*/ +UINT32 GetSwitchLastDrvValidTime(void) +{ + return wSwitchLastDrvValidTime; +} +/* +* 设置本联锁OCS开关 +* 参数说明:支持OC-S开关 +* 返回值:是否设置成功 +*/ +UINT8 SetLocalCiOCSswitch(UINT8 funSwitch) +{ + UINT8 rtn = 0u; /*返回值*/ + + if ((OC_S_ON == funSwitch) || (OC_S_OFF == funSwitch)) + { + OCSswitch = funSwitch; + rtn = 1u; + } + + return rtn; +} +/* +* 设置本联锁OCS开关 +* 参数说明:void +* 返回值:本联锁OCS开关 +*/ +UINT8 GetLocalCiOCSswitch(void) +{ + return OCSswitch; +} diff --git a/TSCP/src/APP/ciapp/System/SystemParameterManage.h b/TSCP/src/APP/ciapp/System/SystemParameterManage.h index b4ce62a..150e918 100644 --- a/TSCP/src/APP/ciapp/System/SystemParameterManage.h +++ b/TSCP/src/APP/ciapp/System/SystemParameterManage.h @@ -84,7 +84,7 @@ extern "C" { #define FUNC_DA_SWITCH ((UINT8)48) /*脱轨防护功能开关(0x55:不支持;0xaa:支持)*/ #define FUNC_OC_100_OR_200 ((UINT8)49) /*执行单元使用类型(0x55:OC-100;0xaa:OC-200)*/ #define FUNC_OC_200_INOUTNET ((UINT8)50) /*OC通信使用内外网配置(0x55:外网;0xaa:内网)*/ -#define FUNC_ZIFUSHI_BUTTON ((UINT8)51) /*按钮是否为自复式(0x55:非自复式;0xaa:自复式)*/ +#define FUNC_ZIFUSHI_BUTTON ((UINT8)51) /*按钮是否为自复式(0x55:非自复式;0xaa:自复式;0x5A:宁象市域铁路)*/ #define FUNC_JIZHONGQU_LINSHIXIASNSU_FLAG ((UINT8)52) /*与ZC通信中断后,是否设置集中区临时限速(0x55:设置;0xaa:不设置)*/ #define FUNC_REPEATE_OPEN_CHECK_SPKS ((UINT8)53) /*点式进路重开信号是否检查SPKS状态,(0x55:检查,点式不重开;0xaa:不检查,可重开)*/ #define FUNC_SWITCH_SHIBIAO_PROMPTLY_ALARM ((UINT8)54) /*道岔失表是否立即向ATS报警(0XAA:立即报警 0X55:等待时间超限报警)*/ @@ -107,6 +107,7 @@ extern "C" { #define FUNC_WDOWNWASH_ZIFUSHI_BUTTON ((UINT8)72) /*降级模式洗车同意按钮是否为自复式(0X55非自复式、0XAA自复式)*/ #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 CiSum_ID ((UINT16)1)/*实际联锁集中站数量 编号*/ @@ -186,7 +187,9 @@ extern "C" { #define JXTCJXTC_MUTUALLOCK_FAULT_TIME (75U) /*间隙探测旁路按钮故障判断时间(s)*/ #define JXTC_STOP_DETECTION_TIME (76U) /*JXTC停止检测时间(s)*/ - +#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 FUNC_SWITCH_ON ((UINT8)0xAA) /*功能配置开关打开*/ #define FUNC_SWITCH_OFF ((UINT8)0x55) /*功能配置开关关闭*/ @@ -218,7 +221,7 @@ extern "C" { #define Oc_Max_Board_Num (57U) /*属于一个OC的最大板卡数目(上层8块+其他3层*16块=56块)*/ #define CI_SIGNAL_MAX ((UINT16)300) /*属于一个CI的最大信号机的数目*/ -#define CI_SWITCH_MAX ((UINT16)100) /*属于一个CI的最大道岔的数目*/ +#define CI_SWITCH_MAX ((UINT16)200) /*属于一个CI的最大道岔的数目*/ #define CI_GD_MAX ((UINT16)700) /*轨道区段最大数量*/ #define RC_WORK_MODE_CI ((UINT8)0x3Cu) /*联锁工作模式*/ @@ -242,8 +245,10 @@ extern "C" { #define FUNC_OVERLAP_LOCK_BY_ATS ((UINT8)0x01) /*ATS锁闭保护区段*/ #define FUNC_OVERLAP_LOCK_BY_CI ((UINT8)0x02) /*联锁自行锁闭保护区段*/ -#define DATA_TYPE_NEW ((UINT8)0x55u) /*最新数据结构__OC3.2 数据结构及新公共数据结构30.X*/ -#define DATA_TYPE_OLD ((UINT8)0xAAu) /*兼容的老OC数据结构_或杭德数据结构28.0.0.X*/ +#define DATA_TYPE_MAIN_BRANCH ((UINT8)0x01U) /*公共数据结构--主线--30.X*/ +#define DATA_TYPE_28_BRANCH ((UINT8)0x02U) /*公共数据结构--杭德数据结构-28.0.0.X*/ +#define DATA_TYPE_23_BRANCH ((UINT8)0x03U) /*公共数据结构--厦门3数据结构23.2.1.X*/ + #define OC200_VER2_1_9 ((UINT8)0x01u)/*功能开关7配置为1,OC200 2.1.9接口*/ #define OC200_VER3_2 ((UINT8)0x02u)/*功能开关7配置为2,OC200 3.2接口*/ @@ -254,6 +259,9 @@ 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_OFF ((UINT8)0x55) /*不支持OC-S*/ + /*系统参数结构体*/ typedef struct S_SystemParameterStruct { @@ -364,25 +372,14 @@ typedef struct S_SystemParaStruct UINT32 CiAndPscTransmitBadEnsureTime ; /**********适配最新系统配置数据****************/ - UINT16 MaxLineLimitSpeed;/*线路最高限速,此处数据库中存放的是UINT8的km/h数据,需要在这里转换成cmps单位的数据*/ UINT8 MaxTsrSpeed;/*临时限速最高限速*/ - UINT8 TimeZoneDifference;/*NTP校时时区差.格林威治时间与本地时间的时区差,单位:时区,应用使用时应乘以3600转换为秒。*/ - UINT16 MABackDistance;/*安全防护距离.考虑到最不利情况情况下(最大潜在退行距离和线路最大坡度等)移动授权考虑的安全防护距离*/ UINT16 MaxTsrNum;/*一次设置临时限速的最大个数*/ UINT16 MaxSectionOfTsr;/*一个临时限速报文中包含的最大逻辑区段数量*/ - UINT32 IvocIvocCommunicationErrorTime;/*IVOC-IVOC信故障判断时间(ms),add by yt,2022年3月1日,适配车车系统配置数据*/ UINT32 IvocOcCommunicationErrorTime;/*IVOC-OC通信故障判断时间(ms),add by yt,2022年3月1日,适配车车系统配置数据*/ - UINT32 TmcItsCommunicationErrorTime;/*TMC-ITS通信故障判断时间(ms),add by yt,2022年3月1日,适配车车系统配置数据*/ UINT32 TmcOcCommunicationErrorTime;/*TMC-OC通信故障判断时间(ms),add by yt,2022年3月1日,适配车车系统配置数据*/ - UINT32 ItsOcCommunicationErrorTime;/*ITS-OC通信故障判断时间(ms),add by yt,2022年3月1日,适配车车系统配置数据*/ - UINT32 OcPsdCommunicationErrorTime;/*OC-PSD通信故障判断时间(ms),add by yt,2022年3月1日,适配车车系统配置数据*/ - UINT32 IvocTslCommunicationErrorTime;/*IVOC-TSL通信故障判断时间(ms),add by yt,2022年3月1日,适配车车系统配置数据*/ UINT32 OcTslCommunicationErrorTime;/*OC-TSL通信故障判断时间(ms),add by yt,2022年3月1日,适配车车系统配置数据*/ - UINT16 MALengthForATOParking; /*满足ATO精准停车条件的MA长度,add by yt,2022年3月1日,适配车车系统配置数据*/ UINT8 LinkLogicDirUpAndDown; /*系统定义逻辑方向与上下行方向的关系,add by yt,2022年3月1日,适配车车系统配置数据*/ - UINT16 OppositeTrackDistance; /*对向行驶双车间隔最小安全距离(cm),add by yt,2022年3月1日,适配车车系统配置数据*/ UINT32 MaxMALength; /*线路最差情况下紧急制动距离(单位m),add by yt,2022年3月1日,适配车车系统配置数据*/ - UINT32 VobcAtsCommunicationErrorTime;/*VOBCATS通信故障判断时间*/ UINT32 dwLineMinTrainLength; /*系统配置数据,线路最小车长*/ UINT8 chZXDynamicTestSwitch; /*正线是否支持动态测试,55 关闭,AA打开 配置中 aa关闭 55打开*/ UINT8 chDynamicTestSwitch; /*是否支持动态测试开关,55 关闭,AA打开 配置中 aa关闭 55打开*/ @@ -508,6 +505,7 @@ extern UINT32 gSystemUpdateMainUseCycNum; /*系统 extern UINT8 localBackUpFlag; /*本机备用/主用模式 原共享内存主备系区分标志*/ extern UINT32 dwDownWashWaitAcceptTime; /*降级模式洗车等待值班员同意最大时间(S)*/ extern UINT32 LineMinTrainLength; /*系统配置数据,线路最小车长*/ +extern UINT32 wJXTCStopDetectTime; /*间隙探测停止检测时间(s)*/ /* * 功能描述: 系统参数时间转周期数 * 参数说明: void @@ -1384,13 +1382,6 @@ UINT32 GetArbProtectCheckTime(void); */ UINT32 GetdwNonReturnBtnErrEnsureCount(void); -/* -* 设置本联锁OC版本 -* 参数说明:OC版本 -* 返回值:成功 CI_SUCCESS 失败CI_ERROR -* Create: fan 20250210 -*/ -UINT8 SetLocalOcPattern(UINT8 localOcPattern); #if 0 /* * 获取本联锁OC版本-----暂无适配OC兼容需求 屏蔽代码 @@ -1427,7 +1418,9 @@ void SetLocalPublicDataType(UINT8 localPublicData); /* * 获取当前公共数据版本类型 * 参数说明:无 -* 返回值:0x55 较新版本 0xaa 较旧版本 +* 返回值:0x01 主线版本 + 0x02 28.0.0.x版本 + 0x03 23.2.1.x版本 * Create: fan 20250521 */ UINT8 GetLocalPublicDataType(void); @@ -1543,6 +1536,40 @@ UINT8 GetCldAndScxMergeFlag(void); */ void SetCiFunctionSwitchConfig(UINT8 chFunctionConfigIndex, UINT8 chSwitchVal); +/* +* 功能描述:获取RC/CI系统控制转辙机板主控切换间隔时间(单位:S) +* 参数说明:无 +* 返回值:RC/CI系统控制转辙机板主控切换间隔时间(单位:S) +* by mpt 20260324 +*/ +UINT32 GetSwitchMachineCutInterval(void); +/* +* 功能描述:获取RC/CI系统驱动道岔后控制转辙机板主控切换时间(单位:S) +* 参数说明:无 +* 返回值:RC/CI系统驱动道岔后控制转辙机板主控切换时间(单位:S) +* by mpt 20260324 +*/ +UINT32 GetSwitchMachineDrvCutInterval(void); +/* +* 功能描述:获取RC/CI系统上一次驱动道岔有效时间 +* 参数说明:无 +* 返回值:RC/CI系统上一次驱动道岔有效时间 +* by mpt 20260324 +*/ +UINT32 GetSwitchLastDrvValidTime(void); +/* +* 设置本联锁OCS开关 +* 参数说明:支持OC-S开关 +* 返回值:是否设置成功 +*/ +UINT8 SetLocalCiOCSswitch(UINT8 funSwitch); +/* +* 设置本联锁OCS开关 +* 参数说明:void +* 返回值:本联锁OCS开关 +*/ +UINT8 GetLocalCiOCSswitch(void); + #ifdef __cplusplus } #endif diff --git a/TSCP/src/APP/ciapp/Train/TrainDataManage.c b/TSCP/src/APP/ciapp/Train/TrainDataManage.c index b257b24..7465ff8 100644 --- a/TSCP/src/APP/ciapp/Train/TrainDataManage.c +++ b/TSCP/src/APP/ciapp/Train/TrainDataManage.c @@ -15,6 +15,7 @@ #include "WLBrakeDataManage.h" #include "SectionStateProcess_define.h" #include "AxisSort_api.h" +#include "../ParsePack/ParsePackZcData.h" TrainInfoStru gstTrainInfo[TRAIN_SUM_MAX] = { 0 }; UINT16 gszTrainId[TRAIN_SUM_MAX] = { 0U }; @@ -192,6 +193,30 @@ const UINT8 chFlag * note:休眠车包络不可转为UCT */ static void SetTrainCanUct(const UINT16 wTrainId, const UINT8 chFlag); +/* +* 功能描述:导入位置信息函数 +* 参数说明: const UINT16 wTrainId, 列车ID +* const UINT8 chInputFlag 导入标志 +* 返回值 : 无 +*/ +static void ImportLocationData(const UINT16 wTrainId, const UINT8 chInputFlag); +/* +* 功能描述:双车通信状态处理 +* 参数说明: const UINT16 wTrainId, 列车ID +* const UINT8 chComBadFlag 通信中断标志 +* 返回值 : 无 +*/ +static void DoubleTrianComStateJuge(const UINT16 wTrainId, const UINT8 chComBadFlag); + +/** +* @brief 获取列车最小安全车头(资源计算用) +* @param UINT16 wTrainId 列车ID +* @param UINT16 wRouteId 进路ID +* @param struct_PathPoint *pMinHead 最小安全车头 +* @return 无 +*/ +static void GetTrainCrossMinHead(UINT16 wTrainId, UINT16 wRouteId, struct_PathPoint *pMinHead); + /*================================================================================== *函数功能:初始化列车信息结构体。 *函数描述:该函数实现列车信息结构体的初始化。 @@ -304,6 +329,8 @@ UINT8 TrainDataModuleInit(void) /*清空所有的后备列车ABL信息结构体*/ (void)CommonMemSet((void*)&gstTrainInfo[chCycle].strAblTrainNeedData, (UINT32)sizeof(ABLTrainInfoStru), 0U, (UINT32)sizeof(ABLTrainInfoStru)); + /*清空所有列车点连式信息结构体*/ + (void)CommonMemSet((void*)&gstTrainInfo[chCycle].strBlocLinkData, (UINT32)sizeof(BlocLinkInfoStru), 0U, (UINT32)sizeof(BlocLinkInfoStru)); gstTrainInfo[chCycle].wTrainHeadSigId = 0U; gstTrainInfo[chCycle].wTrainHeadTrainId = TRAIN_ID_INVAL; gstTrainInfo[chCycle].chTrainLocReverseRouteFlag = TRAIN_LOC_REV_ROUTE_FLAG_NONE; @@ -1631,6 +1658,105 @@ UINT8 SetTrainSafeHeadDir(const UINT16 wTrainId, const UINT8 chDir) return chRetVal; } +/* +* 功能描述: 获取指定列车最小安全车头所处link +* 参数说明: const UINT16 wTrainId, 列车ID +* 返回值 :安全车头所处link +* 创建 : 2026.3.27 +*/ +UINT16 GetTrainMinSafeHeadLink(const UINT16 wTrainId) +{ + UINT16 wRetVal = UINT16_MAX; + UINT16 wBufIndex = 0U; + + wBufIndex = GetTrainBufIndex(wTrainId); + if (TRAIN_SUM_MAX > wBufIndex) + { + wRetVal = gstTrainInfo[wBufIndex].wMinSafeHeadLink; + } + else + { + wRetVal = UINT16_MAX; + } + + return wRetVal; +} + +/* +* 功能描述: 获取指定列车最小安全车头所处link偏移量 +* 参数说明: const UINT16 wTrainId, 列车ID +* 返回值 :安全车头所处link偏移量 +* 创建 : 2026.3.27 +*/ +UINT32 GetTrainMinSafeHeadOffset(const UINT16 wTrainId) +{ + UINT32 dwRetVal = UINT32_MAX; + UINT16 wBufIndex = 0U; + + wBufIndex = GetTrainBufIndex(wTrainId); + if (TRAIN_SUM_MAX > wBufIndex) + { + dwRetVal = gstTrainInfo[wBufIndex].dwMinSafeHeadOffset; + } + else + { + dwRetVal = UINT32_MAX; + } + + return dwRetVal; +} + +/* +* 功能描述: 获取指定列车最小安全车头方向 +* 参数说明: const UINT16 wTrainId, 列车ID +* 返回值 :安全车头方向 +* 创建 : 2026.3.27 +*/ +UINT8 GetTrainMinSafeHeadDir(const UINT16 wTrainId) +{ + UINT8 chRetVal = UINT8_MAX; + UINT16 wBufIndex = 0U; + + wBufIndex = GetTrainBufIndex(wTrainId); + if (TRAIN_SUM_MAX > wBufIndex) + { + chRetVal = gstTrainInfo[wBufIndex].chMinSafeHeadDir; + } + else + { + chRetVal = UINT8_MAX; + } + + return chRetVal; +} + +/* +* 功能描述:设置指定列车最小安全车头位置 +* 参数说明:const UINT16 wTrainId, 列车ID +* const UINT16 wLinkId +* const UINT16 dwLinkOffset +* const UINT16 chDir +* 返回值 :CI_ERROR: 设置数据失败 +* CI_SUCCESS:设置数据成功 +* 创建 : 2026.3.27 +*/ +void SetTrainMinSafeHead(const UINT16 wTrainId, const UINT16 wLinkId, const UINT32 dwLinkOffset, const UINT8 chDir) +{ + UINT16 wBufIndex = 0U; + + wBufIndex = GetTrainBufIndex(wTrainId); + if (TRAIN_SUM_MAX > wBufIndex) + { + gstTrainInfo[wBufIndex].wMinSafeHeadLink = wLinkId; + gstTrainInfo[wBufIndex].dwMinSafeHeadOffset = dwLinkOffset; + gstTrainInfo[wBufIndex].chMinSafeHeadDir = chDir; + } + else + { + /*不处理*/ + } +} + /* * 功能描述: 设置指定列车安全车头所处link * 参数说明: const UINT16 wTrainId, 列车ID @@ -2300,8 +2426,11 @@ void UpdateVbtcTrainSafePos(UINT8 rtnValue, UINT16 trainID, TrainSafeLocStru *te */ static void CalHeadTrainSafePosFromUnSafe(UINT16 wTrainId, UINT32 dwHeadDistance, UINT8 chDir) { - UINT16 wTrainHeadLink = 0u; /*列车车头LINK*/ + UINT16 wTrainHeadLink = 0u; /*列车车头LINK*/ UINT32 dwTrainHeadOffset = 0u; /*列车车头LINK偏移量*/ + UINT16 wTrainMinHeadLink = 0u; /*列车最小车头LINK*/ + UINT32 dwTrainMinHeadOffset = 0u; /*列车最小车头LINK偏移量*/ + UINT8 chMinHeadDir = 0u; /*列车最小车头方向*/ UINT16 wSwitchId = 0u; UINT8 chFunRtn = 0u; /*安全位置计算返回值*/ TrainSafeLocStru Temp_TrainSafeLoc; /*列车安全位置结构体*/ @@ -2320,7 +2449,7 @@ static void CalHeadTrainSafePosFromUnSafe(UINT16 wTrainId, UINT32 dwHeadDistance UINT8 changePNum = 0U; /*清空结构体*/ - (void)memset(&Temp_TrainSafeLoc, 0x00, sizeof(TrainSafeLocStru)); + (void)CommonMemSet(&Temp_TrainSafeLoc, sizeof(TrainSafeLocStru), 0x00u, sizeof(TrainSafeLocStru)); wTrainHeadLink = GetTrainMaxHeadLink(wTrainId); dwTrainHeadOffset = GetTrainMaxHeadOffset(wTrainId); chNvramPosFlag = GetTrainNvramPosFlag(wTrainId); @@ -2421,6 +2550,29 @@ static void CalHeadTrainSafePosFromUnSafe(UINT16 wTrainId, UINT32 dwHeadDistance ClearTrainSafeHeadDir(wTrainId); } } + + /*获取小前位置*/ + wTrainMinHeadLink = GetTrainMinHeadLink(wTrainId); + dwTrainMinHeadOffset = GetTrainMinHeadOffset(wTrainId); + chMinHeadDir = GetTrainDir_MinHead(wTrainId); + wSwitchId = UINT16_MAX; + (void)CommonMemSet(&Temp_TrainSafeLoc, sizeof(TrainSafeLocStru), 0x00u, sizeof(TrainSafeLocStru)); + + /*计算小前安全位置*/ + chFunRtn = CalTrainSafeLoc(FINDHEADSAFEFLAG, CALSAFEPOSFLAG, wTrainMinHeadLink, + dwTrainMinHeadOffset, dwHeadDistance, chMinHeadDir, &wSwitchId, &Temp_TrainSafeLoc); + /*安全位置查询成功*/ + if ((3u == chFunRtn) || (1u == chFunRtn) || (2u == chFunRtn)) + { + SetTrainMinSafeHead(wTrainId, Temp_TrainSafeLoc.wHeadLink, + Temp_TrainSafeLoc.dwHeadOffset, Temp_TrainSafeLoc.chHeadDir); + } + else + { + /*安全位置查询失败*/ + SetTrainMinSafeHead(wTrainId, 0u, UINT32_MAX, 0u); + } + (void)SetTrainSafeHeadFlag(wTrainId); } @@ -2838,6 +2990,9 @@ void ClearTrainInfo(UINT16 wTrainId) /*清空所有的后备列车ABL信息结构体*/ (void)CommonMemSet((void*)&gstTrainInfo[wBufIndex].strAblTrainNeedData, (UINT32)sizeof(ABLTrainInfoStru), 0U, (UINT32)sizeof(ABLTrainInfoStru)); + /*清空所有列车点连式信息结构体*/ + (void)CommonMemSet((void*)&gstTrainInfo[wBufIndex].strBlocLinkData, (UINT32)sizeof(BlocLinkInfoStru), 0U, (UINT32)sizeof(BlocLinkInfoStru)); + gstTrainInfo[wBufIndex].wTrainHeadSigId = 0U; gstTrainInfo[wBufIndex].wTrainHeadTrainId = TRAIN_ID_INVAL; gstTrainInfo[wBufIndex].chTrainLocReverseRouteFlag = TRAIN_LOC_REV_ROUTE_FLAG_NONE; @@ -2936,6 +3091,7 @@ 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 }; @@ -2968,6 +3124,8 @@ 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); @@ -2987,6 +3145,7 @@ 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 { @@ -3108,6 +3267,8 @@ UINT8 dsuTrainCrossSignal(const UINT16 wTrainId, const UINT16 wRouteId) * @brief 查询列车处于进路位置 使用列车最小前,最小后 * @param UINT16 wTrainId 列车ID * @param UINT16 wRouteId 进路ID +* @param UINT8 cSetResTag 是否为设置逻辑区段资源时调用 +* (CBTC主控跨压时使用延时后的小前) CI_SUCCESS 是 CI_ERROR 否 * @return 0:查询失败 * 1:列车未驶入进路 * 2:列车车头驶入进路但未跨压 @@ -3115,7 +3276,7 @@ UINT8 dsuTrainCrossSignal(const UINT16 wTrainId, const UINT16 wRouteId) * 4:列车完全驶入进路 * 5:列车车头出清进路 */ -UINT8 dsuTrainMinHeadCrossSignal(const UINT16 wTrainId, const UINT16 wRouteId) +UINT8 dsuTrainMinHeadCrossSignal(const UINT16 wTrainId, const UINT16 wRouteId, const UINT8 cSetResTag) { UINT8 chRouteDir = 0u; UINT16 wStartSignal = 0u; @@ -3141,8 +3302,15 @@ UINT8 dsuTrainMinHeadCrossSignal(const UINT16 wTrainId, const UINT16 wRouteId) wStartSignal = GetRouteStartSignalId(wRouteId); wEndSignal = GetRouteEndSignalId(wRouteId); chRouteDir = GetSignalDirection(wStartSignal); - strTrainMinHead.wLinkId = GetTrainMinHeadLink(wTrainId); - strTrainMinHead.dwOffset = GetTrainMinHeadOffset(wTrainId); + if (CI_SUCCESS == cSetResTag) + { + GetTrainCrossMinHead(wTrainId, wRouteId, &strTrainMinHead); + } + else + { + strTrainMinHead.wLinkId = GetTrainMinHeadLink(wTrainId); + strTrainMinHead.dwOffset = GetTrainMinHeadOffset(wTrainId); + } strTrainMinTail.wLinkId = GetTrainMinTailLink(wTrainId); strTrainMinTail.dwOffset = GetTrainMinTailOffset(wTrainId); strRouteZone.Dir = chRouteDir; @@ -3289,6 +3457,72 @@ UINT8 dsuTrainMinHeadCrossSignal(const UINT16 wTrainId, const UINT16 wRouteId) return chRtnVal; } + +/** +* @brief 获取列车最小安全车头(资源计算用) +* @param UINT16 wTrainId 列车ID +* @param UINT16 wRouteId 进路ID +* @param struct_PathPoint *pMinHead 最小安全车头 +* @return 无 +*/ +static void GetTrainCrossMinHead(UINT16 wTrainId, UINT16 wRouteId, struct_PathPoint *pMinHead) +{ + UINT8 chTrainCtrlMode = TRAIN_NO_MODE; /*列车主控VOBC*/ + UINT8 wCbtcCrossNum = 0u; /*ZC发来的CBTC跨压数量*/ + CbtcCrossStructZC *pCbtcCrossStruZc = NULL; /*ZC发来的CBTC跨压信息*/ + UINT8 i = 0u; /*循环变量*/ + UINT16 wStartSignal = 0u; /*进路始端信号机*/ + + if (NULL == pMinHead) + { + /*异常防护*/ + } + else + { + /*先赋值未延时的最小安全车头*/ + pMinHead->wLinkId = GetTrainMinHeadLink(wTrainId); + pMinHead->dwOffset = GetTrainMinHeadOffset(wTrainId); + + /*获取主控VOBC*/ + chTrainCtrlMode = GetTrainControlMode(wTrainId); + if (TRAIN_VOBC_MODE == chTrainCtrlMode) + { + /*CBTC主控的VOBC才可能使用延时小前*/ + wStartSignal = GetRouteStartSignalId(wRouteId); + wCbtcCrossNum = GetCbtcCrossNumZc(); + pCbtcCrossStruZc = GetCbtcCrossStructZc(); + + if (NULL == pCbtcCrossStruZc) + { + /*异常,不处理*/ + } + else + { + /*遍历所有ZC发来的主控CBTC跨压信息*/ + for (i = 0u; i < wCbtcCrossNum; i++) + { + if (((UINT8)wTrainId == pCbtcCrossStruZc[i].wTrainId) + && (wStartSignal == pCbtcCrossStruZc[i].wSignalId)) + { + /*ZC发来该主控CBTC列车跨压,使用延时最小安全车头进行跨压计算*/ + pMinHead->wLinkId = GetTrainMinSafeHeadLink(wTrainId); + pMinHead->dwOffset = GetTrainMinSafeHeadOffset(wTrainId); + break; + } + else + { + /*继续遍历*/ + } + } + } + } + else + { + /*不处理*/ + } + } +} + /* * 功能描述: 设置指定列车安全车头是否处于占用不连通岔区 * 参数说明: const UINT16 wTrainId, 列车ID @@ -12624,157 +12858,188 @@ UINT8 GetTrainControlMode(const UINT16 wTrainId) */ void InputMainTrainInformation(UINT16 wTrainId) { - UINT8 chTrainControlMode = 0u; + UINT8 chTrainControlMode = 0U; UINT16 wBufIndex = 0U; - UINT8 chIvocCtxValid = 0u; - UINT8 chVobcCtxValid = 0u; - UINT8 chInputFlag = 0u; - UINT8 chVobcLevel = 0u; + UINT8 chIvocCtxValid = 0U; + UINT8 chVobcCtxValid = 0U; + UINT8 chInputFlag = 0U; + UINT8 chVobcLevel = 0U; UINT8 chTrainPostionMode = 0U; - UINT8 chIvocLevel = 0u; + UINT8 chIvocLevel = 0U; UINT8 chTrainSleepState = 0U; UINT8 trainMsgFromTiocId = 0U; + UINT8 chIvocControlMode = 0U; + UINT8 chVobcControlMode = 0U; + UINT16 wAppCycleTime = 0U; + UINT32 dwCiAndVobcBadEnsureTime = 0U; + UINT32 dwTrainMsgDelayTime = 0U; + UINT8 chTransmitStat = 0U; + UINT8 chComBadFlag = 0U; chTrainControlMode = GetTrainControlMode(wTrainId); chIvocCtxValid = GetHLHTHeadCtxValid(CI_SYSTEM_TYPE_IVOC, (UINT8)wTrainId); chVobcCtxValid = GetHLHTHeadCtxValid(CI_SYSTEM_TYPE_VOBC, (UINT8)wTrainId); + chIvocControlMode = GetIvocControlMode(wTrainId); + chVobcControlMode = GetVobcControlMode(wTrainId); + + chTrainSleepState = GetTrainSleepState(wTrainId); + trainMsgFromTiocId = GetTrainMsgFromTiocId(wTrainId); - if (TRAIN_IVOC_MODE == chTrainControlMode) - { - if (CI_SUCCESS == chIvocCtxValid) - { - /*使用IVOC车位置,记录标志*/ - chInputFlag = 2u; - SetTrainPostionMode(wTrainId, CI_SYSTEM_TYPE_IVOC); - /*主控车等级设置*/ - chIvocLevel = GetIvocTrainLevel(wTrainId); - SetTrainLevel(wTrainId, chIvocLevel); - } - else if (CI_SUCCESS == chVobcCtxValid) - { - /*使用VOBC车位置,记录标志*/ - chInputFlag = 1u; - SetTrainPostionMode(wTrainId, CI_SYSTEM_TYPE_VOBC); - /*未使用主控车位置,列车等级设置为UR*/ - SetTrainLevel(wTrainId, TRAIN_LEVEL_UR); - } - else - {/*设置为无效值*/ + if (((TRAIN_STANDBY_MODE == chIvocControlMode) && (TRAIN_STANDBY_MODE == chVobcControlMode)) + || ((TRAIN_MAIN_MODE == chIvocControlMode) && (TRAIN_MAIN_MODE == chVobcControlMode))) + {/*双主或双备,不刷新列车位置*/ + if (0U == trainMsgFromTiocId) + {/*相邻RC无列车数据*/ + wAppCycleTime = GetSystemParaValue(AppCycleTime_ID);/*获取一周期时长*/ - SetTrainPostionMode(wTrainId, 0U); - SetTrainLevel(wTrainId, TRAIN_LEVEL_BACKUP_UNKNOWN); - } + dwTrainMsgDelayTime = GetTrainMsgDelayTime(wTrainId); + (void)SetTrainMsgDelayTime(wTrainId, dwTrainMsgDelayTime + (UINT32)wAppCycleTime);/*本周期位置信息不导入,仅将消息时延增加300ms*/ - } - else if (TRAIN_VOBC_MODE == chTrainControlMode) - { - if (CI_SUCCESS == chVobcCtxValid) - { - chInputFlag = 1u; - SetTrainPostionMode(wTrainId, CI_SYSTEM_TYPE_VOBC); - /*设置主控车等级*/ - chVobcLevel = GetVobcTrainLevel(wTrainId); - SetTrainLevel(wTrainId, chVobcLevel); - } - else if (CI_SUCCESS == chIvocCtxValid) - { - /*使用IVOC车位置,记录标志*/ - chInputFlag = 2u; + dwTrainMsgDelayTime = GetTrainMsgDelayTime(wTrainId); + dwCiAndVobcBadEnsureTime = GetCiAndVobcTransBadEnsureTime(); + if (dwCiAndVobcBadEnsureTime <= dwTrainMsgDelayTime) + {/*累积时延达到通信中断时间*/ - /*直接使用IVOC车信息即可,在之前函数中已经设置过了,这里无需再次设置*/ - SetTrainPostionMode(wTrainId, CI_SYSTEM_TYPE_IVOC); - /*未使用主控车位置,列车等级设置为UR*/ - SetTrainLevel(wTrainId, TRAIN_LEVEL_UR); - } - else - {/*设置为无效值*/ - SetTrainPostionMode(wTrainId, 0U); - - SetTrainLevel(wTrainId, TRAIN_LEVEL_BACKUP_UNKNOWN); - } - } - else - { - if (CI_SUCCESS == chIvocCtxValid) - { - /*使用IVOC车位置,记录标志*/ - chInputFlag = 2u; - SetTrainPostionMode(wTrainId, CI_SYSTEM_TYPE_IVOC); - /*未使用主控车位置,列车等级设置为UR*/ - SetTrainLevel(wTrainId, TRAIN_LEVEL_UR); - } - else if (CI_SUCCESS == chVobcCtxValid) - { - /*使用VOBC车位置,记录标志*/ - chInputFlag = 1u; - SetTrainPostionMode(wTrainId, CI_SYSTEM_TYPE_VOBC); - /*未使用主控车位置,列车等级设置为UR*/ - SetTrainLevel(wTrainId, TRAIN_LEVEL_UR); - } - - else - { - SetTrainPostionMode(wTrainId, 0U); - (void)SetTrainControlMode(wTrainId, TRAIN_NO_MODE);/*控车模式*/ - - if (0U == trainMsgFromTiocId) - {/*没有相邻RC发列车信息*/ - SetTrainLevel(wTrainId, TRAIN_LEVEL_BACKUP_UNKNOWN); + chTransmitStat = GetTrainTransitmitStat(wTrainId); + if (TRAIN_COMM_STATE_GOOD == chTransmitStat) + { + (void)SetTrainTransmitStat(wTrainId, TRAIN_COMM_STATE_BAD); + SetTrainLevel(wTrainId, TRAIN_LEVEL_UR); + } + else + { + /*无处理*/ + } + (void)SetTrainMsgDelayTime(wTrainId, dwCiAndVobcBadEnsureTime);/*将通信中断时间导入,避免持续累加*/ + chComBadFlag = 1U;/*设置通信中断标志*/ + } + else + { + /*无处理*/ } } - } - - /*位置信息转换*/ - - wBufIndex = GetTrainBufIndex(wTrainId); - if (TRAIN_SUM_MAX > wBufIndex) - { - if (1u == chInputFlag) - {/*使用VOBC车信息*/ - gstTrainInfo[wBufIndex].chTrainDir = gTrainInfoTemp[wBufIndex].chVobcTrainDir; /*列车运行方向(最小安全后端指向车头)*/ - gstTrainInfo[wBufIndex].chTrainDir_MaxTail = gTrainInfoTemp[wBufIndex].chVobcTrainDir_MaxTail; /*列车运行方向(最大安全后端)*/ - gstTrainInfo[wBufIndex].chTrainDir_MinHead = gTrainInfoTemp[wBufIndex].chVobcTrainDir_MinHead; /*列车运行方向(最小安全前端)*/ - gstTrainInfo[wBufIndex].chTrainDir_MaxHead = gTrainInfoTemp[wBufIndex].chVobcTrainDir_MaxHead; /*列车运行方向(最大安全前端)*/ - gstTrainInfo[wBufIndex].wTrainMaxHeadLink = gTrainInfoTemp[wBufIndex].wVobcTrainMaxHeadLink; /*列车最大安全前端所处Link*/ - gstTrainInfo[wBufIndex].dwTrainMaxHeadOffset = gTrainInfoTemp[wBufIndex].dwVobcTrainMaxHeadOffset; /*列车最大安全前端偏移量*/ - gstTrainInfo[wBufIndex].wTrainMinHeadLink = gTrainInfoTemp[wBufIndex].wVobcTrainMinHeadLink; /*列车最小安全前端所处link*/ - gstTrainInfo[wBufIndex].dwTrainMinHeadOffset = gTrainInfoTemp[wBufIndex].dwVobcTrainMinHeadOffset; /*列车最小安全前端偏移量*/ - gstTrainInfo[wBufIndex].wTrainMaxTailLink = gTrainInfoTemp[wBufIndex].wVobcTrainMaxTailLink; /*列车最大安全后端所处Link*/ - gstTrainInfo[wBufIndex].dwTrainMaxTailOffset = gTrainInfoTemp[wBufIndex].dwVobcTrainMaxTailOffset; /*列车最大安全后端偏移量*/ - gstTrainInfo[wBufIndex].wTrainMinTailLink = gTrainInfoTemp[wBufIndex].wVobcTrainMinTailLink; /*列车最小安全后端所处link*/ - gstTrainInfo[wBufIndex].dwTrainMinTailOffset = gTrainInfoTemp[wBufIndex].dwVobcTrainMinTailOffset; /*列车最小安全后端偏移量*/ - gstTrainInfo[wBufIndex].chSpeedDir = gTrainInfoTemp[wBufIndex].chVobcSpeedDir; /*速度方向*/ - gstTrainInfo[wBufIndex].wTrainSpeed = gTrainInfoTemp[wBufIndex].wVobcTrainSpeed; /*速度*/ - gstTrainInfo[wBufIndex].dwDelayTime = gTrainInfoTemp[wBufIndex].dwVobcDelayTime; /*延时时间*/ - gstTrainInfo[wBufIndex].chTrainModel = gTrainInfoTemp[wBufIndex].chVobcTrainModel; /*驾驶模式*/ - - + else + {/*相邻联锁发送了通信车信息,直接使用相邻联锁*/ } - else if (2u == chInputFlag) - {/*使用IVOC车信息*/ - gstTrainInfo[wBufIndex].chTrainDir = gTrainInfoTemp[wBufIndex].chIvocTrainDir; /*列车运行方向(最小安全后端指向车头)*/ - gstTrainInfo[wBufIndex].chTrainDir_MaxTail = gTrainInfoTemp[wBufIndex].chIvocTrainDir_MaxTail; /*列车运行方向(最大安全后端)*/ - gstTrainInfo[wBufIndex].chTrainDir_MinHead = gTrainInfoTemp[wBufIndex].chIvocTrainDir_MinHead; /*列车运行方向(最小安全前端)*/ - gstTrainInfo[wBufIndex].chTrainDir_MaxHead = gTrainInfoTemp[wBufIndex].chIvocTrainDir_MaxHead; /*列车运行方向(最大安全前端)*/ - gstTrainInfo[wBufIndex].wTrainMaxHeadLink = gTrainInfoTemp[wBufIndex].wIvocTrainMaxHeadLink; /*列车最大安全前端所处Link*/ - gstTrainInfo[wBufIndex].dwTrainMaxHeadOffset = gTrainInfoTemp[wBufIndex].dwIvocTrainMaxHeadOffset; /*列车最大安全前端偏移量*/ - gstTrainInfo[wBufIndex].wTrainMinHeadLink = gTrainInfoTemp[wBufIndex].wIvocTrainMinHeadLink; /*列车最小安全前端所处link*/ - gstTrainInfo[wBufIndex].dwTrainMinHeadOffset = gTrainInfoTemp[wBufIndex].dwIvocTrainMinHeadOffset; /*列车最小安全前端偏移量*/ - gstTrainInfo[wBufIndex].wTrainMaxTailLink = gTrainInfoTemp[wBufIndex].wIvocTrainMaxTailLink; /*列车最大安全后端所处Link*/ - gstTrainInfo[wBufIndex].dwTrainMaxTailOffset = gTrainInfoTemp[wBufIndex].dwIvocTrainMaxTailOffset; /*列车最大安全后端偏移量*/ - gstTrainInfo[wBufIndex].wTrainMinTailLink = gTrainInfoTemp[wBufIndex].wIvocTrainMinTailLink; /*列车最小安全后端所处link*/ - gstTrainInfo[wBufIndex].dwTrainMinTailOffset = gTrainInfoTemp[wBufIndex].dwIvocTrainMinTailOffset; /*列车最小安全后端偏移量*/ - gstTrainInfo[wBufIndex].chSpeedDir = gTrainInfoTemp[wBufIndex].chIvocSpeedDir; /*速度方向*/ - gstTrainInfo[wBufIndex].wTrainSpeed = gTrainInfoTemp[wBufIndex].wIvocTrainSpeed; /*速度*/ - gstTrainInfo[wBufIndex].dwDelayTime = gTrainInfoTemp[wBufIndex].dwIvocDelayTime; /*延时时间*/ - gstTrainInfo[wBufIndex].chTrainModel = gTrainInfoTemp[wBufIndex].chIvocTrainModel; /*驾驶模式*/ + + + chInputFlag = 0U;/*不导入位置信息标志*/ + } + else + {/*除过双主,双备*/ + + if (TRAIN_IVOC_MODE == chTrainControlMode) + { + if (CI_SUCCESS == chIvocCtxValid) + { + /*使用IVOC车位置,记录标志*/ + chInputFlag = 2u; + SetTrainPostionMode(wTrainId, CI_SYSTEM_TYPE_IVOC); + + if (TRAIN_MAIN_MODE == chIvocControlMode) + {/*主控车等级设置*/ + chIvocLevel = GetIvocTrainLevel(wTrainId); + SetTrainLevel(wTrainId, chIvocLevel); + } + else + { + /*IVOC非主控,使用位置,列车等级设置为UR*/ + SetTrainLevel(wTrainId, TRAIN_LEVEL_UR); + } + } + else if (CI_SUCCESS == chVobcCtxValid) + { + /*使用VOBC车位置,记录标志*/ + chInputFlag = 1u; + SetTrainPostionMode(wTrainId, CI_SYSTEM_TYPE_VOBC); + /*未使用主控车位置,列车等级设置为UR*/ + SetTrainLevel(wTrainId, TRAIN_LEVEL_UR); + } + else + {/*设置为无效值*/ + + SetTrainPostionMode(wTrainId, 0U); + SetTrainLevel(wTrainId, TRAIN_LEVEL_UR); + } + + } + else if (TRAIN_VOBC_MODE == chTrainControlMode) + { + if (CI_SUCCESS == chVobcCtxValid) + { + chInputFlag = 1u; + SetTrainPostionMode(wTrainId, CI_SYSTEM_TYPE_VOBC); + if (TRAIN_MAIN_MODE == chVobcControlMode) + { + /*设置主控车等级*/ + chVobcLevel = GetVobcTrainLevel(wTrainId); + SetTrainLevel(wTrainId, chVobcLevel); + } + else + { /*VOBC非主控,使用位置,列车等级设置为UR*/ + SetTrainLevel(wTrainId, TRAIN_LEVEL_UR); + } + } + else if (CI_SUCCESS == chIvocCtxValid) + { + /*使用IVOC车位置,记录标志*/ + chInputFlag = 2u; + + /*直接使用IVOC车信息即可,在之前函数中已经设置过了,这里无需再次设置*/ + SetTrainPostionMode(wTrainId, CI_SYSTEM_TYPE_IVOC); + /*未使用主控车位置,列车等级设置为UR*/ + SetTrainLevel(wTrainId, TRAIN_LEVEL_UR); + } + else + {/*设置为无效值*/ + SetTrainPostionMode(wTrainId, 0U); + + SetTrainLevel(wTrainId, TRAIN_LEVEL_UR); + } } else - {/*无处理*/ + {/*无主控车,则将当前能够通信的车位置导入并置等级为UR*/ + if (CI_SUCCESS == chIvocCtxValid) + { + /*使用IVOC车位置,记录标志*/ + chInputFlag = 2u; + SetTrainPostionMode(wTrainId, CI_SYSTEM_TYPE_IVOC); + /*未使用主控车位置,列车等级设置为UR*/ + SetTrainLevel(wTrainId, TRAIN_LEVEL_UR); + } + else if (CI_SUCCESS == chVobcCtxValid) + { + /*使用VOBC车位置,记录标志*/ + chInputFlag = 1u; + SetTrainPostionMode(wTrainId, CI_SYSTEM_TYPE_VOBC); + /*未使用主控车位置,列车等级设置为UR*/ + SetTrainLevel(wTrainId, TRAIN_LEVEL_UR); + } + else + { + SetTrainPostionMode(wTrainId, 0U); + + if ((0U == trainMsgFromTiocId) && (TRAIN_SLEEP_NO == chTrainSleepState)) + {/*没有相邻RC发列车信息且非休眠状态*/ + SetTrainLevel(wTrainId, TRAIN_LEVEL_UR); + } + } + } } + + + + + + /*位置信息转换*/ + ImportLocationData(wTrainId, chInputFlag); + + /*根据双车计算通信状态*/ + DoubleTrianComStateJuge(wTrainId, chComBadFlag); + } /* @@ -12842,10 +13107,6 @@ void MainTrainInformationManage(void) { UINT16 ii = 0u;/*列车管理数组循环控制变量*/ UINT16 wTrainId = 0U; - UINT8 chIvocCtxValid = 0U; - UINT8 chVobcCtxValid = 0U; - UINT8 chTransmitStat = 0U; - UINT16 trainMsgFromTiocId = 0U; /*遍历所有列车*/ for (ii = 0u; ii < TRAIN_SUM_MAX; ii++) @@ -12853,27 +13114,6 @@ void MainTrainInformationManage(void) wTrainId = GetTrainId(ii); if (0u < wTrainId) { - chIvocCtxValid = GetHLHTHeadCtxValid(CI_SYSTEM_TYPE_IVOC, (UINT8)wTrainId); - chVobcCtxValid = GetHLHTHeadCtxValid(CI_SYSTEM_TYPE_VOBC, (UINT8)wTrainId); - - if ((CI_ERROR == chIvocCtxValid) && (CI_ERROR == chVobcCtxValid)) - {/*IVOC,VOBC均通信中断,则置为通信中断*/ - chTransmitStat = GetTrainTransitmitStat(wTrainId); - if (TRAIN_COMM_STATE_GOOD == chTransmitStat) - { - trainMsgFromTiocId = GetTrainMsgFromTiocId(wTrainId); - /**通信车信息不是来自TIOC*/ - if (0u == trainMsgFromTiocId) - { - (void)SetTrainTransmitStat(wTrainId, TRAIN_COMM_STATE_BAD); - } - } - } - else - {/*存在任意一方通信良好*/ - (void)SetTrainTransmitStat(wTrainId, TRAIN_COMM_STATE_GOOD); - - } JugeTrianControlMode(wTrainId);/*仲裁当前控车模式*/ @@ -12911,28 +13151,6 @@ void SetTrainPostionMode(const UINT16 wTrainId, const UINT8 chPos) } } -/* -* 功能描述: 获取指定列车位置模式 -* 参数说明: const UINT16 wTrainId, 列车ID -* 返回值 : 无 -*/ -UINT8 GetTrainPostionMode(const UINT16 wTrainId) -{ - UINT16 wBufIndex = 0U; - UINT8 rtVal = 0u; - - wBufIndex = GetTrainBufIndex(wTrainId); - if (TRAIN_SUM_MAX > wBufIndex) - { - rtVal = gstTrainInfo[wBufIndex].chTrainPostionMode; - } - else - { - /*无处理*/ - } - return rtVal; -} - /* * 功能描述: 设置指定列车最小安全后端指向车头的运行方向 @@ -13383,15 +13601,12 @@ void SetIvocTrainMode(const UINT16 wTrainId, const UINT8 chMode) wBufIndex = GetTrainBufIndex(wTrainId); if ((TRAIN_SUM_MAX > wBufIndex) - && ( - (VOBC_TRAIN_MODE_AM == chMode) - || (VOBC_TRAIN_MODE_CM == chMode) - || (VOBC_TRAIN_MODE_RM == chMode) - || (VOBC_TRAIN_MODE_EUM == chMode) - || (VOBC_TRAIN_MODE_FAM == chMode) - || (VOBC_TRAIN_MODE_CAM == chMode) - ||(0u == chMode) - )) + && ((TRAIN_MODE_DEFAULT == chMode) || (TRAIN_MODE_RM == chMode) + || (TRAIN_MODE_CM == chMode) || (TRAIN_MODE_AM == chMode) + || (TRAIN_MODE_EUM == chMode) || (TRAIN_MODE_RD == chMode) + || (TRAIN_MODE_AR == chMode) || (TRAIN_MODE_FAM == chMode) + || (TRAIN_MODE_CAM == chMode) || (TRAIN_MODE_RRM == chMode) + || (TRAIN_MODE_VCM == chMode))) { gTrainInfoTemp[wBufIndex].chIvocTrainModel = chMode; } @@ -13455,4 +13670,284 @@ UINT8 GetIvocTrainLevel(const UINT16 wTrainId) } return chRetVal; -} \ No newline at end of file +} +/* +* 功能描述:导入位置信息函数 +* 参数说明: const UINT16 wTrainId, 列车ID +* const UINT8 chInputFlag 导入标志 +* 返回值 : 无 +*/ +static void ImportLocationData(const UINT16 wTrainId, const UINT8 chInputFlag) +{ + UINT16 wBufIndex = 0U; + + wBufIndex = GetTrainBufIndex(wTrainId); + if (TRAIN_SUM_MAX > wBufIndex) + { + if (1u == chInputFlag) + {/*使用VOBC车信息*/ + if (0U != gTrainInfoTemp[wBufIndex].wVobcTrainMaxHeadLink) + { + gstTrainInfo[wBufIndex].chTrainDir = gTrainInfoTemp[wBufIndex].chVobcTrainDir; /*列车运行方向(最小安全后端指向车头)*/ + gstTrainInfo[wBufIndex].chTrainDir_MaxTail = gTrainInfoTemp[wBufIndex].chVobcTrainDir_MaxTail; /*列车运行方向(最大安全后端)*/ + gstTrainInfo[wBufIndex].chTrainDir_MinHead = gTrainInfoTemp[wBufIndex].chVobcTrainDir_MinHead; /*列车运行方向(最小安全前端)*/ + gstTrainInfo[wBufIndex].chTrainDir_MaxHead = gTrainInfoTemp[wBufIndex].chVobcTrainDir_MaxHead; /*列车运行方向(最大安全前端)*/ + gstTrainInfo[wBufIndex].wTrainMaxHeadLink = gTrainInfoTemp[wBufIndex].wVobcTrainMaxHeadLink; /*列车最大安全前端所处Link*/ + gstTrainInfo[wBufIndex].dwTrainMaxHeadOffset = gTrainInfoTemp[wBufIndex].dwVobcTrainMaxHeadOffset; /*列车最大安全前端偏移量*/ + gstTrainInfo[wBufIndex].wTrainMinHeadLink = gTrainInfoTemp[wBufIndex].wVobcTrainMinHeadLink; /*列车最小安全前端所处link*/ + gstTrainInfo[wBufIndex].dwTrainMinHeadOffset = gTrainInfoTemp[wBufIndex].dwVobcTrainMinHeadOffset; /*列车最小安全前端偏移量*/ + gstTrainInfo[wBufIndex].wTrainMaxTailLink = gTrainInfoTemp[wBufIndex].wVobcTrainMaxTailLink; /*列车最大安全后端所处Link*/ + gstTrainInfo[wBufIndex].dwTrainMaxTailOffset = gTrainInfoTemp[wBufIndex].dwVobcTrainMaxTailOffset; /*列车最大安全后端偏移量*/ + gstTrainInfo[wBufIndex].wTrainMinTailLink = gTrainInfoTemp[wBufIndex].wVobcTrainMinTailLink; /*列车最小安全后端所处link*/ + gstTrainInfo[wBufIndex].dwTrainMinTailOffset = gTrainInfoTemp[wBufIndex].dwVobcTrainMinTailOffset; /*列车最小安全后端偏移量*/ + gstTrainInfo[wBufIndex].chSpeedDir = gTrainInfoTemp[wBufIndex].chVobcSpeedDir; /*速度方向*/ + gstTrainInfo[wBufIndex].wTrainSpeed = gTrainInfoTemp[wBufIndex].wVobcTrainSpeed; /*速度*/ + gstTrainInfo[wBufIndex].dwDelayTime = gTrainInfoTemp[wBufIndex].dwVobcDelayTime; /*延时时间*/ + gstTrainInfo[wBufIndex].chTrainModel = gTrainInfoTemp[wBufIndex].chVobcTrainModel; /*驾驶模式*/ + + SetTrainMsgFromTiocId(wTrainId, 0U); + } + } + else if (2u == chInputFlag) + {/*使用IVOC车信息*/ + if (0U != gTrainInfoTemp[wBufIndex].wIvocTrainMaxHeadLink) + { + gstTrainInfo[wBufIndex].chTrainDir = gTrainInfoTemp[wBufIndex].chIvocTrainDir; /*列车运行方向(最小安全后端指向车头)*/ + gstTrainInfo[wBufIndex].chTrainDir_MaxTail = gTrainInfoTemp[wBufIndex].chIvocTrainDir_MaxTail; /*列车运行方向(最大安全后端)*/ + gstTrainInfo[wBufIndex].chTrainDir_MinHead = gTrainInfoTemp[wBufIndex].chIvocTrainDir_MinHead; /*列车运行方向(最小安全前端)*/ + gstTrainInfo[wBufIndex].chTrainDir_MaxHead = gTrainInfoTemp[wBufIndex].chIvocTrainDir_MaxHead; /*列车运行方向(最大安全前端)*/ + gstTrainInfo[wBufIndex].wTrainMaxHeadLink = gTrainInfoTemp[wBufIndex].wIvocTrainMaxHeadLink; /*列车最大安全前端所处Link*/ + gstTrainInfo[wBufIndex].dwTrainMaxHeadOffset = gTrainInfoTemp[wBufIndex].dwIvocTrainMaxHeadOffset; /*列车最大安全前端偏移量*/ + gstTrainInfo[wBufIndex].wTrainMinHeadLink = gTrainInfoTemp[wBufIndex].wIvocTrainMinHeadLink; /*列车最小安全前端所处link*/ + gstTrainInfo[wBufIndex].dwTrainMinHeadOffset = gTrainInfoTemp[wBufIndex].dwIvocTrainMinHeadOffset; /*列车最小安全前端偏移量*/ + gstTrainInfo[wBufIndex].wTrainMaxTailLink = gTrainInfoTemp[wBufIndex].wIvocTrainMaxTailLink; /*列车最大安全后端所处Link*/ + gstTrainInfo[wBufIndex].dwTrainMaxTailOffset = gTrainInfoTemp[wBufIndex].dwIvocTrainMaxTailOffset; /*列车最大安全后端偏移量*/ + gstTrainInfo[wBufIndex].wTrainMinTailLink = gTrainInfoTemp[wBufIndex].wIvocTrainMinTailLink; /*列车最小安全后端所处link*/ + gstTrainInfo[wBufIndex].dwTrainMinTailOffset = gTrainInfoTemp[wBufIndex].dwIvocTrainMinTailOffset; /*列车最小安全后端偏移量*/ + gstTrainInfo[wBufIndex].chSpeedDir = gTrainInfoTemp[wBufIndex].chIvocSpeedDir; /*速度方向*/ + gstTrainInfo[wBufIndex].wTrainSpeed = gTrainInfoTemp[wBufIndex].wIvocTrainSpeed; /*速度*/ + gstTrainInfo[wBufIndex].dwDelayTime = gTrainInfoTemp[wBufIndex].dwIvocDelayTime; /*延时时间*/ + gstTrainInfo[wBufIndex].chTrainModel = gTrainInfoTemp[wBufIndex].chIvocTrainModel; /*驾驶模式*/ + + SetTrainMsgFromTiocId(wTrainId, 0U); + } + } + else + {/*无处理*/ + + } + + } +} + +/* +* 功能描述:双车通信状态处理 +* 参数说明: const UINT16 wTrainId, 列车ID +* const UINT8 chComBadFlag 通信中断标志 +* 返回值 : 无 +*/ +static void DoubleTrianComStateJuge(const UINT16 wTrainId, const UINT8 chComBadFlag) +{ + UINT8 chIvocCtxValid = 0U; + UINT8 chVobcCtxValid = 0U; + UINT8 trainMsgFromTiocId = 0U; + UINT8 chTransmitStat = 0U; + + 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)) + {/*IVOC,VOBC均通信中断,则置为通信中断*/ + chTransmitStat = GetTrainTransitmitStat(wTrainId); + if (TRAIN_COMM_STATE_GOOD == chTransmitStat) + { + /**通信车信息不是来自TIOC*/ + trainMsgFromTiocId = GetTrainMsgFromTiocId(wTrainId); + if (0u == trainMsgFromTiocId) + { + (void)SetTrainTransmitStat(wTrainId, TRAIN_COMM_STATE_BAD); + } + else + {/*什么也不执行*/ + } + } + } + else + {/*存在任意一方通信良好*/ + if (0U == chComBadFlag) + {/*前面没设置通信中断*/ + (void)SetTrainTransmitStat(wTrainId, TRAIN_COMM_STATE_GOOD); + } + + } +} + +/* +* 功能描述: 清除点连式列车发送信息 +* 参数说明: UINT16 wTrainId +* 返回值 : void +* by:lyj 20260316 +*/ +void ClearBlocLinkTrainInfo(UINT16 wTrainId) +{ + UINT16 wBufIndex = 0U; + + wBufIndex = GetTrainBufIndex(wTrainId); + if (TRAIN_SUM_MAX > wBufIndex) + { + /*清除点连式列车发送信息*/ + (void)CommonMemSet((void*)&gstTrainInfo[wBufIndex].strBlocLinkData, (UINT32)sizeof(BlocLinkInfoStru), 0U, (UINT32)sizeof(BlocLinkInfoStru)); + } + else + { + /*什么也不执行*/ + } +} + + +/* +* 功能描述: 设置点连式列车脚下逻辑区段 +* 参数说明: const UINT16 wTrainId 列车ID +* const UINT8 chOcculogNum 列车脚下逻辑区段数量 +* const UINT16* pOcculogIdbuff 列车脚下逻辑区段数组 +* 返回值 : void +* by:lyj 20260316 +*/ +void SetBlocLinkOccLogSecData(const UINT16 wTrainId, const UINT8 chOcculogNum, const UINT16* pOcculogIdbuff) +{ + UINT16 wBufIndex = 0U; + UINT8 i = 0U; + wBufIndex = GetTrainBufIndex(wTrainId); + if ((TRAIN_SUM_MAX > wBufIndex) && (NULL != pOcculogIdbuff) && (TRAIN_ABL_LOGSEC_SUM > chOcculogNum)) + { + gstTrainInfo[wBufIndex].strBlocLinkData.chBlocLinkLogSecNum = chOcculogNum; + for (i = 0U; i < chOcculogNum; i++) + { + gstTrainInfo[wBufIndex].strBlocLinkData.wBlocLinkLogSecBuf[i] = pOcculogIdbuff[i]; + } + + } + else + { + /*不处理*/ + } +} + +/* +* 功能描述: 设置点连式列车匹配的进路 +* 参数说明: const UINT16 wTrainId 列车ID +* const UINT16 wRouteId 列车匹配的进路id +* 返回值 : void +* by:lyj 20260316 +*/ +void SetBlocLinkRouteData(const UINT16 wTrainId, const UINT16 wRouteId) +{ + UINT16 wBufIndex = 0U; + UINT8 chRouteNum = 0U; + wBufIndex = GetTrainBufIndex(wTrainId); + if ((TRAIN_SUM_MAX > wBufIndex) && (0U < wRouteId) && (ROUTE_SUM_MAX > wRouteId)) + { + chRouteNum = gstTrainInfo[wBufIndex].strBlocLinkData.chBlocLinkRouteNum; + if (CI_VOBC_ROUTE_MAX > chRouteNum) + { + gstTrainInfo[wBufIndex].strBlocLinkData.wBlocLinkRouteBuf[chRouteNum] = wRouteId; + gstTrainInfo[wBufIndex].strBlocLinkData.chBlocLinkRouteNum++; + } + else + { + /*不处理*/ + } + } + else + { + /*不处理*/ + } +} + +/* +* 功能描述: 获取点连式列车匹配的进路数量 +* 参数说明: const UINT16 wTrainId 列车ID +* 返回值 : 列车匹配的进路数量 +* by:lyj 20260316 +*/ +UINT8 GetBlocLinkRouteNum(const UINT16 wTrainId) +{ + UINT16 wBufIndex = 0U; + UINT8 chRouteNum = 0U; + wBufIndex = GetTrainBufIndex(wTrainId); + if (TRAIN_SUM_MAX > wBufIndex) + { + chRouteNum = gstTrainInfo[wBufIndex].strBlocLinkData.chBlocLinkRouteNum; + } + else + { + /*不处理*/ + } + return chRouteNum; +} + +/* +* 功能描述: 获取点连式列车匹配的进路数组 +* 参数说明: const UINT16 wTrainId 列车ID +* 返回值 : 列车匹配的进路数组 +* by:lyj 20260316 +*/ +UINT16* GetBlocLinkRouteBuf(const UINT16 wTrainId) +{ + UINT16 wBufIndex = 0U; + UINT16* pRouteBuf = NULL; + wBufIndex = GetTrainBufIndex(wTrainId); + if (TRAIN_SUM_MAX > wBufIndex) + { + pRouteBuf = gstTrainInfo[wBufIndex].strBlocLinkData.wBlocLinkRouteBuf; + } + else + { + /*不处理*/ + } + return pRouteBuf; +} +/* +* 功能描述: 获取点连式列车逻辑区段数量 +* 参数说明: const UINT16 wTrainId 列车ID +* 返回值 : 列车逻辑区段数量 +* by:lyj 20260316 +*/ +UINT8 GetBlocLinkLogSecNum(const UINT16 wTrainId) +{ + UINT16 wBufIndex = 0U; + UINT8 chLogSecNum = 0U; + wBufIndex = GetTrainBufIndex(wTrainId); + if (TRAIN_SUM_MAX > wBufIndex) + { + chLogSecNum = gstTrainInfo[wBufIndex].strBlocLinkData.chBlocLinkLogSecNum; + } + else + { + /*不处理*/ + } + return chLogSecNum; +} +/* +* 功能描述: 获取点连式列车匹配的逻辑区段数组 +* 参数说明: const UINT16 wTrainId 列车ID +* 返回值 : 列车逻辑区段数组 +* by:lyj 20260316 +*/ +UINT16* GetBlocLinkLogSecBuf(const UINT16 wTrainId) +{ + UINT16 wBufIndex = 0U; + UINT16* pLogSecBuf = NULL; + wBufIndex = GetTrainBufIndex(wTrainId); + if (TRAIN_SUM_MAX > wBufIndex) + { + pLogSecBuf = gstTrainInfo[wBufIndex].strBlocLinkData.wBlocLinkLogSecBuf; + } + else + { + /*不处理*/ + } + return pLogSecBuf; +} diff --git a/TSCP/src/APP/ciapp/Train/TrainDataManage.h b/TSCP/src/APP/ciapp/Train/TrainDataManage.h index 305ba64..a7e10d5 100644 --- a/TSCP/src/APP/ciapp/Train/TrainDataManage.h +++ b/TSCP/src/APP/ciapp/Train/TrainDataManage.h @@ -142,6 +142,17 @@ typedef struct S_ABLTrainInfoStru }ABLTrainInfoStru; +/*点连式信息结构体*/ +typedef struct S_BlocLinkInfoStru +{ + UINT8 chBlocLinkLogSecNum; /*点连式列车逻辑区段数量-车脚下以及车大前所在进路的逻辑区段*/ + UINT16 wBlocLinkLogSecBuf[TRAIN_ABL_LOGSEC_SUM]; /*点连式列车逻辑区段数组*/ + UINT8 chBlocLinkRouteNum; /*点连式匹配进路数量*/ + UINT16 wBlocLinkRouteBuf[CI_VOBC_ROUTE_MAX]; /*点连式匹配进路数组*/ + +}BlocLinkInfoStru; + + /*前车ATP位置信息结构体*/ typedef struct S_HeadTrainAtpLocStru { @@ -213,12 +224,15 @@ typedef struct S_TrainInfoStru UINT16 wTrainMinTailLink; /*列车最小安全后端所处link*/ UINT32 dwTrainMinTailOffset; /*列车最小安全后端偏移量*/ UINT8 chSpeedDir; /*速度方向*/ - UINT16 wTrainSpeed; /*速度方向*/ + UINT16 wTrainSpeed; /*速度*/ UINT8 chTrainZeroState; /*列车零速状态*/ UINT8 chTransmitStat; /*与列车传输状态*/ UINT8 chHeadScreenStat; /*列车前筛标志*/ UINT8 chTailScreenStat; /*列车后筛标志*/ TrainSafeLocStru strSafeLoc; /*列车安全位置*/ + UINT16 wMinSafeHeadLink; /*最小安全车头所处link*/ + UINT32 dwMinSafeHeadOffset; /*最小安全车头所处link偏移量*/ + UINT8 chMinSafeHeadDir; /*最小安全车头方向*/ UINT32 dwDelayTime; /*消息延迟时间*/ UINT16 wGroupOtherTrainId; /* 编组另一列车ID*/ UINT8 chGroupRunState; /* 编组列车状态: 1非编组 2编组建立 3编组运行 4编组折返 5编组解耦*/ @@ -280,6 +294,7 @@ typedef struct S_TrainInfoStru UINT8 chtrainControlMode; /*本车当前控车模式,0不处于任何控制模式,1:处于IVOC主控,2处于VOBC主控*/ UINT8 chTrainPostionMode; /*列车位置模式,0x10 使用IVOC位置,0x14使用VOBC位置*/ + BlocLinkInfoStru strBlocLinkData; /*点连式信息*/ }TrainInfoStru; @@ -710,6 +725,41 @@ CI_SUCCESS: */ UINT8 SetTrainSafeHeadDir(const UINT16 wTrainId, const UINT8 chDir); +/* +* 功能描述: 获取指定列车最小安全车头所处link +* 参数说明: const UINT16 wTrainId, 列车ID +* 返回值 :安全车头所处link +* 创建 : 2026.3.27 +*/ +UINT16 GetTrainMinSafeHeadLink(const UINT16 wTrainId); + +/* +* 功能描述: 获取指定列车最小安全车头所处link偏移量 +* 参数说明: const UINT16 wTrainId, 列车ID +* 返回值 :安全车头所处link偏移量 +* 创建 : 2026.3.27 +*/ +UINT32 GetTrainMinSafeHeadOffset(const UINT16 wTrainId); + +/* +* 功能描述: 获取指定列车最小安全车头方向 +* 参数说明: const UINT16 wTrainId, 列车ID +* 返回值 :安全车头方向 +* 创建 : 2026.3.27 +*/ +UINT8 GetTrainMinSafeHeadDir(const UINT16 wTrainId); + +/* +* 功能描述:设置指定列车最小安全车头位置 +* 参数说明:const UINT16 wTrainId, 列车ID +* const UINT16 wLinkId +* const UINT16 dwLinkOffset +* const UINT16 chDir +* 返回值 :无 +* 创建 : 2026.3.27 +*/ +void SetTrainMinSafeHead(const UINT16 wTrainId, const UINT16 wLinkId, const UINT32 dwLinkOffset, const UINT8 chDir); + /* * 功能描述: 设置指定列车安全车头所处link * 参数说明: const UINT16 wTrainId, 列车ID @@ -1062,6 +1112,8 @@ UINT8 isGroupHeadTrain(const UINT16 wTrainId); * @brief 查询列车处于进路位置 使用列车最小前,最小后 * @param UINT16 wTrainId 列车ID * @param UINT16 wRouteId 进路ID +* @param UINT8 cSetResTag 是否为设置逻辑区段资源时调用 +* (CBTC主控跨压时使用延时后的小前) CI_SUCCESS 是 CI_ERROR 否 * @return 0:查询失败 * 1:列车未驶入进路 * 2:列车车头驶入进路但未跨压 @@ -1069,7 +1121,7 @@ UINT8 isGroupHeadTrain(const UINT16 wTrainId); * 4:列车完全驶入进路 * 5:列车车头出清进路 */ -UINT8 dsuTrainMinHeadCrossSignal(const UINT16 wTrainId, const UINT16 wRouteId); +UINT8 dsuTrainMinHeadCrossSignal(const UINT16 wTrainId, const UINT16 wRouteId, const UINT8 cSetResTag); /** * @brief 获取计轴区段上的通信列车 @@ -2854,12 +2906,6 @@ UINT32 CalTrainMsgDelayTime(UINT16 wTrainId, UINT8 trainType); */ void SetTrainPostionMode(const UINT16 wTrainId, const UINT8 chPos); /* -* 功能描述: 获取指定列车位置模式 -* 参数说明: const UINT16 wTrainId, 列车ID -* 返回值 : 无 -*/ -UINT8 GetTrainPostionMode(const UINT16 wTrainId); -/* * 功能描述: 设置指定IVOC列车主控模式 * 参数说明: const UINT16 wTrainId, 列车ID * const UINT8 chMode 模式 @@ -3004,6 +3050,59 @@ UINT8 SetIvocTrainMsgDelayTime(const UINT16 wTrainId, const UINT32 dwDelayTime); * 返回值 :列车等级 */ UINT8 GetIvocTrainLevel(const UINT16 wTrainId); +/* +* 功能描述: 清除点连式列车发送信息 +* 参数说明: void +* 返回值 : void +*/ +void ClearBlocLinkTrainInfo(UINT16 wTrainId); +/* +* 功能描述: 设置点连式列车脚下逻辑区段 +* 参数说明: const UINT16 wTrainId 列车ID +* const UINT8 chAOcculogNum 列车脚下逻辑区段数量 +* const UINT16* chOcculogIdbuff 列车脚下逻辑区段数组 +* 返回值 : void +* by:lyj 20260316 +*/ +void SetBlocLinkOccLogSecData(const UINT16 wTrainId, const UINT8 chAOcculogNum, const UINT16* chOcculogIdbuff); + +/* +* 功能描述: 设置点连式列车匹配的进路 +* 参数说明: const UINT16 wTrainId 列车ID +* const UINT16 wRouteId 列车匹配的进路id +* 返回值 : void +* by:lyj 20260316 +*/ +void SetBlocLinkRouteData(const UINT16 wTrainId, const UINT16 wRouteId); +/* +* 功能描述: 获取点连式列车匹配的进路数量 +* 参数说明: const UINT16 wTrainId 列车ID +* 返回值 : 列车匹配的进路数量 +* by:lyj 20260316 +*/ +UINT8 GetBlocLinkRouteNum(const UINT16 wTrainId); +/* +* 功能描述: 获取点连式列车匹配的进路数组 +* 参数说明: const UINT16 wTrainId 列车ID +* 返回值 : 列车匹配的进路数组 +* by:lyj 20260316 +*/ +UINT16* GetBlocLinkRouteBuf(const UINT16 wTrainId); +/* +* 功能描述: 获取点连式列车逻辑区段数量 +* 参数说明: const UINT16 wTrainId 列车ID +* 返回值 : 列车逻辑区段数量 +* by:lyj 20260316 +*/ +UINT8 GetBlocLinkLogSecNum(const UINT16 wTrainId); +/* +* 功能描述: 获取点连式列车匹配的逻辑区段数组 +* 参数说明: const UINT16 wTrainId 列车ID +* 返回值 : 列车逻辑区段数组 +* by:lyj 20260316 +*/ +UINT16* GetBlocLinkLogSecBuf(const UINT16 wTrainId); + #ifdef __cplusplus } #endif diff --git a/TSCP/src/APP/ciapp/Train/TrainDefine.h b/TSCP/src/APP/ciapp/Train/TrainDefine.h index 7a0effb..f124bc8 100644 --- a/TSCP/src/APP/ciapp/Train/TrainDefine.h +++ b/TSCP/src/APP/ciapp/Train/TrainDefine.h @@ -279,6 +279,9 @@ /*车载控车状态*/ #define VEHICLE_CONTROL_STATUS_YES ((UINT8)0x55) /*车载控车状态-控车*/ #define VEHICLE_CONTROL_STATUS_NO ((UINT8)0xaa) /*车载控车状态-非控车*/ + +/*点连式宏值定义*/ +#define CI_VOBC_ROUTE_MAX ((UINT8)3U) /*CI-VOBC点连式匹配进路数量最大值*/ #ifdef __cplusplus } #endif diff --git a/TSCP/src/APP/ciapp/Transmit/TransmitStateDataManage.c b/TSCP/src/APP/ciapp/Transmit/TransmitStateDataManage.c index ce5f33a..f072724 100644 --- a/TSCP/src/APP/ciapp/Transmit/TransmitStateDataManage.c +++ b/TSCP/src/APP/ciapp/Transmit/TransmitStateDataManage.c @@ -1253,7 +1253,7 @@ UINT8 GetCiWithOtherCiTransmitState(const UINT8 DeviceType, const UINT8 DeviceId { pstrHlhtHeadCtx = GetCiToRcWithCiHeadCtx(DeviceId); } - else if (CI_SYSTEM_TYPE_CI == DeviceType) + else if (CI_SYSTEM_TYPE_RC == DeviceType) { pstrHlhtHeadCtx = GetCiToRcWithRcHeadCtx(DeviceId); } diff --git a/TSCP/src/APP/ciapp/WashMachine/WashMachineConfigDataManage.c b/TSCP/src/APP/ciapp/WashMachine/WashMachineConfigDataManage.c index 657f3ca..17a1dbe 100644 --- a/TSCP/src/APP/ciapp/WashMachine/WashMachineConfigDataManage.c +++ b/TSCP/src/APP/ciapp/WashMachine/WashMachineConfigDataManage.c @@ -334,6 +334,30 @@ UINT16 GetTrainTailStopSteadyRelayId(const UINT16 washMachineId) return retVal; } +/* +* 功能描述: 获取指定ID洗车机联挂端停稳继电器 +* 参数说明: const UINT16 washMachineId, 洗车机ID +* 返回值 : 0: 获取数据失败 +* >0: 联挂端停稳继电器 +*/ +UINT16 GetCoupingStopSteadyRelayId(const UINT16 washMachineId) +{ + UINT16 bufIndex = 0u; /*数组下标*/ + UINT16 retVal = 0u; + + bufIndex = GetWashMachineIdConfigBufIndex(washMachineId); /*获取洗车机数组下标*/ + + if (bufIndex < WASHMACHINE_SUM_MAX) + { + retVal = WashMachineConfigDataStru[bufIndex].wCoupingStopSteadyRelayId; + } + else + { + retVal = CI_ERROR; + } + return retVal; +} + /* * 功能描述: 整理读入的洗车机配置数据 * 参数说明: 无 @@ -953,3 +977,29 @@ UINT16 GetDccWashPassApplyLightRelayId(const UINT16 washMachineId) } return retVal; } + +/* +* 功能描述: 获取指定ID洗车机允许联挂端清洗继电器 +* 参数说明: const UINT16 washMachineId, 洗车机ID +* 返回值 : 0: 获取数据失败 +* >0: 允许联挂端清洗继电器 +*/ +UINT16 GetCoupingWashAllowRelayId(const UINT16 washMachineId) +{ + UINT16 bufIndex = 0u; /*数组下标*/ + UINT16 retVal = 0u; + + bufIndex = GetWashMachineIdConfigBufIndex(washMachineId); /*获取洗车机数组下标*/ + + if (bufIndex < WASHMACHINE_SUM_MAX) + { + retVal = WashMachineConfigDataStru[bufIndex].wCouplingWashAllowRelayId; + } + else + { + retVal = CI_ERROR; + } + return retVal; +} + + diff --git a/TSCP/src/APP/ciapp/WashMachine/WashMachineConfigDataManage.h b/TSCP/src/APP/ciapp/WashMachine/WashMachineConfigDataManage.h index 041df75..7f922ef 100644 --- a/TSCP/src/APP/ciapp/WashMachine/WashMachineConfigDataManage.h +++ b/TSCP/src/APP/ciapp/WashMachine/WashMachineConfigDataManage.h @@ -37,14 +37,17 @@ typedef struct S_WashMachineConfigDataStruct UINT16 TrainEmergencyStopRelayId; /*列车紧急停车继电器(配置字段:采集继电器)*/ UINT16 HeadWashAllowRelayId; /*允许车头清洗继电器(配置字段:采集继电器)*/ UINT16 TailWashAllowRelayId; /*允许车尾清洗继电器(配置字段:采集继电器)*/ + UINT16 wCouplingWashAllowRelayId; /*允许联挂端清洗继电器(配置字段:采集继电器)*/ UINT16 WashTrainRequestRelayId; /*洗车请求继电器(配置字段:驱动继电器),合肥用作洗车同意继电器*/ UINT16 TrainHeadStopSteadyRelayId; /*车头停稳继电器(配置字段:驱动继电器)*/ UINT16 TrainTailStopSteadyRelayId; /*车尾停稳继电器(配置字段:驱动继电器)*/ + UINT16 wCoupingStopSteadyRelayId; /*联挂端停稳继电器(配置字段:驱动继电器)*/ UINT16 TrainPassRequestRelayId; /*通过请求继电器(配置字段:驱动继电器)*/ UINT16 TrainOutWashPortAllowRelayId; /*允许列车出库继电器(配置字段:采集继电器)*/ UINT16 PauseTrainWashRequestRelayId; /*暂停洗车继电器(配置字段:驱动继电器)*/ UINT16 WashModeBackRelayId; /*全自动洗车模式反馈继电器(配置字段:采集继电器)*/ UINT16 WashModeRelayId; /*全自动自动洗车模式继电器(配置字段:驱动继电器)*/ + UINT16 wDownWashAllowRelayId; /*降级模式洗车同意按钮继电器ID(配置字段:采集继电器)*/ UINT16 wDownWashAllowLightRelayId; /*降级模式洗车同意指示灯继电器ID(配置字段:驱动继电器)*/ UINT16 wDownDccWashAllowRelayId; /*降级模式DCC洗车同意按钮继电器ID (配置字段:采集继电器)*/ @@ -397,6 +400,21 @@ UINT16 GetWashPassApplyLightRelayId(const UINT16 washMachineId); */ UINT16 GetDccWashPassApplyLightRelayId(const UINT16 washMachineId); +/* +* 功能描述: 获取指定ID洗车机允许联挂端清洗继电器 +* 参数说明: const UINT16 washMachineId, 洗车机ID +* 返回值 : 0: 获取数据失败 +* >0: 允许联挂端清洗继电器 +*/ +UINT16 GetCoupingWashAllowRelayId(const UINT16 washMachineId); + +/* +* 功能描述: 获取指定ID洗车机联挂端停稳继电器 +* 参数说明: const UINT16 washMachineId, 洗车机ID +* 返回值 : 0: 获取数据失败 +* >0: 联挂端停稳继电器 +*/ +UINT16 GetCoupingStopSteadyRelayId(const UINT16 washMachineId); #ifdef __cplusplus } diff --git a/TSCP/src/APP/ciapp/WashMachine/WashMachineDataManage.c b/TSCP/src/APP/ciapp/WashMachine/WashMachineDataManage.c index 3d17d0d..2c2f0b8 100644 --- a/TSCP/src/APP/ciapp/WashMachine/WashMachineDataManage.c +++ b/TSCP/src/APP/ciapp/WashMachine/WashMachineDataManage.c @@ -2296,3 +2296,119 @@ void SetDownWashDccAllowPassCycle(const UINT16 washMachineId, const UINT32 washA } } +/* +* 功能描述: 获取指定ID洗车机允许联挂端清洗状态 +* 参数说明: const UINT16 WashMachineId, 洗车机ID +* 返回值 : 0: 获取数据失败 +* >0: 允许联挂端清洗状态 +*/ +UINT8 GetCoupingWashAllowState(const UINT16 WashMachineId) +{ + UINT16 bufIndex = 0u; /*数组下标*/ + UINT8 retVal = 0u; + + bufIndex = GetWashMachineIdConfigBufIndex(WashMachineId); /*获取洗车机数组下标*/ + + if (bufIndex < WASHMACHINE_SUM_MAX) + { + retVal = WashMachineDataStru[bufIndex].chCoupingWashAllowState; + } + else + { + retVal = CI_ERROR; + } + return retVal; + +} + +/* +* 功能描述: 设置指定ID洗车机允许联挂端清洗状态 +* 参数说明: const UINT16 WashMachineId, 洗车机ID + const UINT8 state,设置状态 +* 返回值 : 0: 设置失败 +* 1: 设置成功 +*/ +UINT8 SetCoupingWashAllowState(const UINT16 WashMachineId, const UINT8 state) +{ + UINT16 bufIndex = 0u; /*数组下标*/ + UINT8 retVal = 0u; + + bufIndex = GetWashMachineIdConfigBufIndex(WashMachineId); /*获取洗车机数组下标*/ + + if (bufIndex < WASHMACHINE_SUM_MAX) + { + if ((WASHMACHINE_COL_COUPINGWASH_YES == state) || (WASHMACHINE_COL_COUPINGWASH_NO == state)) + { + WashMachineDataStru[bufIndex].chCoupingWashAllowState = state; + + retVal = CI_SUCCESS; + } + else + { + retVal = CI_ERROR; + } + } + else + { + retVal = CI_ERROR; + } + return retVal; +} + + +/* +* 功能描述: 设置指定ID洗车机联挂端停稳驱动状态 +* 参数说明: const UINT16 WashMachineId, 洗车机ID +* const UINT8 drvState, 驱动状态 +* 返回值 : 无 +* +*/ +void SetCoupingStopSteadyDrvState(const UINT16 WashMachineId, const UINT8 drvState) +{ + UINT16 bufIndex = 0u; /*数组下标*/ + + bufIndex = GetWashMachineIdConfigBufIndex(WashMachineId); /*获取洗车机数组下标*/ + + if (bufIndex < WASHMACHINE_SUM_MAX) + { + if ((WASHMACHINE_COUPING_STEADY_YES == drvState) || (WASHMACHINE_COUPING_STEADY_NO == drvState)) + { + WashMachineDataStru[bufIndex].chCoupingStopSteadyDrvState = drvState; + } + else + { + /*不做处理*/ + } + } + else + { + /*不做处理*/ + } +} + +/* +* 功能描述: 获取指定ID洗车机允许联挂端停稳驱动状态 +* 参数说明: const UINT16 WashMachineId, 洗车机ID +* 返回值 : 0: 获取数据失败 +* >0: 停稳驱动状态 +*/ +UINT8 GetCoupingStopSteadyDrvState(const UINT16 WashMachineId) +{ + UINT16 bufIndex = 0u; /*数组下标*/ + UINT8 retVal = 0u; + + bufIndex = GetWashMachineIdConfigBufIndex(WashMachineId); /*获取洗车机数组下标*/ + + if (bufIndex < WASHMACHINE_SUM_MAX) + { + retVal = WashMachineDataStru[bufIndex].chCoupingStopSteadyDrvState; + } + else + { + retVal = CI_ERROR; + } + return retVal; + +} + + diff --git a/TSCP/src/APP/ciapp/WashMachine/WashMachineDataManage.h b/TSCP/src/APP/ciapp/WashMachine/WashMachineDataManage.h index cc25dfe..b7d27c3 100644 --- a/TSCP/src/APP/ciapp/WashMachine/WashMachineDataManage.h +++ b/TSCP/src/APP/ciapp/WashMachine/WashMachineDataManage.h @@ -35,9 +35,11 @@ typedef struct S_WashMachineDataStruct UINT8 TrainEmergencyStopState; /*列车紧急停车状态(动态字段:采集)*/ UINT8 HeadWashAllowState; /*允许车头清洗状态(动态字段:采集)*/ UINT8 TailWashAllowState; /*允许车尾清洗状态(动态字段:采集)*/ + UINT8 chCoupingWashAllowState; /*允许联挂端清洗状态(动态字段:采集)*/ UINT8 WashTrainRequestDrvState; /*洗车请求驱动状态(动态字段:驱动)*/ UINT8 TrainHeadStopSteadyDrvState; /*车头停稳驱动状态(动态字段:驱动)*/ UINT8 TrainTailStopSteadyDrvState; /*车尾停稳驱动状态(动态字段:驱动)*/ + UINT8 chCoupingStopSteadyDrvState; /*联挂端停稳驱动状态(动态字段:驱动)*/ UINT8 TrainOutWashTrainPortAllowState; /*允许出洗车库状态(动态字段:采集)*/ UINT8 PauseTrainWashRequestDrvState; /*暂停洗车请求驱动状态(动态字段:驱动)*/ UINT8 PaseWashMachineRequesDrvtState; /*通过洗车机请求驱动状态(动态字段:驱动)*/ @@ -45,6 +47,7 @@ typedef struct S_WashMachineDataStruct UINT32 WashWorkModeRelayDrvCycle; /*洗车模式继电器驱动起始周期号*/ UINT8 WashModeState; /*洗车模式(动态字段:采集)*/ UINT8 chSetWashWorkModeBack; /*设置洗车机工作模式反馈(动态字段:采集)*/ + UINT8 chDownWashAllowState; /*降级模式洗车同意状态(动态字段:融合)*/ UINT8 chDownWashAllowPassState; /*降级模式洗车同意通过状态(动态字段:融合)*/ UINT8 chDownWashReqState; /*降级模式洗车请求状态*/ @@ -776,7 +779,39 @@ UINT8 GetDownDccWashAllowPassErrState(const UINT16 washMachineId); */ void SetDownDccWashAllowPassErrState(const UINT16 washMachineId, const UINT8 dccPassWashAdhesionState); +/* +* 功能描述: 获取指定ID洗车机允许联挂端清洗状态 +* 参数说明: const UINT16 WashMachineId, 洗车机ID +* 返回值 : 0: 获取数据失败 +* >0: 允许联挂端清洗状态 +*/ +UINT8 GetCoupingWashAllowState(const UINT16 WashMachineId); +/* +* 功能描述: 设置指定ID洗车机允许联挂端清洗状态 +* 参数说明: const UINT16 WashMachineId, 洗车机ID + const UINT8 state,设置状态 +* 返回值 : 0: 设置失败 +* 1: 设置成功 +*/ +UINT8 SetCoupingWashAllowState(const UINT16 WashMachineId, const UINT8 state); + +/* +* 功能描述: 设置指定ID洗车机联挂端停稳驱动状态 +* 参数说明: const UINT16 WashMachineId, 洗车机ID +* const UINT8 drvState, 驱动状态 +* 返回值 : 无 +* +*/ +void SetCoupingStopSteadyDrvState(const UINT16 WashMachineId, const UINT8 drvState); + +/* +* 功能描述: 获取指定ID洗车机允许联挂端停稳驱动状态 +* 参数说明: const UINT16 WashMachineId, 洗车机ID +* 返回值 : 0: 获取数据失败 +* >0: 停稳驱动状态 +*/ +UINT8 GetCoupingStopSteadyDrvState(const UINT16 WashMachineId); #ifdef __cplusplus } diff --git a/TSCP/src/APP/ciapp/WashMachine/WashMachineDefine.h b/TSCP/src/APP/ciapp/WashMachine/WashMachineDefine.h index 683d809..d58454e 100644 --- a/TSCP/src/APP/ciapp/WashMachine/WashMachineDefine.h +++ b/TSCP/src/APP/ciapp/WashMachine/WashMachineDefine.h @@ -30,6 +30,9 @@ #define WASHMACHINE_TAIL_STEADY_YES ((UINT8)0x55) /*车尾停稳驱动状态*/ #define WASHMACHINE_TAIL_STEADY_NO ((UINT8)0xaa) /*车尾未停稳驱动状态*/ +#define WASHMACHINE_COUPING_STEADY_YES ((UINT8)0x55) /*联挂端停稳驱动状态*/ +#define WASHMACHINE_COUPING_STEADY_NO ((UINT8)0xaa) /*联挂端未停稳驱动状态*/ + #define WASHMACHINE_PAUSE_DRVREQ_TRUE ((UINT8)0x55) /*暂停洗车请求有效驱动状态*/ #define WASHMACHINE_PAUSE_DRVREQ_FALSE ((UINT8)0xaa) /*暂停洗车请求无效驱动状态*/ @@ -52,6 +55,9 @@ #define WASHMACHINE_COL_TAILWASH_YES ((UINT8)0x55) /*尾部洗车允许*/ #define WASHMACHINE_COL_TAILWASH_NO ((UINT8)0xaa) /*尾部洗车不允许*/ +#define WASHMACHINE_COL_COUPINGWASH_YES ((UINT8)0x55) /*联挂端洗车允许*/ +#define WASHMACHINE_COL_COUPINGWASH_NO ((UINT8)0xaa) /*联挂端洗车不允许*/ + #define WASHMACHINE_COL_FALUT_YES ((UINT8)0x55) /*洗车机故障*/ #define WASHMACHINE_COL_FALUT_NO ((UINT8)0xaa) /*洗车机未故障*/ diff --git a/TSCP/src/MSCP/CFM/CFM_Net.c b/TSCP/src/MSCP/CFM/CFM_Net.c index c08a6f4..2f3d6bb 100644 --- a/TSCP/src/MSCP/CFM/CFM_Net.c +++ b/TSCP/src/MSCP/CFM/CFM_Net.c @@ -2940,14 +2940,13 @@ void CFM_LogCiphertextSend(void) } else { - MSCP_LOG_MSG("Ciphertext read queue fail \n"); + /* 鏃犲鐞*/ } } else { (void)CM_Mutex_Unlock(ciphertextCtrl.mutex); - MSCP_LOG_MSG("dataLen = %d\n",dataLen); } } @@ -4553,44 +4552,32 @@ CM_UINT16 CFM_OutnetHeart_Recv(OUT CM_UINT8* pBuf, IN CM_UINT32 BufSize, OUT ENU { /*- 鏉ヨ嚜澶栫綉绾㈢綉 */ *pChn = ENUM_OUTNET_RED; - rt = CM_Memcpy((void*)pBuf, (CM_SIZE_T)BufSize, (void*)(s_CFM_UDP_Cache + 6), (CM_SIZE_T)len); - CM_RE_ASSERT(ENUM_CM_TRUE == rt, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_37, TSCP_DARK_ASSERT_1); } /*- 鏄惁鏉ヨ嚜钃濈綉CC */ else if ((srcIP == inet_addr(g_PFM_Cfg.CC_B_IP)) && (g_PFM_Cfg.CC_B_Heart_Port == srcPort)) { /*- 鏉ヨ嚜澶栫綉钃濈綉 */ *pChn = ENUM_OUTNET_BLUE; - rt = CM_Memcpy((void*)pBuf, (CM_SIZE_T)BufSize, (void*)(s_CFM_UDP_Cache + 6), (CM_SIZE_T)len); - CM_RE_ASSERT(ENUM_CM_TRUE == rt, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_37, TSCP_DARK_ASSERT_2); } /*- 鏄惁鏉ヨ嚜绾㈢綉SEB */ else if ((srcIP == inet_addr(g_PFM_Cfg.EXTEND_R_IP)) && (g_PFM_Cfg.CC_R_Heart_Port == srcPort)) { /*- 鏉ヨ嚜澶栫綉绾㈢綉SEB */ *pChn = ENUM_OUTNET_EXTEND_RED; - rt = CM_Memcpy((void*)pBuf, (CM_SIZE_T)BufSize, (void*)(s_CFM_UDP_Cache + 6), (CM_SIZE_T)len); - CM_RE_ASSERT(ENUM_CM_TRUE == rt, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_37, TSCP_DARK_ASSERT_3); } /*- 鏄惁鏉ヨ嚜钃濈綉SEB */ else if ((srcIP == inet_addr(g_PFM_Cfg.EXTEND_B_IP)) && (g_PFM_Cfg.CC_B_Heart_Port == srcPort)) { - /*- 鏉ヨ嚜澶栫綉钃濈綉SEB */ + /*- 鏉ヨ嚜澶栫綉钃濈綉SEB */ *pChn = ENUM_OUTNET_EXTEND_BLUE; - rt = CM_Memcpy((void*)pBuf, (CM_SIZE_T)BufSize, (void*)(s_CFM_UDP_Cache + 6), (CM_SIZE_T)len); - CM_RE_ASSERT(ENUM_CM_TRUE == rt, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_37, TSCP_DARK_ASSERT_4); } else if((srcIP == inet_addr(g_PFM_Cfg.ANOTHER_EXTEND_R_IP)) && (g_PFM_Cfg.ANOTHER_R_Heart_Port == srcPort)) { *pChn = ENUM_ANOTHER_EXTEND_RED; - rt = CM_Memcpy((void*)pBuf, (CM_SIZE_T)BufSize, (void*)(s_CFM_UDP_Cache + 6), (CM_SIZE_T)len); - CM_RE_ASSERT(ENUM_CM_TRUE == rt, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_23, TSCP_DARK_ASSERT_5); } else if((srcIP == inet_addr(g_PFM_Cfg.ANOTHER_EXTEND_B_IP)) && (g_PFM_Cfg.ANOTHER_B_Heart_Port == srcPort)) { *pChn = ENUM_ANOTHER_EXTEND_BLUE; - rt = CM_Memcpy((void*)pBuf, (CM_SIZE_T)BufSize, (void*)(s_CFM_UDP_Cache + 6), (CM_SIZE_T)len); - CM_RE_ASSERT(ENUM_CM_TRUE == rt, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_23, TSCP_DARK_ASSERT_6); } else { @@ -4602,6 +4589,8 @@ CM_UINT16 CFM_OutnetHeart_Recv(OUT CM_UINT8* pBuf, IN CM_UINT32 BufSize, OUT ENU MSCP_LOG_MSG("unkown msg rcv from %08x:%d,len=%d\n", srcIP, srcPort, len); CM_RE_ASSERT(0, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_37, TSCP_DARK_ASSERT_5); } + rt = CM_Memcpy((void*)pBuf, (CM_SIZE_T)BufSize, (void*)(s_CFM_UDP_Cache + 6), (CM_SIZE_T)len); + CM_RE_ASSERT(ENUM_CM_TRUE == rt, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_37, TSCP_DARK_ASSERT_1); } else { @@ -4681,8 +4670,46 @@ ENUM_CM_RETURN CFM_OutnetHeart_Send(IN const CM_UINT8* pBuf, IN CM_INT32 Len, IN static CM_THREAD_FUNC_T t_ClearArpThread(void) { static STRU_HARDWARE_BOOT_COM_T lastComRecord; + CM_UINT32 i = 0u; /* 寰幆鍙橀噺*/ + CM_UINT32 i_max = 6u; /* 寰幆娆℃暟涓婇檺*/ CM_UINT32 cycle = DFM_GetBirthCount(); CM_UINT8 cmdBuf[100] = {0}; + /* 璁板綍鎵鏈夐氭帶涓庝覆鍙P閰嶇疆*/ + CM_UINT32* p_com_count[6u] = {&g_Hardware_boot_com_state.CCU_A_Count, + &g_Hardware_boot_com_state.CCU_B_Count, + &g_Hardware_boot_com_state.SEB_A_Count, + &g_Hardware_boot_com_state.SEB_B_Count, + &g_Hardware_boot_com_state.SEB_A_Another_Count, + &g_Hardware_boot_com_state.SEB_B_Another_Count}; + CM_UINT32 *p_last_count[6u] = {&lastComRecord.CCU_A_Count, + &lastComRecord.CCU_B_Count, + &lastComRecord.SEB_A_Count, + &lastComRecord.SEB_B_Count, + &lastComRecord.SEB_A_Another_Count, + &lastComRecord.SEB_B_Another_Count}; + CM_CHAR* p_com_ip[6u] = {g_PFM_Cfg.CC_R_IP, + g_PFM_Cfg.CC_B_IP, + g_PFM_Cfg.EXTEND_R_IP, + g_PFM_Cfg.EXTEND_B_IP, + g_PFM_Cfg.ANOTHER_EXTEND_R_IP, + g_PFM_Cfg.ANOTHER_EXTEND_B_IP}; + /* 绛夊緟搴旂敤鍒濆鍖栧畬鎴愬惎鍔*/ + while(ENUM_INIT_APP >= PFM_LOG_GET_INIT_STAGE()) + { + CM_Sleep(1000u); + } + if(NULL == p_Serial_IN_VOBC_Func) + { + i_max = 2u; + } + else if(0x55u != g_PFM_Cfg.M_AREA_SEB_Enable) + { + i_max = 4u; + } + else + { + i_max = 6u; + } #if QNX void* pmask = NULL; /*- 鏈嚎绋嬮攣瀹氬湪 A53 core 1 */ @@ -4692,94 +4719,15 @@ static CM_THREAD_FUNC_T t_ClearArpThread(void) while(1) { cycle = DFM_GetBirthCount(); - if((cycle > (g_Hardware_boot_com_state.CCU_A_Count + 100u))&&(lastComRecord.CCU_A_Count != g_Hardware_boot_com_state.CCU_A_Count)) + for(i = 0u; i < i_max; i++) { - lastComRecord.CCU_A_Count = g_Hardware_boot_com_state.CCU_A_Count; - snprintf(cmdBuf, sizeof(cmdBuf), "arp -d %s", g_PFM_Cfg.CC_R_IP); - (void)system(cmdBuf); - MSCP_LOG_MSG("%s\n", cmdBuf); - MSCP_LOG_MSG("clear arp cycle = %d,g_Hardware_boot_com_state.CCU_A_Count=%d,lastComRecord.CCU_A_Count=%d\n",cycle,g_Hardware_boot_com_state.CCU_A_Count,lastComRecord.CCU_A_Count); - } - else - { - /* 鏃犲鐞 */ - } - - if((cycle > (g_Hardware_boot_com_state.CCU_B_Count + 100u))&&(lastComRecord.CCU_B_Count != g_Hardware_boot_com_state.CCU_B_Count)) - { - lastComRecord.CCU_B_Count = g_Hardware_boot_com_state.CCU_B_Count; - snprintf(cmdBuf, sizeof(cmdBuf), "arp -d %s", g_PFM_Cfg.CC_B_IP); - (void)system(cmdBuf); - MSCP_LOG_MSG("%s\n", cmdBuf); - MSCP_LOG_MSG("clear arp cycle = %d,g_Hardware_boot_com_state.CCU_B_Count=%d,lastComRecord.CCU_B_Count=%d\n",cycle,g_Hardware_boot_com_state.CCU_B_Count,lastComRecord.CCU_B_Count); - } - else - { - /* 鏃犲鐞 */ - } - - if(NULL == p_Serial_IN_VOBC_Func) - { - /* 鏃犲鐞 */ - } - else - { - if((cycle > (g_Hardware_boot_com_state.SEB_A_Count + 100u))&&(lastComRecord.SEB_A_Count != g_Hardware_boot_com_state.SEB_A_Count)) + if((cycle > (*(p_com_count[i]) + 100u)) && (*(p_last_count[i]) != *(p_com_count[i]))) { - lastComRecord.SEB_A_Count = g_Hardware_boot_com_state.SEB_A_Count; - snprintf(cmdBuf, sizeof(cmdBuf), "arp -d %s", g_PFM_Cfg.EXTEND_R_IP); + *(p_last_count[i]) = *(p_com_count[i]); + snprintf(cmdBuf, sizeof(cmdBuf), "arp -d %s", p_com_ip[i]); (void)system(cmdBuf); MSCP_LOG_MSG("%s\n", cmdBuf); - MSCP_LOG_MSG("clear arp cycle = %d,g_Hardware_boot_com_state.SEB_A_Count=%d,lastComRecord.SEB_A_Count=%d\n",cycle,g_Hardware_boot_com_state.SEB_A_Count,lastComRecord.SEB_A_Count); - } - else - { - /* 鏃犲鐞 */ - } - - if((cycle > (g_Hardware_boot_com_state.SEB_B_Count + 100u))&&(lastComRecord.SEB_B_Count != g_Hardware_boot_com_state.SEB_B_Count)) - { - lastComRecord.SEB_B_Count = g_Hardware_boot_com_state.SEB_B_Count; - snprintf(cmdBuf, sizeof(cmdBuf), "arp -d %s", g_PFM_Cfg.EXTEND_B_IP); - (void)system(cmdBuf); - MSCP_LOG_MSG("%s\n", cmdBuf); - MSCP_LOG_MSG("clear arp cycle = %d,g_Hardware_boot_com_state.SEB_B_Count=%d,lastComRecord.SEB_B_Count=%d\n",cycle,g_Hardware_boot_com_state.SEB_B_Count,lastComRecord.SEB_B_Count); - } - else - { - /* 鏃犲鐞 */ - } - if(0x55u == g_PFM_Cfg.M_AREA_SEB_Enable) - { - if((cycle > (g_Hardware_boot_com_state.SEB_A_Another_Count + 100u))&&(lastComRecord.SEB_A_Another_Count != g_Hardware_boot_com_state.SEB_A_Another_Count)) - { - lastComRecord.SEB_A_Another_Count = g_Hardware_boot_com_state.SEB_A_Another_Count; - snprintf(cmdBuf, sizeof(cmdBuf), "arp -d %s", g_PFM_Cfg.ANOTHER_EXTEND_R_IP); - (void)system(cmdBuf); - MSCP_LOG_MSG("%s\n", cmdBuf); - MSCP_LOG_MSG("clear arp cycle = %d,g_Hardware_boot_com_state.SEB_A_Another_Count=%d,lastComRecord.SEB_A_Another_Count=%d\n",cycle,g_Hardware_boot_com_state.SEB_A_Another_Count,lastComRecord.SEB_A_Another_Count); - } - else - { - /* 鏃犲鐞 */ - } - - if((cycle > (g_Hardware_boot_com_state.SEB_B_Another_Count + 100u))&&(lastComRecord.SEB_B_Another_Count != g_Hardware_boot_com_state.SEB_B_Another_Count)) - { - lastComRecord.SEB_B_Another_Count = g_Hardware_boot_com_state.SEB_B_Another_Count; - snprintf(cmdBuf, sizeof(cmdBuf), "arp -d %s", g_PFM_Cfg.ANOTHER_EXTEND_B_IP); - (void)system(cmdBuf); - MSCP_LOG_MSG("%s\n", cmdBuf); - MSCP_LOG_MSG("clear arp cycle = %d,g_Hardware_boot_com_state.SEB_B_Another_Count=%d,lastComRecord.SEB_B_Another_Count=%d\n",cycle,g_Hardware_boot_com_state.SEB_B_Another_Count,lastComRecord.SEB_B_Another_Count); - } - else - { - /* 鏃犲鐞 */ - } - } - else - { - /* 鏃犲鐞 */ + MSCP_LOG_MSG("clear arp cycle = %d, index = %d, g_Hardware_boot_com_state = %d,lastComRecord = %d\n",cycle, i, *(p_com_count[i]), *(p_last_count[i])); } } @@ -4793,7 +4741,7 @@ static CM_THREAD_FUNC_T t_ClearArpThread(void) * - ENUM_CM_TRUE 鍧囦负绌 * - ENUM_CM_FALSE 涓嶅潎涓虹┖ */ -ENUM_CM_RETURN CFM_LogQ_isEmpty() +ENUM_CM_RETURN CFM_LogQ_isEmpty(void) { ENUM_CM_RETURN ret = ENUM_CM_FALSE; CM_UINT32 len1 = 0u, len2 = 0u; @@ -4812,7 +4760,7 @@ ENUM_CM_RETURN CFM_LogQ_isEmpty() /** * @brief 鍒ゆ柇鏀跺埌瀹曟満鍚庣殑2鍙栵紝绔嬪嵆鎵ц瀹曟満鎿嶄綔 */ -void CFM_AssertRecved() +void CFM_AssertRecved(void) { CM_INT32 assertMsgNum = 0; /*- 鎸囬拡闃茬┖*/ diff --git a/TSCP/src/MSCP/CFM/CFM_Net.h b/TSCP/src/MSCP/CFM/CFM_Net.h index 51bfdfb..de93934 100644 --- a/TSCP/src/MSCP/CFM/CFM_Net.h +++ b/TSCP/src/MSCP/CFM/CFM_Net.h @@ -754,11 +754,11 @@ extern "C" * - ENUM_CM_TRUE 鍧囦负绌 * - ENUM_CM_FALSE 涓嶅潎涓虹┖ */ - ENUM_CM_RETURN CFM_LogQ_isEmpty(); + ENUM_CM_RETURN CFM_LogQ_isEmpty(void); /** * @brief 鍒ゆ柇鏀跺埌瀹曟満鍚庣殑2鍙栵紝绔嬪嵆鎵ц瀹曟満鎿嶄綔 */ - void CFM_AssertRecved(); + void CFM_AssertRecved(void); #ifdef __cplusplus } #endif diff --git a/TSCP/src/MSCP/CFM/CFM_Raw.c b/TSCP/src/MSCP/CFM/CFM_Raw.c index 8cb7c4a..239798a 100644 --- a/TSCP/src/MSCP/CFM/CFM_Raw.c +++ b/TSCP/src/MSCP/CFM/CFM_Raw.c @@ -40,7 +40,7 @@ static CM_UINT8 s_CFM_RawInfo[CFM_INNET_RAW_MSG_NUM_MAX * 12u]; static CM_UINT32 s_CFM_RawInfo_peer_len = 0u; static CM_UINT8 s_CFM_RawInfo_peer[CFM_INNET_RAW_MSG_NUM_MAX * 12u]; /*鍒ゆ柇CC涓嶴EB鐘舵*/ -static void s_CCSEB_STATE_CAL(); +static void s_CCSEB_STATE_CAL(void); /** * @brief 鍐呯綉閫忎紶鎺ユ敹锛堥氱敤妯″紡--鍘熻壘寮楃憺妯″紡锛 * @param ch 閫忎紶閫氶亾鍙 @@ -998,7 +998,7 @@ CM_UINT8 CFM_TxOutnetHeart(ENUM_2x2_STATE_T local2x2state) return rt; } /*鍒ゆ柇CC涓嶴EB鐘舵*/ -static void s_CCSEB_STATE_CAL() +static void s_CCSEB_STATE_CAL(void) { CM_UINT8 ccsebState[6] = {0}; CM_UINT32 i = 0u, j = 0u; diff --git a/TSCP/src/MSCP/DFM/DFM_DRV.h b/TSCP/src/MSCP/DFM/DFM_DRV.h index 57bd47b..7b4fdf1 100644 --- a/TSCP/src/MSCP/DFM/DFM_DRV.h +++ b/TSCP/src/MSCP/DFM/DFM_DRV.h @@ -64,8 +64,6 @@ CM_INT32 DFM_output(CM_UINT8 channel, CM_UINT8 level); /*- 鍒囩郴鎸夐挳 */ CM_INT32 DFM_switchButton(void); -/*- 鐪嬮棬鐙楁寚绀虹伅 */ -void DFM_ledMonitor(CM_UINT8 light); /*-閫氶亾鐢垫祦鐢靛帇璇诲彇*/ CM_INT32 DFM_Read_ina3321(INOUT CM_INT32* channel_1_shunt, INOUT CM_FLOAT32* channel_1_bus, INOUT CM_INT32* channel_2_shunt, INOUT CM_FLOAT32* channel_2_bus, INOUT CM_INT32* channel_3_shunt, INOUT CM_FLOAT32* channel_3_bus); @@ -100,15 +98,15 @@ ENUM_CM_RETURN DFM_GetQNX_Verion(CM_UINT8 *buf); /* * 鑴夊啿鍒濆鍖 */ -void DFM_Pulse_Init(); +void DFM_Pulse_Init(void); /* * 鑴夊啿鍚姩 */ -void DFM_Pulse_Start(); +void DFM_Pulse_Start(void); /* * 鑴夊啿鍋滄 */ -void DFM_Pulse_Stop(); +void DFM_Pulse_Stop(void); /* * 鑴夊啿璁剧疆 */ @@ -125,9 +123,10 @@ ENUM_CM_RETURN DFM_Pulse_FeedBack(ENUM_PULSE_TYPE_T *p_pulse); /* * 寮鍏虫ā寮忚幏鍙 **/ -ENUM_SWITCH_MODE_T DFM_Switch_Mode_Get(); +ENUM_SWITCH_MODE_T DFM_Switch_Mode_Get(void); /* * 鍖哄煙鐘舵佹寚绀虹伅鎺у埗 +鍙傛暟涓3鏃讹紝鐏伅涓斾笉鍐嶇偣浜紱鍙傛暟涓1鏃讹紝鐐逛寒6鍙风伅锛涘弬鏁颁负2鏃讹紝鐐逛寒7鍙风伅锛涘叾浠栨儏鍐电伃鐏 **/ void DFM_ledAREA(CM_UINT8 light); /** @@ -141,8 +140,4 @@ CM_UINT8 DFM_PulseCnt_Get(CM_UINT8 index, OUT CM_UINT32* pPulseCnt); * 鐢ㄦ潵妫娴媐ec0 fec1 up/down鐘舵 */ void DFM_Network_Check(void); -#if 0 -/* 璁板綍fec0,fec1 鐘舵*/ -void DFM_PhyLog(void); -#endif #endif /* SRC_MSCP_DFM_DFM_DRV_H_ */ diff --git a/TSCP/src/MSCP/DFM/DFM_DRV_QNX.c b/TSCP/src/MSCP/DFM/DFM_DRV_QNX.c index 4584703..82e4022 100644 --- a/TSCP/src/MSCP/DFM/DFM_DRV_QNX.c +++ b/TSCP/src/MSCP/DFM/DFM_DRV_QNX.c @@ -22,8 +22,6 @@ CM_UINT16 g_InIoLog = 0; /** 鑴夊啿绫诲瀷杞崲 */ static ENUM_PULSE_TYPE_T s_PulseConvert(ABSynMsgType type); -/* 瓒呰繃5kb鎴柇PhyLog.txt*/ -static void s_ManagePhyLog(void); /** * @brief 椹卞姩鍒濆鍖 @@ -651,7 +649,7 @@ void DFM_Network_Check(void) /* * 鑴夊啿鍒濆鍖 */ -void DFM_Pulse_Init() +void DFM_Pulse_Init(void) { int ret = -1; ret = imx8_create_gpio_irq_pthread(); @@ -662,14 +660,14 @@ void DFM_Pulse_Init() /* * 鑴夊啿鍚姩 */ -void DFM_Pulse_Start() +void DFM_Pulse_Start(void) { drvStartABSynSwitch(); } /* * 鑴夊啿鍋滄 */ -void DFM_Pulse_Stop() +void DFM_Pulse_Stop(void) { drvStopABSynSwitch(); } @@ -778,7 +776,7 @@ ENUM_CM_RETURN DFM_Pulse_FeedBack(ENUM_PULSE_TYPE_T *p_pulse) /* * 寮鍏虫ā寮忚幏鍙 **/ -ENUM_SWITCH_MODE_T DFM_Switch_Mode_Get() +ENUM_SWITCH_MODE_T DFM_Switch_Mode_Get(void) { CM_UINT8 in = 0x00u; ENUM_SWITCH_MODE_T ret = ENUM_SWITCH_ERROR; @@ -813,28 +811,35 @@ ENUM_SWITCH_MODE_T DFM_Switch_Mode_Get() } /* * 鍖哄煙鐘舵佹寚绀虹伅鎺у埗 +* 鍙傛暟涓3鏃讹紝鐏伅涓斾笉鍐嶇偣浜紱鍙傛暟涓1鏃讹紝鐐逛寒6鍙风伅锛涘弬鏁颁负2鏃讹紝鐐逛寒7鍙风伅锛涘叾浠栨儏鍐电伃鐏 **/ void DFM_ledAREA(CM_UINT8 light) { - switch(light) + static CM_UINT8 s_light = 1u; /* 鍏佽鐐圭伅鏍囧織浣*/ + if(s_light == 1u) { - case 0x01u: - imx8_output(6, 1); - imx8_output(7, 0); - break; - case 0x02u: - imx8_output(6, 0); - imx8_output(7, 1); - break; - case 0x03u: - imx8_output(6, 0); - imx8_output(7, 0); - break; - default: - imx8_output(6, 0); - imx8_output(7, 0); - break; + switch(light) + { + case 0x01u: + imx8_output(6, 1); + imx8_output(7, 0); + break; + case 0x02u: + imx8_output(6, 0); + imx8_output(7, 1); + break; + case 0x03u: + s_light = 0u; + imx8_output(6, 0); + imx8_output(7, 0); + break; + default: + imx8_output(6, 0); + imx8_output(7, 0); + break; + } } + } /** * @brief 鑾峰彇鑴夊啿璁℃暟 @@ -848,104 +853,3 @@ CM_UINT8 DFM_PulseCnt_Get(CM_UINT8 index, OUT CM_UINT32* pPulseCnt) rt = drvCheckABSynPulCnt(index,pPulseCnt); return rt; } -#if 0 -/* 璁板綍fec0,fec1 鐘舵*/ -void DFM_PhyLog(void) -{ - CM_UINT16 phyinfo[12] = {0}; - CM_UINT8 buf[256]; // 缁熶竴鐨 buffer - CM_UINT8* fecNames[2] = {"fec0", "fec1"}; - CM_UINT8 fec[10] = {0}; - CM_INT32 ret = -1; - CM_INT32 cnt = 0; - CM_INT32 pos = 0; - FILE *fp = NULL; - CM_INT32 phyError = 0; - CM_UINT32 i = 0u, j = 0u; - CM_UINT64 sTick = CM_GetTick(); - MSCP_LOG_MSG("----Phy Log Start At Time %llu----\n", sTick); - for(j = 0u; j < 2; j++) - { - pos = 0; - phyError = 0; - CM_Memset(phyinfo, 0, sizeof(phyinfo), sizeof(phyinfo)); - strncpy(fec, fecNames[j], sizeof(fec)); - - // cnt = drvPhyRegInfoUpdate(fec, phyinfo, 12); - // phyError = phytool(fec); - - // 妯℃嫙璇诲彇phy瀵勫瓨鍣ㄤ俊鎭 - CM_Sleep(2); - - pos += snprintf(buf + pos, sizeof(buf) - pos, - "CYC:%d, %s-phylog[%d]_%s:", - g_MSCP_BirthCount, fec, cnt, ((phyError == -1) ? "Error" : "Correct")); - - for (i = 0; i < 12; i++) - { - pos += snprintf(buf + pos, sizeof(buf) - pos, - ((i == 11) ? "%02X-%02X\n" : "%02X-%02X-"), - phyinfo[i] >> 8, phyinfo[i] & 0x00ff); - } - - if (phyError == -1) - { - fp = fopen("PhyLog.txt", "a"); - if (NULL != fp) - { - fwrite(buf, 1, pos, fp); - fclose(fp); - } - s_ManagePhyLog(); - } - - MSCP_LOG_MSG("%s", buf); - } - MSCP_LOG_MSG("----Phy Log End At Time %llu Used %llums----\n", CM_GetTick(), (CM_GetTick() - sTick) / CM_UNSIGNED_MILLION); -} -/* 瓒呰繃5kb鎴柇PhyLog.txt*/ -static void s_ManagePhyLog(void) -{ - FILE* fp = NULL; - CM_UINT32 fileCurrentSize = 0u; - CM_UINT8 historyBuf[2048] = {0}; - CM_UINT8 tempBuf[2048] = {0}; - CM_UINT32 i = 0u; - - fp = fopen("PhyLog.txt", "r"); - if (fp != NULL) - { - fseek(fp, 0, SEEK_END); - /*- 鑾峰彇褰撳墠鏂囦欢瀛楄妭鏁 */ - fileCurrentSize = ftell(fp); - /*- 鏂囦欢瓒呰繃5kb,鍒欎繚鐣1kb */ - if(fileCurrentSize >= 5120u) - { - fseek(fp, fileCurrentSize-1024, SEEK_SET); - fileCurrentSize = fread(historyBuf, 1024, 1, fp); - (void)fclose(fp); - /*- 澶勭悊瀛楃涓 */ - for(i = 0u; i < 1024u; i++) - { - if('\n' == historyBuf[i]) - { - (void)CM_Memcpy(tempBuf,1024,&historyBuf[i+1],1024-i); - break; - } - } - - fp = fopen("PhyLog.txt", "w"); - fileCurrentSize = fwrite(tempBuf, 1024-i, 1, fp); - } - else - { - /*- 鏃犲鐞 */ - } - (void)fclose(fp); - } - else - { - /*- 鏂囦欢涓嶅瓨鍦ㄧ┖鎸囬拡涓烘甯告儏鍐*/ - } -} -#endif \ No newline at end of file diff --git a/TSCP/src/MSCP/MSCP_APP_Interface.h b/TSCP/src/MSCP/MSCP_APP_Interface.h index 0f94e30..b2475a3 100644 --- a/TSCP/src/MSCP/MSCP_APP_Interface.h +++ b/TSCP/src/MSCP/MSCP_APP_Interface.h @@ -76,7 +76,9 @@ typedef ENUM_CM_RETURN(*pSetAppfunc)(void); /* 搴旂敤鍛ㄦ湡璋冪敤鍑芥暟 */ ENUM_OUTNET_EXTEND_RED = 5, /**< 鎵╁睍绾㈢綉 */ ENUM_OUTNET_EXTEND_BLUE = 6, /**< 鎵╁睍钃濈綉 */ ENUM_ANOTHER_EXTEND_RED = 7, /**< 鍙︿竴鎻掔鎵╁睍绾㈢綉 */ - ENUM_ANOTHER_EXTEND_BLUE = 8 /**< 鍙︿竴鎻掔鎵╁睍钃濈綉 */ + ENUM_ANOTHER_EXTEND_BLUE = 8, /**< 鍙︿竴鎻掔鎵╁睍钃濈綉 */ + ENUM_CHN_RED = 9, /**< 绾㈢綉閫氶亾锛屽寘鍚孩缃戝拰鎵╁睍绾㈢綉 */ + ENUM_CHN_BLUE = 10 /**< 钃濈綉閫氶亾锛屽寘鍚摑缃戝拰鎵╁睍钃濈綉 */ }ENUM_OUTNET_CHN_T; /*- 鏉垮崱鐘舵佺被鍨 */ diff --git a/TSCP/src/MSCP/PFM/PFM_Cfg.c b/TSCP/src/MSCP/PFM/PFM_Cfg.c index 761d971..a049969 100644 --- a/TSCP/src/MSCP/PFM/PFM_Cfg.c +++ b/TSCP/src/MSCP/PFM/PFM_Cfg.c @@ -40,7 +40,7 @@ CM_CHAR FS_FILE_PATH[100]; /** 骞冲彴杞欢鐗堟湰鍙 */ -const CM_UINT8 MSCP_SW_VERION[4] = { 93u, 1u, 1u, 59u }; +const CM_UINT8 MSCP_SW_VERION[4] = { 93u, 1u, 1u, 62u }; /** 椹卞姩杞欢鐗堟湰鍙 */ CM_UINT8 MSCP_DRV_VERION[4] = {0}; /** 涓庣淮鎶や竴浣撴満鎺ュ彛鏂囨。鐗堟湰鍙(鎺ュ彛鏂囨。鍙戠敓鏀瑰彉鏃跺崌绾х増鏈彿) */ diff --git a/TSCP/src/MSCP/PFM/PFM_Log.c b/TSCP/src/MSCP/PFM/PFM_Log.c index 2380dc1..b0b0126 100644 --- a/TSCP/src/MSCP/PFM/PFM_Log.c +++ b/TSCP/src/MSCP/PFM/PFM_Log.c @@ -47,7 +47,7 @@ static STRU_2OO2_NET_NO_PACK_T s_2oo2_AutoReboot = { static CM_UINT8 PFM_LOG_SHUTDOWN(CM_UINT32 darkBuf, CM_UINT32 MaintenanceFlag, const CM_CHAR *filename, const CM_CHAR *func, CM_INT32 line); static void PFM_LOG_MaintenanceMode(ENUM_BOARD_STATE_T boardState, CM_UINT32 MaintenanceFlag); /* 瀹曟満鍓嶅悜閫氭帶鍙戦佺姸鎬佷负瀹曟満鐨勫績璺*/ -static void s_OutnetHeart_Send(); +static void s_OutnetHeart_Send(void); /* @brief 閫氱敤寰幆鏃ュ織绠$悊 * @param file_type 鏂囦欢绫诲瀷鏍囪瘑 * 0: 瀹曟満鏃ュ織 (crashlog) @@ -328,6 +328,7 @@ void MSCP_ASSERT(unsigned int x, unsigned int MaintenanceFlag, unsigned short Mo { /* 鑴夊啿鍋滄蹇呴』鏀惧湪鍓嶉潰锛岄伩鍏嶅欢鏃跺鑷寸殑鑴夊啿鍋滄涓嶅強鏃*/ DFM_Pulse_Stop(); + DFM_ledAREA(0x03u); } } SFM_2x2_LOG_Transition(); @@ -372,7 +373,6 @@ void MSCP_ASSERT(unsigned int x, unsigned int MaintenanceFlag, unsigned short Mo (void)fclose(fp_historical); /*- 鍏抽棴鎵鏈塗CP杩炴帴 */ (void)CM_TCP_Socket_Close_shutdown(); - // CM_Sleep(500u); /*- 瀹夊叏鍏虫柇*/ DFM_saftyOff(); @@ -383,10 +383,6 @@ void MSCP_ASSERT(unsigned int x, unsigned int MaintenanceFlag, unsigned short Mo if(ENUM_INIT_DRV <= PFM_LOG_GET_INIT_STAGE()) { /*- 璁剧疆LED鎸囩ず鐏*/ - if(0x00u != g_PFM_Cfg.M_Area_Enable) - { - DFM_ledAREA(0x03u); - } DFM_ledError(); DFM_ledMS(0u); DFM_ledMonitor(2); @@ -411,8 +407,9 @@ void MSCP_ASSERT(unsigned int x, unsigned int MaintenanceFlag, unsigned short Mo LogQisEmpty = CFM_LogQ_isEmpty(); while (ENUM_CM_FALSE == LogQisEmpty) { + CFM_LogCiphertextSend(); + CM_Sleep(5u); LogQisEmpty = CFM_LogQ_isEmpty(); - CM_Sleep(10u); } /*- 閫鍑鸿繍钀ユ晠闅滅爜*/ @@ -505,6 +502,7 @@ void MSCP_REBOOT_ASSERT(unsigned int x, unsigned int MaintenanceFlag,unsigned sh { /* 鑴夊啿鍋滄蹇呴』鏀惧湪鍓嶉潰锛岄伩鍏嶅欢鏃舵搷浣滃鑷寸殑鑴夊啿鍋滄涓嶅強鏃*/ DFM_Pulse_Stop(); + DFM_ledAREA(0x03u); /* 鐏伅閫昏緫鎻愬墠锛岄伩鍏嶈2鍙栧崱浣忎笉鐏伅*/ } } SFM_2x2_LOG_Transition(); @@ -516,17 +514,12 @@ void MSCP_REBOOT_ASSERT(unsigned int x, unsigned int MaintenanceFlag,unsigned sh (void)printf("MSCP_REBOOT_ASSERT: %s:%s:%d,version:%d.%d.%d.%d,Cyc = %d,DefaultNum:0x%x\n", filename, func, line,MSCP_SW_VERION[0], MSCP_SW_VERION[1], MSCP_SW_VERION[2], MSCP_SW_VERION[3],g_MSCP_SysCount,darkBuf); AutoReboot_Flag = PFM_LOG_SHUTDOWN(darkBuf, MaintenanceFlag, filename, func, line); /*- 鍏抽棴鎵鏈塗CP杩炴帴 */ - (void)CM_TCP_Socket_Close_shutdown(); - // CM_Sleep(500u); + (void)CM_TCP_Socket_Close_shutdown(); /*- 瀹夊叏鍏虫柇*/ DFM_saftyOff(); if(ENUM_INIT_DRV <= PFM_LOG_GET_INIT_STAGE()) { /*- 璁剧疆LED鎸囩ず鐏*/ - if(0x00u != g_PFM_Cfg.M_Area_Enable) - { - DFM_ledAREA(0x03u); - } DFM_ledError(); DFM_ledMS(0u); DFM_ledMonitor(2); @@ -550,13 +543,18 @@ void MSCP_REBOOT_ASSERT(unsigned int x, unsigned int MaintenanceFlag,unsigned sh LogQisEmpty = CFM_LogQ_isEmpty(); while (ENUM_CM_FALSE == LogQisEmpty) { + CFM_LogCiphertextSend(); + CM_Sleep(5u); LogQisEmpty = CFM_LogQ_isEmpty(); - CM_Sleep(2u); } + + /* 鍚姩璺熻釜褰曞埗 */ + MSCP_ASSERT_TraceLog(); /*- 鏄惁鎵ц閲嶅惎鍛戒护*/ if(AutoReboot_Flag == 0x55u) { (void)printf("See You Later!!!\n"); + CM_Sleep(2000u); /* 绛夊緟tracelogger璁板綍瀹屾垚 */ (void)system("shutdown"); /*- 浼戠湢绛夊緟閲嶅惎 */ CM_Sleep(CM_UINT32_MAX); @@ -565,8 +563,6 @@ void MSCP_REBOOT_ASSERT(unsigned int x, unsigned int MaintenanceFlag,unsigned sh { (void)printf("Please check err!!!\n"); } - /* 鍚姩璺熻釜褰曞埗 */ - MSCP_ASSERT_TraceLog(); /*- 璁剧疆鏁呴殰妯″紡*/ PFM_SetBoardState(ENUM_BOARDSTATE_DEFAULT); @@ -967,7 +963,7 @@ static void PFM_LOG_MaintenanceMode(ENUM_BOARD_STATE_T MaintenanceFlag, CM_UINT3 DFM_ledMonitor(1u); if(0x00u != g_PFM_Cfg.M_Area_Enable) { - DFM_ledAREA(0x0u); + DFM_ledAREA(0x03u); } (void)CFM_DarkLog_Storage(DARK_LOG_HEX, TSCP_DARK_PSLIGHT, 1U, &lightPs); (void)CFM_DarkLog_Storage(DARK_LOG_HEX, TSCP_DARK_LOCAL, 1U, &localState); @@ -1114,9 +1110,9 @@ CM_UINT32 *PFM_DarkLogGenerate(CM_UINT16 mode, CM_UINT16 fault, CM_UINT16 num) return &lastcode; } /* 瀹曟満鍓嶅悜閫氭帶鍙戦佺姸鎬佷负瀹曟満鐨勫績璺 杩炵画鍙戦佷笁鍖*/ -static void s_OutnetHeart_Send() +static void s_OutnetHeart_Send(void) { CFM_TxOutnetHeart(ENUM_2x2_SHUTDOWN); CFM_TxOutnetHeart(ENUM_2x2_SHUTDOWN); CFM_TxOutnetHeart(ENUM_2x2_SHUTDOWN); -} \ No newline at end of file +} diff --git a/TSCP/src/MSCP/PFM/PFM_Log.h b/TSCP/src/MSCP/PFM/PFM_Log.h index 906ce00..1cc2034 100644 --- a/TSCP/src/MSCP/PFM/PFM_Log.h +++ b/TSCP/src/MSCP/PFM/PFM_Log.h @@ -180,7 +180,7 @@ void MSCP_PFM_LOG_MSG(IN const CM_CHAR *filename, IN CM_INT32 line, IN const CM_ #define PFM_BASE_THREADS_NAME "threads_state_" // 鏂囦欢鍚嶅墠缂 (threads_state_1.txt) #define PFM_LATEST_THREADS_NAME "threads_state_latest.txt" #define PFM_RECORD_TIME_S (5u) -#define PFM_RECORD_BUF (1024) /* 1024 * 16KB = 16MB*/ +#define PFM_RECORD_BUF (1024) /* 1024 * 11KB = 11MB*/ /* 鍑芥暟瀹炵幇 */ void MSCP_PFM_LOG_BIN(IN const CM_CHAR *filename, IN const CM_CHAR *func, IN CM_INT32 line, IN const CM_UINT8 *Buf, IN CM_UINT32 Len); diff --git a/TSCP/src/MSCP/SFM/SFM_2oo2.c b/TSCP/src/MSCP/SFM/SFM_2oo2.c index 9355d02..86989df 100644 --- a/TSCP/src/MSCP/SFM/SFM_2oo2.c +++ b/TSCP/src/MSCP/SFM/SFM_2oo2.c @@ -552,7 +552,6 @@ static CM_INT32 s_2oo2_ARQ_Recv(OUT CM_UINT8 *RxData, IN CM_UINT32 RxSize, OUT E { /*- 瓒呮椂鍙戦佽姹*/ s_2oo2_ARQ_Send(p_2oo2_Ctrl,ENUM_2oo2_ARQ,p_2oo2_Ctrl->FrameCtrl.FramIndex + 1u); - MSCP_LOG_MSG("[%d]s_2oo2_ARQ_Send:%d\n",p_2oo2_Ctrl->SN,p_2oo2_Ctrl->FrameCtrl.FramIndex + 1); /*- 閲嶇疆璧峰鏃堕棿*/ sTick = CM_GetTick(); ARQ_Cut++; @@ -561,10 +560,10 @@ static CM_INT32 s_2oo2_ARQ_Recv(OUT CM_UINT8 *RxData, IN CM_UINT32 RxSize, OUT E sizeof(CM_UINT16),(p_2oo2_Ctrl->FrameCtrl.FramIndex + 1u), sizeof(CM_UINT16),ARQ_Cut); } - else - { + else + { /*- 鏃犲鐞 */ - } + } } /*鏈満涓庨偦鏈烘帴鏀舵垚鍔熸垨閲嶄紶娆℃暟瓒呰繃1鍒嗛挓锛6000娆★級閫鍑洪噸浼 */ if(((CM_TRUE == MineRcvSuccessFlag) && (CM_TRUE == PeerRcvSuccessFlag)) || (ARQ_Cut >= 6000)) @@ -583,6 +582,10 @@ static CM_INT32 s_2oo2_ARQ_Recv(OUT CM_UINT8 *RxData, IN CM_UINT32 RxSize, OUT E break; } } + if(ARQ_Cut > 0u) + { + MSCP_LOG_MSG("[%d]s_2oo2_ARQ_Send:%d, ARQ_Cut = %d\n",p_2oo2_Ctrl->SN,p_2oo2_Ctrl->FrameCtrl.FramIndex + 1, ARQ_Cut); + } PFM_LOG_SET_STOPTIMER(TSCP_DARK_NULL); /*- 杩斿洖鎶ユ枃鎬婚暱搴 */ return allLen; diff --git a/TSCP/src/MSCP/SFM/SFM_2x2.c b/TSCP/src/MSCP/SFM/SFM_2x2.c index 92f8b1f..98ac872 100644 --- a/TSCP/src/MSCP/SFM/SFM_2x2.c +++ b/TSCP/src/MSCP/SFM/SFM_2x2.c @@ -101,15 +101,15 @@ static CM_BOOL s_State_2x2_Analysis(OUT STRU_2X2_STATE_CTRL_T *p_partner_state,C static ENUM_CM_RETURN s_State_2x2Sync(OUT STRU_2X2_STATE_CTRL_T *p_partner_state); static void s_State_Transition(void); /* 鍊掑垏鎸夐挳娑堟姈 鍦2x寰懆鏈熸墽琛*/ -static void s_Area_Switch_Get(); +static void s_Area_Switch_Get(void); /* 鑴夊啿鑾峰彇 鍦2x寰懆鏈熸墽琛*/ -static void s_Area_Pulse_Get(); +static void s_Area_Pulse_Get(void); /** 4涓狢PU鑴夊啿鍚屾 鍦2x鍚庣殑2鍙栨墽琛*/ -static void s_Pulse_Sync(); +static void s_Pulse_Sync(void); /* 4涓狢PU寮鍏崇姸鎬佸垽鏂 鍦2x鍚庣殑2鍙栨墽琛 */ -static void s_AreaSwitch_Sync(); +static void s_AreaSwitch_Sync(void); /* 鍖哄煙鐘舵佽浆鎹㈠墠浠2x绾跨▼鑾峰彇鑴夊啿绛変俊鎭悗锛岃繘琛岀姸鎬佽浆鎹*/ -static void s_Area_Transition(); +static void s_Area_Transition(void); /** * @brief 閫氳繃鑴夊啿璁℃暟锛屽垽鏂剦鍐叉槸鍚﹀仠姝 * @param index 0-A绯伙紝1-B绯 @@ -119,7 +119,7 @@ static ENUM_CM_RETURN s_isPulseStopped(CM_UINT8 index); /** * 缁熶竴缃垏绯绘爣蹇 */ -static void s_2x2_CloseSwitchFlag(); +static void s_2x2_CloseSwitchFlag(void); /* 鏍℃椂璁$畻offset鏃剁殑2鍙栧弻CPU璁$畻*/ static ENUM_CM_RETURN s_TimeSync_2oo2(INOUT CM_INT64 *myOffset, OUT CM_INT64 *peerOffset); /* 鏍℃椂璁$畻鏃堕挓璋冩暣閲*/ @@ -151,6 +151,8 @@ static void s_Ctrl_2oo2Sync(OUT STRU_2X2_CTRL_T *pPeerCtrl); static void SFM_2x2_Input2oo2Exchange(STRU_2X2_CTRL_T *peerCtrl); /* 鍒ゆ柇2x422浠ュ強浠ュお缃戠殑閫氫俊鐘跺喌骞朵笖濉啓鏆楁枃鏃ュ織 */ static void SFM_2x2_Eth422StateDark(void); +/* 杩斿洖4绾夸腑閫氫俊姝e父鐨勬暟閲*/ +static CM_UINT8 s_2x2_CommNormalNum(void); /* 杈撳叆鍛ㄦ湡鍙峰悓姝ュ嚱鏁 */ static void SFM_2x2_InputSysCycSyn(STRU_2X2_CTRL_T *peerCtrl){ @@ -273,7 +275,7 @@ static void s_State_Switch(void) } /* 鍊掑垏鎸夐挳娑堟姈*/ -static void s_Area_Switch_Get() +static void s_Area_Switch_Get(void) { /*- 鍙橀噺鍒濆鍖 */ static CM_UINT64 s_timeFirst = 0u; @@ -306,7 +308,7 @@ static void s_Area_Switch_Get() } } /* 鑴夊啿鑾峰彇 鍦2x寰懆鏈熸墽琛*/ -static void s_Area_Pulse_Get() +static void s_Area_Pulse_Get(void) { static ENUM_CM_RETURN pulseAStopped = ENUM_CM_FALSE; static ENUM_CM_RETURN pulseBStopped = ENUM_CM_FALSE; @@ -818,6 +820,7 @@ static void s_State_Transition(void) static CM_UINT32 dropCount = 0u; ENUM_CM_RETURN Flag_Sick_Down = ENUM_CM_FALSE; /* TODO锛氬鏋滆嚜宸卞仴搴峰害涓嶈冻浠ュ崌涓 */ ENUM_2x2_STATE_T TempState = ENUM_2x2_SHUTDOWN; /*涓存椂鐘舵*/ + CM_UINT8 comstate_num = 0u; /* 鍥涚嚎閫氫俊鐘舵侊紝鏈変笁绾挎甯稿嵆涓簅k*/ boardID = g_PFM_Cfg.BOARD_ID; SFM_LOG_MSG_2X("Transition:[%d]MineCom:%d-%d:%d-%d:%d-%d\r\n",s_2x2_state_Ctrl.MicroCyc,\ @@ -1144,13 +1147,9 @@ static void s_State_Transition(void) (ENUM_CM_FALSE == MSCP_Get_2X_Com_State(&s_2x2_state_Ctrl.MineUartOKCount[0],0u)) && (ENUM_CM_FALSE == MSCP_Get_2X_Com_State(&s_2x2_state_Ctrl.PeerUartOKCount[0],0u))) { - - /*鍓嶄袱涓懆鏈熸槸鍚﹀瓨鍦ㄤ腑鏂-鏈懆鏈熶覆鍙f槸鍚︽甯-骞朵笖瀵圭郴涓嶆槸涓荤郴鍒欏崌涓*/ - if( /*涓庡綋鍓嶅懆鏈熷樊3-5璁や负姝e父锛岃秴杩囬槇鍊艰涓轰笉鍚屾椂鏂嚎锛岄氫俊鏁呴殰*/ - (MSCP_Get_2X_DisCom_Count(&s_2x2_state_Ctrl.MineComOKCount[0],0u) <= MSCP_2X2_SYNC_TIMEOUT_CYC) && - (MSCP_Get_2X_DisCom_Count(&s_2x2_state_Ctrl.PeerComOKCount[0],0u) <= MSCP_2X2_SYNC_TIMEOUT_CYC) && - (MSCP_Get_2X_DisCom_Count(&s_2x2_state_Ctrl.MineUartOKCount[0],0u) <= MSCP_2X2_SYNC_TIMEOUT_CYC) && - (MSCP_Get_2X_DisCom_Count(&s_2x2_state_Ctrl.PeerUartOKCount[0],0u) <= MSCP_2X2_SYNC_TIMEOUT_CYC)) + /*鍦ㄥ畬鍏ㄤ腑鏂墠锛屾湁涓夌嚎閫氫俊姝e父鍒欏厑璁稿垏绯*/ + comstate_num = s_2x2_CommNormalNum(); + if(comstate_num >= 3u) /* 涓夌嚎鍙婁互涓婂悓鏃朵腑鏂*/ { /*涓嶅瓨鍦ㄦ柇绾匡紝鍒ゆ柇涓哄畷鏈烘垨鏂數鍗囦富*/ /*- 鏈郴鍗囦富 */ @@ -1321,7 +1320,7 @@ static CM_THREAD_FUNC_T SFM_2x2_StateChange_Thread(void) if(0x00u != g_PFM_Cfg.M_Area_Enable) { /*鑾峰彇鑴夊啿鐘舵*/ - s_Area_Pulse_Get(); + s_Area_Pulse_Get(); /* 妫鏌ュ尯鍩熸寜閽姸鎬*/ s_Area_Switch_Get(); } @@ -3880,7 +3879,7 @@ void SFM_2x2_SemPost(void) } } /** 4涓狢PU鑴夊啿鍚屾*/ -static void s_Pulse_Sync() +static void s_Pulse_Sync(void) { CM_UINT32 i = 0u, j = 0u, jmax = 0u; /* 寰幆鍙橀噺*/ CM_INT32 pulseNum[5] = {0}; @@ -3940,7 +3939,7 @@ static void s_Pulse_Sync() } } /* 4涓狢PU寮鍏崇姸鎬佸垽鏂 鍦2x鍚庣殑2鍙栨墽琛*/ -static void s_AreaSwitch_Sync() +static void s_AreaSwitch_Sync(void) { if(ENUM_2x2_SHUTDOWN == s_2x2_state_Ctrl.PartnerState) { @@ -4033,7 +4032,7 @@ static ENUM_CM_RETURN s_isPulseStopped(CM_UINT8 index) } /* 鍖哄煙鐘舵佽浆鎹㈠墠浠2x绾跨▼鑾峰彇鑴夊啿绛変俊鎭悗锛岃繘琛岀姸鎬佽浆鎹*/ -static void s_Area_Transition() +static void s_Area_Transition(void) { STRU_AREA_STATE_CTRL_T* AreaStateCtrl = SFM_Area_BackPointer_Ctrl(); /* 鍖哄煙鐘舵佹帶鍒*/ if(1u == s_2x2_state_Ctrl.AreaIsAllowed && @@ -4096,7 +4095,7 @@ void SFM_2x2_UpdateCYC(void) /** * 缁熶竴缃垏绯绘爣蹇 */ -static void s_2x2_CloseSwitchFlag() +static void s_2x2_CloseSwitchFlag(void) { s_2x2_state_Ctrl.LocalSwitchState = ENUM_2x2_SWITCH_CLOSE; s_2x2_state_Ctrl.PeerSwitchState = ENUM_2x2_SWITCH_CLOSE; @@ -4203,4 +4202,27 @@ static void s_TimeSync_AreaSyncFlag(IN CM_INT64 offset, IN CM_INT64 threshold) MSCP_LOG_MSG("area:WARING[%d][%lldms]:area offset sync success\n",SFM_2x2_GetSysCount(),offset/CM_MILLION); s_2x2_Ctrl.TimeSyncFlag_Area = CM_TRUE; } +} +/* 杩斿洖4绾夸腑閫氫俊姝e父鐨勬暟閲*/ +static CM_UINT8 s_2x2_CommNormalNum(void) +{ + CM_UINT8 num = 0u; + if(MSCP_Get_2X_DisCom_Count(&s_2x2_state_Ctrl.MineComOKCount[0],0u) <= MSCP_2X2_SYNC_TIMEOUT_CYC) + { + num++; + } + if(MSCP_Get_2X_DisCom_Count(&s_2x2_state_Ctrl.PeerComOKCount[0],0u) <= MSCP_2X2_SYNC_TIMEOUT_CYC) + { + num++; + } + if(MSCP_Get_2X_DisCom_Count(&s_2x2_state_Ctrl.MineUartOKCount[0],0u) <= MSCP_2X2_SYNC_TIMEOUT_CYC) + { + num++; + } + if(MSCP_Get_2X_DisCom_Count(&s_2x2_state_Ctrl.PeerUartOKCount[0],0u) <= MSCP_2X2_SYNC_TIMEOUT_CYC) + { + num++; + } + + return num; } \ No newline at end of file diff --git a/TSCP/src/MSCP/SFM/SFM_Area.c b/TSCP/src/MSCP/SFM/SFM_Area.c index 903e88d..bf8aac6 100644 --- a/TSCP/src/MSCP/SFM/SFM_Area.c +++ b/TSCP/src/MSCP/SFM/SFM_Area.c @@ -62,19 +62,19 @@ static void s_Area_Recv(void); /*鑾峰彇鏈鏂扮殑鍖哄煙鏁版嵁buf*/ static CM_INT32 s_Get_LatestAreaBuf(IN CM_UINT8* data1, IN CM_INT32 len1,IN CM_UINT8* data2, IN CM_INT32 len2,OUT CM_UINT8** dataOut); /* CI鐘舵佹満*/ -static void s_Area_CI_Transition(); +static void s_Area_CI_Transition(void); /* RC鐘舵佹満*/ -static void s_Area_RC_Transition(); +static void s_Area_RC_Transition(void); /* 鍖哄煙鐘舵佹満*/ -static void s_Area_State_Transition(); +static void s_Area_State_Transition(void); /* 浠嶢B涓ょ郴鐨勮剦鍐查夋嫨鏈夋晥鐨勮剦鍐*/ -static void s_Area_GetValidPulse(); +static void s_Area_GetValidPulse(void); /* 鍖哄煙鍗忕▼鐨2oo2x浜や簰*/ -static void s_Area_2oo2x2(); +static void s_Area_2oo2x2(void); /* 鏍规嵁鑴夊啿鐘舵佽幏鍙栧尯鍩熺姸鎬 鐘舵佽浆鎹㈠墠杩涜*/ -static void s_Area_GetStateFromPulse(); +static void s_Area_GetStateFromPulse(void); /* 涓诲绯绘帴鏀舵儏鍐靛垽鏂*/ -static void s_Area_GetMasterData(); +static void s_Area_GetMasterData(void); /** * @brief 鐩存帴浠庤剦鍐茬姸鎬佽浆鎹㈠嚭鍖哄煙鐘舵 * */ @@ -85,6 +85,14 @@ static ENUM_AREA_STATE_T s_ConvertPulseToState(ENUM_PULSE_TYPE_T pulse); * @see :: s_2x2_SendState */ static void s_2x2_Area_Recv(void); +/** + * @brief 瑙f瀽2x2鏁版嵁锛屾洿鏂扮姸鎬佹帶鍒剁粨鏋勪綋锛屽苟鏍规嵁涓嶅悓绫诲瀷鐨勬暟鎹繘琛屼笉鍚屽鐞 + */ +static void s_Parse2x2Data(ENUM_2x2_MSG_T msgType, CM_UINT32 msgCyc, CM_UINT16 framNum, CM_UINT16 framIndex, CM_UINT8* data, CM_INT32 len); +/** + * @brief 瑙f瀽鍖哄煙鏁版嵁锛屾洿鏂扮姸鎬佹帶鍒剁粨鏋勪綋锛屽苟鏍规嵁涓嶅悓绫诲瀷鐨勬暟鎹繘琛屼笉鍚屽鐞 + */ +static void s_ParseAreaData(ENUM_AREA_MSG_T msgType, CM_UINT32 msgCyc, CM_UINT16 framNum, CM_UINT16 framIndex, CM_UINT8* data, CM_INT32 len); /** * 鍖哄煙閫氫俊澶勭悊绾跨▼ */ @@ -96,7 +104,7 @@ static void s_2oo2Before_AreaSend(CM_UINT8 *buf, CM_INT32 len, CM_UINT32 bufsize /** * 鍒濆鍖 */ -void SFM_Area_Init() +void SFM_Area_Init(void) { CM_BOOL rt = CM_FALSE; ENUM_CM_RETURN ret = ENUM_CM_FALSE; @@ -165,7 +173,7 @@ void SFM_Area_Init() /** * 鍙戦佽捣濮嬩俊鍙烽噺 */ -void SFM_AREA_Thread_PostStart() +void SFM_AREA_Thread_PostStart(void) { if(0x00 != g_PFM_Cfg.M_Area_Enable) { @@ -179,7 +187,7 @@ void SFM_AREA_Thread_PostStart() /** * 绛夊緟缁撴潫淇″彿閲 */ -void SFM_AREA_Thread_WaitStop() +void SFM_AREA_Thread_WaitStop(void) { if(0x00 != g_PFM_Cfg.M_Area_Enable) { @@ -263,6 +271,7 @@ static CM_THREAD_FUNC_T t_AreaThread(void) s_area_state_Ctrl.AnotherBoardID); CM_Sem_Post(s_Area_Thread_Ctrl.m_Stop); } + return NULL; } /** * @brief 鍖哄煙鍙戦 @@ -348,7 +357,6 @@ void SFM_AREA_Send(IN const CM_UINT8 *Data, IN CM_UINT32 DataLen, IN ENUM_AREA_M static void s_Area_Recv(void) { /*- 鍙橀噺鍒濆鍖 */ - static STRU_FrameCtrl_T s_Area_FrameCtrl[2]; /**< 鍒嗗抚鎺ユ敹鎺у埗 */ CM_INT32 rxLen = 0; /* 缃戠粶鎺ユ敹闀垮害 */ CM_UINT32 msgLen = 0u; /* 鎶ユ枃闀垮害 */ CM_UINT32 SrcID = 0u; /* 婧怚D */ @@ -418,47 +426,7 @@ static void s_Area_Recv(void) { pData = s_area_Cache + offset; DataLen = (CM_INT32)CM_UNSIGNED_INT_EXP(msgLen - offset + 6); - switch(type) - { - case ENUM_AREA_MSG_MASTER: - Buff_Area = g_Area_App_DATA; - Buff_Len = &g_Area_App_Data_Len; - Buff_FrameCtrl = &s_Area_FrameCtrl[0]; - break; - case ENUM_AREA_MSG_SLAVE: - Buff_Area = g_Area_State_Cache; - Buff_Len = &g_Area_State_Cache_Len; - Buff_FrameCtrl = &s_Area_FrameCtrl[1]; - break; - default: - break; - } - /*- 鍒嗗抚鎺ユ敹璺熼殢鎶ユ枃 */ - CM_RE_ASSERT(FrameNum <= (SFM_AREA_DATA_BUFF_SIZE / NET_20K_SIZE), SFM_AREA_MODE, DARK_FAULT_CODE_FUN_ORDER_3, TSCP_DARK_ASSERT_2); - CM_RE_ASSERT(FrameIndex <= FrameNum, SFM_AREA_MODE, DARK_FAULT_CODE_FUN_ORDER_3, TSCP_DARK_ASSERT_3); - ret = SFM_FrameSave(Buff_FrameCtrl, (CM_UINT8)type, FrameNum, FrameIndex, pData, DataLen, Buff_Area, Buff_Len, sizeof(g_Area_App_DATA)); - /*- 鏄惁鏀堕綈浜嗚窡闅忔姤鏂 */ - if (ENUM_CM_TRUE == ret && 8u <= *Buff_Len) - { - *Buff_Len -= 8; - msgCrc1 = CM_LongFromChar(Buff_Area + *Buff_Len); - msgCrc2 = CM_LongFromChar(Buff_Area + *Buff_Len + 4); - calcCrc1 = CM_Crc32_1(Buff_Area, *Buff_Len); - calcCrc2 = CM_Crc32_2(Buff_Area, *Buff_Len); - if(calcCrc1 != msgCrc1 || calcCrc2 != msgCrc2) - { - SFM_LOG_MSG_AREA("Recv %d double crc fail\n", type); - *Buff_Len = 0u; - } - else - { - SFM_LOG_MSG_AREA("Recv Success, cyc:%d\n", msgCyc); - } - } - else - { - - } + s_ParseAreaData(type, msgCyc, FrameNum, FrameIndex, pData, DataLen); } else { @@ -587,7 +555,6 @@ void SFM_2x2_AREA_Send(IN const CM_UINT8 *Data, IN CM_UINT32 DataLen, IN ENUM_2x static void s_2x2_Area_Recv(void) { /*- 鍙橀噺鍒濆鍖 */ - static STRU_FrameCtrl_T s_2x2_Area_FrameCtrl; /**< 鍒嗗抚鎺ユ敹鎺у埗 */ CM_INT32 rxLen = 0; /* 缃戠粶鎺ユ敹闀垮害 */ CM_UINT32 msgLen = 0u; /* 鎶ユ枃闀垮害 */ CM_UINT32 SrcID = 0u; /* 婧怚D */ @@ -645,32 +612,7 @@ static void s_2x2_Area_Recv(void) { pData = s_area_Cache + offset; DataLen = (CM_INT32)CM_UNSIGNED_INT_EXP(msgLen - offset); - /*- 鎶ユ枃绫诲瀷 */ - switch (type) - { - case ENUM_2x2_AREA_MSG_DATA: - if(msgCyc > s_area_state_Ctrl.Rx2x2DataSysCyc) - { - /*- 鍒嗗抚鎺ユ敹璺熼殢鎶ユ枃 */ - CM_RE_ASSERT(FrameNum <= (SFM_AREA_DATA_BUFF_SIZE / NET_20K_SIZE), SFM_AREA_MODE, DARK_FAULT_CODE_FUN_ORDER_7, TSCP_DARK_ASSERT_5); - CM_RE_ASSERT(FrameIndex <= FrameNum, SFM_AREA_MODE, DARK_FAULT_CODE_FUN_ORDER_7, TSCP_DARK_ASSERT_6); - ret = SFM_FrameSave(&s_2x2_Area_FrameCtrl, (CM_UINT8)ENUM_2x2_MSG_BASE_FOLLOW, FrameNum, FrameIndex, pData, DataLen, g_2x2_Area_App_DATA, &g_2x2_Area_App_Data_Len, (CM_UINT32)sizeof(g_2x2_Area_App_DATA)); - /*- 鏄惁鏀堕綈浜嗚窡闅忔姤鏂 */ - if (ENUM_CM_TRUE == ret) - { - s_area_state_Ctrl.Rx2x2DataSysCyc = msgCyc; - - } - else - { - - } - } - break; - default: - /* 鏃犲鐞*/ - break; - }/* end switch */ + s_Parse2x2Data(type, msgCyc, FrameNum, FrameIndex, pData, DataLen); } else { @@ -816,7 +758,7 @@ CM_UINT32 SFM_GetAreaData(OUT CM_UINT8** data) return len; } /* 鍖哄煙鐘舵佸垏鎹*/ -void SFM_Area_State_Transition() +void SFM_Area_State_Transition(void) { s_Area_GetStateFromPulse(); @@ -906,7 +848,7 @@ void SFM_Area_State_Transition() } } /* 鍖哄煙鐘舵佹満*/ -static void s_Area_State_Transition() +static void s_Area_State_Transition(void) { ENUM_AREA_STATE_T tempState; SFM_LOG_MSG_AREA("pulse is %d\n", s_area_state_Ctrl.pulse); @@ -1021,7 +963,7 @@ void SFM_SetAreaLed(ENUM_AREA_STATE_T state) DFM_ledAREA(0x02u); break; case ENUM_AREA_UNAVAILABLE: - DFM_ledAREA(0x03u); + DFM_ledAREA(0x00u); break; default: DFM_ledAREA(0x03u); @@ -1035,14 +977,14 @@ CM_UINT32 SFM_Area_GetRxSysCount() return s_area_state_Ctrl.RxAreaSysCyc; } /* 鑾峰彇鍖哄煙鍛ㄦ湡鍙*/ -CM_UINT32 SFM_Area_GetSysCount() +CM_UINT32 SFM_Area_GetSysCount(void) { return g_MSCP_AreaCount; } /* 浠嶢B涓ょ郴鐨勮剦鍐查夋嫨鏈夋晥鐨勮剦鍐 * 蹇呴』鍦ㄧ姸鎬佽浆鎹(SFM_Area_State_Transition)鍓嶈繘琛 */ -static void s_Area_GetValidPulse() +static void s_Area_GetValidPulse(void) { s_area_state_Ctrl.AllInterrupt = 0u; /* 鏇存柊浜氬仴搴锋爣蹇*/ @@ -1104,7 +1046,7 @@ static void s_Area_GetValidPulse() } } /* 鍖哄煙鍗忕▼鐨2oo2x浜や簰*/ -static void s_Area_2oo2x2() +static void s_Area_2oo2x2(void) { /* 娓呯┖缂撳啿鍖洪暱搴*/ g_Area_App_Master_Len = 0; @@ -1153,7 +1095,7 @@ static void s_Area_2oo2x2() SFM_LOG_MSG_AREA("Master Data Len:%d, Slave Data Len:%d\n",g_Area_App_Master_Len ,g_Area_App_Slave_Len ); } /* 鏍规嵁鑴夊啿鐘舵佽幏鍙栧尯鍩熺姸鎬 鐘舵佽浆鎹㈠墠杩涜*/ -static void s_Area_GetStateFromPulse() +static void s_Area_GetStateFromPulse(void) { /* 鑾峰彇鏈夋晥鑴夊啿*/ static CM_UINT32 notSameCnt = 0u; @@ -1209,12 +1151,12 @@ void SFM_Area_EndProc(CM_UINT8* CI_Buf, CM_INT32 buf_len, CM_UINT32 buf_size) if(NULL != RC_API_FollowUp && 4u < areaDataLen) { s_area_state_Ctrl.RCFollowFlag = RC_API_FollowUp(p_areaData, areaDataLen); + MSCP_LOG_MSG("RC:Set App Data, alllen=%d, len=%d, time:%llums\n", areaDataLen, CM_LongFromChar(p_areaData), NOW_USED_TIME / 1000u); } else { - MSCP_LOG_MSG("RC:Set App Func Fail, len = %d\n", areaDataLen); + MSCP_LOG_MSG("RC:Set App Func Fail, len = %d, time:%llums\n", areaDataLen, NOW_USED_TIME / 1000u); } - MSCP_LOG_MSG("RC:Set App Data, alllen=%d, len=%d, time:%llums\n", areaDataLen, CM_LongFromChar(p_areaData), NOW_USED_TIME / 1000u); } else if(0x55u == g_PFM_Cfg.M_Area_Enable) { @@ -1335,7 +1277,7 @@ static void s_2oo2Before_AreaSend(CM_UINT8 *buf, CM_INT32 len, CM_UINT32 bufsize } /* 涓诲绯绘帴鏀舵儏鍐靛垽鏂*/ -static void s_Area_GetMasterData() +static void s_Area_GetMasterData(void) { CM_UINT32 appLen = 0u; static CM_UINT32 Slave_sysCyc = 0; @@ -1403,7 +1345,7 @@ void SFM_Area_UpdateCYC(void) } } /* CI鐘舵佹満*/ -static void s_Area_CI_Transition() +static void s_Area_CI_Transition(void) { switch(s_area_state_Ctrl.LocalAreaState) { @@ -1434,7 +1376,7 @@ static void s_Area_CI_Transition() } } /* RC鐘舵佹満*/ -static void s_Area_RC_Transition() +static void s_Area_RC_Transition(void) { switch(s_area_state_Ctrl.LocalAreaState) { @@ -1494,4 +1436,98 @@ static void s_Area_RC_Transition() /*鏃犲鐞*/ break; } +} +static void s_Parse2x2Data(ENUM_2x2_MSG_T msgType, CM_UINT32 msgCyc, CM_UINT16 framNum, CM_UINT16 framIndex, CM_UINT8* data, CM_INT32 len) +{ + static STRU_FrameCtrl_T s_2x2_Area_FrameCtrl; /**< 鍒嗗抚鎺ユ敹鎺у埗 */ + CM_UINT32 ret = 0u; + switch (msgType) + { + case ENUM_2x2_AREA_MSG_DATA: + if(msgCyc > s_area_state_Ctrl.Rx2x2DataSysCyc) + { + /*- 鍒嗗抚鎺ユ敹璺熼殢鎶ユ枃 */ + CM_RE_ASSERT(framNum <= (SFM_AREA_DATA_BUFF_SIZE / NET_20K_SIZE), SFM_AREA_MODE, DARK_FAULT_CODE_FUN_ORDER_9, TSCP_DARK_ASSERT_1); + CM_RE_ASSERT(framIndex <= framNum, SFM_AREA_MODE, DARK_FAULT_CODE_FUN_ORDER_9, TSCP_DARK_ASSERT_2); + ret = SFM_FrameSave(&s_2x2_Area_FrameCtrl, (CM_UINT8)ENUM_2x2_MSG_BASE_FOLLOW, framNum, framIndex, data, len, g_2x2_Area_App_DATA, &g_2x2_Area_App_Data_Len, (CM_UINT32)sizeof(g_2x2_Area_App_DATA)); + /*- 鏄惁鏀堕綈浜嗚窡闅忔姤鏂 */ + if (ENUM_CM_TRUE == ret) + { + s_area_state_Ctrl.Rx2x2DataSysCyc = msgCyc; + } + else + { + + } + } + break; + default: + /* 鏃犲鐞*/ + break; + }/* end switch */ +} +static void s_ParseAreaData(ENUM_AREA_MSG_T msgType, CM_UINT32 msgCyc, CM_UINT16 framNum, CM_UINT16 framIndex, CM_UINT8* data, CM_INT32 len) +{ + static STRU_FrameCtrl_T s_Area_FrameCtrl[2]; /**< 鍒嗗抚鎺ユ敹鎺у埗 */ + CM_UINT32 msgCrc1 = 0u, msgCrc2 = 0u, calcCrc1 = 0u, calcCrc2 = 0u; + ENUM_CM_RETURN ret = ENUM_CM_FALSE; + switch(msgType) + { + case ENUM_AREA_MSG_MASTER: + /*- 鍒嗗抚鎺ユ敹璺熼殢鎶ユ枃 */ + CM_RE_ASSERT(framNum <= (SFM_AREA_DATA_BUFF_SIZE / NET_20K_SIZE), SFM_AREA_MODE, DARK_FAULT_CODE_FUN_ORDER_10, TSCP_DARK_ASSERT_1); + CM_RE_ASSERT(framIndex <= framNum, SFM_AREA_MODE, DARK_FAULT_CODE_FUN_ORDER_10, TSCP_DARK_ASSERT_2); + ret = SFM_FrameSave(&s_Area_FrameCtrl[0], (CM_UINT8)msgType, framNum, framIndex, data, len, g_Area_App_DATA, &g_Area_App_Data_Len, sizeof(g_Area_App_DATA)); + /*- 鏄惁鏀堕綈浜嗚窡闅忔姤鏂 */ + if (ENUM_CM_TRUE == ret && 8u <= g_Area_App_Data_Len) + { + g_Area_App_Data_Len -= 8; + msgCrc1 = CM_LongFromChar(g_Area_App_DATA + g_Area_App_Data_Len); + msgCrc2 = CM_LongFromChar(g_Area_App_DATA + g_Area_App_Data_Len + 4); + calcCrc1 = CM_Crc32_1(g_Area_App_DATA, g_Area_App_Data_Len); + calcCrc2 = CM_Crc32_2(g_Area_App_DATA, g_Area_App_Data_Len); + if(calcCrc1 != msgCrc1 || calcCrc2 != msgCrc2) + { + SFM_LOG_MSG_AREA("Recv %d double crc fail\n", msgType); + g_Area_App_Data_Len = 0u; + } + else + { + SFM_LOG_MSG_AREA("Recv Success, cyc:%d\n", msgCyc); + } + } + else + { + + } + break; + case ENUM_AREA_MSG_SLAVE: + CM_RE_ASSERT(framNum == 1, SFM_AREA_MODE, DARK_FAULT_CODE_FUN_ORDER_10, TSCP_DARK_ASSERT_3); + CM_RE_ASSERT(framIndex <= framNum, SFM_AREA_MODE, DARK_FAULT_CODE_FUN_ORDER_10, TSCP_DARK_ASSERT_4); + ret = SFM_FrameSave(&s_Area_FrameCtrl[1], (CM_UINT8)msgType, framNum, framIndex, data, len, g_Area_State_Cache, &g_Area_State_Cache_Len, sizeof(g_Area_State_Cache)); + if (ENUM_CM_TRUE == ret && 8u <= g_Area_State_Cache_Len) + { + g_Area_State_Cache_Len -= 8; + msgCrc1 = CM_LongFromChar(g_Area_State_Cache + g_Area_State_Cache_Len); + msgCrc2 = CM_LongFromChar(g_Area_State_Cache + g_Area_State_Cache_Len + 4); + calcCrc1 = CM_Crc32_1(g_Area_State_Cache, g_Area_State_Cache_Len); + calcCrc2 = CM_Crc32_2(g_Area_State_Cache, g_Area_State_Cache_Len); + if(calcCrc1 != msgCrc1 || calcCrc2 != msgCrc2) + { + SFM_LOG_MSG_AREA("Recv %d double crc fail\n", msgType); + g_Area_State_Cache_Len = 0u; + } + else + { + SFM_LOG_MSG_AREA("Recv Success, cyc:%d\n", msgCyc); + } + } + else + { + + } + break; + default: + break; + } } \ No newline at end of file diff --git a/TSCP/src/MSCP/SFM/SFM_Area.h b/TSCP/src/MSCP/SFM/SFM_Area.h index 56b5cdb..58a1ce0 100644 --- a/TSCP/src/MSCP/SFM/SFM_Area.h +++ b/TSCP/src/MSCP/SFM/SFM_Area.h @@ -104,11 +104,11 @@ typedef struct /** * 鍙戦佽捣濮嬩俊鍙烽噺 */ -void SFM_AREA_Thread_PostStart(); +void SFM_AREA_Thread_PostStart(void); /** * 绛夊緟缁撴潫淇″彿閲 */ -void SFM_AREA_Thread_WaitStop(); +void SFM_AREA_Thread_WaitStop(void); /** * @brief 鏃堕棿鍚屾澶辫触娓呯┖娑堟伅闃熷垪 * @param 鏃 @@ -124,7 +124,7 @@ void SFM_2X2_AREA_ClearRcvMsgQ(void); /** * 鍒濆鍖 */ -void SFM_Area_Init(); +void SFM_Area_Init(void); /** * @brief 鍖哄煙鍙戦 * @param Data 鍙戦佹姤鏂囨寚閽 @@ -150,7 +150,7 @@ void SFM_2x2_AREA_Send(IN const CM_UINT8 *Data, IN CM_UINT32 DataLen, IN ENUM_2x */ CM_UINT32 SFM_GetAreaData(OUT CM_UINT8** data); /* 鍖哄煙鐘舵佸垏鎹 蹇呴』鍦2x绾跨▼缁撴潫鍚庤繘琛*/ -void SFM_Area_State_Transition(); +void SFM_Area_State_Transition(void); /*鏃ュ織杞崲*/ void SFM_AREA_LOG_Transition(void); /*鍗忕▼鐘舵佹帶鍒舵帴鍙*/ @@ -162,7 +162,7 @@ void SFM_SetAreaLed(ENUM_AREA_STATE_T state); /* 鑾峰彇鎺ユ敹鍒扮殑鍛ㄦ湡鍙*/ CM_UINT32 SFM_Area_GetRxSysCount(); /* 鑾峰彇鍖哄煙鍛ㄦ湡鍙*/ -CM_UINT32 SFM_Area_GetSysCount(); +CM_UINT32 SFM_Area_GetSysCount(void); /** * @brief 鍛ㄦ湡鏈尯鍩熷悓姝 * @param CI_Buf CI寰呭彂閫佸尯鍩熸暟鎹 diff --git a/TSCP/src/MSCP/SFM/SFM_Prtcl.c b/TSCP/src/MSCP/SFM/SFM_Prtcl.c index 40f10a5..a4d2a58 100644 --- a/TSCP/src/MSCP/SFM/SFM_Prtcl.c +++ b/TSCP/src/MSCP/SFM/SFM_Prtcl.c @@ -74,6 +74,21 @@ extern CM_UINT32 g_MSCP_SysCount; /**< 绯荤粺鍛ㄦ湡鍙 */ extern CM_INT32 g_PFM_Check; static CM_UINT32 s_txSn = 1u; + +/** + * @breif 澶栫綉閫氶亾杞崲鍑芥暟 + * @param chn 澶栫綉閫氶亾鏋氫妇鍊 + * @return 杞崲鍚庣殑澶栫綉閫氶亾鏋氫妇鍊 绾㈡垨鑰呰摑 + */ +static ENUM_OUTNET_CHN_T s_Outnet_Chn_ROB(ENUM_OUTNET_CHN_T chn); +/** + * @brief 澶栫綉鎺ユ敹鍚庣殑鍘婚噸鎿嶄綔 + * @param redData 绾㈢綉鏁版嵁鎸囬拡 + * @param redDataLen 绾㈢綉鏁版嵁闀垮害 + * @param blueData 钃濈綉鏁版嵁鎸囬拡 + * @param blueDataLen 钃濈綉鏁版嵁闀垮害 + */ +static CM_UINT8 s_Outnet_Recv_Dedup(CM_UINT8* redData, CM_UINT32 redDataLen, CM_UINT8* blueData, CM_UINT32 *blueDataLen); /** * @breif 澶栫綉瀹夊叏鍗忚鍒濆鍖(-1) * @details @@ -371,7 +386,7 @@ CM_INT32 SFM_RxInnetRemoteUpdate(OUT CM_UINT8 Buf[], IN CM_UINT32 BufSize) CM_INT32 SFM_RxOutnetSafe(OUT CM_UINT8 buf[], IN CM_UINT32 bufSize) { /*- 鍙橀噺鍒濆鍖 */ - ENUM_OUTNET_CHN_T ch = ENUM_OUTNET_ERROR; /* 閫氶亾绫诲瀷 */ + ENUM_OUTNET_CHN_T ch = ENUM_OUTNET_ERROR, ch_rob; /* 閫氶亾绫诲瀷 */ CM_INT32 allLen = 0; /* 鎶ユ枃鎬婚暱 */ CM_INT32 rxLen = 0; /* 鎺ユ敹鎶ユ枃闀垮害 */ CM_UINT8 ccVer = 0u; /* CC鐗堟湰 */ @@ -397,6 +412,8 @@ CM_INT32 SFM_RxOutnetSafe(OUT CM_UINT8 buf[], IN CM_UINT32 bufSize) { /*- 浠庨氫俊灞傛帴鏀跺缃戞暟鎹 */ rxLen = CFM_OutnetSafe_Recv(s_Prtcl_UDP_Cache, sizeof(s_Prtcl_UDP_Cache), &ch); + /* 鍒ゆ柇涓虹孩缃戣繕鏄摑缃戦氶亾*/ + ch_rob = s_Outnet_Chn_ROB(ch); (rxLen > 0)?(rxCtrlLen += rxLen):rxCtrlLen; if(rxCtrlLen > g_PFM_Cfg.OutnetSafePack_Len) { @@ -467,7 +484,7 @@ CM_INT32 SFM_RxOutnetSafe(OUT CM_UINT8 buf[], IN CM_UINT32 bufSize) n瀛楄妭 鏁版嵁 */ /*- 濡傛灉鏄潵鑷孩缃戞暟鎹 */ - if ((ENUM_OUTNET_RED == ch) || (ENUM_OUTNET_EXTEND_RED == ch) || (ENUM_ANOTHER_EXTEND_RED == ch)) + if (ch_rob == ENUM_CHN_RED) { /*- 鏄惁鏉ヨ嚜ats杞溅鐨勮緭鍏ユ暟鎹 */ if(ENUM_CM_TRUE == isTransformInFrame) @@ -531,16 +548,11 @@ CM_INT32 SFM_RxOutnetSafe(OUT CM_UINT8 buf[], IN CM_UINT32 bufSize) */ /*- 杈撳嚭绾㈣摑缃戠殑澶栫綉鎺ユ敹甯 */ CM_LongToChar(redLen, buf); - if((redLen > 0u) && (blueLen > 0u)) - { - CM_LongToChar(blueLen, s_TmpCache); /* parasoft-suppress MISRA2004-17_1 "鎸囬拡杩愮畻鎻愰珮浠g爜鎵ц鏁堢巼" */ - blueLen += 4u; - MSCP_LOG_MSG("SFM_RxOutnetSafe redLen=%u, blueLen=%u\n", redLen, blueLen); - ret = SFM_OutProtclTwoRepeat(buf, redLen + 4u, s_TmpCache, &blueLen); - MSCP_LOG_MSG("SFM_RxOutnetSafe Two Repeat redLen=%u, blueLen=%u\n", redLen, blueLen); - CM_ASSERT(ret == 1u, PRTCL_MODE, DARK_FAULT_CODE_FUN_ORDER_3, TSCP_DARK_ASSERT_7); - blueLen -= 4u; - } + CM_LongToChar(blueLen, s_TmpCache); /* parasoft-suppress MISRA2004-17_1 "鎸囬拡杩愮畻鎻愰珮浠g爜鎵ц鏁堢巼" */ + blueLen += 4u; + ret = s_Outnet_Recv_Dedup(buf, redLen + 4u, s_TmpCache, &blueLen); + CM_ASSERT(ret == 1u, PRTCL_MODE, DARK_FAULT_CODE_FUN_ORDER_3, TSCP_DARK_ASSERT_7); + blueLen -= 4u; CM_RE_ASSERT((redLen + blueLen + 8u) <= bufSize, PRTCL_MODE, DARK_FAULT_CODE_FUN_ORDER_3, TSCP_DARK_ASSERT_6); CM_LongToChar(blueLen, &buf[4u + redLen]); /* parasoft-suppress MISRA2004-17_1 "鎸囬拡杩愮畻鎻愰珮浠g爜鎵ц鏁堢巼" */ allLen = (CM_INT32)CM_UNSIGNED_INT_EXP(redLen + blueLen + 8u); @@ -2417,4 +2429,52 @@ CM_UINT32 SFM_GetTxSn(void) /*- 杩斿洖sn鍙*/ return tmpsn; } +static ENUM_OUTNET_CHN_T s_Outnet_Chn_ROB(ENUM_OUTNET_CHN_T chn) +{ + ENUM_OUTNET_CHN_T rt = ENUM_OUTNET_ERROR; + switch(chn) + { + case ENUM_OUTNET_RED: + case ENUM_OUTNET_EXTEND_RED: + case ENUM_ANOTHER_EXTEND_RED: + case ENUM_CHN_RED: + rt = ENUM_CHN_RED; + break; + case ENUM_OUTNET_BLUE: + case ENUM_OUTNET_EXTEND_BLUE: + case ENUM_ANOTHER_EXTEND_BLUE: + case ENUM_CHN_BLUE: + rt = ENUM_CHN_BLUE; + break; + default: + rt = ENUM_OUTNET_ERROR; + break; + } + return rt; +} +/** + * @brief 澶栫綉鎺ユ敹鍚庣殑鍘婚噸鎿嶄綔 + * @param redData 绾㈢綉鏁版嵁鎸囬拡 + * @param redDataLen 绾㈢綉鏁版嵁闀垮害 + * @param blueData 钃濈綉鏁版嵁鎸囬拡 + * @param blueDataLen 钃濈綉鏁版嵁闀垮害 + */ +static CM_UINT8 s_Outnet_Recv_Dedup(CM_UINT8 *redData, CM_UINT32 redDataLen, CM_UINT8 *blueData, CM_UINT32 *blueDataLen) +{ + CM_UINT8 ret = 0u; + if((redData != NULL) && (blueData != NULL) && (blueDataLen != NULL)) + { + if ((redDataLen > 4u) && (*blueDataLen > 4u)) + { + MSCP_LOG_MSG("SFM_RxOutnetSafe redLen=%u, blueLen=%u\n", redDataLen, *blueDataLen); + ret = SFM_OutProtclTwoRepeat(redData, redDataLen, blueData, blueDataLen); + MSCP_LOG_MSG("SFM_RxOutnetSafe Two Repeat redLen=%u, blueLen=%u\n", redDataLen, *blueDataLen); + } + else + { + ret = 1u; + } + } + return ret; +} diff --git a/TSCP/src/dqu_common/dqu_cbtc_common/dquCbtcConfigData.c b/TSCP/src/dqu_common/dqu_cbtc_common/dquCbtcConfigData.c index 608c79c..6a1e017 100644 --- a/TSCP/src/dqu_common/dqu_cbtc_common/dquCbtcConfigData.c +++ b/TSCP/src/dqu_common/dqu_cbtc_common/dquCbtcConfigData.c @@ -18,6 +18,8 @@ #include "dfsDataRead.h" #include "CbtcVersion.h" #include "dquCbtcType.h" +#include "../dqu_emap_common/dsuEmapDefine.h" +#include "../../APP/ciapp/System/SystemParameterManage.h" static CBTC_CFG_DATA_STRU *qds_dsuCbtcConfigDataStru=NULL;/*CBTC配置信息用查询数据源*/ static CBTC_CFG_DATA_STRU *g_pCbtcConfigDataStru=NULL; /*指向初始化用数据库的指针*/ @@ -30,20 +32,27 @@ static UINT16 g_RowCount; /* static UINT16 g_wCurInitStruProg=0U;/*当前结构体初始化进程,分步加载时使用*/ static UINT16 g_wCurMainIndex=0U; /*当前主处理索引,分步加载时使用*/ +extern UINT8 CI_SYSTEM_TYPE_RCI; +extern UINT8 gLocalPublicDataType; + /*----------内部函数声明开始--------------*/ /*解析列车车型配置数据1*/ UINT8 dfsInitTrainModelConfigData(UINT8 *pDataAddr, UINT32 dataSize, UINT16 rowCount); /*列车性能参数配置结构体2*/ UINT8 dfsInitTrainPerformConfigData(UINT8 *pDataAddr, UINT32 dataSize, UINT16 rowCount); +#if 0 /*各子系统公用数据配置结构体3-CPK*/ UINT8 dfsInitSubSystemCommonConfigData_CPK(UINT8 *pDataAddr, UINT32 dataSize, UINT16 rowCount); /*各子系统公用数据配置结构体3-FAO*/ UINT8 dfsInitSubSystemCommonConfigData_FAO(UINT8 *pDataAddr, UINT32 dataSize, UINT16 rowCount); +#endif /*各子系统公用数据配置结构体3-HLT,依据互联互通数据结构V12.0.0修改,modify by lmy 20180314*/ UINT8 dfsInitSubSystemCommonConfigData_HLT(UINT8 *pDataAddr, UINT32 dataSize, UINT16 rowCount); +#if 0 /*各子系统公用数据配置结构体3-DG,依据互联互通数据结构V12.0.0修改后,DG和HLT不再使用相同的初始化函数,故增加此函数,add by lmy 20180312*/ UINT8 dfsInitSubSystemCommonConfigData_DG(UINT8 *pDataAddr, UINT32 dataSize, UINT16 rowCount); +#endif /*初始化[各子系统公用数据配置]-CC(要求有且仅有1行数据)*/ UINT8 dfsInitSubSystemCommonConfigData_CC(UINT8 *pDataAddr, UINT32 dataSize, UINT16 rowCount); /*车辆段配置数据结构体4-FAO ,互联互通与此版本一至*/ @@ -61,16 +70,16 @@ static UINT8 initConfigCbtcInfoTaskTab(void); /*初始化任务登记表*/ static INIT_TASK_TAB_STRU g_struInitTaskTab[]= { - {DQU_QFUN_TRUE, CBTC_TRAIN_TYPE_CONFIG_ID, dfsInitTrainModelConfigData, 5,1,0}, - {DQU_QFUN_TRUE, CBTC_TRAIN_INFO_ID, dfsInitTrainPerformConfigData, 5,1,0}, - {DQU_QFUN_TRUE, CBTC_CONFIG_DATA_ID, dfsInitSubSystemCommonConfigData_CPK,5,1,0}, - {DQU_QFUN_TRUE, CBTC_CONFIG_DATA_ID, dfsInitSubSystemCommonConfigData_FAO,5,1,0}, - {DQU_QFUN_TRUE, CBTC_CONFIG_DATA_ID, dfsInitSubSystemCommonConfigData_HLT,5,1,0}, - {DQU_QFUN_TRUE, CBTC_CONFIG_DATA_ID, dfsInitSubSystemCommonConfigData_DG, 5,1,0}, - {DQU_QFUN_TRUE, CBTC_CONFIG_DEPOT_ID, dfsInitTrainDepotConfigData, 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}, + {DQU_QFUN_TRUE, CBTC_TRAIN_TYPE_CONFIG_ID, dfsInitTrainModelConfigData, 5,1,0}, + {DQU_QFUN_TRUE, CBTC_TRAIN_INFO_ID, dfsInitTrainPerformConfigData, 5,1,0}, + {DQU_QFUN_TRUE, CBTC_CONFIG_DATA_ID, NULL, 5,1,0}, + {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_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}, }; /*初始化任务登记表项目数量*/ static const UINT16 MAX_INITTASK_COUNT=sizeof(g_struInitTaskTab)/sizeof(INIT_TASK_TAB_STRU); @@ -114,7 +123,7 @@ static UINT8 initConfigCbtcInfoTaskTab(void) UINT8 cbtcVersionType=0U; cbtcVersionType = GetCbtcSysType(); - if (DQU_CBTC_CPK == cbtcVersionType)/*合库功能配置*/ + if (DQU_CBTC_CPK == cbtcVersionType)/*合库功能配置 暂不使用*/ { g_struInitTaskTab[3].bIsEffective=DQU_QFUN_FASLE;/*合库默认不执行,各子系统公用数据配置结构体3-FAO*/ g_struInitTaskTab[4].bIsEffective=DQU_QFUN_FASLE;/*合库默认不执行,各子系统公用数据配置结构体3-HLT*/ @@ -125,7 +134,7 @@ static UINT8 initConfigCbtcInfoTaskTab(void) g_struInitTaskTab[9].bIsEffective = DQU_QFUN_FASLE;/*合库默认不执行,出入段线脱轨防护区域表*/ rtnValue = 1U; } - else if (DQU_CBTC_FAO == cbtcVersionType) /*FAO功能配置*/ + else if (DQU_CBTC_FAO == cbtcVersionType) /*FAO功能配置 暂不使用*/ { g_struInitTaskTab[2].bIsEffective=DQU_QFUN_FASLE;/*FAO默认不执行,各子系统公用数据配置结构体3-CPK*/ g_struInitTaskTab[4].bIsEffective=DQU_QFUN_FASLE;/*FAO默认不执行,各子系统公用数据配置结构体3-HLT*/ @@ -135,7 +144,7 @@ static UINT8 initConfigCbtcInfoTaskTab(void) g_struInitTaskTab[9].bIsEffective = DQU_QFUN_FASLE;/*FAO默认不执行,出入段线脱轨防护区域表*/ rtnValue = 1U; } - else if(DQU_CBTC_HLT == cbtcVersionType) /*互联互通功能配置*/ + else if(DQU_CBTC_HLT == cbtcVersionType) /*互联互通功能配置 暂不使用*/ { g_struInitTaskTab[2].bIsEffective=DQU_QFUN_FASLE;/*互联互通默认不执行,各子系统公用数据配置结构体3-CPK*/ g_struInitTaskTab[3].bIsEffective=DQU_QFUN_FASLE;/*互联互通默认不执行,各子系统公用数据配置结构体3-FAO*/ @@ -143,9 +152,9 @@ static UINT8 initConfigCbtcInfoTaskTab(void) g_struInitTaskTab[7].bIsEffective = DQU_QFUN_FASLE;/*互联互通默认不执行,车辆段配置*/ g_struInitTaskTab[8].bIsEffective = DQU_QFUN_FASLE;/*互联互通默认不执行,边界计轴区段配置*/ g_struInitTaskTab[9].bIsEffective = DQU_QFUN_FASLE;/*互联互通默认不执行,出入段线脱轨防护区域表*/ - rtnValue = 1; + rtnValue = 1u; } - else if(DQU_CBTC_DG == cbtcVersionType)/*单轨功能配置*/ + else if(DQU_CBTC_DG == cbtcVersionType)/*单轨功能配置 暂不使用*/ { g_struInitTaskTab[2].bIsEffective=DQU_QFUN_FASLE;/*DG默认不执行,各子系统公用数据配置结构体3-CPK*/ g_struInitTaskTab[3].bIsEffective=DQU_QFUN_FASLE;/*DG默认不执行,各子系统公用数据配置结构体3-FAO*/ @@ -157,11 +166,26 @@ static UINT8 initConfigCbtcInfoTaskTab(void) } else if (DQU_CBTC_CC == cbtcVersionType)/*车车功能配置*/ { - 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*/ - rtnValue = 1U; + if ((DATA_TYPE_28_BRANCH == gLocalPublicDataType) || (DATA_TYPE_23_BRANCH == gLocalPublicDataType)) + { + g_struInitTaskTab[0].bIsEffective = DQU_QFUN_FASLE;/*28、23分支默认不执行,列车车型配置表*/ + g_struInitTaskTab[1].bIsEffective = DQU_QFUN_FASLE;/*28、23分支默认不执行,列车性能参数配置表*/ + g_struInitTaskTab[2].bIsEffective = DQU_QFUN_FASLE;/*28、23分支默认不执行,各子系统公用数据配置结构体3-CPK*/ + g_struInitTaskTab[3].bIsEffective = DQU_QFUN_FASLE;/*28、23分支默认不执行,各子系统公用数据配置结构体3-FAO*/ + g_struInitTaskTab[5].bIsEffective = DQU_QFUN_FASLE;/*28、23分支默认不执行,各子系统公用数据配置结构体3-DG*/ + g_struInitTaskTab[6].bIsEffective = DQU_QFUN_FASLE;/*28、23分支默认不执行,车辆段配置信息*/ + g_struInitTaskTab[7].bIsEffective = DQU_QFUN_FASLE;/*28、23分支默认不执行,各子系统公用数据配置结构体3-CC*/ + g_struInitTaskTab[8].bIsEffective = DQU_QFUN_FASLE;/*28、23分支默认不执行,边界计轴区段配置*/ + g_struInitTaskTab[9].bIsEffective = DQU_QFUN_FASLE;/*28、23分支默认不执行,出入段线脱轨防护区域表*/ + } + 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*/ + } + rtnValue = 1u; } else /*未出现的配置版本值,可能未配置标志位*/ { @@ -278,26 +302,46 @@ UINT8 dfsInitTrainModelConfigData(UINT8 *pDataAddr, UINT32 dataSize, UINT16 rowC UINT32 i =0U; static UINT32 rowDataLen = 0U; UINT8 *pData = pDataAddr; - - g_pCbtcConfigDataStru->TrainTypeConfigLen = rowCount; + UINT16 tempTrainName = 0u; + UINT16 TrainCount = 0u; + if (NULL != pDataAddr) { - if (rowCount > 0) + if (0u < rowCount) { rowDataLen = dataSize / rowCount; - for (i = 0; icbtcTrainTypeConfig[i].TrainName = ShortFromChar(pData); - pData += 2; + tempTrainName = ShortFromChar(pData); + if (((0x3cu == CI_SYSTEM_TYPE_RCI) && (0x14u == (UINT8)(tempTrainName >> 8u))) + || ((0x3du == CI_SYSTEM_TYPE_RCI) && (0x10u == (UINT8)(tempTrainName >> 8u)))) + { + /*CI只初始化0x14类型的車,RC只初始化0x10类型的車*/ + g_pCbtcConfigDataStru->cbtcTrainTypeConfig[i].TrainName = ShortFromChar(pData); + pData += 2u; - g_pCbtcConfigDataStru->cbtcTrainTypeConfig[i].TrainType = *pData; - pData += 1; + g_pCbtcConfigDataStru->cbtcTrainTypeConfig[i].TrainType = *pData; + pData += 1u; + + TrainCount += 1u; + } + else + { + /*不初始化*/ + pData += 3u; + } } } - rtnValue = 1; + else + { + /*nothing*/ + } + + g_pCbtcConfigDataStru->TrainTypeConfigLen = (UINT32)TrainCount; + rtnValue = 1u; } else { @@ -318,38 +362,51 @@ UINT8 dfsInitTrainModelConfigData(UINT8 *pDataAddr, UINT32 dataSize, UINT16 rowC UINT8 dfsInitTrainPerformConfigData(UINT8 *pDataAddr, UINT32 dataSize, UINT16 rowCount) { UINT8 rtnValue = 0U; - UINT32 i =0U; - UINT32 rowDataLen=0U; + UINT32 i = 0U; + UINT32 rowDataLen = 0U; UINT8 *pData = pDataAddr; if (NULL != pDataAddr) { g_pCbtcConfigDataStru->TrainInfoLen = rowCount; - if (rowCount > 0) + if (0u < rowCount) { rowDataLen = dataSize / rowCount; - for (i = 0; icbtcTrainInfo[i].TrainType = *pData; - pData += 1; + pData += 1u; /*列车长度*/ g_pCbtcConfigDataStru->cbtcTrainInfo[i].TrainLength = ShortFromChar(pData); - pData += 2; + pData += 2u; /*列车最大牵引加速度*/ g_pCbtcConfigDataStru->cbtcTrainInfo[i].TrainMaxTracAcc = *pData; - pData += 1; + pData += 1u; /*线路最大下坡坡度*/ g_pCbtcConfigDataStru->cbtcTrainInfo[i].WorstGrade = ShortFromChar(pData); - pData += 2; + pData += 2u; + /*紧急制动最高触发速度,跳过*/ + pData += 2u; + /*站台追踪时,列车间隔距离*/ g_pCbtcConfigDataStru->cbtcTrainInfo[i].StationTrackDistance = ShortFromChar(pData); - pData += 2; + pData += 2u; + /*对向行驶双车间隔最小安全距离,跳过*/ + pData += 2u; + /*区间同向行驶双车间隔最小安全距离(cm),跳过*/ + pData += 2u; + /*工程车信号系统适配,跳过*/ + pData += 2u; } } + else + { + /*nothing*/ + } rtnValue = 1; @@ -361,7 +418,7 @@ UINT8 dfsInitTrainPerformConfigData(UINT8 *pDataAddr, UINT32 dataSize, UINT16 ro } return rtnValue; } - +#if 0 /********************************************** 函数功能:初始化[各子系统公用数据配置]-CPK(要求有且仅有1行数据) 输入参数:pDataAddr:表数据首地址 @@ -565,6 +622,7 @@ UINT8 dfsInitSubSystemCommonConfigData_FAO(UINT8 *pDataAddr, UINT32 dataSize, UI return rtnValue; } +#endif /********************************************** 函数功能:初始化[各子系统公用数据配置]-HLT(要求有且仅有1行数据) @@ -817,7 +875,7 @@ UINT8 dfsInitSubSystemCommonConfigData_HLT(UINT8 *pDataAddr, UINT32 dataSize, UI return rtnValue; } - +#if 0 /********************************************** 函数功能:初始化[各子系统公用数据配置]-DG(要求有且仅有1行数据) 输入参数:pDataAddr:表数据首地址 @@ -932,7 +990,7 @@ UINT8 dfsInitSubSystemCommonConfigData_DG(UINT8 *pDataAddr, UINT32 dataSize, UIN return rtnValue; } - +#endif /********************************************** 函数功能:初始化[各子系统公用数据配置]-CC(要求有且仅有1行数据) 输入参数:pDataAddr:表数据首地址 @@ -948,120 +1006,101 @@ UINT8 dfsInitSubSystemCommonConfigData_CC(UINT8 *pDataAddr, UINT32 dataSize, UIN if ((NULL != pDataAddr) && (1U == rowCount)) { /*填充数据结构体*/ - /*线路最高限速*/ - g_pCbtcConfigDataStru->cbtcConfigData.MaxLineLimitSpeed = *pDataAddr; - g_pCbtcConfigDataStru->cbtcConfigData.MaxLineLimitSpeed = (UINT16)(27.77778*g_pCbtcConfigDataStru->cbtcConfigData.MaxLineLimitSpeed + 0.5); - pDataAddr += 1; /*临时限速最高限速*/ g_pCbtcConfigDataStru->cbtcConfigData.MaxTsrSpeed = *pDataAddr; - pDataAddr += 1; + pDataAddr += 1u; - /*NTP校时时区差*/ - g_pCbtcConfigDataStru->cbtcConfigData.TimeZoneDifference = *pDataAddr; - pDataAddr += 1; - -#if 0 - /*30.13 数据结构删除*/ - /*区间同向行驶双车间隔最小安全距离(cm))*/ - g_pCbtcConfigDataStru->cbtcConfigData.MABackDistance = ShortFromChar(pDataAddr); - pDataAddr += 2; - -#endif /*一次设置临时限速的最大个数*/ g_pCbtcConfigDataStru->cbtcConfigData.MaxTsrNum = ShortFromChar(pDataAddr); - pDataAddr += 2; + pDataAddr += 2u; /*一个临时限速报文中包含的最大逻辑区段数量*/ g_pCbtcConfigDataStru->cbtcConfigData.MaxSectionOfTsr = ShortFromChar(pDataAddr); - pDataAddr += 2; -#if 0 - /*IVOC-IVOC信故障判断时间(ms)*/ - g_pCbtcConfigDataStru->cbtcConfigData.IvocIvocCommunicationErrorTime = LongFromChar(pDataAddr); - pDataAddr += 4; -#endif - /*IVOC-TIOC通信故障判断时间(ms)*/ + pDataAddr += 2u; + + /*CI-CI通信中断时间 (单位MS)*/ + g_pCbtcConfigDataStru->cbtcConfigData.CICICommunicationErrorTime = LongFromChar(pDataAddr); + pDataAddr += 4u; + + /*CI-VOBC通信故障判断时间(ms)*/ g_pCbtcConfigDataStru->cbtcConfigData.CiVobcCommunicationErrorTime = LongFromChar(pDataAddr); - pDataAddr += 4; -#if 0 - /*VOBC-ITS通信故障判断时间(ms)*/ - g_pCbtcConfigDataStru->cbtcConfigData.VobcAtsCommunicationErrorTime = LongFromChar(pDataAddr); - pDataAddr += 4; + pDataAddr += 4u; - /*TMC-ITS通信故障判断时间(ms)*/ - g_pCbtcConfigDataStru->cbtcConfigData.TmcItsCommunicationErrorTime = LongFromChar(pDataAddr); - pDataAddr += 4; -#endif - /*TMC-OC通信故障判断时间(ms)*/ - g_pCbtcConfigDataStru->cbtcConfigData.TmcOcCommunicationErrorTime = LongFromChar(pDataAddr); - pDataAddr += 4; + /*CI-ZC通信故障判断时间(ms)*/ + g_pCbtcConfigDataStru->cbtcConfigData.CiZcCommunicationErrorTime = LongFromChar(pDataAddr); + pDataAddr += 4u; - /*ITS-OC通信故障判断时间(ms)*/ - g_pCbtcConfigDataStru->cbtcConfigData.ItsOcCommunicationErrorTime = LongFromChar(pDataAddr); - pDataAddr += 4; - - /*OC-PSD通信故障判断时间(ms)*/ - g_pCbtcConfigDataStru->cbtcConfigData.OcPsdCommunicationErrorTime = LongFromChar(pDataAddr); - pDataAddr += 4; -#if 0 - /*IVOC-TSL通信故障判断时间(ms)*/ - g_pCbtcConfigDataStru->cbtcConfigData.IvocTslCommunicationErrorTime = LongFromChar(pDataAddr); - pDataAddr += 4; -#endif - /*OC-TSL通信故障判断时间(ms)*/ - g_pCbtcConfigDataStru->cbtcConfigData.OcTslCommunicationErrorTime = LongFromChar(pDataAddr); - pDataAddr += 4; - - /*满足精准停车条件的MA延伸长度*/ - g_pCbtcConfigDataStru->cbtcConfigData.MALengthForATOParking = ShortFromChar(pDataAddr); - pDataAddr += 2; + /*CI-PSD通信故障判断时间(ms)*/ + g_pCbtcConfigDataStru->cbtcConfigData.CiPsdCommunicationErrorTime = LongFromChar(pDataAddr); + pDataAddr += 4u; /*本线系统定义逻辑方向与上下行方向的关系*/ g_pCbtcConfigDataStru->cbtcConfigData.LinkLogicDirUpAndDown = *pDataAddr; - pDataAddr += 1; + pDataAddr += 1u; -#if 0 - /*数据结构30.13 删除*/ - /*对向行驶双车间隔最小安全距离*/ - g_pCbtcConfigDataStru->cbtcConfigData.OppositeTrackDistance = ShortFromChar(pDataAddr); - pDataAddr += 2; + /*车地通信接口类型,暂不使用,跳过该接口*/ + pDataAddr += 1u; - /*站台追踪时,列车间隔距离*/ - g_pCbtcConfigDataStru->cbtcConfigData.StationTrackDistance = ShortFromChar(pDataAddr); - pDataAddr += 2; + /*正线是否动态测试*/ + g_pCbtcConfigDataStru->cbtcConfigData.chZXDynamicTestSwitch = *pDataAddr; + pDataAddr += 1u; -#endif + /*ZC-CI接口协议版本号*/ + g_pCbtcConfigDataStru->cbtcConfigData.VersionOfZCToCI = *pDataAddr; + pDataAddr += 1u; + + /*VOBC-CI接口协议版本号*/ + g_pCbtcConfigDataStru->cbtcConfigData.VersionOfVOBCToCI = *pDataAddr; + pDataAddr += 1u; + + /*PSC-CI通信故障判断时间(ms)*/ + g_pCbtcConfigDataStru->cbtcConfigData.CommFaultTimeOfPSC_CI = LongFromChar(pDataAddr); + pDataAddr += 4u; + + /*VOBC-CI后备通信故障判断时间(ms)*/ + g_pCbtcConfigDataStru->cbtcConfigData.dwVobcCiackUpCommErrorTime = LongFromChar(pDataAddr); + pDataAddr += 4u; + + /*CI/DSU与计轴系统校验的协议版本号*/ + g_pCbtcConfigDataStru->cbtcConfigData.ProtocolVersionOfAxisToCI = ShortFromChar(pDataAddr); + pDataAddr += 2u; + + /*保护区段锁闭方式*/ + g_pCbtcConfigDataStru->cbtcConfigData.chOverlapLockType = *pDataAddr; + pDataAddr += 1u; + + /*场段进路占用检查*/ + g_pCbtcConfigDataStru->cbtcConfigData.chOccuCheckinCD = *pDataAddr; + pDataAddr += 1u; + + /*线路最小可能车长*/ + g_pCbtcConfigDataStru->cbtcConfigData.dwLineMinTrainLength = (UINT32)ShortFromChar(pDataAddr); + pDataAddr += 2u; + + /*全线免筛功能开关*/ + g_pCbtcConfigDataStru->cbtcConfigData.chWLSFunSwitch = *pDataAddr; + pDataAddr += 1u; + + /*TMC-RC通信故障判断时间(ms)*/ + g_pCbtcConfigDataStru->cbtcConfigData.TmcOcCommunicationErrorTime = LongFromChar(pDataAddr); + pDataAddr += 4u; + + /*IVOC-RC通信故障判断时间(ms)*/ + g_pCbtcConfigDataStru->cbtcConfigData.IvocOcCommunicationErrorTime = LongFromChar(pDataAddr); + pDataAddr += 4u; + + /*RC-TSL通信故障判断时间(ms)*/ + g_pCbtcConfigDataStru->cbtcConfigData.OcTslCommunicationErrorTime = LongFromChar(pDataAddr); + pDataAddr += 4u; + /*线路最差情况下紧急制动距离(单位m)*/ g_pCbtcConfigDataStru->cbtcConfigData.MaxMALength = LongFromChar(pDataAddr); - pDataAddr += 4; + pDataAddr += 4u; - /*TIOC 与 TIOC通信中断时间 (单位MS)*/ - g_pCbtcConfigDataStru->cbtcConfigData.CICICommunicationErrorTime = LongFromChar(pDataAddr); - pDataAddr += 4; - - /*线路最小车长*/ - g_pCbtcConfigDataStru->cbtcConfigData.dwLineMinTrainLength = LongFromChar(pDataAddr); - pDataAddr += 4; - - /*正线是否支持动态测试开关*/ - g_pCbtcConfigDataStru->cbtcConfigData.chZXDynamicTestSwitch = *pDataAddr; - pDataAddr += 1; - - /*动态测试开关*/ + /*动态测试功能开关*/ g_pCbtcConfigDataStru->cbtcConfigData.chDynamicTestSwitch = *pDataAddr; - pDataAddr += 1; - - /*全线免筛开关*/ - g_pCbtcConfigDataStru->cbtcConfigData.chWLSFunSwitch = *pDataAddr; - pDataAddr += 1; - - /*区间疏散前查距离*/ - g_pCbtcConfigDataStru->cbtcConfigData.dwEaFrontDis = LongFromChar(pDataAddr); - pDataAddr += 4; - - /*区间疏散后查距离*/ - g_pCbtcConfigDataStru->cbtcConfigData.dwEaBehindDis = LongFromChar(pDataAddr); - pDataAddr += 4; + pDataAddr += 1u; pDataAddr += 1U; /*跳过远程RM功能开关*/ @@ -1072,23 +1111,22 @@ UINT8 dfsInitSubSystemCommonConfigData_CC(UINT8 *pDataAddr, UINT32 dataSize, UIN g_pCbtcConfigDataStru->cbtcConfigData.dwVobcCiackUpCommErrorTime = LongFromChar(pDataAddr); /*RC与IVOC后备通道通信故障判断时间*/ pDataAddr += 4U; - - g_pCbtcConfigDataStru->cbtcConfigData.ProtocolVersionOfAxisToCI = ShortFromChar(pDataAddr); /*CI与计轴系统校验的协议版本号,add by lq 2023.11.16*/ - pDataAddr += 2U; g_pCbtcConfigDataStru->cbtcConfigData.cHitSoftWallSwitch = *pDataAddr; /*撞软墙功能开关*/ pDataAddr += 1U; - g_pCbtcConfigDataStru->cbtcConfigData.chOverlapLockType= *pDataAddr; /*保护区段锁闭方式*/ - pDataAddr += 1U; - - g_pCbtcConfigDataStru->cbtcConfigData.chOccuCheckinCD = *pDataAddr; /*场段进路占用检查*/ - pDataAddr += 1U; - g_pCbtcConfigDataStru->cbtcConfigData.chNoCGFollowUtSwitch = *pDataAddr; /*无C轨站型B轨有UT车是可追踪功能开关*/ pDataAddr += 1U; - rtnValue = 1; + /*区间疏散前查距离*/ + g_pCbtcConfigDataStru->cbtcConfigData.dwEaFrontDis = LongFromChar(pDataAddr); + pDataAddr += 4u; + + /*区间疏散后查距离*/ + g_pCbtcConfigDataStru->cbtcConfigData.dwEaBehindDis = LongFromChar(pDataAddr); + pDataAddr += 4u; + + rtnValue = 1u; } return rtnValue; diff --git a/TSCP/src/dqu_common/dqu_cbtc_common/dquCbtcConfigData.h b/TSCP/src/dqu_common/dqu_cbtc_common/dquCbtcConfigData.h index 26f56a2..ab74793 100644 --- a/TSCP/src/dqu_common/dqu_cbtc_common/dquCbtcConfigData.h +++ b/TSCP/src/dqu_common/dqu_cbtc_common/dquCbtcConfigData.h @@ -48,48 +48,41 @@ extern "C" { /*各子系统公用数据配置结构体*/ typedef struct { - UINT16 MaxLineLimitSpeed;/*线路最高限速,此处数据库中存放的是UINT8的km/h数据,需要在这里转换成cmps单位的数据*/ - UINT8 MaxTsrSpeed;/*临时限速最高限速*/ - UINT8 TimeZoneDifference;/*NTP校时时区差.格林威治时间与本地时间的时区差,单位:时区,应用使用时应乘以3600转换为秒。*/ - UINT16 MABackDistance;/*安全防护距离.考虑到最不利情况情况下(最大潜在退行距离和线路最大坡度等)移动授权考虑的安全防护距离*/ - UINT16 MaxTsrNum;/*一次设置临时限速的最大个数*/ - UINT16 MaxSectionOfTsr;/*一个临时限速报文中包含的最大逻辑区段数量*/ - UINT32 VobcZcCommunicationErrorTime;/*VOBCZC通信故障判断时间*/ - UINT32 DsuZcCommunicationErrorTime;/*DSUZC通信故障判断时间*/ - UINT32 ZcZcCommunicationErrorTime;/*ZCZC通信故障判断时间*/ - UINT32 ZcCiCommunicationErrorTime;/*ZCCI通信故障判断时间*/ - UINT32 DsuAtsCommunicationErrorTime;/*DSUATS通信故障判断时间*/ - UINT32 ZcAtsCommunicationErrorTime;/*ZCATS通信故障判断时间*/ - UINT32 VobcCiCommunicationErrorTime;/*VOBCCI通信故障判断时间*/ - UINT32 VobcAtsCommunicationErrorTime;/*VOBCATS通信故障判断时间*/ - UINT16 MaxOverlapLength;/*系统定义最大保护区段长度(cm)*/ - UINT32 CICICommunicationErrorTime; /*CI-CI通信故障判断时间(ms)*/ - UINT32 CiVobcCommunicationErrorTime;/*CI-VOBC通信故障判断时间*/ - UINT32 CiZcCommunicationErrorTime; /*CI-ZC通信故障判断时间*/ - UINT32 CiPsdCommunicationErrorTime; /*CI-ZC通信故障判断时间*/ - UINT32 IvocIvocCommunicationErrorTime;/*IVOC-IVOC信故障判断时间(ms),add by yt,2022年3月1日,适配车车系统配置数据*/ - UINT32 IvocOcCommunicationErrorTime;/*IVOC-OC通信故障判断时间(ms),add by yt,2022年3月1日,适配车车系统配置数据*/ + UINT8 MaxTsrSpeed; /*临时限速最高限速*/ + UINT16 MaxTsrNum; /*一次设置临时限速的最大个数*/ + UINT16 MaxSectionOfTsr; /*一个临时限速报文中包含的最大逻辑区段数量*/ + UINT32 CICICommunicationErrorTime; /*CI-CI通信故障判断时间(ms)*/ + UINT32 CiVobcCommunicationErrorTime; /*CI-VOBC通信故障判断时间*/ + UINT32 CiZcCommunicationErrorTime; /*CI-ZC通信故障判断时间*/ + UINT32 CiPsdCommunicationErrorTime; /*CI-PSD通信故障判断时间*/ + UINT8 LinkLogicDirUpAndDown; /*系统定义逻辑方向与上下行方向的关系,add by yt,2022年3月1日,适配车车系统配置数据*/ + UINT8 chZXDynamicTestSwitch; /*正线是否支持动态测试 配置中 aa关闭 55打开*/ + UINT8 VersionOfZCToCI; /*ZC-CI接口协议版本号,add by sds 2019-1-21*/ + UINT8 VersionOfVOBCToCI; /*VOBC-CI接口协议版本号,add by sds 2019-1-21*/ + UINT32 CommFaultTimeOfPSC_CI; /*PSC-CI通信故障判断时间(ms) 互联互通数据结构V20.0.0*/ + UINT32 dwVobcCiackUpCommErrorTime; /*IVOC-RC或VOBC-CI后备通道通信故障判断时间(ms)----适配车车和510项目*/ + UINT16 ProtocolVersionOfAxisToCI; /*Axis-CI接口协议版本号,add by lq 2023.11.16*/ + UINT8 chOverlapLockType; /*保护区段锁闭方式 0x01 ATS锁闭 0x02 CI锁闭*/ + UINT8 chOccuCheckinCD; /*场段进路占用检查 0x55检查 0xaa不检查*/ + 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打开*/ + UINT8 cAwakeCheckSpksSwitch; /*唤醒过程中检查SPKS状态开关,0xaa检查,0x55不检查*/ + UINT32 dwEaFrontDis; /*区间疏散防护区域前查距离*/ + UINT32 dwEaBehindDis; /*区间疏散防护区域后查距离*/ + UINT8 cHitSoftWallSwitch; /*撞软墙功能开关 0x55开关打开 0xaa开关关闭*/ + UINT8 chNoCGFollowUtSwitch; /*无C轨站型B轨有UT车是可追踪功能开关 aa打开 55关闭*/ +#if 0 UINT32 TmcItsCommunicationErrorTime;/*TMC-ITS通信故障判断时间(ms),add by yt,2022年3月1日,适配车车系统配置数据*/ - UINT32 TmcOcCommunicationErrorTime;/*TMC-OC通信故障判断时间(ms),add by yt,2022年3月1日,适配车车系统配置数据*/ UINT32 ItsOcCommunicationErrorTime;/*ITS-OC通信故障判断时间(ms),add by yt,2022年3月1日,适配车车系统配置数据*/ UINT32 OcPsdCommunicationErrorTime;/*OC-PSD通信故障判断时间(ms),add by yt,2022年3月1日,适配车车系统配置数据*/ UINT32 IvocTslCommunicationErrorTime;/*IVOC-TSL通信故障判断时间(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日,适配车车系统配置数据*/ UINT16 OppositeTrackDistance; /*对向行驶双车间隔最小安全距离(cm),add by yt,2022年3月1日,适配车车系统配置数据*/ - UINT32 MaxMALength; /*线路最差情况下紧急制动距离(单位m),add by yt,2022年3月1日,适配车车系统配置数据*/ - UINT32 dwLineMinTrainLength; /*系统配置数据,线路最小车长*/ - UINT8 chZXDynamicTestSwitch; /*正线是否支持动态测试 配置中 aa关闭 55打开*/ - UINT8 chDynamicTestSwitch; /*是否支持动态测试开关 配置中 aa关闭 55打开*/ - UINT8 chWLSFunSwitch; /* 是否支持全线免筛功能,0x55 不支持 0xAA支持 */ - UINT32 dwEaFrontDis; /*区间疏散防护区域前查距离*/ - UINT32 dwEaBehindDis; /*区间疏散防护区域后查距离*/ - UINT8 cAwakeCheckSpksSwitch; /*唤醒过程中检查SPKS状态开关,0xaa检查,0x55不检查*/ - UINT32 dwVobcCiackUpCommErrorTime; /*IVOC-RC或VOBC-CI后备通道通信故障判断时间(ms)----适配车车和510项目*/ - UINT8 cHitSoftWallSwitch; /*撞软墙功能开关 0x55开关打开 0xaa开关关闭*/ - UINT8 chOverlapLockType; /*保护区段锁闭方式 0x01 ATS锁闭 0x02 CI锁闭*/ - UINT8 chOccuCheckinCD; /*场段进路占用检查 0x55检查 0xaa不检查*/ - UINT8 chNoCGFollowUtSwitch; /*无C轨站型B轨有UT车是可追踪功能开关 aa打开 55关闭*/ + /*为解决ats显示上下行问题新增一个字段---严广学2012-12-17*/ /*UINT8 LinkLogicDirUpAndDown;*/ /*link逻辑方向上下行*/ @@ -111,12 +104,10 @@ extern "C" { UINT8 VersionOfZCToCI; /*ZC-CI接口协议版本号,add by sds 2019-1-21*/ UINT8 VersionOfZCToATS; /*ZC-ATS接口协议版本号,add by sds 2019-1-21*/ UINT8 VersionOfVOBCToATS; /*VOBC-ATS接口协议版本号,add by sds 2019-1-21*/ - UINT8 VersionOfVOBCToCI; /*VOBC-CI接口协议版本号,add by sds 2019-1-21*/ UINT16 FactoryCodeOfCRSC; /*互联互通厂家代码中"通号"所属编号,add by sds 2020-02-12*/ UINT16 FactoryCodeOfTCT; /*互联互通厂家代码中"交控科技"所属编号”类型,add by sds 2020-02-12*/ UINT16 FactoryCodeOfTK; /*互联互通厂家代码中"铁科"所属编号”类型,add by sds 2020-02-12*/ UINT16 FactoryCodeOfZH; /*互联互通厂家代码中"众合"所属编号,add by sds 2020-02-12*/ - UINT32 CommFaultTimeOfPSC_CI; /*PSC-CI通信故障判断时间(ms) 互联互通数据结构V20.0.0*/ UINT32 CommFaultTimeOfPSC_VOBC; /*PSC-VOBC通信故障判断时间(ms) 互联互通数据结构V20.0.0*/ UINT32 CommFaultTimeOfPSC_IM; /*PSC-IM通信故障判断时间(ms) 互联互通数据结构V20.0.0*/ UINT8 CommProtocolTypeOfVOBC_PSC; /*VOBC-PSC接口协议类型 互联互通数据结构V20.0.0*/ @@ -125,7 +116,7 @@ extern "C" { UINT8 CommProtocolTypeOfVOBC_CI; /*VOBC与CI通信时使用接口协议类型 互联互通数据结构V20.0.0*/ UINT8 CommProtocolTypeOfVOBC_ZC; /*VOBC与ZC通信时使用接口协议类型 互联互通数据结构V20.0.0*/ UINT8 CommProtocolTypeOfVOBC_ATS; /*VOBC与ATS通信时使用接口协议类型 互联互通数据结构V20.0.0*/ - UINT16 ProtocolVersionOfAxisToCI; /*Axis-CI接口协议版本号,add by lq 2023.11.16*/ +#endif } CBTC_CONFIG_DATA_STRU; diff --git a/TSCP/src/dqu_common/dqu_dfs_common/dquCbtcType.c b/TSCP/src/dqu_common/dqu_dfs_common/dquCbtcType.c index e1a622b..160a6ec 100644 --- a/TSCP/src/dqu_common/dqu_dfs_common/dquCbtcType.c +++ b/TSCP/src/dqu_common/dqu_dfs_common/dquCbtcType.c @@ -27,7 +27,15 @@ void SetCbtcSysType(UINT8 sysType) { if(0xff == g_CbtcVersionType) { - g_CbtcVersionType=sysType; + if (DQU_CBTC_HLT == sysType) + { + /*HLT使用CC初始化。wyd 20260331*/ + g_CbtcVersionType = DQU_CBTC_CC; + } + else + { + g_CbtcVersionType = sysType; + } } else { diff --git a/TSCP/src/dqu_common/dqu_emap_common/dquEmapInit.c b/TSCP/src/dqu_common/dqu_emap_common/dquEmapInit.c index 4c45ced..a9c0b9e 100644 --- a/TSCP/src/dqu_common/dqu_emap_common/dquEmapInit.c +++ b/TSCP/src/dqu_common/dqu_emap_common/dquEmapInit.c @@ -250,9 +250,9 @@ static UINT8 initConfigEmapTaskTab() g_struInitTaskTab[loopIndex].bIsEffective = DQU_QFUN_FASLE;/*为补全数据表占位的空表60~80*/ } g_struInitTaskTab[EMAP_NOP_60].bIsEffective = DQU_QFUN_FASLE;/*为补全数据表占位的空表54*/ - if (0x55 != gLocalPublicDataType)/*28.0.0.14*/ + if (0x01 != gLocalPublicDataType)/*28.0.0.x或23.2..1.X*/ { - g_struInitTaskTab[EMAP_RC_ID].bIsEffective = DQU_QFUN_FASLE;/*28.0.0.14不具备电子地图RC表*/ + g_struInitTaskTab[EMAP_RC_ID].bIsEffective = DQU_QFUN_FASLE;/*28.0.0.x或23.2.1.X不具备电子地图RC表*/ } else { diff --git a/TSCP/src/dqu_common/dqu_emap_common/dquStructInit.c b/TSCP/src/dqu_common/dqu_emap_common/dquStructInit.c index ec44eee..6545466 100644 --- a/TSCP/src/dqu_common/dqu_emap_common/dquStructInit.c +++ b/TSCP/src/dqu_common/dqu_emap_common/dquStructInit.c @@ -1356,6 +1356,7 @@ static UINT8 STATION_STRU_init_DG(UINT8 *pDataAdd, DSU_STATION_STRU *pStationStr static UINT8 STATION_STRU_init_CC(UINT8 *pDataAdd, DSU_STATION_STRU *pStationStru) { UINT8 rtnValue = 0U; + UINT8 chDataType = gLocalPublicDataType; /*输入参数空指针防护*/ if ((NULL != pDataAdd) && (NULL != pStationStru)) { @@ -1376,9 +1377,19 @@ static UINT8 STATION_STRU_init_CC(UINT8 *pDataAdd, DSU_STATION_STRU *pStationStr pStationStru->wLinkId = ShortFromChar(pData); pData += 2U; - /*停车区域属性*/ - pStationStru->dwAttribute = LongFromChar(pData); - pData += 4U; + if (3U == chDataType) + { + /*厦门3分支数据结构 23.2.1.X 停车区域属性2字节*/ + pStationStru->dwAttribute = ShortFromChar(pData); + pData += 2U; + } + else + { + /*停车区域属性 主线和杭德分支4字节*/ + pStationStru->dwAttribute = LongFromChar(pData); + pData += 4U; + } + #if 0 /*站台默认停站时间*/ @@ -1611,7 +1622,7 @@ UINT8 AXLE_SGMT_STRU_init(UINT8 * pDataAdd, DSU_AXLE_SGMT_STRU * pAxleSgmtStru) pAxleSgmtStru->wId = ShortFromChar(pData); pData += 2U; - if (0x55 == chDataType)/*新版*/ + if ((0x01U == chDataType) || (0x03U == chDataType))/*主线或23分支*/ { wLength = 16U; } @@ -2566,7 +2577,7 @@ UINT8 LOGIC_SGMT_STRU_init(UINT8 * pDataAdd, DSU_LOGIC_SGMT_STRU * pLogicSgmtStr pLogicSgmtStru->wId = ShortFromChar(pData); pData += 2; - if (0x55 == chDataType)/*新版*/ + if ((0x01U == chDataType) || (0x03U == chDataType))/*主线或23分支*/ { wLength = 16U; } @@ -3447,9 +3458,9 @@ static UINT8 CI_STRU_init_CC(UINT8 * pDataAdd, DSU_CI_STRU * pCIStru) pCIStru->RCIEntraceType = *pData; pData += 1; #endif - if (0x55U == chDataType)/*新版*/ + if (0x01U == chDataType)/*新版*/ { - /*28.0.0.14不具备以下结构*/ + /*28.0.0.X或23.2.1.x不具备以下结构*/ /*全线免筛属性*/ pCIStru->cWLScreenType = *pData; pData += 1U; @@ -3574,9 +3585,9 @@ UINT8 RC_STRU_init(UINT8 * pDataAdd, DSU_CI_STRU * pCIStru) pCIStru->RCIEntraceType = *pData; pData += 1; #endif - if (0x55U == chDataType)/*新版*/ + if (0x01U == chDataType)/*新版*/ { - /*28.0.0.14不具备以下结构*/ + /*28.0.0.X或23.2.1.x不具备以下结构*/ /*全线免筛属性*/ pCIStru->cWLScreenType = *pData; pData += 1U; @@ -3832,7 +3843,7 @@ UINT8 PHYSICAL_SGMT_STRU_init(UINT8 * pDataAdd, DSU_PHYSICAL_SGMT_STRU * pPhysic /*ID*/ - if (0x55 == chDataType)/*新版*/ + if ((0x01U == chDataType) || (0x03U == chDataType))/*主线或23分支*/ { wLength = 16U; } @@ -4162,6 +4173,7 @@ UINT8 DSU_FLOOD_GATE_STRU_init(UINT8 * pDataAdd, DSU_FLOOD_GATE_STRU * pFloodGat static UINT8 runCount = 0U;/*执行该函数的次数 用于判定是否为第一次进入*/ static UINT8 maxProtectAxisNum = MAX_PROTECT_AXIS_NUM;/*进路包含的实际点式接近区段最大数量*/ UINT8 i = 0; + UINT8 chDataType = gLocalPublicDataType; /*输入参数空指针防护*/ if ((NULL != pDataAdd) && (NULL != pFloodGateStru)) { @@ -4282,14 +4294,23 @@ UINT8 DSU_FLOOD_GATE_STRU_init(UINT8 * pDataAdd, DSU_FLOOD_GATE_STRU * pFloodGat } } - if ((0U == pFloodGateStru->wProtectAxisNum) || (0U == pFloodGateStru->wAccessAxisNum)) + if (0x01U == chDataType) { - rtnValue = 0U; /*防护区段或接近区段数量为0,返回0*/ + if ((0U == pFloodGateStru->wProtectAxisNum) || (0U == pFloodGateStru->wAccessAxisNum)) + { + rtnValue = 0U; /*防护区段或接近区段数量为0,返回0*/ + } + else + { + /*按原值返回*/ + } } else { - /*按原值返回*/ + /*主线数据结构检查防淹门配置防护区段或接近区段数量为0;分支数据结构不检查*/ } + + } return rtnValue; } diff --git a/TSCP/src/dqu_common/dqu_idmap_common/dquIdmapInit.c b/TSCP/src/dqu_common/dqu_idmap_common/dquIdmapInit.c index b6631ef..4725c3f 100644 --- a/TSCP/src/dqu_common/dqu_idmap_common/dquIdmapInit.c +++ b/TSCP/src/dqu_common/dqu_idmap_common/dquIdmapInit.c @@ -152,10 +152,10 @@ UINT8 dfsIdmapInit(CHAR * FSName) { /*获取配置数据*/ DataID=g_struInitTaskTab[wIndex].DataTypeId; - if ((0x55 != gLocalPublicDataType) + if ((0x01 != gLocalPublicDataType) && ((IDMAP_RC_ID == DataID) || (IDMAP_IVOC_ID == DataID))) { - /*0x55为较新数据 28.0.0.14不初始化RC&IVOC编号对照表*/ + /*0x01为较新数据 28.0.0.X或23.2.1.x不初始化RC&IVOC编号对照表*/ chUseTable = 0U; } else diff --git a/TSCP/src/dqu_common/dqu_idmap_common/dquIdmapQuery.c b/TSCP/src/dqu_common/dqu_idmap_common/dquIdmapQuery.c index a9e039d..c46450d 100644 --- a/TSCP/src/dqu_common/dqu_idmap_common/dquIdmapQuery.c +++ b/TSCP/src/dqu_common/dqu_idmap_common/dquIdmapQuery.c @@ -17,10 +17,7 @@ #include "dquQuery.h" #include "math.h" -#define QFUN_IDMAP_TRACKSEC_ID 5 -#define QFUN_IDMAP_VOBC_ID 11 -#define QFUN_IDMAP_AOM_ID 15 /*AOM编号数据ID*/ -#define QFUN_IDMAP_IVOC_ID 24 + #define DQU_IDMAP_INIT_TRUE 0x55 #define DQU_IDMAP_INIT_FALSE 0xAA @@ -269,7 +266,7 @@ UINT32 dquGetTrackDevId(UINT16 dataPos) UINT32 dwRetVal=0U; if(dataPospTrackSecNumStru[dataPos].dwTrackDevId;*/ + dwRetVal = qds_dsuStaticIdmapStru->pTrackSecNumStru[dataPos].dwTrackSecId[0U]; } return dwRetVal; } diff --git a/TSCP/src/dqu_common/dqu_idmap_common/dquIdmapQuery.h b/TSCP/src/dqu_common/dqu_idmap_common/dquIdmapQuery.h index 9d5df55..d1efd69 100644 --- a/TSCP/src/dqu_common/dqu_idmap_common/dquIdmapQuery.h +++ b/TSCP/src/dqu_common/dqu_idmap_common/dquIdmapQuery.h @@ -47,6 +47,11 @@ #define QFUN_IDMAP_ITE_ID 22 /*ITE编号数据ID*/ #define QFUN_IDMAP_RC_ID 23 /*RC编号数据ID*/ +#define QFUN_IDMAP_TRACKSEC_ID 5U /*轨道区段编号数据ID*/ +#define QFUN_IDMAP_VOBC_ID 11U /*VOBC编号数据ID*/ +#define QFUN_IDMAP_AOM_ID 15U /*AOM编号数据ID*/ +#define QFUN_IDMAP_IVOC_ID 24U /*IVOC编号数据ID*/ + #define IDMAP_TYPE_MIN 1 /*查询结构类型最小值 add by qxt 20170509*/ #define IDMAP_TYPE_MAX 21 /*查询结构类型最大值,用于防护查询类型struType的范围*/ diff --git a/鏁版嵁/data_line_BJL10_宸ョ▼鏁版嵁(1.2).0.20260210-ts.zip b/鏁版嵁/data_line_BJL10_宸ョ▼鏁版嵁(1.2).0.20260210-ts.zip new file mode 100644 index 0000000..2461dbe --- /dev/null +++ b/鏁版嵁/data_line_BJL10_宸ョ▼鏁版嵁(1.2).0.20260210-ts.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f2a23966aba7a8761bccf9fe2821d66bb5d2103340030baed8530a81fbc7957a +size 8172278 diff --git a/鏁版嵁/鏍囧噯绔欒溅杞+鍏叡V31.4+V52.0IVOC+V49.0RCI_CI+V36.0RCI_OC+V22.0ATS+V1.0TMC+V9.0AIM鍙夾ID-20250922(3).zip b/鏁版嵁/鏍囧噯绔欒溅杞+鍏叡V31.4+V52.0IVOC+V49.0RCI_CI+V36.0RCI_OC+V22.0ATS+V1.0TMC+V9.0AIM鍙夾ID-20250922(3).zip deleted file mode 100644 index 335064c..0000000 --- a/鏁版嵁/鏍囧噯绔欒溅杞+鍏叡V31.4+V52.0IVOC+V49.0RCI_CI+V36.0RCI_OC+V22.0ATS+V1.0TMC+V9.0AIM鍙夾ID-20250922(3).zip +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9b1398e32e5a5276403f5b468942229a97addabdb2bf60cfe8f15865dabd1b1c -size 60915571 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 new file mode 100644 index 0000000..9660e41 --- /dev/null +++ b/鏁版嵁/鏍囧噯绔欒溅杞8.0+鍏叡V31.5+V54.0IVOC+V50.0RCI_CI+V37.0RCI_OC+V22.0ATS+V1.0TMC+V9.0AIM鍙夾ID-20260401(1).zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9abd7242a4fcafef099eadcb600e771b6fc1c2a7b34cf698479245dee5db2d1a +size 33112105 diff --git a/鏁版嵁/鐢靛瓙鍦板浘鏁版嵁V1.2-CBTC-11.zip b/鏁版嵁/鐢靛瓙鍦板浘鏁版嵁V1.2-CBTC-11.zip deleted file mode 100644 index 04cd00a..0000000 --- a/鏁版嵁/鐢靛瓙鍦板浘鏁版嵁V1.2-CBTC-11.zip +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:195fe2e4b1cacc96841de227782f955fc00a96503c5514244d47760fc4272eb2 -size 4627799 diff --git a/鏁版嵁/鐢靛瓙鍦板浘鏁版嵁V1.2-杞﹁溅-4.zip b/鏁版嵁/鐢靛瓙鍦板浘鏁版嵁V1.2-杞﹁溅-4.zip deleted file mode 100644 index d7192c2..0000000 --- a/鏁版嵁/鐢靛瓙鍦板浘鏁版嵁V1.2-杞﹁溅-4.zip +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:53653f9691e6f158baca6b414753d0b753e020d0019ffff8ba6c9c8f8de93c7c -size 3476979 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 new file mode 100644 index 0000000..4ed92a4 --- /dev/null +++ b/鏁版嵁/鐢靛瓙鍦板浘鏁版嵁V2.2-CBTC-14-鍏叡31.5+CI50.0+OC37.0-8.zip @@ -0,0 +1,3 @@ +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 new file mode 100644 index 0000000..df5b392 --- /dev/null +++ b/鏁版嵁/鐢靛瓙鍦板浘鏁版嵁V2.2-杞﹁溅-11-鍏叡31.5+CI50.0+OC37.0+IVOC54.0-6.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cc54ffd8691e818718c10702f8cb80c536c3c644ac312aedb068930f0783a011 +size 4259937