|
@@ -21,6 +21,7 @@
|
|
|
#define PRE_CHARG_RANGE 50
|
|
|
#define EQUAL 0
|
|
|
#define CMD_DELAY_TIME 25000
|
|
|
+#define PSU_TASK_CHECK_TIME 1
|
|
|
|
|
|
struct SysConfigAndInfo *ShmSysConfigAndInfo;
|
|
|
struct StatusCodeData *ShmStatusCodeData;
|
|
@@ -31,8 +32,12 @@ byte getAvailableCapOffset = 5;
|
|
|
byte deratingKeepCount = 0;
|
|
|
byte psuCmdSeq = _PSU_CMD_CAP;
|
|
|
|
|
|
+byte startModuleFlag = false;
|
|
|
+bool psuReceiveRecovery = false;
|
|
|
+
|
|
|
float evseOutVol[CONNECTOR_QUANTITY] = {0, 0, 0, 0};
|
|
|
float evseOutCur[CONNECTOR_QUANTITY] = {0, 0, 0, 0};
|
|
|
+struct timeval _PsuReceiveRecoveryCheck_time;
|
|
|
|
|
|
void PRINTF_FUNC(char *string, ...);
|
|
|
|
|
@@ -188,7 +193,7 @@ unsigned char DetectBitValue(unsigned char _byte, unsigned char _bit)
|
|
|
|
|
|
void AbnormalStopAnalysis(byte gun_index, int errCode)
|
|
|
{
|
|
|
- for (char i = 0; i < 3; i++)
|
|
|
+ for (char i = 0; i < 4; i++)
|
|
|
{
|
|
|
unsigned char byteIndex = (errCode >> (8 * i)) & 0xff;
|
|
|
|
|
@@ -196,48 +201,172 @@ void AbnormalStopAnalysis(byte gun_index, int errCode)
|
|
|
{
|
|
|
if(DetectBitValue(byteIndex , bitIndex) == 1)
|
|
|
{
|
|
|
- switch(byteIndex)
|
|
|
+ switch(i)
|
|
|
{
|
|
|
case 0:
|
|
|
{
|
|
|
- if (bitIndex == 0)
|
|
|
- ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuOutputShortCircuit = YES;
|
|
|
- else if (bitIndex == 5)
|
|
|
- ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuDcSideShutDown = YES;
|
|
|
+ // err 1
|
|
|
+ if (bitIndex == 2)
|
|
|
+ {
|
|
|
+ // 012307
|
|
|
+ // fuse burn-out
|
|
|
+ ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuFuseBurnOut = YES;
|
|
|
+ }
|
|
|
+ else if (bitIndex == 3)
|
|
|
+ {
|
|
|
+ // 012308
|
|
|
+ // Communication fault between PFC and DCDC
|
|
|
+ ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuPfcAndDcdcCommFault = YES;
|
|
|
+ }
|
|
|
+ else if (bitIndex == 6)
|
|
|
+ {
|
|
|
+ // 012309
|
|
|
+ // Unbalance positive and negative BUS voltage
|
|
|
+ ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuBusVoltageUnbalance = YES;
|
|
|
+ }
|
|
|
+ else if (bitIndex == 7)
|
|
|
+ {
|
|
|
+ // 012310
|
|
|
+ // BUS over voltage
|
|
|
+ ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuBusOverVoltage = YES;
|
|
|
+ }
|
|
|
}
|
|
|
break;
|
|
|
case 1:
|
|
|
{
|
|
|
- if (bitIndex == 1)
|
|
|
- ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuFailureAlarm = YES;
|
|
|
- else if (bitIndex == 2)
|
|
|
- ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuProtectionAlarm = YES;
|
|
|
- else if (bitIndex == 3)
|
|
|
- ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuFanFailureAlarm = YES;
|
|
|
- else if (bitIndex == 4)
|
|
|
- ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuCriticalPointOTP = YES;
|
|
|
- else if (bitIndex == 5)
|
|
|
- ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuDcSideShutDown = YES;
|
|
|
+ // err 2
|
|
|
+ if (bitIndex == 0)
|
|
|
+ {
|
|
|
+ // 012311
|
|
|
+ // BUS voltage abnormal
|
|
|
+ ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuBusVoltageAbnormal = YES;
|
|
|
+ }
|
|
|
+ else if (bitIndex == 1)
|
|
|
+ {
|
|
|
+ // 012270
|
|
|
+ // Over voltage of any phase
|
|
|
+ ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuInputOVP = YES;
|
|
|
+ }
|
|
|
+ else if (bitIndex == 2)
|
|
|
+ {
|
|
|
+ // 012263
|
|
|
+ // ID number repetition
|
|
|
+ ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuDuplicateID = YES;
|
|
|
+ }
|
|
|
+ else if (bitIndex == 3)
|
|
|
+ {
|
|
|
+ // 012312
|
|
|
+ // BUS under voltage
|
|
|
+ ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuBusUnderVoltage = YES;
|
|
|
+ }
|
|
|
+ else if (bitIndex == 4)
|
|
|
+ {
|
|
|
+ // 012313
|
|
|
+ // Phase loss
|
|
|
+ ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuInputPhaseLoss = YES;
|
|
|
+ }
|
|
|
+ else if (bitIndex == 6)
|
|
|
+ {
|
|
|
+ // 012271
|
|
|
+ // Under voltage of any phase
|
|
|
+ ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuInputUVP = NO;
|
|
|
+ }
|
|
|
}
|
|
|
break;
|
|
|
case 2:
|
|
|
{
|
|
|
+ // err3
|
|
|
if (bitIndex == 0)
|
|
|
- ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuPowerLimitedState = YES;
|
|
|
+ {
|
|
|
+ // 012240
|
|
|
+ // CAN communication fault
|
|
|
+ ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuCommunicationFail = YES;
|
|
|
+ }
|
|
|
else if (bitIndex == 1)
|
|
|
- ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuDuplicateID = YES;
|
|
|
- else if (bitIndex == 2)
|
|
|
- ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuThreePhaseOnputImbalance = YES;
|
|
|
- else if (bitIndex == 3)
|
|
|
- ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuThreePhaseInputInadequate = YES;
|
|
|
- else if (bitIndex == 4)
|
|
|
- ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuThreePhaseInputInadequate = YES;
|
|
|
- else if (bitIndex == 5)
|
|
|
- ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuInputUVP = YES;
|
|
|
- else if (bitIndex == 6)
|
|
|
- ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuInputOVP = YES;
|
|
|
+ {
|
|
|
+ // 012275
|
|
|
+ // DCDC uneven current sharing
|
|
|
+ ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuSevereUnevenCurrent = YES;
|
|
|
+ }
|
|
|
+ else if (bitIndex == 3)
|
|
|
+ {
|
|
|
+ // 012278
|
|
|
+ // PFC power off
|
|
|
+ //ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuFfcSideShutDown = YES;
|
|
|
+ }
|
|
|
+ else if (bitIndex == 5)
|
|
|
+ {
|
|
|
+ // 012314
|
|
|
+ // Full speed of fan
|
|
|
+ ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuFanFullSpeed = YES;
|
|
|
+ }
|
|
|
+ else if (bitIndex == 6)
|
|
|
+ {
|
|
|
+ // 012266
|
|
|
+ // DCDC power off
|
|
|
+ //ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuDcSideShutDown = YES;
|
|
|
+ }
|
|
|
+ else if (bitIndex == 7)
|
|
|
+ {
|
|
|
+ // 012273
|
|
|
+ // Module unders power limiting status
|
|
|
+ ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuPowerLimitedState = YES;
|
|
|
+ }
|
|
|
}
|
|
|
break;
|
|
|
+ case 3:
|
|
|
+ {
|
|
|
+ // err 4
|
|
|
+ if (bitIndex == 0)
|
|
|
+ {
|
|
|
+ // 012315
|
|
|
+ // Temperature power limiting
|
|
|
+ ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuTemperaturePowerLimit = YES;
|
|
|
+ }
|
|
|
+ else if (bitIndex == 1)
|
|
|
+ {
|
|
|
+ // 012316
|
|
|
+ // AC power limiting
|
|
|
+ ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuAcPowerLimit = YES;
|
|
|
+ }
|
|
|
+ else if (bitIndex == 2)
|
|
|
+ {
|
|
|
+ // 012317
|
|
|
+ // DCDC eeprom faults
|
|
|
+ ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuDcdcEepromFault = YES;
|
|
|
+ }
|
|
|
+ else if (bitIndex == 3)
|
|
|
+ {
|
|
|
+ // 012269
|
|
|
+ // Fan faults
|
|
|
+ ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuFanFailureAlarm = YES;
|
|
|
+ }
|
|
|
+ else if (bitIndex == 4)
|
|
|
+ {
|
|
|
+ // 012264
|
|
|
+ // DCDC short circuit
|
|
|
+ ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuOutputShortCircuit = YES;
|
|
|
+ }
|
|
|
+ else if (bitIndex == 5)
|
|
|
+ {
|
|
|
+ // 012318
|
|
|
+ // PFC eeprom faults
|
|
|
+ ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuPfcEepromFault = YES;
|
|
|
+ }
|
|
|
+ else if (bitIndex == 6)
|
|
|
+ {
|
|
|
+ // 012226
|
|
|
+ // DCDC over temperature
|
|
|
+ ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuCriticalPointOTP = YES;
|
|
|
+ }
|
|
|
+ else if (bitIndex == 7)
|
|
|
+ {
|
|
|
+ // 012319
|
|
|
+ // DCDC output over voltage
|
|
|
+ ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuDcdcOverVoltage = YES;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ break;
|
|
|
}
|
|
|
}
|
|
|
// else
|
|
@@ -344,10 +473,10 @@ void GetStatusCallback(byte group, byte SN, byte temp, int alarm)
|
|
|
}
|
|
|
|
|
|
for(byte psuIndex = 0; psuIndex < conn_1_count; psuIndex++)
|
|
|
- PRINTF_FUNC("Connector 1 - Number = %d \n", connector_1[psuIndex]);
|
|
|
+ PRINTF_FUNC("Connector 1 - Number = %d", connector_1[psuIndex]);
|
|
|
|
|
|
for(byte psuIndex = 0; psuIndex < conn_2_count; psuIndex++)
|
|
|
- PRINTF_FUNC("Connector 2 - Number = %d \n", connector_2[psuIndex]);
|
|
|
+ PRINTF_FUNC("Connector 2 - Number = %d", connector_2[psuIndex]);
|
|
|
}
|
|
|
}
|
|
|
// no using -- GetOutputAndTempCallback End
|
|
@@ -499,7 +628,9 @@ void GetAvailableCapCallback(byte address, short maxVol, short minVol, short max
|
|
|
ShmSysConfigAndInfo->SysInfo.ReAssignedFlag <= _REASSIGNED_RELAY_M_TO_A))
|
|
|
{
|
|
|
if (chargingInfo[group]->DividChargingCurrent == 0)
|
|
|
+ {
|
|
|
return;
|
|
|
+ }
|
|
|
else
|
|
|
{
|
|
|
halfCur = chargingInfo[group]->DividChargingCurrent;
|
|
@@ -888,7 +1019,8 @@ void GetPresentOutputFCallback(byte group, float outVol, float outCur)
|
|
|
}
|
|
|
|
|
|
if ((chargingInfo[group]->SystemStatus >= S_PREPARING_FOR_EVSE && chargingInfo[group]->SystemStatus <= S_COMPLETE) ||
|
|
|
- (chargingInfo[group]->SystemStatus >= S_CCS_PRECHARGE_ST0 && chargingInfo[group]->SystemStatus <= S_CCS_PRECHARGE_ST1))
|
|
|
+ (chargingInfo[group]->SystemStatus >= S_CCS_PRECHARGE_ST0 && chargingInfo[group]->SystemStatus <= S_CCS_PRECHARGE_ST1) ||
|
|
|
+ chargingInfo[group]->SystemStatus == S_ALARM)
|
|
|
{
|
|
|
float _vol_buf = outputVol;
|
|
|
float _cur_buf = outputCur;
|
|
@@ -1050,7 +1182,7 @@ void GetModuleStatusCallback(byte address, unsigned char isErr, unsigned char st
|
|
|
if (group1 == 1)
|
|
|
address -= ShmPsuData->PsuGroup[group1 - 1].GroupPresentPsuQuantity;
|
|
|
|
|
|
- int alarm = (err2 << 24) | (err3 << 16) | (err4 << 8);
|
|
|
+ int alarm = (err4 << 24) | (err3 << 16) | (err2 << 8) | err1;
|
|
|
|
|
|
// ShmPsuData->PsuGroup[group1].PsuModule[address].CriticalTemp1 = temp;
|
|
|
// ShmPsuData->PsuGroup[group1].PsuModule[address].CriticalTemp2 = temp;
|
|
@@ -1059,6 +1191,13 @@ void GetModuleStatusCallback(byte address, unsigned char isErr, unsigned char st
|
|
|
ShmPsuData->PsuGroup[group1].PsuModule[address].AlarmCode = alarm;
|
|
|
AbnormalStopAnalysis(group1, alarm);
|
|
|
|
|
|
+ if(isErr)
|
|
|
+ {
|
|
|
+ // 012267
|
|
|
+ //ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuFailureAlarm = YES;
|
|
|
+ ShmPsuData->PsuGroup[group1].GroupErrorFlag.bits.PsuFailure = true;
|
|
|
+ }
|
|
|
+
|
|
|
// err2 == state 2
|
|
|
// err3 == state 1
|
|
|
// err4 == state 0
|
|
@@ -1098,14 +1237,14 @@ int InitShareMemory()
|
|
|
if ((MeterSMId = shmget(ShmSysConfigAndInfoKey, sizeof(struct SysConfigAndInfo), 0777)) < 0)
|
|
|
{
|
|
|
#ifdef SystemLogMessage
|
|
|
- DEBUG_ERROR("shmget ShmSysConfigAndInfo NG %d \n");
|
|
|
+ DEBUG_ERROR("shmget ShmSysConfigAndInfo NG %d");
|
|
|
#endif
|
|
|
result = FAIL;
|
|
|
}
|
|
|
else if ((ShmSysConfigAndInfo = shmat(MeterSMId, NULL, 0)) == (void *) -1)
|
|
|
{
|
|
|
#ifdef SystemLogMessage
|
|
|
- DEBUG_ERROR("shmat ShmSysConfigAndInfo NG \n");
|
|
|
+ DEBUG_ERROR("shmat ShmSysConfigAndInfo NG");
|
|
|
#endif
|
|
|
result = FAIL;
|
|
|
}
|
|
@@ -1116,14 +1255,14 @@ int InitShareMemory()
|
|
|
if ((MeterSMId = shmget(ShmStatusCodeKey, sizeof(struct StatusCodeData), 0777)) < 0)
|
|
|
{
|
|
|
#ifdef SystemLogMessage
|
|
|
- DEBUG_ERROR("shmget ShmStatusCodeData NG \n");
|
|
|
+ DEBUG_ERROR("shmget ShmStatusCodeData NG");
|
|
|
#endif
|
|
|
result = FAIL;
|
|
|
}
|
|
|
else if ((ShmStatusCodeData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
|
|
|
{
|
|
|
#ifdef SystemLogMessage
|
|
|
- DEBUG_ERROR("shmat ShmStatusCodeData NG \n");
|
|
|
+ DEBUG_ERROR("shmat ShmStatusCodeData NG");
|
|
|
#endif
|
|
|
result = FAIL;
|
|
|
}
|
|
@@ -1134,14 +1273,14 @@ int InitShareMemory()
|
|
|
if ((MeterSMId = shmget(ShmPsuKey, sizeof(struct PsuData), 0777)) < 0)
|
|
|
{
|
|
|
#ifdef SystemLogMessage
|
|
|
- DEBUG_ERROR("shmget ShmPsuData NG \n");
|
|
|
+ DEBUG_ERROR("shmget ShmPsuData NG");
|
|
|
#endif
|
|
|
result = FAIL;
|
|
|
}
|
|
|
else if ((ShmPsuData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
|
|
|
{
|
|
|
#ifdef SystemLogMessage
|
|
|
- DEBUG_ERROR("shmat ShmPsuData NG \n");
|
|
|
+ DEBUG_ERROR("shmat ShmPsuData NG");
|
|
|
#endif
|
|
|
result = FAIL;
|
|
|
}
|
|
@@ -1157,13 +1296,39 @@ void InitialPsuData()
|
|
|
ShmPsuData->SystemPresentPsuQuantity = 0;
|
|
|
ShmPsuData->SystemAvailablePower = 0;
|
|
|
|
|
|
- PRINTF_FUNC("************ psu Group = %d \n", ShmPsuData->GroupCount);
|
|
|
+ PRINTF_FUNC("************ psu Group = %d", ShmPsuData->GroupCount);
|
|
|
for (byte _groupCount = 0; _groupCount < ShmPsuData->GroupCount; _groupCount++)
|
|
|
{
|
|
|
ShmPsuData->PsuGroup[_groupCount].GroupPresentPsuQuantity = 0;
|
|
|
ShmPsuData->PsuGroup[_groupCount].GroupAvailablePower = 0;
|
|
|
ShmPsuData->PsuGroup[_groupCount].GroupAvailableCurrent = 0;
|
|
|
+ ShmPsuData->PsuGroup[_groupCount].GroupErrorFlag.PsuGroupErrorValue = 0;
|
|
|
}
|
|
|
+
|
|
|
+ ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuFuseBurnOut = YES;
|
|
|
+ ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuPfcAndDcdcCommFault = YES;
|
|
|
+ ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuBusVoltageUnbalance = YES;
|
|
|
+ ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuBusOverVoltage = YES;
|
|
|
+ ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuBusVoltageAbnormal = YES;
|
|
|
+ ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuInputOVP = YES;
|
|
|
+ ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuDuplicateID = YES;
|
|
|
+ ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuBusUnderVoltage = YES;
|
|
|
+ ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuInputPhaseLoss = YES;
|
|
|
+ ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuInputUVP = NO;
|
|
|
+ ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuCommunicationFail = YES;
|
|
|
+ ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuSevereUnevenCurrent = YES;
|
|
|
+ ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuFfcSideShutDown = YES;
|
|
|
+ ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuFanFullSpeed = YES;
|
|
|
+ ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuDcSideShutDown = YES;
|
|
|
+ ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuPowerLimitedState = YES;
|
|
|
+ ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuTemperaturePowerLimit = YES;
|
|
|
+ ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuAcPowerLimit = YES;
|
|
|
+ ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuDcdcEepromFault = YES;
|
|
|
+ ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuFanFailureAlarm = YES;
|
|
|
+ ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuOutputShortCircuit = YES;
|
|
|
+ ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuPfcEepromFault = YES;
|
|
|
+ ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuCriticalPointOTP = YES;
|
|
|
+ ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuDcdcOverVoltage = YES;
|
|
|
}
|
|
|
|
|
|
void Initialization()
|
|
@@ -1176,7 +1341,7 @@ void Initialization()
|
|
|
{
|
|
|
if (!FindChargingInfoData(_index, &chargingInfo[0]))
|
|
|
{
|
|
|
- DEBUG_ERROR("Module_PsuComm : FindChargingInfoData false \n");
|
|
|
+ DEBUG_ERROR("Module_PsuComm : FindChargingInfoData false");
|
|
|
isPass = false;
|
|
|
break;
|
|
|
}
|
|
@@ -1287,6 +1452,14 @@ void PreCheckSmartChargingStep()
|
|
|
toAverVolCount = 3;
|
|
|
}
|
|
|
}
|
|
|
+ else if (chargingInfo[index]->SystemStatus == S_COMPLETE ||
|
|
|
+ chargingInfo[index]->SystemStatus == S_ALARM)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.ReAssignedFlag == _REASSIGNED_PREPARE_M_TO_A)
|
|
|
+ {
|
|
|
+ ShmSysConfigAndInfo->SysInfo.ReAssignedFlag = _REASSIGNED_RELAY_M_TO_A;
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
if ((chargingInfo[index]->SystemStatus >= S_PREPARING_FOR_EVSE && chargingInfo[index]->SystemStatus <= S_CHARGING) ||
|
|
|
(chargingInfo[index]->SystemStatus >= S_CCS_PRECHARGE_ST0 && chargingInfo[index]->SystemStatus <= S_CCS_PRECHARGE_ST1))
|
|
@@ -1308,12 +1481,55 @@ void Await()
|
|
|
usleep(CMD_DELAY_TIME);
|
|
|
}
|
|
|
|
|
|
+void PsuReceiveRecoveryCheck(void)
|
|
|
+{
|
|
|
+ char *ptrSave, *ptrToken;
|
|
|
+ int fd, psuTaskCount = 0;
|
|
|
+ char pathBuffer[64], psuTaskPidString[64];
|
|
|
+
|
|
|
+ system("pidof Module_PsuComm > /tmp/Module_PsuTask");
|
|
|
+
|
|
|
+ snprintf(pathBuffer, sizeof(pathBuffer), "/tmp/Module_PsuTask");
|
|
|
+ fd = open(pathBuffer, O_RDWR);
|
|
|
+
|
|
|
+ if(fd < 0)
|
|
|
+ {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if(read(fd, psuTaskPidString, 64) < 0)
|
|
|
+ {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ ptrToken = strtok_r(psuTaskPidString, " ", &ptrSave);
|
|
|
+ while(ptrToken != NULL)
|
|
|
+ {
|
|
|
+ int psuPid = atoi(ptrToken);
|
|
|
+
|
|
|
+ if(psuPid > 0)
|
|
|
+ {
|
|
|
+ psuTaskCount++;
|
|
|
+ }
|
|
|
+
|
|
|
+ ptrToken = strtok_r(NULL, ";", &ptrSave);
|
|
|
+ }
|
|
|
+ close(fd);
|
|
|
+
|
|
|
+ if(psuTaskCount == 1)
|
|
|
+ {
|
|
|
+ PRINTF_FUNC("************ PSU Receive Task Need Recovery ************\n");
|
|
|
+ InitialCommunication();
|
|
|
+
|
|
|
+ psuReceiveRecovery = true;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
int main(void)
|
|
|
{
|
|
|
if(InitShareMemory() == FAIL)
|
|
|
{
|
|
|
#ifdef SystemLogMessage
|
|
|
- DEBUG_ERROR("InitShareMemory NG\n");
|
|
|
+ DEBUG_ERROR("InitShareMemory NG");
|
|
|
#endif
|
|
|
if(ShmStatusCodeData != NULL)
|
|
|
{
|
|
@@ -1323,7 +1539,9 @@ int main(void)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
- PRINTF_FUNC("InitShareMemory OK\n");
|
|
|
+ PRINTF_FUNC("InitShareMemory OK");
|
|
|
+
|
|
|
+ signal(SIGCHLD,SIG_IGN);
|
|
|
|
|
|
// register callback function
|
|
|
RefreshStatus(&GetStatusCallback);
|
|
@@ -1376,15 +1594,21 @@ int main(void)
|
|
|
// 自檢失敗
|
|
|
if (ShmPsuData->Work_Step == _NO_WORKING)
|
|
|
{
|
|
|
- PRINTF_FUNC("== PSU == self test fail. \n");
|
|
|
+ PRINTF_FUNC("== PSU == self test fail.");
|
|
|
sleep(5);
|
|
|
}
|
|
|
|
|
|
+ if((GetTimeoutValue(_PsuReceiveRecoveryCheck_time) / 1000000) >= PSU_TASK_CHECK_TIME)
|
|
|
+ {
|
|
|
+ PsuReceiveRecoveryCheck();
|
|
|
+ gettimeofday(&_PsuReceiveRecoveryCheck_time, NULL);
|
|
|
+ }
|
|
|
+
|
|
|
switch(ShmPsuData->Work_Step)
|
|
|
{
|
|
|
case INITIAL_START:
|
|
|
{
|
|
|
- PRINTF_FUNC("== PSU == INITIAL_START \n");
|
|
|
+ PRINTF_FUNC("== PSU == INITIAL_START");
|
|
|
gettimeofday(&_cmdSubPriority_time, NULL);
|
|
|
sleep(5);
|
|
|
SwitchPower(SYSTEM_CMD, PSU_POWER_OFF);
|
|
@@ -1415,22 +1639,22 @@ int main(void)
|
|
|
// 取各群模組數量
|
|
|
GetModuleCount(index);
|
|
|
}
|
|
|
- PRINTF_FUNC("== PSU == indexCount = %d, moduleCount = %d, sysCount = %d\n",
|
|
|
+ PRINTF_FUNC("== PSU == indexCount = %d, moduleCount = %d, sysCount = %d",
|
|
|
ShmPsuData->GroupCount, moduleCount, ShmPsuData->SystemPresentPsuQuantity);
|
|
|
|
|
|
// 判斷系統數量與各群數量一致
|
|
|
if(moduleCount == ShmPsuData->SystemPresentPsuQuantity && moduleCount > 0)
|
|
|
{
|
|
|
- PRINTF_FUNC("Psu Count = %d \n", moduleCount);
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.BootingStatus == BOOTTING)
|
|
|
+ PRINTF_FUNC("Psu Count = %d", moduleCount);
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.BootingStatus == BOOTTING || psuReceiveRecovery)
|
|
|
{
|
|
|
// 電樁在 Booting 的狀態 - 自檢
|
|
|
- PRINTF_FUNC("== PSU == GET_SYS_CAP \n");
|
|
|
+ PRINTF_FUNC("== PSU == GET_SYS_CAP");
|
|
|
ShmPsuData->Work_Step = GET_SYS_CAP;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- PRINTF_FUNC("== PSU == _WORK_CHARGING \n");
|
|
|
+ PRINTF_FUNC("== PSU == _WORK_CHARGING");
|
|
|
ShmPsuData->Work_Step = _WORK_CHARGING;
|
|
|
|
|
|
gettimeofday(&_test_time, NULL);
|
|
@@ -1489,10 +1713,10 @@ int main(void)
|
|
|
else
|
|
|
{
|
|
|
// 判斷系統輸出額定功率與電流
|
|
|
- PRINTF_FUNC("SystemAvailableCurrent = %d, SystemAvailablePower = %d \n",
|
|
|
+ PRINTF_FUNC("SystemAvailableCurrent = %d, SystemAvailablePower = %d",
|
|
|
ShmPsuData->SystemAvailableCurrent, ShmPsuData->SystemAvailablePower);
|
|
|
|
|
|
- PRINTF_FUNC("== PSU == BOOTING_COMPLETE \n");
|
|
|
+ PRINTF_FUNC("== PSU == BOOTING_COMPLETE");
|
|
|
ShmPsuData->Work_Step = BOOTING_COMPLETE;
|
|
|
}
|
|
|
|
|
@@ -1526,6 +1750,7 @@ int main(void)
|
|
|
if (time > 1500)
|
|
|
{
|
|
|
PreCheckSmartChargingStep();
|
|
|
+ startModuleFlag = true;
|
|
|
gettimeofday(&_cmdSubPriority_time, NULL);
|
|
|
}
|
|
|
|
|
@@ -1576,7 +1801,7 @@ int main(void)
|
|
|
{
|
|
|
if((int)evseOutVol[groupIndex] != (int)chargingInfo[groupIndex]->PresentChargingVoltage)
|
|
|
{
|
|
|
- PRINTF_FUNC("groupIndex = %d, ev need vol = %.1fV, evse output vol = %.1fV, fire voltage vol = %.1fV \n",
|
|
|
+ PRINTF_FUNC("groupIndex = %d, ev need vol = %.1fV, evse output vol = %.1fV, fire voltage vol = %.1fV",
|
|
|
groupIndex, chargingInfo[groupIndex]->EvBatterytargetVoltage,
|
|
|
chargingInfo[groupIndex]->PresentChargingVoltage, chargingInfo[groupIndex]->FireChargingVoltage);
|
|
|
}
|
|
@@ -1588,7 +1813,7 @@ int main(void)
|
|
|
{
|
|
|
if((int)evseOutCur[groupIndex] != (int)chargingInfo[groupIndex]->PresentChargingCurrent)
|
|
|
{
|
|
|
- PRINTF_FUNC("groupIndex = %d, ev need cur = %.1fA, evse output cur = %.1fA \n", groupIndex,
|
|
|
+ PRINTF_FUNC("groupIndex = %d, ev need cur = %.1fA, evse output cur = %.1fA", groupIndex,
|
|
|
chargingInfo[groupIndex]->EvBatterytargetCurrent, chargingInfo[groupIndex]->PresentChargingCurrent);
|
|
|
}
|
|
|
evseOutCur[groupIndex] = chargingInfo[groupIndex]->PresentChargingCurrent;
|
|
@@ -1608,10 +1833,14 @@ int main(void)
|
|
|
if (chargingInfo[groupIndex]->DividChargingCurrent == 0)
|
|
|
{
|
|
|
chargingInfo[groupIndex]->DividChargingCurrent = ShmPsuData->PsuGroup[groupIndex].GroupPresentOutputCurrent;
|
|
|
+ if(chargingInfo[groupIndex]->DividChargingCurrent == 0)
|
|
|
+ {
|
|
|
+ chargingInfo[groupIndex]->DividChargingCurrent = (chargingInfo[groupIndex]->EvBatterytargetCurrent * 10) / 2;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- PRINTF_FUNC("Index = %d, DividChargingCurrent = %.1f \n", groupIndex, chargingInfo[groupIndex]->DividChargingCurrent);
|
|
|
+ PRINTF_FUNC("Index = %d, DividChargingCurrent = %.1f", groupIndex, chargingInfo[groupIndex]->DividChargingCurrent);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
@@ -1628,7 +1857,7 @@ int main(void)
|
|
|
deratingKeepCount >= DERATING_COUNT)
|
|
|
{
|
|
|
// 車端降載完成
|
|
|
- PRINTF_FUNC("Index = %d, newEvCurrent = %f \n", groupIndex, (chargingInfo[groupIndex]->EvBatterytargetCurrent * 10));
|
|
|
+ PRINTF_FUNC("Index = %d, newEvCurrent = %f", groupIndex, (chargingInfo[groupIndex]->EvBatterytargetCurrent * 10));
|
|
|
PRINTF_FUNC("=============Smart Charging : _REASSIGNED_ADJUST_M_TO_A============= Step 3 \n");
|
|
|
ShmSysConfigAndInfo->SysInfo.ReAssignedFlag = _REASSIGNED_ADJUST_M_TO_A;
|
|
|
gettimeofday(&_derating_time, NULL);
|
|
@@ -1817,7 +2046,7 @@ int main(void)
|
|
|
isStartOutputSwitch[index] = true;
|
|
|
}
|
|
|
|
|
|
- if (isNeedToOpenPower)
|
|
|
+ if (isNeedToOpenPower || startModuleFlag)
|
|
|
{
|
|
|
SwitchPower(SYSTEM_CMD, PSU_POWER_ON);
|
|
|
FlashLed(SYSTEM_CMD, PSU_FLASH_ON);
|
|
@@ -1835,6 +2064,7 @@ int main(void)
|
|
|
for (byte subIndex = 0; subIndex < ShmPsuData->GroupCount; subIndex++)
|
|
|
{
|
|
|
if (chargingInfo[subIndex]->SystemStatus == S_IDLE ||
|
|
|
+ chargingInfo[subIndex]->SystemStatus == S_FAULT ||
|
|
|
chargingInfo[subIndex]->SystemStatus == S_RESERVATION)
|
|
|
{
|
|
|
// 各群電壓接近平衡
|
|
@@ -1874,6 +2104,7 @@ int main(void)
|
|
|
{
|
|
|
if (chargingInfo[subIndex]->SystemStatus == S_IDLE ||
|
|
|
chargingInfo[subIndex]->SystemStatus == S_RESERVATION ||
|
|
|
+ chargingInfo[subIndex]->SystemStatus == S_FAULT ||
|
|
|
chargingInfo[subIndex]->SystemStatus == S_REASSIGN_CHECK)
|
|
|
idleCurrent = ShmPsuData->PsuGroup[subIndex].GroupPresentOutputCurrent;
|
|
|
else
|
|
@@ -1904,6 +2135,7 @@ int main(void)
|
|
|
{
|
|
|
if (chargingInfo[subIndex]->SystemStatus == S_IDLE ||
|
|
|
chargingInfo[subIndex]->SystemStatus == S_RESERVATION ||
|
|
|
+ chargingInfo[subIndex]->SystemStatus == S_FAULT ||
|
|
|
chargingInfo[subIndex]->SystemStatus == S_REASSIGN_CHECK)
|
|
|
{
|
|
|
reassignIndex = subIndex;
|
|
@@ -2002,7 +2234,7 @@ int main(void)
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- if (!isStartOutputSwitch[groupIndex])
|
|
|
+ if (!isStartOutputSwitch[groupIndex] || startModuleFlag)
|
|
|
{
|
|
|
isStartOutputSwitch[groupIndex] = true;
|
|
|
SwitchPower(groupIndex, PSU_POWER_ON); Await();
|
|
@@ -2013,8 +2245,9 @@ int main(void)
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- else if (chargingInfo[groupIndex]->SystemStatus >= S_TERMINATING &&
|
|
|
- chargingInfo[groupIndex]->SystemStatus <= S_COMPLETE)
|
|
|
+ else if ((chargingInfo[groupIndex]->SystemStatus >= S_TERMINATING &&
|
|
|
+ chargingInfo[groupIndex]->SystemStatus <= S_COMPLETE) ||
|
|
|
+ chargingInfo[groupIndex]->SystemStatus == S_ALARM)
|
|
|
{
|
|
|
if (ShmSysConfigAndInfo->SysInfo.MainChargingMode == _MAIN_CHARGING_MODE_MAX)
|
|
|
{
|
|
@@ -2106,6 +2339,7 @@ int main(void)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ startModuleFlag = false;
|
|
|
break;
|
|
|
}
|
|
|
case _TEST_MODE:
|