177 lines
7.3 KiB
C
177 lines
7.3 KiB
C
/*****************************************************************************
|
||
* @copyright 2024-202, . POWER SUPPLY CO., LTD.
|
||
* @file logic_power_distr.c
|
||
* @brief xxxx
|
||
* @author Gary
|
||
* @date 2024/09/28
|
||
* @remark 初修订
|
||
*****************************************************************************/
|
||
#include "logic_comm.h"
|
||
|
||
|
||
/*****************************************************************************
|
||
* @brief 获取功率分配参数
|
||
*
|
||
* @return 0 更新成功 -1 失败 1 无更新
|
||
*****************************************************************************/
|
||
int logic_getPowerDistrParam()
|
||
{
|
||
static allocate_power_t getPowerBuff;
|
||
if (0 != kit_get_allocate_power(&getPowerBuff))
|
||
{
|
||
// INLOG(Log_LOGIC_EN, ERROR_EN, "获取保护配置失败\n");
|
||
return 1;
|
||
}
|
||
|
||
stlogic.para_delivery.task_params.distr.cabintCont = getPowerBuff.pcsNum;
|
||
stlogic.para_delivery.task_params.distr.chgDirection = getPowerBuff.chgDirection;
|
||
stlogic.para_delivery.task_params.distr.allocateMode = getPowerBuff.allocateMode;
|
||
return 0;
|
||
}
|
||
|
||
/*****************************************************************************
|
||
* @brief 分配的期望功率下发
|
||
* @param[in] power_distr_t distPower 运行参数
|
||
* @return -1:下发失败 0:下发成功
|
||
*****************************************************************************/
|
||
void logic_PowerCal(power_distr_t *distPower, float_t tempPower, int loop)
|
||
{
|
||
float_t finalPower = 0;
|
||
// if (distPower->nowDistPower[loop] < 0) // 充电
|
||
if (tempPower < 0) // 充电
|
||
{
|
||
finalPower = -float_min(abs(tempPower), distPower->pcsMaxChaPower[loop]);
|
||
if (float_diff(distPower->nowBmsPower[loop], finalPower)) // 实时功率比较 差距大再下发
|
||
{
|
||
if ((uint8_t)getRtdbPointValue(rtdbType, kDev_Type_EMS, 0, kEms_LogicLog_Enable) == 1)
|
||
{
|
||
KITLOG(LOG_MODBUS_EN, INFO_EN, "柜 %d 功率变化 %.2f kw ==> %.2f kw", loop, distPower->nowDistPower[loop], finalPower * distPower->chgDirection);
|
||
KITPTF(LOG_MODBUS_EN, INFO_EN, "柜 %d 功率变化 %.2f kw ==> %.2f kw", loop, distPower->nowDistPower[loop], finalPower * distPower->chgDirection);
|
||
}
|
||
distPower->nowDistPower[loop] = finalPower * distPower->chgDirection;
|
||
}
|
||
// 调试模式PCS开关由指令决定
|
||
if (stlogic.para_delivery.mode == E_TACTIC_MODE_DEBUG)
|
||
{
|
||
distPower->pcsSwitch[loop] = stlogic.para_delivery.task_params.debug.pcsSwitch;
|
||
}
|
||
else
|
||
{
|
||
// distPower->pcsSwitch[loop] = distPower->pcsOn; // pcs 功能码可定制 在这里
|
||
distPower->pcsSwitch[loop] = 1;
|
||
}
|
||
|
||
// 系统状态更新
|
||
updateState(kState_Charging, true);
|
||
}
|
||
else if (tempPower > 0) // 放电
|
||
{
|
||
finalPower = float_min(tempPower, distPower->pcsMaxDiscPower[loop]);
|
||
if (float_diff(distPower->nowBmsPower[loop], finalPower)) // 与实时功率比较 差距大再下发
|
||
{
|
||
if ((uint8_t)getRtdbPointValue(rtdbType, kDev_Type_EMS, 0, kEms_LogicLog_Enable) == 1)
|
||
{
|
||
KITLOG(LOG_MODBUS_EN, INFO_EN, "柜 %d 功率变化 %.2f kw ==> %.2f kw", loop, distPower->nowDistPower[loop], finalPower * distPower->chgDirection);
|
||
KITPTF(LOG_MODBUS_EN, INFO_EN, "柜 %d 功率变化 %.2f kw ==> %.2f kw", loop, distPower->nowDistPower[loop], finalPower * distPower->chgDirection);
|
||
}
|
||
distPower->nowDistPower[loop] = finalPower * distPower->chgDirection;
|
||
}
|
||
// 调试模式PCS开关由指令决定
|
||
if (stlogic.para_delivery.mode == E_TACTIC_MODE_DEBUG)
|
||
{
|
||
distPower->pcsSwitch[loop] = stlogic.para_delivery.task_params.debug.pcsSwitch;
|
||
}
|
||
else
|
||
{
|
||
// distPower->pcsSwitch[loop] = distPower->pcsOn; // pcs 功能码可定制 在这里
|
||
distPower->pcsSwitch[loop] = 1;
|
||
}
|
||
|
||
// 系统状态更新
|
||
updateState(kState_Discharging, true);
|
||
}
|
||
else // 待机
|
||
{
|
||
// distPower->pcsSwitch[loop] = distPower->pcsOff;
|
||
if (0 != distPower->nowDistPower[loop])
|
||
{
|
||
if ((uint8_t)getRtdbPointValue(rtdbType, kDev_Type_EMS, 0, kEms_LogicLog_Enable) == 1)
|
||
{
|
||
KITLOG(LOG_MODBUS_EN, INFO_EN, "柜 %d 功率变化 %.2f kw ==> 0 kw", loop, distPower->nowDistPower[loop]);
|
||
KITPTF(LOG_MODBUS_EN, INFO_EN, "柜 %d 功率变化 %.2f kw ==> 0 kw", loop, distPower->nowDistPower[loop]);
|
||
}
|
||
}
|
||
distPower->nowDistPower[loop] = 0;
|
||
// 调试模式PCS开关由指令决定
|
||
if (stlogic.para_delivery.mode == E_TACTIC_MODE_DEBUG)
|
||
{
|
||
distPower->pcsSwitch[loop] = stlogic.para_delivery.task_params.debug.pcsSwitch;
|
||
}
|
||
else
|
||
{
|
||
// distPower->pcsSwitch[loop] = distPower->pcsOn; // pcs 功能码可定制 在这里
|
||
distPower->pcsSwitch[loop] = 0;
|
||
}
|
||
// 系统状态更新
|
||
updateState(kState_Standby, true);
|
||
}
|
||
}
|
||
|
||
/*****************************************************************************
|
||
* @brief 期望功率分配计算并下发
|
||
*
|
||
* @return -1:数据处理失败 0:数据处理成功
|
||
*****************************************************************************/
|
||
void logicFun_powerDistr()
|
||
{
|
||
power_distr_t *charge_params = &stlogic.para_delivery.task_params.distr;
|
||
float_t tempPower = 0;
|
||
int loop = 0, closePrtc = 0;
|
||
if (charge_params == NULL)
|
||
{
|
||
// INLOG(Log_LOGIC_EN, ERROR_EN, "入参指针为空!\n");
|
||
return;
|
||
}
|
||
|
||
// 把保护计算完的的功率拿出来分配
|
||
charge_params->power = stlogic.para_delivery.task_params.protect.power;
|
||
|
||
if (E_TACTIC_MODE_DEBUG == stlogic.para_delivery.mode && stlogic.para_delivery.task_params.debug.protectSwitch)
|
||
{
|
||
closePrtc = 1;
|
||
}
|
||
// 计算每个柜子分多少功率
|
||
for (loop = 0; loop < charge_params->cabintCont; loop++)
|
||
{
|
||
if (charge_params->power < 0 && charge_params->sumSoc != 0) // 充电
|
||
{
|
||
if (closePrtc || (charge_params->pcsMaxChaPower[loop] != 0 && charge_params->pcsState[loop] != 0 && charge_params->bmsState[loop] != 0))
|
||
{
|
||
tempPower = charge_params->power * (SOCMAX - charge_params->bmsSoc[loop]) / charge_params->sumSoc;
|
||
logic_PowerCal(charge_params, tempPower, loop);
|
||
}
|
||
else
|
||
{
|
||
charge_params->nowDistPower[loop] = 0;
|
||
}
|
||
}
|
||
else if (charge_params->power > 0 && charge_params->sumSoc != 0) // 放电
|
||
{
|
||
if (closePrtc || (charge_params->pcsMaxDiscPower[loop] != 0 && charge_params->pcsState[loop] != 0 && charge_params->bmsState[loop] != 0))
|
||
{
|
||
tempPower = charge_params->power * (charge_params->bmsSoc[loop]) / charge_params->sumSoc;
|
||
logic_PowerCal(charge_params, tempPower, loop);
|
||
}
|
||
else
|
||
{
|
||
charge_params->nowDistPower[loop] = 0;
|
||
}
|
||
}
|
||
else // 待机
|
||
{
|
||
charge_params->nowDistPower[loop] = 0;
|
||
logic_PowerCal(charge_params, tempPower, loop);
|
||
}
|
||
}
|
||
}
|