فهرست منبع

2020-05-05 / Alston Lin

Actions
1. Disable to check fan speed of feedback
2. Parsing the modelname for psu number
3. Fix some bug of operatiion

Files
1. As follow commit history
Alston 4 سال پیش
والد
کامیت
f05f22c04e

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


+ 46 - 7
EVSE/Projects/DS60-120/Apps/Module_EvComm.c

@@ -58,7 +58,7 @@ float _cur_2 = 0;
 // Chademo : 500V, GB : 750, CCS : 950V
 float maxChargingVol[2] = { 5000, 9500 };			// 限制最大充電電壓,如依照模塊則填上 0
 // 限制最大充電電流與能量透過 Web
-float maxChargingCur[2] = { 2000, 2000 };			// 限制最大充電電流,如依照模塊則填上 0
+float maxChargingCur[2] = { 1200, 1200 };			// 限制最大充電電流,如依照模塊則填上 0
 float maxChargingPow = 0;							// 限制最大充電能量,如依照模塊則填上 0
 
 // 槍資訊
@@ -992,7 +992,7 @@ void CANReceiver()
 					{
 						if (_chargingData[targetGun]->Type == _Type_Chademo)
 						{
-							memcpy(ShmCHAdeMOData->evse[_chargingData[targetGun]->type_index].version, frame.data, ARRAY_SIZE(frame.data));
+							memcpy(ShmCHAdeMOData->evse[_chargingData[targetGun]->type_index].version, frame.data, frame.can_dlc);
 							ShmCHAdeMOData->evse[_chargingData[targetGun]->type_index].SelfTest_Comp = PASS;
 							PRINTF_FUNC("chademo ver. : %s\n", ShmCHAdeMOData->evse[_chargingData[targetGun]->type_index].version);
 						}
@@ -1006,16 +1006,22 @@ void CANReceiver()
 						{
 							if (ShmCcsData->CommProtocol == 0x01)
 							{
-								memcpy(&ShmCcsData->V2GMessage_DIN70121[_chargingData[targetGun]->type_index].version, frame.data, ARRAY_SIZE(frame.data));
+								memcpy(&ShmCcsData->V2GMessage_DIN70121[_chargingData[targetGun]->type_index].version, frame.data, frame.can_dlc);
 								ShmCcsData->V2GMessage_DIN70121[_chargingData[targetGun]->type_index].SelfTest_Comp = PASS;
 								PRINTF_FUNC("CCS FW = %s \n", ShmCcsData->V2GMessage_DIN70121[_chargingData[targetGun]->type_index].version);
 							}
 						}
 
-						if (targetGun == 1)
-							memcpy(ShmSysConfigAndInfo->SysInfo.Connector1FwRev, frame.data, ARRAY_SIZE(frame.data));
+						if (targetGun == 0)
+						{
+							memset(ShmSysConfigAndInfo->SysInfo.Connector1FwRev, 0, sizeof(ShmSysConfigAndInfo->SysInfo.Connector1FwRev));
+							memcpy(ShmSysConfigAndInfo->SysInfo.Connector1FwRev, frame.data, frame.can_dlc);
+						}
 						else
-							memcpy(ShmSysConfigAndInfo->SysInfo.Connector2FwRev, frame.data, ARRAY_SIZE(frame.data));
+						{
+							memset(ShmSysConfigAndInfo->SysInfo.Connector2FwRev, 0, sizeof(ShmSysConfigAndInfo->SysInfo.Connector2FwRev));
+							memcpy(ShmSysConfigAndInfo->SysInfo.Connector2FwRev, frame.data, frame.can_dlc);
+						}
 					}
 						break;
 					case ACK_EV_HW_VERSION:
@@ -1143,7 +1149,7 @@ void CANReceiver()
 						// 車端要求停止
 						// frame.data[0] : 0x01 => normal stop, 0x02 => ev emergency stop
 						PRINTF_FUNC("(%d) NOTIFICATION_EV_STOP err level = %d-----------------------------\n", targetGun, frame.data[0]);
-						if (frame.data[0] == 0x02)
+						//if (frame.data[0] == 0x02)
 						{
 							AbnormalStopAnalysis(targetGun, frame.data + 1);
 						}
@@ -1331,6 +1337,17 @@ byte GetStopChargingReasonByEvse(byte gunIndex, byte *reason)
 			*(reason + 0) = 9;
 			result = YES;
 		}
+		else if (ShmStatusCodeData->AlarmCode.AlarmEvents.bits.ChademoGfdTrip == YES)
+		{
+			// 012234
+			*(reason + 5) = 0;
+			*(reason + 4) = 1;
+			*(reason + 3) = 2;
+			*(reason + 2) = 2;
+			*(reason + 1) = 3;
+			*(reason + 0) = 4;
+			result = YES;
+		}
 	}
 	else if (_chargingData[gunIndex]->Type == _Type_GB)
 	{
@@ -1345,6 +1362,17 @@ byte GetStopChargingReasonByEvse(byte gunIndex, byte *reason)
 			*(reason + 0) = 0;
 			result = YES;
 		}
+		else if (ShmStatusCodeData->AlarmCode.AlarmEvents.bits.GbGfdTrip == YES)
+		{
+			// 012236
+			*(reason + 5) = 0;
+			*(reason + 4) = 1;
+			*(reason + 3) = 2;
+			*(reason + 2) = 2;
+			*(reason + 1) = 3;
+			*(reason + 0) = 6;
+			result = YES;
+		}
 	}
 	else if (_chargingData[gunIndex]->Type == _Type_CCS_2)
 	{
@@ -1370,6 +1398,17 @@ byte GetStopChargingReasonByEvse(byte gunIndex, byte *reason)
 			*(reason + 0) = 8;
 			result = YES;
 		}
+		else if (ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CcsGfdTrip == YES)
+		{
+			// 012236
+			*(reason + 5) = 0;
+			*(reason + 4) = 1;
+			*(reason + 3) = 2;
+			*(reason + 2) = 2;
+			*(reason + 1) = 3;
+			*(reason + 0) = 5;
+			result = YES;
+		}
 	}
 
 	return result;

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


+ 61 - 105
EVSE/Projects/DS60-120/Apps/Module_InternalComm.c

@@ -61,7 +61,7 @@ struct PsuData 					*ShmPsuData;
 #define IOUT_MAX_CURRENT	50
 
 #define MAX_FAN_SPEED		13500
-#define MIN_FAN_SPEED		2800
+#define MIN_FAN_SPEED		3000
 #define NORMAL_FAN_SPEED	7000
 
 // GFD Status
@@ -96,10 +96,9 @@ bool FindChargingInfoData(byte target, struct ChargingInfoData **chargingData);
 
 int Uart5Fd;
 char *relayRs485PortName = "/dev/ttyS5";
-unsigned short fanSpeedSmoothValue = 1000;
+unsigned short fanSpeedSmoothValue = 500;
 
 bool isStopChargingCount = false;
-bool isSystemBooting = false;
 struct timeval _close_ac_contactor;
 
 struct timeval _priority_time;
@@ -109,6 +108,8 @@ struct timeval	_ac_preparing;
 struct timeb 	_ac_startChargingTime;
 struct timeb 	_ac_endChargingTime;
 
+unsigned short _setFanSpeed = 0;
+
 Ver ver;
 PresentInputVoltage inputVoltage;
 PresentOutputVoltage outputVoltage;
@@ -737,34 +738,38 @@ void GetAuxPower()
 void SetFanModuleSpeed()
 {
 	// 調整風扇速度要漸進式 : 500 rpm/p
-	if (ShmFanModuleData->PresentFan1Speed != ShmFanModuleData->SetFan1Speed ||
-			ShmFanModuleData->PresentFan2Speed != ShmFanModuleData->SetFan2Speed ||
-			ShmFanModuleData->PresentFan3Speed != ShmFanModuleData->SetFan3Speed ||
-			ShmFanModuleData->PresentFan4Speed != ShmFanModuleData->SetFan4Speed)
+//	if (ShmFanModuleData->PresentFan1Speed != ShmFanModuleData->SetFan1Speed ||
+//			ShmFanModuleData->PresentFan2Speed != ShmFanModuleData->SetFan2Speed ||
+//			ShmFanModuleData->PresentFan3Speed != ShmFanModuleData->SetFan3Speed ||
+//			ShmFanModuleData->PresentFan4Speed != ShmFanModuleData->SetFan4Speed)
 	{
 		//printf("ShmFanModuleData->SetFan1Speed = %d \n", ShmFanModuleData->SetFan1Speed);
 
 		FanSpeed _fanSpeed;
 
-		unsigned short speed = ShmFanModuleData->PresentFan1Speed + fanSpeedSmoothValue;
-		if (speed >= ShmFanModuleData->SetFan1Speed)
-			speed = ShmFanModuleData->SetFan1Speed;
-		_fanSpeed.speed[0] = speed;
+		//unsigned short speed = ShmFanModuleData->PresentFan1Speed + fanSpeedSmoothValue;
+		_setFanSpeed += fanSpeedSmoothValue;
+
+		//if (speed >= ShmFanModuleData->SetFan1Speed)
+		//	speed = ShmFanModuleData->SetFan1Speed;
+		if (_setFanSpeed >= ShmFanModuleData->SetFan1Speed)
+			_setFanSpeed = ShmFanModuleData->SetFan1Speed;
+		_fanSpeed.speed[0] = _setFanSpeed;
 
-		speed = ShmFanModuleData->PresentFan2Speed + fanSpeedSmoothValue;
-		if (speed >= ShmFanModuleData->SetFan2Speed)
-			speed = ShmFanModuleData->SetFan2Speed;
-		_fanSpeed.speed[1] = speed;
+		//speed = ShmFanModuleData->PresentFan2Speed + fanSpeedSmoothValue;
+		//if (speed >= ShmFanModuleData->SetFan2Speed)
+		//	speed = ShmFanModuleData->SetFan2Speed;
+		_fanSpeed.speed[1] = _setFanSpeed;
 
-		speed = ShmFanModuleData->PresentFan3Speed + fanSpeedSmoothValue;
-		if (speed >= ShmFanModuleData->SetFan3Speed)
-			speed = ShmFanModuleData->SetFan3Speed;
-		_fanSpeed.speed[2] = speed;
+		//speed = ShmFanModuleData->PresentFan3Speed + fanSpeedSmoothValue;
+		//if (speed >= ShmFanModuleData->SetFan3Speed)
+		//	speed = ShmFanModuleData->SetFan3Speed;
+		_fanSpeed.speed[2] = _setFanSpeed;
 
-		speed = ShmFanModuleData->PresentFan4Speed + fanSpeedSmoothValue;
-		if (speed >= ShmFanModuleData->SetFan4Speed)
-			speed = ShmFanModuleData->SetFan4Speed;
-		_fanSpeed.speed[3] = speed;
+		//speed = ShmFanModuleData->PresentFan4Speed + fanSpeedSmoothValue;
+		//if (speed >= ShmFanModuleData->SetFan4Speed)
+		//	speed = ShmFanModuleData->SetFan4Speed;
+		_fanSpeed.speed[3] = _setFanSpeed;
 
 		if (Config_Fan_Speed(Uart5Fd, Addr.Fan, &_fanSpeed) == PASS)
 		{
@@ -773,45 +778,6 @@ void SetFanModuleSpeed()
 	}
 }
 
-void SetRelayModuleFanSpeed()
-{
-	// 調整風扇速度要漸進式 : 100 rpm/p
-	if (ShmFanModuleData->PresentFan1Speed != ShmFanModuleData->SetFan1Speed)
-	{
-		FanSpeed _fanSpeed;
-		unsigned short speed = 0;
-
-		if (ShmFanModuleData->SetFan1Speed > ShmFanModuleData->PresentFan1Speed)
-		{
-			speed = ShmFanModuleData->PresentFan1Speed + fanSpeedSmoothValue;
-			if (speed >= ShmFanModuleData->SetFan1Speed)
-				speed = ShmFanModuleData->SetFan1Speed;
-		}
-		else
-		{
-			speed = ShmFanModuleData->PresentFan1Speed - fanSpeedSmoothValue;
-			if (speed <= 0)
-				speed = ShmFanModuleData->SetFan1Speed;
-		}
-
-		_fanSpeed.speed[0] = speed & 0xff;
-		_fanSpeed.speed[1] = (speed >> 8) & 0xff;
-		ShmFanModuleData->PresentFan1Speed = speed;
-
-		Config_Fan_Speed(Uart5Fd, Addr.Relay, &_fanSpeed);
-	}
-}
-
-void GetRelayModuleFanSpeed()
-{
-	PRINTF_FUNC("Get fan board speed \n");
-	if (Query_Fan_Speed(Uart5Fd, Addr.Relay, &fanSpeed) == PASS)
-	{
-		ShmFanModuleData->PresentFan1Speed = fanSpeed.speed[0] + (fanSpeed.speed[1] >> 8);
-		PRINTF_FUNC("SystemFanRotaSpeed_1 = %d \n", fanSpeed.speed[0]);
-	}
-}
-
 //==========================================
 // Common Function
 //==========================================
@@ -1857,7 +1823,8 @@ int main(void)
 			// 三相輸入電壓
 			GetPresentInputVol();
 
-			// 讀取當前 relay 狀態
+			// 讀取當前 AC relay 狀態
+			regRelay.relay_event.bits.AC_Contactor = ShmSysConfigAndInfo->SysInfo.AcContactorStatus;
 			//GetRelayOutputStatus();
 
 			for (int i = 0; i < gunCount; i++)
@@ -1883,8 +1850,9 @@ int main(void)
 				}
 
 				if (_chargingData[i]->SystemStatus == S_BOOTING	||
-					(_chargingData[i]->SystemStatus >= S_PREPARNING && _chargingData[i]->SystemStatus <= S_COMPLETE) ||
+					(_chargingData[i]->SystemStatus >= S_REASSIGN_CHECK && _chargingData[i]->SystemStatus <= S_COMPLETE) ||
 					(_chargingData[i]->SystemStatus >= S_CCS_PRECHARGE_ST0 && _chargingData[i]->SystemStatus <= S_CCS_PRECHARGE_ST1) ||
+					ShmSysConfigAndInfo->SysInfo.WaitForPlugit == YES ||
 					(ShmSysConfigAndInfo->SysInfo.PageIndex >= _LCM_AUTHORIZING && ShmSysConfigAndInfo->SysInfo.PageIndex <= _LCM_WAIT_FOR_PLUG))
 				{
 					_chargingData[i]->IsReadyToCharging = YES;
@@ -1918,10 +1886,10 @@ int main(void)
 			SetParalleRelayStatus();
 
 			// 搭上 AC Contactor
-			if (isCharging)
-				outputRelay.relay_event.bits.AC_Contactor = YES;
-			else
-				outputRelay.relay_event.bits.AC_Contactor = NO;
+//			if (isCharging)
+//				outputRelay.relay_event.bits.AC_Contactor = YES;
+//			else
+//				outputRelay.relay_event.bits.AC_Contactor = NO;
 
 			if (isCharging)
 			{
@@ -1937,8 +1905,7 @@ int main(void)
 				}
 				else
 				{
-					if (!isSystemBooting ||
-						(outputRelay.relay_event.bits.AC_Contactor == YES && GetTimeoutValue(_close_ac_contactor) / 1000 >= (TEN_MINUTES * 1000)))
+					if ((outputRelay.relay_event.bits.AC_Contactor == YES && GetTimeoutValue(_close_ac_contactor) / 1000 >= (TEN_MINUTES * 1000)))
 						outputRelay.relay_event.bits.AC_Contactor = NO;
 				}
 			}
@@ -1946,19 +1913,9 @@ int main(void)
 			// 搭上/鬆開 Relay
 			if(IsNoneMatchRelayStatus())
 			{
-				PRINTF_FUNC("********Run Relay, AC = %x, g1_p = %x, g1_n = %x, g2_p = %x, g2_n = %x, pre = %x, bri_p = %x, bri_n = %x \n",
-						outputRelay.relay_event.bits.AC_Contactor,
-						outputRelay.relay_event.bits.Gun1_P,
-						outputRelay.relay_event.bits.Gun1_N,
-						outputRelay.relay_event.bits.Gun2_P,
-						outputRelay.relay_event.bits.Gun2_N,
-						outputRelay.relay_event.bits.CCS_Precharge,
-						outputRelay.relay_event.bits.Gun1_Parallel_P,
-						outputRelay.relay_event.bits.Gun1_Parallel_N);
-
 				if (Config_Relay_Output(Uart5Fd, Addr.Relay, &outputRelay))
 				{
-					regRelay.relay_event.bits.AC_Contactor = ShmSysConfigAndInfo->SysInfo.AcContactorStatus;
+					//regRelay.relay_event.bits.AC_Contactor = ShmSysConfigAndInfo->SysInfo.AcContactorStatus;
 					regRelay.relay_event.bits.CCS_Precharge = outputRelay.relay_event.bits.CCS_Precharge;
 					regRelay.relay_event.bits.Gun1_P = outputRelay.relay_event.bits.Gun1_P;
 					regRelay.relay_event.bits.Gun1_N = outputRelay.relay_event.bits.Gun1_N;
@@ -2033,28 +1990,27 @@ int main(void)
 				GetPsuTempForFanSpeed();
 
 				GetFanSpeed();
-				if (ShmFanModuleData->PresentFan1Speed != 0)
-					ShmSysConfigAndInfo->SysInfo.SystemFanRotaSpeed = ShmFanModuleData->PresentFan1Speed;
-				else if (ShmFanModuleData->PresentFan2Speed != 0)
-					ShmSysConfigAndInfo->SysInfo.SystemFanRotaSpeed = ShmFanModuleData->PresentFan2Speed;
-				else if (ShmFanModuleData->PresentFan3Speed != 0)
-					ShmSysConfigAndInfo->SysInfo.SystemFanRotaSpeed = ShmFanModuleData->PresentFan3Speed;
-				else if (ShmFanModuleData->PresentFan4Speed != 0)
-					ShmSysConfigAndInfo->SysInfo.SystemFanRotaSpeed = ShmFanModuleData->PresentFan4Speed;
+				ShmSysConfigAndInfo->SysInfo.SystemFanRotaSpeed = _setFanSpeed;
 
 				gettimeofday(&_priority_time, NULL);
 				if (isCharging)
 				{
-					if (ShmFanModuleData->PresentFan1Speed < MAX_FAN_SPEED ||
-						ShmFanModuleData->PresentFan2Speed < MAX_FAN_SPEED ||
-						ShmFanModuleData->PresentFan3Speed < MAX_FAN_SPEED ||
-						ShmFanModuleData->PresentFan4Speed < MAX_FAN_SPEED)
-					{
-						ShmFanModuleData->SetFan1Speed = MAX_FAN_SPEED;
-						ShmFanModuleData->SetFan2Speed = MAX_FAN_SPEED;
-						ShmFanModuleData->SetFan3Speed = MAX_FAN_SPEED;
-						ShmFanModuleData->SetFan4Speed = MAX_FAN_SPEED;
-					}
+//					if (ShmFanModuleData->PresentFan1Speed < MAX_FAN_SPEED ||
+//						ShmFanModuleData->PresentFan2Speed < MAX_FAN_SPEED ||
+//						ShmFanModuleData->PresentFan3Speed < MAX_FAN_SPEED ||
+//						ShmFanModuleData->PresentFan4Speed < MAX_FAN_SPEED)
+//					{
+//						ShmFanModuleData->SetFan1Speed = MAX_FAN_SPEED;
+//						ShmFanModuleData->SetFan2Speed = MAX_FAN_SPEED;
+//						ShmFanModuleData->SetFan3Speed = MAX_FAN_SPEED;
+//						ShmFanModuleData->SetFan4Speed = MAX_FAN_SPEED;
+//					}
+
+					// 在還沒問到 PSU 溫度~ 還是要有個最小轉速
+					ShmFanModuleData->SetFan1Speed = MIN_FAN_SPEED;
+					ShmFanModuleData->SetFan2Speed = MIN_FAN_SPEED;
+					ShmFanModuleData->SetFan3Speed = MIN_FAN_SPEED;
+					ShmFanModuleData->SetFan4Speed = MIN_FAN_SPEED;
 
 					if (ShmFanModuleData->TestFanSpeed > 0)
 					{
@@ -2066,16 +2022,16 @@ int main(void)
 				}
 				else
 				{
-					if (ShmFanModuleData->PresentFan1Speed > MIN_FAN_SPEED ||
-						ShmFanModuleData->PresentFan2Speed > MIN_FAN_SPEED ||
-						ShmFanModuleData->PresentFan3Speed > MIN_FAN_SPEED ||
-						ShmFanModuleData->PresentFan4Speed > MIN_FAN_SPEED)
-					{
+//					if (ShmFanModuleData->PresentFan1Speed > MIN_FAN_SPEED ||
+//						ShmFanModuleData->PresentFan2Speed > MIN_FAN_SPEED ||
+//						ShmFanModuleData->PresentFan3Speed > MIN_FAN_SPEED ||
+//						ShmFanModuleData->PresentFan4Speed > MIN_FAN_SPEED)
+//					{
 						ShmFanModuleData->SetFan1Speed = MIN_FAN_SPEED;
 						ShmFanModuleData->SetFan2Speed = MIN_FAN_SPEED;
 						ShmFanModuleData->SetFan3Speed = MIN_FAN_SPEED;
 						ShmFanModuleData->SetFan4Speed = MIN_FAN_SPEED;
-					}
+//					}
 
 					// 停止時,如溫度還是很高,則需要維持該轉速直到溫度降低
 					if (ShmFanModuleData->TestFanSpeed >= MAX_FAN_SPEED)

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


+ 135 - 62
EVSE/Projects/DS60-120/Apps/Module_PsuComm.c

@@ -8,13 +8,14 @@
 #define NO					0
 #define DERATING			30
 #define ELEMENT_NOT_FIND	255
-#define CHK_VOL_RANGE		20
+#define CHK_VOL_RANGE		50
 #define CHK_CUR_RANGE		10
 #define DERATING_RANGE		100
-#define ZERO_CURRENT		0
-#define ZERO_VOLTAGE		10
+#define ZERO_CURRENT		10			// 該值須保持最小為 1A
+#define ZERO_VOLTAGE		50
 #define STOP_CURRENT		30
 #define PSU_MIN_CUR			100
+#define EQUAL				0
 
 struct SysConfigAndInfo			*ShmSysConfigAndInfo;
 struct StatusCodeData 			*ShmStatusCodeData;
@@ -523,16 +524,15 @@ void GetFanSpeedCallback(byte address, unsigned int fanSpeed)
 void GetIavailableCallback(byte address, unsigned short Iavail, unsigned short Vext)
 {
 	if (IsOverModuleCount(address))
-			return;
+		return;
 
+	//PRINTF_FUNC("address = %d, Iavail = %d \n", address, Iavail);
 	byte group = FindTargetGroup(address);
 
 	if (group == 1)
 		address -= ShmPsuData->PsuGroup[group - 1].GroupPresentPsuQuantity;
 
 	//PRINTF_FUNC("group = %d, address_%d, Iavail = %d \n", group, address, Iavail);
-
-	// PSU Group - 電壓
 	ShmPsuData->PsuGroup[group].PsuModule[address].IAvailableCurrent = Iavail;
 
 	bool isPass = true;
@@ -574,6 +574,7 @@ void GetIavailableCallback(byte address, unsigned short Iavail, unsigned short V
 
 	if (isPass)
 	{
+		//PRINTF_FUNC("rating pass value = %d \n", totalCur);
 		chargingInfo[group]->DeratingChargingCurrent = totalCur;
 	}
 }
@@ -669,7 +670,7 @@ void Initialization()
 		{
 			if (!FindChargingInfoData(_index, &chargingInfo[0]))
 			{
-				DEBUG_ERROR("EvComm (main) : FindChargingInfoData false \n");
+				DEBUG_ERROR("Module_PsuComm : FindChargingInfoData false \n");
 				isPass = false;
 				break;
 			}
@@ -680,6 +681,62 @@ void Initialization()
 		ShmPsuData->GroupCount = 1;
 	else
 		ShmPsuData->GroupCount = _gunCount;
+
+	char EvsePower[2];
+
+	EvsePower[2] = '\0';
+	char count = 0;
+	byte psuTarIndex = 0;
+	// 解析 ModelName 取得各槍各有幾個 PSU 及編號
+	if (strlen((char *) ShmSysConfigAndInfo->SysConfig.ModelName) >= 6)
+	{
+		strncpy(EvsePower, (char *)(ShmSysConfigAndInfo->SysConfig.ModelName + 4), 2);
+		if (strcmp(EvsePower, "15") == EQUAL)
+			count = 5;
+		else if (strcmp(EvsePower, "30") == EQUAL)
+			count = 1;
+		else if (strcmp(EvsePower, "60") == EQUAL)
+			count = 2;
+		else if (strcmp(EvsePower, "18") == EQUAL)
+			count = 6;
+		else if (strcmp(EvsePower, "36") == EQUAL)
+			count = 12;
+
+		if (count > 0)
+		{
+			if (ShmPsuData->GroupCount == 1)
+				conn_1_count = count;
+			else if (ShmPsuData->GroupCount == 2)
+			{
+				if(count % 2 > 0)
+					conn_1_count = (count / 2) + 1;
+				else
+					conn_1_count = (count / 2);
+
+				conn_2_count = count - conn_1_count;
+			}
+
+			for(byte psuIndex = 0; psuIndex < conn_1_count; psuIndex++)
+			{
+				connector_1[psuIndex] = psuTarIndex;
+				psuTarIndex++;
+			}
+
+			for(byte psuIndex = 0; psuIndex < conn_2_count; psuIndex++)
+			{
+				connector_2[psuIndex] = psuTarIndex;
+				psuTarIndex++;
+			}
+
+			for(byte psuIndex = 0; psuIndex < conn_1_count; psuIndex++)
+				PRINTF_FUNC("Connector 1 - Number = %d \n", connector_1[psuIndex]);
+
+			for(byte psuIndex = 0; psuIndex < conn_2_count; psuIndex++)
+				PRINTF_FUNC("Connector 2 - Number = %d \n", connector_2[psuIndex]);
+		}
+		else
+			DEBUG_ERROR("Module_PsuComm : Can't parsing model name. \n");
+	}
 }
 
 void CheckSmartChargingStep(bool isWaitingAver, bool isCharging)
@@ -711,10 +768,15 @@ void CheckSmartChargingStep(bool isWaitingAver, bool isCharging)
 			}
 			else
 			{
-				PRINTF_FUNC("=============Smart Charging : _REASSIGNED_COMP============= Step 15 \n");
+				PRINTF_FUNC("=============Smart Charging_1  : _REASSIGNED_COMP============= Step 15 \n");
 				ShmSysConfigAndInfo->SysInfo.ReAssignedFlag = _REASSIGNED_COMP;
 			}
 		}
+		else
+		{
+			PRINTF_FUNC("=============Smart Charging_2 : _REASSIGNED_COMP============= Step 15 \n");
+			ShmSysConfigAndInfo->SysInfo.ReAssignedFlag = _REASSIGNED_COMP;
+		}
 	}
 }
 
@@ -786,6 +848,7 @@ int main(void)
 				PRINTF_FUNC("== PSU == INITIAL_START \n");
 				gettimeofday(&_cmdSubPriority_time, NULL);
 				sleep(5);
+				SwitchPower(SYSTEM_CMD, PSU_POWER_OFF);
 				ShmPsuData->Work_Step = GET_PSU_COUNT;
 			}
 				break;
@@ -796,7 +859,8 @@ int main(void)
 
 				if (time > 2000)
 				{
-					PRINTF_FUNC("== PSU == %d \n", ShmPsuData->GroupCount);
+					PRINTF_FUNC("== PSU == indexCount = %d, moduleCount = %d, sysCount = %d\n",
+							ShmPsuData->GroupCount, moduleCount, ShmPsuData->SystemPresentPsuQuantity);
 //					if (ShmPsuData->GroupCount == 0)
 //						ShmPsuData->GroupCount = ShmSysConfigAndInfo->SysConfig.TotalConnectorCount;
 					// 分別取各群模組數量
@@ -872,20 +936,30 @@ int main(void)
 				break;
 			case BOOTING_COMPLETE:
 			{
+				bool isSelfTestPass = true;
+				for (byte groupIndex = 0; groupIndex < _gunCount; groupIndex++)
+				{
+					if (chargingInfo[groupIndex]->SystemStatus == S_BOOTING)
+					{
+						isSelfTestPass = false;
+					}
+				}
+
+				if (isSelfTestPass)
+					ShmPsuData->Work_Step = _WORK_CHARGING;
 				sleep(1);
 			}
 				break;
 			case _WORK_CHARGING:
 			{
 				int time = GetTimeoutValue(_cmdSubPriority_time) / 1000;
-				// sdlu - test
-				int testtime = GetTimeoutValue(_test_time) / 1000;
 
 				// 低 Priority 的指令
 				if (time > 1500)
 				{
 					isCharging = false;
 					isWaitingAver = false;
+					isReadToCharging = false;
 					for (byte index = 0; index < ShmPsuData->GroupCount; index++)
 					{
 						// Pooling Status
@@ -903,12 +977,39 @@ int main(void)
 						if (chargingInfo[index]->SystemStatus == S_CHARGING)
 						{
 							isCharging = true;
-							if ((chargingInfo[index]->PresentChargingCurrent * 10) >=
-									chargingInfo[index]->EvBatterytargetCurrent - CHK_CUR_RANGE)
+							if (ShmSysConfigAndInfo->SysInfo.ReAssignedFlag == _REASSIGNED_PREPARE_M_TO_A)
+							{
+								if (toAverVolPoint > 0 &&
+										toAverVolPoint == chargingInfo[index]->EvBatterytargetCurrent)
+								{
+									// 欲最大充 -> 均充需要等待充電中的輸出電流拉高到目標電流
+									if ((chargingInfo[index]->PresentChargingCurrent * 10) >=
+											chargingInfo[index]->EvBatterytargetCurrent - CHK_CUR_RANGE)
+									{
+										if (toAverVolCount == 0)
+											isWaitingAver = true;
+										else
+											toAverVolCount--;
+									}
+								}
+								else
+								{
+									toAverVolPoint = chargingInfo[index]->EvBatterytargetCurrent;
+									toAverVolCount = 3;
+								}
+							}
+							else
 							{
-								isWaitingAver = true;
+								toAverVolPoint = 0;
+								toAverVolCount = 3;
 							}
 						}
+
+						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))
+						{
+							isReadToCharging = true;
+						}
 					}
 
 					gettimeofday(&_cmdSubPriority_time, NULL);
@@ -1029,26 +1130,6 @@ int main(void)
 								}
 							}
 
-							// 智能判斷 End -----------------------------------------------------------
-							if (testtime > 500 &&
-								(ShmSysConfigAndInfo->SysInfo.ReAssignedFlag >= _REASSIGNED_GET_NEW_CAP &&
-										ShmSysConfigAndInfo->SysInfo.ReAssignedFlag <= _REASSIGNED_RELAY_M_TO_A))
-							{
-								PRINTF_FUNC("Gun_%d, AvailableChargingCurrent = %f, AvailableChargingPower = %f \n", groupIndex,
-										chargingInfo[groupIndex]->AvailableChargingCurrent,
-										chargingInfo[groupIndex]->AvailableChargingPower);
-
-								PRINTF_FUNC("Gun_%d, NeedVol = %f, NeedCur = %f \n", groupIndex,
-									chargingInfo[groupIndex]->EvBatterytargetVoltage,
-									chargingInfo[groupIndex]->EvBatterytargetCurrent);
-
-								PRINTF_FUNC("Gun_%d OutputVol = %f, OutputCur = %f \n", groupIndex,
-										(chargingInfo[groupIndex]->PresentChargingVoltage * 10),
-										(chargingInfo[groupIndex]->PresentChargingCurrent * 10));
-
-								gettimeofday(&_test_time, NULL);
-							}
-
 							if (ShmPsuData->SystemAvailablePower > 0)
 							{
 								// 調整輸出電流 : 漸進調整方式
@@ -1057,7 +1138,7 @@ int main(void)
 									// 當前充電中的目標電壓
 									float targetVol = chargingInfo[groupIndex]->EvBatterytargetVoltage;
 									// 當前充電中的目標電流
-									float targetCur = 0;
+									//float targetCur = 0;
 									// 準備切出去的模塊電流
 									float deratingCur = 0;
 
@@ -1088,10 +1169,11 @@ int main(void)
 											}
 										}
 
+										// ***********直接降低要移除的模塊電流即可*************
 										// 因為爬的速度沒有降的速度快,所以採兩倍速度爬升
-										targetCur = ShmPsuData->PsuGroup[groupIndex].GroupPresentOutputCurrent + (DERATING_RANGE * 2);
-										if (targetCur >= chargingInfo[groupIndex]->EvBatterytargetCurrent)
-												targetCur = chargingInfo[groupIndex]->EvBatterytargetCurrent;
+//										targetCur = ShmPsuData->PsuGroup[groupIndex].GroupPresentOutputCurrent + (DERATING_RANGE * 2);
+//										if (targetCur >= chargingInfo[groupIndex]->EvBatterytargetCurrent)
+//												targetCur = chargingInfo[groupIndex]->EvBatterytargetCurrent;
 
 										if (targetVol == 0)
 										{
@@ -1156,38 +1238,20 @@ int main(void)
 									// 閒置端與車端要求電壓接近
 									PRINTF_FUNC("=============Smart Charging : _REASSIGNED_RELAY_A_TO_M============= Step 13 \n");
 									ShmSysConfigAndInfo->SysInfo.ReAssignedFlag = _REASSIGNED_RELAY_A_TO_M;
-									GetTimeoutValue(_averageComp_time);
+									gettimeofday(&_averageComp_time, NULL);
 								}
 							}
 							else if(ShmSysConfigAndInfo->SysInfo.ReAssignedFlag == _REASSIGNED_WAITING)
 							{
 								int avrTime = GetTimeoutValue(_averageComp_time) / 1000;
 
-								if (avrTime > 3000)
+								if (avrTime > 10000)
 								{
 									// 閒置端與車端要求電壓接近
-									PRINTF_FUNC("=============Smart Charging : _REASSIGNED_COMP============= Step 15 \n");
+									PRINTF_FUNC("=============Smart Charging_0 : _REASSIGNED_COMP============= Step 15 \n");
 									ShmSysConfigAndInfo->SysInfo.ReAssignedFlag = _REASSIGNED_COMP;
 								}
 							}
-							// 智能判斷 End -----------------------------------------------------------
-							if (testtime > 500 &&
-									(ShmSysConfigAndInfo->SysInfo.ReAssignedFlag >= _REASSIGNED_ADJUST_A_TO_M && ShmSysConfigAndInfo->SysInfo.ReAssignedFlag <= _REASSIGNED_WAITING))
-							{
-								PRINTF_FUNC("Gun_%d, AvailableChargingCurrent = %f, AvailableChargingPower = %f \n", groupIndex,
-									chargingInfo[groupIndex]->AvailableChargingCurrent,
-									chargingInfo[groupIndex]->AvailableChargingPower);
-
-								PRINTF_FUNC("Gun_%d, NeedVol = %f, NeedCur = %f \n", groupIndex,
-									chargingInfo[groupIndex]->EvBatterytargetVoltage,
-									chargingInfo[groupIndex]->EvBatterytargetCurrent);
-
-								PRINTF_FUNC("Gun_%d OutputVol = %f, OutputCur = %f \n", groupIndex,
-									(chargingInfo[groupIndex]->PresentChargingVoltage * 10),
-									(chargingInfo[groupIndex]->PresentChargingCurrent * 10));
-
-								gettimeofday(&_test_time, NULL);
-							}
 
 							if (chargingInfo[groupIndex]->AvailableChargingCurrent > 0)
 							{
@@ -1264,7 +1328,7 @@ int main(void)
 									}
 								}
 							}
-							else
+							else if (chargingInfo[groupIndex]->SystemStatus == S_COMPLETE)
 							{
 								// 代表充電的槍依舊在充電,欲進入充電的槍取消充電了
 								if (ShmSysConfigAndInfo->SysInfo.ReAssignedFlag >= _REASSIGNED_PREPARE_M_TO_A &&
@@ -1276,8 +1340,17 @@ int main(void)
 						}
 						else if (ShmSysConfigAndInfo->SysInfo.MainChargingMode == _MAIN_CHARGING_MODE_AVER)
 						{
-							SwitchPower(groupIndex, PSU_POWER_OFF);
-							FlashLed(groupIndex, PSU_FLASH_NORMAL);
+							if (!isReadToCharging)
+							{
+								SwitchPower(SYSTEM_CMD, PSU_POWER_OFF);
+								FlashLed(SYSTEM_CMD, PSU_FLASH_NORMAL);
+							}
+							else
+							{
+								SwitchPower(groupIndex, PSU_POWER_OFF);
+								FlashLed(groupIndex, PSU_FLASH_NORMAL);
+							}
+							ShmSysConfigAndInfo->SysInfo.ReAssignedFlag = _REASSIGNED_NONE;
 						}
 					}
 				}

+ 8 - 2
EVSE/Projects/DS60-120/Apps/Module_PsuComm.h

@@ -48,6 +48,12 @@ struct timeval _test_time;
 
 bool isCharging = false;
 bool isWaitingAver = false;
+bool isReadToCharging = false;
 
-int connector_1[] = {0};
-int connector_2[] = {1};
+float toAverVolPoint;
+byte toAverVolCount;
+
+int connector_1[12];
+int connector_2[12];
+byte conn_1_count = 0;
+byte conn_2_count = 0;

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


+ 35 - 21
EVSE/Projects/DS60-120/Apps/main.c

@@ -118,7 +118,7 @@ bool isModelNameMatch = true;
 
 int rfidFd = -1;
 char* rfidPortName = "/dev/ttyS2";
-char* fwVersion = "D0.10.00.0000.00";
+char* fwVersion = "D0.11.00.0000.00";
 
 //================================================
 // initial can-bus
@@ -1149,11 +1149,11 @@ void InitialShareMemoryInfo()
 		else if (strcmp(EvsePower, "36") == EQUAL)
 			buf_pow = 360;
 
+		ShmSysConfigAndInfo->SysConfig.RatingCurrent = (buf_pow / 30) * 100;
+
 		if(ShmSysConfigAndInfo->SysConfig.MaxChargingPower == 0 ||
 				ShmSysConfigAndInfo->SysConfig.MaxChargingPower > buf_pow)
 			ShmSysConfigAndInfo->SysConfig.MaxChargingPower = buf_pow;
-
-		ShmSysConfigAndInfo->SysConfig.RatingCurrent = (ShmSysConfigAndInfo->SysConfig.MaxChargingPower / 30) * 100;
 	}
 	ShmSysConfigAndInfo->SysConfig.SwitchDebugFlag = NO;
 	ShmSysConfigAndInfo->SysConfig.AlwaysGfdFlag = NO;
@@ -1783,9 +1783,9 @@ void _DetectEvseChargingEnableTimeout(byte gunIndex)
 
 void _PrepareTimeout(byte gunIndex)
 {
-	PRINTF_FUNC("*********** _PrechargeTimeout ***********\n");
+	PRINTF_FUNC("*********** _PrepareTimeout ***********\n");
 	setChargerMode(gunIndex, MODE_IDLE);
-	ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuNoResource = NO;
+	ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuNoResource = YES;
 	_AutoReturnTimeout();
 }
 
@@ -1828,7 +1828,6 @@ void AuthorizingStart()
 
 void ClearAuthorizedFlag()
 {
-	ShmOCPP16Data->SpMsg.bits.AuthorizeReq = NO;
 	ShmOCPP16Data->SpMsg.bits.AuthorizeConf = NO;
 	ShmSysConfigAndInfo->SysInfo.AuthorizeFlag = NO;
 }
@@ -2405,15 +2404,14 @@ void UserScanFunction()
 		// 先判斷現在是否可以提供刷卡
 		// 1. 如果當前沒有槍是閒置狀態,則無提供刷卡功能
 		// 2. 停止充電
+		if (ShmSysConfigAndInfo->SysInfo.PageIndex == _LCM_FIX)
+		{
+			strcpy((char *)ShmSysConfigAndInfo->SysConfig.UserId, "");
+			return;
+		}
+
 		for (byte i = 0; i < ShmSysConfigAndInfo->SysConfig.TotalConnectorCount; i++)
 		{
-			if (ShmSysConfigAndInfo->SysInfo.PageIndex == _LCM_FIX ||
-					(chargingInfo[i]->SystemStatus >= S_AUTHORIZING && chargingInfo[i]->SystemStatus <= S_PREPARNING) ||
-					(chargingInfo[i]->SystemStatus >= S_TERMINATING && chargingInfo[i]->SystemStatus < S_COMPLETE))
-			{
-				strcpy((char *)ShmSysConfigAndInfo->SysConfig.UserId, "");
-				return;
-			}
 			if (chargingInfo[i]->SystemStatus == S_CHARGING)
 			{
 				stopReq = i;
@@ -2450,7 +2448,7 @@ void UserScanFunction()
 			}
 			else if (stopReq < ShmSysConfigAndInfo->SysConfig.TotalConnectorCount &&
 					chargingInfo[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->SystemStatus == S_CHARGING &&
-					(_acgunIndex > 0 && ShmSysConfigAndInfo->SysInfo.CurGunSelectedByAc == NO_DEFINE))
+					(_acgunIndex <= 0 || (_acgunIndex > 0 && ShmSysConfigAndInfo->SysInfo.CurGunSelectedByAc == NO_DEFINE)))
 			{
 				char value[32];
 
@@ -2465,18 +2463,17 @@ void UserScanFunction()
 				}
 				strcpy((char *)ShmSysConfigAndInfo->SysConfig.UserId, "");
 			}
-			else if (chargingInfo[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->SystemStatus == S_COMPLETE)
-			{
-				strcpy((char *)ShmSysConfigAndInfo->SysConfig.UserId, "");
-			}
 			else if (idleReq)
 			{
-				if (ShmSysConfigAndInfo->SysConfig.TotalConnectorCount > 1 && stopReq != 255 && ShmSysConfigAndInfo->SysInfo.IsAlternatvieConf == YES)
+				if (ShmSysConfigAndInfo->SysConfig.TotalConnectorCount > 1 &&
+						stopReq != 255 &&
+						ShmSysConfigAndInfo->SysInfo.IsAlternatvieConf == YES)
 				{
 					idleReq = false;
 					strcpy((char *)ShmSysConfigAndInfo->SysConfig.UserId, "");
 				}
-				else
+				else if ((_acgunIndex > 0 && ShmSysConfigAndInfo->SysInfo.CurGunSelectedByAc == DEFAULT_AC_INDEX) ||
+						chargingInfo[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->SystemStatus == S_IDLE)
 				{
 					PRINTF_FUNC("// LCM => Authorizing \n");
 					// LCM => Authorizing
@@ -2484,6 +2481,8 @@ void UserScanFunction()
 					// 進入確認卡號狀態
 					AuthorizingStart();
 				}
+				else
+					strcpy((char *)ShmSysConfigAndInfo->SysConfig.UserId, "");
 			}
 			else
 			{
@@ -3634,6 +3633,14 @@ bool IsConnectorWholeIdle()
 	return result;
 }
 
+void ClearAlarmCodeWhenAcOff()
+{
+	if (!ShmSysConfigAndInfo->SysInfo.AcContactorStatus)
+	{
+		ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuNoResource = NO;
+	}
+}
+
 int main(void)
 {
 	if(CreateShareMemory() == 0)
@@ -3739,6 +3746,8 @@ int main(void)
 		OcppRemoteStartChk();
 		// 讀卡邏輯
 		ScannerCardProcess();
+		// 當 AC 沒有搭上時,清除一些錯誤碼
+		ClearAlarmCodeWhenAcOff();
 
 		if (_acgunIndex > 0 && isDetectPlugin() && !isCardScan)
 		{
@@ -3956,6 +3965,11 @@ int main(void)
 								}
 							}
 						}
+						else if (ShmSysConfigAndInfo->SysInfo.MainChargingMode == _MAIN_CHARGING_MODE_AVER &&
+								ShmSysConfigAndInfo->SysInfo.ReAssignedFlag != _REASSIGNED_NONE)
+						{
+							continue;
+						}
 					}
 
 					if (isRessign)
@@ -3976,7 +3990,7 @@ int main(void)
 					if (ShmSysConfigAndInfo->SysInfo.ReAssignedFlag == _REASSIGNED_NONE ||
 							ShmSysConfigAndInfo->SysInfo.MainChargingMode == _MAIN_CHARGING_MODE_AVER)
 					{
-							setChargerMode(gun_index, MODE_PRECHARGE);
+						setChargerMode(gun_index, MODE_PRECHARGE);
 					}
 					else if (ShmSysConfigAndInfo->SysInfo.ReAssignedFlag == _REASSIGNED_RELAY_M_TO_A &&
 						ShmSysConfigAndInfo->SysInfo.BridgeRelayStatus == NO)

BIN
EVSE/Projects/DS60-120/Images/MLO


BIN
EVSE/Projects/DS60-120/Images/ramdisk.gz


BIN
EVSE/Projects/DS60-120/Images/u-boot.img


+ 1 - 1
board-support/linux-4.9.59+gitAUTOINC+a75d8e9305-ga75d8e9305/.version

@@ -1 +1 @@
-25
+31