Module_PsuComm.c 67 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080
  1. #include "Module_PsuComm.h"
  2. #define ARRAY_SIZE(A) (sizeof(A) / sizeof(A[0]))
  3. #define PASS 1
  4. #define FAIL -1
  5. #define YES 1
  6. #define NO 0
  7. #define NORMAL 0
  8. #define ABNORMAL 1
  9. #define SHARE_CURRENT_GAP 40
  10. #define RELEASE_CUR_GAP 40
  11. #define PSU_DEFAULT_ADDR 255
  12. #define PSU_MIN_VOL 1500
  13. #define EQUAL 0
  14. #define CMD_DELAY_TIME 25000
  15. #define PSU_MIN_OUTPUT_CUR 0.4 // 1A
  16. // 安全在停止充電程序中斷開 Relay 的電流
  17. #define SEFETY_SWITCH_RELAY_CUR 50
  18. #define PSU_GONE_RESET 30
  19. #define PSU_NONE 0
  20. struct SysConfigAndInfo *ShmSysConfigAndInfo;
  21. struct StatusCodeData *ShmStatusCodeData;
  22. struct PsuData *ShmPsuData;
  23. struct DcCommonInformation *ShmDcCommonData;
  24. struct SmartBoxData *ShmSmartBoxData;
  25. bool libInitialize = false;
  26. byte getAvailableCapOffset = 5;
  27. byte deratingKeepCount = 0;
  28. byte step3KeepCount = 0;
  29. byte psuCmdSeq = _PSU_CMD_STATUS;
  30. float chargingOutputLogInfo[2][4];
  31. byte ConnectorUsingSeq[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY][4] =
  32. {{0, 2, 3, 1}, {1, 3, 2, 0}};
  33. void PRINTF_FUNC(char *string, ...);
  34. int StoreLogMsg(const char *fmt, ...);
  35. #define DEBUG_INFO(format, args...) StoreLogMsg("[%s:%d][%s][Info] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
  36. #define DEBUG_WARN(format, args...) StoreLogMsg("[%s:%d][%s][Warn] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
  37. #define DEBUG_ERROR(format, args...) StoreLogMsg("[%s:%d][%s][Error] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
  38. int GetTimeoutValue(struct timespec *startTime);
  39. long int GetTimeoutMValue(struct timespec *startTime)
  40. {
  41. struct timespec endTime;
  42. clock_gettime(CLOCK_MONOTONIC, &endTime);
  43. return 1000 * (endTime.tv_sec - startTime->tv_sec) + (endTime.tv_nsec - startTime->tv_nsec) / 1000000;
  44. }
  45. void GetTimespecMFunc(struct timespec *time)
  46. {
  47. clock_gettime(CLOCK_MONOTONIC, time);
  48. }
  49. int GetTimeoutValue(struct timespec *startTime)
  50. {
  51. struct timespec endTime;
  52. clock_gettime(CLOCK_MONOTONIC_COARSE, &endTime);
  53. return endTime.tv_sec - startTime->tv_sec;
  54. }
  55. void GetTimespecFunc(struct timespec *time)
  56. {
  57. clock_gettime(CLOCK_MONOTONIC_COARSE, time);
  58. }
  59. int StoreLogMsg(const char *fmt, ...)
  60. {
  61. char Buf[4096+256];
  62. char buffer[4096];
  63. va_list args;
  64. struct timeb SeqEndTime;
  65. struct tm *tm;
  66. va_start(args, fmt);
  67. int rc = vsnprintf(buffer, sizeof(buffer), fmt, args);
  68. va_end(args);
  69. memset(Buf,0,sizeof(Buf));
  70. ftime(&SeqEndTime);
  71. SeqEndTime.time = time(NULL);
  72. tm=localtime(&SeqEndTime.time);
  73. if (ShmSysConfigAndInfo->SysConfig.SwitchDebugFlag == YES)
  74. {
  75. sprintf(Buf,"%02d:%02d:%02d:%03d - %s",
  76. tm->tm_hour,tm->tm_min,tm->tm_sec,SeqEndTime.millitm, buffer);
  77. printf("%s \n", Buf);
  78. }
  79. else
  80. {
  81. sprintf(Buf,"echo \"%04d-%02d-%02d %02d:%02d:%02d:%03d - %s\" >> /Storage/SystemLog/[%04d.%02d]SystemLog_%s_Log",
  82. tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,SeqEndTime.millitm,
  83. buffer,
  84. tm->tm_year+1900,tm->tm_mon+1,
  85. ShmSysConfigAndInfo->SysConfig.SerialNumber);
  86. system(Buf);
  87. }
  88. return rc;
  89. }
  90. void PRINTF_FUNC(char *string, ...)
  91. {
  92. va_list args;
  93. char buffer[4096];
  94. va_start(args, string);
  95. vsnprintf(buffer, sizeof(buffer), string, args);
  96. va_end(args);
  97. DEBUG_INFO("%s ", buffer);
  98. }
  99. //=================================
  100. // Common routine
  101. //=================================
  102. bool FindTargetGpAndAddr(byte sourceAddr, byte *gp, byte *psuIndex)
  103. {
  104. bool result = false;
  105. for (byte _gp = 0; _gp < ShmPsuData->GroupCount; _gp++)
  106. {
  107. for (byte _psu = 0; _psu < ShmPsuData->PsuGroup[_gp].GroupPresentPsuQuantity; _psu++)
  108. {
  109. if (ShmPsuData->PsuGroup[_gp].PsuModule[_psu].Address == sourceAddr)
  110. {
  111. *gp = _gp;
  112. *psuIndex = _psu;
  113. result = true;
  114. return result;
  115. }
  116. }
  117. }
  118. PRINTF_FUNC("Can't find Psu index : %d \n", sourceAddr);
  119. return result;
  120. }
  121. //=================================
  122. // Save data to share memory Function
  123. //=================================
  124. bool FindChargingInfoData(byte target, struct ChargingInfoData **chargingData)
  125. {
  126. for (byte index = 0; index < CHAdeMO_QUANTITY; index++)
  127. {
  128. if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == target)
  129. {
  130. chargingData[target] = &ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index];
  131. return true;
  132. }
  133. }
  134. for (byte index = 0; index < CCS_QUANTITY; index++)
  135. {
  136. if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == target)
  137. {
  138. chargingData[target] = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[index];
  139. return true;
  140. }
  141. }
  142. for (byte index = 0; index < GB_QUANTITY; index++)
  143. {
  144. if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == target)
  145. {
  146. chargingData[target] = &ShmSysConfigAndInfo->SysInfo.GbChargingData[index];
  147. return true;
  148. }
  149. }
  150. return false;
  151. }
  152. //=================================
  153. // Alarm code mapping to share memory Function
  154. //=================================
  155. // 檢查 Byte 中某個 Bit 的值
  156. // _byte : 欲改變的 byte
  157. // _bit : 該 byte 的第幾個 bit
  158. int mask_table[] = {
  159. 0x00000001, 0x00000002, 0x00000004, 0x00000008,
  160. 0x00000010, 0x00000020, 0x00000040, 0x00000080,
  161. 0x00000100, 0x00000200, 0x00000400, 0x00000800,
  162. 0x00001000, 0x00002000, 0x00004000, 0x00008000,
  163. 0x00010000, 0x00020000, 0x00040000, 0x00080000,
  164. 0x00100000, 0x00200000, 0x00400000, 0x00800000,
  165. 0x01000000, 0x02000000, 0x04000000, 0x08000000,
  166. 0x10000000, 0x20000000, 0x40000000, 0x80000000
  167. };
  168. // INFY POWER
  169. #define NONE_DEFINE_1 0
  170. #define NONE_DEFINE_2 1
  171. #define FUSE_BURN_OUT 2
  172. #define PFC_DC_COMM_FAIL 3
  173. #define NONE_DEFINE_3 4
  174. #define NONE_DEFINE_4 5
  175. #define UNBALANCE_POSI_NEGA_BUS_VOL 6
  176. #define BUS_OVER_VOL 7
  177. #define BUS_ABNORMAL_VOL 8
  178. #define PHASE_OVP 9
  179. #define ID_REPETITION 10
  180. #define BUS_UVP 11
  181. #define PHASE_LOSE 12
  182. #define NONE_DEFINE_5 13
  183. #define PHASE_UVP 14
  184. #define NONE_DEFINE_6 15
  185. #define CAN_COMM_FAULT 16
  186. #define DC_DC_UNEVEN_CUR_SHARING 17
  187. #define NONE_DEFINE_7 18
  188. #define PFC_POW_OFF 19
  189. #define NONE_DEFINE_8 20
  190. #define FULL_SPEED_OF_FAN 21
  191. #define DC_DC_POW_OFF 22
  192. #define MODULE_UNDER_POW_LIMIT 23
  193. #define TEMP_POW_LIMIT 24
  194. #define AC_POW_LIMIT 25
  195. #define DC_DC_EEPROM_FAULT 26
  196. #define FAN_FAULT 27
  197. #define DC_DC_SHORT_CIRCUIT 28
  198. #define PFC_EEPROM_FAULT 29
  199. #define DC_DC_OTP 30
  200. #define DC_DC_OVP 31
  201. // UU POWER
  202. #define AC_SITE_OVP 0
  203. #define AC_SITE_UVP 1
  204. #define AC_OVP_SHUTDOWN 2
  205. #define PSU_INTERNAL_OVP 3
  206. #define PFC_INTERNAL_UVP 4
  207. #define PFC_INTERNAL_UNBALANCE 5
  208. #define DC_OUTPUT_OVP 6
  209. #define DC_OVP_SHUTDOWN 7
  210. #define DC_OUTPUT_UVP 8
  211. #define FAN_DONT_WORK 9
  212. #define UU_NONE_DEFINE_1 10
  213. #define UU_FAN_FAULT 11
  214. #define ENV_OTP 12
  215. #define ENV_UTP 13
  216. #define PFC_OTP 14
  217. #define OUTPUT_RELAY_BROKEN 15
  218. #define DC_OTP 16
  219. #define UU_NONE_DEFINE_2 17
  220. #define UU_PFC_DC_COMM_FAIL 18
  221. #define UU_NONE_DEFINE_3 19
  222. #define PFC_BROKEN 20
  223. #define DC_TO_DC_BROKEN 21
  224. #define UU_NONE_DEFINE_4 22
  225. #define UU_NONE_DEFINE_5 23
  226. #define UU_NONE_DEFINE_6 24
  227. #define DC_TO_DC_DONT_WORK 25
  228. #define UU_NONE_DEFINE_7 26
  229. #define UU_NONE_DEFINE_8 27
  230. #define DC_OUTPUT_VOLTAGE_UNBALANCE 28
  231. #define UU_ID_REPETITION 29
  232. #define NONE_DEFINE_9 30
  233. #define ABNORMAL_DISCHARGE_CIRCUIT 31
  234. unsigned char DetectBitValue(int _value, unsigned char _bit)
  235. {
  236. return ( _value & mask_table[_bit] ) != 0x00;
  237. }
  238. bool AbnormalStopAnalysis(byte gun_index, int errCode)
  239. {
  240. bool isErr = false;
  241. for(byte count = 0; count < sizeof(mask_table)/sizeof(mask_table[0]); count++)
  242. {
  243. byte value = DetectBitValue(errCode, count);
  244. if (value == 1)
  245. {
  246. switch(count)
  247. {
  248. case NONE_DEFINE_1 : {} break;
  249. case NONE_DEFINE_2 : {} break;
  250. case FUSE_BURN_OUT :
  251. {
  252. isErr = true;
  253. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuFuseBurnOut == NO)
  254. {
  255. PRINTF_FUNC("PSU AbnormalStop : FUSE_BURN_OUT \n");
  256. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuFuseBurnOut = YES;
  257. }
  258. } break;
  259. case PFC_DC_COMM_FAIL :
  260. {
  261. isErr = true;
  262. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuPfcAndDcdcCommFault == NO)
  263. {
  264. PRINTF_FUNC ( "PSU AbnormalStop : PFC_DC_COMM_FAIL \n" );
  265. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuPfcAndDcdcCommFault = YES;
  266. }
  267. } break;
  268. case NONE_DEFINE_3 : {} break;
  269. case NONE_DEFINE_4 : {} break;
  270. case UNBALANCE_POSI_NEGA_BUS_VOL :
  271. {
  272. isErr = true;
  273. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuBusVoltageUnbalance == NO)
  274. {
  275. PRINTF_FUNC ( "PSU AbnormalStop : UNBALANCE_POSI_NEGA_BUS_VOL \n" );
  276. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuBusVoltageUnbalance = YES;
  277. }
  278. } break;
  279. case BUS_OVER_VOL :
  280. {
  281. isErr = true;
  282. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuBusOverVoltage == NO)
  283. {
  284. PRINTF_FUNC ( "PSU AbnormalStop : BUS_OVER_VOL \n" );
  285. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuBusOverVoltage = YES;
  286. }
  287. } break;
  288. case BUS_ABNORMAL_VOL :
  289. {
  290. isErr = true;
  291. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuBusVoltageAbnormal == NO)
  292. {
  293. PRINTF_FUNC ( "PSU AbnormalStop : BUS_ABNORMAL_VOL \n" );
  294. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuBusVoltageAbnormal = YES;
  295. }
  296. } break;
  297. case PHASE_OVP :
  298. {
  299. isErr = true;
  300. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuPhaseOvp == NO)
  301. {
  302. PRINTF_FUNC ( "PSU AbnormalStop : PHASE_OVP \n" );
  303. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuPhaseOvp = YES;
  304. }
  305. } break;
  306. case ID_REPETITION :
  307. {
  308. isErr = true;
  309. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuIdRepeat == NO)
  310. {
  311. PRINTF_FUNC ( "PSU AbnormalStop : ID_REPETITION \n" );
  312. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuIdRepeat = YES;
  313. }
  314. } break;
  315. case BUS_UVP :
  316. {
  317. isErr = true;
  318. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuBusUnderVoltage == NO)
  319. {
  320. PRINTF_FUNC ( "PSU AbnormalStop : BUS_UVP \n" );
  321. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuBusUnderVoltage = YES;
  322. }
  323. } break;
  324. case PHASE_LOSE :
  325. {
  326. isErr = true;
  327. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuInputPhaseLoss == NO)
  328. {
  329. PRINTF_FUNC ( "PSU AbnormalStop : PHASE_LOSE \n" );
  330. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuInputPhaseLoss = YES;
  331. }
  332. } break;
  333. case NONE_DEFINE_5 : {} break;
  334. case PHASE_UVP :
  335. {
  336. isErr = true;
  337. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.DcInputUVP == NO)
  338. {
  339. PRINTF_FUNC ( "PSU AbnormalStop : PHASE_UVP \n" );
  340. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.DcInputUVP = YES;
  341. }
  342. } break;
  343. case NONE_DEFINE_6 : {} break;
  344. case CAN_COMM_FAULT :
  345. {
  346. isErr = true;
  347. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuCanCommFault == NO)
  348. {
  349. PRINTF_FUNC ( "PSU AbnormalStop : CAN_COMM_FAULT \n" );
  350. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuCanCommFault = YES;
  351. }
  352. } break;
  353. case DC_DC_UNEVEN_CUR_SHARING :
  354. {
  355. isErr = true;
  356. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuSevereUnevenCurrent == NO)
  357. {
  358. PRINTF_FUNC ( "PSU AbnormalStop : DC_DC_UNEVEN_CUR_SHARING \n" );
  359. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuSevereUnevenCurrent = YES;
  360. }
  361. } break;
  362. case NONE_DEFINE_7 : {} break;
  363. case PFC_POW_OFF :
  364. {
  365. //if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuPfcPowOff == NO)
  366. {
  367. //PRINTF_FUNC ( "PSU AbnormalStop : PFC_POW_OFF \n" );
  368. //ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuPfcPowOff = YES;
  369. }
  370. } break;
  371. case NONE_DEFINE_8 : {} break;
  372. case FULL_SPEED_OF_FAN :
  373. {
  374. isErr = true;
  375. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuFanFullSpeed == NO)
  376. {
  377. PRINTF_FUNC ( "PSU AbnormalStop : FULL_SPEED_OF_FAN \n" );
  378. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuFanFullSpeed = YES;
  379. }
  380. } break;
  381. case DC_DC_POW_OFF :
  382. {
  383. //if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuDcDcPowOff == NO)
  384. {
  385. //PRINTF_FUNC ( "PSU AbnormalStop : DC_DC_POW_OFF \n" );
  386. //ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuDcDcPowOff = YES;
  387. }
  388. } break;
  389. case MODULE_UNDER_POW_LIMIT :
  390. {
  391. isErr = true;
  392. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuPowerLimitedState == NO)
  393. {
  394. PRINTF_FUNC("PSU AbnormalStop : MODULE_UNDER_POW_LIMIT \n");
  395. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuPowerLimitedState = YES;
  396. }
  397. } break;
  398. case TEMP_POW_LIMIT :
  399. {
  400. isErr = true;
  401. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuTemperaturePowerLimit == NO)
  402. {
  403. PRINTF_FUNC ( "PSU AbnormalStop : TEMP_POW_LIMIT \n" );
  404. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuTemperaturePowerLimit = YES;
  405. }
  406. } break;
  407. case AC_POW_LIMIT :
  408. {
  409. isErr = true;
  410. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuAcPowerLimit == NO)
  411. {
  412. PRINTF_FUNC ( "PSU AbnormalStop : AC_POW_LIMIT \n" );
  413. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuAcPowerLimit = YES;
  414. }
  415. } break;
  416. case DC_DC_EEPROM_FAULT :
  417. {
  418. isErr = true;
  419. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuDcdcEepromFault == NO)
  420. {
  421. PRINTF_FUNC ( "PSU AbnormalStop : DC_DC_EEPROM_FAULT \n" );
  422. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuDcdcEepromFault = YES;
  423. }
  424. } break;
  425. case FAN_FAULT :
  426. {
  427. isErr = true;
  428. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuFanFailureAlarm == NO)
  429. {
  430. PRINTF_FUNC ( "PSU AbnormalStop : FAN_FAULT \n" );
  431. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuFanFailureAlarm = YES;
  432. }
  433. } break;
  434. case DC_DC_SHORT_CIRCUIT :
  435. {
  436. isErr = true;
  437. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuOutputShortCircuit == NO)
  438. {
  439. PRINTF_FUNC ( "PSU AbnormalStop : DC_DC_SHORT_CIRCUIT \n" );
  440. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuOutputShortCircuit = YES;
  441. }
  442. } break;
  443. case PFC_EEPROM_FAULT :
  444. {
  445. isErr = true;
  446. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuPfcEepromFault == NO)
  447. {
  448. PRINTF_FUNC ( "PSU AbnormalStop : PFC_EEPROM_FAULT \n" );
  449. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuPfcEepromFault = YES;
  450. }
  451. } break;
  452. case DC_DC_OTP :
  453. {
  454. isErr = true;
  455. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuDcDcOtp == NO)
  456. {
  457. PRINTF_FUNC ( "PSU AbnormalStop : DC_DC_OTP \n" );
  458. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuDcDcOtp = YES;
  459. }
  460. } break;
  461. case DC_DC_OVP :
  462. {
  463. isErr = true;
  464. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuDcDcOvp == NO)
  465. {
  466. PRINTF_FUNC ( "PSU AbnormalStop : DC_DC_OVP \n" );
  467. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuDcDcOvp = YES;
  468. }
  469. } break;
  470. }
  471. }
  472. }
  473. return isErr;
  474. }
  475. bool AbnormalStopAnalysis_UU(byte gun_index, int errCode)
  476. {
  477. bool isErr = false;
  478. for(byte count = 0; count < sizeof(mask_table)/sizeof(mask_table[0]); count++)
  479. {
  480. byte value = DetectBitValue(errCode, count);
  481. if (value == 1)
  482. {
  483. switch(count)
  484. {
  485. case AC_SITE_OVP :
  486. {
  487. isErr = true;
  488. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuBusOverVoltage == NO)
  489. {
  490. PRINTF_FUNC ( "PSU AbnormalStop : AC_SITE_OVP \n" );
  491. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuBusOverVoltage = YES;
  492. }
  493. }
  494. break;
  495. case AC_SITE_UVP :
  496. {
  497. isErr = true;
  498. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuBusVoltageAbnormal == NO)
  499. {
  500. PRINTF_FUNC ( "PSU AbnormalStop : AC_SITE_UVP \n" );
  501. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuBusVoltageAbnormal = YES;
  502. }
  503. }
  504. break;
  505. case AC_OVP_SHUTDOWN :
  506. {
  507. isErr = true;
  508. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuAcPowerLimit == NO)
  509. {
  510. PRINTF_FUNC ( "PSU AbnormalStop : AC_OVP_SHUTDOWN \n" );
  511. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuAcPowerLimit = YES;
  512. }
  513. }
  514. break;
  515. case PSU_INTERNAL_OVP :
  516. {
  517. isErr = true;
  518. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuFuseBurnOut == NO)
  519. {
  520. PRINTF_FUNC("PSU AbnormalStop : PSU_INTERNAL_OVP \n");
  521. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuFuseBurnOut = YES;
  522. }
  523. }
  524. break;
  525. case PFC_INTERNAL_UVP :
  526. {
  527. isErr = true;
  528. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuBusUnderVoltage == NO)
  529. {
  530. PRINTF_FUNC ( "PSU AbnormalStop : PFC_INTERNAL_UVP \n" );
  531. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuBusUnderVoltage = YES;
  532. }
  533. }
  534. break;
  535. case PFC_INTERNAL_UNBALANCE :
  536. {
  537. isErr = true;
  538. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuSevereUnevenCurrent == NO)
  539. {
  540. PRINTF_FUNC ( "PSU AbnormalStop : PFC_INTERNAL_UNBALANCE \n" );
  541. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuSevereUnevenCurrent = YES;
  542. }
  543. }
  544. break;
  545. case DC_OUTPUT_OVP :
  546. {
  547. isErr = true;
  548. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuDcDcOvp == NO)
  549. {
  550. PRINTF_FUNC ( "PSU AbnormalStop : DC_OUTPUT_OVP \n" );
  551. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuDcDcOvp = YES;
  552. }
  553. }
  554. break;
  555. case DC_OVP_SHUTDOWN :
  556. {
  557. isErr = true;
  558. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuPowerLimitedState == NO)
  559. {
  560. PRINTF_FUNC("PSU AbnormalStop : DC_OVP_SHUTDOWN \n");
  561. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuPowerLimitedState = YES;
  562. }
  563. }
  564. break;
  565. case DC_OUTPUT_UVP :
  566. {
  567. isErr = true;
  568. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuPhaseOvp == NO)
  569. {
  570. PRINTF_FUNC ( "PSU AbnormalStop : DC_OUTPUT_UVP \n" );
  571. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuPhaseOvp = YES;
  572. }
  573. }
  574. break;
  575. case FAN_DONT_WORK :
  576. {
  577. isErr = true;
  578. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuFanFullSpeed == NO)
  579. {
  580. PRINTF_FUNC ( "PSU AbnormalStop : FAN_DONT_WORK \n" );
  581. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuFanFullSpeed = YES;
  582. }
  583. }
  584. break;
  585. case UU_NONE_DEFINE_1 : {} break;
  586. case UU_FAN_FAULT :
  587. {
  588. // if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuFanFailureAlarm == NO)
  589. // {
  590. // PRINTF_FUNC ( "PSU AbnormalStop : UU_FAN_FAULT \n" );
  591. // ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuFanFailureAlarm = YES;
  592. // }
  593. }
  594. break;
  595. case ENV_OTP :
  596. {
  597. isErr = true;
  598. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuTemperaturePowerLimit == NO)
  599. {
  600. PRINTF_FUNC ( "PSU AbnormalStop : ENV_OTP \n" );
  601. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuTemperaturePowerLimit = YES;
  602. }
  603. }
  604. break;
  605. case ENV_UTP :
  606. {
  607. isErr = true;
  608. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuDcDcOtp == NO)
  609. {
  610. PRINTF_FUNC ( "PSU AbnormalStop : ENV_UTP \n" );
  611. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuDcDcOtp = YES;
  612. }
  613. }
  614. break;
  615. case PFC_OTP :
  616. {
  617. isErr = true;
  618. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuTemperaturePowerLimit == NO)
  619. {
  620. PRINTF_FUNC ( "PSU AbnormalStop : ENV_OTP \n" );
  621. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuTemperaturePowerLimit = YES;
  622. }
  623. }
  624. break;
  625. case OUTPUT_RELAY_BROKEN :
  626. {
  627. isErr = true;
  628. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuTemperaturePowerLimit == NO)
  629. {
  630. PRINTF_FUNC ( "PSU AbnormalStop : OUTPUT_RELAY_BROKEN \n" );
  631. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuTemperaturePowerLimit = YES;
  632. }
  633. }
  634. break;
  635. case DC_OTP :
  636. {
  637. isErr = true;
  638. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuTemperaturePowerLimit == NO)
  639. {
  640. PRINTF_FUNC ( "PSU AbnormalStop : DC_OTP \n" );
  641. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuTemperaturePowerLimit = YES;
  642. }
  643. }
  644. break;
  645. case UU_NONE_DEFINE_2 : {} break;
  646. case UU_PFC_DC_COMM_FAIL :
  647. {
  648. isErr = true;
  649. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuPfcAndDcdcCommFault == NO)
  650. {
  651. PRINTF_FUNC ( "PSU AbnormalStop : UU_PFC_DC_COMM_FAIL \n" );
  652. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuPfcAndDcdcCommFault = YES;
  653. }
  654. }
  655. break;
  656. case UU_NONE_DEFINE_3 : {} break;
  657. case PFC_BROKEN :
  658. {
  659. isErr = true;
  660. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuPfcEepromFault == NO)
  661. {
  662. PRINTF_FUNC ( "PSU AbnormalStop : PFC_BROKEN \n" );
  663. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuPfcEepromFault = YES;
  664. }
  665. }
  666. break;
  667. case DC_TO_DC_BROKEN :
  668. {
  669. isErr = true;
  670. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuDcdcEepromFault == NO)
  671. {
  672. PRINTF_FUNC ( "PSU AbnormalStop : DC_DC_EEPROM_FAULT \n" );
  673. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuDcdcEepromFault = YES;
  674. }
  675. }
  676. break;
  677. case UU_NONE_DEFINE_4 : {} break;
  678. case UU_NONE_DEFINE_5 : {} break;
  679. case UU_NONE_DEFINE_6 : {} break;
  680. case DC_TO_DC_DONT_WORK :
  681. {
  682. // isErr = true;
  683. // if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuInputPhaseLoss == NO)
  684. // {
  685. // PRINTF_FUNC ( "PSU AbnormalStop : DC_TO_DC_DONT_WORK \n" );
  686. // ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuInputPhaseLoss = YES;
  687. // }
  688. }
  689. break;
  690. case UU_NONE_DEFINE_7 : {} break;
  691. case UU_NONE_DEFINE_8 : {} break;
  692. case DC_OUTPUT_VOLTAGE_UNBALANCE :
  693. {
  694. isErr = true;
  695. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuBusVoltageUnbalance == NO)
  696. {
  697. PRINTF_FUNC ( "PSU AbnormalStop : DC_OUTPUT_VOLTAGE_UNBALANCE \n" );
  698. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuBusVoltageUnbalance = YES;
  699. }
  700. }
  701. break;
  702. case UU_ID_REPETITION :
  703. {
  704. isErr = true;
  705. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuIdRepeat == NO)
  706. {
  707. PRINTF_FUNC ( "PSU AbnormalStop : UU_ID_REPETITION \n" );
  708. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuIdRepeat = YES;
  709. }
  710. }
  711. break;
  712. case NONE_DEFINE_9 : {} break;
  713. case ABNORMAL_DISCHARGE_CIRCUIT :
  714. {
  715. isErr = true;
  716. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuOutputShortCircuit == NO)
  717. {
  718. PRINTF_FUNC ( "PSU AbnormalStop : ABNORMAL_DISCHARGE_CIRCUIT \n" );
  719. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuOutputShortCircuit = YES;
  720. }
  721. }
  722. break;
  723. }
  724. }
  725. }
  726. return isErr;
  727. }
  728. bool IsVoltageStable(byte _index)
  729. {
  730. bool result = true;
  731. float sample = ShmDcCommonData->_outputVoltageSapmle[_index][0];
  732. if (ShmPsuData->PsuGroup[_index].GroupPresentOutputVoltage >= 1500)
  733. {
  734. for(byte i = 1; i < VOLTAGE_SAMPLE_COUNT; i++)
  735. {
  736. if (sample <= ShmDcCommonData->_outputVoltageSapmle[_index][i] - 300 ||
  737. sample >= ShmDcCommonData->_outputVoltageSapmle[_index][i] + 300)
  738. {
  739. result = false;
  740. }
  741. }
  742. //if (result)
  743. {
  744. // printf("V[0] => %f \n", ShmDcCommonData->_outputVoltageSapmle[_index][0]);
  745. // printf("V[1] => %f \n", ShmDcCommonData->_outputVoltageSapmle[_index][1]);
  746. // printf("V[2] => %f \n", ShmDcCommonData->_outputVoltageSapmle[_index][2]);
  747. // printf("V[3] => %f \n", ShmDcCommonData->_outputVoltageSapmle[_index][3]);
  748. // printf("V[4] => %f \n", ShmDcCommonData->_outputVoltageSapmle[_index][4]);
  749. }
  750. }
  751. else
  752. result = false;
  753. return result;
  754. }
  755. //=================================
  756. // Callback Function
  757. //=================================
  758. void ChkUuPwrErrOccur(unsigned address, unsigned char err1, unsigned char err2, unsigned char err3, unsigned char err4)
  759. {
  760. if (ShmPsuData->Work_Step < GET_SYS_CAP)
  761. return;
  762. byte group = 0, psuIndex = 0;
  763. FindTargetGpAndAddr(address, &group, &psuIndex);
  764. int alarm = err4 | (err3 << 8) | (err2 << 16) | (err1 << 24);
  765. if (AbnormalStopAnalysis_UU (group, alarm))
  766. {
  767. ShmPsuData->PsuGroup[group].PsuModule[psuIndex].AlarmCode = YES;
  768. // if (!ShmPsuData->PsuGroup [group].GroupErrorFlag.bits.PsuFailure)
  769. // {
  770. // ShmPsuData->PsuGroup [group].GroupErrorFlag.bits.PsuFailure = YES;
  771. // ShmPsuData->PsuStopChargeFlag = YES;
  772. // ShmDcCommonData->_isPsuErrorOccur = YES;
  773. // PRINTF_FUNC ( "Group_%d - Index_%d, PSU Error Occurred. \n", group, psuIndex );
  774. // }
  775. }
  776. else
  777. ShmPsuData->PsuGroup[group].PsuModule[psuIndex].AlarmCode = NO;
  778. }
  779. void GetStatusCallback(byte group, byte SN, byte temp, int alarm, byte type,
  780. unsigned char err1, unsigned char err2, unsigned char err3, unsigned char err4)
  781. {
  782. if (ShmDcCommonData->_psuProtocol != type)
  783. ShmDcCommonData->_psuProtocol = type;
  784. if (type == _PSU_PROTOCOL_UU)
  785. {
  786. ShmDcCommonData->psuKeepCommunication = ShmDcCommonData->acContactSwitch;
  787. int _timebuf = GetTimeoutValue ( & ShmDcCommonData->_psuComm_time );
  788. if (_timebuf > 1 || _timebuf < 0)
  789. {
  790. GetTimespecFunc ( & ShmDcCommonData->_psuComm_time );
  791. }
  792. if (ShmPsuData->Work_Step == _WORK_CHARGING)
  793. {
  794. ChkUuPwrErrOccur(SN, err1, err2, err3, err4);
  795. }
  796. }
  797. bool isFind = false;
  798. bool isComp = false;
  799. byte totalPsuQuantity = 0;
  800. if (group >= 4)
  801. return;
  802. for (byte _group = 0; _group < ShmPsuData->GroupCount; _group++)
  803. {
  804. totalPsuQuantity += ShmPsuData->PsuGroup[_group].GroupPresentPsuQuantity;
  805. }
  806. // if (type == _PSU_PROTOCOL_UU)
  807. // {
  808. // for (byte psuIndex = 0; psuIndex < ShmPsuData->PsuGroup [group].GroupPresentPsuQuantity; psuIndex ++)
  809. // {
  810. // if (ShmPsuData->PsuGroup [group].PsuModule [psuIndex].Address == PSU_DEFAULT_ADDR)
  811. // {
  812. // ShmPsuData->PsuGroup [group].PsuModule [psuIndex].Address = SN;
  813. // return;
  814. // }
  815. // }
  816. //
  817. // if (totalPsuQuantity == ShmPsuData->SystemPresentPsuQuantity &&
  818. // ShmPsuData->Work_Step < GET_SYS_CAP)
  819. // isComp = true;
  820. // }
  821. // else if (totalPsuQuantity != ShmPsuData->SystemPresentPsuQuantity &&
  822. // ShmPsuData->SystemPresentPsuQuantity > 0)
  823. if (totalPsuQuantity != ShmPsuData->SystemPresentPsuQuantity &&
  824. ShmPsuData->SystemPresentPsuQuantity > 0)
  825. {
  826. for (byte psuIndex = 0; psuIndex < ShmPsuData->PsuGroup[group].GroupPresentPsuQuantity; psuIndex++)
  827. {
  828. if (ShmPsuData->PsuGroup[group].PsuModule[psuIndex].Address == SN)
  829. {
  830. isFind = true;
  831. break;
  832. }
  833. }
  834. if(!isFind)
  835. {
  836. PRINTF_FUNC("ADD Group = %d, GroupPresentPsuQuantity = %d Psu Count = %d \n",
  837. group, ShmPsuData->PsuGroup[group].GroupPresentPsuQuantity, SN);
  838. ShmPsuData->PsuGroup[group].PsuModule[ShmPsuData->PsuGroup[group].GroupPresentPsuQuantity].Address = SN;
  839. ShmPsuData->PsuGroup[group].GroupPresentPsuQuantity++;
  840. }
  841. totalPsuQuantity = 0;
  842. for (byte _group = 0; _group < ShmPsuData->GroupCount; _group++)
  843. {
  844. totalPsuQuantity += ShmPsuData->PsuGroup[_group].GroupPresentPsuQuantity;
  845. }
  846. PRINTF_FUNC("totalPsuQuantity = %d \n", totalPsuQuantity);
  847. if (totalPsuQuantity == ShmPsuData->SystemPresentPsuQuantity)
  848. isComp = true;
  849. }
  850. if (isComp)
  851. {
  852. PRINTF_FUNC ("**************************************************************************** \n" );
  853. for (int _count = 0; _count < ShmPsuData->GroupCount; _count ++)
  854. {
  855. PRINTF_FUNC ( "Group = %d, Psu Count = %d \n", _count, ShmPsuData->PsuGroup [_count].GroupPresentPsuQuantity);
  856. for (int _Pcount = 0; _Pcount < ShmPsuData->PsuGroup [_count].GroupPresentPsuQuantity; _Pcount++)
  857. {
  858. PRINTF_FUNC ( "Address = %d \n", ShmPsuData->PsuGroup[_count].PsuModule[_Pcount].Address);
  859. }
  860. }
  861. PRINTF_FUNC ("**************************************************************************** \n" );
  862. }
  863. }
  864. void GetModuleCountCallback(byte group, byte count)
  865. {
  866. if (group == SYSTEM_CMD)
  867. {
  868. ShmPsuData->SystemPresentPsuQuantity = count;
  869. }
  870. else
  871. {
  872. // if (ShmDcCommonData->_psuProtocol == _PSU_PROTOCOL_UU)
  873. // ShmPsuData->PsuGroup[group].GroupPresentPsuQuantity = count;
  874. }
  875. }
  876. void GetAvailableCapCallback(byte address, short maxVol, short minVol, short maxCur, short totalPow)
  877. {
  878. if (ShmPsuData->Work_Step < GET_SYS_CAP)
  879. return;
  880. byte group = 0, psuIndex = 0;
  881. FindTargetGpAndAddr(address, &group, &psuIndex);
  882. ShmPsuData->PsuGroup[group].PsuModule[psuIndex].AvailablePower = totalPow;
  883. ShmPsuData->PsuGroup[group].PsuModule[psuIndex].AvailableCurrent = maxCur;
  884. ShmPsuData->PsuGroup[group].PsuModule[psuIndex].PresentMaxOutputVoltage = maxVol;
  885. }
  886. void GetFwCallback(byte address, short dcSwVer, short pfcSwVer, short hwVer, byte type)
  887. {
  888. if (ShmPsuData->Work_Step < GET_SYS_CAP)
  889. return;
  890. byte group = 0, psuIndex = 0;
  891. FindTargetGpAndAddr(address, &group, &psuIndex);
  892. sprintf((char *)ShmPsuData->PsuVersion[address].FwPrimaryVersion, "DC %d.%02d", (dcSwVer & 0xFF00) >> 8, dcSwVer & 0xFF);
  893. sprintf((char *)ShmPsuData->PsuVersion[address].FwSecondVersion, "PFC %d.%02d", (pfcSwVer & 0xFF00) >> 8, pfcSwVer & 0xFF);
  894. sprintf((char *)ShmPsuData->PsuGroup[group].PsuModule[psuIndex].FwVersion, "DC %d.%02d : PFC %d.%02d",
  895. (dcSwVer & 0xFF00) >> 8, dcSwVer & 0xFF,
  896. (pfcSwVer & 0xFF00) >> 8, pfcSwVer & 0xFF);
  897. }
  898. void GetInputVoltageCallback(byte address, unsigned short vol1, unsigned short vol2, unsigned short vol3)
  899. {
  900. if (ShmPsuData->Work_Step < GET_SYS_CAP)
  901. return;
  902. byte group = 0, psuIndex = 0;
  903. FindTargetGpAndAddr(address, &group, &psuIndex);
  904. ShmPsuData->PsuGroup[group].PsuModule[psuIndex].InputVoltageL1 = vol1;
  905. ShmPsuData->PsuGroup[group].PsuModule[psuIndex].InputVoltageL2 = vol2;
  906. ShmPsuData->PsuGroup[group].PsuModule[psuIndex].InputVoltageL3 = vol3;
  907. // PRINTF_FUNC("***Input*** address = %d, R = %d, S = %d, T = %d, gp = %d \n",
  908. // address, vol1, vol2, vol3, group);
  909. }
  910. void GetPresentOutputCallback(byte group, unsigned short outVol, unsigned short outCur)
  911. {
  912. }
  913. void GetMisCallback(byte address, unsigned int value, byte type)
  914. {
  915. if (ShmPsuData->Work_Step < GET_SYS_CAP)
  916. return;
  917. byte group = 0, psuIndex = 0;
  918. FindTargetGpAndAddr(address, &group, &psuIndex);
  919. if (type == 1)
  920. {
  921. ShmPsuData->PsuGroup[group].PsuModule[psuIndex].FanSpeed_1 = value;
  922. ShmPsuData->PsuGroup[group].PsuModule[psuIndex].FanSpeed_2 = value;
  923. ShmPsuData->PsuGroup[group].PsuModule[psuIndex].FanSpeed_3 = value;
  924. ShmPsuData->PsuGroup[group].PsuModule[psuIndex].FanSpeed_4 = value;
  925. }
  926. else if (type == 2)
  927. {
  928. ShmPsuData->PsuGroup[group].PsuModule[psuIndex].ExletTemp = value;
  929. }
  930. else if (type == 3)
  931. {
  932. printf("PFC - group = %d, index = %d, value = %d \n", group, address, value);
  933. }
  934. }
  935. void GetIavailableCallback(byte address, unsigned short Iavail, unsigned short Vext)
  936. {
  937. if (ShmPsuData->Work_Step < GET_SYS_CAP || Iavail > 1000)
  938. return;
  939. byte group = 0, psuIndex = 0;
  940. FindTargetGpAndAddr(address, &group, &psuIndex);
  941. // if (group == 2)
  942. // {
  943. // printf("V1 = %f \n", ShmDcCommonData->_outputVoltageSapmle[group][0]);
  944. // printf("V2 = %f \n", ShmDcCommonData->_outputVoltageSapmle[group][1]);
  945. // printf("V3 = %f \n", ShmDcCommonData->_outputVoltageSapmle[group][2]);
  946. // printf("V4 = %f \n", ShmDcCommonData->_outputVoltageSapmle[group][3]);
  947. // printf("V5 = %f \n", ShmDcCommonData->_outputVoltageSapmle[group][4]);
  948. // }
  949. if (IsVoltageStable(group))
  950. {
  951. ShmPsuData->PsuGroup[group].PsuModule[psuIndex].IAvailableCurrent = Iavail;
  952. ShmPsuData->PsuGroup[group].PsuModule[psuIndex].KwAvailablePower =
  953. ShmPsuData->PsuGroup[group].PsuModule[psuIndex].PresentOutputVoltage *
  954. ShmPsuData->PsuGroup[group].PsuModule[psuIndex].IAvailableCurrent / 100 / 1000;
  955. }
  956. }
  957. void GetPresentOutputFCallback(byte group, float outVol, float outCur, byte type)
  958. {
  959. if (ShmPsuData->Work_Step < GET_SYS_CAP || type == _PSU_PROTOCOL_INFY)
  960. return;
  961. for(byte count = 0; count < ShmPsuData->PsuGroup[group].GroupPresentPsuQuantity; count++)
  962. {
  963. ShmPsuData->PsuGroup[group].PsuModule[count].PresentOutputVoltage = (unsigned short)(outVol);
  964. ShmPsuData->PsuGroup[group].PsuModule[count].PresentOutputCurrent = (unsigned short)(outCur / ShmPsuData->PsuGroup[group].GroupPresentPsuQuantity);
  965. }
  966. }
  967. //==========================================
  968. // 特規用指令
  969. //==========================================
  970. void GetOutputAndTempCallback(byte address, unsigned short outputVol_s,
  971. unsigned short outputCur_s, unsigned short outputPower, unsigned char Temperature, byte type)
  972. {
  973. if (ShmPsuData->Work_Step != _WORK_CHARGING)
  974. return;
  975. byte group = 0, psuIndex = 0;
  976. FindTargetGpAndAddr(address, &group, &psuIndex);
  977. //PRINTF_FUNC("GetOutputAndTempCallback = *address = %d, group = %d, psuIndex = %d \n", address, group, psuIndex);
  978. //printf("group = %d, addr = %d \n", group, addr);
  979. ShmPsuData->PsuGroup[group].PsuModule[psuIndex].CriticalTemp1 = Temperature;
  980. ShmPsuData->PsuGroup[group].PsuModule[psuIndex].CriticalTemp2 = Temperature;
  981. ShmPsuData->PsuGroup[group].PsuModule[psuIndex].CriticalTemp3 = Temperature;
  982. // ShmPsuData->PsuGroup[group].PsuModule[psuIndex].ExletTemp = Temperature;
  983. if (type == _PSU_PROTOCOL_UU)
  984. return;
  985. // isinf : -1 = 負無窮,1 = 正無窮,0 = 其他
  986. ShmPsuData->PsuGroup[group].PsuModule[psuIndex].PresentOutputVoltage = (unsigned short)(outputVol_s);
  987. ShmPsuData->PsuGroup[group].PsuModule[psuIndex].PresentOutputCurrent = (unsigned short)(outputCur_s);
  988. }
  989. void GetModuleStatusCallback(byte address, unsigned char isErr, unsigned char status,
  990. unsigned char err1, unsigned char err2, unsigned char err3, unsigned char err4)
  991. {
  992. ShmDcCommonData->psuKeepCommunication = ShmDcCommonData->acContactSwitch;
  993. int _timebuf = GetTimeoutValue(&ShmDcCommonData->_psuComm_time);
  994. if (_timebuf > 1 || _timebuf < 0)
  995. {
  996. GetTimespecFunc(&ShmDcCommonData->_psuComm_time);
  997. }
  998. if (ShmPsuData->Work_Step != _WORK_CHARGING)
  999. return;
  1000. byte group = 0, psuIndex = 0;
  1001. FindTargetGpAndAddr(address, &group, &psuIndex);
  1002. //PRINTF_FUNC("GetModuleStatusCallback = *address = %d, group = %d, psuIndex = %d \n", address, group, psuIndex);
  1003. int alarm = err1 | (err2 << 8) | (err3 << 16) | (err4 << 24);
  1004. if(AbnormalStopAnalysis(group, alarm))
  1005. {
  1006. ShmPsuData->PsuGroup[group].PsuModule[psuIndex].AlarmCode = YES;
  1007. // if (!ShmPsuData->PsuGroup[group].GroupErrorFlag.bits.PsuFailure)
  1008. // {
  1009. // ShmPsuData->PsuGroup[group].GroupErrorFlag.bits.PsuFailure = YES;
  1010. // ShmPsuData->PsuStopChargeFlag = YES;
  1011. // ShmDcCommonData->_isPsuErrorOccur = YES;
  1012. // PRINTF_FUNC("Group_%d - Index_%d, PSU Error Occurred. \n", group, psuIndex);
  1013. // }
  1014. }
  1015. else
  1016. ShmPsuData->PsuGroup[group].PsuModule[psuIndex].AlarmCode = NO;
  1017. }
  1018. void GetModuleInputCallback(byte address, unsigned short inputR,
  1019. unsigned short inputS, unsigned short inputT)
  1020. {
  1021. if (ShmPsuData->Work_Step != _WORK_CHARGING)
  1022. return;
  1023. byte group = 0, psuIndex = 0;
  1024. FindTargetGpAndAddr(address, &group, &psuIndex);
  1025. //PRINTF_FUNC("*address = %d, group = %d, psuIndex = %d \n", address, group, psuIndex);
  1026. ShmPsuData->PsuGroup[group].PsuModule[psuIndex].InputVoltageL1 = inputR;
  1027. ShmPsuData->PsuGroup[group].PsuModule[psuIndex].InputVoltageL2 = inputS;
  1028. ShmPsuData->PsuGroup[group].PsuModule[psuIndex].InputVoltageL3 = inputT;
  1029. //PRINTF_FUNC("***Input*** address = %d, R = %d, S = %d, T = %d \n",
  1030. // address, inputR, inputS, inputT);
  1031. }
  1032. //==========================================
  1033. // Init all share memory
  1034. //==========================================
  1035. int InitShareMemory()
  1036. {
  1037. int result = PASS;
  1038. int MeterSMId;
  1039. //creat ShmSysConfigAndInfo
  1040. if ((MeterSMId = shmget(ShmSysConfigAndInfoKey, sizeof(struct SysConfigAndInfo), 0777)) < 0)
  1041. {
  1042. #ifdef SystemLogMessage
  1043. DEBUG_ERROR("shmget ShmSysConfigAndInfo NG %d \n");
  1044. #endif
  1045. result = FAIL;
  1046. }
  1047. else if ((ShmSysConfigAndInfo = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  1048. {
  1049. #ifdef SystemLogMessage
  1050. DEBUG_ERROR("shmat ShmSysConfigAndInfo NG \n");
  1051. #endif
  1052. result = FAIL;
  1053. }
  1054. //creat ShmStatusCodeData
  1055. if ((MeterSMId = shmget(ShmStatusCodeKey, sizeof(struct StatusCodeData), 0777)) < 0)
  1056. {
  1057. #ifdef SystemLogMessage
  1058. DEBUG_ERROR("shmget ShmStatusCodeData NG \n");
  1059. #endif
  1060. result = FAIL;
  1061. }
  1062. else if ((ShmStatusCodeData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  1063. {
  1064. #ifdef SystemLogMessage
  1065. DEBUG_ERROR("shmat ShmStatusCodeData NG \n");
  1066. #endif
  1067. result = FAIL;
  1068. }
  1069. //creat ShmPsuData
  1070. if ((MeterSMId = shmget(ShmPsuKey, sizeof(struct PsuData), 0777)) < 0)
  1071. {
  1072. #ifdef SystemLogMessage
  1073. DEBUG_ERROR("shmget ShmPsuData NG \n");
  1074. #endif
  1075. result = FAIL;
  1076. }
  1077. else if ((ShmPsuData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  1078. {
  1079. #ifdef SystemLogMessage
  1080. DEBUG_ERROR("shmat ShmPsuData NG \n");
  1081. #endif
  1082. result = FAIL;
  1083. }
  1084. if ((MeterSMId = shmget ( ShmSmartBoxKey, sizeof(struct SmartBoxData), IPC_CREAT | 0777 )) < 0)
  1085. {
  1086. #ifdef SystemLogMessage
  1087. DEBUG_ERROR("shmat ShmSmartBoxKey NG \n");
  1088. #endif
  1089. return FAIL;
  1090. }
  1091. else if ((ShmSmartBoxData = shmat ( MeterSMId, NULL, 0 )) == (void *) - 1)
  1092. {
  1093. #ifdef SystemLogMessage
  1094. DEBUG_ERROR("shmat ShmSmartBoxData NG \n");
  1095. #endif
  1096. return FAIL;
  1097. }
  1098. if ((MeterSMId = shmget(ShmCommonKey, sizeof(struct DcCommonInformation), IPC_CREAT | 0777)) < 0)
  1099. {
  1100. #ifdef SystemLogMessage
  1101. DEBUG_ERROR("shmget ShmCommonKey NG \n");
  1102. #endif
  1103. result = FAIL;
  1104. }
  1105. else if ((ShmDcCommonData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  1106. {
  1107. #ifdef SystemLogMessage
  1108. DEBUG_ERROR("shmat ShmCommonKey NG \n");
  1109. #endif
  1110. result = FAIL;
  1111. }
  1112. return result;
  1113. }
  1114. //================================================
  1115. // Log function
  1116. //================================================
  1117. void OutputChargingLogFuncion(byte groupIndex)
  1118. {
  1119. // 列印時機 : 需求改變時
  1120. if (chargingOutputLogInfo[groupIndex][_CHARGING_LOG_NEED_VOL] != chargingInfo[groupIndex]->EvBatterytargetVoltage * 10)
  1121. {
  1122. chargingOutputLogInfo[groupIndex][_CHARGING_LOG_NEED_VOL] = chargingInfo[groupIndex]->EvBatterytargetVoltage * 10;
  1123. chargingOutputLogInfo[groupIndex][_CHARGING_LOG_OUTPUT_VOL] = chargingInfo[groupIndex]->FireChargingVoltage;
  1124. PRINTF_FUNC("Conn %d, EV Req Voltage : %.1f (V), EVSE Output Voltage = %.1f (V) \n", groupIndex,
  1125. chargingOutputLogInfo[groupIndex][_CHARGING_LOG_NEED_VOL] / 10,
  1126. chargingOutputLogInfo[groupIndex][_CHARGING_LOG_OUTPUT_VOL] / 10);
  1127. }
  1128. if (chargingOutputLogInfo[groupIndex][_CHARGING_LOG_NEED_CUR] != chargingInfo[groupIndex]->EvBatterytargetCurrent * 10)
  1129. {
  1130. chargingOutputLogInfo[groupIndex][_CHARGING_LOG_NEED_CUR] = chargingInfo[groupIndex]->EvBatterytargetCurrent * 10;
  1131. chargingOutputLogInfo[groupIndex][_CHARGING_LOG_OUTPUT_CUR] = chargingInfo[groupIndex]->PresentChargingCurrent;
  1132. PRINTF_FUNC("Conn %d, EV Req Current : %.1f (A), EVSE Output Current = %.1f (A) \n", groupIndex,
  1133. chargingOutputLogInfo[groupIndex][_CHARGING_LOG_NEED_CUR] / 10,
  1134. chargingOutputLogInfo[groupIndex][_CHARGING_LOG_OUTPUT_CUR]);
  1135. }
  1136. }
  1137. //================================================
  1138. // Main process
  1139. //================================================
  1140. void ClearPsuAlarmCode()
  1141. {
  1142. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuFuseBurnOut = NO;
  1143. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuPfcAndDcdcCommFault = NO;
  1144. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuBusVoltageUnbalance = NO;
  1145. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuBusOverVoltage = NO;
  1146. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuBusVoltageAbnormal = NO;
  1147. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuPhaseOvp = NO;
  1148. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuIdRepeat = NO;
  1149. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuBusUnderVoltage = NO;
  1150. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuInputPhaseLoss = NO;
  1151. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.DcInputUVP = NO;
  1152. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuCanCommFault = NO;
  1153. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuSevereUnevenCurrent = NO;
  1154. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuFfcSideShutDown = NO;
  1155. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuFanFullSpeed = NO;
  1156. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuDcSideShutDown = NO;
  1157. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuPowerLimitedState = NO;
  1158. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuTemperaturePowerLimit = NO;
  1159. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuAcPowerLimit = NO;
  1160. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuDcdcEepromFault = NO;
  1161. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuFanFailureAlarm = NO;
  1162. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuOutputShortCircuit = NO;
  1163. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuPfcEepromFault = NO;
  1164. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuDcDcOtp = NO;
  1165. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuDcDcOvp = NO;
  1166. }
  1167. void Check2ClearPsuError()
  1168. {
  1169. for (byte group = 0; group < ShmPsuData->GroupCount; group++)
  1170. {
  1171. for (byte psuIndex = 0; psuIndex < ShmPsuData->PsuGroup[group].GroupPresentPsuQuantity; psuIndex++)
  1172. {
  1173. if (ShmPsuData->PsuGroup[group].PsuModule[psuIndex].AlarmCode != NO)
  1174. {
  1175. return;
  1176. }
  1177. }
  1178. }
  1179. ClearPsuAlarmCode();
  1180. }
  1181. void FindGunInfo()
  1182. {
  1183. bool isPass = false;
  1184. while ( ! isPass)
  1185. {
  1186. isPass = true;
  1187. for (byte _index = 0; _index < _gunCountRecord; _index ++)
  1188. {
  1189. if ( ! FindChargingInfoData ( _index, & chargingInfo [0] ))
  1190. {
  1191. DEBUG_ERROR( "Module_PsuComm : FindChargingInfoData false \n" );
  1192. isPass = false;
  1193. break;
  1194. }
  1195. }
  1196. sleep ( 1 );
  1197. }
  1198. }
  1199. void InitialPsuData()
  1200. {
  1201. if (ShmSysConfigAndInfo->SysInfo.IsAlternatvieConf == YES)
  1202. ShmPsuData->GroupCount = 1;
  1203. else
  1204. ShmPsuData->GroupCount = ARRAY_SIZE(ShmPsuData->PsuGroup);
  1205. ShmPsuData->SystemAvailableCurrent = 0;
  1206. ShmPsuData->SystemAvailablePower = 0;
  1207. ShmPsuData->SystemPresentPsuQuantity = 0;
  1208. for (byte _groupCount = 0; _groupCount < ShmPsuData->GroupCount; _groupCount++)
  1209. {
  1210. ShmPsuData->PsuGroup[_groupCount].GroupAvailablePower = 0;
  1211. ShmPsuData->PsuGroup[_groupCount].GroupAvailableCurrent = 0;
  1212. ShmPsuData->PsuGroup[_groupCount].GroupRealOutputPower = 0;
  1213. ShmPsuData->PsuGroup[_groupCount].GroupErrorFlag.bits.PsuFailure = NO;
  1214. ShmPsuData->PsuGroup[_groupCount].UsingTarget = GUN_CHECK;
  1215. for (byte _psuCount = 0; _psuCount < MAX_PSU_QUANTITY; _psuCount++)
  1216. ShmPsuData->PsuGroup[_groupCount].PsuModule[_psuCount].Address = PSU_DEFAULT_ADDR;
  1217. }
  1218. for(byte _gunCount = 0; _gunCount < _gunCountRecord; _gunCount++)
  1219. {
  1220. chargingInfo[_gunCount]->PresentChargingVoltage = 0;
  1221. chargingInfo[_gunCount]->PresentChargingCurrent = 0;
  1222. _releaseWait_chk[_gunCount] = false;
  1223. }
  1224. ShmPsuData->PsuStopChargeFlag = NO;
  1225. ShmDcCommonData->_isPsuErrorOccur = NO;
  1226. _delayToGetCap = 0;
  1227. }
  1228. void Await()
  1229. {
  1230. usleep(CMD_DELAY_TIME);
  1231. }
  1232. bool ClosePsuPower(byte targetConn, int target)
  1233. {
  1234. bool isStop = true;
  1235. if (target == SYSTEM_CMD)
  1236. {
  1237. for (byte groupIndex = 0; groupIndex < _gunCountRecord; groupIndex++)
  1238. {
  1239. if((chargingInfo[groupIndex]->PresentChargingCurrent * 10) > SEFETY_SWITCH_RELAY_CUR)
  1240. {
  1241. isStop = false;
  1242. }
  1243. }
  1244. if (isStop)
  1245. {
  1246. SwitchPower(SYSTEM_CMD, PSU_POWER_OFF);
  1247. }
  1248. else
  1249. {
  1250. PresentOutputVol(SYSTEM_CMD, 0, 0, ShmPsuData->SystemPresentPsuQuantity);
  1251. }
  1252. }
  1253. else if(ShmPsuData->PsuGroup[target].GroupPresentOutputCurrent > SEFETY_SWITCH_RELAY_CUR)
  1254. {
  1255. //PRINTF_FUNC ("target = %d, %d \n", target, ShmPsuData->PsuGroup[target].GroupPresentOutputCurrent);
  1256. isStop = false;
  1257. PresentOutputVol(target, 0, 0, ShmPsuData->PsuGroup[target].GroupPresentPsuQuantity); Await();
  1258. }
  1259. else
  1260. {
  1261. //PRINTF_FUNC ("close = %d \n", target);
  1262. SwitchPower(target, PSU_POWER_OFF);
  1263. FlashLed(target, PSU_FLASH_NORMAL);
  1264. }
  1265. return isStop;
  1266. }
  1267. void SwitchOffPowerCheck(byte groupIndex)
  1268. {
  1269. _maxChargingStatus = _CHARGING_GUN_STATUS_STOP;
  1270. for (byte index = 0; index < _gunCountRecord; index++)
  1271. {
  1272. // 判斷另一把槍的狀態
  1273. if (index != groupIndex)
  1274. {
  1275. if ((chargingInfo[index]->SystemStatus >= SYS_MODE_PREPARE_FOR_EV && chargingInfo[index]->SystemStatus <= SYS_MODE_CHARGING) ||
  1276. (chargingInfo[index]->SystemStatus >= SYS_MODE_CCS_PRECHARGE_STEP0 && chargingInfo[index]->SystemStatus <= SYS_MODE_CCS_PRECHARGE_STEP1))
  1277. _maxChargingStatus = _CHARGING_GUN_STATUS_CHARGING;
  1278. else
  1279. _maxChargingStatus = _CHARGING_GUN_STATUS_STOP;
  1280. }
  1281. }
  1282. }
  1283. byte GetPollingCmd()
  1284. {
  1285. if (psuCmdSeq == _PSU_CMD_CAP)
  1286. {
  1287. psuCmdSeq = _PSU_CMD_IAVAILABLE;
  1288. }
  1289. else if (psuCmdSeq == _PSU_CMD_IAVAILABLE)
  1290. {
  1291. psuCmdSeq = _PSU_CMD_OUTPUT_V;
  1292. }
  1293. else if (psuCmdSeq == _PSU_CMD_OUTPUT_V)
  1294. {
  1295. psuCmdSeq = _PSU_CMD_STATUS;
  1296. }
  1297. else if (psuCmdSeq == _PSU_CMD_STATUS)
  1298. {
  1299. if (_delay2GetPsuTemp <= 0)
  1300. psuCmdSeq = _PSU_CMD_TEMP;
  1301. else
  1302. psuCmdSeq = _PSU_CMD_CAP;
  1303. }
  1304. else
  1305. psuCmdSeq = _PSU_CMD_CAP;
  1306. return psuCmdSeq;
  1307. }
  1308. void PsuPowerON(byte targetPsuGroup)
  1309. {
  1310. // 電流 : 除上使用的模塊總數得到每一個模塊應該輸出的電流值再乘上該輸出群的模塊數量
  1311. PresentOutputVol(targetPsuGroup,
  1312. ShmPsuData->PsuGroup[targetPsuGroup].GroupTargetOutputVoltage,
  1313. ShmPsuData->PsuGroup[targetPsuGroup].GroupTargetOutputCurrent,
  1314. ShmPsuData->PsuGroup[targetPsuGroup].GroupPresentPsuQuantity);
  1315. if (ShmPsuData->PsuGroup[targetPsuGroup].PwSwitchStatus == _PSU_POWER_STATUS_OFF)
  1316. {
  1317. ShmPsuData->PsuGroup[targetPsuGroup].PwSwitchStatus = _PSU_POWER_STATUS_ON;
  1318. SwitchPower(targetPsuGroup, PSU_POWER_ON);
  1319. FlashLed(targetPsuGroup, PSU_FLASH_ON);
  1320. }
  1321. }
  1322. byte PsuPowerOFF(byte targetConn, byte targetPsuGroup)
  1323. {
  1324. if (ShmPsuData->PsuGroup[targetPsuGroup].PwSwitchStatus == _PSU_POWER_STATUS_ON)
  1325. {
  1326. // 判斷輸出是否還在
  1327. if (ClosePsuPower(targetConn, targetPsuGroup))
  1328. ShmPsuData->PsuGroup[targetPsuGroup].PwSwitchStatus = _PSU_POWER_STATUS_OFF;
  1329. }
  1330. return ShmPsuData->PsuGroup[targetPsuGroup].PwSwitchStatus;
  1331. }
  1332. void PsuOutputCurrentLimtit(byte targetGroup, unsigned short *cur)
  1333. {
  1334. //LWADD_MIN_POWER
  1335. unsigned short Psu_Min_OutputCur =
  1336. (ShmPsuData->PsuGroup[targetGroup].GroupPresentPsuQuantity * PSU_MIN_OUTPUT_CUR) * 10;
  1337. if (*cur < Psu_Min_OutputCur)
  1338. *cur = Psu_Min_OutputCur;
  1339. }
  1340. int main(void)
  1341. {
  1342. if(InitShareMemory() == FAIL)
  1343. {
  1344. #ifdef SystemLogMessage
  1345. DEBUG_ERROR("InitShareMemory NG\n");
  1346. #endif
  1347. if(ShmStatusCodeData != NULL)
  1348. {
  1349. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.FailToCreateShareMemory = 1;
  1350. }
  1351. sleep(5);
  1352. return 0;
  1353. }
  1354. PRINTF_FUNC("InitShareMemory OK\n");
  1355. // register callback function
  1356. RefreshStatus(&GetStatusCallback);
  1357. RefreshModuleCount(&GetModuleCountCallback);
  1358. RefreshAvailableCap(&GetAvailableCapCallback);
  1359. RefreshFwVersion(&GetFwCallback);
  1360. RefreshInputVol(&GetInputVoltageCallback);
  1361. RefreshGetOutput(&GetPresentOutputCallback);
  1362. RefreshMisInfo(&GetMisCallback);
  1363. RefreshIavailable(&GetIavailableCallback);
  1364. RefreshGetOutputF(&GetPresentOutputFCallback);
  1365. // GetPresentOutputCallback & GetStatusCallback
  1366. AutoMode_RefreshOutputAndTemp(&GetOutputAndTempCallback);
  1367. // GetStatusCallback
  1368. AutoMode_RefreshModuleStatus(&GetModuleStatusCallback);
  1369. // GetInputVoltageCallback
  1370. AutoMode_RefreshModuleInput(&GetModuleInputCallback);
  1371. sleep(2);
  1372. _gunCountRecord = ShmSysConfigAndInfo->SysConfig.TotalConnectorCount;
  1373. // initial object
  1374. FindGunInfo();
  1375. InitialPsuData();
  1376. GetTimespecFunc(&ShmDcCommonData->_psuComm_time);
  1377. libInitialize = InitialCommunication();
  1378. byte isInitialComp = NO;
  1379. if (ShmSysConfigAndInfo->SysInfo.IsAlternatvieConf == YES)
  1380. {
  1381. PRINTF_FUNC("Alter native mode. \n");
  1382. }
  1383. //main loop
  1384. while (libInitialize)
  1385. {
  1386. // 斷電狀態
  1387. if (ShmSysConfigAndInfo->SysInfo.AcContactorStatus == NO)
  1388. {
  1389. //一但 AC Off PSU 斷電全部的 PSU Group ID 會全部清 0
  1390. if (!isInitialComp)
  1391. {
  1392. ShmPsuData->Work_Step = INITIAL_START;
  1393. psuCmdSeq = _PSU_CMD_STATUS;
  1394. sleep(2);
  1395. InitialPsuData();
  1396. isInitialComp = YES;
  1397. }
  1398. ShmDcCommonData->psuKeepCommunication = ShmDcCommonData->acContactSwitch;
  1399. sleep(1);
  1400. continue;
  1401. }
  1402. else
  1403. {
  1404. if (isInitialComp)
  1405. GetTimespecFunc(&ShmDcCommonData->_psuComm_time);
  1406. isInitialComp = NO;
  1407. }
  1408. // 自檢失敗
  1409. if (ShmPsuData->Work_Step == _NO_WORKING)
  1410. {
  1411. PRINTF_FUNC("== PSU == self test fail. \n");
  1412. sleep(5);
  1413. }
  1414. else if (ShmDcCommonData->rebootCount < 1)
  1415. {
  1416. int _time = GetTimeoutValue(&ShmDcCommonData->_psuComm_time);
  1417. if (_time < 0)
  1418. GetTimespecFunc(&ShmDcCommonData->_psuComm_time);
  1419. if (_time > PSU_GONE_RESET)
  1420. {
  1421. if (ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuComminicationErrWithCSU == NORMAL)
  1422. {
  1423. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuComminicationErrWithCSU = ABNORMAL;
  1424. ShmDcCommonData->rebootCount = 1;
  1425. PRINTF_FUNC("Psu is gone, reset one time. \n");
  1426. }
  1427. }
  1428. }
  1429. switch(ShmPsuData->Work_Step)
  1430. {
  1431. case INITIAL_START:
  1432. {
  1433. PRINTF_FUNC("== PSU == INITIAL_START \n");
  1434. GetTimespecMFunc(&_cmdSubPsuPriority_time);
  1435. sleep(5);
  1436. ClosePsuPower(PSU_NONE, SYSTEM_CMD);
  1437. SetWalkInConfig(SYSTEM_CMD, NO, 0);
  1438. FlashLed(SYSTEM_CMD, PSU_FLASH_NORMAL);
  1439. for (byte index = 0; index < ShmPsuData->GroupCount; index++)
  1440. {
  1441. ShmPsuData->PsuGroup[index].GroupPresentPsuQuantity = 0;
  1442. isStartOutputSwitch[index] = false;
  1443. }
  1444. ShmPsuData->Work_Step = GET_PSU_COUNT;
  1445. }
  1446. break;
  1447. case GET_PSU_COUNT:
  1448. {
  1449. int time = GetTimeoutMValue(&_cmdSubPsuPriority_time);
  1450. byte moduleCount = 0;
  1451. if (time < 0)
  1452. GetTimespecMFunc(&_cmdSubPsuPriority_time);
  1453. // 發送取得目前全部模組數量
  1454. GetModuleCount(SYSTEM_CMD);
  1455. if (time > 500)
  1456. {
  1457. if (psuCmdSeq == _PSU_CMD_STATUS)
  1458. {
  1459. // 取得狀態 : 支援模塊不須按照順序功能
  1460. for (byte index = 0; index < ShmPsuData->GroupCount; index++)
  1461. {
  1462. GetStatus(index, LIB_IN_USE);
  1463. }
  1464. Await();
  1465. }
  1466. else if (psuCmdSeq == _PSU_CMD_GETCOUNT)
  1467. {
  1468. // 分別取各群模組數量
  1469. for (byte index = 0; index < ShmPsuData->GroupCount; index++)
  1470. {
  1471. // 總和各群模組數量
  1472. moduleCount += ShmPsuData->PsuGroup[index].GroupPresentPsuQuantity;
  1473. // 取各群模組數量
  1474. GetModuleCount(index);
  1475. }
  1476. if(_delayToGetCap == 0 &&
  1477. moduleCount == ShmPsuData->SystemPresentPsuQuantity && moduleCount > 0)
  1478. {
  1479. PRINTF_FUNC("== PSU == Connector Count = %d, moduleCount = %d, sysCount = %d\n",
  1480. _gunCountRecord, moduleCount, ShmPsuData->SystemPresentPsuQuantity);
  1481. }
  1482. // 判斷系統數量與各群數量一致
  1483. if(moduleCount == ShmPsuData->SystemPresentPsuQuantity && moduleCount > 0)
  1484. {
  1485. // 電樁在 Booting 的狀態 - 自檢
  1486. PRINTF_FUNC ( "== PSU == GET_SYS_CAP \n" );
  1487. ShmPsuData->Work_Step = GET_SYS_CAP;
  1488. }
  1489. }
  1490. if (psuCmdSeq == _PSU_CMD_STATUS)
  1491. psuCmdSeq = _PSU_CMD_GETCOUNT;
  1492. else
  1493. psuCmdSeq = _PSU_CMD_STATUS;
  1494. GetTimespecMFunc(&_cmdSubPsuPriority_time);
  1495. }
  1496. }
  1497. break;
  1498. case GET_SYS_CAP:
  1499. {
  1500. int time = GetTimeoutMValue(&_cmdSubPsuPriority_time);
  1501. if (time < 0)
  1502. GetTimespecMFunc(&_cmdSubPsuPriority_time);
  1503. if (time > 200)
  1504. {
  1505. bool isFinish = true;
  1506. for(byte group = 0; group < ShmPsuData->GroupCount; group++)
  1507. {
  1508. if (isFinish)
  1509. {
  1510. for (byte psuCount = 0; psuCount < ShmPsuData->PsuGroup[group].GroupPresentPsuQuantity; psuCount++)
  1511. {
  1512. if (strcmp((char *)ShmPsuData->PsuGroup[group].PsuModule[psuCount].FwVersion, "") == EQUAL ||
  1513. ShmPsuData->SystemAvailablePower <= 0 || ShmPsuData->SystemAvailableCurrent <= 0)
  1514. {
  1515. isFinish = false;
  1516. break;
  1517. }
  1518. }
  1519. }
  1520. }
  1521. if (!isFinish)
  1522. {
  1523. for (byte index = 0; index < ShmPsuData->GroupCount; index++)
  1524. {
  1525. if (psuCmdSeq == _PSU_CMD_STATUS)
  1526. {
  1527. // 取得狀態 : 支援模塊不須按照順序功能
  1528. GetStatus(index, LIB_IN_USE);
  1529. }
  1530. else if (psuCmdSeq == _PSU_CMD_CAP)
  1531. {
  1532. // 取系統總輸出能力
  1533. GetModuleCap(index);
  1534. }
  1535. else if (psuCmdSeq == _PSU_CMD_VERSION)
  1536. {
  1537. // 取版號
  1538. GetModuleVer(index);
  1539. }
  1540. }
  1541. Await();
  1542. if (psuCmdSeq == _PSU_CMD_STATUS)
  1543. psuCmdSeq = _PSU_CMD_CAP;
  1544. else if (psuCmdSeq == _PSU_CMD_CAP)
  1545. psuCmdSeq = _PSU_CMD_VERSION;
  1546. else
  1547. psuCmdSeq = _PSU_CMD_STATUS;
  1548. }
  1549. else
  1550. {
  1551. // 判斷系統輸出額定功率與電流
  1552. PRINTF_FUNC("SystemAvailableCurrent = %d (A), SystemAvailablePower = %d (KW) \n",
  1553. ShmPsuData->SystemAvailableCurrent / 10, ShmPsuData->SystemAvailablePower / 10);
  1554. if (ShmSysConfigAndInfo->SysInfo.BootingStatus == BOOTTING)
  1555. {
  1556. PRINTF_FUNC ( "== PSU == BOOTING_COMPLETE \n" );
  1557. ShmPsuData->Work_Step = BOOTING_COMPLETE;
  1558. }
  1559. else
  1560. {
  1561. PRINTF_FUNC ( "== PSU == _WORK_CHARGING \n" );
  1562. ShmPsuData->Work_Step = _WORK_CHARGING;
  1563. }
  1564. }
  1565. GetTimespecMFunc(&_cmdSubPsuPriority_time);
  1566. GetTimespecMFunc(&_log_time);
  1567. GetTimespecMFunc(&_smooth_time);
  1568. }
  1569. }
  1570. break;
  1571. case BOOTING_COMPLETE:
  1572. {
  1573. bool isSelfTestPass = true;
  1574. for (byte groupIndex = 0; groupIndex < _gunCountRecord; groupIndex++)
  1575. {
  1576. if (chargingInfo[groupIndex]->SystemStatus == SYS_MODE_BOOTING)
  1577. {
  1578. isSelfTestPass = false;
  1579. }
  1580. }
  1581. if (isSelfTestPass)
  1582. ShmPsuData->Work_Step = _WORK_CHARGING;
  1583. sleep(1);
  1584. }
  1585. break;
  1586. case _WORK_CHARGING:
  1587. {
  1588. int time = GetTimeoutMValue(&_cmdSubPsuPriority_time);
  1589. int logTime = GetTimeoutMValue(&_log_time);
  1590. int smoothTime = GetTimeoutMValue(&_smooth_time);
  1591. if (time < 0)
  1592. GetTimespecMFunc(&_cmdSubPsuPriority_time);
  1593. // 低 Priority 的指令
  1594. if (time > 1500)
  1595. {
  1596. GetTimespecMFunc(&_cmdSubPsuPriority_time);
  1597. Check2ClearPsuError();
  1598. if (_delay2GetPsuTemp > 0)
  1599. _delay2GetPsuTemp--;
  1600. }
  1601. for (byte groupIndex = 0; groupIndex < ShmPsuData->GroupCount; groupIndex++)
  1602. {
  1603. if (psuCmdSeq == _PSU_CMD_STATUS)
  1604. {
  1605. // 取得狀態
  1606. GetStatus(groupIndex, LIB_IN_USE);
  1607. }
  1608. else if (psuCmdSeq == _PSU_CMD_CAP)
  1609. {
  1610. // 取系統總輸出能力
  1611. GetModuleCap(groupIndex);
  1612. }
  1613. else if (psuCmdSeq == _PSU_CMD_IAVAILABLE)
  1614. {
  1615. GetModuleIavailable ( groupIndex );
  1616. }
  1617. else if (psuCmdSeq == _PSU_CMD_OUTPUT_V)
  1618. {
  1619. // 取各群輸出電壓電流 (UU)
  1620. GetModuleOutputF(groupIndex);
  1621. }
  1622. else if (psuCmdSeq == _PSU_CMD_TEMP)
  1623. {
  1624. // 取得模塊溫度
  1625. GetDcTemperature(groupIndex);
  1626. _delay2GetPsuTemp = 10; // 15s
  1627. }
  1628. }
  1629. Await();
  1630. psuCmdSeq = GetPollingCmd();
  1631. for (byte gunIndex = 0; gunIndex < _gunCountRecord; gunIndex++)
  1632. {
  1633. // 針對各槍當前狀態,傳送需要回傳的資料指令
  1634. if (((chargingInfo[gunIndex]->SystemStatus >= SYS_MODE_PREPARE_FOR_EVSE && chargingInfo[gunIndex]->SystemStatus <= SYS_MODE_CHARGING) && chargingInfo[gunIndex]->RelayK1K2Status) ||
  1635. (chargingInfo[gunIndex]->SystemStatus >= SYS_MODE_PREPARE_FOR_EVSE && chargingInfo[gunIndex]->SystemStatus <= SYS_MODE_CHARGING && chargingInfo[gunIndex]->Type == _Type_GB) ||
  1636. (chargingInfo[gunIndex]->SystemStatus >= SYS_MODE_CCS_PRECHARGE_STEP0 && chargingInfo[gunIndex]->SystemStatus <= SYS_MODE_CCS_PRECHARGE_STEP1))
  1637. {
  1638. OutputChargingLogFuncion(gunIndex);
  1639. // 該槍該群是否為使用中
  1640. if (ShmPsuData->PsuGroup[gunIndex].PwSwitchStatus == _PSU_POWER_STATUS_OFF &&
  1641. ShmSmartBoxData->ConnectorStatus[gunIndex].ConnectorStaus != _CONNECTOR_STATUS_USING)
  1642. {
  1643. // 切出該模塊
  1644. }
  1645. else
  1646. {
  1647. unsigned short _shareOutputCur_buf = 0;
  1648. // Fetch Group
  1649. if (ShmSmartBoxData->Dynamic4Fetch[gunIndex].ShareGroup < ShmPsuData->GroupCount)
  1650. {
  1651. byte _shareGroup = ShmSmartBoxData->Dynamic4Fetch[gunIndex].ShareGroup;
  1652. byte totalPsuCount = chargingInfo[gunIndex]->_TotalPsuCount;
  1653. if (ShmSmartBoxData->Dynamic4Fetch[gunIndex].FetchLoopStep >= _PSU_DYNAMIC_FETCH_STEP_TG_VOL &&
  1654. ShmSmartBoxData->Dynamic4Fetch[gunIndex].FetchLoopStep <= _PSU_DYNAMIC_FETCH_STEP_WATI_FINISH)
  1655. {
  1656. // 升壓
  1657. ShmPsuData->PsuGroup[_shareGroup].GroupTargetOutputVoltage = chargingInfo[gunIndex]->EvBatterytargetVoltage * 10;
  1658. if (ShmSmartBoxData->Dynamic4Fetch[gunIndex].FetchLoopStep >= _PSU_DYNAMIC_FETCH_STEP_CUR_SHARE)
  1659. {
  1660. // 均流
  1661. totalPsuCount += ShmPsuData->PsuGroup[_shareGroup].GroupPresentPsuQuantity;
  1662. // 目標電流
  1663. ShmSmartBoxData->Dynamic4Fetch[gunIndex].ShareTargetCurrent = (chargingInfo[gunIndex]->PresentChargingCurrent /
  1664. totalPsuCount * ShmPsuData->PsuGroup[_shareGroup].GroupPresentPsuQuantity) * 10;
  1665. if (ShmPsuData->PsuGroup [_shareGroup].GroupPresentOutputCurrent + SHARE_CURRENT_GAP <=
  1666. ShmSmartBoxData->Dynamic4Fetch[gunIndex].ShareTargetCurrent)
  1667. _shareOutputCur_buf = ShmPsuData->PsuGroup[_shareGroup].GroupPresentOutputCurrent + SHARE_CURRENT_GAP;
  1668. else
  1669. _shareOutputCur_buf = ShmSmartBoxData->Dynamic4Fetch[gunIndex].ShareTargetCurrent;
  1670. }
  1671. PsuOutputCurrentLimtit(_shareGroup, &_shareOutputCur_buf);
  1672. ShmPsuData->PsuGroup [_shareGroup].GroupTargetOutputCurrent = _shareOutputCur_buf;
  1673. if (logTime >= LOG_TIME)
  1674. {
  1675. PRINTF_FUNC("_shareGroup = %d, ShareTargetCurrent = %d, GroupPresentOutputCurrent = %d, GroupTargetOutputCurrent = %d \n",
  1676. _shareGroup,
  1677. ShmSmartBoxData->Dynamic4Fetch[gunIndex].ShareTargetCurrent,
  1678. ShmPsuData->PsuGroup[_shareGroup].GroupPresentOutputCurrent,
  1679. ShmPsuData->PsuGroup [_shareGroup].GroupTargetOutputCurrent);
  1680. }
  1681. if (ShmPsuData->PsuGroup [_shareGroup].GroupTargetOutputVoltage <= PSU_MIN_VOL)
  1682. {
  1683. PsuPowerOFF ( gunIndex, _shareGroup );
  1684. }
  1685. else
  1686. {
  1687. PsuPowerON ( _shareGroup );
  1688. }
  1689. }
  1690. }
  1691. // Release Group
  1692. unsigned short _releasePsuCount_buf = 0;
  1693. unsigned short _releaseTargetCur = 0;
  1694. if (ShmSmartBoxData->Dynamic4Release[gunIndex].ReleaseGroup < ShmPsuData->GroupCount)
  1695. {
  1696. byte _releaseGroup = ShmSmartBoxData->Dynamic4Release[gunIndex].ReleaseGroup;
  1697. if (ShmSmartBoxData->Dynamic4Release[gunIndex].ReleaseLoopStep >= _PSU_DYNAMIC_RELEASE_STEP_CUR_SHARE &&
  1698. ShmSmartBoxData->Dynamic4Release[gunIndex].ReleaseLoopStep <= _PSU_DYNAMIC_RELEASE_STEP_WAIT_FINISH)
  1699. {
  1700. unsigned short _releaseTargetVol = chargingInfo[gunIndex]->EvBatterytargetVoltage * 10;
  1701. _releasePsuCount_buf = ShmPsuData->PsuGroup[_releaseGroup].GroupPresentPsuQuantity;
  1702. // 扣掉預計要輸出的電流, 餘下的才是該模塊輸出的電流
  1703. // if (logTime >= 1000)
  1704. // {
  1705. // PRINTF_FUNC ("Req = %.1f, LimitCur = %.1f, _releasePsuCount_buf = %d \n",
  1706. // chargingInfo[gunIndex]->EvBatterytargetCurrent * 10,
  1707. // ShmSmartBoxData->Dynamic4Release[gunIndex].LimitCur,
  1708. // _releasePsuCount_buf);
  1709. // }
  1710. if (ShmSmartBoxData->Dynamic4Release[gunIndex].AutoRelease)
  1711. {
  1712. _releaseTargetCur = ShmPsuData->PsuGroup[_releaseGroup].GroupTargetOutputCurrent;
  1713. if (smoothTime >= SMOOTH_TIME)
  1714. {
  1715. if (ShmPsuData->PsuGroup[_releaseGroup].GroupTargetOutputCurrent - RELEASE_CUR_GAP < PSU_MIN_OUTPUT_CUR * 10)
  1716. _releaseTargetCur = PSU_MIN_OUTPUT_CUR * 10 * ShmPsuData->PsuGroup[_releaseGroup].GroupPresentPsuQuantity;
  1717. else
  1718. _releaseTargetCur = ShmPsuData->PsuGroup[_releaseGroup].GroupTargetOutputCurrent - RELEASE_CUR_GAP;
  1719. }
  1720. // if (ShmSmartBoxData->Dynamic4Release [gunIndex].ReleaseLoopStep == _PSU_DYNAMIC_RELEASE_STEP_CUR_SHARE)
  1721. // {
  1722. // ShmPsuData->PsuGroup [_releaseGroup].GroupTargetOutputVoltage = _releaseTargetVol;
  1723. // PsuOutputCurrentLimtit ( _releaseGroup,
  1724. // & _releaseTargetCur );
  1725. // ShmPsuData->PsuGroup [_releaseGroup].GroupTargetOutputCurrent = _releaseTargetCur;
  1726. //
  1727. // PsuPowerON ( _releaseGroup );
  1728. // }
  1729. // else if (ShmSmartBoxData->Dynamic4Release [gunIndex].ReleaseLoopStep == _PSU_DYNAMIC_RELEASE_STEP_WAIT_FINISH)
  1730. // {
  1731. // PsuPowerOFF ( gunIndex, _releaseGroup );
  1732. // }
  1733. }
  1734. else
  1735. {
  1736. if ((chargingInfo[gunIndex]->EvBatterytargetCurrent * 10) - ShmSmartBoxData->Dynamic4Release[gunIndex].LimitCur - PSU_CUR_GAP < PSU_MIN_OUTPUT_CUR * 10)
  1737. _releaseTargetCur = PSU_MIN_OUTPUT_CUR * 10 * ShmPsuData->PsuGroup[_releaseGroup].GroupPresentPsuQuantity;
  1738. else
  1739. _releaseTargetCur = (chargingInfo[gunIndex]->EvBatterytargetCurrent * 10) - ShmSmartBoxData->Dynamic4Release[gunIndex].LimitCur - PSU_CUR_GAP;
  1740. //
  1741. // if (ShmSmartBoxData->Dynamic4Release[gunIndex].ReleaseLoopStep == _PSU_DYNAMIC_RELEASE_STEP_CUR_SHARE)
  1742. // {
  1743. // ShmPsuData->PsuGroup[_releaseGroup].GroupTargetOutputVoltage = _releaseTargetVol;
  1744. // PsuOutputCurrentLimtit(_releaseGroup, &_releaseTargetCur);
  1745. // ShmPsuData->PsuGroup[_releaseGroup].GroupTargetOutputCurrent = _releaseTargetCur;
  1746. //
  1747. // PsuPowerON(_releaseGroup);
  1748. // }
  1749. // else if (ShmSmartBoxData->Dynamic4Release[gunIndex].ReleaseLoopStep == _PSU_DYNAMIC_RELEASE_STEP_WAIT_FINISH)
  1750. // {
  1751. // PsuPowerOFF(gunIndex, _releaseGroup);
  1752. // }
  1753. }
  1754. if (ShmSmartBoxData->Dynamic4Release[gunIndex].ReleaseLoopStep == _PSU_DYNAMIC_RELEASE_STEP_CUR_SHARE)
  1755. {
  1756. int _releaseTime = 0;
  1757. if (!_releaseWait_chk[gunIndex])
  1758. {
  1759. _releaseWait_chk[gunIndex] = true;
  1760. GetTimespecMFunc(&_releaseWait_time[gunIndex]);
  1761. }
  1762. else
  1763. {
  1764. _releaseTime = GetTimeoutMValue(&_releaseWait_time[gunIndex]);
  1765. if (_releaseTime >= WAIT_LIMIT_TIME)
  1766. _releaseTargetCur = PSU_MIN_OUTPUT_CUR * 10 * ShmPsuData->PsuGroup[_releaseGroup].GroupPresentPsuQuantity;
  1767. }
  1768. ShmPsuData->PsuGroup[_releaseGroup].GroupTargetOutputVoltage = _releaseTargetVol;
  1769. PsuOutputCurrentLimtit(_releaseGroup, &_releaseTargetCur);
  1770. ShmPsuData->PsuGroup[_releaseGroup].GroupTargetOutputCurrent = _releaseTargetCur;
  1771. PsuPowerON(_releaseGroup);
  1772. }
  1773. else if (ShmSmartBoxData->Dynamic4Release[gunIndex].ReleaseLoopStep == _PSU_DYNAMIC_RELEASE_STEP_WAIT_FINISH)
  1774. {
  1775. PsuPowerOFF(gunIndex, _releaseGroup);
  1776. _releaseWait_chk[gunIndex] = false;
  1777. }
  1778. }
  1779. }
  1780. // 對群下發輸出指令
  1781. float sumCurrent = 0;
  1782. for (int _psuGpIndex = ShmSmartBoxData->ConnectorUsingGroupCount[gunIndex] - 1; _psuGpIndex >= 0; _psuGpIndex--)
  1783. {
  1784. byte _targetGroup = ConnectorUsingSeq[gunIndex][_psuGpIndex];
  1785. byte psuTotalCount = chargingInfo[gunIndex]->_TotalPsuCount - _releasePsuCount_buf;
  1786. if (ShmPsuData->PsuGroup[_targetGroup].GroupPresentPsuQuantity <= 0)
  1787. continue;
  1788. unsigned short _targetOutputVol_buf = chargingInfo[gunIndex]->EvBatterytargetVoltage * 10;
  1789. float _evTargetCur = chargingInfo[gunIndex]->EvBatterytargetCurrent;
  1790. if (_evTargetCur - (_shareOutputCur_buf / 10) <= 0)
  1791. _evTargetCur = 0;
  1792. else
  1793. _evTargetCur -= (_shareOutputCur_buf / 10);
  1794. if (_releasePsuCount_buf != 0)
  1795. {
  1796. if (ShmSmartBoxData->Dynamic4Release[gunIndex].ReleaseGroup == _targetGroup)
  1797. continue;
  1798. else
  1799. {
  1800. if (ShmSmartBoxData->Dynamic4Release[gunIndex].AutoRelease)
  1801. {
  1802. _evTargetCur = chargingInfo[gunIndex]->EvBatterytargetCurrent - _releaseTargetCur / 10;
  1803. }
  1804. else
  1805. _evTargetCur = ShmSmartBoxData->Dynamic4Release[gunIndex].LimitCur / 10;
  1806. }
  1807. }
  1808. unsigned short _targetOutputCur_buf = 0;
  1809. // 最後一群輸出為總輸出 - 已經輸出的電流
  1810. if (_psuGpIndex == 0)
  1811. {
  1812. if (_evTargetCur - sumCurrent > 0)
  1813. _targetOutputCur_buf = (_evTargetCur - sumCurrent) * 10;
  1814. else
  1815. {
  1816. // 輸出電流邏輯 : 該群需要分攤輸出的電流 = 總需求電流 / 總模塊個數 * 該群模塊個數
  1817. _targetOutputCur_buf = (_evTargetCur /
  1818. psuTotalCount * ShmPsuData->PsuGroup[_targetGroup].GroupPresentPsuQuantity) * 10;
  1819. }
  1820. }
  1821. else
  1822. {
  1823. // 輸出電流邏輯 : 該群需要分攤輸出的電流 = 總需求電流 / 總模塊個數 * 該群模塊個數
  1824. _targetOutputCur_buf = (_evTargetCur /
  1825. psuTotalCount * ShmPsuData->PsuGroup[_targetGroup].GroupPresentPsuQuantity) * 10;
  1826. sumCurrent += _targetOutputCur_buf;
  1827. }
  1828. // 經度 0.1
  1829. // if (logTime >= LOG_TIME)
  1830. // {
  1831. // PRINTF_FUNC("psuTotalCount = %d, _evTargetCur = %.1f, sumCurrent = %.1f \n",
  1832. // psuTotalCount,
  1833. // _evTargetCur,
  1834. // sumCurrent);
  1835. //
  1836. // PRINTF_FUNC("_targetGroup = %d, _targetOutputVol_buf = %d (0.1), _targetOutputCur_buf = %d (0.1)\n",
  1837. // _targetGroup,
  1838. // _targetOutputVol_buf,
  1839. // _targetOutputCur_buf);
  1840. // }
  1841. ShmPsuData->PsuGroup[_targetGroup].GroupTargetOutputVoltage = _targetOutputVol_buf;
  1842. PsuOutputCurrentLimtit(_targetGroup, &_targetOutputCur_buf);
  1843. ShmPsuData->PsuGroup[_targetGroup].GroupTargetOutputCurrent = _targetOutputCur_buf;
  1844. if (ShmPsuData->PsuGroup[_targetGroup].GroupTargetOutputVoltage <= PSU_MIN_VOL)
  1845. PsuPowerOFF(gunIndex, _targetGroup);
  1846. else
  1847. PsuPowerON(_targetGroup);
  1848. }
  1849. }
  1850. }
  1851. else if (chargingInfo[gunIndex]->SystemStatus >= SYS_MODE_TERMINATING &&
  1852. chargingInfo[gunIndex]->SystemStatus <= SYS_MODE_ALARM)
  1853. {
  1854. // 對群下發輸出指令
  1855. bool isAllStop = true;
  1856. for (byte _psuGpIndex = 0; _psuGpIndex < ShmSmartBoxData->ConnectorUsingGroupCount[gunIndex]; _psuGpIndex++)
  1857. {
  1858. if (PsuPowerOFF(gunIndex, ConnectorUsingSeq[gunIndex][_psuGpIndex]) == _PSU_POWER_STATUS_ON)
  1859. {
  1860. if (isAllStop)
  1861. isAllStop = false;
  1862. }
  1863. }
  1864. if (ShmSmartBoxData->Dynamic4Fetch[gunIndex].ShareGroup < ShmPsuData->GroupCount)
  1865. {
  1866. PsuPowerOFF(gunIndex, ShmSmartBoxData->Dynamic4Fetch[gunIndex].ShareGroup);
  1867. }
  1868. if (isAllStop)
  1869. ShmSmartBoxData->ConnectorStatus[gunIndex].ConnectorStaus = _CONNECTOR_STATUS_NONE;
  1870. }
  1871. }
  1872. if (logTime > LOG_TIME)
  1873. GetTimespecMFunc(&_log_time);
  1874. if (smoothTime > SMOOTH_TIME)
  1875. GetTimespecMFunc(&_smooth_time);
  1876. }
  1877. break;
  1878. }
  1879. usleep(20000);
  1880. }
  1881. return FAIL;
  1882. }