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