ems/ems_c/logic/logic_power_distr.c

177 lines
7.3 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*****************************************************************************
* @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);
}
}
}