1.4线模式和仲裁模式的通用接口封装

2.离线系拉低主地/备地为离线地
3.修复仲裁IP配置错误
This commit is contained in:
lh
2026-08-27 14:46:23 +08:00
parent ca6366a59b
commit 2b9c6c8c83
11 changed files with 181 additions and 51 deletions
+15 -1
View File
@@ -524,7 +524,7 @@ static void s_Area_Arb_Send_Process(void)
tolerate_arb++; tolerate_arb++;
} }
} }
else if(ENUM_AREA_UNKNOW == local_area_state && CM_FALSE == flag_comm_all_down) else if(ENUM_AREA_UNKNOW == local_area_state && CM_FALSE == flag_comm_all_up)
{ {
/**未知地主系,与另一地通信持续中断10周期,发送仲裁请求 */ /**未知地主系,与另一地通信持续中断10周期,发送仲裁请求 */
if(tolerate_arb >= 10u) if(tolerate_arb >= 10u)
@@ -1093,3 +1093,17 @@ static void s_Area_DoubleCRC_Get(IN const CM_UINT8* buf, IN CM_UINT32 len,
*crc1 = local_crc[0]; *crc1 = local_crc[0];
*crc2 = local_crc[1]; *crc2 = local_crc[1];
} }
/**
* @brief 获取另一地A系的ID
*/
CM_UINT8 AreaArb_GetArea_A_ID(void)
{
return AREA_BASIC_CFG_PTR->Partner_Area_A_BoardID;
}
/**
* @brief 获取另一地B系的ID
*/
CM_UINT8 AreaArb_GetArea_B_ID(void)
{
return AREA_BASIC_CFG_PTR->Partner_Area_B_BoardID;
}
+8 -1
View File
@@ -131,5 +131,12 @@ void AreaArb_SetCommStatus_byID(CM_UINT8 ID, CM_UINT32 sn, CM_BOOL rcv_flag);
* @brief 根据ID获取接收状态 * @brief 根据ID获取接收状态
*/ */
void AreaArb_GetCommStatus_byID(CM_UINT8 ID, CM_UINT32* SN, CM_BOOL* rcv_flag); void AreaArb_GetCommStatus_byID(CM_UINT8 ID, CM_UINT32* SN, CM_BOOL* rcv_flag);
/**
* @brief 获取另一地A系的ID
*/
CM_UINT8 AreaArb_GetArea_A_ID(void);
/**
* @brief 获取另一地B系的ID
*/
CM_UINT8 AreaArb_GetArea_B_ID(void);
#endif #endif
+1 -1
View File
@@ -509,7 +509,7 @@ static void s_Area_Arb_IP_Init(void)
g_PFM_Cfg.Partner_Area_A_Cfg.IP_4x2, g_PFM_Cfg.Partner_Area_B_Cfg.IP_4x2); g_PFM_Cfg.Partner_Area_A_Cfg.IP_4x2, g_PFM_Cfg.Partner_Area_B_Cfg.IP_4x2);
/*获取仲裁网络配置*/ /*获取仲裁网络配置*/
rt = CM_Memcpy(ARB_COMM_CFG_PTR->IP_Local, 32, g_PFM_Cfg.Local_Cfg.IP_4x2,32);/**< 对地通信IP */ rt = CM_Memcpy(ARB_COMM_CFG_PTR->IP_Local, 32, g_PFM_Cfg.Local_Cfg.IP_Area,32);/**< 对地通信IP */
CM_ASSERT(ENUM_CM_TRUE == rt, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_2, TSCP_DARK_ASSERT_1); CM_ASSERT(ENUM_CM_TRUE == rt, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_2, TSCP_DARK_ASSERT_1);
rt = CM_Memcpy(ARB_COMM_CFG_PTR->IP_Arb, 32, g_PFM_Cfg.Arb_CFG.IP_Arb,32);/**< 对地通信IP */ rt = CM_Memcpy(ARB_COMM_CFG_PTR->IP_Arb, 32, g_PFM_Cfg.Arb_CFG.IP_Arb,32);/**< 对地通信IP */
+17
View File
@@ -169,3 +169,20 @@ void AreaArb_Get_All_State(STR_Area_State *p_all_State)
p_all_State->Partner_Area_B_state = AREA_STATE_CTRL_PTR->StateArea.Partner_Area_B_state; p_all_State->Partner_Area_B_state = AREA_STATE_CTRL_PTR->StateArea.Partner_Area_B_state;
} }
} }
/**
* @brief 判断是否存在备地
*/
CM_BOOL AreaArb_Slave_Is_Exist()
{
CM_BOOL rt = CM_FALSE;
if((ENUM_AREA_SLAVE == AREA_STATE_CTRL_PTR->StateArea.Local_state) || (ENUM_AREA_SLAVE == AREA_STATE_CTRL_PTR->StateArea.Partner_state)
|| (ENUM_AREA_SLAVE == AREA_STATE_CTRL_PTR->StateArea.Partner_Area_A_state) || (ENUM_AREA_SLAVE == AREA_STATE_CTRL_PTR->StateArea.Partner_Area_B_state))
{
rt = CM_TRUE;
}
else
{
}
return rt;
}
+4
View File
@@ -33,5 +33,9 @@ CM_UINT8 AreaArb_GetID_byState(ENUM_AREA_STATE state_area, ENUM_2x2_STATE_T stat
* @brief 仲裁模式下使用,获取所有区域状态 * @brief 仲裁模式下使用,获取所有区域状态
*/ */
void AreaArb_Get_All_State(STR_Area_State *p_all_State); void AreaArb_Get_All_State(STR_Area_State *p_all_State);
/**
* @brief 判断是否存在备地
*/
CM_BOOL AreaArb_Slave_Is_Exist();
#endif #endif
+18 -26
View File
@@ -182,6 +182,8 @@ void s_Offline_vote(void)
*/ */
void s_Master_vote(void) void s_Master_vote(void)
{ {
ENUM_2x2_STATE_T state2x = AREA_STATE_CTRL_PTR->State2x.LocalState;
if(ENUM_AREA_MASTER == VOTE_STATE_CTRL->Partner_Area_A_state || ENUM_AREA_MASTER == VOTE_STATE_CTRL->Partner_Area_B_state) if(ENUM_AREA_MASTER == VOTE_STATE_CTRL->Partner_Area_A_state || ENUM_AREA_MASTER == VOTE_STATE_CTRL->Partner_Area_B_state)
{ {
/**双主宕机 */ /**双主宕机 */
@@ -189,6 +191,16 @@ void s_Master_vote(void)
VOTE_STATE_CTRL->Partner_Area_A_state, VOTE_STATE_CTRL->Partner_Area_B_state); VOTE_STATE_CTRL->Partner_Area_A_state, VOTE_STATE_CTRL->Partner_Area_B_state);
CM_ASSERT(0, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_2, TSCP_DARK_ASSERT_1); CM_ASSERT(0, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_2, TSCP_DARK_ASSERT_1);
} }
else if(ENUM_2x2_OFFLINE == state2x)
{
/**与主地主同步失败 */
VOTE_STATE_CTRL->Local_state = ENUM_AREA_OFFLINE;
AREA_LOG_MSG("AREA_STATE_VOTE:Master>>>>>Offline, Sync failed\n");
}
else
{
}
} }
/** /**
* @brief 备地状态转换 * @brief 备地状态转换
@@ -196,38 +208,23 @@ void s_Master_vote(void)
void s_Slave_vote(void) void s_Slave_vote(void)
{ {
CM_BOOL flag_comm_mm_status = CM_FALSE; /**与主地主的通信状态 */ 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 */ CM_UINT8 id_mm = AreaArb_GetID_byState(ENUM_AREA_MASTER, ENUM_2x2_MASTER); /**主地主的ID */
AreaArb_GetCommStatus_byID(id_mm, NULL, &flag_comm_mm_status); AreaArb_GetCommStatus_byID(id_mm, NULL, &flag_comm_mm_status);
CM_BOOL Sync_Fail_Flag = AREA_FLAGS_CTRL_PTR->Sync_Fail_Flag; /**同步失败标志 */ ENUM_2x2_STATE_T state2x = AREA_STATE_CTRL_PTR->State2x.LocalState;
if(0x55u == AREA_ARB_CTRL_PTR->Arb_Ack) if(0x55u == AREA_ARB_CTRL_PTR->Arb_Ack)
{ {
/**收到仲裁升主回复 */ /**收到仲裁升主回复 */
VOTE_STATE_CTRL->Local_state = ENUM_AREA_MASTER; VOTE_STATE_CTRL->Local_state = ENUM_AREA_MASTER;
AREA_LOG_MSG("AREA_STATE_VOTE:Slave>>>>>Master, Arbitration ACK received\n"); AREA_LOG_MSG("AREA_STATE_VOTE:Slave>>>>>Master, Arbitration ACK received\n");
} }
else if(CM_FALSE == Sync_Fail_Flag) else if(ENUM_2x2_OFFLINE == state2x)
{ {
/**同步失败 */ /**同步失败 */
if(CM_TRUE == flag_comm_mm_status) VOTE_STATE_CTRL->Local_state = ENUM_AREA_OFFLINE;
{ AREA_LOG_MSG("AREA_STATE_VOTE:Slave>>>>>Offline, Sync failed and Master ID:%d exists\n",
/**主地主存活,降离线 */ id_mm);
VOTE_STATE_CTRL->Local_state = ENUM_AREA_OFFLINE;
AREA_LOG_MSG("AREA_STATE_VOTE:Slave>>>>>Offline, Sync failed and Master ID:%d exists\n",
id_mm);
}
else
{
/**与主地主通信中断,认为主地主宕机,容忍一周期降离线 */
s_slave_cnt++;
if(s_slave_cnt > MSCP_AREA_SLAVE_TOLERATE_COUNT)
{
s_slave_cnt = 0u;
VOTE_STATE_CTRL->Local_state = ENUM_AREA_OFFLINE;
AREA_LOG_MSG("AREA_STATE_VOTE:Slave>>>>>Offline, Sync failed and Master is lost\n");
}
}
} }
else if(ENUM_AREA_MASTER == VOTE_STATE_CTRL->Partner_state) else if(ENUM_AREA_MASTER == VOTE_STATE_CTRL->Partner_state)
{ {
@@ -239,9 +236,4 @@ void s_Slave_vote(void)
{ {
} }
/**离开备地,清空计数 */
if(ENUM_AREA_SLAVE != VOTE_STATE_CTRL->Local_state)
{
s_slave_cnt = 0u;
}
} }
+78
View File
@@ -0,0 +1,78 @@
#include "Area_Arb_Common.h"
/**
* @brief 执行初始化,4线与仲裁模式根据配置区分
*/
void Area_Arb_Common_Init(void)
{
if(0x55u == g_PFM_Cfg.M_Arb_Enable)
{
Area_With_Arb_Init();
}
else
{
Area_init();//区域初始化
}
}
/**
* @brief 获取所有板卡区域状态,4线与仲裁模式根据配置开关从不同结构体获取
*/
void Area_Arb_Common_Get_All_State(STR_Area_State *p_all_State)
{
if(0x55u == g_PFM_Cfg.M_Arb_Enable)
{
AreaArb_Get_All_State(p_all_State);
}
else
{
Area_Get_All_State(p_all_State);
}
}
/**
* @brief 获取另一地A系的ID
*/
CM_UINT32 Area_Arb_Common_GetArea_A_ID(void)
{
CM_UINT32 id = 0u;
if(0x55u == g_PFM_Cfg.M_Arb_Enable)
{
id = (CM_UINT32)AreaArb_GetArea_A_ID();
}
else
{
id = Area_GetArea_A_ID();
}
return id;
}
/**
* @brief 获取另一地B系的ID
*/
CM_UINT32 Area_Arb_Common_GetArea_B_ID(void)
{
CM_UINT32 id = 0u;
if(0x55u == g_PFM_Cfg.M_Arb_Enable)
{
id = (CM_UINT32)AreaArb_GetArea_B_ID();
}
else
{
id = Area_GetArea_B_ID();
}
return id;
}
/**
* @brief 判断是否存在备地
*/
CM_BOOL Area_Arb_Common_Slave_Is_Exist(void)
{
CM_BOOL rt = ENUM_CM_FALSE;
if(0x55u == g_PFM_Cfg.M_Arb_Enable)
{
rt = Area_Slave_Is_Exist();
}
else
{
rt = AreaArb_Slave_Is_Exist();
}
return rt;
}
+31
View File
@@ -0,0 +1,31 @@
#ifndef AREA_ARB_H_
#define AREA_ARB_H_
#include "Area.h"
#include "Arb.h"
#include "Arb_State.h"
/**
* 该文件为4线模式和仲裁模式的共用头文件,用于对其他模块的通用接口
*/
/**
* @brief 执行初始化,4线与仲裁模式根据配置区分
*/
void Area_Arb_Common_Init(void);
/**
* @brief 获取所有板卡区域状态,4线与仲裁模式根据配置开关从不同结构体获取
*/
void Area_Arb_Common_Get_All_State(STR_Area_State *p_all_State);
/**
* @brief 获取另一地A系的ID,执行初始化,4线与仲裁模式根据配置区分
*/
CM_UINT32 Area_Arb_Common_GetArea_A_ID(void);
/**
* @brief 获取另一地B系的ID,执行初始化,4线与仲裁模式根据配置区分
*/
CM_UINT32 Area_Arb_Common_GetArea_B_ID(void);
/**
* @brief 判断是否存在备地
*/
CM_BOOL Area_Arb_Common_Slave_Is_Exist(void);
#endif
-1
View File
@@ -26,7 +26,6 @@
#define MSCP_AREA_B_BOARD_ID_B 0x04 #define MSCP_AREA_B_BOARD_ID_B 0x04
#define MSCP_AREA_UNKNOW_COUNT_MAX 0x0au #define MSCP_AREA_UNKNOW_COUNT_MAX 0x0au
#define MSCP_AREA_SLAVE_TOLERATE_COUNT (1u) /**< 备地降离线容忍次数 */
#define MSCP_MSG_BUF_MAX 1024u /**< 区域通信消息最大缓冲区大小 */ #define MSCP_MSG_BUF_MAX 1024u /**< 区域通信消息最大缓冲区大小 */
+3 -9
View File
@@ -41,6 +41,7 @@
#include "PFM_RemoteUpdate.h" #include "PFM_RemoteUpdate.h"
#include "CFM_Sync.h" #include "CFM_Sync.h"
#include "Arb.h" #include "Arb.h"
#include "Area_Arb_Common.h"
#if QNX #if QNX
#include <sys/neutrino.h> #include <sys/neutrino.h>
#include <sys/trace.h> #include <sys/trace.h>
@@ -243,15 +244,8 @@ static void MSCP_Init(void)
PFM_LOG_SET_INIT_STAGE(ENUM_INIT_APP_CTRL); PFM_LOG_SET_INIT_STAGE(ENUM_INIT_APP_CTRL);
PFM_LOG_SET_INIT_STAGE(ENUM_INIT_2X2USART); PFM_LOG_SET_INIT_STAGE(ENUM_INIT_2X2USART);
CFM_TimeSync_Init(2);//时间同步初始化 CFM_TimeSync_Init(2);//时间同步初始化
if(0x55u == g_PFM_Cfg.M_Arb_Enable) /* 区域初始化*/
{ Area_Arb_Common_Init();
Area_With_Arb_Init();
}
else
{
Area_init();//区域初始化
}
/*- 是否开启2oo2功能 */ /*- 是否开启2oo2功能 */
if (0x55u == g_PFM_Cfg.M_2oo2_Enable) if (0x55u == g_PFM_Cfg.M_2oo2_Enable)
+5 -11
View File
@@ -35,6 +35,7 @@
#include "Area_state.h" #include "Area_state.h"
#include "Arb_State.h" #include "Arb_State.h"
#include "Arb.h" #include "Arb.h"
#include "Area_Arb_Common.h"
/*通信中断时间和同步超时时间可以相同,此时优先执行通信中断切系*/ /*通信中断时间和同步超时时间可以相同,此时优先执行通信中断切系*/
@@ -1183,14 +1184,7 @@ void SFM_4x2_ChangeState(void)
s_2x2_Ctrl.MineExtendState = MSCP_Get_2X_VagueCom_State(&s_2x2_state_Ctrl.MineExtendOKCount[0]); /**< 本机串口通信状态,2oo2交换 */ s_2x2_Ctrl.MineExtendState = MSCP_Get_2X_VagueCom_State(&s_2x2_state_Ctrl.MineExtendOKCount[0]); /**< 本机串口通信状态,2oo2交换 */
s_2x2_Ctrl.PeerExtendState = MSCP_Get_2X_VagueCom_State(&s_2x2_state_Ctrl.PeerExtendOKCount[0]); /**< 邻机串口通信状态,2oo2交换 */ s_2x2_Ctrl.PeerExtendState = MSCP_Get_2X_VagueCom_State(&s_2x2_state_Ctrl.PeerExtendOKCount[0]); /**< 邻机串口通信状态,2oo2交换 */
/**获取区域状态 */ /**获取区域状态 */
if(0x55u == g_PFM_Cfg.M_Arb_Enable) Area_Arb_Common_Get_All_State(&Area_State);
{
AreaArb_Get_All_State(&Area_State);
}
else
{
Area_Get_All_State(&Area_State);
}
/*- 切系完成*/ /*- 切系完成*/
if(ENUM_2x2_AIDSWITCH_OVER == s_2x2_state_Ctrl.LocalAIDSwitchState) if(ENUM_2x2_AIDSWITCH_OVER == s_2x2_state_Ctrl.LocalAIDSwitchState)
@@ -1276,7 +1270,7 @@ void SFM_4x2_ChangeState(void)
MSCP_LOG_MSG("s_2x2_state_Ctrl.LocalAreaState = %d 2x2 = %d\n",Area_State.Local_state, s_2x2_state_Ctrl.LocalState); MSCP_LOG_MSG("s_2x2_state_Ctrl.LocalAreaState = %d 2x2 = %d\n",Area_State.Local_state, s_2x2_state_Ctrl.LocalState);
printf("AreaState = %d 2x2 = %d\n",Area_State.Local_state, s_2x2_state_Ctrl.LocalState); printf("AreaState = %d 2x2 = %d\n",Area_State.Local_state, s_2x2_state_Ctrl.LocalState);
/**<是否存在区域备地*/ /**<是否存在区域备地*/
s_2x2_state_Ctrl.Area_Slave_Is_Exist = Area_Slave_Is_Exist(); s_2x2_state_Ctrl.Area_Slave_Is_Exist = Area_Arb_Common_Slave_Is_Exist();
/*- 2x线程->更新主线程热备状态*/ /*- 2x线程->更新主线程热备状态*/
s_2x2_Ctrl.LocalState = SFM_2x2_StateDecision(s_2x2_state_Ctrl.LocalAreaState,s_2x2_state_Ctrl.LocalState); s_2x2_Ctrl.LocalState = SFM_2x2_StateDecision(s_2x2_state_Ctrl.LocalAreaState,s_2x2_state_Ctrl.LocalState);
/* 判断3乘是离线则将地状态设置为离线, /* 判断3乘是离线则将地状态设置为离线,
@@ -1417,12 +1411,12 @@ ENUM_4x2_STATE_T SFM_2x2_AreaDecision(ENUM_AREA_STATE PartnerAreaState,CM_BOOL i
if (isA == CM_TRUE) if (isA == CM_TRUE)
{ {
// A系主备配对:0x01<->0x03 // A系主备配对:0x01<->0x03
rtn_state = (masterHighByte == Area_GetArea_A_ID())? ENUM_4x2_MASTER : ENUM_4x2_SLAVE; rtn_state = (masterHighByte == Area_Arb_Common_GetArea_A_ID())? ENUM_4x2_MASTER : ENUM_4x2_SLAVE;
} }
else else
{ {
// B系主备配对:0x02<->0x04 // B系主备配对:0x02<->0x04
rtn_state = (masterHighByte == Area_GetArea_B_ID())? ENUM_4x2_MASTER : ENUM_4x2_SLAVE; rtn_state = (masterHighByte == Area_Arb_Common_GetArea_B_ID())? ENUM_4x2_MASTER : ENUM_4x2_SLAVE;
} }
break; break;
default: default: