提交 9416f001 作者: wysheng

修复充电时压差大引起的问题

上级 bdb3b65c
......@@ -4,7 +4,7 @@
#include "Global.h"
#define DcModule_ZhongXing 0
#define DcModule_ZhongXing 1
#define DcModule_BaudRate (250)
......
......@@ -331,7 +331,7 @@ void DcModule(void const * parameter)
DcModuleAbility.SingleMaxCurrt = UserParam.SingleMaxCurrt;
DcModeMsg = NULL;
osMessageQDef(DcModeMsg, 128, StructDcModuleSend);
osMessageQDef(DcModeMsg, 256, StructDcModuleSend);
DcModeMsg = osMessageCreate(osMessageQ(DcModeMsg), NULL);
u32 SendTick = GetSystemTick();
......@@ -361,7 +361,7 @@ void DcModule(void const * parameter)
u8 DcModuleInit(void)
{
osThreadDef(DcModule, DcModule, osPriorityAboveNormal, 0, configMINIMAL_STACK_SIZE);
osThreadDef(DcModule, DcModule, osPriorityAboveNormal, 0, 2*configMINIMAL_STACK_SIZE);
if (NULL == osThreadCreate(osThread(DcModule), NULL))
return FALSE;
......
......@@ -75,6 +75,10 @@ UnionDcModuleStatus DcModuleStatus;
UnionDcModuleStatus DcModuleStatus_A;
UnionDcModuleStatus DcModuleStatus_B;
void RelaySwtichHandle(u8 group);
void RelaySwtichHandle1(u8 group);
void DcModuleManageProcess_SmartAllocation(void)
{
static u32 CheckTick = 0;
......@@ -260,11 +264,9 @@ void DcModuleManageProcess_SmartAllocation(void)
void DcModuleCtrlProcess_SmartAllocation(void)
{
static u32 CtrlTick = 0;
static u8 LastFlag_A = 0;
static u8 LastFlag_B = 0;
u32 Temp = 0;
static u32 Tick = 0; //
u8 flag = 0;
if ((GetSystemTick() -Tick) < 100)
{
......@@ -272,387 +274,57 @@ void DcModuleCtrlProcess_SmartAllocation(void)
}
Tick = GetSystemTick();
/*static StructDcModuleUsedStatus status[4] =
{
Invalid, Invalid, Invalid, Invalid
};
static StructDcModuleUsedStatus status1[4] =
{
Invalid, Invalid, Invalid, Invalid
};
u8 addr;
u32 Volt = 0;
u8 Cmd = 0;
u32 Current = 0;
for (u8 i = 0; i < DcModuleGroupSize; i++)
{
if (status[i] != DcModuleGroup[i].status)
{
Volt = DcModuleAbility.MinVolt * 100;
Current = DcModuleAbility.MinCurrt * 100;
if (DcModuleGroup[i].status == Valid) //释放模块,模块关机
{
//关机, 检测电流, 释放继电器
if (status[i] == Hold_A)
{
if (i == 0)
{
DcModuleManage.SetVolt = DcModuleAbility.MinVolt * 100;
DcModuleManage.SetCurrt = DcModuleAbility.MinCurrt * 100;
DcModuleManage.Cmd = 0xAA; //关机
}
else
{
//关机降流
Current = 0;
}
Temp = 1;
}
else if (status[i] == Hold_B)
{
if (i == 2)
{
DcModuleManage_B.SetVolt = DcModuleAbility.MinVolt * 100;
DcModuleManage_B.SetCurrt = DcModuleAbility.MinCurrt * 100;
DcModuleManage_B.Cmd = 0xAA; //关机
}
else
{
//关机降流
Current = 0;
}
Temp = 1;
}
else
{
status[i] = DcModuleGroup[i].status;
continue;
}
Cmd = 0xAA; //关机
DcModuleGroup[i].flag = 0;
}
else if (DcModuleGroup[i].status == Hold_A) //分配到A枪的模块
{
// 开机, 升压, 切换继电器
if (i != 0) //升压
{
Volt = DcModuleManage.SetVolt;
Temp = 1;
}
else if (status[i] == Hold_B)
{
//处理模块0组被B枪占用
//GPIO_ResetBits(RELAY_K5K6_Port, RELAY_K5K6_Pin);
}
else
{
status[i] = DcModuleGroup[i].status;
continue;
}
Cmd = 0x55; //开机
}
else if (DcModuleGroup[i].status == Hold_B)
{
// 开机, 升压, 切换继电器
if (i != 2) //升压
{
Volt = DcModuleManage_B.SetVolt;
Temp = 1;
}
else if (status[i] == Hold_A)
{
//处理模块组 2 被A枪占用
//GPIO_ResetBits(RELAY_K5K6_Port, RELAY_K5K6_Pin);
}
else
{
status[i] = DcModuleGroup[i].status;
continue;
}
Cmd = 0x55; //开机
}
else
{
status[i] = DcModuleGroup[i].status;
continue;
}
SendDataToDcModule(i, Cmd, Volt, Current);
status[i] = DcModuleGroup[i].status;
}
}
if (Temp)
return;
Temp = 0;*/
//检测升压 或者 降流
for (u8 i = 0; i < DcModuleGroupSize; i++)
{
if (DcModuleGroup[i].status == Hold_A && i != 0)
if (DcModuleGroup[i].status == Hold_A&& i != 0)
{
if (abs((s16) (DcModuleGroup[i].Voltage) - (s16) (DcModuleManage.SetVolt / 100)) > 100) //差距在10V以内,升压完成
if (abs((s16) (DcModuleGroup[i].Voltage) - (s16) (DcModuleManage.SetVolt / 100)) > 100
&& DcModuleGroup[i].flag ==1 )
{
Temp++;
DcModuleManage.Cmd = 0x55; //开机
SendDataToDcModule(i, DcModuleManage.Cmd, DcModuleManage.SetVolt,
DcModuleAbility.MinCurrt * 100);
flag++;
}
else
{
//差距在10V以内,升压完成,可以切换继电器
DcModuleGroup[i].flag = 0;
RelaySwtichHandle1(i);
}
}
else if (DcModuleGroup[i].status == Hold_B && i != 2)
{
if (abs((s32) (DcModuleGroup[i].Voltage) - (s32) (DcModuleManage_B.SetVolt / 100)) > 100) //差距在10V以内,升压完成,可以切换继电器
if (abs((s32) (DcModuleGroup[i].Voltage) - (s32) (DcModuleManage_B.SetVolt / 100)) > 100
&& DcModuleGroup[i].flag ==1)
{
Temp++;
DcModuleManage_B.Cmd = 0x55; //开机
SendDataToDcModule(i, DcModuleManage_B.Cmd, DcModuleManage_B.SetVolt,
DcModuleAbility.MinCurrt * 100);
flag++;
}
else
{
//差距在10V以内,升压完成,可以切换继电器
DcModuleGroup[i].flag = 0;
RelaySwtichHandle1(i);
}
}
else if (DcModuleGroup[i].status == Valid )
{
if (DcModuleGroup[i].Current > 50) //电流小于5A,将降流完成, 可以释放继电器
{
Temp++;
//SendCmdToDcModule(i, 0xAA); //关机
//SendDataToDcModule(i, 0xAA, DcModuleAbility.MinVolt * 100, DcModuleAbility.MinCurrt * 100);
}
if(DcModuleGroup[i].modules[0].status.Value.OnOff == DCModuleStatusOn)
SendDataToDcModule(i, 0xAA, DcModuleAbility.MinVolt * 100, DcModuleAbility.MinCurrt * 100);
DcModuleGroup[i].flag = 0;
}
}
if (Temp)
return;
Temp = 0;
//切换继电器
if(DcModuleGroup[0].status == Hold_A)
{
if(DcModuleGroup[2].status == Hold_A)
//GPIO_SetBits(RELAY_K5K6_Port, RELAY_K5K6_Pin);
DcModeleRelaySet(Relay_K5K6,eSwSta_On);
else
//GPIO_ResetBits(RELAY_K5K6_Port, RELAY_K5K6_Pin);
DcModeleRelaySet(Relay_K5K6,eSwSta_Off);
}
else if(DcModuleGroup[0].status == Hold_B)
{
//GPIO_SetBits(RELAY_K5K6_Port, RELAY_K5K6_Pin);
DcModeleRelaySet(Relay_K5K6,eSwSta_On);
}
else
{
//GPIO_ResetBits(RELAY_K5K6_Port, RELAY_K5K6_Pin);
DcModeleRelaySet(Relay_K5K6,eSwSta_Off);
}
if(DcModuleGroup[1].status == Hold_A)
{
//GPIO_ResetBits(RELAY_K7K8_Port, RELAY_K7K8_Pin);
//GPIO_SetBits(RELAY_K1K2_Port, RELAY_K1K2_Pin);
DcModeleRelaySet(Relay_K7K8,eSwSta_Off);
DcModeleRelaySet(Relay_K1K2,eSwSta_On);
}
else if(DcModuleGroup[1].status == Hold_B)
{
//GPIO_ResetBits(RELAY_K1K2_Port, RELAY_K1K2_Pin);
//GPIO_SetBits(RELAY_K7K8_Port, RELAY_K7K8_Pin);
DcModeleRelaySet(Relay_K1K2,eSwSta_Off);
DcModeleRelaySet(Relay_K7K8,eSwSta_On);
}
else
{
//GPIO_ResetBits(RELAY_K1K2_Port, RELAY_K1K2_Pin);
//GPIO_ResetBits(RELAY_K7K8_Port, RELAY_K7K8_Pin);
DcModeleRelaySet(Relay_K1K2,eSwSta_Off);
DcModeleRelaySet(Relay_K7K8,eSwSta_Off);
}
if(DcModuleGroup[2].status == Hold_A)
{
//GPIO_SetBits(RELAY_K5K6_Port, RELAY_K5K6_Pin);
DcModeleRelaySet(Relay_K5K6,eSwSta_On);
}
else if(DcModuleGroup[2].status == Hold_B)
{
if(DcModuleGroup[0].status == Hold_B)
//GPIO_SetBits(RELAY_K5K6_Port, RELAY_K5K6_Pin);
DcModeleRelaySet(Relay_K5K6,eSwSta_On);
else
//GPIO_ResetBits(RELAY_K5K6_Port, RELAY_K5K6_Pin);
DcModeleRelaySet(Relay_K5K6,eSwSta_Off);
}
else
{
//GPIO_ResetBits(RELAY_K5K6_Port, RELAY_K5K6_Pin);
DcModeleRelaySet(Relay_K5K6,eSwSta_Off);
}
if(DcModuleGroup[3].status == Hold_A)
{
//GPIO_ResetBits(RELAY_K9K10_Port, RELAY_K9K10_Pin);
//GPIO_SetBits(RELAY_K3K4_Port, RELAY_K3K4_Pin);
DcModeleRelaySet(Relay_K9K10,eSwSta_Off);
DcModeleRelaySet(Relay_K3K4,eSwSta_On);
}
else if(DcModuleGroup[3].status == Hold_B)
{
//GPIO_ResetBits(RELAY_K3K4_Port, RELAY_K3K4_Pin);
//GPIO_SetBits(RELAY_K9K10_Port, RELAY_K9K10_Pin);
DcModeleRelaySet(Relay_K3K4,eSwSta_Off);
DcModeleRelaySet(Relay_K9K10,eSwSta_On);
}
else
{
//GPIO_ResetBits(RELAY_K3K4_Port, RELAY_K3K4_Pin);
//GPIO_ResetBits(RELAY_K9K10_Port, RELAY_K9K10_Pin);
DcModeleRelaySet(Relay_K3K4,eSwSta_Off);
DcModeleRelaySet(Relay_K9K10,eSwSta_Off);
}
/*for (u8 i = 0; i < DcModuleGroupSize; i++)
{
//if (status1[i] != DcModuleGroup[i].status)
{
if (DcModuleGroup[i].status == Valid)
{
//切换继电器
//if (status1[i] == Hold_A)
if (DcModuleGroup[i].Current > 50)
{
if (i == 0)
{
}
else if (i == 1)
{
GPIO_ResetBits(RELAY_K1K2_Port, RELAY_K1K2_Pin);
}
else if (i == 2)
{
GPIO_ResetBits(RELAY_K5K6_Port, RELAY_K5K6_Pin);
}
else // if(i == 3)
{
GPIO_ResetBits(RELAY_K3K4_Port, RELAY_K3K4_Pin);
}
}
//else if (status1[i] == Hold_B)
{
if (i == 2)
{
}
else if (i == 0)
{
GPIO_ResetBits(RELAY_K5K6_Port, RELAY_K5K6_Pin);
}
else if (i == 1)
{
GPIO_ResetBits(RELAY_K7K8_Port, RELAY_K7K8_Pin);
}
else if (i == 3)
{
GPIO_ResetBits(RELAY_K9K10_Port, RELAY_K9K10_Pin);
}
}
}
else if (DcModuleGroup[i].status == Hold_A)
{
//切换继电器
if (i == 0)
{
}
else if (i == 1)
{
GPIO_SetBits(RELAY_K1K2_Port, RELAY_K1K2_Pin);
}
else if (i == 2)
{
GPIO_SetBits(RELAY_K5K6_Port, RELAY_K5K6_Pin);
}
else // if(i == 3)
{
GPIO_SetBits(RELAY_K3K4_Port, RELAY_K3K4_Pin);
}
}
else if (DcModuleGroup[i].status == Hold_B)
{
//切换继电器
if (i == 2)
{
}
else if (i == 0)
{
GPIO_SetBits(RELAY_K5K6_Port, RELAY_K5K6_Pin);
}
else if (i == 1)
{
GPIO_SetBits(RELAY_K7K8_Port, RELAY_K7K8_Pin);
}
else // if(i == 3)
{
GPIO_SetBits(RELAY_K9K10_Port, RELAY_K9K10_Pin);
}
flag++;
}
else
{
}
}
//status1[i] = DcModuleGroup[i].status;
}*/
/*if (LastFlag_A != DcModuleCtrl.CtrlFlag)
{
LastFlag_A = DcModuleCtrl.CtrlFlag;
Temp++;
//电流小于5A,将降流完成, 可以释放继电器
RelaySwtichHandle1(i);
}
if (LastFlag_B != DcModuleCtrl_B.CtrlFlag)
{
LastFlag_B = DcModuleCtrl_B.CtrlFlag;
Temp++;
SendDataToDcModule(i, 0xAA, DcModuleAbility.MinVolt * 100, DcModuleAbility.MinCurrt * 100);
DcModuleGroup[i].flag = 0;
}
//if ((GetSystemTick() -CtrlTick) > 100)
{
//CtrlTick = GetSystemTick();
Temp++;
}
if (0 == Temp)
return;*/
if (DcModuleCtrl.CtrlFlag)
{
if (DcModuleCtrl.NeedVolt > DcModuleAbility.MaxVolt)
......@@ -954,11 +626,22 @@ void SendDataToDcModule_ZhongXing(u8 group_index, u8 cmd, u32 volt, u32 current)
DcModuleGroup[group_index].modules[j].CurrentSet = current;
}
/*
Bit4: 电压输出范围选择
0x00 --- 500V
0x01 --- 750
*/
u8 flag = 0x00;
if(volt>500000)//大于500V
{
flag = 0x01;
}
DataSend.Id = 0x18059FA0;
DataSend.Len = 8;
DataSend.Data[0] = 0x10 | sendCmd;
DataSend.Data[0] = (flag<<4) | sendCmd;
DataSend.Data[1] = group_index + 1;
//if(current != 0)
if(((sendCmd==0x01||sendCmd==0x03)&&DcModuleGroup[group_index].modules[0].status.Value.OnOff!=0x02)
||(sendCmd==0x02&&DcModuleGroup[group_index].modules[0].status.Value.OnOff!=0x01))
{
Temp = current/10;
DataSend.Data[4] = (u8) (Temp >> 8);
......@@ -976,9 +659,17 @@ void SendDataToDcModule_ZhongXing(u8 group_index, u8 cmd, u32 volt, u32 current)
}
}
if(sendCmd != 0x02) //非停止充电,下发修改充电参数
if(DcModuleGroup[group_index].modules[0].status.Value.OnOff == 0x02) //非停止充电,下发修改充电参数
{
DataSend.Data[0] = 0x10 | 0x05;
DataSend.Data[0] = (flag<<4) | 0x05;
Temp = current/10;
DataSend.Data[4] = (u8) (Temp >> 8);
DataSend.Data[5] = (u8) (Temp >> 0);
Temp = volt/100;
DataSend.Data[2] = (u8) (Temp >> 8);
DataSend.Data[3] = (u8) (Temp >> 0);
DataSend.Data[6] = (u8) (Temp >> 8);
DataSend.Data[7] = (u8) (Temp >> 0);
if (pdTRUE != xQueueSend(DcModeMsg, &DataSend, 0))
{
//osDelay(10);
......@@ -1296,6 +987,143 @@ void RelayStatusCheck(void)
}
void RelaySwtichHandle(u8 group)
{
if (DcModuleGroup[group].status == Valid)
{
//切换继电器
if (group == 0)
{
GPIO_ResetBits(RELAY_K5K6_Port, RELAY_K5K6_Pin);
}
else if (group == 2)
{
GPIO_ResetBits(RELAY_K5K6_Port, RELAY_K5K6_Pin);
}
else if (group == 1)
{
GPIO_ResetBits(RELAY_K7K8_Port, RELAY_K7K8_Pin);
GPIO_ResetBits(RELAY_K1K2_Port, RELAY_K1K2_Pin);
}
else if (group == 3)
{
GPIO_ResetBits(RELAY_K9K10_Port, RELAY_K9K10_Pin);
GPIO_ResetBits(RELAY_K3K4_Port, RELAY_K3K4_Pin);
}
}
else if (DcModuleGroup[group].status == Hold_A)
{
//切换继电器
if (group == 1)
{
GPIO_SetBits(RELAY_K1K2_Port, RELAY_K1K2_Pin);
}
else if (group == 2)
{
GPIO_SetBits(RELAY_K5K6_Port, RELAY_K5K6_Pin);
}
else if(group == 3)
{
GPIO_SetBits(RELAY_K3K4_Port, RELAY_K3K4_Pin);
}
}
else if (DcModuleGroup[group].status == Hold_B)
{
//切换继电器
if (group == 0)
{
GPIO_SetBits(RELAY_K5K6_Port, RELAY_K5K6_Pin);
}
else if (group == 1)
{
GPIO_SetBits(RELAY_K7K8_Port, RELAY_K7K8_Pin);
}
else if(group == 3)
{
GPIO_SetBits(RELAY_K9K10_Port, RELAY_K9K10_Pin);
}
}
}
void RelaySwtichHandle1(u8 group)
{
//切换继电器
switch(group)
{
case 0:
if(DcModuleGroup[0].status == Hold_A)
{
if(DcModuleGroup[2].status == Hold_A)
DcModeleRelaySet(Relay_K5K6,eSwSta_On);
else
DcModeleRelaySet(Relay_K5K6,eSwSta_Off);
}
else if(DcModuleGroup[0].status == Hold_B)
{
DcModeleRelaySet(Relay_K5K6,eSwSta_On);
}
else
{
DcModeleRelaySet(Relay_K5K6,eSwSta_Off);
}
break;
case 1:
if(DcModuleGroup[1].status == Hold_A)
{
DcModeleRelaySet(Relay_K7K8,eSwSta_Off);
DcModeleRelaySet(Relay_K1K2,eSwSta_On);
}
else if(DcModuleGroup[1].status == Hold_B)
{
DcModeleRelaySet(Relay_K1K2,eSwSta_Off);
DcModeleRelaySet(Relay_K7K8,eSwSta_On);
}
else
{
DcModeleRelaySet(Relay_K1K2,eSwSta_Off);
DcModeleRelaySet(Relay_K7K8,eSwSta_Off);
}
break;
case 2:
if(DcModuleGroup[2].status == Hold_A)
{
DcModeleRelaySet(Relay_K5K6,eSwSta_On);
}
else if(DcModuleGroup[2].status == Hold_B)
{
if(DcModuleGroup[0].status == Hold_B)
DcModeleRelaySet(Relay_K5K6,eSwSta_On);
else
DcModeleRelaySet(Relay_K5K6,eSwSta_Off);
}
else
{
DcModeleRelaySet(Relay_K5K6,eSwSta_Off);
}
break;
case 3:
if(DcModuleGroup[3].status == Hold_A)
{
DcModeleRelaySet(Relay_K9K10,eSwSta_Off);
DcModeleRelaySet(Relay_K3K4,eSwSta_On);
}
else if(DcModuleGroup[3].status == Hold_B)
{
DcModeleRelaySet(Relay_K3K4,eSwSta_Off);
DcModeleRelaySet(Relay_K9K10,eSwSta_On);
}
else
{
DcModeleRelaySet(Relay_K3K4,eSwSta_Off);
DcModeleRelaySet(Relay_K9K10,eSwSta_Off);
}
break;
default:
break;
}
}
void DcModuleStatusCheck(void)
{
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论