Эх сурвалжийг харах

2020-05-25 / Alston Lin

Actions
1. Modify the output current limit 10A -> 100A
2. Send maximum current to ev before obtaining available current in maximum charging mode
3. Convert the maximum charging mode to the average charging mode, and then send the group current output to ev

Files
1. As follow commit history
Alston 4 жил өмнө
parent
commit
45c42e8d4c

+ 1 - 0
EVSE/Projects/DS60-120/Apps/Config.h

@@ -156,6 +156,7 @@ enum _REASSIGNED_RESOURCE_STEP
 	_REASSIGNED_GET_NEW_CAP = 		2,	// 充電中的重新取得屬於自己火線上的總能量並透過小板通知車端 - 超過10秒直接跳下一步
 	_REASSIGNED_ADJUST_M_TO_A = 	3,	// 模塊重新分配完成
 	_REASSIGNED_RELAY_M_TO_A =		4,	// 切斷橋接的 Relay
+	_REASSIGNED_CHECK = 			5,
 
 	_REASSIGNED_PREPARE_A_TO_M = 	11,
 	_REASSIGNED_ADJUST_A_TO_M = 	12, // 模塊升壓

BIN
EVSE/Projects/DS60-120/Apps/FactoryConfig


+ 2 - 2
EVSE/Projects/DS60-120/Apps/FactoryConfig.c

@@ -103,7 +103,7 @@ int main(int argc,char *argv[])
 	*/
 	//********** System **********// udhcpc -i eth1 -s ./dhcp_script/eth1.script
 	//
-	strcpy((char *)SysConfig.ModelName, "DSYE601J0EE2PH");
+	strcpy((char *)SysConfig.ModelName, "DSYE601J0EW2PH");
 	strcpy((char *)SysConfig.SerialNumber, "");
 
 	memset(SysConfig.SystemId, 0x00, sizeof(SysConfig.SystemId));
@@ -130,7 +130,7 @@ int main(int argc,char *argv[])
 	SysConfig.MaxChargingEnergy = 0;
 	SysConfig.MaxChargingCurrent = 200;		// ³Ì¤j¥i¿é¥X¹q¬y (¾ã¼Î)
 	SysConfig.MaxChargingDuration = 0;
-	SysConfig.AcMaxChargingCurrent = 32;
+	SysConfig.AcMaxChargingCurrent = 0;
 	SysConfig.PhaseLossPolicy = 0;
 	for(unsigned char i = 0; i < 10; i++)
 		strcpy((char *)SysConfig.LocalWhiteCard, "");

BIN
EVSE/Projects/DS60-120/Apps/Module_EvComm


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 1916 - 230
EVSE/Projects/DS60-120/Apps/Module_EvComm.c


BIN
EVSE/Projects/DS60-120/Apps/Module_EventLogging


BIN
EVSE/Projects/DS60-120/Apps/Module_InternalComm


+ 33 - 13
EVSE/Projects/DS60-120/Apps/Module_InternalComm.c

@@ -541,10 +541,20 @@ void CheckK1K2RelayOutput(byte index)
 
 			if(_chargingData[index]->Type == _Type_CCS_2)
 			{
-				if (regRelay.relay_event.bits.Gun1_N == YES	&& regRelay.relay_event.bits.CCS_Precharge == YES)
-					_chargingData[index]->RelayKPK2Status = YES;
+				if (gunCount == 1)
+				{
+					if (regRelay.relay_event.bits.Gun1_N == YES	&& regRelay.relay_event.bits.CCS_Precharge == YES)
+						_chargingData[index]->RelayKPK2Status = YES;
+					else
+						_chargingData[index]->RelayKPK2Status = NO;
+				}
 				else
-					_chargingData[index]->RelayKPK2Status = NO;
+				{
+					if (_chargingData[index]->SystemStatus == S_CCS_PRECHARGE_ST0)
+						_chargingData[index]->RelayKPK2Status = YES;
+					else
+						_chargingData[index]->RelayKPK2Status = NO;
+				}
 			}
 		}
 		else if (_chargingData[index]->Evboard_id == 0x02)
@@ -792,7 +802,7 @@ void SetK1K2RelayStatus(byte index)
 			else if (regRelay.relay_event.bits.Gun1_N == YES)
 				outputRelay.relay_event.bits.Gun1_N = NO;
 
-			if (_chargingData[index]->Type == _Type_CCS_2)
+			if (gunCount == 1 && _chargingData[index]->Type == _Type_CCS_2)
 			{
 				if(regRelay.relay_event.bits.CCS_Precharge == YES)
 					outputRelay.relay_event.bits.CCS_Precharge = NO;
@@ -860,10 +870,13 @@ void SetK1K2RelayStatus(byte index)
 		{
 			if (_chargingData[index]->Type == _Type_CCS_2)
 			{
-				if (regRelay.relay_event.bits.CCS_Precharge == NO)
-					outputRelay.relay_event.bits.CCS_Precharge = YES;
-				else if (regRelay.relay_event.bits.CCS_Precharge == YES)
-					outputRelay.relay_event.bits.Gun1_P = NO;
+				if (gunCount == 1)
+				{
+					if (regRelay.relay_event.bits.CCS_Precharge == NO)
+						outputRelay.relay_event.bits.CCS_Precharge = YES;
+					else if (regRelay.relay_event.bits.CCS_Precharge == YES)
+						outputRelay.relay_event.bits.Gun1_P = NO;
+				}
 			}
 		}
 		else if (_chargingData[index]->Evboard_id == 0x02)
@@ -883,10 +896,13 @@ void SetK1K2RelayStatus(byte index)
 		{
 			if (_chargingData[index]->Type == _Type_CCS_2)
 			{
-				if (regRelay.relay_event.bits.Gun1_P == NO)
-					outputRelay.relay_event.bits.Gun1_P = YES;
-				else if(regRelay.relay_event.bits.Gun1_P == YES)
-					outputRelay.relay_event.bits.CCS_Precharge = NO;
+				if (gunCount == 1)
+				{
+					if (regRelay.relay_event.bits.Gun1_P == NO)
+						outputRelay.relay_event.bits.Gun1_P = YES;
+					else if(regRelay.relay_event.bits.Gun1_P == YES)
+						outputRelay.relay_event.bits.CCS_Precharge = NO;
+				}
 			}
 		}
 		else if (_chargingData[index]->Evboard_id == 0x02)
@@ -1538,6 +1554,11 @@ void GetAcStatus()
 {
 	if (Query_AC_Status(Uart5Fd, Addr.AcPlug, &acStatus) == PASS)
 	{
+		ShmSysConfigAndInfo->SysConfig.AcRatingCurrent = acStatus.MaxCurrent;
+
+		if(ShmSysConfigAndInfo->SysConfig.AcMaxChargingCurrent == 0)
+			ShmSysConfigAndInfo->SysConfig.AcMaxChargingCurrent = ShmSysConfigAndInfo->SysConfig.AcRatingCurrent;
+
 	//				printf("CpStatus = %d \n", acStatus.CpStatus);
 	//				printf("CurLimit = %d \n", acStatus.CurLimit);
 	//				printf("PilotVol_P = %d \n", acStatus.PilotVol_P);
@@ -1621,7 +1642,6 @@ void AcChargeTypeProcess()
 				ChangeToCsuMode();
 				return;
 			}
-
 			GetAcStatus();
 			GetAcAlarmCode();
 

BIN
EVSE/Projects/DS60-120/Apps/Module_LcmControl


+ 4 - 2
EVSE/Projects/DS60-120/Apps/Module_LcmControl.c

@@ -923,7 +923,8 @@ void ProcessPageInfo()
 						else
 						{
 							ChangeChargingEnergyValue(0);
-							ChangeChargingFeeValue(0);
+							if (ShmSysConfigAndInfo->SysConfig.BillingData.isBilling)
+								ChangeChargingFeeValue(0);
 						}
 
 						if(!ShmSysConfigAndInfo->SysConfig.BillingData.isBilling)
@@ -1039,7 +1040,8 @@ void ProcessPageInfo()
 						else
 						{
 							ChangeChargingEnergyValue(0);
-							ChangeChargingFeeValue(0);
+							if (ShmSysConfigAndInfo->SysConfig.BillingData.isBilling)
+								ChangeChargingFeeValue(0);
 						}
 
 						if(!ShmSysConfigAndInfo->SysConfig.BillingData.isBilling)

BIN
EVSE/Projects/DS60-120/Apps/Module_PrimaryComm


BIN
EVSE/Projects/DS60-120/Apps/Module_PsuComm


+ 268 - 103
EVSE/Projects/DS60-120/Apps/Module_PsuComm.c

@@ -6,7 +6,8 @@
 #define FAIL				-1
 #define YES					1
 #define NO					0
-#define DERATING			30
+#define DERATING_COUNT		30
+#define DERATING_GAP		30
 #define ELEMENT_NOT_FIND	255
 #define CHK_VOL_RANGE		50
 #define CHK_CUR_RANGE		10
@@ -14,7 +15,9 @@
 #define ZERO_CURRENT		10			// 該值須保持最小為 1A
 #define ZERO_VOLTAGE		50
 #define STOP_CURRENT		30
-#define PSU_MIN_CUR			100
+#define PSU_MIN_CUR			1000
+#define PRE_CHARG_STEP_CUR	30
+#define PRE_CHARG_RANGE		50
 #define EQUAL				0
 
 struct SysConfigAndInfo			*ShmSysConfigAndInfo;
@@ -51,19 +54,21 @@ int StoreLogMsg(const char *fmt, ...)
 {
 	char Buf[4096+256];
 	char buffer[4096];
-	time_t CurrentTime;
-	struct tm *tm;
 	va_list args;
+	struct timeb  SeqEndTime;
+	struct tm *tm;
 
 	va_start(args, fmt);
 	int rc = vsnprintf(buffer, sizeof(buffer), fmt, args);
 	va_end(args);
 
 	memset(Buf,0,sizeof(Buf));
-	CurrentTime = time(NULL);
-	tm=localtime(&CurrentTime);
-	sprintf(Buf,"echo \"%04d-%02d-%02d %02d:%02d:%02d - %s\" >> /Storage/SystemLog/[%04d.%02d]SystemLog",
-			tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,
+	ftime(&SeqEndTime);
+	SeqEndTime.time = time(NULL);
+	tm=localtime(&SeqEndTime.time);
+
+	sprintf(Buf,"echo \"%04d-%02d-%02d %02d:%02d:%02d:%03d - %s\" >> /Storage/SystemLog/[%04d.%02d]SystemLog",
+			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);
 	system(Buf);
@@ -333,7 +338,7 @@ void GetAvailableCapCallback(byte address, short maxVol, short minVol, short max
 		ShmPsuData->PsuGroup[group].PsuModule[address].AvailableCurrent = maxCur;
 
 	ShmPsuData->PsuGroup[group].PsuModule[address].AvailablePower = totalPow;
-
+	// 總和該 Group 的可輸出電流
 	for (byte index = 0; index < ShmPsuData->PsuGroup[group].GroupPresentPsuQuantity; index++)
 	{
 		_groupCurrent += ShmPsuData->PsuGroup[group].PsuModule[index].AvailableCurrent;
@@ -347,13 +352,20 @@ void GetAvailableCapCallback(byte address, short maxVol, short minVol, short max
 	chargingInfo[group]->MaximumChargingVoltage = maxVol;
 
 	int _power = 0, _current = 0, _ratingcurrent = 0;
+	bool isGetAllDeratingCurrent = true;
+
 	for (byte index = 0; index < ShmPsuData->GroupCount; index++)
 	{
 		_power += ShmPsuData->PsuGroup[index].GroupAvailablePower;
 		_current += ShmPsuData->PsuGroup[index].GroupAvailableCurrent;
 		_ratingcurrent += chargingInfo[index]->DeratingChargingCurrent;
+		if (chargingInfo[index]->DeratingChargingCurrent == 0)
+			isGetAllDeratingCurrent = false;
 	}
 
+	// 如果不是所有群都得到 Derating current,則先不採樣該次的 ratingCurrent
+	if (!isGetAllDeratingCurrent) _ratingcurrent = 0;
+
 	ShmPsuData->SystemAvailableCurrent = _current;
 	ShmPsuData->SystemAvailablePower = _power;
 
@@ -365,6 +377,18 @@ void GetAvailableCapCallback(byte address, short maxVol, short minVol, short max
 		int halfCur = ShmPsuData->PsuGroup[group].GroupAvailableCurrent;
 		int ratingCur = chargingInfo[group]->DeratingChargingCurrent;
 
+		if ((ShmSysConfigAndInfo->SysInfo.ReAssignedFlag >= _REASSIGNED_GET_NEW_CAP &&
+				ShmSysConfigAndInfo->SysInfo.ReAssignedFlag <= _REASSIGNED_RELAY_M_TO_A))
+		{
+			if (chargingInfo[group]->DividChargingCurrent == 0)
+				return;
+			else
+			{
+				halfCur = chargingInfo[group]->DividChargingCurrent;
+				ratingCur = 0;
+			}
+		}
+
 		GetMaxPowerAndCur(_MAIN_CHARGING_MODE_AVER, ratingCur, &halfPow, &halfCur);
 
 //		if ((ShmSysConfigAndInfo->SysInfo.ReAssignedFlag >= _REASSIGNED_GET_NEW_CAP &&
@@ -436,25 +460,43 @@ void GetInputVoltageCallback(byte address, unsigned short vol1, unsigned short v
 
 void GetPresentOutputCallback(byte group, unsigned short outVol, unsigned short outCur)
 {
-	unsigned short outputVol = outVol;
-	unsigned short outputCur = outCur;
+	//if (outCur != ShmPsuData->PsuGroup[group].GroupPresentOutputCurrent)
+	//{
+	//	PRINTF_FUNC("Gp_%d, gp output cur = %d \n", group, outCur);
+	//}
 
 	// PSU Group - 電壓
-	ShmPsuData->PsuGroup[group].GroupPresentOutputVoltage = outputVol;
+	ShmPsuData->PsuGroup[group].GroupPresentOutputVoltage = outVol;
 	// PSU Group - 電流
-	ShmPsuData->PsuGroup[group].GroupPresentOutputCurrent = outputCur;
+	ShmPsuData->PsuGroup[group].GroupPresentOutputCurrent = outCur;
 
-	if (ShmSysConfigAndInfo->SysInfo.MainChargingMode == _MAIN_CHARGING_MODE_MAX)
+	if (ShmSysConfigAndInfo->SysInfo.MainChargingMode == _MAIN_CHARGING_MODE_MAX ||
+			(ShmSysConfigAndInfo->SysInfo.MainChargingMode == _MAIN_CHARGING_MODE_AVER &&
+			(ShmSysConfigAndInfo->SysInfo.ReAssignedFlag >= _REASSIGNED_WAITING &&
+			ShmSysConfigAndInfo->SysInfo.ReAssignedFlag <= _REASSIGNED_COMP))
+		)
 	{
-		outputVol = 0;
-		outputCur = 0;
+		unsigned short outputVol = 0;
+		unsigned short outputCur = 0;
 
 		for (byte index = 0; index < ShmPsuData->GroupCount; index++)
 		{
+			bool needtoAdd = true;
+
 			if (ShmPsuData->PsuGroup[index].GroupPresentOutputVoltage > outputVol)
 				outputVol = ShmPsuData->PsuGroup[index].GroupPresentOutputVoltage;
 
-			outputCur += ShmPsuData->PsuGroup[index].GroupPresentOutputCurrent;
+			if (ShmSysConfigAndInfo->SysInfo.ReAssignedFlag >= _REASSIGNED_ADJUST_M_TO_A &&
+					ShmSysConfigAndInfo->SysInfo.ReAssignedFlag <= _REASSIGNED_RELAY_M_TO_A)
+			{
+//				PRINTF_FUNC("Gp_%d, DividChargingCurrent = %d \n", index,
+//						chargingInfo[index]->DividChargingCurrent);
+				if (chargingInfo[index]->DividChargingCurrent == 0)
+					needtoAdd = false;
+			}
+
+			if (needtoAdd)
+				outputCur += ShmPsuData->PsuGroup[index].GroupPresentOutputCurrent;
 		}
 
 		// 黑白機
@@ -566,7 +608,7 @@ void GetIavailableCallback(byte address, unsigned short Iavail, unsigned short V
 				{
 					chargingInfo[group]->SampleChargingCur[count] = totalCur;
 					isPass = false;
-					continue;
+					break;
 				}
 			}
 		}
@@ -764,6 +806,8 @@ void CheckSmartChargingStep(bool isWaitingAver, bool isCharging)
 			if (ShmSysConfigAndInfo->SysInfo.MainChargingMode == _MAIN_CHARGING_MODE_AVER)
 			{
 				PRINTF_FUNC("=============Smart Charging : _REASSIGNED_ADJUST_A_TO_M============= Step 12 \n");
+				preChargingCur = preChargingTarget = 0;
+				gettimeofday(&_max_time, NULL);
 				ShmSysConfigAndInfo->SysInfo.ReAssignedFlag = _REASSIGNED_ADJUST_A_TO_M;
 			}
 			else
@@ -965,9 +1009,6 @@ int main(void)
 						// Pooling Status
 						GetStatus(index);
 
-						// 取系統總輸出能力
-						GetModuleCap(index);
-
 						// 取得模塊輸入電壓
 						GetModuleInput(index);
 
@@ -1018,6 +1059,9 @@ int main(void)
 
 				for (byte groupIndex = 0; groupIndex < _gunCount; groupIndex++)
 				{
+					// 取系統總輸出能力
+					GetModuleCap(groupIndex);
+					// 取得模塊的當前輸出
 					GetModuleOutput(groupIndex);
 					// 針對各槍當前狀態,傳送需要回傳的資料指令
 					if (((chargingInfo[groupIndex]->SystemStatus >= S_PREPARING_FOR_EVSE && chargingInfo[groupIndex]->SystemStatus <= S_CHARGING) && chargingInfo[groupIndex]->RelayK1K2Status) ||
@@ -1063,15 +1107,36 @@ int main(void)
 //									chargingInfo[groupIndex]->SystemStatus, chargingInfo[groupIndex]->EvBatterytargetCurrent,
 //									(chargingInfo[groupIndex]->PresentChargingCurrent * 10));
 							// 智能判斷 Start -----------------------------------------------------------
+							if (ShmSysConfigAndInfo->SysInfo.ReAssignedFlag >= _REASSIGNED_GET_NEW_CAP &&
+									ShmSysConfigAndInfo->SysInfo.ReAssignedFlag <= _REASSIGNED_RELAY_M_TO_A)
+							{
+								if (ShmSysConfigAndInfo->SysInfo.ReAssignedFlag == _REASSIGNED_GET_NEW_CAP)
+								{
+									//PRINTF_FUNC("group = %d, GroupPresentOutputCurrent = %d \n",
+									//		groupIndex, ShmPsuData->PsuGroup[groupIndex].GroupPresentOutputCurrent);
+
+									if (chargingInfo[groupIndex]->DividChargingCurrent == 0)
+									{
+										chargingInfo[groupIndex]->DividChargingCurrent = ShmPsuData->PsuGroup[groupIndex].GroupPresentOutputCurrent;
+									}
+								}
+								PRINTF_FUNC("Index = %d, DividChargingCurrent = %f \n", groupIndex, chargingInfo[groupIndex]->DividChargingCurrent);
+							}
+							else
+							{
+								chargingInfo[groupIndex]->DividChargingCurrent = 0;
+							}
+
 							if (ShmSysConfigAndInfo->SysInfo.ReAssignedFlag == _REASSIGNED_GET_NEW_CAP)
 							{
 								if (ShmPsuData->SystemAvailableCurrent != chargingInfo[groupIndex]->AvailableChargingCurrent)
 								{
 									// 車端要求電流為該充電槍的額定輸出電流的範圍內
-									if (chargingInfo[groupIndex]->EvBatterytargetCurrent <= chargingInfo[groupIndex]->AvailableChargingCurrent ||
-										deratingKeepCount >= DERATING)
+									if (chargingInfo[groupIndex]->EvBatterytargetCurrent <= ShmPsuData->PsuGroup[groupIndex].GroupPresentOutputCurrent + DERATING_GAP ||
+										deratingKeepCount >= DERATING_COUNT)
 									{
 										// 車端降載完成
+										PRINTF_FUNC("Index = %d, newEvCurrent = %f \n", groupIndex, chargingInfo[groupIndex]->EvBatterytargetCurrent);
 										PRINTF_FUNC("=============Smart Charging : _REASSIGNED_ADJUST_M_TO_A============= Step 3 \n");
 										ShmSysConfigAndInfo->SysInfo.ReAssignedFlag = _REASSIGNED_ADJUST_M_TO_A;
 										gettimeofday(&_derating_time, NULL);
@@ -1080,6 +1145,11 @@ int main(void)
 									else
 									{
 										deratingKeepCount++;
+										PRINTF_FUNC("** Step 2 ** : Index = %d, EvBatterytargetCurrent = %f, TargetCurrent = %d, Count = %d \n",
+												groupIndex,
+												chargingInfo[groupIndex]->EvBatterytargetCurrent,
+												(ShmPsuData->PsuGroup[groupIndex].GroupPresentOutputCurrent + DERATING_GAP),
+												deratingKeepCount);
 									}
 								}
 
@@ -1088,39 +1158,41 @@ int main(void)
 							{
 								bool isChanged = false;
 
-								// 需求電流不降低的情況下 -> 依然要切
-								if (chargingInfo[groupIndex]->AvailableChargingCurrent < chargingInfo[groupIndex]->EvBatterytargetCurrent)
+								if (chargingInfo[groupIndex]->AvailableChargingCurrent <= chargingInfo[groupIndex]->EvBatterytargetCurrent)
 								{
-									PRINTF_FUNC("** _REASSIGNED_ADJUST_M_TO_A ** Gun_%d, AvailableChargingCurrent = %f, EvBatterytargetCurrent = %f \n", groupIndex,
+									PRINTF_FUNC("** _REASSIGNED_ADJUST_M_TO_A ** Gun_%d, PresentChargingCurrent = %f, AvailableChargingCurrent = %f, EvBatterytargetCurrent = %f \n", groupIndex,
 											(chargingInfo[groupIndex]->PresentChargingCurrent * 10),
-											chargingInfo[groupIndex]->AvailableChargingCurrent);
+											chargingInfo[groupIndex]->AvailableChargingCurrent,
+											chargingInfo[groupIndex]->EvBatterytargetCurrent);
+
 									for (byte subIndex = 0; subIndex < ShmPsuData->GroupCount; subIndex++)
 									{
 										if (chargingInfo[subIndex]->SystemStatus == S_REASSIGN)
 										{
-											if ((chargingInfo[subIndex]->PresentChargingCurrent * 10) <= CHK_CUR_RANGE)
+											// 當 B 模塊輸出電流小於 5A 及退開 relay
+											if ((ShmPsuData->PsuGroup[subIndex].GroupPresentOutputCurrent) <= 50)
 												isChanged = true;
 											break;
 										}
 									}
-
-									// 這狀況下輸出端的電流載滿載衝的狀況下,並不會降電流
-									// 所以只能拉載到該槍端的最大輸出能力
-									if ((chargingInfo[groupIndex]->PresentChargingCurrent * 10) >= chargingInfo[groupIndex]->AvailableChargingCurrent - CHK_CUR_RANGE ||
-											(chargingInfo[groupIndex]->PresentChargingCurrent * 10) <= CHK_CUR_RANGE)
-									{
-										isChanged = true;
-									}
 								}
 								else if (((chargingInfo[groupIndex]->PresentChargingCurrent * 10) >= ShmPsuData->PsuGroup[groupIndex].GroupPresentOutputCurrent - CHK_CUR_RANGE) &&
 										((chargingInfo[groupIndex]->PresentChargingCurrent * 10) <= ShmPsuData->PsuGroup[groupIndex].GroupPresentOutputCurrent + CHK_CUR_RANGE))
 								{
-									isChanged = true;
+									for (byte subIndex = 0; subIndex < ShmPsuData->GroupCount; subIndex++)
+									{
+										if (chargingInfo[subIndex]->SystemStatus == S_REASSIGN)
+										{
+											if ((ShmPsuData->PsuGroup[subIndex].GroupPresentOutputCurrent) <= CHK_CUR_RANGE)
+												isChanged = true;
+											break;
+										}
+									}
 								}
 
 								if (isChanged)
 								{
-									PRINTF_FUNC("** _REASSIGNED_ADJUST_M_TO_A ** Gun_%d, PresentChargingCurrent = %f, GroupPresentOutputCurrent = %d \n", groupIndex,
+									PRINTF_FUNC("** _REASSIGNED_ADJUST_M_TO_A To 4** Gun_%d, PresentChargingCurrent = %f, GroupPresentOutputCurrent = %d \n", groupIndex,
 										(chargingInfo[groupIndex]->PresentChargingCurrent * 10),
 										ShmPsuData->PsuGroup[groupIndex].GroupPresentOutputCurrent);
 
@@ -1128,67 +1200,75 @@ int main(void)
 									PRINTF_FUNC("=============Smart Charging : _REASSIGNED_RELAY_M_TO_A============= Step 4 \n");
 									ShmSysConfigAndInfo->SysInfo.ReAssignedFlag = _REASSIGNED_RELAY_M_TO_A;
 								}
+								else
+								{
+									if ((GetTimeoutValue(_derating_time) / 1000) > 1000)
+									{
+										gettimeofday(&_derating_time, NULL);
+									}
+								}
 							}
 
-							if (ShmPsuData->SystemAvailablePower > 0)
+							//if (ShmPsuData->SystemAvailablePower > 0)
 							{
 								// 調整輸出電流 : 漸進調整方式
-								if (ShmSysConfigAndInfo->SysInfo.ReAssignedFlag >= _REASSIGNED_ADJUST_M_TO_A)
+								if (ShmSysConfigAndInfo->SysInfo.ReAssignedFlag >= _REASSIGNED_GET_NEW_CAP &&
+										ShmSysConfigAndInfo->SysInfo.ReAssignedFlag < _REASSIGNED_RELAY_M_TO_A)
 								{
-									// 當前充電中的目標電壓
-									float targetVol = chargingInfo[groupIndex]->EvBatterytargetVoltage;
-									// 當前充電中的目標電流
-									//float targetCur = 0;
-									// 準備切出去的模塊電流
-									float deratingCur = 0;
-
-									byte reassignIndex = ELEMENT_NOT_FIND;
-									// 找到等待分配的槍
-									for (byte subIndex = 0; subIndex < ShmPsuData->GroupCount; subIndex++)
-									{
-										if (chargingInfo[subIndex]->SystemStatus == S_REASSIGN)
-										{
-											reassignIndex = subIndex;
-										}
-									}
-
-									if (reassignIndex != ELEMENT_NOT_FIND)
+									if (ShmSysConfigAndInfo->SysInfo.ReAssignedFlag >= _REASSIGNED_ADJUST_M_TO_A)
 									{
-										//int derating = GetTimeoutValue(_derating_time) / 1000;
+										// 當前充電中的目標電壓
+										float targetVol = chargingInfo[groupIndex]->EvBatterytargetVoltage;
+										byte reassignIndex = ELEMENT_NOT_FIND;
 
-										//if (derating > 1000)
+										// 找到等待分配的槍
+										for (byte subIndex = 0; subIndex < ShmPsuData->GroupCount; subIndex++)
 										{
-											if (ShmPsuData->PsuGroup[reassignIndex].GroupPresentOutputCurrent > 0)
+											if (chargingInfo[subIndex]->SystemStatus == S_REASSIGN)
 											{
-												deratingCur = ShmPsuData->PsuGroup[reassignIndex].GroupPresentOutputCurrent - DERATING_RANGE;
-												if (deratingCur <= CHK_CUR_RANGE)
-													deratingCur = CHK_CUR_RANGE;
-
-												PresentOutputVol(reassignIndex, targetVol, deratingCur);
-												gettimeofday(&_derating_time, NULL);
+												reassignIndex = subIndex;
+												break;
 											}
 										}
 
-										// ***********直接降低要移除的模塊電流即可*************
-										// 因為爬的速度沒有降的速度快,所以採兩倍速度爬升
-//										targetCur = ShmPsuData->PsuGroup[groupIndex].GroupPresentOutputCurrent + (DERATING_RANGE * 2);
-//										if (targetCur >= chargingInfo[groupIndex]->EvBatterytargetCurrent)
-//												targetCur = chargingInfo[groupIndex]->EvBatterytargetCurrent;
-
-										if (targetVol == 0)
-										{
-											SwitchPower(SYSTEM_CMD, PSU_POWER_OFF);
-											FlashLed(SYSTEM_CMD, PSU_FLASH_NORMAL);
-										}
-										else
+										if (reassignIndex != ELEMENT_NOT_FIND)
 										{
-											SwitchPower(SYSTEM_CMD, PSU_POWER_ON);
-											FlashLed(SYSTEM_CMD, PSU_FLASH_ON);
+											if ((GetTimeoutValue(_derating_time) / 1000) <= 50)
+											{
+												// A 模塊維持當前電壓電流
+												//PRINTF_FUNC("A : index = %d, cur = %d \n", groupIndex, ShmPsuData->PsuGroup[groupIndex].GroupPresentOutputCurrent);
+												//PresentOutputVol(groupIndex, targetVol, ShmPsuData->PsuGroup[groupIndex].GroupPresentOutputCurrent);
+												//PRINTF_FUNC("set out (%d) value = %f******** 1 \n", groupIndex, chargingInfo[groupIndex]->EvBatterytargetCurrent);
+												PresentOutputVol(groupIndex, targetVol, chargingInfo[groupIndex]->EvBatterytargetCurrent);
+//											}
+//
+//											if ((GetTimeoutValue(_derating_time) / 1000) <= 50)
+//											{
+												// 直接拉掉 B 模塊的電流
+												//PRINTF_FUNC("B : index = %d, cur = %d \n", reassignIndex, CHK_CUR_RANGE);
+												//PRINTF_FUNC("set out (%d) value = %d******** 2 \n", reassignIndex, CHK_CUR_RANGE);
+												PresentOutputVol(reassignIndex, targetVol, CHK_CUR_RANGE);
+											}
 										}
 									}
+
+									if (chargingInfo[groupIndex]->EvBatterytargetVoltage == 0)
+									{
+										//PRINTF_FUNC("sys ******** 1 \n");
+										SwitchPower(SYSTEM_CMD, PSU_POWER_OFF);
+										FlashLed(SYSTEM_CMD, PSU_FLASH_NORMAL);
+									}
+								}
+								else if (ShmSysConfigAndInfo->SysInfo.ReAssignedFlag >= _REASSIGNED_RELAY_M_TO_A)
+								{
+									//PRINTF_FUNC("set out (%d) value = %f******** 3 \n", groupIndex, chargingInfo[groupIndex]->EvBatterytargetCurrent);
+									PresentOutputVol(groupIndex,
+											chargingInfo[groupIndex]->EvBatterytargetVoltage,
+											chargingInfo[groupIndex]->EvBatterytargetCurrent);
 								}
 								else
 								{
+									//PRINTF_FUNC("set out (sys) value = %f******** 4 \n", chargingInfo[groupIndex]->EvBatterytargetCurrent);
 									// 該充電槍的目標電壓與目標電流
 									PresentOutputVol(SYSTEM_CMD,
 										chargingInfo[groupIndex]->EvBatterytargetVoltage,
@@ -1196,6 +1276,7 @@ int main(void)
 
 									if (chargingInfo[groupIndex]->EvBatterytargetVoltage == 0)
 									{
+										//PRINTF_FUNC("sys ******** 2 \n");
 										SwitchPower(SYSTEM_CMD, PSU_POWER_OFF);
 										FlashLed(SYSTEM_CMD, PSU_FLASH_NORMAL);
 									}
@@ -1238,63 +1319,135 @@ int main(void)
 									// 閒置端與車端要求電壓接近
 									PRINTF_FUNC("=============Smart Charging : _REASSIGNED_RELAY_A_TO_M============= Step 13 \n");
 									ShmSysConfigAndInfo->SysInfo.ReAssignedFlag = _REASSIGNED_RELAY_A_TO_M;
-									gettimeofday(&_averageComp_time, NULL);
+								}
+								else
+								{
+									if ((GetTimeoutValue(_max_time) / 1000) > 500)
+									{
+										gettimeofday(&_max_time, NULL);
+									}
 								}
 							}
 							else if(ShmSysConfigAndInfo->SysInfo.ReAssignedFlag == _REASSIGNED_WAITING)
 							{
-								int avrTime = GetTimeoutValue(_averageComp_time) / 1000;
+								int idleCurrent = 0;
+								int chargingCurrent = 0;
 
-								if (avrTime > 10000)
+								for (byte subIndex = 0; subIndex < ShmPsuData->GroupCount; subIndex++)
+								{
+									if (chargingInfo[subIndex]->SystemStatus == S_IDLE ||
+											chargingInfo[subIndex]->SystemStatus == S_RESERVATION ||
+											chargingInfo[subIndex]->SystemStatus == S_REASSIGN_CHECK)
+										idleCurrent = ShmPsuData->PsuGroup[subIndex].GroupPresentOutputCurrent;
+									else
+										chargingCurrent = ShmPsuData->PsuGroup[subIndex].GroupPresentOutputCurrent;
+								}
+
+								if (idleCurrent >= chargingCurrent - PRE_CHARG_RANGE)
 								{
-									// 閒置端與車端要求電壓接近
 									PRINTF_FUNC("=============Smart Charging_0 : _REASSIGNED_COMP============= Step 15 \n");
 									ShmSysConfigAndInfo->SysInfo.ReAssignedFlag = _REASSIGNED_COMP;
 								}
+								else
+								{
+									if ((GetTimeoutValue(_max_time) / 1000) > 500)
+									{
+										gettimeofday(&_max_time, NULL);
+									}
+								}
 							}
 
 							if (chargingInfo[groupIndex]->AvailableChargingCurrent > 0)
 							{
-								if (ShmSysConfigAndInfo->SysInfo.ReAssignedFlag == _REASSIGNED_ADJUST_A_TO_M)
+								if (ShmSysConfigAndInfo->SysInfo.ReAssignedFlag >= _REASSIGNED_ADJUST_A_TO_M)
 								{
+									byte reassignIndex = ELEMENT_NOT_FIND;
+
 									for (byte subIndex = 0; subIndex < ShmPsuData->GroupCount; subIndex++)
 									{
 										if (chargingInfo[subIndex]->SystemStatus == S_IDLE ||
-												chargingInfo[subIndex]->SystemStatus == S_RESERVATION)
+												chargingInfo[subIndex]->SystemStatus == S_RESERVATION ||
+												chargingInfo[subIndex]->SystemStatus == S_REASSIGN_CHECK)
 										{
-											// 閒置模塊升壓
-											PresentOutputVol(subIndex,
-													chargingInfo[groupIndex]->EvBatterytargetVoltage,
-													ZERO_CURRENT);
+											reassignIndex = subIndex;
+//											if ((GetTimeoutValue(_max_time) / 1000) <= 50)
+//											{
+//												// 閒置模塊升壓,另對剛分配近來的模塊,預上升電流值 (preChargingCur)
+//												PresentOutputVol(subIndex,
+//														chargingInfo[groupIndex]->EvBatterytargetVoltage,
+//														ZERO_CURRENT + preChargingTarget);
+//											}
+											//PRINTF_FUNC("preChargingCur = %d \n", preChargingCur);
+											if (ShmSysConfigAndInfo->SysInfo.ReAssignedFlag >= _REASSIGNED_WAITING)
+											{
+												preChargingCur = ShmPsuData->PsuGroup[subIndex].GroupPresentOutputCurrent;
+											}
+											else
+												preChargingCur = 0;
 										}
 										else
 										{
+											//PRINTF_FUNC("CurOutputCurrent = %d \n", ShmPsuData->PsuGroup[subIndex].GroupPresentOutputCurrent - preChargingCur);
 											// 充電中的模塊維持輸出
-											PresentOutputVol(subIndex,
-												chargingInfo[subIndex]->EvBatterytargetVoltage,
-												chargingInfo[subIndex]->EvBatterytargetCurrent);
+//											if ((GetTimeoutValue(_max_time) / 1000) <= 50)
+//											{
+//												PresentOutputVol(subIndex,
+//													chargingInfo[subIndex]->EvBatterytargetVoltage,
+//													chargingInfo[subIndex]->EvBatterytargetCurrent - preChargingCur);
+//											}
+
+											if ((ShmSysConfigAndInfo->SysInfo.ReAssignedFlag >= _REASSIGNED_WAITING) &&
+													(preChargingCur >= preChargingTarget - ZERO_CURRENT))
+												preChargingTarget += PRE_CHARG_STEP_CUR;
+
+											if (preChargingTarget >= chargingInfo[subIndex]->EvBatterytargetCurrent / 2)
+												preChargingTarget = chargingInfo[subIndex]->EvBatterytargetCurrent / 2;
 										}
+									}
 
-										if (chargingInfo[groupIndex]->EvBatterytargetVoltage == 0)
-										{
-											SwitchPower(subIndex, PSU_POWER_OFF);
-											FlashLed(subIndex, PSU_FLASH_NORMAL);
-										}
-										else
+									if (reassignIndex != ELEMENT_NOT_FIND)
+									{
+										if ((GetTimeoutValue(_max_time) / 1000) <= 50)
 										{
-											SwitchPower(subIndex, PSU_POWER_ON);
-											FlashLed(subIndex, PSU_FLASH_ON);
+											//PRINTF_FUNC("set out (%d) value = %d******** 5 \n", reassignIndex, ZERO_CURRENT + preChargingTarget);
+											// 閒置模塊升壓,另對剛分配近來的模塊,預上升電流值 (preChargingCur)
+											PresentOutputVol(reassignIndex,
+												chargingInfo[groupIndex]->EvBatterytargetVoltage,
+												ZERO_CURRENT + preChargingTarget);
+
+											byte _ovCahrgingCur = 0;
+											if (preChargingCur > PRE_CHARG_STEP_CUR)
+												_ovCahrgingCur = PRE_CHARG_STEP_CUR;
+
+											//PRINTF_FUNC("set out (%d) value = %f******** 6 \n", groupIndex, chargingInfo[groupIndex]->EvBatterytargetCurrent - preChargingCur - _ovCahrgingCur);
+											PresentOutputVol(groupIndex,
+												chargingInfo[groupIndex]->EvBatterytargetVoltage,
+												chargingInfo[groupIndex]->EvBatterytargetCurrent - preChargingCur - _ovCahrgingCur);
 										}
 									}
+
+									if (chargingInfo[groupIndex]->EvBatterytargetVoltage == 0)
+									{
+										//PRINTF_FUNC("sys ******** 3 \n");
+										SwitchPower(SYSTEM_CMD, PSU_POWER_OFF);
+										FlashLed(SYSTEM_CMD, PSU_FLASH_NORMAL);
+									}
+									else
+									{
+										SwitchPower(SYSTEM_CMD, PSU_POWER_ON);
+										FlashLed(SYSTEM_CMD, PSU_FLASH_ON);
+									}
 								}
 								else
 								{
+									//PRINTF_FUNC("set out (%d) value = %f******** 7 \n", groupIndex, chargingInfo[groupIndex]->EvBatterytargetCurrent);
 									PresentOutputVol(groupIndex,
 										chargingInfo[groupIndex]->EvBatterytargetVoltage,
 										chargingInfo[groupIndex]->EvBatterytargetCurrent);
 
 									if (chargingInfo[groupIndex]->EvBatterytargetVoltage == 0)
 									{
+										//PRINTF_FUNC("%d ******** 4 \n", groupIndex);
 										SwitchPower(groupIndex, PSU_POWER_OFF);
 										FlashLed(groupIndex, PSU_FLASH_NORMAL);
 									}
@@ -1314,6 +1467,7 @@ int main(void)
 						{
 							if (!isCharging)
 							{
+								//PRINTF_FUNC("sys ******** 5 \n");
 								SwitchPower(SYSTEM_CMD, PSU_POWER_OFF);
 								FlashLed(SYSTEM_CMD, PSU_FLASH_NORMAL);
 
@@ -1350,9 +1504,20 @@ int main(void)
 								SwitchPower(groupIndex, PSU_POWER_OFF);
 								FlashLed(groupIndex, PSU_FLASH_NORMAL);
 							}
-							ShmSysConfigAndInfo->SysInfo.ReAssignedFlag = _REASSIGNED_NONE;
+
+							if (ShmSysConfigAndInfo->SysInfo.ReAssignedFlag >= _REASSIGNED_WAITING)
+								ShmSysConfigAndInfo->SysInfo.ReAssignedFlag = _REASSIGNED_COMP;
+							else
+								ShmSysConfigAndInfo->SysInfo.ReAssignedFlag = _REASSIGNED_NONE;
 						}
 					}
+					else if ((chargingInfo[groupIndex]->SystemStatus >= S_PREPARNING && chargingInfo[groupIndex]->SystemStatus <= S_PREPARING_FOR_EV) &&
+							ShmSysConfigAndInfo->SysInfo.MainChargingMode == _MAIN_CHARGING_MODE_AVER)
+					{
+						//PRINTF_FUNC("%d ******** 7 \n", groupIndex);
+						SwitchPower(groupIndex, PSU_POWER_OFF);
+						FlashLed(groupIndex, PSU_FLASH_NORMAL);
+					}
 				}
 					break;
 			}

+ 3 - 1
EVSE/Projects/DS60-120/Apps/Module_PsuComm.h

@@ -41,14 +41,16 @@ struct ChargingInfoData *chargingInfo[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANT
 
 struct timeval _cmdSubPriority_time;
 byte _getCapDelayCount;
-struct timeval _averageComp_time;
 struct timeval _derating_time;
+struct timeval _max_time;
 
 struct timeval _test_time;
 
 bool isCharging = false;
 bool isWaitingAver = false;
 bool isReadToCharging = false;
+int preChargingTarget;
+int preChargingCur;
 
 float toAverVolPoint;
 byte toAverVolCount;

BIN
EVSE/Projects/DS60-120/Apps/ReadCmdline


+ 2 - 1
EVSE/Projects/DS60-120/Apps/ReadCmdline.c

@@ -789,7 +789,8 @@ void RunUnconditionalChargeIndex1(char *v1, char *v2, char *v3)
         	    }
 
     		    //ev task do this
-    		    _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->PresentChargingPower = ((float)((_chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->PresentChargingVoltage) * (_chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->PresentChargingCurrent)) / 1000);
+    		    _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->PresentChargingPower =
+    		    		((float)((_chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->PresentChargingVoltage) * (_chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->PresentChargingCurrent)) / 1000);
 
     		    if (_chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->GroundFaultStatus == 0x02){
     		         printf ("Charging Ground Fault check Fail (%d)\n",_chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->GroundFaultStatus);

+ 5 - 0
EVSE/Projects/DS60-120/Apps/internalComm.c

@@ -70,6 +70,11 @@ unsigned char Query_FW_Ver(unsigned char fd, unsigned char targetAddr, Ver *Ret_
 	unsigned char chksum = 0x00;
 	unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
 
+//		for (int i = 0; i < 7; i++)
+//			printf("tx = %x \n", tx[i]);
+//		for (int i = 0; i < len; i++)
+//			printf("rx = %x \n", rx[i]);
+
 	if(len > 6)
 	{
 		if (len < 6+(rx[4] | rx[5]<<8))

BIN
EVSE/Projects/DS60-120/Apps/main


+ 193 - 55
EVSE/Projects/DS60-120/Apps/main.c

@@ -81,6 +81,11 @@ void gpio_set_value(unsigned int gpio, unsigned int value);
 void PRINTF_FUNC(char *string, ...);
 void ChangeGunSelectByIndex(byte sel);
 
+void RecordAlarmCode(byte gunIndex, char *code);
+void RecordWarningCode(byte gunIndex, char *code);
+void ReleaseWarningCodeByString(byte gunIndex, char *code);
+void ReleaseAlarmCode(byte gunIndex);
+
 #define DEBUG_INFO_MSG(format, args...) StoreLogMsg_1("[%s:%d][%s][Info] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
 #define DEBUG_WARN_MSG(format, args...) StoreLogMsg_1("[%s:%d][%s][Warn] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
 #define DEBUG_ERROR_MSG(format, args...) StoreLogMsg_1("[%s:%d][%s][Error] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
@@ -118,7 +123,7 @@ bool isModelNameMatch = true;
 
 int rfidFd = -1;
 char* rfidPortName = "/dev/ttyS2";
-char* fwVersion = "D0.11.00.0000.00";
+char* fwVersion = "D0.13.00.0000.00";
 
 //================================================
 // initial can-bus
@@ -1851,50 +1856,160 @@ bool IsAuthorizingMode()
 //===============================================
 // 紀錄 Alarm Code
 //===============================================
-void RecordAlarmCode(char *code)
+void RecordAlarmCode(byte gunIndex, char *code)
 {
-	if (strcmp(code, "012234") == 0) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.ChademoGfdTrip = YES;
-	if (strcmp(code, "012235") == 0) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CcsGfdTrip = YES;
-	if (strcmp(code, "012236") == 0) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.GbGfdTrip = YES;
-	if (strcmp(code, "012288") == 0) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CcsOutputUVPFail = YES;
-	if (strcmp(code, "012289") == 0) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.ChademoOutputUVPFail = YES;
-	if (strcmp(code, "012290") == 0) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.GbtOutputUVPFail = YES;
-
-	if (strcmp(code, "012296") == 0) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.ChademoGroundWarning = YES;
-	if (strcmp(code, "012297") == 0) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CcsGroundfaultWarning = YES;
-	if (strcmp(code, "012298") == 0) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.GbGroundfaultWarning = YES;
+	memcpy(chargingInfo[gunIndex]->ConnectorAlarmCode, code, 6);
+
+	if (strcmp(code, "012234") == EQUAL) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.ChademoGfdTrip = YES;
+	if (strcmp(code, "012235") == EQUAL) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CcsGfdTrip = YES;
+	if (strcmp(code, "012236") == EQUAL) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.GbGfdTrip = YES;
+	if (strcmp(code, "012288") == EQUAL) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CcsOutputUVPFail = YES;
+	if (strcmp(code, "012289") == EQUAL) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.ChademoOutputUVPFail = YES;
+	if (strcmp(code, "012290") == EQUAL) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.GbtOutputUVPFail = YES;
+}
+
+void RecordWarningCode(byte gunIndex, char *code)
+{
+	memcpy(chargingInfo[gunIndex]->ConnectorWarningCode, code, 6);
+
+	if (strcmp(code, "012296") == EQUAL) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.ChademoGroundWarning = YES;
+	if (strcmp(code, "012297") == EQUAL) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CcsGroundfaultWarning = YES;
+	if (strcmp(code, "012298") == EQUAL) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.GbGroundfaultWarning = YES;
 }
 
 void ReleaseAlarmCode(byte gunIndex)
 {
+	bool isCleanCheck = false;
+	char code[7];
+
 	if (chargingInfo[gunIndex]->Type == _Type_Chademo)
 	{
-		ShmStatusCodeData->AlarmCode.AlarmEvents.bits.ChademoGfdTrip = NO;
-		ShmStatusCodeData->AlarmCode.AlarmEvents.bits.ChademoOutputUVPFail = NO;
-		ShmStatusCodeData->FaultCode.FaultEvents.bits.ChademoOutputRelayWelding = NO;
-		ShmStatusCodeData->AlarmCode.AlarmEvents.bits.ChademoGroundWarning = NO;
+		if (strncmp((char *)chargingInfo[gunIndex]->ConnectorAlarmCode, "012234", 6) == EQUAL &&
+			ShmStatusCodeData->AlarmCode.AlarmEvents.bits.ChademoGfdTrip == YES)
+		{
+			memcpy(code, "012234", 6);
+			memcpy(chargingInfo[gunIndex]->ConnectorAlarmCode, "", 6);
+			isCleanCheck = true;
+		}
+		else if (strncmp((char *)chargingInfo[gunIndex]->ConnectorAlarmCode, "012289", 6) == EQUAL &&
+				ShmStatusCodeData->AlarmCode.AlarmEvents.bits.ChademoOutputUVPFail == YES)
+		{
+			memcpy(code, "012289", 6);
+			memcpy(chargingInfo[gunIndex]->ConnectorAlarmCode, "", 6);
+			isCleanCheck = true;
+		}
+		else if (ShmStatusCodeData->AlarmCode.AlarmEvents.bits.ChademoGroundWarning == YES)
+		{
+			ReleaseWarningCodeByString(gunIndex, "012296");
+		}
 	}
 	else if (chargingInfo[gunIndex]->Type == _Type_GB)
 	{
-		ShmStatusCodeData->AlarmCode.AlarmEvents.bits.GbGfdTrip = NO;
-		ShmStatusCodeData->AlarmCode.AlarmEvents.bits.GbtOutputUVPFail = NO;
-		ShmStatusCodeData->FaultCode.FaultEvents.bits.GbOutputRelayWelding = NO;
-		ShmStatusCodeData->AlarmCode.AlarmEvents.bits.GbGroundfaultWarning = NO;
+		if (strncmp((char *)chargingInfo[gunIndex]->ConnectorAlarmCode, "012236", 6) == EQUAL &&
+			ShmStatusCodeData->AlarmCode.AlarmEvents.bits.GbGfdTrip == YES)
+		{
+			memcpy(code, "012236", 6);
+			memcpy(chargingInfo[gunIndex]->ConnectorAlarmCode, "", 6);
+			isCleanCheck = true;
+		}
+		else if (strncmp((char *)chargingInfo[gunIndex]->ConnectorAlarmCode, "012290", 6) == EQUAL &&
+				ShmStatusCodeData->AlarmCode.AlarmEvents.bits.GbtOutputUVPFail == YES)
+		{
+			memcpy(code, "012290", 6);
+			memcpy(chargingInfo[gunIndex]->ConnectorAlarmCode, "", 6);
+			isCleanCheck = true;
+		}
+		else if (ShmStatusCodeData->AlarmCode.AlarmEvents.bits.GbGroundfaultWarning == YES)
+		{
+			ReleaseWarningCodeByString(gunIndex, "012298");
+		}
 	}
 	else if (chargingInfo[gunIndex]->Type == _Type_CCS_2)
 	{
-		ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CcsGfdTrip = NO;
-		ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CcsOutputUVPFail = NO;
-		ShmStatusCodeData->FaultCode.FaultEvents.bits.CcsOutputRelayWelding = NO;
-		ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CcsGroundfaultWarning = NO;
+		if (strncmp((char *)chargingInfo[gunIndex]->ConnectorAlarmCode, "012235", 6) == EQUAL &&
+			ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CcsGfdTrip == YES)
+		{
+			memcpy(code, "012235", 6);
+			memcpy(chargingInfo[gunIndex]->ConnectorAlarmCode, "", 6);
+			isCleanCheck = true;
+		}
+		else if (strncmp((char *)chargingInfo[gunIndex]->ConnectorAlarmCode, "012288", 6) == EQUAL &&
+				ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CcsOutputUVPFail == YES)
+		{
+			memcpy(code, "012288", 6);
+			memcpy(chargingInfo[gunIndex]->ConnectorAlarmCode, "", 6);
+			isCleanCheck = true;
+		}
+		else if (ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CcsGroundfaultWarning == YES)
+		{
+			ReleaseWarningCodeByString(gunIndex, "012297");
+		}
+	}
+
+	if (isCleanCheck)
+	{
+		for (byte index = 0; index < ShmSysConfigAndInfo->SysConfig.TotalConnectorCount; index++)
+		{
+			if (index == gunIndex)
+				continue;
+			else
+			{
+				if (strncmp((char *)chargingInfo[index]->ConnectorAlarmCode, code, 6) != EQUAL)
+				{
+					if (strncmp(code, "012234", 6) == EQUAL) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.ChademoGfdTrip = NO;
+					if (strncmp(code, "012289", 6) == EQUAL) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.ChademoOutputUVPFail = NO;
+
+					if (strncmp(code, "012236", 6) == EQUAL) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.GbGfdTrip = NO;
+					if (strncmp(code, "012290", 6) == EQUAL) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.GbtOutputUVPFail = NO;
+
+					if (strncmp(code, "012235", 6) == EQUAL) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CcsGfdTrip = NO;
+					if (strncmp(code, "012288", 6) == EQUAL) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CcsOutputUVPFail = NO;
+				}
+			}
+		}
 	}
 }
 
-void CleanAlarmCodeByString(char *code)
+void ReleaseWarningCodeByString(byte gunIndex, char *code)
 {
-	if (strcmp(code, "012296") == 0) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.ChademoGroundWarning = NO;
-	if (strcmp(code, "012297") == 0) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CcsGroundfaultWarning = NO;
-	if (strcmp(code, "012298") == 0) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.GbGroundfaultWarning = NO;
+	bool isCleanCheck = false;
+
+	if (strncmp((char *)chargingInfo[gunIndex]->ConnectorWarningCode, code, 6) == EQUAL &&
+			ShmStatusCodeData->AlarmCode.AlarmEvents.bits.ChademoGroundWarning == YES)
+	{
+		memcpy(chargingInfo[gunIndex]->ConnectorWarningCode, "", 6);
+		isCleanCheck = true;
+	}
+	else if (strncmp((char *)chargingInfo[gunIndex]->ConnectorWarningCode, code, 6) == EQUAL &&
+			ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CcsGroundfaultWarning == YES)
+	{
+		memcpy(chargingInfo[gunIndex]->ConnectorWarningCode, "", 6);
+		isCleanCheck = true;
+	}
+	else if (strncmp((char *)chargingInfo[gunIndex]->ConnectorWarningCode, code, 6) == EQUAL &&
+			ShmStatusCodeData->AlarmCode.AlarmEvents.bits.GbGroundfaultWarning == YES)
+	{
+		memcpy(chargingInfo[gunIndex]->ConnectorWarningCode, "", 6);
+		isCleanCheck = true;
+	}
+
+	if (isCleanCheck)
+	{
+		for (byte index = 0; index < ShmSysConfigAndInfo->SysConfig.TotalConnectorCount; index++)
+		{
+			if (index == gunIndex)
+				continue;
+			else
+			{
+				if (strncmp((char *)chargingInfo[index]->ConnectorWarningCode, code, 6) != EQUAL)
+				{
+					if (strncmp(code, "012296", 6) == EQUAL) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.ChademoGroundWarning = NO;
+					if (strncmp(code, "012297", 6) == EQUAL) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CcsGroundfaultWarning = NO;
+					if (strncmp(code, "012298", 6) == EQUAL) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.GbGroundfaultWarning = NO;
+				}
+			}
+		}
+	}
 }
 //===============================================
 // EmergencyStop and Charging Stop
@@ -2068,6 +2183,8 @@ void ChkPrimaryStatus()
 					}
 				}
 					break;
+				case S_REASSIGN_CHECK:
+				case S_REASSIGN:
 				case S_PREPARNING:
 				case S_PREPARING_FOR_EV:
 				case S_PREPARING_FOR_EVSE:
@@ -2583,7 +2700,6 @@ bool AddGunInfoByConnector(byte typeValue, byte slots)
 		case '2': // IEC 62196-2 Type 1/SAE J1772 Socket
 			break;
 		case '3': // IEC 62196-2 Type 2 Plug
-			break;
 		case '4': // IEC 62196-2 Type 2 Socket
 			if (AC_QUANTITY > _ac_Index)
 			{
@@ -2701,7 +2817,7 @@ bool CheckConnectorTypeStatus()
 		// 偵測槍屬於哪個 slot : 可知道插在板上的Slot 0 或 1 是 Chademo 還是 CCS
 		for (byte gunIndex = 0; gunIndex < ShmSysConfigAndInfo->SysConfig.TotalConnectorCount; gunIndex++)
 		{
-			if (bd0_1_status == 0 && bd0_2_status == 1)
+			if (gunIndex == 0 && bd0_1_status == 0 && bd0_2_status == 1)
 			{
 				// 與硬體相同 type : Chademo
 				if (chargingInfo[gunIndex]->Type == _Type_Chademo)
@@ -2709,7 +2825,7 @@ bool CheckConnectorTypeStatus()
 					chargingInfo[gunIndex]->Evboard_id = 0x01;
 				}
 			}
-			else if (bd0_1_status == 1 && bd0_2_status == 0)
+			else if (gunIndex == 0 && bd0_1_status == 1 && bd0_2_status == 0)
 			{
 				// 與硬體相同 type : CCS
 				if (chargingInfo[gunIndex]->Type == _Type_CCS_2)
@@ -2717,7 +2833,7 @@ bool CheckConnectorTypeStatus()
 					chargingInfo[gunIndex]->Evboard_id = 0x01;
 				}
 			}
-			else if (bd0_1_status == 1 && bd0_2_status == 1)
+			else if (gunIndex == 0 && bd0_1_status == 1 && bd0_2_status == 1)
 			{
 				// 與硬體相同 type : GB
 				if (chargingInfo[gunIndex]->Type == _Type_GB)
@@ -2726,7 +2842,7 @@ bool CheckConnectorTypeStatus()
 				}
 			}
 
-			if (bd1_1_status == 0 && bd1_2_status == 1)
+			if (gunIndex == 1 && bd1_1_status == 0 && bd1_2_status == 1)
 			{
 				// 與硬體相同 type : Chademo
 				if (chargingInfo[gunIndex]->Type == _Type_Chademo)
@@ -2737,7 +2853,7 @@ bool CheckConnectorTypeStatus()
 				if (ShmSysConfigAndInfo->SysConfig.TotalConnectorCount == 1)
 					chargingInfo[gunIndex]->Evboard_id = 0x01;
 			}
-			else if (bd1_1_status == 1 && bd1_2_status == 0)
+			else if (gunIndex == 1 && bd1_1_status == 1 && bd1_2_status == 0)
 			{
 				// 與硬體相同 type : CCS
 				if (chargingInfo[gunIndex]->Type == _Type_CCS_2)
@@ -2748,7 +2864,7 @@ bool CheckConnectorTypeStatus()
 				if (ShmSysConfigAndInfo->SysConfig.TotalConnectorCount == 1)
 					chargingInfo[gunIndex]->Evboard_id = 0x01;
 			}
-			else if (bd1_1_status == 1 && bd1_2_status == 1)
+			else if (gunIndex == 1 && bd1_1_status == 1 && bd1_2_status == 1)
 			{
 				// 與硬體相同 type : GB
 				if (chargingInfo[gunIndex]->Type == _Type_GB)
@@ -3968,6 +4084,24 @@ int main(void)
 						else if (ShmSysConfigAndInfo->SysInfo.MainChargingMode == _MAIN_CHARGING_MODE_AVER &&
 								ShmSysConfigAndInfo->SysInfo.ReAssignedFlag != _REASSIGNED_NONE)
 						{
+							// 如果在切換最大充的過程中,需等待最大充切換完成後,在走均充流程
+							if (ShmSysConfigAndInfo->SysInfo.BridgeRelayStatus == YES)
+							{
+								if (ShmSysConfigAndInfo->SysInfo.ReAssignedFlag != _REASSIGNED_COMP &&
+										ShmSysConfigAndInfo->SysInfo.ReAssignedFlag != _REASSIGNED_WAITING)
+								{
+									PRINTF_FUNC("=============Smart Charging============= Step 14 \n");
+									ShmSysConfigAndInfo->SysInfo.ReAssignedFlag = _REASSIGNED_WAITING;
+								}
+								else if (ShmSysConfigAndInfo->SysInfo.ReAssignedFlag == _REASSIGNED_COMP)
+								{
+									ShmSysConfigAndInfo->SysInfo.MainChargingMode = _MAIN_CHARGING_MODE_MAX;
+									ShmSysConfigAndInfo->SysInfo.ReAssignedFlag = _REASSIGNED_NONE;
+								}
+							}
+
+							if (ShmSysConfigAndInfo->SysInfo.CurGunSelected == gun_index)
+								ShmSysConfigAndInfo->SysInfo.ConnectorPage = _LCM_PRE_CHARGE;
 							continue;
 						}
 					}
@@ -3976,6 +4110,9 @@ int main(void)
 						setChargerMode(gun_index, MODE_REASSIGN);
 					else
 						setChargerMode(gun_index, MODE_PRECHARGE);
+
+					if (ShmSysConfigAndInfo->SysInfo.CurGunSelected == gun_index)
+						ShmSysConfigAndInfo->SysInfo.ConnectorPage = _LCM_PRE_CHARGE;
 				}
 					break;
 				case S_REASSIGN:
@@ -3983,6 +4120,7 @@ int main(void)
 					if (isModeChange(gun_index))
 					{
 						PRINTF_FUNC("S_REASSIGN================================== %x \n", gun_index);
+						gettimeofday(&_toAverage_time, NULL);
 					}
 
 					// 重新分配,此階段主要是讓已經在充電或者準備進入充電前的緩衝
@@ -4097,12 +4235,12 @@ int main(void)
 						if (chargingInfo[gun_index]->GroundFaultStatus == GFD_FAIL)
 						{
 							// GFD 錯誤停止
-							RecordAlarmCode("012234");
+							RecordAlarmCode(gun_index, "012234");
 						}
 						else if (chargingInfo[gun_index]->GroundFaultStatus == GFD_WARNING)
 						{
 							// GFD 警告
-							RecordAlarmCode("012296");
+							RecordWarningCode(gun_index, "012296");
 						}
 					}
 					else if (chargingInfo[gun_index]->Type == _Type_GB)
@@ -4116,12 +4254,12 @@ int main(void)
 						if (chargingInfo[gun_index]->GroundFaultStatus == GFD_FAIL)
 						{
 							// GFD 錯誤停止
-							RecordAlarmCode("012236");
+							RecordAlarmCode(gun_index, "012236");
 						}
 						else if (chargingInfo[gun_index]->GroundFaultStatus == GFD_WARNING)
 						{
 							// GFD 警告
-							RecordAlarmCode("012298");
+							RecordWarningCode(gun_index, "012298");
 						}
 					}
 					else if (chargingInfo[gun_index]->Type == _Type_CCS_2)
@@ -4136,12 +4274,12 @@ int main(void)
 						if (chargingInfo[gun_index]->GroundFaultStatus == GFD_FAIL)
 						{
 							// GFD 錯誤停止
-							RecordAlarmCode("012235");
+							RecordAlarmCode(gun_index, "012235");
 						}
 						else if (chargingInfo[gun_index]->GroundFaultStatus == GFD_WARNING)
 						{
 							// GFD 警告
-							RecordAlarmCode("012297");
+							RecordWarningCode(gun_index, "012297");
 						}
 					}
 
@@ -4176,67 +4314,67 @@ int main(void)
 						if (chargingInfo[gun_index]->GroundFaultStatus == GFD_FAIL)
 						{
 							// GFD 錯誤停止
-							RecordAlarmCode("012234");
+							RecordAlarmCode(gun_index, "012234");
 						}
 						else if ((chargingInfo[gun_index]->EvBatterytargetVoltage > 0 && chargingInfo[gun_index]->EvBatterytargetVoltage < SYSTEM_MIN_VOL) ||
 								(chargingInfo[gun_index]->RemainChargingDuration >= 10 && chargingInfo[gun_index]->PresentChargingVoltage < SYSTEM_MIN_VOL))
 						{
 							// UVP
-							RecordAlarmCode("012289");
+							RecordAlarmCode(gun_index, "012289");
 							ChargingTerminalProcess(gun_index);
 						}
 						else if (chargingInfo[gun_index]->GroundFaultStatus == GFD_WARNING)
 						{
 							// GFD 警告
-							RecordAlarmCode("012296");
+							RecordWarningCode(gun_index, "012296");
 						}
 						else
-							CleanAlarmCodeByString("012296");
+							ReleaseWarningCodeByString(gun_index, "012296");
 					}
 					else if (chargingInfo[gun_index]->Type == _Type_GB)
 					{
 						if (chargingInfo[gun_index]->GroundFaultStatus == GFD_FAIL)
 						{
 							// GFD 錯誤停止
-							RecordAlarmCode("012236");
+							RecordAlarmCode(gun_index, "012236");
 						}
 						else if (isPrechargeStatus_gb(gun_index) == 10 &&
 								((chargingInfo[gun_index]->EvBatterytargetVoltage > 0 && chargingInfo[gun_index]->EvBatterytargetVoltage < SYSTEM_MIN_VOL) ||
 								(chargingInfo[gun_index]->RemainChargingDuration >= 10 && chargingInfo[gun_index]->PresentChargingVoltage < SYSTEM_MIN_VOL)))
 						{
 							// UVP
-							RecordAlarmCode("012290");
+							RecordAlarmCode(gun_index, "012290");
 							ChargingTerminalProcess(gun_index);
 						}
 						else if (chargingInfo[gun_index]->GroundFaultStatus == GFD_WARNING)
 						{
 							// GFD 警告
-							RecordAlarmCode("012298");
+							RecordWarningCode(gun_index, "012298");
 						}
 						else
-							CleanAlarmCodeByString("012298");
+							ReleaseWarningCodeByString(gun_index, "012298");
 					}
 					else if (chargingInfo[gun_index]->Type == _Type_CCS_2)
 					{
 						if (chargingInfo[gun_index]->GroundFaultStatus == GFD_FAIL)
 						{
 							// GFD 錯誤停止
-							RecordAlarmCode("012235");
+							RecordAlarmCode(gun_index, "012235");
 						}
 						else if ((chargingInfo[gun_index]->EvBatterytargetVoltage > 0 && chargingInfo[gun_index]->EvBatterytargetVoltage < SYSTEM_MIN_VOL) ||
 								(chargingInfo[gun_index]->RemainChargingDuration >= 10 && chargingInfo[gun_index]->PresentChargingVoltage < SYSTEM_MIN_VOL))
 						{
 							// UVP
-							RecordAlarmCode("012288");
+							RecordAlarmCode(gun_index, "012288");
 							ChargingTerminalProcess(gun_index);
 						}
 						else if (chargingInfo[gun_index]->GroundFaultStatus == GFD_WARNING)
 						{
 							// GFD 警告
-							RecordAlarmCode("012297");
+							RecordWarningCode(gun_index, "012297");
 						}
 						else
-							CleanAlarmCodeByString("012297");
+							ReleaseWarningCodeByString(gun_index, "012297");
 					}
 
 					if (isEvBoardStopChargeFlag(gun_index) ||
@@ -4332,7 +4470,7 @@ int main(void)
 					if (chargingInfo[gun_index]->GroundFaultStatus == GFD_FAIL)
 					{
 						// GFD 錯誤停止
-						RecordAlarmCode("012235");
+						RecordAlarmCode(gun_index, "012235");
 					}
 
 					if (isEvBoardStopChargeFlag(gun_index) == YES ||
@@ -4370,7 +4508,7 @@ int main(void)
 					if (chargingInfo[gun_index]->GroundFaultStatus == GFD_FAIL)
 					{
 						// GFD 錯誤停止
-						RecordAlarmCode("012235");
+						RecordAlarmCode(gun_index, "012235");
 					}
 
 					if (isEvBoardStopChargeFlag(gun_index) == YES ||

+ 1 - 0
EVSE/Projects/DS60-120/Apps/timeout.h

@@ -49,4 +49,5 @@ enum Timeout_flag
 	Timeout_ReturnToChargingGunDet = 	11
 };
 
+struct timeval _toAverage_time;
 #endif /* TIMEOUT_H_ */

Энэ ялгаанд хэт олон файл өөрчлөгдсөн тул зарим файлыг харуулаагүй болно