From ca6366a59bf84551d420d27d0cf24dcace53f81f Mon Sep 17 00:00:00 2001 From: lh <3191213465@qq.com> Date: Tue, 25 Aug 2026 20:05:05 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BB=84=E6=92=AD=E6=8E=A5=E6=94=B6=E5=90=8E?= =?UTF-8?q?=E5=81=9A2=E5=8F=96=E4=BA=A4=E4=BA=92=EF=BC=8C=E7=BB=84?= =?UTF-8?q?=E6=92=AD=E6=8E=A5=E6=94=B6=E7=9A=84=E6=95=B0=E6=8D=AE=E4=B8=8D?= =?UTF-8?q?=E4=BD=9C=E7=94=A8=E4=BA=8E=E9=80=9A=E4=BF=A1=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TSCP/src/MSCP/Arb/Arb.c | 49 ++++++++++++++++-------------- TSCP/src/MSCP/Arb/Arb.h | 8 +++++ TSCP/src/MSCP/Arb/Arb_State_Vote.c | 7 +++-- TSCP/src/MSCP/CFM/CFM_Sync.c | 2 +- 数据/数据.zip | 3 ++ 5 files changed, 44 insertions(+), 25 deletions(-) create mode 100644 数据/数据.zip diff --git a/TSCP/src/MSCP/Arb/Arb.c b/TSCP/src/MSCP/Arb/Arb.c index 0bfc4eb..3a0c95f 100644 --- a/TSCP/src/MSCP/Arb/Arb.c +++ b/TSCP/src/MSCP/Arb/Arb.c @@ -88,14 +88,6 @@ static void s_Area_State_Multi_Recv_Process(void); * @brief 周期运行中的初始化,初始化接收状态和其他板卡状态 */ static void s_Area_Cycle_Init(void); -/** - * @brief 根据ID设置接收状态 - */ -static void s_Area_SetCommStatus_byID(CM_UINT8 ID, CM_UINT32 sn, CM_BOOL rcv_flag); -/** - * @brief 根据ID获取接收状态 - */ -static void s_Area_GetCommStatus_byID(CM_UINT8 ID, CM_UINT32* SN, CM_UINT8* rcv_flag); /** * @brief 对接收到的区域状态请求进行2取同步 * @param ack_flags 记录是否需要进行ACK回复 @@ -181,10 +173,10 @@ static CM_THREAD_FUNC_T s_Area_With_Arb_Work_Thread(IN CM_Thread_Arg_Struct_T* a s_area_arb_start_time = CM_GetTick(); /**清空上周期的接收状态,并获取2乘线程中的最终状态 */ s_Area_Cycle_Init(); - AREA_LOG_MSG("AREA_ARB:Cycle start, BoardID:%d SN:%u State:%d 2x2:%d\n", + AREA_LOG_MSG("AREA_ARB:Cycle start, BoardID:%d SN:%u State:%d 2x2:%d, NOW_USED_TIME:%llums\n", AREA_BASIC_CFG_PTR->BoardID, DFM_GetBirthCount(), AREA_STATE_CTRL_PTR->StateArea.Local_state, - AREA_STATE_CTRL_PTR->State2x.LocalState); + AREA_STATE_CTRL_PTR->State2x.LocalState,NOW_USED_TIME / 1000u); /**主地主组播发送状态帧,其余板卡接收 */ stage_start = CM_GetTick(); s_Area_State_Multi_Process(); @@ -208,12 +200,12 @@ static CM_THREAD_FUNC_T s_Area_With_Arb_Work_Thread(IN CM_Thread_Arg_Struct_T* a /**状态转移 */ s_Area_Arb_State_Transition(); - AREA_LOG_MSG("AREA_ARB:Cycle end, SN:%u State:%d 2x2:%d RcvFlag:%d-%d-%d Arb:%d-0x%x\n", + AREA_LOG_MSG("AREA_ARB:Cycle end, SN:%u State:%d 2x2:%d RcvFlag:%d-%d-%d Arb:%d-0x%x, AREA_ARB_USED_TIME:%llums, NOW_USED_TIME:%llums\n", AREA_COMM_STATUS_PTR->LocalSN, AREA_STATE_CTRL_PTR->StateArea.Local_state, AREA_STATE_CTRL_PTR->State2x.LocalState, AREA_COMM_STATUS_PTR->Patner_RcvFlag, AREA_COMM_STATUS_PTR->Area_A_RcvFlag, AREA_COMM_STATUS_PTR->Area_B_RcvFlag, AREA_ARB_CTRL_PTR->Arb_Send_Flag, - AREA_ARB_CTRL_PTR->Arb_Ack); + AREA_ARB_CTRL_PTR->Arb_Ack, AREA_ARB_NOW_USED_TIME, NOW_USED_TIME / 1000u); Area_Arb_Stop(); } @@ -416,11 +408,11 @@ static void s_Area_State_Req_Recv_Process(IN const STRU_AREA_WITH_ARB_STATE_PACK return; } - s_Area_GetCommStatus_byID(state_pack->SrcID, &last_sn, NULL); - if(state_pack->SN >= last_sn) + AreaArb_GetCommStatus_byID(state_pack->SrcID, &last_sn, NULL); + if(state_pack->SN > last_sn) { ack_flags[state_pack->SrcID] = CM_TRUE; - s_Area_SetCommStatus_byID(state_pack->SrcID, state_pack->SN, CM_TRUE); + AreaArb_SetCommStatus_byID(state_pack->SrcID, state_pack->SN, CM_TRUE); AreaArb_SetState_byID(state_pack->SrcID, state_pack->StateArea); AreaArb_Set2xState_byID(state_pack->SrcID, state_pack->State2x); AREA_LOG_MSG("AREA_ARB:State request received, SrcID:%d SN:%u State:%d 2x2:%d, AREA_ARB_NOW_USED_TIME:%llums\n", @@ -445,7 +437,7 @@ static void s_Area_State_Ack_Recv_Process(IN const STRU_AREA_WITH_ARB_STATE_PACK if(((1u == time_sync_flag) && (state_pack->SN == local_sn)) || ((0u == time_sync_flag) && (sn_diff <= 1u))) { - s_Area_SetCommStatus_byID(state_pack->SrcID, state_pack->SN, CM_TRUE); + AreaArb_SetCommStatus_byID(state_pack->SrcID, state_pack->SN, CM_TRUE); AreaArb_SetState_byID(state_pack->SrcID, state_pack->StateArea); AreaArb_Set2xState_byID(state_pack->SrcID, state_pack->State2x); AREA_LOG_MSG("AREA_ARB:State ACK received, SrcID:%d SN:%u State:%d 2x2:%d, AREA_ARB_NOW_USED_TIME:%llums\n", @@ -478,6 +470,7 @@ static void s_Area_Arb_Send_Process(void) ENUM_AREA_STATE local_area_state = AREA_STATE_CTRL_PTR->StateArea.Local_state; static CM_UINT32 tolerate_arb = 0u; /**仲裁请求容忍 */ ENUM_CM_RETURN send_rt = ENUM_CM_FALSE; + CM_BOOL flag_comm_mm_status = CM_FALSE; /**请求帧帧基础信息组包 */ arb_pack.Len = AREA_ARB_FRAME_PACK_LEN - 1u; arb_pack.MsgType = ENUM_AREA_MSG_ARB_REQ; @@ -498,6 +491,8 @@ static void s_Area_Arb_Send_Process(void) /**获取通信中断标志 */ CM_BOOL flag_comm_all_down = AREA_COMM_STATUS_PTR->Area_A_RcvFlag | AREA_COMM_STATUS_PTR->Area_B_RcvFlag; /**用于判断通信是否完全中断 */ CM_BOOL flag_comm_all_up = AREA_COMM_STATUS_PTR->Area_A_RcvFlag & AREA_COMM_STATUS_PTR->Area_B_RcvFlag; /**用于判断通信是否完全正常 */ + /**获取主地主通信状态标志 */ + AreaArb_GetCommStatus_byID(id_mm, NULL, &flag_comm_mm_status); /**重置仲裁请求发送标志 */ AREA_ARB_CTRL_PTR->Arb_Send_Flag = 0u; @@ -513,7 +508,7 @@ static void s_Area_Arb_Send_Process(void) AREA_LOG_MSG("AREA_ARB:Request arbitration, master lost slave, BoardID:%d SN:%u Result:0x%x\n", AREA_BASIC_CFG_PTR->BoardID, arb_pack.ArbSN, send_rt); } - else if(ENUM_AREA_SLAVE == local_area_state && 0u == id_mm) + else if(ENUM_AREA_SLAVE == local_area_state && CM_FALSE == flag_comm_mm_status) { /**本地备地主,与主地主通信中断,容忍一周期发送请求 */ if(tolerate_arb >= 1u) @@ -686,6 +681,7 @@ static void s_Area_State_Multi_Recv_Process(void) CM_UINT32 tickNow = (CM_UINT32)(CM_GetTick() / CM_UNSIGNED_MILLION); CM_UINT32 tickStart = tickNow, usedTime = 0u; CM_UINT32 tickRcv = 0u; + STRU_AREA_WITH_ARB_STATE_MULTI_PACK_T peer_pack = {0}; /*组播接收*/ /*双CRC校验*/ @@ -703,7 +699,7 @@ static void s_Area_State_Multi_Recv_Process(void) ((AREA_ARB_STATE_MULTI_PACK_LEN - 1u) == multi_pack.Len) && ENUM_AREA_MSG_STATE_MULTI == multi_pack.MsgType) { - s_Area_SetCommStatus_byID(multi_pack.SrcID, multi_pack.SN, CM_TRUE); + /**此处仅设置主地主的状态,不作为与主地主通信状态的判断依据 */ AreaArb_SetState_byID(multi_pack.SrcID, multi_pack.StateArea); AreaArb_Set2xState_byID(multi_pack.SrcID, multi_pack.State2x); AREA_LOG_MSG("AREA_ARB:Multicast state received, SrcID:%d SN:%u State:%d 2x2:%d\n", @@ -711,6 +707,8 @@ static void s_Area_State_Multi_Recv_Process(void) } else { + /**接收失败清空结构体,等待2取同步 */ + CM_Memset(&multi_pack, 0, sizeof(multi_pack), sizeof(multi_pack)); AREA_LOG_MSG("Multi Recv Crc Fail %08x-%08x, %08x-%08x\n",crc1, multi_pack.CRC1, crc2, multi_pack.CRC2); } } @@ -720,8 +718,15 @@ static void s_Area_State_Multi_Recv_Process(void) } usedTime = tickNow - tickStart; } while (AREA_MULTI_WAITE_TIME > usedTime); - - + /**对组播接收进行2取同步 */ + Area_2oo2_Currency_NoSplit(&multi_pack, sizeof(multi_pack), &peer_pack, sizeof(peer_pack)); + if(peer_pack.SN > multi_pack.SN) + { + /**邻机有最新数据 */ + AREA_LOG_MSG("AREA_ARB: Multi Recv 2oo2 Sync, Peer-Mine:%d-%d\n", peer_pack.SN, multi_pack.SN); + AreaArb_SetState_byID(peer_pack.SrcID, peer_pack.StateArea); + AreaArb_Set2xState_byID(peer_pack.SrcID, peer_pack.State2x); + } } /** @@ -763,7 +768,7 @@ static void s_Area_Cycle_Init(void) /** * @brief 根据ID设置接收状态 */ -static void s_Area_SetCommStatus_byID(CM_UINT8 ID, CM_UINT32 sn, CM_BOOL rcv_flag) +void AreaArb_SetCommStatus_byID(CM_UINT8 ID, CM_UINT32 sn, CM_BOOL rcv_flag) { if(ID == AREA_BASIC_CFG_PTR->BoardID) { @@ -792,7 +797,7 @@ static void s_Area_SetCommStatus_byID(CM_UINT8 ID, CM_UINT32 sn, CM_BOOL rcv_fla /** * @brief 根据ID获取接收状态 */ -static void s_Area_GetCommStatus_byID(CM_UINT8 ID, CM_UINT32* sn, CM_UINT8* rcv_flag) +void AreaArb_GetCommStatus_byID(CM_UINT8 ID, CM_UINT32* sn, CM_BOOL* rcv_flag) { if(ID == AREA_BASIC_CFG_PTR->BoardID) { diff --git a/TSCP/src/MSCP/Arb/Arb.h b/TSCP/src/MSCP/Arb/Arb.h index 01748ab..ccf5df9 100644 --- a/TSCP/src/MSCP/Arb/Arb.h +++ b/TSCP/src/MSCP/Arb/Arb.h @@ -123,5 +123,13 @@ void Area_Arb_Stop(); * */ void Area_Arb_Wait_Stop(); +/** + * @brief 根据ID设置接收状态 + */ +void AreaArb_SetCommStatus_byID(CM_UINT8 ID, CM_UINT32 sn, CM_BOOL rcv_flag); +/** + * @brief 根据ID获取接收状态 + */ +void AreaArb_GetCommStatus_byID(CM_UINT8 ID, CM_UINT32* SN, CM_BOOL* rcv_flag); #endif \ No newline at end of file diff --git a/TSCP/src/MSCP/Arb/Arb_State_Vote.c b/TSCP/src/MSCP/Arb/Arb_State_Vote.c index b24d42f..1ffa779 100644 --- a/TSCP/src/MSCP/Arb/Arb_State_Vote.c +++ b/TSCP/src/MSCP/Arb/Arb_State_Vote.c @@ -195,8 +195,11 @@ void s_Master_vote(void) */ void s_Slave_vote(void) { + CM_BOOL flag_comm_mm_status = CM_FALSE; /**与主地主的通信状态 */ static CM_UINT32 s_slave_cnt = 0u; /**备系降离线容忍计数 */ CM_UINT8 id_mm = AreaArb_GetID_byState(ENUM_AREA_MASTER, ENUM_2x2_MASTER); /**主地主的ID */ + AreaArb_GetCommStatus_byID(id_mm, NULL, &flag_comm_mm_status); + CM_BOOL Sync_Fail_Flag = AREA_FLAGS_CTRL_PTR->Sync_Fail_Flag; /**同步失败标志 */ if(0x55u == AREA_ARB_CTRL_PTR->Arb_Ack) { @@ -207,7 +210,7 @@ void s_Slave_vote(void) else if(CM_FALSE == Sync_Fail_Flag) { /**同步失败 */ - if(0u != id_mm) + if(CM_TRUE == flag_comm_mm_status) { /**主地主存活,降离线 */ VOTE_STATE_CTRL->Local_state = ENUM_AREA_OFFLINE; @@ -216,7 +219,7 @@ void s_Slave_vote(void) } else { - /**主地主ID不存在,认为主地主宕机,容忍一周期降离线 */ + /**与主地主通信中断,认为主地主宕机,容忍一周期降离线 */ s_slave_cnt++; if(s_slave_cnt > MSCP_AREA_SLAVE_TOLERATE_COUNT) { diff --git a/TSCP/src/MSCP/CFM/CFM_Sync.c b/TSCP/src/MSCP/CFM/CFM_Sync.c index 1737006..22ee3ba 100644 --- a/TSCP/src/MSCP/CFM/CFM_Sync.c +++ b/TSCP/src/MSCP/CFM/CFM_Sync.c @@ -36,7 +36,7 @@ #define TIME_OFFSET_PEER (1) //对端时间偏移量 static STRU_CFM_TIME_CTRL_T s_TimeCtrl[10] = {0}; #define SFM_2oo2_TM_FIX_VAL_NS (3 * CM_MILLION) /* 2oo2校时门限,单位:ns */ -#define SFM_2x2_TM_FIX_VAL_NS (10 * CM_MILLION) /* 2x最小调整偏差,单位:ns */ +#define SFM_2x2_TM_FIX_VAL_NS (5 * CM_MILLION) /* 2x最小调整偏差,单位:ns */ #define SFM_TIME_SYNC_TOLERANCE_COUNT (5u) /* 时间同步切换, 丢失容忍次数*/ static CM_THREAD_FUNC_T t_Sync_TimeThread(IN CM_Thread_Arg_Struct_T* arg); diff --git a/数据/数据.zip b/数据/数据.zip new file mode 100644 index 0000000..3f46e7a --- /dev/null +++ b/数据/数据.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:189e677e7e75ad6b9055d8c37fa9ed54106f4ec9aa64e8df6f4a37735748f610 +size 1174308