ems/ems_c/logic/logic_power_distr.c

177 lines
7.3 KiB
C
Raw Normal View History

2025-05-13 17:49:49 +08:00
/*****************************************************************************
* @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);
}
}
}