瀏覽代碼

V7.2.0.0.0_20220909
1 新旧电路板的霍尔传感器、温度采集和母线电流采样的硬件不一致,通过软件识别来兼容两个不同的电路板;
2 停机时间根据踏频线性调整;
3 优化Smart档骑行体验;
4 修改温度保护条件;旧板:单片机100度,绕组130度保护。新板:单片机90度,绕组130度,MOS管105度保护;
5 无码表模式初始化放在硬件版本识别完后再执行;
6 版本号更新为V7.2.0.0.0_20220909;

white.xu 2 年之前
父節點
當前提交
cc3b50da55

+ 55 - 22
Core/Src/adc.c

@@ -451,30 +451,56 @@ void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
 	static int32_t GasSensorFltSum = 0, HardwareVersionADFltSum=0;
 	static TrueOrFalse_Flag_Struct_t MOS_NTC_InitFinishedFlag = FALSE;
 	//更新PCB温度,绕组温度,MCU温度
-	T_PCB_Sum += ADC1_Result[ADC1_RANK_NTC_PCB];
-	T_Coil_Sum += ADC1_Result[ADC1_RANK_NTC_COIL];
-	T_MCU_Sum += ADC1_Result[ADC1_RANK_TP_MCU];
-	T_Filt_Cnt++;
-	if(T_Filt_Cnt >= 3000)
+	if(VersionIdentifyFinishedFlag == FALSE) //硬件版本未识别前,温度默认为25度
 	{
-	  //计算PCB温度
-		MC_RunInfo.T_PCB = GetNTCTempera(T_PCB_Sum / 3000);
-		T_PCB_Sum = 0;
-		//计算绕组温度
-		MC_RunInfo.T_Coil = GetNTCTempera(T_Coil_Sum / 3000);
-		T_Coil_Sum = 0;
-		//MCU温度根据PCB初始温度进行校准
-		if(T_MCU_Init_Flag == FALSE)
+		MC_RunInfo.T_PCB  = 65;
+		MC_RunInfo.T_Coil = 65;
+		MC_RunInfo.T_MCU  = 65;
+	}
+	else
+	{
+		if( MC_HallSensorData.InverterExistFlag == FALSE ) 
 		{
-		  T_MCU_Init = MC_RunInfo.T_PCB;//校准时温度
-			T_MCU_Init_AD = T_MCU_Sum / 3000;//校准时AD值
-			T_MCU_Init_Flag = TRUE;
+			if(MOS_NTC_InitFinishedFlag == FALSE)
+			{
+				MOS_NTC_InitFinishedFlag = TRUE;
+				MOS_NTC_Init();
+			}		
+		}
+		T_PCB_Sum += ADC1_Result[ADC1_RANK_NTC_PCB];
+		T_Coil_Sum += ADC1_Result[ADC1_RANK_NTC_COIL];
+		T_MCU_Sum += ADC1_Result[ADC1_RANK_TP_MCU];
+		T_Filt_Cnt++;
+		if(T_Filt_Cnt >= 3000)
+		{
+			if( MC_HallSensorData.InverterExistFlag == FALSE )
+			{
+				MC_RunInfo.T_PCB  = GetNTCTempera_20K(T_PCB_Sum / 3000);
+				MC_RunInfo.T_Coil = GetNTCTempera_20K(T_Coil_Sum / 3000);
+				MC_RunInfo.T_MCU  = GetNTCTempera_20K(T_MCU_Sum / 3000); //MOS管NTC温度
+			}
+			else
+			{
+				//计算PCB温度
+				MC_RunInfo.T_PCB = GetNTCTempera(T_PCB_Sum / 3000);				
+				//计算绕组温度
+				MC_RunInfo.T_Coil = GetNTCTempera(T_Coil_Sum / 3000);			
+				//MCU温度根据PCB初始温度进行校准
+				if(T_MCU_Init_Flag == FALSE)
+				{
+					T_MCU_Init = MC_RunInfo.T_PCB;//校准时温度
+					T_MCU_Init_AD = T_MCU_Sum / 3000;//校准时AD值
+					T_MCU_Init_Flag = TRUE;
+				}
+				//计算MCU温度 
+				MC_RunInfo.T_MCU = T_MCU_Init + ((int16_t)(T_MCU_Init_AD - T_MCU_Sum / 3000) * 192 >> 10);//4.3mV/度, 3300 / 4095 / 4.3 * 1024 = 192
+				
+			}
+			T_Filt_Cnt = 0;
+			T_PCB_Sum = 0;
+			T_Coil_Sum = 0;
+			T_MCU_Sum = 0;
 		}
-		//计算MCU温度 		
-		MC_RunInfo.T_MCU = T_MCU_Init + ((int16_t)(T_MCU_Init_AD - T_MCU_Sum / 3000) * 192 >> 10);//4.3mV/度, 3300 / 4095 / 4.3 * 1024 = 192
-		T_MCU_Sum = 0;
-		
-		T_Filt_Cnt = 0;
 	}
 	
 	//更新母线电压 
@@ -487,7 +513,14 @@ void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
 	}
 	
 	//更新母线电流
-	Temp_32 = (ADC1_Result[ADC1_RANK_CURRENT] - uw_current_offset) * 50000 >> 11;
+	if( MC_HallSensorData.InverterExistFlag == FALSE )
+	{
+		Temp_32 = (ADC1_Result[ADC1_RANK_CURRENT] - uw_current_offset) * 39449 >> 10; //3300/4095* 0.98/8.2 /0.0025
+	}
+	else
+	{
+		Temp_32 = (ADC1_Result[ADC1_RANK_CURRENT] - uw_current_offset) * 50000 >> 11;  //3300/4095* 0.98/13 /0.0025
+	}
 	Temp_32 = (Temp_32 <= 0) ? 0 : ((Temp_32 >= 50000) ? 50000 : Temp_32);
 	IdcFltSum += ((Temp_32 << 10) - IdcFltSum) >> 9;
 	MC_RunInfo.BusCurrent = IdcFltSum >> 10;

+ 4 - 2
Core/Src/main.c

@@ -221,7 +221,10 @@ int main(void)
 		  	RunPeriodTestCnt = 0;
 			}
 			#endif
-
+			//硬件版本识别
+			GetHardware_Versin( HardwareVersion_AD );
+			//无码表模式初始化处理
+			NoPBUMode_Ini();	
 			//CAN数据解析及处理
 			CanRx_Process();
 			
@@ -324,7 +327,6 @@ int main(void)
 			
 			//定时发送传感器数据给TE
 			MC_TE_SensorData_Process(&MC_TE_SensorData);
-			GetHardware_Versin( HardwareVersion_AD );
 			
 			//指拨模式计算函数
 			SpdProportion_calculate();

文件差異過大導致無法顯示
+ 2419 - 2419
MDK-ARM/QD007A_CTL_APP/QD007A_CTL_APP_CRC.hex


二進制
MDK-ARM/bin/QD007A_CTL_APP.bin


+ 1 - 0
User/Inc/tasks.h

@@ -23,4 +23,5 @@ extern void MC_DeviceCheck(Device_CheckInfo_Struct_t* p_Device, MC_ErrorCode_Str
 extern void Cal_SyncClockFreq(uint16_t* Result);
 extern void MC_TemperatureLogProcess(void);
 extern void MC_TE_SensorScan(MC_TE_SensorData_Struct_t* p_MC_TE_SensorData);
+extern void NoPBUMode_Ini( void );
 #endif

+ 1 - 1
User/Inc/tim.h

@@ -56,7 +56,7 @@ extern TIM_HandleTypeDef htim3;
 #define PWM_PERIOD      ((uint16_t)(CKTIM / (uint32_t)(2 * PWM_FREQ * (PWM_PRSC+1))))
 	 
 #define CKTIM	          ((uint32_t)72000000uL)	 
-#define DEADTIME_NS	    ((uint16_t)500)	 //150ns
+#define DEADTIME_NS	    ((uint16_t)1600)	 //800ns
 #define DEADTIME        (uint16_t)((unsigned long long) CKTIM / 2 * (unsigned long long) DEADTIME_NS / 1000000000uL) 
 /* USER CODE END Private defines */
 

+ 1 - 1
User/Inc/var.h

@@ -489,7 +489,7 @@ extern MC_AvgPower_Struct_t MC_AvgPower;
 extern MCU_Manufacturter_Struct_t MCUManufacturer;                         
 extern uint16_t SpeedRatio;
 extern uint16_t HardwareVersion_AD;
-extern TrueOrFalse_Flag_Struct_t VersionIdentifyExecuteFlag;
+extern TrueOrFalse_Flag_Struct_t VersionIdentifyFinishedFlag;
 /**************************全局变量声明End***************************/
 
 /**************************全局函数声明Begin*************************/

+ 8 - 4
User/Src/cadence_sensor.c

@@ -156,10 +156,14 @@ void CadenceSensor_Process(MC_CadenceResult_Struct_t* p_MC_CadenceResult, uint16
 	p_MC_CadenceResult->Cadence_Data = (uint8_t)(Cadence_ActiveFlt >> 10);
 	
 	//Í£»úÅжÏ
-	if(p_MC_CadenceResult->Cadence_Data < (1500 / StopDelayTime))
-	{
-	  StopDelayTime *= 3;
-	}
+	/*
+  n < 20rpm, k = 3
+  n > 40rpm, k = 1
+  20rpm <= n <= 40rpm, k = -0.1 * n + 5,???k??100?
+  */  
+  uint16_t k = 100;
+  k = (CadenceTemp < 20) ? 300 : ((CadenceTemp > 40) ? 100 : (500 - CadenceTemp * 10));
+  StopDelayTime = k * StopDelayTime / 100;
 	if((HAL_GetTick() - CadenceStopJudgeTimeCnt) > StopDelayTime)
 	{
 		p_MC_CadenceResult->IsStopFlag = TRUE;

+ 5 - 3
User/Src/hardware_check.c

@@ -41,9 +41,9 @@ void GetHardware_Versin(uint16_t VolaVal)
 	
 	if(HAL_GetTick() > timecount) //2sºó¿ªÊ¼Ê¶±ð
 	{
-		if(VersionIdentifyExecuteFlag == FALSE)
+		if(VersionIdentifyFinishedFlag == FALSE)
 		{
-			VersionIdentifyExecuteFlag = TRUE;
+			
 			
 //			strncpy(MC_VerInfo.FW_Version, (char*)"                 ", 16);						
 //			sprintf(&MC_VerInfo.FW_Version[0], "%4u", VolaVal);
@@ -65,11 +65,13 @@ void GetHardware_Versin(uint16_t VolaVal)
 					if(VolaVal <= Hardware_ADTable[Count])
 					{
 						strncpy(MC_VerInfo.HW_Version, (char*)"TTKZ019A.", 9);
-						MC_VerInfo.HW_Version[7] = Hardware_VersionTable[Count];
+						MC_VerInfo.HW_Version[7] =Hardware_VersionTable[Count];
+						VersionIdentifyFinishedFlag = TRUE;
 						return ;
 					}
 				}
 			}
+			VersionIdentifyFinishedFlag = TRUE;
 	  }
   }
 }

+ 9 - 7
User/Src/motor_control.c

@@ -973,7 +973,15 @@ MC_CalParam_Struct_t MC_AssistRunMode_Torque_Process(uint16_t SenorData, MC_Gear
 				//控制输入给定减速斜率
 				TorqueDecStep = MC_AssisParam.Gear_SMART.DecCnt;
 				//助力比控制系数
-				Torque_Temp = (uint32_t)(MC_TorqueProcess_Param.TorqueApp * MC_TorqueProcess_Param.TorqueApp) / (MC_AssisParam.Gear_SMART.TorqueApp_TH);
+				if(MC_TorqueProcess_Param.TorqueApp < 510)
+				{
+					Torque_Temp = (uint16_t)((uint32_t)(MC_TorqueProcess_Param.TorqueApp * Coefficient_GainCal(MC_AssisParam.Gear_NORM.Gain_K >> 1, MC_AssisParam.Gear_NORM.Gain_K, MC_AssisParam.Gear_NORM.TorqueApp_TH, MC_TorqueProcess_Param.TorqueApp)) >> 10);
+				}
+				else
+				{
+					Torque_Temp = (uint32_t)(MC_TorqueProcess_Param.TorqueApp * MC_TorqueProcess_Param.TorqueApp) / (MC_AssisParam.Gear_SMART.TorqueApp_TH);
+				}				
+				
 				//根据助力增益调节助力比
 				Torque_Temp = Torque_Temp * MC_ConfigParam1.UserAdjParam_SMART.Assist_K_GAIN / 100;
 				//给定下限
@@ -1203,12 +1211,6 @@ void MC_Init(void)
 	TorqueOffSetData_Process(&TorqueSensor_2_Param.Torque_OffSetData, ADC1_Result[ADC1_RANK_TORQUE_SENSOR_2]);//112ms
 	TorqueOffSetData_Process(&TorqueSensor_3_Param.Torque_OffSetData, ADC1_Result[ADC1_RANK_TORQUE_SENSOR_3]);//112ms
 	
-	//智能档位初始化处理
-	if(MC_ConfigParam1.NoPBU_Flag == MC_SUPPORT_ENABLE)
-	{
-	  MC_ControlCode.GearSt = MC_GearSt_SMART;
-		Update_MC_ControlCode_Back();
-	}
 	
 	//12V驱动电源初始化
 	Power12V_Driver_Init();

+ 30 - 10
User/Src/protect_check.c

@@ -253,10 +253,19 @@ void MC_Protect_OverHeat_Process(uint8_t T_MCU, uint8_t T_PCB, uint8_t T_Coil, u
 	
 	if(p_MC_ErrorCode->ERROR_Bit.Protect_OverTemp == 0)
 	{
-		//单片机100度保护,绕组130度保护
-		if( (T_PCB < (TH - 25))&&(T_Coil < (TH + 5)) ) 
-		{
-			OT_Set_TimeCnt = HAL_GetTick();
+		if( MC_HallSensorData.InverterExistFlag==TRUE ) 
+		{	//单片机100度保护,绕组130度保护
+			if( (T_PCB < (TH - 25))&&(T_Coil < (TH + 5)) ) 
+			{
+				OT_Set_TimeCnt = HAL_GetTick();
+			}
+		}
+		else
+		{ //单片机90度保护,绕组130度保护,MOS管105度保护
+			if( (T_PCB < (TH - 35))&&(T_Coil < (TH + 5))&&(T_MCU < (TH - 20)) ) 
+			{
+				OT_Set_TimeCnt = HAL_GetTick();
+			}
 		}
 		//过热保护判断
 		if((HAL_GetTick() - OT_Set_TimeCnt) > 5000)
@@ -273,11 +282,22 @@ void MC_Protect_OverHeat_Process(uint8_t T_MCU, uint8_t T_PCB, uint8_t T_Coil, u
 	}
 	else
 	{
-		//过热保护恢复 PCB温度小于100度,绕组温度小于105度,且保护时间大于5分钟
-		if(( (T_PCB < (TH - 25)) && (T_Coil < (TH  - 20)) ) && ((HAL_GetTick() - OT_Reset_TimeCnt) > 300000))
+		if( MC_HallSensorData.InverterExistFlag==TRUE )
 		{
-			p_MC_ErrorCode->ERROR_Bit.Protect_OverTemp = 0;
-			OT_Set_TimeCnt = HAL_GetTick();
+			//过热保护恢复 PCB温度小于90度,绕组温度小于105度,且保护时间大于5分钟
+			if(( (T_PCB < (TH - 35)) && (T_Coil < (TH  - 20)) ) && ((HAL_GetTick() - OT_Reset_TimeCnt) > 300000))
+			{
+				p_MC_ErrorCode->ERROR_Bit.Protect_OverTemp = 0;
+				OT_Set_TimeCnt = HAL_GetTick();
+			}
+		}
+		else
+		{ //过热保护恢复 PCB温度小于80度,绕组温度小于105度,MOS管温度小于95度,且保护时间大于5分钟
+			if(( (T_PCB < (TH - 45)) && (T_Coil < (TH  - 20))&&(T_MCU < (TH  - 30)) ) && ((HAL_GetTick() - OT_Reset_TimeCnt) > 300000))
+			{
+				p_MC_ErrorCode->ERROR_Bit.Protect_OverTemp = 0;
+				OT_Set_TimeCnt = HAL_GetTick();
+			}			
 		}
 	}
 }
@@ -426,8 +446,8 @@ void MC_Protect_OverCurrent_Process(FlagStatus* OverCurrentTrigFlag, MC_ErrorCod
 void MC_Protect_Check_Process(void)
 {
 	//低压保护检测
-	MC_Protect_UnderVoltage_Process(IsComOK_BMS.IsOK_Flag, MC_RunInfo.SOC, ((IsComOK_BMS.IsOK_Flag == TRUE) ? BMS_RunInfo.Voltage : MC_RunInfo.BusVoltage), 
-	                                MC_MotorParam.Rate_Voltage, ((MC_ConfigParam1.UV_Protect_TH == 0) ? 3100 : MC_ConfigParam1.UV_Protect_TH), 
+  MC_Protect_UnderVoltage_Process(IsComOK_BMS.IsOK_Flag, MC_RunInfo.SOC, ((IsComOK_BMS.IsOK_Flag == TRUE) ? BMS_RunInfo.Voltage : MC_RunInfo.BusVoltage), 
+	                                MC_MotorParam.Rate_Voltage, ((MC_ConfigParam1.UV_Protect_TH == 0) ? 3000 : MC_ConfigParam1.UV_Protect_TH), 
 	                                &MC_ErrorCode);
 	
 	//过压保护检测

+ 19 - 0
User/Src/tasks.c

@@ -938,4 +938,23 @@ void MC_TemperatureLogProcess(void)
 	}
 }
 
+
+//无码表模式初始化处理
+void NoPBUMode_Ini( void )
+{
+	static TrueOrFalse_Flag_Struct_t NoPBUModeIniFinishedFlag = FALSE;
+	
+	if(HAL_GetTick() > 3000)
+	{
+		if( NoPBUModeIniFinishedFlag== FALSE )
+		{
+			NoPBUModeIniFinishedFlag = TRUE;
+			if(MC_ConfigParam1.NoPBU_Flag == MC_SUPPORT_ENABLE)
+			{
+				MC_ControlCode.GearSt = MC_GearSt_SMART;
+				Update_MC_ControlCode_Back();
+			}
+		}
+	}
+}
 /**************************全局函数定义结束*****************/

+ 28 - 28
User/Src/var.c

@@ -41,7 +41,7 @@ MC_AvgPower_Struct_t MC_AvgPower;                         //
 MCU_Manufacturter_Struct_t MCUManufacturer;               //MCU�낍�
 uint16_t SpeedRatio;
 uint16_t HardwareVersion_AD=0;
-TrueOrFalse_Flag_Struct_t VersionIdentifyExecuteFlag = FALSE;
+TrueOrFalse_Flag_Struct_t VersionIdentifyFinishedFlag = FALSE;
 //BMS칵훰�셕斤口
 const BMS_DesignInfo_Struct_t BMS_DesignInfo_Default =
 {
@@ -184,46 +184,46 @@ const uint16_t Ver_Table[11] =
 //ECO도貫燎제꽝鑒
 const nGearParam_Struct_t GearParam_Default_ECO_Volans =
 {
-  (uint16_t)327,
+  (uint16_t)392,
 	(uint16_t)0,
 	(uint16_t)100,
 	(uint16_t)800,
+	(uint8_t)2,
 	(uint8_t)1,
-	(uint8_t)1,
-	(uint16_t)250
+	(uint16_t)512
 };
 
 //NORM도貫燎제꽝鑒
 const nGearParam_Struct_t GearParam_Default_NORM_Volans =
 {
-  (uint16_t)655,
+  (uint16_t)786,
 	(uint16_t)0,
 	(uint16_t)100,
 	(uint16_t)1000,
 	(uint8_t)2,
 	(uint8_t)1,
-	(uint16_t)500
+	(uint16_t)686
 };
 
 //SPORT도貫燎제꽝鑒
 const nGearParam_Struct_t GearParam_Default_SPORT_Volans =
 {
-  (uint16_t)1024,
-	(uint16_t)0,
+  (uint16_t)1309,
+	(uint16_t)700,
 	(uint16_t)100,
 	(uint16_t)1300,
 	(uint8_t)3,
 	(uint8_t)1,
-	(uint16_t)750
+	(uint16_t)870
 };
 
 //TURBO도貫燎제꽝鑒
 const nGearParam_Struct_t GearParam_Default_TURBO_Volans =
 {
-  (uint16_t)1310,
-	(uint16_t)0,
+  (uint16_t)1964,
+	(uint16_t)840,
 	(uint16_t)100,
-	(uint16_t)1800,
+	(uint16_t)2100,
 	(uint8_t)5,
 	(uint8_t)1,
 	(uint16_t)1024
@@ -232,10 +232,10 @@ const nGearParam_Struct_t GearParam_Default_TURBO_Volans =
 //SMART도貫燎제꽝鑒
 const nGearParam_Struct_t GearParam_Default_SMART_Volans =
 {
-  (uint16_t)1000,
-	(uint16_t)2000,
+  (uint16_t)0,
+	(uint16_t)460,
 	(uint16_t)100,
-	(uint16_t)1600,
+	(uint16_t)2100,
 	(uint8_t)4,
 	(uint8_t)1,
 	(uint16_t)1024
@@ -245,44 +245,44 @@ const nGearParam_Struct_t GearParam_Default_SMART_Volans =
 //ECO도貫燎제꽝鑒
 const nGearParam_Struct_t GearParam_Default_ECO_Volans_Plus =
 {
-  (uint16_t)377,
+  (uint16_t)452,
 	(uint16_t)0,
 	(uint16_t)100,
 	(uint16_t)840,
+	(uint8_t)2,
 	(uint8_t)1,
-	(uint8_t)1,
-	(uint16_t)338
+	(uint16_t)512
 };
 
 //NORM도貫燎제꽝鑒
 const nGearParam_Struct_t GearParam_Default_NORM_Volans_Plus =
 {
-  (uint16_t)795,
+  (uint16_t)954,
 	(uint16_t)0,
 	(uint16_t)100,
 	(uint16_t)1200,
 	(uint8_t)2,
 	(uint8_t)1,
-	(uint16_t)605
+	(uint16_t)686
 };
 
 //SPORT도貫燎제꽝鑒
 const nGearParam_Struct_t GearParam_Default_SPORT_Volans_Plus =
 {
   (uint16_t)1504,
-	(uint16_t)0,
+	(uint16_t)700,
 	(uint16_t)100,
 	(uint16_t)1590,
 	(uint8_t)3,
 	(uint8_t)1,
-	(uint16_t)850
+	(uint16_t)870
 };
 
 //TURBO도貫燎제꽝鑒
 const nGearParam_Struct_t GearParam_Default_TURBO_Volans_Plus =
 {
   (uint16_t)2354,
-	(uint16_t)0,
+	(uint16_t)840,
 	(uint16_t)100,
 	(uint16_t)2100,
 	(uint8_t)5,
@@ -293,8 +293,8 @@ const nGearParam_Struct_t GearParam_Default_TURBO_Volans_Plus =
 //SMART도貫燎제꽝鑒
 const nGearParam_Struct_t GearParam_Default_SMART_Volans_Plus =
 {
-  (uint16_t)1000,
-	(uint16_t)2000,
+  (uint16_t)0,
+	(uint16_t)460,
 	(uint16_t)100,
 	(uint16_t)2100,
 	(uint8_t)4,
@@ -355,7 +355,7 @@ const nGearParam_Struct_t GearParam_Default_TURBO_Pegasi =
 const nGearParam_Struct_t GearParam_Default_SMART_Pegasi =
 {
   (uint16_t)0,
-	(uint16_t)560,
+	(uint16_t)460,
 	(uint16_t)0,
 	(uint16_t)2100,
 	(uint8_t)4,
@@ -416,7 +416,7 @@ const nGearParam_Struct_t GearParam_Default_TURBO_Pegasi_Plus =
 const nGearParam_Struct_t GearParam_Default_SMART_Pegasi_Plus =
 {
   (uint16_t)0,
-	(uint16_t)560,
+	(uint16_t)460,
 	(uint16_t)0,
 	(uint16_t)2100,
 	(uint8_t)4,
@@ -500,7 +500,7 @@ void Var_Init(void)
 		
 	//MC경굶斤口놓迦뺏,Mode뵨SN닒EEPROM뗍혤
 	strncpy(MC_VerInfo.HW_Version, (char*)"TTKZ010D.       ", 16);
-	strncpy(MC_VerInfo.FW_Version, (char*)"V7r2r0_20220722C", 16);
+	strncpy(MC_VerInfo.FW_Version, (char*)"V7r2r0_20220909C", 16);
   #if NormalWork
 	MC_VerInfo.FW_Version[15] = '.';
   #endif

部分文件因文件數量過多而無法顯示