|
@@ -50,6 +50,8 @@ struct CHAdeMOData *ShmCHAdeMOData;
|
|
|
struct GBTData *ShmGBTData;
|
|
|
struct CcsData *ShmCcsData;
|
|
|
struct PsuData *ShmPsuData;
|
|
|
+struct MeterInformation *ShmCsuMeterData;
|
|
|
+struct DcCommonInformation *ShmDcCommonData;
|
|
|
|
|
|
byte gun_count;
|
|
|
int chargingTime[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY];
|
|
@@ -143,10 +145,11 @@ int StoreLogMsg(const char *fmt, ...)
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- sprintf(Buf,"echo \"%04d-%02d-%02d %02d:%02d:%02d:%03d - %s\" >> /Storage/SystemLog/[%04d.%02d]SystemLog",
|
|
|
+ sprintf(Buf,"echo \"%04d-%02d-%02d %02d:%02d:%02d:%03d - %s\" >> /Storage/SystemLog/[%04d.%02d]SystemLog_%s",
|
|
|
tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,SeqEndTime.millitm,
|
|
|
buffer,
|
|
|
- tm->tm_year+1900,tm->tm_mon+1);
|
|
|
+ tm->tm_year+1900,tm->tm_mon+1,
|
|
|
+ ShmSysConfigAndInfo->SysConfig.SerialNumber);
|
|
|
system(Buf);
|
|
|
}
|
|
|
|
|
@@ -187,30 +190,30 @@ void getTimeString(char *buff)
|
|
|
sprintf(buff, "[%04d-%02d-%02d %02d:%02d:%02d]", (1900+p->tm_year), (1+p->tm_mon), p->tm_mday, p->tm_hour, p->tm_hour, p->tm_sec);
|
|
|
}
|
|
|
|
|
|
-bool CheckUniqNumber(byte value)
|
|
|
-{
|
|
|
- for (byte index = 0; index < gun_count; index++)
|
|
|
- {
|
|
|
- if (_chargingData[index]->Evboard_id == value)
|
|
|
- {
|
|
|
- struct timeval _end_time;
|
|
|
- gettimeofday(&_end_time, NULL);
|
|
|
- unsigned long diff = 1000000 * (_end_time.tv_sec - _id_assign_time.tv_sec) + _end_time.tv_usec - _id_assign_time.tv_usec;
|
|
|
- if (diff >= 3000000)
|
|
|
- {
|
|
|
- gettimeofday(&_id_assign_time, NULL);
|
|
|
- return true;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- return false;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- gettimeofday(&_id_assign_time, NULL);
|
|
|
- return true;
|
|
|
-}
|
|
|
+//bool CheckUniqNumber(byte value)
|
|
|
+//{
|
|
|
+// for (byte index = 0; index < gun_count; index++)
|
|
|
+// {
|
|
|
+// if (_chargingData[index]->Evboard_id == value)
|
|
|
+// {
|
|
|
+// struct timeval _end_time;
|
|
|
+// gettimeofday(&_end_time, NULL);
|
|
|
+// unsigned long diff = 1000000 * (_end_time.tv_sec - _id_assign_time.tv_sec) + _end_time.tv_usec - _id_assign_time.tv_usec;
|
|
|
+// if (diff >= 3000000)
|
|
|
+// {
|
|
|
+// gettimeofday(&_id_assign_time, NULL);
|
|
|
+// return true;
|
|
|
+// }
|
|
|
+// else
|
|
|
+// {
|
|
|
+// return false;
|
|
|
+// }
|
|
|
+// }
|
|
|
+// }
|
|
|
+//
|
|
|
+// gettimeofday(&_id_assign_time, NULL);
|
|
|
+// return true;
|
|
|
+//}
|
|
|
|
|
|
//==========================================
|
|
|
// Init all share memory
|
|
@@ -234,12 +237,10 @@ int InitShareMemory()
|
|
|
DEBUG_ERROR("shmat ShmSysConfigAndInfo NG\n");
|
|
|
#endif
|
|
|
result = FAIL;
|
|
|
- }
|
|
|
- else
|
|
|
- {}
|
|
|
+ }
|
|
|
|
|
|
- //initial ShmStatusCodeData
|
|
|
- if ((MeterSMId = shmget(ShmStatusCodeKey, sizeof(struct StatusCodeData), 0777)) < 0)
|
|
|
+ //initial ShmStatusCodeData
|
|
|
+ if ((MeterSMId = shmget(ShmStatusCodeKey, sizeof(struct StatusCodeData), 0777)) < 0)
|
|
|
{
|
|
|
#ifdef SystemLogMessage
|
|
|
DEBUG_ERROR("shmget ShmStatusCodeData NG\n");
|
|
@@ -253,8 +254,6 @@ int InitShareMemory()
|
|
|
#endif
|
|
|
result = FAIL;
|
|
|
}
|
|
|
- else
|
|
|
- {}
|
|
|
|
|
|
//creat ShmPsuData
|
|
|
if ((MeterSMId = shmget(ShmPsuKey, sizeof(struct PsuData), 0777)) < 0)
|
|
@@ -288,8 +287,6 @@ int InitShareMemory()
|
|
|
#endif
|
|
|
return FAIL;
|
|
|
}
|
|
|
- else
|
|
|
- {}
|
|
|
}
|
|
|
if(GB_QUANTITY > 0)
|
|
|
{
|
|
@@ -307,8 +304,6 @@ int InitShareMemory()
|
|
|
#endif
|
|
|
return FAIL;
|
|
|
}
|
|
|
- else
|
|
|
- {}
|
|
|
}
|
|
|
|
|
|
if(CCS_QUANTITY > 0)
|
|
@@ -326,8 +321,36 @@ int InitShareMemory()
|
|
|
#endif
|
|
|
return FAIL;
|
|
|
}
|
|
|
- else
|
|
|
- {}
|
|
|
+ }
|
|
|
+
|
|
|
+ if ((MeterSMId = shmget(ShmCsuMeterKey, sizeof(struct MeterInformation), IPC_CREAT | 0777)) < 0)
|
|
|
+ {
|
|
|
+ #ifdef SystemLogMessage
|
|
|
+ DEBUG_ERROR("shmget ShmCsuMeterKey NG \n");
|
|
|
+ #endif
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ else if ((ShmCsuMeterData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
|
|
|
+ {
|
|
|
+ #ifdef SystemLogMessage
|
|
|
+ DEBUG_ERROR("shmat ShmCsuMeterData NG \n");
|
|
|
+ #endif
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ if ((MeterSMId = shmget(ShmCommonKey, sizeof(struct DcCommonInformation), IPC_CREAT | 0777)) < 0)
|
|
|
+ {
|
|
|
+ #ifdef SystemLogMessage
|
|
|
+ DEBUG_ERROR("shmget ShmCommonKey NG \n");
|
|
|
+ #endif
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ else if ((ShmDcCommonData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
|
|
|
+ {
|
|
|
+ #ifdef SystemLogMessage
|
|
|
+ DEBUG_ERROR("shmat ShmCommonKey NG \n");
|
|
|
+ #endif
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
return result;
|
|
@@ -2686,6 +2709,7 @@ void CANReceiver()
|
|
|
int nbytes;
|
|
|
struct can_frame frame;
|
|
|
int intCmd;
|
|
|
+ bool isClearBuf = false;
|
|
|
|
|
|
// 槍資訊
|
|
|
struct ChargingInfoData *_chargingData[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY];
|
|
@@ -2731,10 +2755,18 @@ void CANReceiver()
|
|
|
{
|
|
|
byte target;
|
|
|
byte targetGun = 0x00;
|
|
|
+ byte findIndex = 0x00;
|
|
|
+
|
|
|
intCmd = (int) (frame.can_id & CAN_EFF_MASK);
|
|
|
|
|
|
+ if (!isClearBuf)
|
|
|
+ {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
if (intCmd == ADDRESS_REQ)
|
|
|
{
|
|
|
+ ShmDcCommonData->CcsVersion = _CCS_VERSION_CHECK_TAG_V013S0;
|
|
|
AddrAssignment(frame.data);
|
|
|
continue;
|
|
|
}
|
|
@@ -2743,6 +2775,15 @@ void CANReceiver()
|
|
|
|
|
|
for (byte _index = 0; _index < gun_count; _index++)
|
|
|
{
|
|
|
+ // 假設有找到回應的 Index
|
|
|
+ findIndex = target;
|
|
|
+ if (gun_count == 1 &&
|
|
|
+ _chargingData[_index]->Type == _Type_CCS_2 &&
|
|
|
+ ShmDcCommonData->CcsVersion == _CCS_VERSION_CHECK_TAG_V015S0)
|
|
|
+ {
|
|
|
+ target -= 1;
|
|
|
+ }
|
|
|
+
|
|
|
if (_chargingData[_index]->Evboard_id == target)
|
|
|
{
|
|
|
targetGun = _index;
|
|
@@ -2755,6 +2796,13 @@ void CANReceiver()
|
|
|
PRINTF_FUNC("EvComm (CANReceiver) : Target index = %x is < 0 or > QUANTITY \n", targetGun);
|
|
|
continue;
|
|
|
}
|
|
|
+ else if (gun_count == 1 && targetGun == 0 && findIndex == 1 &&
|
|
|
+ ShmDcCommonData->CcsVersion == _CCS_VERSION_CHECK_TAG_V015S0)
|
|
|
+ {
|
|
|
+ // 這樣的條件下~ 也是單槍 CCS 舊版本的狀況 : 因為舊版 CCS 不會 timeout, then send request id
|
|
|
+ ShmDcCommonData->CcsVersion = _CCS_VERSION_CHECK_TAG_V013S0;
|
|
|
+ }
|
|
|
+
|
|
|
if(intCmd == 256)
|
|
|
{
|
|
|
continue;
|
|
@@ -2980,7 +3028,10 @@ void CANReceiver()
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
+ {
|
|
|
+ isClearBuf = true;
|
|
|
usleep(10000);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -3020,7 +3071,6 @@ void SetPresentChargingOutputPower(struct ChargingInfoData *chargingData_1, stru
|
|
|
|
|
|
cur2 = (chargingData_2->PresentChargingCurrent * 10);
|
|
|
|
|
|
-
|
|
|
if (
|
|
|
(LogInfo[0][EV_LOG_NOW_OUTPUT_VOL] >= vol1 + CHK_VOL_RANGE) || (LogInfo[0][EV_LOG_NOW_OUTPUT_VOL] <= vol1 - CHK_VOL_RANGE) ||
|
|
|
(LogInfo[0][EV_LOG_NOW_OUTPUT_CUR] >= cur1 + CHK_CUR_RANGE) || (LogInfo[0][EV_LOG_NOW_OUTPUT_CUR] <= cur1 - CHK_CUR_RANGE) ||
|
|
@@ -3094,10 +3144,10 @@ void SetPresentChargingOutputCap(struct ChargingInfoData *chargingData_1, struct
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- if ((LogInfo[0][EV_LOG_OUTPUT_CAP_POW] <= pow1 - 0.5 || LogInfo[0][EV_LOG_OUTPUT_CAP_POW] >= pow1 + 0.5) ||
|
|
|
- (LogInfo[0][EV_LOG_OUTPUT_CAP_CUR] <= cur1 - 0.5 || LogInfo[0][EV_LOG_OUTPUT_CAP_CUR] >= cur1+ 0.5) ||
|
|
|
- (LogInfo[1][EV_LOG_OUTPUT_CAP_POW] <= pow2 - 0.5 || LogInfo[1][EV_LOG_OUTPUT_CAP_POW] >= pow2 + 0.5) ||
|
|
|
- (LogInfo[1][EV_LOG_OUTPUT_CAP_CUR] <= cur2 - 0.5 || LogInfo[1][EV_LOG_OUTPUT_CAP_CUR] >= cur2 + 0.5))
|
|
|
+ if ((LogInfo[0][EV_LOG_OUTPUT_CAP_POW] <= pow1 - 5 || LogInfo[0][EV_LOG_OUTPUT_CAP_POW] >= pow1 + 5) ||
|
|
|
+ (LogInfo[0][EV_LOG_OUTPUT_CAP_CUR] <= cur1 - 5 || LogInfo[0][EV_LOG_OUTPUT_CAP_CUR] >= cur1 + 5) ||
|
|
|
+ (LogInfo[1][EV_LOG_OUTPUT_CAP_POW] <= pow2 - 5 || LogInfo[1][EV_LOG_OUTPUT_CAP_POW] >= pow2 + 5) ||
|
|
|
+ (LogInfo[1][EV_LOG_OUTPUT_CAP_CUR] <= cur2 - 5 || LogInfo[1][EV_LOG_OUTPUT_CAP_CUR] >= cur2 + 5))
|
|
|
{
|
|
|
PRINTF_FUNC("----------------------------------------------------- \n");
|
|
|
PRINTF_FUNC("To EV (Real) Power_1 = %.1f, Cur_1 = %.1f, Power_2 = %.1f, Cur_2 = %.1f \n",
|
|
@@ -3312,20 +3362,38 @@ byte GetStopChargingReasonByEvse(byte gunIndex, byte *reason)
|
|
|
|
|
|
void SendCommunicationOnly(byte index)
|
|
|
{
|
|
|
+ byte targetID = _chargingData[index]->Evboard_id;
|
|
|
+
|
|
|
+ if (gun_count == 1 &&
|
|
|
+ _chargingData[index]->Type == _Type_CCS_2 &&
|
|
|
+ ShmDcCommonData->CcsVersion == _CCS_VERSION_CHECK_TAG_V015S0)
|
|
|
+ {
|
|
|
+ targetID += 1;
|
|
|
+ }
|
|
|
+
|
|
|
SetChargingPermission(index, COMMUNICATION,
|
|
|
_chargingData[index]->AvailableChargingPower,
|
|
|
0,
|
|
|
0,
|
|
|
- _chargingData[index]->Evboard_id);
|
|
|
+ targetID);
|
|
|
}
|
|
|
|
|
|
void SendStopOnly(byte index)
|
|
|
{
|
|
|
+ byte targetID = _chargingData[index]->Evboard_id;
|
|
|
+
|
|
|
+ if (gun_count == 1 &&
|
|
|
+ _chargingData[index]->Type == _Type_CCS_2 &&
|
|
|
+ ShmDcCommonData->CcsVersion == _CCS_VERSION_CHECK_TAG_V015S0)
|
|
|
+ {
|
|
|
+ targetID += 1;
|
|
|
+ }
|
|
|
+
|
|
|
SetChargingPermission(index, STOP,
|
|
|
_chargingData[index]->AvailableChargingPower,
|
|
|
0,
|
|
|
0,
|
|
|
- _chargingData[index]->Evboard_id);
|
|
|
+ targetID);
|
|
|
}
|
|
|
|
|
|
void FormatVoltageAndCurrent()
|
|
@@ -3415,6 +3483,49 @@ void FormatVoltageAndCurrent()
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+// 如果是使用 Meter 計算的話
|
|
|
+void CalOutputPowerAndEnergy(int _index)
|
|
|
+{
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[3] == 'M')
|
|
|
+ {
|
|
|
+ //printf("(%d), totalChargingValue = %f \n", _index, ShmCsuMeterData->_meter[_index]._curTotalCharging / 100);
|
|
|
+ float totalChargingValue = ShmCsuMeterData->_meter[_index]._curTotalCharging / 100;
|
|
|
+
|
|
|
+ _chargingData[_index]->PresentChargedEnergy = totalChargingValue;
|
|
|
+ _chargingData[_index]->PowerConsumption = totalChargingValue;
|
|
|
+
|
|
|
+ if (ShmSysConfigAndInfo->SysConfig.BillingData.isBilling)
|
|
|
+ {
|
|
|
+ _chargingData[_index]->ChargingFee = totalChargingValue * ShmSysConfigAndInfo->SysConfig.BillingData.Cur_fee;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if (chargingTime[_index] == 0 ||
|
|
|
+ chargingTime[_index] > _chargingData[_index]->PresentChargedDuration)
|
|
|
+ {
|
|
|
+ chargingTime[_index] = _chargingData[_index]->PresentChargedDuration;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ int passTime = _chargingData[_index]->PresentChargedDuration - chargingTime[_index];
|
|
|
+
|
|
|
+ if (passTime > 0)
|
|
|
+ {
|
|
|
+ float changingPow = (_chargingData[_index]->PresentChargingPower) * passTime / 3600;
|
|
|
+ if (ShmSysConfigAndInfo->SysConfig.BillingData.isBilling)
|
|
|
+ {
|
|
|
+ _chargingData[_index]->ChargingFee += changingPow * ShmSysConfigAndInfo->SysConfig.BillingData.Cur_fee;
|
|
|
+ }
|
|
|
+
|
|
|
+ _chargingData[_index]->PresentChargedEnergy += changingPow;
|
|
|
+ _chargingData[_index]->PowerConsumption += changingPow;
|
|
|
+ chargingTime[_index] = _chargingData[_index]->PresentChargedDuration;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
int main(int argc, char *argv[])
|
|
|
{
|
|
|
if(InitShareMemory() == FAIL)
|
|
@@ -3463,6 +3574,15 @@ int main(int argc, char *argv[])
|
|
|
{
|
|
|
for(byte _index = 0; _index < gun_count; _index++)
|
|
|
{
|
|
|
+ byte targetID = _chargingData[_index]->Evboard_id;
|
|
|
+
|
|
|
+ if (gun_count == 1 &&
|
|
|
+ _chargingData[_index]->Type == _Type_CCS_2 &&
|
|
|
+ ShmDcCommonData->CcsVersion == _CCS_VERSION_CHECK_TAG_V015S0)
|
|
|
+ {
|
|
|
+ targetID += 1;
|
|
|
+ }
|
|
|
+
|
|
|
if (priorityLow == 1)
|
|
|
{
|
|
|
// 優先權較低 - 只要有回應即不會再詢問
|
|
@@ -3483,18 +3603,19 @@ int main(int argc, char *argv[])
|
|
|
if (ShmCcsData->CommProtocol == _CCS_COMM_V2GMessage_DIN70121 &&
|
|
|
ShmCcsData->V2GMessage_DIN70121[_chargingData[_index]->type_index].SelfTest_Comp != PASS)
|
|
|
{
|
|
|
- SyncRtcInfo(_index, _chargingData[_index]->Evboard_id, (int)rtc);
|
|
|
- GetFirmwareVersion(_index, _chargingData[_index]->Evboard_id);
|
|
|
+ SyncRtcInfo(_index, targetID, (int)rtc);
|
|
|
+ GetFirmwareVersion(_index, targetID);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// 固定要取得的資訊 : 1.槍鎖狀態, 2."Connector 1" 溫度, 3."Connector 2" 溫度, 4.Pilot Voltage
|
|
|
//PRINTF_FUNC("GetMiscellaneousInfo. index = %d, Eid = %d \n", _index, _chargingData[_index]->Evboard_id);
|
|
|
+
|
|
|
GetMiscellaneousInfo(_index,
|
|
|
_chargingData[_index]->RelayK1K2Status,
|
|
|
_chargingData[_index]->PresentChargedEnergy,
|
|
|
(_chargingData[_index]->PresentChargingVoltage * 10),
|
|
|
- _chargingData[_index]->Evboard_id);
|
|
|
+ targetID);
|
|
|
}
|
|
|
|
|
|
switch (_chargingData[_index]->SystemStatus)
|
|
@@ -3560,6 +3681,22 @@ int main(int argc, char *argv[])
|
|
|
chargingTime[_index] = 0;
|
|
|
SendErrorCount[_index] = 0;
|
|
|
|
|
|
+ // 使用 Meter 狀況
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[3] == 'M')
|
|
|
+ {
|
|
|
+ if (ShmCsuMeterData->_meter[_index].isCalculation == NO)
|
|
|
+ {
|
|
|
+ if (ShmCsuMeterData->_meter[_index].curMeterValue != 0 ||
|
|
|
+ ShmCsuMeterData->_meter[_index]._chargingValue != 0 ||
|
|
|
+ ShmCsuMeterData->_meter[_index]._curTotalCharging != 0 )
|
|
|
+ {
|
|
|
+ ShmCsuMeterData->_meter[_index].curMeterValue = 0;
|
|
|
+ ShmCsuMeterData->_meter[_index]._chargingValue = 0;
|
|
|
+ ShmCsuMeterData->_meter[_index]._curTotalCharging = 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
//maxChargingPow = ShmSysConfigAndInfo->SysConfig.MaxChargingPower * 10;
|
|
|
// ShmPsuData->SystemAvailablePower 已是 * 10
|
|
|
maxChargingPow = ShmPsuData->SystemAvailablePower;
|
|
@@ -3572,6 +3709,11 @@ int main(int argc, char *argv[])
|
|
|
LogInfo[_index][EV_LOG_MAX_BATT_VOL] = 0;
|
|
|
LogInfo[_index][EV_LOG_REAL_CAP_POW] = 0;
|
|
|
LogInfo[_index][EV_LOG_SOC] = 0;
|
|
|
+
|
|
|
+ if (gun_count == 1)
|
|
|
+ SetPresentChargingOutputPower(_chargingData[0], _chargingData[0]);
|
|
|
+ else if (gun_count == 2)
|
|
|
+ SetPresentChargingOutputPower(_chargingData[0], _chargingData[1]);
|
|
|
}
|
|
|
break;
|
|
|
case S_PREPARNING:
|
|
@@ -3589,7 +3731,7 @@ int main(int argc, char *argv[])
|
|
|
case S_PREPARING_FOR_EV:
|
|
|
{
|
|
|
// 開始確認車端是否同意開始充電 : 1.SOC, 2.Target Vol, 3.Target Cur, 4.Charging remaining time
|
|
|
- GetOutputReq(_index, _chargingData[_index]->Evboard_id);
|
|
|
+ GetOutputReq(_index, targetID);
|
|
|
|
|
|
// 設定當前輸出
|
|
|
if (gun_count == 1)
|
|
@@ -3622,10 +3764,10 @@ int main(int argc, char *argv[])
|
|
|
_chargingData[_index]->AvailableChargingPower,
|
|
|
maxCur,
|
|
|
maxVol,
|
|
|
- _chargingData[_index]->Evboard_id);
|
|
|
+ targetID);
|
|
|
|
|
|
// 取得車端電池資訊 : 1.AC or DC ? 2.Total battery cap, 3.Max battery vol, 4.Max battery cur
|
|
|
- GetEvBatteryInfo(_index, _chargingData[_index]->Evboard_id);
|
|
|
+ GetEvBatteryInfo(_index, targetID);
|
|
|
}
|
|
|
gettimeofday(&_chk_ratingPower_timeout[_index], NULL);
|
|
|
}
|
|
@@ -3635,7 +3777,7 @@ int main(int argc, char *argv[])
|
|
|
case S_CCS_PRECHARGE_ST1:
|
|
|
{
|
|
|
// 開始確認車端是否同意開始充電
|
|
|
- GetOutputReq(_index, _chargingData[_index]->Evboard_id);
|
|
|
+ GetOutputReq(_index, targetID);
|
|
|
|
|
|
// 設定當前輸出
|
|
|
if (gun_count == 1)
|
|
@@ -3704,47 +3846,26 @@ int main(int argc, char *argv[])
|
|
|
_result = GFD_WAIT;
|
|
|
}
|
|
|
|
|
|
- SetIsolationStatus(_index, _result, _chargingData[_index]->Evboard_id);
|
|
|
+ SetIsolationStatus(_index, _result, targetID);
|
|
|
}
|
|
|
|
|
|
if(_chargingData[_index]->SystemStatus == S_CCS_PRECHARGE_ST0 &&
|
|
|
_chargingData[_index]->PrechargeStatus == PRECHARGE_READY)
|
|
|
{
|
|
|
- SetEvsePrechargeInfo(_index, PRECHARGE_PRERELAY_PASS, _chargingData[_index]->Evboard_id);
|
|
|
+ SetEvsePrechargeInfo(_index, PRECHARGE_PRERELAY_PASS, targetID);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
case S_CHARGING:
|
|
|
{
|
|
|
- // 計算 Power
|
|
|
+ // 當前 Power
|
|
|
_chargingData[_index]->PresentChargingPower = ((float)((_chargingData[_index]->PresentChargingVoltage) * (_chargingData[_index]->PresentChargingCurrent)) / 1000);
|
|
|
|
|
|
- if (chargingTime[_index] == 0 ||
|
|
|
- chargingTime[_index] > _chargingData[_index]->PresentChargedDuration)
|
|
|
- {
|
|
|
- chargingTime[_index] = _chargingData[_index]->PresentChargedDuration;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- int passTime = _chargingData[_index]->PresentChargedDuration - chargingTime[_index];
|
|
|
-
|
|
|
- if (passTime > 0)
|
|
|
- {
|
|
|
- float changingPow = (_chargingData[_index]->PresentChargingPower) * passTime / 3600;
|
|
|
- if (ShmSysConfigAndInfo->SysConfig.BillingData.isBilling)
|
|
|
- {
|
|
|
- _chargingData[_index]->ChargingFee += changingPow * ShmSysConfigAndInfo->SysConfig.BillingData.Cur_fee;
|
|
|
- }
|
|
|
-
|
|
|
- _chargingData[_index]->PresentChargedEnergy += changingPow;
|
|
|
- _chargingData[_index]->PowerConsumption += changingPow;
|
|
|
- chargingTime[_index] = _chargingData[_index]->PresentChargedDuration;
|
|
|
- }
|
|
|
- }
|
|
|
+ CalOutputPowerAndEnergy(_index);
|
|
|
|
|
|
// 開始確認車端是否同意開始充電
|
|
|
- GetOutputReq(_index, _chargingData[_index]->Evboard_id);
|
|
|
+ GetOutputReq(_index, targetID);
|
|
|
|
|
|
if (LogInfo[_index][EV_LOG_MAX_BATT_VOL] != _chargingData[_index]->EvBatteryMaxVoltage)
|
|
|
{
|
|
@@ -3776,11 +3897,11 @@ int main(int argc, char *argv[])
|
|
|
|
|
|
if(_chargingData[_index]->GroundFaultStatus == GFD_FAIL)
|
|
|
{
|
|
|
- SetIsolationStatus(_index, _chargingData[_index]->GroundFaultStatus, _chargingData[_index]->Evboard_id);
|
|
|
+ SetIsolationStatus(_index, _chargingData[_index]->GroundFaultStatus, targetID);
|
|
|
}
|
|
|
else if(_chargingData[_index]->Type == _Type_CCS_2)
|
|
|
{
|
|
|
- SetIsolationStatus(_index, _chargingData[_index]->GroundFaultStatus, _chargingData[_index]->Evboard_id);
|
|
|
+ SetIsolationStatus(_index, _chargingData[_index]->GroundFaultStatus, targetID);
|
|
|
}
|
|
|
|
|
|
// GFD 失敗再通知
|
|
@@ -3789,7 +3910,7 @@ int main(int argc, char *argv[])
|
|
|
if(_chargingData[_index]->Type == _Type_CCS_2 &&
|
|
|
_chargingData[_index]->PrechargeStatus == PRECHARGE_READY)
|
|
|
{
|
|
|
- SetEvsePrechargeInfo(_index, PRECHARGE_CHARELAY_PASS, _chargingData[_index]->Evboard_id);
|
|
|
+ SetEvsePrechargeInfo(_index, PRECHARGE_CHARELAY_PASS, targetID);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -3799,10 +3920,21 @@ int main(int argc, char *argv[])
|
|
|
{
|
|
|
// 設定當前輸出
|
|
|
if (gun_count == 1)
|
|
|
+ {
|
|
|
+ if (_chargingData[0]->FireChargingVoltage <= 500)
|
|
|
+ _chargingData[0]->PresentChargingCurrent = 0;
|
|
|
+
|
|
|
SetPresentChargingOutputPower(_chargingData[0], _chargingData[0]);
|
|
|
+ }
|
|
|
else if (gun_count == 2)
|
|
|
- SetPresentChargingOutputPower(_chargingData[0], _chargingData[1]);
|
|
|
+ {
|
|
|
+ if (_chargingData[0]->FireChargingVoltage <= 500)
|
|
|
+ _chargingData[0]->PresentChargingCurrent = 0;
|
|
|
+ if (_chargingData[1]->FireChargingVoltage <= 500)
|
|
|
+ _chargingData[1]->PresentChargingCurrent = 0;
|
|
|
|
|
|
+ SetPresentChargingOutputPower(_chargingData[0], _chargingData[1]);
|
|
|
+ }
|
|
|
// 槍鎖還在,則代表是樁端要求的停止
|
|
|
if (SendErrorCount[_index] < 3 &&
|
|
|
(_chargingData[_index]->GunLocked == START ||
|
|
@@ -3816,16 +3948,16 @@ int main(int argc, char *argv[])
|
|
|
normalStop = 0x02;
|
|
|
}
|
|
|
|
|
|
- EvseStopChargingEvent(normalStop, stopReason, _chargingData[_index]->Evboard_id);
|
|
|
+ EvseStopChargingEvent(normalStop, stopReason, targetID);
|
|
|
SendErrorCount[_index] += 1;
|
|
|
}
|
|
|
|
|
|
if(_chargingData[_index]->Type == _Type_CCS_2)
|
|
|
{
|
|
|
- SetIsolationStatus(_index, _chargingData[_index]->GroundFaultStatus, _chargingData[_index]->Evboard_id);
|
|
|
+ SetIsolationStatus(_index, _chargingData[_index]->GroundFaultStatus, targetID);
|
|
|
}
|
|
|
|
|
|
- GetOutputReq(_index, _chargingData[_index]->Evboard_id);
|
|
|
+ GetOutputReq(_index, targetID);
|
|
|
|
|
|
if (_chargingData[_index]->SystemStatus == S_ALARM)
|
|
|
{
|
|
@@ -3842,7 +3974,7 @@ int main(int argc, char *argv[])
|
|
|
_chargingData[_index]->AvailableChargingPower,
|
|
|
maxCur,
|
|
|
maxVol,
|
|
|
- _chargingData[_index]->Evboard_id);
|
|
|
+ targetID);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -3868,7 +4000,18 @@ int main(int argc, char *argv[])
|
|
|
_chargingData[_index]->AvailableChargingPower,
|
|
|
maxCur,
|
|
|
maxVol,
|
|
|
- _chargingData[_index]->Evboard_id);
|
|
|
+ targetID);
|
|
|
+
|
|
|
+ if (_chargingData[_index]->EvBatterySoc >= 100)
|
|
|
+ {
|
|
|
+ //滿電,則直接清掉錯誤
|
|
|
+ if (_chargingData[_index]->Type == _Type_Chademo)
|
|
|
+ ClearAbnormalStatus_Chademo(_index);
|
|
|
+ else if (_chargingData[_index]->Type == _Type_GB)
|
|
|
+ ClearAbnormalStatus_GB(_index);
|
|
|
+ else if (_chargingData[_index]->Type == _Type_CCS_2)
|
|
|
+ ClearAbnormalStatus_CCS(_index);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
break;
|