Commit 107ebd09 authored by 李冠华's avatar 李冠华

🐞 fix:完善数据对比功能,增加请求重发功能,解决由于485接收到的数据异常问题导致的误判NVS错误的情况

parent eca1bf18
...@@ -8,10 +8,17 @@ uint32_t BeforeLastNum = 0U; ...@@ -8,10 +8,17 @@ uint32_t BeforeLastNum = 0U;
uint32_t ReceivedValue = 0U; uint32_t ReceivedValue = 0U;
uint8_t RenWuDelay = 0U; uint8_t RenWuDelay = 0U;
uint8_t errNum = 0U; uint8_t errNum = 0U;
uint32_t TurnOffPowerCount = 0U;
uint32_t TurnOffPowerCountHistory = 0U;
uint32_t JieShouDaoValue = 0U; uint32_t JieShouDaoValue = 0U;
uint32_t JieShouDaoHistoryVal = 0U;
uint16_t BenCiShangDianZhiXingCount = 0U;
uint16_t huifudelayCount = 0U;
uint8_t StopFlag = 0U;
uint32_t RS485TXBenCiXieRuNum = 0u;
uint32_t RS485TXTotalExecutionNum = 0u;
uint8_t RerequestCount = 0U;
static void NVS_Test_BenCiXieRuNum(void); static void NVS_Test_BenCiXieRuNum(void);
static void NVS_Test_Rerequest(void);
void NVS_Test_Init(void) void NVS_Test_Init(void)
{ {
...@@ -21,11 +28,15 @@ void NVS_Test_Init(void) ...@@ -21,11 +28,15 @@ void NVS_Test_Init(void)
BeforeLastNum = 0xFFFFFFFFU; BeforeLastNum = 0xFFFFFFFFU;
ReceivedValue = 0U; ReceivedValue = 0U;
RenWuDelay = 0U; RenWuDelay = 0U;
TurnOffPowerCount = 0U;
TurnOffPowerCountHistory = 0U;
errNum = 0U; errNum = 0U;
JieShouDaoValue = 0U; JieShouDaoValue = 0U;
RS485_TX_finish = 2U; /*发出的RS485信号标志位,初始化为2,不发不收*/ RS485_TX_finish = 2U; /*发出的RS485信号标志位,初始化为2,不发不收*/
BenCiShangDianZhiXingCount = 0U;
huifudelayCount = 0U;
StopFlag = 0U;
RS485TXBenCiXieRuNum = 0u;
RS485TXTotalExecutionNum = 0u;
RerequestCount = 0U;
} }
void NVS_Test_Service(void) void NVS_Test_Service(void)
...@@ -40,57 +51,77 @@ void NVS_Test_Service(void) ...@@ -40,57 +51,77 @@ void NVS_Test_Service(void)
LastNum = BenCiXieRuNum; LastNum = BenCiXieRuNum;
NVS_Test_BenCiXieRuNum(); NVS_Test_BenCiXieRuNum();
RS485_TX_finish = 0U;/*上电后满足等待时间后,开始发第一帧信号*/ RS485_TX_finish = 0U;/*上电后满足等待时间后,开始发第一帧信号*/
RS485TXBenCiXieRuNum = BenCiXieRuNum;
RS485TXTotalExecutionNum = TotalExecutionNum;
huifudelayCount = 0u;
} }
} }
else if(RS485_TX_finish == 0U) else if(RS485_TX_finish == 0U)
{ {
;/*执行发的功能*/ huifudelayCount = 0u;/*执行发的功能*/
} }
else else
{ {
if(RS485_TX_finish == 3U) if(RS485_TX_finish == 3U)
{ {
if (TotalExecutionNum != 0U)
huifudelayCount = 0u;
if ((TotalExecutionNum != 0U) && (JieShouDaoHistoryVal != JieShouDaoValue))
{ {
JieShouDaoHistoryVal = JieShouDaoValue;
if(JieShouDaoValue != LastNum) if(JieShouDaoValue != LastNum)
{ {
if ((JieShouDaoValue != BeforeLastNum) && (TurnOffPowerCount != TurnOffPowerCountHistory)) if ((JieShouDaoValue == BeforeLastNum) && (BenCiShangDianZhiXingCount == 0U))
{
errNum ++;
}
else if (TurnOffPowerCount == TurnOffPowerCountHistory)
{ {
errNum ++; ;
} }
if (JieShouDaoValue != BeforeLastNum) else
{ {
errNum ++; errNum ++;
} }
} }
} }
if (TurnOffPowerCount != TurnOffPowerCountHistory)
{
TurnOffPowerCountHistory = TurnOffPowerCount; /*断电后重启第一次对比标记,只有此时才执行对比上上次的值,之后不能对比*/
}
if (errNum == 0U) if (errNum == 0U)
{ {
StopFlag = 0u;
RerequestCount = 0U;
BenCiShangDianZhiXingCount ++;
BeforeLastNum = LastNum; BeforeLastNum = LastNum;
LastNum = BenCiXieRuNum; LastNum = BenCiXieRuNum;
NVS_Test_BenCiXieRuNum(); NVS_Test_BenCiXieRuNum();
TotalExecutionNum ++; TotalExecutionNum ++;
RS485TXBenCiXieRuNum = BenCiXieRuNum;
RS485TXTotalExecutionNum = TotalExecutionNum;
RS485_TX_finish = 0U;/*执行读的功能,对比完没问题再重新外发*/ RS485_TX_finish = 0U;/*执行读的功能,对比完没问题再重新外发*/
} }
else else
{ {
RS485_TX_finish = 0xFFU;/*不再执行任何收发操作*/ if(RerequestCount < 3U)
{
NVS_Test_Rerequest();
errNum = 0U;
RerequestCount ++;
}
else
{
RS485_TX_finish = 0xFFU;/*不再执行任何收发操作*/
}
} }
} }
else else
{ {
;/*等待仪表回复*/ if (huifudelayCount > 400u)
{
/*超过了8s没有回复,请求重发*/
NVS_Test_Rerequest();
huifudelayCount = 0;
}
else
{
huifudelayCount ++ ;/*等待仪表回复*/
}
} }
} }
} }
...@@ -115,4 +146,10 @@ static void NVS_Test_BenCiXieRuNum(void) ...@@ -115,4 +146,10 @@ static void NVS_Test_BenCiXieRuNum(void)
} }
static void NVS_Test_Rerequest(void)
{
StopFlag = 1u;
RS485TXBenCiXieRuNum = 0xFFFFEEEEU;
RS485TXTotalExecutionNum = 0xFFFFEEEEU;
RS485_TX_finish = 0U;
}
...@@ -21,7 +21,11 @@ extern uint32_t TurnOffPowerCount; ...@@ -21,7 +21,11 @@ extern uint32_t TurnOffPowerCount;
extern uint32_t TurnOffPowerCountHistory; extern uint32_t TurnOffPowerCountHistory;
extern uint8_t errNum; extern uint8_t errNum;
extern uint32_t JieShouDaoValue; extern uint32_t JieShouDaoValue;
extern uint16_t BenCiShangDianZhiXingCount;
extern uint16_t huifudelayCount;
extern uint8_t StopFlag;
extern uint32_t RS485TXBenCiXieRuNum;
extern uint32_t RS485TXTotalExecutionNum;
extern void NVS_Test_Init(void); extern void NVS_Test_Init(void);
......
#include "Power_Controls.h" #include "Power_Controls.h"
#include "NVS_Test.h"
uint16_t PowerCountNum = 0U; uint16_t PowerCountNum = 0U;
uint8_t KL1530ON = 0U; uint8_t KL1530ON = 0U;
...@@ -14,30 +15,39 @@ void Power_Controls_Init(void) ...@@ -14,30 +15,39 @@ void Power_Controls_Init(void)
void Power_Control_Count(void) void Power_Control_Count(void)
{ {
if (PowerCountNum <= (SHANG_DIAN_TIMES + ShangDianOffset)) if (StopFlag == 0U)
{ {
KL1530ON = 1U; if (PowerCountNum <= (SHANG_DIAN_TIMES + ShangDianOffset))
PowerCountNum ++;
}
else if ((PowerCountNum > (SHANG_DIAN_TIMES + ShangDianOffset)) && (PowerCountNum < (SHANG_DIAN_TIMES + ShangDianOffset + DUAN_DIAN_TIMES)))
{
KL1530ON = 0U;
PowerCountNum ++;
}
else
{
KL1530ON = 0U;
PowerCountNum = 0U;
if(ShangDianOffset < 300U)
{ {
/*上电总时长小于90s+25s*/ KL1530ON = 1U;
ShangDianOffset = ((ShangDianOffset + 5) *10 / 7); PowerCountNum ++;
} }
else else if ((PowerCountNum > (SHANG_DIAN_TIMES + ShangDianOffset)) && (PowerCountNum < (SHANG_DIAN_TIMES + ShangDianOffset + DUAN_DIAN_TIMES)))
{ {
ShangDianOffset /= 20u; KL1530ON = 0U;
PowerCountNum ++;
} }
else
{
KL1530ON = 0U;
PowerCountNum = 0U;
if(ShangDianOffset < 300U)
{
/*上电总时长小于90s+25s*/
ShangDianOffset = ((ShangDianOffset + 5) *10 / 7);
}
else
{
ShangDianOffset /= 20u;
}
}
}
else
{
KL1530ON = 1U;
PowerCountNum = 0U;
} }
} }
......
...@@ -172,6 +172,7 @@ static Protocol_uint32_t RS485_Protocol_UartSend(const Protocol_uint8_t *pData, ...@@ -172,6 +172,7 @@ static Protocol_uint32_t RS485_Protocol_UartSend(const Protocol_uint8_t *pData,
} }
uint8_t RS485_data[4] = {0,0,0,0}; uint8_t RS485_data[4] = {0,0,0,0};
uint32_t zuihoujiedaode = 0;
static void RS485_Protocol_UartHandle(const Protocol_Data_t *pData) static void RS485_Protocol_UartHandle(const Protocol_Data_t *pData)
{ {
...@@ -184,6 +185,8 @@ static void RS485_Protocol_UartHandle(const Protocol_Data_t *pData) ...@@ -184,6 +185,8 @@ static void RS485_Protocol_UartHandle(const Protocol_Data_t *pData)
RS485_data[2] = pData->Data[2]; RS485_data[2] = pData->Data[2];
RS485_data[3] = pData->Data[3]; RS485_data[3] = pData->Data[3];
zuihoujiedaode = (RS485_data[0] + (RS485_data[1] << 8u) + (RS485_data[2] << 16u) + (RS485_data[3] << 24u)) ;
memcpy(R485_ID60h.Msg, RS485_data, 4u); memcpy(R485_ID60h.Msg, RS485_data, 4u);
R485_Receive_0x60(); R485_Receive_0x60();
RS485_TX_finish = 3U; RS485_TX_finish = 3U;
......
...@@ -99,6 +99,21 @@ void Sys_Run_Mode_10ms_Tasks_Group(void) ...@@ -99,6 +99,21 @@ void Sys_Run_Mode_10ms_Tasks_Group(void)
// UART_Ch0_Send_Multiple_Byte(testdata,3); // UART_Ch0_Send_Multiple_Byte(testdata,3);
// RS485_User_Tx_Data(); // RS485_User_Tx_Data();
// if(RS485_TX_finish == 0)
// {
// LINE_OUT_NEG_09 = 1;
// if(LINE_OUT_NEG_09 == 1)
// {
// RS485_User_Tx_Data();
// }
// }
// else
// {
// LINE_OUT_NEG_09 = 0;
// // Recv_Byte();
// RS485_Protocol_Service();
// }
if(RS485_TX_finish == 0) if(RS485_TX_finish == 0)
{ {
LINE_OUT_NEG_09 = 1; LINE_OUT_NEG_09 = 1;
...@@ -107,12 +122,8 @@ void Sys_Run_Mode_10ms_Tasks_Group(void) ...@@ -107,12 +122,8 @@ void Sys_Run_Mode_10ms_Tasks_Group(void)
RS485_User_Tx_Data(); RS485_User_Tx_Data();
} }
} }
else
{
LINE_OUT_NEG_09 = 0;
// Recv_Byte();
RS485_Protocol_Service();
}
} }
/*============================================================================== /*==============================================================================
...@@ -145,6 +156,13 @@ void Sys_Run_Mode_20ms_Tasks_Group0(void) ...@@ -145,6 +156,13 @@ void Sys_Run_Mode_20ms_Tasks_Group0(void)
time100mssend = 0; time100mssend = 0;
} }
if(RS485_TX_finish != 0)
{
LINE_OUT_NEG_09 = 0;
// Recv_Byte();
RS485_Protocol_Service();
}
if (errNum == 0) if (errNum == 0)
{ {
if((KL1530ON == 1) && (RenWuDelay >= 30U)) if((KL1530ON == 1) && (RenWuDelay >= 30U))
...@@ -153,12 +171,14 @@ void Sys_Run_Mode_20ms_Tasks_Group0(void) ...@@ -153,12 +171,14 @@ void Sys_Run_Mode_20ms_Tasks_Group0(void)
} }
else if ((KL1530ON == 1) && (RenWuDelay < 30U)) else if ((KL1530ON == 1) && (RenWuDelay < 30U))
{ {
TurnOffPowerCount ++; ;
} }
else else
{ {
RenWuDelay = 0U; RenWuDelay = 0U;
RS485_TX_finish = 2U; /*断电置为0x2,不发不收*/ RS485_TX_finish = 2U; /*断电置为0x2,不发不收*/
BenCiShangDianZhiXingCount = 0U;
huifudelayCount = 0U;
} }
} }
} }
......
...@@ -336,176 +336,30 @@ uint32_t sendnum = 1; ...@@ -336,176 +336,30 @@ uint32_t sendnum = 1;
void RS485_User_Tx_Data(void) void RS485_User_Tx_Data(void)
{ {
uint8_t flag = 0;
#if (1) uint32_t sendfinishflag = 0;
uint8_t flag = 0;
uint32_t sendfinishflag = 0; sendmsgAll[0] = (uint8_t)(RS485TXBenCiXieRuNum & 0xFF);
// if(firstflag = 0) sendmsgAll[1] = (uint8_t)((RS485TXBenCiXieRuNum >> 8U) & 0xFF);
// { sendmsgAll[2] = (uint8_t)((RS485TXBenCiXieRuNum >> 16U) & 0xFF);
memcpy(lastdata,nowdata,4); sendmsgAll[3] = (uint8_t)((RS485TXBenCiXieRuNum >> 24U) & 0xFF);
// } sendmsgAll[4] = (uint8_t)(RS485TXTotalExecutionNum & 0xFF);
// m sendmsgAll[5] = (uint8_t)((RS485TXTotalExecutionNum >> 8U) & 0xFF);
sendmsgAll[0] = (uint8_t)(BenCiXieRuNum & 0xFF); sendmsgAll[6] = (uint8_t)((RS485TXTotalExecutionNum >> 16U) & 0xFF);
sendmsgAll[1] = (uint8_t)((BenCiXieRuNum >> 8U) & 0xFF); sendmsgAll[7] = (uint8_t)((RS485TXTotalExecutionNum >> 24U) & 0xFF);
sendmsgAll[2] = (uint8_t)((BenCiXieRuNum >> 16U) & 0xFF);
sendmsgAll[3] = (uint8_t)((BenCiXieRuNum >> 24U) & 0xFF); if(RS485_TX_finish == 0)
{
sendmsgAll[4] = (uint8_t)(TotalExecutionNum & 0xFF); sendfinishflag = R485_Send(0x70, sendmsgAll, 8);
sendmsgAll[5] = (uint8_t)((TotalExecutionNum >> 8U) & 0xFF); // RS485_TX_finish = 0U;
sendmsgAll[6] = (uint8_t)((TotalExecutionNum >> 16U) & 0xFF); if(sendfinishflag == 0)
sendmsgAll[7] = (uint8_t)((TotalExecutionNum >> 24U) & 0xFF); {
RS485_TX_finish = 1U;
if(RS485_TX_finish == 0) }
{ }
// LINE_OUT_NEG_09 = 1;
switch (RS485_send_num)
{
case RS485_Tx_ID70_Idx:
sendfinishflag = R485_Send(0x70, sendmsgAll, 8);
// RS485_TX_finish = 0U;
if(sendfinishflag == 0)
{
RS485_TX_finish = 1U;
if(RS485_TX_finish == 1)
{
// RS485_send_num++;
// lastdata[0] = (uint8_t)sendnum & 0xFF;
// lastdata[1] = ((uint8_t)(sendnum >>8)) & 0xFF;
// lastdata[2] = ((uint8_t)(sendnum >>16)) & 0xFF;
// lastdata[3] = ((uint8_t)(sendnum >>24)) & 0xFF;
nowdata[0] = (uint8_t)sendnum & 0xFF;
nowdata[1] = ((uint8_t)(sendnum >>8)) & 0xFF;
nowdata[2] = ((uint8_t)(sendnum >>16)) & 0xFF;
nowdata[3] = ((uint8_t)(sendnum >>24)) & 0xFF;
sendnum++;
}
}
break;
// case RS485_Tx_ID49_Idx:
// sendfinishflag = R485_Send(0x71, sendmsgAll, 8);
// RS485_TX_finish = 1;
// if(sendfinishflag == 0)
// {
// if(RS485_TX_finish == 1)
// {
// // sendnum++;
// RS485_send_num ++;
// }
// }
// // uart_wait_tx_done(R485_UART_PORT, 100);
// break;
// case RS485_Tx_ID4A_Idx:
// sendfinishflag = R485_Send(0x72, sendmsgAll, sizeof(sendmsgAll));
// RS485_TX_finish = 1;
// if(sendfinishflag == 0)
// {
// RS485_TX_finish = 1;
// if(RS485_TX_finish == 1)
// {
// RS485_send_num++;
// }
// }
// break;
// case 3:
// sendfinishflag = R485_Send(0x73, sendmsgAll, sizeof(sendmsgAll));
// RS485_TX_finish = 1;
// if(sendfinishflag == 0)
// {
// RS485_TX_finish = 1;
// if(RS485_TX_finish == 1)
// {
// RS485_send_num++;
// }
// }
// break;
// case 4:
// sendfinishflag = R485_Send(0x74, sendmsgAll, sizeof(sendmsgAll));
// RS485_TX_finish = 1;
// if(sendfinishflag == 0)
// {
// RS485_TX_finish = 1;
// if(RS485_TX_finish == 1)
// {
// RS485_send_num++;
// }
// }
// break;
default:
// sendnum++;
RS485_send_num = 0;
break;
// RS485_TX_finish = 1;
}
}
#endif
#if(0)
uint8_t flag = 0;
uint32_t sendfinishflag = 0;
// if(RS485_send_time > 3000)
// {
switch (RS485_send_num)
{
case RS485_Tx_ID48_Idx:
sendfinishflag = R485_Send_0x40();
RS485_TX_finish = 1;
if(sendfinishflag == 0)
{
if(RS485_TX_finish == 1)
{
// sendnum++;
RS485_send_time = 0;
RS485_send_num ++;
}
}
break;
case RS485_Tx_ID49_Idx:
sendfinishflag = R485_Send_0x41();
if(sendfinishflag == 0)
{
RS485_send_time = 0;
RS485_TX_finish = 1;
if(RS485_TX_finish == 1)
{
RS485_send_num++;
}
}
break;
case RS485_Tx_ID4A_Idx:
sendfinishflag = R485_Send_0x42();
if(sendfinishflag == 0)
{
RS485_send_time = 0;
RS485_TX_finish = 1;
if(RS485_TX_finish == 1)
{
RS485_send_num++;
}
}
break;
default:
flag = 1;
RS485_send_time = 0;
RS485_send_num = 0;
break;
}
#endif
} }
void backsend(void) void backsend(void)
{ {
if(RS485_send_time>=20) if(RS485_send_time>=20)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment