ソースを参照

Merge branch 'DS60-120'

FolusWen 4 年 前
コミット
4b2bc0e39f

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


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

@@ -1 +1,5 @@
+<<<<<<< HEAD
 37
+=======
+31
+>>>>>>> DS60-120