PhGroup_PsuCommObj.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877
  1. /*
  2. * PhGroup_PsuCommObj.c
  3. *
  4. * Created on: 2022年02月22日
  5. * Author: 8274
  6. */
  7. #include "PhGroup_PsuCommObj.h"
  8. #define ARRAY_SIZE(A) (sizeof(A) / sizeof(A[0]))
  9. #define NO 0
  10. #define YES 1
  11. #define DEBUG_LIB 1
  12. void PRINTF_LIB_FUNC(char *string, ...);
  13. float IEEE_754_to_float(const byte raw[4]);
  14. //================================================
  15. // Private function
  16. //================================================
  17. void PRINTF_LIB_FUNC(char *string, ...)
  18. {
  19. if (DEBUG_LIB)
  20. {
  21. va_list args;
  22. char buffer[4096];
  23. va_start(args, string);
  24. vsnprintf(buffer, sizeof(buffer), string, args);
  25. va_end(args);
  26. printf("%s \n", buffer);
  27. }
  28. }
  29. float IEEE_754_to_float(const byte raw[4])
  30. {
  31. float fValue = 0;
  32. byte *pbyte = (byte *)&fValue;
  33. *(pbyte + 0) = raw[3];
  34. *(pbyte + 1) = raw[2];
  35. *(pbyte + 2) = raw[1];
  36. *(pbyte + 3) = raw[0];
  37. return fValue;
  38. }
  39. //================================================
  40. // Callback function
  41. //================================================
  42. void RefreshPsuIndex(int (*func)(byte group, byte address))
  43. {
  44. return_psuIndex = func;
  45. }
  46. void RefreshGroup(void *func)
  47. {
  48. return_group = func;
  49. }
  50. void RefreshInfyPwrAlarmFlag(void *func)
  51. {
  52. return_infy_pwr_alarm_flag = func;
  53. }
  54. void RefreshPhPwrAlarmFlag(void *func)
  55. {
  56. return_ph_pwr_alarm_flag = func;
  57. }
  58. void RefreshAlarmStatus(void *func)
  59. {
  60. return_alarm_status = func;
  61. }
  62. void RefreshAmbient(void *func)
  63. {
  64. return_ambient = func;
  65. }
  66. void RefreshModuleCount(void *func)
  67. {
  68. return_module_count = func;
  69. }
  70. void RefreshSysModuleCount(void *func)
  71. {
  72. return_sys_module_count = func;
  73. }
  74. void RefreshAvailableCap(void *func)
  75. {
  76. return_available_cap = func;
  77. }
  78. void RefreshFwDcVersion(void *func)
  79. {
  80. return_fw_dc_version = func;
  81. }
  82. void RefreshFwPfcVersion(void *func)
  83. {
  84. return_fw_pfc_version = func;
  85. }
  86. void RefreshInputVol(void *func)
  87. {
  88. return_input_vol = func;
  89. }
  90. void RefreshInputCur(void *func)
  91. {
  92. return_input_cur = func;
  93. }
  94. void RefreshGetOutput(void *func)
  95. {
  96. return_get_output = func;
  97. }
  98. void RefreshGetOutputF(void *func)
  99. {
  100. return_get_output_float = func;
  101. }
  102. void RefreshGetModuleOutput(void *func)
  103. {
  104. return_module_output = func;
  105. }
  106. void RefreshGetErrorRecord(void *func)
  107. {
  108. return_error_record = func;
  109. }
  110. void RefreshFanSpeedInfo(void *func)
  111. {
  112. return_fan_speed = func;
  113. }
  114. void RefreshInletTemp(void *func)
  115. {
  116. return_inlet_temp = func;
  117. }
  118. void RefreshExletTemp(void *func)
  119. {
  120. return_exlet_temp = func;
  121. }
  122. void RefreshOutletTemp(void *func)
  123. {
  124. return_outlet_temp = func;
  125. }
  126. void RefreshOtherTemp(void *func)
  127. {
  128. return_other_temp = func;
  129. }
  130. void RefreshIavailable(void *func)
  131. {
  132. return_iavail_info = func;
  133. }
  134. void AutoMode_RefreshOutputAndTemp(void *func)
  135. {
  136. return_output_temp = func;
  137. }
  138. void AutoMode_RefreshModuleStatus(void *func)
  139. {
  140. return_module_status = func;
  141. }
  142. void AutoMode_RefreshModuleInput(void *func)
  143. {
  144. return_module_input = func;
  145. }
  146. //================================================
  147. // CANBUS initialization
  148. //================================================
  149. int InitCanBus()
  150. {
  151. int s0,nbytes;
  152. struct timeval tv;
  153. struct ifreq ifr0;
  154. struct sockaddr_can addr0;
  155. struct can_filter rfilter[2];
  156. system("/sbin/ip link set can1 down");
  157. system("/sbin/ip link set can1 type can bitrate 500000 restart-ms 100");
  158. system("/sbin/ip link set can1 up");
  159. s0 = socket(PF_CAN, SOCK_RAW, CAN_RAW);
  160. tv.tv_sec = 0;
  161. tv.tv_usec = 10000;
  162. if (setsockopt(s0, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(struct timeval)) < 0)
  163. {
  164. #ifdef SystemLogMessage
  165. PRINTF_LIB_FUNC("Set SO_RCVTIMEO NG");
  166. #endif
  167. }
  168. nbytes=40960;
  169. if (setsockopt(s0, SOL_SOCKET, SO_RCVBUF, &nbytes, sizeof(int)) < 0)
  170. {
  171. #ifdef SystemLogMessage
  172. PRINTF_LIB_FUNC("Set SO_RCVBUF NG");
  173. #endif
  174. }
  175. nbytes=40960;
  176. if (setsockopt(s0, SOL_SOCKET, SO_SNDBUF, &nbytes, sizeof(int)) < 0)
  177. {
  178. #ifdef SystemLogMessage
  179. PRINTF_LIB_FUNC("Set SO_SNDBUF NG");
  180. #endif
  181. }
  182. nbytes=40960;
  183. //DIR_GrpMaster_to_CSU
  184. rfilter[0].can_id = 0xE000;
  185. rfilter[0].can_mask = 0xE000;
  186. //DIR_Slave_to_CSU
  187. rfilter[1].can_id = 0xD000;
  188. rfilter[1].can_mask = 0xD000;
  189. if (setsockopt(s0, SOL_CAN_RAW, CAN_RAW_FILTER, &rfilter, sizeof(rfilter)) < 0)
  190. {
  191. #ifdef SystemLogMessage
  192. PRINTF_LIB_FUNC("Set SOL_CAN_RAW NG");
  193. #endif
  194. }
  195. strcpy(ifr0.ifr_name, "can1" );
  196. ioctl(s0, SIOCGIFINDEX, &ifr0); /* ifr.ifr_ifindex gets filled with that device's index */
  197. addr0.can_family = AF_CAN;
  198. addr0.can_ifindex = ifr0.ifr_ifindex;
  199. bind(s0, (struct sockaddr *)&addr0, sizeof(addr0));
  200. return s0;
  201. }
  202. void ReceiveDataFromCanBus() //onedollar:可加入err handling(讀取can id的CAN_ERR_FLAG,若有err,繼續由can id其他位看是什麼錯誤)
  203. {
  204. int nbytes;
  205. struct can_frame frame;
  206. PH_PwrFrame *PH_PwrFrameMsg;
  207. byte group_PSU, slv_address, length;
  208. unsigned short full_address = 0;
  209. while(1)
  210. {
  211. memset(&frame, 0, sizeof(struct can_frame));
  212. nbytes = read(CanFd, &frame, sizeof(struct can_frame));
  213. if (nbytes > 0)
  214. {
  215. PH_PwrFrameMsg = (PH_PwrFrame *)&frame.can_id;
  216. length = frame.can_dlc;
  217. group_PSU = PH_PwrFrameMsg->PHBits.SlaveGroup;
  218. slv_address = PH_PwrFrameMsg->PHBits.SlaveAddress;
  219. full_address = (group_PSU << GroupAdd_Position) | slv_address;
  220. switch(PH_PwrFrameMsg->PHBits.MessageID)
  221. {
  222. // 0x09
  223. case (PH_PSU_RCmd_GetPresentOutput + PH_PSU_Ack_Msg):
  224. {
  225. byte vol[2], cur[2], maxCur[2];
  226. memcpy(vol, frame.data, 2);
  227. memcpy(cur, frame.data + 2, 2);
  228. memcpy(maxCur, frame.data + 4, 2);
  229. // _Vol unit: 1V
  230. // _Cur unit: 1A
  231. float _Vol = ((frame.data[0] << 8) + frame.data[1]) * 0.1;
  232. float _Cur = ((frame.data[2] << 8) + frame.data[3]) * 0.1;
  233. //[GetModuleOutputF] & [GetMouleIavailable]
  234. if(PH_PwrFrameMsg->PHBits.DIR == DIR_GrpMaster_to_CSU)
  235. {
  236. return_get_output_float(group_PSU, _Vol, _Cur);
  237. }
  238. //[GetMouleIavailable]
  239. if(PH_PwrFrameMsg->PHBits.DIR == DIR_Slave_to_CSU)
  240. {
  241. // Iavail unit: 0.1A
  242. // Vext unit: 0.1V
  243. unsigned short iAvailCur = (frame.data[4] << 8) + frame.data[5];
  244. unsigned short vextVol = (frame.data[0] << 8) + frame.data[1];
  245. int psuIndex = 0;
  246. psuIndex = return_psuIndex(group_PSU, slv_address - 1);
  247. return_iavail_info(psuIndex, iAvailCur, vextVol);
  248. return_module_output(psuIndex, _Vol, _Cur);
  249. return_alarm_status(psuIndex, PH_PwrFrameMsg->PHBits.Status);
  250. }
  251. }
  252. break;
  253. // 0x03
  254. case (PH_PSU_RCmd_GetGroupModuleCount + PH_PSU_Ack_Msg):
  255. {
  256. byte count = frame.data[0];
  257. return_module_count(group_PSU, count, true);
  258. }
  259. break;
  260. // 0x04
  261. case (PH_PSU_RCmd_GetAlarmFault + PH_PSU_Ack_Msg):
  262. {
  263. unsigned int alarm_0 = 0, alarm_1 = 0;
  264. if(length >= 8)
  265. {
  266. alarm_1 = (frame.data[0] << 24) | (frame.data[1] << 16) | (frame.data[2] << 8) | frame.data[3];
  267. alarm_0 = (frame.data[4] << 24) | (frame.data[5] << 16) | (frame.data[6] << 8) | frame.data[7];
  268. }
  269. int psuIndex = 0;
  270. psuIndex = return_psuIndex(group_PSU, slv_address - 1);
  271. return_group(group_PSU, psuIndex, full_address);
  272. return_ph_pwr_alarm_flag(psuIndex, PH_PwrFrameMsg->PHBits.Status, alarm_1, alarm_0);
  273. short maxVol = 9500; //950V
  274. short minVol = 1500; //150V
  275. short maxCur = 1000; //100A
  276. short totalPow = 300; //30kW
  277. return_available_cap(psuIndex, maxVol, minVol, maxCur, totalPow);
  278. }
  279. break;
  280. // 0x05
  281. case (PH_PSU_RCmd_GetModuleVersion + PH_PSU_Ack_Msg):
  282. {
  283. //[GetModuleVer]
  284. byte type = 0;
  285. char strVer[6];
  286. unsigned short fwVer = 0;
  287. type = frame.data[0];
  288. memset(strVer, 0x00, sizeof(strVer));
  289. memcpy(strVer, &frame.data[1], sizeof(strVer) - 1);
  290. fwVer = (frame.data[6] << 8) | frame.data[7];
  291. int psuIndex = 0;
  292. psuIndex = return_psuIndex(group_PSU, slv_address - 1);
  293. char version[32];
  294. memset(version, 0x00, sizeof(version));
  295. if(type == PH_FW_DD_App)
  296. {
  297. sprintf(version, "%s_%d.%02d", strVer, (fwVer / 100), (fwVer % 100));
  298. return_fw_dc_version(psuIndex, version);
  299. }
  300. if(type == PH_FW_PFC_App)
  301. {
  302. sprintf(version, "%s%d.%02d", strVer, (fwVer / 100), (fwVer % 100));
  303. return_fw_pfc_version(psuIndex, version);
  304. }
  305. }
  306. break;
  307. //case (PSU_RCmd_SysOutputVolCur): //APP沒有使用到
  308. //case (PSU_RCmd_ModuleBarcode): //APP沒有使用到
  309. // 0x06
  310. case (PH_PSU_RCmd_GetTemperature + PH_PSU_Ack_Msg):
  311. {
  312. //[GetDcTemperature] and [GetPfcTemperature]
  313. char temp[8];
  314. memset(temp, 0xFF, sizeof(temp));
  315. for(int i = 0; i < length; i++)
  316. {
  317. temp[i] = (char)frame.data[i];
  318. }
  319. int psuIndex = 0;
  320. psuIndex = return_psuIndex(group_PSU, slv_address - 1);
  321. // temp[0]: ambient
  322. // temp[1]: reserve
  323. // temp[2]: dd in 1
  324. // temp[3]: dd in 2
  325. // temp[4]: liquid in
  326. // temp[5]: dd out 1
  327. // temp[6]: dd out 2
  328. // temp[7]: liquid out
  329. return_ambient(psuIndex, temp[0]);
  330. return_inlet_temp(psuIndex, temp[4]);
  331. return_outlet_temp(psuIndex, temp[7]);
  332. return_other_temp(psuIndex, temp[2], temp[3], temp[5], temp[6]);
  333. }
  334. break;
  335. // 0x07
  336. case (PH_PSU_RCmd_GetACInputVoltage + PH_PSU_Ack_Msg):
  337. {
  338. unsigned short voltage_L1 = 0, voltage_L2 = 0, voltage_L3 = 0;
  339. voltage_L1 = (frame.data[1] << 8) | frame.data[2];
  340. voltage_L2 = (frame.data[3] << 8) | frame.data[4];
  341. voltage_L3 = (frame.data[5] << 8) | frame.data[6];
  342. int psuIndex = 0;
  343. psuIndex = return_psuIndex(group_PSU, slv_address - 1);
  344. return_input_vol(psuIndex, voltage_L1, voltage_L2, voltage_L3);
  345. }
  346. break;
  347. // 0x08
  348. case (PH_PSU_RCmd_GetACInputCurrent + PH_PSU_Ack_Msg):
  349. {
  350. // unit: 0.1A
  351. unsigned short current_L1 = 0, current_L2 = 0, current_L3 = 0;
  352. current_L1 = (frame.data[0] << 8) | frame.data[1];
  353. current_L2 = (frame.data[2] << 8) | frame.data[3];
  354. current_L3 = (frame.data[4] << 8) | frame.data[5];
  355. int psuIndex = 0;
  356. psuIndex = return_psuIndex(group_PSU, slv_address - 1);
  357. return_input_cur(psuIndex, current_L1, current_L2, current_L3);
  358. }
  359. break;
  360. case (PH_PSU_RCmd_GetErrorRecord + PH_PSU_Ack_Msg):
  361. {
  362. byte countdown = 0;
  363. byte error_record[7];
  364. countdown = frame.data[0];
  365. memcpy(error_record, &frame.data[1], sizeof(error_record));
  366. int psuIndex = 0;
  367. psuIndex = return_psuIndex(group_PSU, slv_address - 1);
  368. return_error_record(psuIndex, countdown, error_record);
  369. }
  370. break;
  371. }
  372. }
  373. else
  374. usleep(10000);
  375. }
  376. }
  377. //================================================
  378. // Private Function
  379. //================================================
  380. void SendCmdToPsu(int cmd, byte *dataPH, byte dataLen)
  381. {
  382. PH_PwrFrame PwrFrameMsg;
  383. struct can_frame frame;
  384. //設定 CANBSU 2.0B 長封包(Extended ID)
  385. PwrFrameMsg.PwrMessage = cmd | CAN_EFF_FLAG;
  386. frame.can_id = PwrFrameMsg.PwrMessage;
  387. frame.can_dlc = dataLen;
  388. memset(frame.data, 0x00, sizeof(frame.data));
  389. if(dataLen > 0)
  390. {
  391. memcpy(frame.data, dataPH, dataLen);
  392. }
  393. write(CanFd, &frame, sizeof(struct can_frame)); //onedollar:可加入偵錯機制(發送byte數檢驗)
  394. /*
  395. // 群命令才 delay
  396. if (PwrFrameMsg.PHBits.SlaveGroup == PH_ADD_BROADCAST)
  397. usleep(CMD_DELAY_TIME);
  398. */
  399. usleep(CMD_DELAY_TIME);
  400. }
  401. void SetPowerOnOff(byte group, byte slv_address, byte DIR, byte value)
  402. {
  403. byte dataPH = value;
  404. //0xA1 ON
  405. //0x00 OFF
  406. PH_PwrFrame PwrFrameMsg;
  407. PwrFrameMsg.PwrMessage = 0;
  408. PwrFrameMsg.PHBits.MessageID = PH_PSU_WCmd_ModulePowerOnOff;
  409. PwrFrameMsg.PHBits.SlaveAddress = slv_address;
  410. PwrFrameMsg.PHBits.SlaveGroup = group;
  411. PwrFrameMsg.PHBits.DIR = DIR;
  412. SendCmdToPsu(PwrFrameMsg.PwrMessage, &dataPH, 1);
  413. }
  414. void SetOutput(byte group, byte slv_address, byte DIR, int voltage, int current)
  415. {
  416. byte dataPH[4] = {0};
  417. PH_PwrFrame PwrFrameMsg;
  418. PwrFrameMsg.PwrMessage = 0;
  419. PwrFrameMsg.PHBits.MessageID = PH_PSU_WCmd_SetOutputCommand;
  420. dataPH[0] = ((voltage >> 8) & 0xFF);
  421. dataPH[1] = (voltage & 0xFF);
  422. dataPH[2] = ((current >> 8) & 0xFF);
  423. dataPH[3] = (current & 0xFF);
  424. PwrFrameMsg.PHBits.SlaveAddress = slv_address;
  425. PwrFrameMsg.PHBits.SlaveGroup = group;
  426. PwrFrameMsg.PHBits.DIR = DIR;
  427. SendCmdToPsu(PwrFrameMsg.PwrMessage, dataPH, sizeof(dataPH));
  428. }
  429. // voltage unit: 0.1V
  430. void GetModuleIavailable(byte group, unsigned short voltage)
  431. {
  432. byte data[2] = {0};
  433. PH_PwrFrame PwrFrameMsg;
  434. PwrFrameMsg.PwrMessage = 0;
  435. PwrFrameMsg.PHBits.MessageID = PH_PSU_RCmd_GetPresentOutput;
  436. PwrFrameMsg.PHBits.SlaveGroup = group;
  437. PwrFrameMsg.PHBits.SlaveAddress = ALL_Slave;
  438. PwrFrameMsg.PHBits.DIR = DIR_CSU_to_Slave;
  439. data[0] = (voltage >> 8) & 0xFF;
  440. data[1] = voltage & 0xFF;
  441. SendCmdToPsu(PwrFrameMsg.PwrMessage, data, sizeof(data));
  442. }
  443. pid_t InitialCommunication(void)
  444. {
  445. CanFd = InitCanBus();
  446. if(CanFd < 0)
  447. {
  448. return false;
  449. }
  450. recFork = fork();
  451. if(recFork == 0)
  452. {
  453. ReceiveDataFromCanBus();
  454. return 0;
  455. }
  456. return recFork;
  457. }
  458. //================================================
  459. // API Function
  460. //================================================
  461. void SwitchPower(byte group, byte value)
  462. {
  463. //對群控制,DIR_CSU_to_GrpMaster,僅需指定group
  464. SetPowerOnOff(group, 0, DIR_CSU_to_GrpMaster, value);
  465. }
  466. void SinglePsuPower(byte full_address, byte value)
  467. {
  468. //對單控制,DIR_CSU_to_Slave,需指定group + slv_address
  469. byte group = (full_address >> GroupAdd_Position) & ALL_Group;
  470. byte slv_address = full_address & ALL_Slave;
  471. SetPowerOnOff(group, slv_address, DIR_CSU_to_Slave, value);
  472. }
  473. void SwitchPower_On(byte group)
  474. {
  475. SwitchPower(group, PH_PSU_POWER_ON);
  476. }
  477. void SwitchPower_Off(byte group)
  478. {
  479. SwitchPower(group, PH_PSU_POWER_OFF);
  480. }
  481. void SinglePsuPower_On(byte address)
  482. {
  483. SinglePsuPower(address, PH_PSU_POWER_ON);
  484. }
  485. void SinglePsuPower_Off(byte address)
  486. {
  487. SinglePsuPower(address, PH_PSU_POWER_OFF);
  488. }
  489. void SleepMode(byte group, byte value)
  490. {
  491. // no function
  492. }
  493. void FlashLed(byte group, byte value)
  494. {
  495. // no function
  496. }
  497. void SingleFlashLed(byte address, byte value)
  498. {
  499. // no function
  500. }
  501. void FlashLed_Static(byte group)
  502. {
  503. FlashLed(group, 0);
  504. }
  505. void FlashLed_Blinking(byte group)
  506. {
  507. FlashLed(group, 1);
  508. }
  509. void SingleFlashLed_Static(byte address)
  510. {
  511. SingleFlashLed(address, 0);
  512. }
  513. void SingleFlashLed_Blinking(byte address)
  514. {
  515. SingleFlashLed(address, 1);
  516. }
  517. void PresentOutputVol(byte group, int voltage, int current_percent)
  518. {
  519. //電流命令需換成最大電流之百分比,兩種方式:
  520. //(1) API輸入參數多一個Max Current,由此Func內換算百分比
  521. //(2) API輸入參數改為current_percent,APP端算出百分比後輸入
  522. SetOutput(group, 0, DIR_CSU_to_GrpMaster, voltage, current_percent);
  523. }
  524. void SingleOutputVol(byte full_address, int voltage, int current_percent)
  525. {
  526. byte group = (full_address >> GroupAdd_Position) & ALL_Group;
  527. byte slv_address = full_address & ALL_Slave;
  528. SetOutput(group, slv_address, DIR_CSU_to_GrpMaster, voltage, current_percent);
  529. }
  530. void FanNoiseInfo(byte group, byte value)
  531. {
  532. // no function
  533. }
  534. void SetWalkInConfig(byte group, byte enable, byte sec)
  535. {
  536. // no function
  537. }
  538. void SetDirModulePresentOutput(byte group, int voltage, int current, byte _switch, byte _interRelay)
  539. {
  540. // no function
  541. }
  542. void SetDipSwitchMode()
  543. {
  544. // no function
  545. }
  546. void UnlockPsuAlarm(byte full_address)
  547. {
  548. byte group = (full_address >> GroupAdd_Position) & ALL_Group;
  549. byte slv_address = full_address & ALL_Slave;
  550. byte dataPH = PUS_UNLOCK_CMD;
  551. PH_PwrFrame PwrFrameMsg;
  552. PwrFrameMsg.PwrMessage = 0;
  553. PwrFrameMsg.PHBits.MessageID = PH_PSU_WCmd_UnlockPsuCommand;
  554. PwrFrameMsg.PHBits.SlaveGroup = group;
  555. PwrFrameMsg.PHBits.SlaveAddress = slv_address;
  556. PwrFrameMsg.PHBits.DIR = DIR_CSU_to_Slave;
  557. SendCmdToPsu(PwrFrameMsg.PwrMessage, &dataPH, 1);
  558. }
  559. /**********************************************************************************/
  560. /*** ***/
  561. /*** Get ***/
  562. /*** ***/
  563. /**********************************************************************************/
  564. // 0x04
  565. void GetStatus(byte group)
  566. {
  567. PH_PwrFrame PwrFrameMsg;
  568. PwrFrameMsg.PwrMessage = 0;
  569. PwrFrameMsg.PHBits.MessageID = PH_PSU_RCmd_GetAlarmFault;
  570. PwrFrameMsg.PHBits.SlaveGroup = group;
  571. PwrFrameMsg.PHBits.SlaveAddress = ALL_Slave;
  572. PwrFrameMsg.PHBits.DIR = DIR_CSU_to_Slave;
  573. SendCmdToPsu(PwrFrameMsg.PwrMessage, 0, 0);
  574. }
  575. void GetFanSpeed(byte group)
  576. {
  577. }
  578. // 0x06
  579. void GetDcTemperature(byte group)
  580. {
  581. PH_PwrFrame PwrFrameMsg;
  582. PwrFrameMsg.PwrMessage = 0;
  583. PwrFrameMsg.PHBits.MessageID = PH_PSU_RCmd_GetTemperature;
  584. PwrFrameMsg.PHBits.SlaveGroup = group;
  585. PwrFrameMsg.PHBits.SlaveAddress = ALL_Slave;
  586. PwrFrameMsg.PHBits.DIR = DIR_CSU_to_Slave;
  587. SendCmdToPsu(PwrFrameMsg.PwrMessage, 0, 0);
  588. }
  589. // 0x06
  590. void GetPfcTemperature(byte group)
  591. {
  592. PH_PwrFrame PwrFrameMsg;
  593. PwrFrameMsg.PwrMessage = 0;
  594. PwrFrameMsg.PHBits.MessageID = PH_PSU_RCmd_GetTemperature;
  595. PwrFrameMsg.PHBits.SlaveGroup = group;
  596. PwrFrameMsg.PHBits.SlaveAddress = ALL_Slave;
  597. PwrFrameMsg.PHBits.DIR = DIR_CSU_to_Slave;
  598. SendCmdToPsu(PwrFrameMsg.PwrMessage, 0, 0);
  599. }
  600. // 0x03
  601. void GetModuleCount(byte group)
  602. {
  603. PH_PwrFrame PwrFrameMsg;
  604. PwrFrameMsg.PwrMessage = 0;
  605. PwrFrameMsg.PHBits.MessageID = PH_PSU_RCmd_GetGroupModuleCount;
  606. PwrFrameMsg.PHBits.SlaveGroup = group;
  607. PwrFrameMsg.PHBits.DIR = DIR_CSU_to_GrpMaster;
  608. SendCmdToPsu(PwrFrameMsg.PwrMessage, 0, 0);
  609. }
  610. void GetSysModuleCount(void)
  611. {
  612. }
  613. // 0x05
  614. void GetModuleVer(byte group, byte type)
  615. {
  616. byte dataPH = 0;
  617. PH_PwrFrame PwrFrameMsg;
  618. PwrFrameMsg.PwrMessage = 0;
  619. PwrFrameMsg.PHBits.MessageID = PH_PSU_RCmd_GetModuleVersion;
  620. PwrFrameMsg.PHBits.SlaveGroup = group;
  621. PwrFrameMsg.PHBits.SlaveAddress = ALL_Slave;
  622. PwrFrameMsg.PHBits.DIR = DIR_CSU_to_Slave;
  623. //DD FW ver. 0x01
  624. //PFC FW ver. 0x02
  625. //DD Bootloader ver. 0x03
  626. //PFC Bootloader ver. 0x04
  627. dataPH = type;
  628. SendCmdToPsu(PwrFrameMsg.PwrMessage, &dataPH, 1);
  629. }
  630. void GetAllModuleVer(byte group)
  631. {
  632. GetModuleVer(group, PH_FW_DD_App);
  633. GetModuleVer(group, PH_FW_PFC_App);
  634. }
  635. // 0x04
  636. void GetModuleCap(byte group)
  637. {
  638. PH_PwrFrame PwrFrameMsg;
  639. PwrFrameMsg.PwrMessage = 0;
  640. PwrFrameMsg.PHBits.MessageID = PH_PSU_RCmd_GetAlarmFault;
  641. PwrFrameMsg.PHBits.SlaveGroup = group;
  642. PwrFrameMsg.PHBits.SlaveAddress = ALL_Slave;
  643. PwrFrameMsg.PHBits.DIR = DIR_CSU_to_Slave;
  644. SendCmdToPsu(PwrFrameMsg.PwrMessage, 0, 0);
  645. }
  646. void GetModuleBarCode(byte group)
  647. {
  648. // no function
  649. }
  650. // 0x07
  651. void GetModuleInputVol(byte group)
  652. {
  653. PH_PwrFrame PwrFrameMsg;
  654. PwrFrameMsg.PwrMessage = 0;
  655. PwrFrameMsg.PHBits.MessageID = PH_PSU_RCmd_GetACInputVoltage;
  656. PwrFrameMsg.PHBits.SlaveGroup = group;
  657. PwrFrameMsg.PHBits.SlaveAddress = ALL_Slave;
  658. PwrFrameMsg.PHBits.DIR = DIR_CSU_to_Slave;
  659. SendCmdToPsu(PwrFrameMsg.PwrMessage, 0, 0);
  660. }
  661. // 0x08
  662. void GetModuleInputCur(byte group)
  663. {
  664. PH_PwrFrame PwrFrameMsg;
  665. PwrFrameMsg.PwrMessage = 0;
  666. PwrFrameMsg.PHBits.MessageID = PH_PSU_RCmd_GetACInputCurrent;
  667. PwrFrameMsg.PHBits.SlaveGroup = group;
  668. PwrFrameMsg.PHBits.SlaveAddress = ALL_Slave;
  669. PwrFrameMsg.PHBits.DIR = DIR_CSU_to_Slave;
  670. SendCmdToPsu(PwrFrameMsg.PwrMessage, 0, 0);
  671. }
  672. void GetModuleOutput(byte group) //APP未使用此
  673. {
  674. byte dataPH[2] = {0};
  675. PH_PwrFrame PwrFrameMsg;
  676. PwrFrameMsg.PwrMessage = 0;
  677. PwrFrameMsg.PHBits.MessageID = PH_PSU_RCmd_GetPresentOutput;
  678. PwrFrameMsg.PHBits.SlaveGroup = group;
  679. PwrFrameMsg.PHBits.SlaveAddress = 0;
  680. PwrFrameMsg.PHBits.DIR = DIR_CSU_to_GrpMaster;
  681. SendCmdToPsu(PwrFrameMsg.PwrMessage, dataPH, sizeof(dataPH));
  682. }
  683. void GetModuleOutputF(byte group)
  684. {
  685. byte dataPH[2] = {0};
  686. PH_PwrFrame PwrFrameMsg;
  687. PwrFrameMsg.PwrMessage = 0;
  688. PwrFrameMsg.PHBits.MessageID = PH_PSU_RCmd_GetPresentOutput;
  689. PwrFrameMsg.PHBits.SlaveGroup = group;
  690. PwrFrameMsg.PHBits.SlaveAddress = 0;
  691. PwrFrameMsg.PHBits.DIR = DIR_CSU_to_GrpMaster;
  692. SendCmdToPsu(PwrFrameMsg.PwrMessage, dataPH, sizeof(dataPH));
  693. }
  694. void GetErrorRecord(byte group)
  695. {
  696. PH_PwrFrame PwrFrameMsg;
  697. PwrFrameMsg.PwrMessage = 0;
  698. PwrFrameMsg.PHBits.MessageID = PH_PSU_RCmd_GetErrorRecord;
  699. PwrFrameMsg.PHBits.SlaveGroup = group;
  700. PwrFrameMsg.PHBits.SlaveAddress = ALL_Slave;
  701. PwrFrameMsg.PHBits.DIR = DIR_CSU_to_Slave;
  702. SendCmdToPsu(PwrFrameMsg.PwrMessage, 0, 0);
  703. }
  704. /**********************************************************************************/
  705. /*** ***/
  706. /*** Upgrate ***/
  707. /*** ***/
  708. /**********************************************************************************/
  709. void ChangePsuBaudrate(short baudrate)
  710. {
  711. }