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

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

parent eca1bf18
......@@ -8,10 +8,17 @@ uint32_t BeforeLastNum = 0U;
uint32_t ReceivedValue = 0U;
uint8_t RenWuDelay = 0U;
uint8_t errNum = 0U;
uint32_t TurnOffPowerCount = 0U;
uint32_t TurnOffPowerCountHistory = 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_Rerequest(void);
void NVS_Test_Init(void)
{
......@@ -21,11 +28,15 @@ void NVS_Test_Init(void)
BeforeLastNum = 0xFFFFFFFFU;
ReceivedValue = 0U;
RenWuDelay = 0U;
TurnOffPowerCount = 0U;
TurnOffPowerCountHistory = 0U;
errNum = 0U;
JieShouDaoValue = 0U;
RS485_TX_finish = 2U; /*发出的RS485信号标志位,初始化为2,不发不收*/
BenCiShangDianZhiXingCount = 0U;
huifudelayCount = 0U;
StopFlag = 0U;
RS485TXBenCiXieRuNum = 0u;
RS485TXTotalExecutionNum = 0u;
RerequestCount = 0U;
}
void NVS_Test_Service(void)
......@@ -40,57 +51,77 @@ void NVS_Test_Service(void)
LastNum = BenCiXieRuNum;
NVS_Test_BenCiXieRuNum();
RS485_TX_finish = 0U;/*上电后满足等待时间后,开始发第一帧信号*/
RS485TXBenCiXieRuNum = BenCiXieRuNum;
RS485TXTotalExecutionNum = TotalExecutionNum;
huifudelayCount = 0u;
}
}
else if(RS485_TX_finish == 0U)
{
;/*执行发的功能*/
huifudelayCount = 0u;/*执行发的功能*/
}
else
{
if(RS485_TX_finish == 3U)
{
if (TotalExecutionNum != 0U)
huifudelayCount = 0u;
if ((TotalExecutionNum != 0U) && (JieShouDaoHistoryVal != JieShouDaoValue))
{
JieShouDaoHistoryVal = JieShouDaoValue;
if(JieShouDaoValue != LastNum)
{
if ((JieShouDaoValue != BeforeLastNum) && (TurnOffPowerCount != TurnOffPowerCountHistory))
{
errNum ++;
}
else if (TurnOffPowerCount == TurnOffPowerCountHistory)
if ((JieShouDaoValue == BeforeLastNum) && (BenCiShangDianZhiXingCount == 0U))
{
errNum ++;
;
}
if (JieShouDaoValue != BeforeLastNum)
else
{
errNum ++;
}
}
}
if (TurnOffPowerCount != TurnOffPowerCountHistory)
{
TurnOffPowerCountHistory = TurnOffPowerCount; /*断电后重启第一次对比标记,只有此时才执行对比上上次的值,之后不能对比*/
}
if (errNum == 0U)
{
StopFlag = 0u;
RerequestCount = 0U;
BenCiShangDianZhiXingCount ++;
BeforeLastNum = LastNum;
LastNum = BenCiXieRuNum;
NVS_Test_BenCiXieRuNum();
TotalExecutionNum ++;
RS485TXBenCiXieRuNum = BenCiXieRuNum;
RS485TXTotalExecutionNum = TotalExecutionNum;
RS485_TX_finish = 0U;/*执行读的功能,对比完没问题再重新外发*/
}
else
{
RS485_TX_finish = 0xFFU;/*不再执行任何收发操作*/
if(RerequestCount < 3U)
{
NVS_Test_Rerequest();
errNum = 0U;
RerequestCount ++;
}
else
{
RS485_TX_finish = 0xFFU;/*不再执行任何收发操作*/
}
}
}
else
{
;/*等待仪表回复*/
if (huifudelayCount > 400u)
{
/*超过了8s没有回复,请求重发*/
NVS_Test_Rerequest();
huifudelayCount = 0;
}
else
{
huifudelayCount ++ ;/*等待仪表回复*/
}
}
}
}
......@@ -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;
extern uint32_t TurnOffPowerCountHistory;
extern uint8_t errNum;
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);
......
#include "Power_Controls.h"
#include "NVS_Test.h"
uint16_t PowerCountNum = 0U;
uint8_t KL1530ON = 0U;
......@@ -14,30 +15,39 @@ void Power_Controls_Init(void)
void Power_Control_Count(void)
{
if (PowerCountNum <= (SHANG_DIAN_TIMES + ShangDianOffset))
if (StopFlag == 0U)
{
KL1530ON = 1U;
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)
if (PowerCountNum <= (SHANG_DIAN_TIMES + ShangDianOffset))
{
/*上电总时长小于90s+25s*/
ShangDianOffset = ((ShangDianOffset + 5) *10 / 7);
KL1530ON = 1U;
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,
}
uint8_t RS485_data[4] = {0,0,0,0};
uint32_t zuihoujiedaode = 0;
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[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);
R485_Receive_0x60();
RS485_TX_finish = 3U;
......
......@@ -99,6 +99,21 @@ void Sys_Run_Mode_10ms_Tasks_Group(void)
// UART_Ch0_Send_Multiple_Byte(testdata,3);
// 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)
{
LINE_OUT_NEG_09 = 1;
......@@ -107,12 +122,8 @@ void Sys_Run_Mode_10ms_Tasks_Group(void)
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)
time100mssend = 0;
}
if(RS485_TX_finish != 0)
{
LINE_OUT_NEG_09 = 0;
// Recv_Byte();
RS485_Protocol_Service();
}
if (errNum == 0)
{
if((KL1530ON == 1) && (RenWuDelay >= 30U))
......@@ -153,12 +171,14 @@ void Sys_Run_Mode_20ms_Tasks_Group0(void)
}
else if ((KL1530ON == 1) && (RenWuDelay < 30U))
{
TurnOffPowerCount ++;
;
}
else
{
RenWuDelay = 0U;
RS485_TX_finish = 2U; /*断电置为0x2,不发不收*/
BenCiShangDianZhiXingCount = 0U;
huifudelayCount = 0U;
}
}
}
......
......@@ -336,176 +336,30 @@ uint32_t sendnum = 1;
void RS485_User_Tx_Data(void)
{
#if (1)
uint8_t flag = 0;
uint32_t sendfinishflag = 0;
// if(firstflag = 0)
// {
memcpy(lastdata,nowdata,4);
// }
// m
sendmsgAll[0] = (uint8_t)(BenCiXieRuNum & 0xFF);
sendmsgAll[1] = (uint8_t)((BenCiXieRuNum >> 8U) & 0xFF);
sendmsgAll[2] = (uint8_t)((BenCiXieRuNum >> 16U) & 0xFF);
sendmsgAll[3] = (uint8_t)((BenCiXieRuNum >> 24U) & 0xFF);
sendmsgAll[4] = (uint8_t)(TotalExecutionNum & 0xFF);
sendmsgAll[5] = (uint8_t)((TotalExecutionNum >> 8U) & 0xFF);
sendmsgAll[6] = (uint8_t)((TotalExecutionNum >> 16U) & 0xFF);
sendmsgAll[7] = (uint8_t)((TotalExecutionNum >> 24U) & 0xFF);
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
uint8_t flag = 0;
uint32_t sendfinishflag = 0;
sendmsgAll[0] = (uint8_t)(RS485TXBenCiXieRuNum & 0xFF);
sendmsgAll[1] = (uint8_t)((RS485TXBenCiXieRuNum >> 8U) & 0xFF);
sendmsgAll[2] = (uint8_t)((RS485TXBenCiXieRuNum >> 16U) & 0xFF);
sendmsgAll[3] = (uint8_t)((RS485TXBenCiXieRuNum >> 24U) & 0xFF);
sendmsgAll[4] = (uint8_t)(RS485TXTotalExecutionNum & 0xFF);
sendmsgAll[5] = (uint8_t)((RS485TXTotalExecutionNum >> 8U) & 0xFF);
sendmsgAll[6] = (uint8_t)((RS485TXTotalExecutionNum >> 16U) & 0xFF);
sendmsgAll[7] = (uint8_t)((RS485TXTotalExecutionNum >> 24U) & 0xFF);
if(RS485_TX_finish == 0)
{
sendfinishflag = R485_Send(0x70, sendmsgAll, 8);
// RS485_TX_finish = 0U;
if(sendfinishflag == 0)
{
RS485_TX_finish = 1U;
}
}
}
void backsend(void)
{
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