cascade_slave.c 52 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250
  1. #include "modbus.h"
  2. #include "common.h"
  3. #include "list.h"
  4. #include "switch_ctrl.h"
  5. #include "cascade.h"
  6. #include "sqlite_handle.h"
  7. #include "sys.h"
  8. #include "thread.h"
  9. #include "sensor_handle.h"
  10. #include "pthread.h"
  11. #include "modbus.h"
  12. #define DEV_CHN_REG (4000)
  13. #define OUT_INFO_REG (4001)
  14. #define IN_TOTAL_REG (4768)
  15. #define TEM_HUMAN_REG (4777)
  16. #define CHN_SWITCH_REG (4779)
  17. #define CHN_OPEN_DLA_REG (4843)
  18. #define CHN_CLOSE_DLA_REG (4907)
  19. #define CHN_SET_OPEN_DLA_REG (5000)
  20. #define CHN_SET_CLOSE_DLA_REG (5064)
  21. #define CHN_SET_SWITCH_STA_REG (5128)
  22. #define ALL_SET_SWITCH_REG (5192)
  23. enum{
  24. TYPE_U16,
  25. TYPE_U32
  26. };
  27. enum {
  28. DS_R_DEV_CHN = 0,
  29. DS_R_OUT_INFO,
  30. DS_R_IN_TOTAL,
  31. DS_R_TEMP_HUM,
  32. DS_R_SWITCH_STA,
  33. DS_R_OPEN_DELAY,
  34. DS_R_CLOSE_DELAY,
  35. DS_W_OPEN_DELAY,
  36. DS_W_CLOSE_DELAY,
  37. DS_W_CHN_SWITCH_STA,
  38. DS_W_ALL_CHN_STA
  39. };
  40. #define TREE_DEV_CHN_REG (6000)
  41. #define TREE_INPUT_A_REG (6001)
  42. #define TREE_INPUT_B_REG (6009)
  43. #define TREE_INPUT_C_REG (6017)
  44. #define TREE_CHN_TOTAL_REG (6025)
  45. #define TREE_CHN_PH_REG (6665)
  46. #define TREE_TEMP_HUM_REG (8585)
  47. #define TREE_CHN_SWITCH_STA_REG (8587)
  48. #define TREE_CHN_OPEN_DLA_REG (8651)
  49. #define TREE_CHN_CLOSE_DLA_REG (8715)
  50. #define TREE_CHN_SET_OPEN_DLA_REG (9000)
  51. #define TREE_CHN_SET_CLOSE_DLA_REG (9064)
  52. #define TREE_CHN_SET_SWITCH_STA_REG (9128)
  53. #define TREE_ALL_SET_SWITCH_REG (9192)
  54. enum {
  55. TREE_R_DEV_CHN,
  56. TREE_R_INPUT_ALL_A,
  57. TREE_R_INPUT_ALL_B,
  58. TREE_R_INPUT_ALL_C,
  59. TREE_R_CHN_TOTAL,
  60. TREE_R_CHN_PH_INFO,
  61. TREE_R_TEMP_HUM,
  62. TREE_R_SWITCH_STA,
  63. TREE_R_OPEN_DELAY,
  64. TREE_R_CLOSE_DELAY,
  65. TREE_W_OPEN_DELAY,
  66. TREE_W_CLOSE_DELAY,
  67. TREE_W_CHN_SWITCH_STA,
  68. TREE_W_ALL_CHN_STA
  69. };
  70. #define DEV_CHN_REG (4000)
  71. #define DEV_IP_MAC (4001)
  72. #define POWER_INFO_REG (4007) //32*16
  73. #define POWER_LENTH (542)
  74. #define WARNING_485_IP (4600)
  75. #define W_LENTH (32)
  76. #define IP_SET_SADDR_VOLTAGE_MAX (4600)
  77. #define IP_SET_SADDR_VOLTAGE_MIN (4700)
  78. #define IP_SET_CUREENT_MAX (4800)
  79. #define IP_SET_POWER_MAX (4900)
  80. #define IP_SET_CONSUMER_MAX (5000)
  81. enum{
  82. DS_IP_DEV_CHN,
  83. DS_IP_MAC,
  84. DS_POWER_INFO_REG,
  85. DS_WANNING_REG,
  86. };
  87. static inline GlobalDeviceManager* get_dm(void)
  88. {
  89. return &__globalDeviceManage;
  90. }
  91. static inline GlobalDeviceManager* get_dm2(void)
  92. {
  93. return &__globalDeviceManage2;
  94. }
  95. static mmap_modbus_t modbus_single[] = {
  96. [DS_R_DEV_CHN ]{.offset = DEV_CHN_REG },
  97. [DS_R_OUT_INFO ]{.offset = OUT_INFO_REG },
  98. [DS_R_IN_TOTAL ]{.offset = IN_TOTAL_REG },
  99. [DS_R_TEMP_HUM ]{.offset = TEM_HUMAN_REG },
  100. [DS_R_SWITCH_STA ]{.offset = CHN_SWITCH_REG },
  101. [DS_R_OPEN_DELAY ]{.offset = CHN_OPEN_DLA_REG },
  102. [DS_R_CLOSE_DELAY ]{.offset = CHN_CLOSE_DLA_REG },
  103. [DS_W_OPEN_DELAY ]{.offset = CHN_SET_OPEN_DLA_REG },
  104. [DS_W_CLOSE_DELAY ]{.offset = CHN_SET_CLOSE_DLA_REG },
  105. [DS_W_CHN_SWITCH_STA]{.offset = CHN_SET_SWITCH_STA_REG },
  106. [DS_W_ALL_CHN_STA ]{.offset = ALL_SET_SWITCH_REG },
  107. };
  108. static mmap_modbus_t modbus_three[] = {
  109. [TREE_R_DEV_CHN ]{.offset = TREE_DEV_CHN_REG},
  110. [TREE_R_INPUT_ALL_A ]{.offset = TREE_INPUT_A_REG },
  111. [TREE_R_INPUT_ALL_B ]{.offset = TREE_INPUT_B_REG },
  112. [TREE_R_INPUT_ALL_C ]{.offset = TREE_INPUT_C_REG },
  113. [TREE_R_CHN_TOTAL ]{.offset = TREE_CHN_TOTAL_REG },
  114. [TREE_R_CHN_PH_INFO ]{.offset = TREE_CHN_PH_REG },
  115. [TREE_R_TEMP_HUM ]{.offset = TREE_TEMP_HUM_REG },
  116. [TREE_R_SWITCH_STA ]{.offset = TREE_CHN_SWITCH_STA_REG},
  117. [TREE_R_OPEN_DELAY ]{.offset = TREE_CHN_OPEN_DLA_REG },
  118. [TREE_R_CLOSE_DELAY ]{.offset = TREE_CHN_CLOSE_DLA_REG },
  119. [TREE_W_OPEN_DELAY ]{.offset = TREE_CHN_SET_OPEN_DLA_REG},
  120. [TREE_W_CLOSE_DELAY ]{.offset = TREE_CHN_SET_CLOSE_DLA_REG},
  121. [TREE_W_CHN_SWITCH_STA ]{.offset = TREE_CHN_SET_SWITCH_STA_REG},
  122. [TREE_W_ALL_CHN_STA ]{.offset = TREE_ALL_SET_SWITCH_REG }
  123. };
  124. static mmap_modbus_t ip[] ={
  125. [DS_IP_DEV_CHN ]{.offset = DEV_CHN_REG },
  126. [DS_IP_MAC ]{.offset = DEV_IP_MAC },
  127. [DS_POWER_INFO_REG ]{.offset = POWER_INFO_REG },
  128. };
  129. typedef struct {
  130. modbus_mapping_t *map;
  131. }slave_handle_t;
  132. static slave_handle_t slHandle;
  133. modbus_mapping_t *cascade_slave_map()
  134. {
  135. return slHandle.map;
  136. }
  137. #if 0
  138. int cascade_slave_init(void)
  139. {
  140. slave_handle_t *sh=&slHandle;
  141. GlobalDeviceManager* mgr=get_dm();
  142. if(mgr->_globalDevInfo.product_pwr_type == SmartPDU_AC ||
  143. mgr->_globalDevInfo.product_pwr_type == SmartPDU_DC) // single AC
  144. {
  145. if(sh->map)
  146. {
  147. free(sh->map);
  148. sh->map = NULL;
  149. }
  150. sh->map = modbus_mapping_new_start_address(0,0,0,0,DEV_CHN_REG,5000,0,0); //3000 ge
  151. modbus_single[DS_R_DEV_CHN ].addr = &mgr->single_mmap->dev_chn;
  152. modbus_single[DS_R_OUT_INFO ].addr = &mgr->single_mmap->all_ch;
  153. modbus_single[DS_R_IN_TOTAL ].addr = &mgr->single_mmap->total_valtage;
  154. modbus_single[DS_R_TEMP_HUM ].addr = &mgr->single_mmap->total_temp;
  155. modbus_single[DS_R_SWITCH_STA ].addr = &mgr->single_mmap->chn_status;
  156. modbus_single[DS_R_OPEN_DELAY ].addr = &mgr->single_mmap->open_delay;
  157. modbus_single[DS_R_CLOSE_DELAY ].addr = &mgr->single_mmap->close_delay;
  158. modbus_single[DS_W_OPEN_DELAY ].addr = &mgr->single_mmap->set_chn_open_delay;
  159. modbus_single[DS_W_CLOSE_DELAY ].addr = &mgr->single_mmap->set_chn_close_delay;
  160. modbus_single[DS_W_CHN_SWITCH_STA ].addr = &mgr->single_mmap->set_chn_switch_status;
  161. modbus_single[DS_W_ALL_CHN_STA ].addr = &mgr->single_mmap->set_chn_all_switch_status;
  162. printf("single dc address init 4000\n");
  163. }else
  164. {
  165. if(sh->map)
  166. {
  167. free(sh->map);
  168. sh->map = NULL;
  169. }
  170. sh->map = modbus_mapping_new_start_address(0,0,0,0,TREE_DEV_CHN_REG,7000,0,0);
  171. modbus_three[TREE_R_DEV_CHN ].addr = &mgr->triphasic_mmap->dev_chn;
  172. modbus_three[TREE_R_INPUT_ALL_A ].addr = &mgr->triphasic_mmap->i_total.pw_i_total[0];
  173. modbus_three[TREE_R_INPUT_ALL_B ].addr = &mgr->triphasic_mmap->i_total.pw_i_total[1];
  174. modbus_three[TREE_R_INPUT_ALL_C ].addr = &mgr->triphasic_mmap->i_total.pw_i_total[2];
  175. modbus_three[TREE_R_CHN_TOTAL ].addr = &mgr->triphasic_mmap->chn_info;
  176. modbus_three[TREE_R_CHN_PH_INFO ].addr = &mgr->triphasic_mmap->pw_o_chn;
  177. modbus_three[TREE_R_TEMP_HUM ].addr = &mgr->triphasic_mmap->temperature;
  178. modbus_three[TREE_R_SWITCH_STA ].addr = &mgr->triphasic_mmap->chn_status;
  179. modbus_three[TREE_R_OPEN_DELAY ].addr = &mgr->triphasic_mmap->open_delay;
  180. modbus_three[TREE_R_CLOSE_DELAY ].addr = &mgr->triphasic_mmap->close_delay;
  181. modbus_three[TREE_W_OPEN_DELAY ].addr = &mgr->triphasic_mmap->set_chn_open_delay;
  182. modbus_three[TREE_W_CLOSE_DELAY ].addr = &mgr->triphasic_mmap->set_chn_close_delay;
  183. modbus_three[TREE_W_CHN_SWITCH_STA ].addr = &mgr->triphasic_mmap->set_chn_switch_status;
  184. modbus_three[TREE_W_ALL_CHN_STA ].addr = &mgr->triphasic_mmap->set_chn_all_switch_status;
  185. printf("triphasic address init 6000\n");
  186. //return -1;
  187. }
  188. return 0;
  189. }
  190. static void slave_read(slave_handle_t *sh, uint32_t addr,int num,uint32_t reg_type,uint32_t type)
  191. {
  192. GlobalDeviceManager* mgr=get_dm();
  193. if(mgr->_globalDevInfo.product_pwr_type == SmartPDU_AC ||
  194. mgr->_globalDevInfo.product_pwr_type == SmartPDU_DC){
  195. if(addr >= DEV_CHN_REG && addr <= ALL_SET_SWITCH_REG)
  196. {
  197. if(type == TYPE_U16)
  198. {
  199. uint16_t *base_addr = (uint16_t *)modbus_single[reg_type].addr;
  200. uint32_t step = addr - sh->map->start_registers;
  201. base_addr = base_addr + (addr - modbus_single[reg_type].offset);
  202. uint16_t *map_addr = (uint16_t *)&(sh->map->tab_registers[step]);
  203. if(num < 126)
  204. {
  205. memcpy(map_addr, base_addr,2*num);
  206. }
  207. }else
  208. {
  209. uint32_t *base_addr = (uint32_t *)modbus_single[reg_type].addr;
  210. uint32_t step = addr - sh->map->start_registers;
  211. base_addr = base_addr + (addr - modbus_single[reg_type].offset) / 2;
  212. uint32_t *map_addr = (uint32_t *)&(sh->map->tab_registers[step]);
  213. if(num < 126)
  214. {
  215. memcpy(map_addr, base_addr,2*num);
  216. }
  217. }
  218. }
  219. }else
  220. {
  221. if(addr >= TREE_DEV_CHN_REG && addr <= TREE_ALL_SET_SWITCH_REG) {
  222. if(type == TYPE_U16)
  223. {
  224. uint16_t *base_addr = (uint16_t *)modbus_three[reg_type].addr;
  225. uint32_t step = addr - sh->map->start_registers;
  226. base_addr = base_addr + (addr - modbus_three[reg_type].offset);
  227. uint16_t *map_addr = (uint16_t *)&(sh->map->tab_registers[step]);
  228. if(num < 126)
  229. {
  230. memcpy(map_addr, base_addr,2*num);
  231. }
  232. }else
  233. {
  234. uint32_t *base_addr = (uint32_t *)modbus_three[reg_type].addr;
  235. uint32_t step = addr - sh->map->start_registers;
  236. base_addr = base_addr + (addr - modbus_three[reg_type].offset) / 2;
  237. uint32_t *map_addr = (uint32_t *)&(sh->map->tab_registers[step]);
  238. if(num < 126)
  239. {
  240. memcpy(map_addr, base_addr,2*num);
  241. }
  242. }
  243. }
  244. }
  245. }
  246. void cascade_slave_read(uint32_t addr,uint32_t lenth)
  247. {
  248. slave_handle_t *sh=&slHandle;
  249. switch (addr)
  250. {
  251. case 4000:
  252. slave_read(sh,addr,lenth,DS_R_DEV_CHN,TYPE_U16);
  253. break;
  254. case 4001 ... 4768:
  255. slave_read(sh,addr,lenth,DS_R_OUT_INFO,TYPE_U32);
  256. break;
  257. case 4769 ... 4776:
  258. slave_read(sh,addr,lenth,DS_R_IN_TOTAL,TYPE_U32);
  259. break;
  260. case 4777 ... 4778:
  261. slave_read(sh,addr,lenth,DS_R_TEMP_HUM,TYPE_U16);
  262. case 4779 ... 4842:
  263. slave_read(sh,addr,lenth,DS_R_SWITCH_STA,TYPE_U16);
  264. break;
  265. case 4843 ... 4906:
  266. slave_read(sh,addr,lenth,DS_R_OPEN_DELAY,TYPE_U16);
  267. break;
  268. case 4907 ... 4970:
  269. slave_read(sh,addr,lenth,DS_R_CLOSE_DELAY,TYPE_U16);
  270. break;
  271. case 5000 ... 5063:
  272. slave_read(sh,addr,lenth,DS_W_OPEN_DELAY,TYPE_U16);
  273. break;
  274. case 5064 ... 5127:
  275. slave_read(sh,addr,lenth,DS_W_OPEN_DELAY,TYPE_U16);
  276. break;
  277. case 5128 ... 5191:
  278. slave_read(sh,addr,lenth,DS_W_CHN_SWITCH_STA,TYPE_U16);
  279. break;
  280. case 5192 :
  281. slave_read(sh,addr,lenth,DS_W_ALL_CHN_STA,TYPE_U16);
  282. break;
  283. // triple
  284. case 6000:
  285. slave_read(sh,addr,lenth,TREE_R_DEV_CHN,TYPE_U16);
  286. break;
  287. case 6001 ... 6008:
  288. slave_read(sh,addr,lenth,TREE_R_INPUT_ALL_A,TYPE_U32);
  289. break;
  290. case 6009 ... 6016:
  291. slave_read(sh,addr,lenth,TREE_R_INPUT_ALL_B,TYPE_U32);
  292. break;
  293. case 6017 ... 6024:
  294. slave_read(sh,addr,lenth,TREE_R_INPUT_ALL_C,TYPE_U32);
  295. break;
  296. case 6025 ... 6664:
  297. slave_read(sh,addr,lenth,TREE_R_CHN_TOTAL,TYPE_U32);
  298. break;
  299. case 6665 ... 8584:
  300. slave_read(sh,addr,lenth,TREE_R_CHN_PH_INFO,TYPE_U32);
  301. break;
  302. case 8585 ... 8586:
  303. slave_read(sh,addr,lenth,TREE_R_TEMP_HUM,TYPE_U16);
  304. break;
  305. case 8587 ... 8650:
  306. slave_read(sh,addr,lenth,TREE_R_SWITCH_STA,TYPE_U16);
  307. break;
  308. case 8651 ... 8714:
  309. slave_read(sh,addr,lenth,TREE_R_OPEN_DELAY,TYPE_U16);
  310. break;
  311. case 8715 ... 8778:
  312. slave_read(sh,addr,lenth,TREE_R_CLOSE_DELAY,TYPE_U16);
  313. break;
  314. default:
  315. break;
  316. }
  317. }
  318. void cascade_slave_write(uint32_t addr, uint16_t val)
  319. {
  320. slave_handle_t *sh=&slHandle;
  321. GlobalDeviceManager* mgr=get_dm();
  322. uint16_t buff[128] = {0};
  323. if(mgr->_globalDevInfo.product_pwr_type == SmartPDU_AC
  324. || mgr->_globalDevInfo.product_pwr_type == SmartPDU_DC)
  325. {
  326. switch(addr)
  327. {
  328. case 5000 ... 5063:
  329. {
  330. int start_chn = addr - modbus_single[DS_W_OPEN_DELAY].offset;
  331. GlobalPowerManger* _globalPowerMangerTemp = NULL ;
  332. list_for_each_entry(_globalPowerMangerTemp, &__globalDeviceManage._globalPowerManger.list, list)
  333. {
  334. if(_globalPowerMangerTemp==NULL)
  335. break;
  336. if((start_chn+1) == _globalPowerMangerTemp->product_ch_id)
  337. {
  338. if(mgr->_globalDevInfo.product_pwr_type == SmartPDU_AC){
  339. _globalPowerMangerTemp->product_ch_start_delay=val;
  340. g_switch_set_ac_single_s_start_time_delay(&__globalDeviceManage._globalRelaySampManger,_globalPowerMangerTemp->product_saddr,
  341. _globalPowerMangerTemp->product_ch_addr,val);
  342. }else
  343. {
  344. _globalPowerMangerTemp->product_ch_start_delay=val;
  345. g_switch_set_dcpdu_start_time_delay(&__globalDeviceManage._globalRelaySampManger,_globalPowerMangerTemp->product_saddr,
  346. _globalPowerMangerTemp->product_ch_addr,val/1000);
  347. }
  348. if (dev_update_power_manage_genera_info(__globalDeviceManage.db, _globalPowerMangerTemp->product_id, _globalPowerMangerTemp->product_ch_id, _globalPowerMangerTemp) != 0)
  349. {
  350. log_e("update pwr general data err.");
  351. }
  352. printf("val = %d start_chn = %d\n",val,start_chn);
  353. // *(uint16_t *)((uint16_t*)(modbus_single[6].addr) + start_chn) = val;
  354. break;
  355. }
  356. }
  357. }
  358. break;
  359. case 5064 ... 5127:
  360. {
  361. int start_chn = addr - modbus_single[DS_W_CLOSE_DELAY].offset;
  362. GlobalPowerManger* _globalPowerMangerTemp = NULL ;
  363. list_for_each_entry(_globalPowerMangerTemp, &__globalDeviceManage._globalPowerManger.list, list)
  364. {
  365. if(_globalPowerMangerTemp==NULL)
  366. break;
  367. if((start_chn+1) == _globalPowerMangerTemp->product_ch_id)
  368. {
  369. if(mgr->_globalDevInfo.product_pwr_type == SmartPDU_AC){
  370. _globalPowerMangerTemp->product_ch_stop_delay=val;
  371. g_switch_set_ac_single_s_stop_time_delay(&__globalDeviceManage._globalRelaySampManger,_globalPowerMangerTemp->product_saddr,
  372. _globalPowerMangerTemp->product_ch_addr,val);
  373. }else
  374. {
  375. _globalPowerMangerTemp->product_ch_stop_delay=val;
  376. g_switch_set_dcpdu_stop_time_delay(&__globalDeviceManage._globalRelaySampManger,_globalPowerMangerTemp->product_saddr,
  377. _globalPowerMangerTemp->product_ch_addr,val/1000);
  378. }
  379. if (dev_update_power_manage_genera_info(__globalDeviceManage.db, _globalPowerMangerTemp->product_id, _globalPowerMangerTemp->product_ch_id, _globalPowerMangerTemp) != 0)
  380. {
  381. log_e("update pwr general data err.");
  382. }
  383. printf("val = %d",val);
  384. //*(uint16_t *)((uint16_t*)(modbus_single[7].addr) + start_chn) = val;
  385. //printf("modbus_single[7].addr = %d ",modbus_single[7].addr);
  386. break;
  387. }
  388. }
  389. }
  390. break;
  391. case 5128 ... 5191:
  392. {
  393. int start_chn = addr - modbus_single[DS_W_CHN_SWITCH_STA].offset;
  394. GlobalPowerManger* _globalPowerMangerTemp = NULL ;
  395. if (val == 0 || val == 1)
  396. {
  397. list_for_each_entry(_globalPowerMangerTemp, &__globalDeviceManage._globalPowerManger.list, list)
  398. {
  399. if (_globalPowerMangerTemp == NULL)
  400. break;
  401. if ((start_chn + 1) == _globalPowerMangerTemp->product_ch_id)
  402. {
  403. int ret = g_switch_set_all_chn_ctrl(&__globalDeviceManage._globalRelaySampManger, _globalPowerMangerTemp,
  404. _globalPowerMangerTemp->product_saddr,
  405. _globalPowerMangerTemp->product_ch_addr,
  406. val, false);
  407. // printf("ret = %d 0x%x\n",ret,val);
  408. *(uint16_t *)((uint16_t *)(modbus_single[DS_W_CHN_SWITCH_STA].addr) + start_chn) = val;
  409. break;
  410. }
  411. }
  412. }
  413. }
  414. break;
  415. case 5192:
  416. {
  417. if (val == 0 || val == 1)
  418. {
  419. GlobalPowerManger *_globalPowerMangerTemp = NULL;
  420. list_for_each_entry(_globalPowerMangerTemp, &__globalDeviceManage._globalPowerManger.list, list)
  421. {
  422. if (_globalPowerMangerTemp == NULL)
  423. break;
  424. int rec = g_switch_set_all_ctrl(&__globalDeviceManage._globalRelaySampManger, _globalPowerMangerTemp->product_ch_type, _globalPowerMangerTemp->product_saddr, val);
  425. // printf("rec = %d 0x%x\n",rec,val);
  426. }
  427. *(uint16_t *)(modbus_single[DS_W_ALL_CHN_STA].addr) = val;
  428. }
  429. }
  430. break;
  431. default:
  432. break;
  433. }
  434. }else{
  435. switch(addr)
  436. {
  437. case 9000 ... 9063:
  438. {
  439. int start_chn = addr - modbus_three[TREE_W_OPEN_DELAY].offset;
  440. GlobalPowerManger* _globalPowerMangerTemp = NULL ;
  441. list_for_each_entry(_globalPowerMangerTemp, &__globalDeviceManage._globalPowerManger.list, list){
  442. if(_globalPowerMangerTemp==NULL)
  443. break;
  444. if((start_chn+1) == _globalPowerMangerTemp->product_ch_id)
  445. {
  446. int ret = 0;
  447. _globalPowerMangerTemp->product_ch_start_delay = val;
  448. if (__globalDeviceManage._globalDevInfo.product_pwr_type == SmartPDU_Tree_AC_Tree
  449. ||__globalDeviceManage._globalDevInfo.product_pwr_type == SmartPDU_Tree_AC_One
  450. ||__globalDeviceManage._globalDevInfo.product_pwr_type == SmartPDU_Tree_AC_One_B
  451. )
  452. {
  453. printf("hwllo every one stop time !!!!\n");
  454. ret = g_switch_set_t_ac_start_time_delay(&__globalDeviceManage._globalRelaySampManger,
  455. _globalPowerMangerTemp->product_saddr, (_globalPowerMangerTemp->product_ch_addr - 1) * 3, val / 1000);
  456. ret = g_switch_set_t_ac_start_time_delay(&__globalDeviceManage._globalRelaySampManger,
  457. _globalPowerMangerTemp->product_saddr, (_globalPowerMangerTemp->product_ch_addr - 1) * 3 + 1, val / 1000);
  458. ret = g_switch_set_t_ac_start_time_delay(&__globalDeviceManage._globalRelaySampManger,
  459. _globalPowerMangerTemp->product_saddr, (_globalPowerMangerTemp->product_ch_addr - 1) * 3 + 2, val / 1000);
  460. }
  461. else
  462. {
  463. ret = g_switch_set_t_ac_start_time_delay(&__globalDeviceManage._globalRelaySampManger,
  464. _globalPowerMangerTemp->product_saddr, (_globalPowerMangerTemp->product_ch_addr - 1) * 3, val / 1000);
  465. }
  466. if (dev_update_power_manage_genera_info(__globalDeviceManage.db, _globalPowerMangerTemp->product_id, _globalPowerMangerTemp->product_ch_id, _globalPowerMangerTemp) != 0)
  467. {
  468. log_e("update pwr general data err.");
  469. }
  470. break;
  471. }
  472. }
  473. }
  474. break;
  475. case 9064 ... 9127:
  476. {
  477. int start_chn = addr - modbus_three[TREE_W_CLOSE_DELAY].offset;
  478. GlobalPowerManger* _globalPowerMangerTemp = NULL ;
  479. list_for_each_entry(_globalPowerMangerTemp, &__globalDeviceManage._globalPowerManger.list, list)
  480. {
  481. if(_globalPowerMangerTemp==NULL)
  482. break;
  483. if((start_chn+1) == _globalPowerMangerTemp->product_ch_id)
  484. {
  485. int ret = 0;
  486. _globalPowerMangerTemp->product_ch_stop_delay = val;
  487. if (__globalDeviceManage._globalDevInfo.product_pwr_type == SmartPDU_Tree_AC_Tree
  488. ||__globalDeviceManage._globalDevInfo.product_pwr_type == SmartPDU_Tree_AC_One
  489. ||__globalDeviceManage._globalDevInfo.product_pwr_type == SmartPDU_Tree_AC_One_B)
  490. {
  491. ret = g_switch_set_t_ac_stop_time_delay(&__globalDeviceManage._globalRelaySampManger,
  492. _globalPowerMangerTemp->product_saddr, (_globalPowerMangerTemp->product_ch_addr - 1) * 3, val / 1000);
  493. ret = g_switch_set_t_ac_stop_time_delay(&__globalDeviceManage._globalRelaySampManger,
  494. _globalPowerMangerTemp->product_saddr, (_globalPowerMangerTemp->product_ch_addr - 1) * 3 + 1, val / 1000);
  495. ret = g_switch_set_t_ac_stop_time_delay(&__globalDeviceManage._globalRelaySampManger,
  496. _globalPowerMangerTemp->product_saddr, (_globalPowerMangerTemp->product_ch_addr - 1) * 3 + 2, val / 1000);
  497. }
  498. else
  499. {
  500. ret = g_switch_set_t_ac_stop_time_delay(&__globalDeviceManage._globalRelaySampManger,
  501. _globalPowerMangerTemp->product_saddr, (_globalPowerMangerTemp->product_ch_addr - 1) * 3, val / 1000);
  502. }
  503. if (dev_update_power_manage_genera_info(__globalDeviceManage.db, _globalPowerMangerTemp->product_id, _globalPowerMangerTemp->product_ch_id, _globalPowerMangerTemp) != 0)
  504. {
  505. log_e("update pwr general data err.");
  506. }
  507. break;
  508. }
  509. }
  510. }
  511. break;
  512. case 9128 ... 9191:
  513. {
  514. int start_chn = addr - modbus_three[TREE_W_CHN_SWITCH_STA].offset;
  515. GlobalPowerManger* _globalPowerMangerTemp = NULL ;
  516. list_for_each_entry(_globalPowerMangerTemp, &__globalDeviceManage._globalPowerManger.list, list){
  517. if(_globalPowerMangerTemp==NULL)
  518. break;
  519. if((start_chn+1) == _globalPowerMangerTemp->product_ch_id)
  520. {
  521. int t_ac_CtrlType=0;
  522. int nRet = 0;
  523. _globalPowerMangerTemp->product_ch_status = val;
  524. GlobalTreeACManager *_globalTACManager = NULL;
  525. list_for_each_entry(_globalTACManager, &_globalPowerMangerTemp->list_Tree_AC, list_Tree_AC)
  526. {
  527. t_ac_CtrlType=_globalTACManager->product_ph_outputType;
  528. }
  529. if (t_ac_CtrlType == 2&&(__globalDeviceManage._globalDevInfo.product_pwr_type == SmartPDU_Tree_AC_Tree
  530. ||__globalDeviceManage._globalDevInfo.product_pwr_type == SmartPDU_Tree_AC_One
  531. ||__globalDeviceManage._globalDevInfo.product_pwr_type == SmartPDU_Tree_AC_One_B))
  532. {
  533. if(_globalPowerMangerTemp->product_ch_type == AC_SINGLE_S_TYPE || _globalPowerMangerTemp->product_ch_type == AC_SINGLE_B_TYPE)
  534. {
  535. if (val == 1)
  536. {
  537. if (_globalPowerMangerTemp->global_over_manager->product_vol_upper_enable == 1)
  538. val |= ENABLE_TAC_V_UP;
  539. if (_globalPowerMangerTemp->global_over_manager->product_vol_lower_enable == 1)
  540. val |= ENABLE_TAC_V_DOWN;
  541. if (_globalPowerMangerTemp->global_over_manager->product_cur_upper_enable == 1)
  542. val |= ENABLE_TAC_A_UP;
  543. if (_globalPowerMangerTemp->global_over_manager->product_pwr_upper_enable == 1)
  544. val |= ENABLE_TAC_W_UP;
  545. if (_globalPowerMangerTemp->global_over_manager->product_pwrcon_upper_enable == 1)
  546. val |= ENABLE_TAC_P_UP;
  547. }
  548. g_switch_set_ac_single_s_chn_ctrl(&__globalDeviceManage._globalRelaySampManger, _globalPowerMangerTemp->product_saddr,
  549. (_globalPowerMangerTemp->product_ch_addr- 1), val);
  550. break;
  551. }
  552. unsigned short phsts=0;
  553. list_for_each_entry(_globalTACManager, &_globalPowerMangerTemp->list_Tree_AC, list_Tree_AC)
  554. {
  555. if (val == 1 && _globalTACManager->product_ph_outputStatus==1)
  556. {
  557. phsts=1;
  558. if (_globalTACManager->global_over_manager->product_vol_upper_enable == 1)
  559. phsts |= ENABLE_TAC_V_UP;
  560. if (_globalTACManager->global_over_manager->product_vol_lower_enable == 1)
  561. phsts |= ENABLE_TAC_V_DOWN;
  562. if (_globalTACManager->global_over_manager->product_cur_upper_enable == 1)
  563. phsts |= ENABLE_TAC_A_UP;
  564. if (_globalTACManager->global_over_manager->product_pwr_upper_enable == 1)
  565. phsts |= ENABLE_TAC_W_UP;
  566. if (_globalTACManager->global_over_manager->product_pwrcon_upper_enable == 1)
  567. phsts |= ENABLE_TAC_P_UP;
  568. }else{
  569. phsts=0;
  570. }
  571. nRet= g_switch_set_t_ac_phchn_ctrl(&__globalDeviceManage._globalRelaySampManger,
  572. _globalTACManager->product_saddr,
  573. _globalTACManager->product_ch_addr - 1,
  574. phsts);
  575. }
  576. break;
  577. }else
  578. {
  579. if (val == 1)
  580. {
  581. if (_globalPowerMangerTemp->global_over_manager->product_vol_upper_enable == 1)
  582. val |= ENABLE_TAC_V_UP;
  583. if (_globalPowerMangerTemp->global_over_manager->product_vol_lower_enable == 1)
  584. val |= ENABLE_TAC_V_DOWN;
  585. if (_globalPowerMangerTemp->global_over_manager->product_cur_upper_enable == 1)
  586. val |= ENABLE_TAC_A_UP;
  587. if (_globalPowerMangerTemp->global_over_manager->product_pwr_upper_enable == 1)
  588. val |= ENABLE_TAC_W_UP;
  589. if (_globalPowerMangerTemp->global_over_manager->product_pwrcon_upper_enable == 1)
  590. val |= ENABLE_TAC_P_UP;
  591. }
  592. /*
  593. if (isgroup)
  594. {
  595. sts |= ENABLE_TAC_STIME;
  596. sts |= ENABLE_TAC_ETIME;
  597. }*/
  598. if (__globalDeviceManage._globalDevInfo.product_pwr_type == SmartPDU_Tree_AC_One)
  599. {
  600. g_switch_set_t_ac_phchn_ctrl(&__globalDeviceManage._globalRelaySampManger,
  601. _globalPowerMangerTemp->product_saddr,
  602. _globalPowerMangerTemp->product_ch_addr - 1,
  603. val);
  604. }else{
  605. g_switch_set_t_ac_chn_ctrl(&__globalDeviceManage._globalRelaySampManger,
  606. _globalPowerMangerTemp->product_saddr,
  607. _globalPowerMangerTemp->product_ch_addr - 1,
  608. val);
  609. }
  610. }
  611. }
  612. }
  613. }
  614. break;
  615. case 9192:
  616. {
  617. if (val == 0 || val == 1)
  618. {
  619. GlobalPowerManger *_globalPowerMangerTemp = NULL;
  620. list_for_each_entry(_globalPowerMangerTemp, &__globalDeviceManage._globalPowerManger.list, list)
  621. {
  622. if (_globalPowerMangerTemp == NULL)
  623. break;
  624. _globalPowerMangerTemp->product_ch_status = val;
  625. int rec = g_switch_set_all_ctrl(&__globalDeviceManage._globalRelaySampManger, _globalPowerMangerTemp->product_ch_type, _globalPowerMangerTemp->product_saddr, val);
  626. // printf("rec = %d 0x%x\n",rec,val);
  627. }
  628. }
  629. }
  630. break;
  631. default:
  632. break;
  633. }
  634. }
  635. }
  636. #endif
  637. int cascade_slave_init(void)
  638. {
  639. slave_handle_t *sh=&slHandle;
  640. GlobalDeviceManager* mgr=get_dm();
  641. if(sh->map)
  642. {
  643. free(sh->map);
  644. sh->map = NULL;
  645. }
  646. sh->map = modbus_mapping_new_start_address(0,0,0,0,DEV_CHN_REG,2000,0,0); //3000 ge
  647. ip[DS_IP_DEV_CHN ].addr = &mgr->mmp->dev_chn;
  648. ip[DS_IP_MAC ].addr = &mgr->mmp->mac[0];
  649. ip[DS_POWER_INFO_REG ].addr = &mgr->mmp->data[0];
  650. return 0;
  651. }
  652. void cascade_slave_read(uint32_t addr,uint32_t lenth)
  653. {
  654. slave_handle_t *sh=&slHandle;
  655. switch(addr)
  656. {
  657. case DEV_CHN_REG:
  658. {
  659. uint16_t *base_addr = (uint16_t *)ip[DS_IP_DEV_CHN].addr;
  660. uint32_t step = addr - sh->map->start_registers;
  661. base_addr = base_addr + (addr - ip[DS_IP_DEV_CHN].offset);
  662. uint16_t *map_addr = (uint16_t *)&(sh->map->tab_registers[step]);
  663. if(lenth < 126)
  664. {
  665. memcpy(map_addr, base_addr,2*lenth);
  666. }
  667. }
  668. break;
  669. case DEV_IP_MAC:
  670. {
  671. uint16_t *base_addr = (uint16_t *)ip[DS_IP_MAC].addr;
  672. uint32_t step = addr - sh->map->start_registers;
  673. base_addr = base_addr + (addr - ip[DS_IP_MAC].offset);
  674. uint16_t *map_addr = (uint16_t *)&(sh->map->tab_registers[step]);
  675. if(lenth < 126)
  676. {
  677. memcpy(map_addr, base_addr,2*lenth);
  678. }
  679. }
  680. case POWER_INFO_REG ... (POWER_INFO_REG+POWER_LENTH):
  681. {
  682. uint16_t *base_addr = (uint16_t *)ip[DS_POWER_INFO_REG].addr;
  683. uint32_t step = addr - sh->map->start_registers;
  684. base_addr = base_addr + (addr - ip[DS_POWER_INFO_REG].offset);
  685. uint16_t *map_addr = (uint16_t *)&(sh->map->tab_registers[step]);
  686. if(lenth < 126)
  687. {
  688. memcpy(map_addr, base_addr,2*lenth);
  689. }
  690. }
  691. break;
  692. case WARNING_485_IP ... (WARNING_485_IP+W_LENTH):
  693. {
  694. uint16_t *base_addr = (uint16_t *)ip[DS_POWER_INFO_REG].addr;
  695. uint32_t step = addr - sh->map->start_registers;
  696. base_addr = base_addr + (addr - ip[DS_POWER_INFO_REG].offset);
  697. uint16_t *map_addr = (uint16_t *)&(sh->map->tab_registers[step]);
  698. if(lenth < 126)
  699. {
  700. memcpy(map_addr, base_addr,2*lenth);
  701. }
  702. }
  703. break;
  704. default:
  705. break;
  706. }
  707. }
  708. static void memswap(uint8_t *buf, int len)
  709. {
  710. int i;
  711. uint8_t tmp;
  712. for(i=0; i<len; i+=2) {
  713. tmp = buf[i];
  714. buf[i] = buf[i+1];
  715. buf[i+1] = tmp;
  716. }
  717. }
  718. static int _mb_hdr(uint8_t *data, int datalen, mb_hdr_t *h)
  719. {
  720. h->addr = data[0];
  721. h->func = data[1];
  722. h->reg = data[2]<<8 | data[3];
  723. h->regcnt = data[4]<<8 | data[5];
  724. h->dlen = 0;
  725. h->data = NULL;
  726. if(datalen>8) {
  727. h->dlen = data[6];
  728. h->data = data+7;
  729. memswap(h->data, h->dlen+h->dlen%2);
  730. }
  731. //print_hdr("sss", h);
  732. return 0;
  733. }
  734. int cascade_set_ip_modbus(ModbusInfo_t *info)
  735. {
  736. GlobalDeviceManager *_globalDeviceManager = (GlobalDeviceManager *)&__globalDeviceManage;
  737. g_modbus_deinit(&_globalDeviceManager->sensor_modbus_manager);
  738. if(info->product_modbus_type > 0)
  739. {
  740. int ret = g_modbus_init(&_globalDeviceManager->sensor_modbus_manager,
  741. INTERL_SENSOR_MODBUS_PORT, // _globalSensorMangerTemp->sensor_port_name,
  742. info->product_modbus_baud, // _globalSensorMangerTemp->sensor_baud,
  743. info->product_modbus_type,
  744. info->product_modbus_addr,
  745. "ip to user",
  746. 1);
  747. g_modbus_set_slave(&_globalDeviceManager->sensor_modbus_manager,info->product_modbus_addr);
  748. }else
  749. {
  750. int ret = g_modbus_init(&_globalDeviceManager->sensor_modbus_manager,
  751. INTERL_SENSOR_MODBUS_PORT, // _globalSensorMangerTemp->sensor_port_name,
  752. info->product_modbus_baud, // _globalSensorMangerTemp->sensor_baud,
  753. info->product_modbus_type,
  754. info->product_modbus_addr,
  755. "sensor",
  756. 1);
  757. }
  758. _globalDeviceManager->_globalDevInfo._gmodbus_info.product_modbus_type = info->product_modbus_type;
  759. return 0;
  760. }
  761. void* ip_cascade_thread(void *arg)
  762. {
  763. GlobalDeviceManager *_globalDeviceManager = (GlobalDeviceManager *)&__globalDeviceManage;
  764. GlobalDeviceInfo *devInfo = &_globalDeviceManager->_globalDevInfo;
  765. uint8_t query[512] = {0};
  766. int ret = g_modbus_init(&_globalDeviceManager->sensor_modbus_manager,
  767. INTERL_SENSOR_MODBUS_PORT, // _globalSensorMangerTemp->sensor_port_name,
  768. devInfo->_gmodbus_info.product_modbus_baud, // _globalSensorMangerTemp->sensor_baud,
  769. devInfo->_gmodbus_info.product_modbus_type,
  770. devInfo->_gmodbus_info.product_modbus_addr,
  771. "ip to user",
  772. 1);
  773. g_modbus_set_slave(&_globalDeviceManager->sensor_modbus_manager,devInfo->_gmodbus_info.product_modbus_addr);
  774. cascade_slave_init();
  775. int r = 0;
  776. mb_hdr_t h;
  777. while (_globalDeviceManager->dev_samp_flag)
  778. {
  779. r = g_modbus_receive(&_globalDeviceManager->sensor_modbus_manager,query);
  780. if(r > 0)
  781. {
  782. _mb_hdr(query,r,&h);
  783. if(h.func==MODBUS_FC_READ_HOLDING_REGISTERS) {
  784. cascade_slave_read(h.reg, h.regcnt);
  785. g_modbus_reply(&_globalDeviceManager->sensor_modbus_manager,query,r,cascade_slave_map());
  786. }
  787. }else
  788. {
  789. log_d("modbus err!!!!\n");
  790. }
  791. }
  792. pthread_exit(NULL);
  793. }
  794. int tcp_modbus_receive(Modbus_Manger_Tcp *tcp, uint8_t *req)
  795. {
  796. int ret = 0 ;
  797. pthread_mutex_lock(&tcp->mutex);
  798. ret = modbus_receive(tcp->ctx, req);
  799. pthread_mutex_unlock(&tcp->mutex);
  800. return ret ;
  801. }
  802. int tcp_modbus_reply(Modbus_Manger_Tcp *tcp, uint8_t *req, int reqlen, modbus_mapping_t *map)
  803. {
  804. int ret = 0 ;
  805. pthread_mutex_lock(&tcp->mutex);
  806. ret = modbus_reply(tcp->ctx, req, reqlen, map);
  807. pthread_mutex_unlock(&tcp->mutex);
  808. return ret ;
  809. }
  810. int tcp_modbus_set_slave(Modbus_Manger_Tcp *tcp, int saddr)
  811. {
  812. int ret = 0 ;
  813. pthread_mutex_lock(&tcp->mutex);
  814. ret = modbus_set_slave(tcp->ctx, saddr);
  815. pthread_mutex_unlock(&tcp->mutex);
  816. return ret ;
  817. }
  818. Modbus_Manger_Tcp* tcp_modbus_init(const char* ip, uint16_t port,uint8_t addr,int power_type)
  819. {
  820. Modbus_Manger_Tcp* tcp = NULL;
  821. tcp = (Modbus_Manger_Tcp*)malloc(sizeof(Modbus_Manger_Tcp));
  822. if(!tcp)
  823. {
  824. log_d("malloc modubus manger faield!!!\n");
  825. goto err1;
  826. }
  827. memset(tcp, 0, sizeof(Modbus_Manger_Tcp));
  828. tcp->ctx = modbus_new_tcp(NULL, port);
  829. if(!tcp->ctx)
  830. {
  831. log_d("malloc modbus_tcp ctx faield!!!\n");
  832. goto err2;
  833. }
  834. struct timeval response_timeout;
  835. response_timeout.tv_sec = 1;
  836. response_timeout.tv_usec = 0;
  837. modbus_set_response_timeout(tcp->ctx, 0,800000);
  838. modbus_set_byte_timeout(tcp->ctx,0,50000);
  839. modbus_set_error_recovery(tcp->ctx,MODBUS_ERROR_RECOVERY_PROTOCOL);
  840. modbus_set_slave(tcp->ctx,addr);
  841. pthread_mutex_init(&tcp->mutex,NULL);
  842. strcpy(tcp->ip,ip);
  843. tcp->port = port;
  844. tcp->slave_id = addr;
  845. tcp->power_type = power_type;
  846. return tcp;
  847. err2:
  848. free(tcp);
  849. err1:
  850. return tcp;
  851. }
  852. void tcp_modbus_deinit(Modbus_Manger_Tcp **tcp)
  853. {
  854. Modbus_Manger_Tcp** tmp = tcp;
  855. if(tmp)
  856. {
  857. if(*tmp)
  858. {
  859. modbus_close((*tmp)->ctx);
  860. modbus_free((*tmp)->ctx);
  861. free(*tmp);
  862. *tmp = 0;
  863. }
  864. }
  865. }
  866. static void *pthread_handle_tcp(void *arg)
  867. {
  868. uint8_t query[MODBUS_TCP_MAX_ADU_LENGTH] = {0};
  869. int ret = 0;
  870. //Modbus_Manger_Tcp *tcp = (Modbus_Manger_Tcp *)(arg);
  871. int fd = *(int*)(arg);
  872. Modbus_Manger_Tcp *mb =tcp_modbus_init("0.0.0.0",CASCADE_SLAVE_PORT,1,0);
  873. struct timeval response_timeout;
  874. response_timeout.tv_sec = 1;
  875. response_timeout.tv_usec = 0;
  876. modbus_set_response_timeout(mb->ctx, 0,800000);
  877. modbus_set_byte_timeout(mb->ctx,0,50000);
  878. modbus_set_error_recovery(mb->ctx,MODBUS_ERROR_RECOVERY_PROTOCOL);
  879. //mb->ctx->s = fd;
  880. mdbus_tcp_setfd(mb->ctx,fd);
  881. int rc = 0;
  882. mb_hdr_t h;
  883. while(1)
  884. {
  885. rc = modbus_receive(mb->ctx,query);
  886. log_d("recive modbus rc=%d\n",rc);
  887. if(rc > 0)
  888. {
  889. _mb_hdr(&query[6],rc,&h);
  890. if(h.func==MODBUS_FC_READ_HOLDING_REGISTERS) {
  891. cascade_slave_read(h.reg, h.regcnt);
  892. modbus_reply(mb->ctx,query,rc,cascade_slave_map());
  893. }
  894. }else if(rc < 0)
  895. {
  896. log_d("thread out!!!!!\n");
  897. break;
  898. }else
  899. {
  900. continue;
  901. }
  902. }
  903. modbus_close(mb->ctx);
  904. modbus_free(mb->ctx);
  905. mb->ctx = 0;
  906. free(mb);
  907. mb = NULL;
  908. pthread_exit(NULL);
  909. }
  910. void* tcp_modbus_thread(void *arg)
  911. {
  912. //GlobalDeviceManager *mgr = (GlobalDeviceManager *)(arg);
  913. GlobalDeviceManager *mgr = get_dm();
  914. Modbus_Manger_Tcp *tcp = mgr->md_tcp;
  915. tcp->connection = modbus_tcp_listen(tcp->ctx,CASCADE_SLAVE_CONNECTION);
  916. ;
  917. uint8_t query[MODBUS_TCP_MAX_ADU_LENGTH] = {0};
  918. log_d("start tcp modbus thread!!!\n");
  919. int rc = 0;
  920. pthread_t thread_id = 0;
  921. int recive_fd = 0;
  922. while(1)
  923. {
  924. if(tcp->ctx){
  925. struct sockaddr_in addr;
  926. socklen_t addrlen;
  927. addrlen = sizeof(addr);
  928. #ifdef HAVE_ACCEPT4
  929. /* Inherit socket flags and use accept4 call */
  930. recive_fd = accept4(tcp->connection, (struct sockaddr *)&addr, &addrlen, SOCK_CLOEXEC);
  931. #else
  932. recive_fd = accept(tcp->connection, (struct sockaddr *)&addr, &addrlen);
  933. #endif
  934. if(recive_fd > 0)
  935. {
  936. pthread_create(&thread_id,NULL,pthread_handle_tcp,(void*)(&recive_fd));
  937. pthread_detach(thread_id);
  938. }
  939. }
  940. }
  941. }
  942. void sensor_or_cascade_init()
  943. {
  944. //GlobalDeviceManager* dm =get_dm();
  945. GlobalDeviceManager *_globalDeviceManager = (GlobalDeviceManager *)&__globalDeviceManage;
  946. //INIT_LIST_HEAD(&_globalDeviceManager->_globalSensorManger.list);
  947. //INIT_LIST_HEAD(&dm->_globalSensorManger.list);
  948. GlobalDeviceInfo *devInfo = &_globalDeviceManager->_globalDevInfo;
  949. //uint8_t query[512] = {0};
  950. int ret = 0;
  951. // ret = dev_get_sensor_manage_info(_globalDeviceManager->db,
  952. // _globalDeviceManager->_globalDevInfo.product_id,
  953. // &_globalDeviceManager->_globalSensorManger);
  954. //dev_get_sensor_info
  955. // GlobalSensorManger *temp = (GlobalSensorManger*)malloc(sizeof(GlobalSensorManger));
  956. // if(!temp)
  957. // return;
  958. // dev_get_sensor_info(_globalDeviceManager->db,0,0,temp);
  959. // list_add_tail(&temp->list,&_globalDeviceManager->_globalSensorManger.list);
  960. //dev_Alarm_Run_message(_globalDeviceManager,language_alarm_Init_Success[0],"sensor");
  961. cascade_slave_init();
  962. if(devInfo->_gmodbus_info.product_modbus_type > 0)
  963. {
  964. int ret = g_modbus_init(&_globalDeviceManager->sensor_modbus_manager,
  965. INTERL_SENSOR_MODBUS_PORT, // _globalSensorMangerTemp->sensor_port_name,
  966. devInfo->_gmodbus_info.product_modbus_baud, // _globalSensorMangerTemp->sensor_baud,
  967. devInfo->_gmodbus_info.product_modbus_type,
  968. devInfo->_gmodbus_info.product_modbus_addr,
  969. "ip to user",
  970. 1);
  971. g_modbus_set_slave(&_globalDeviceManager->sensor_modbus_manager,devInfo->_gmodbus_info.product_modbus_addr);
  972. }else
  973. {
  974. int ret = g_modbus_init(&_globalDeviceManager->sensor_modbus_manager,
  975. INTERL_SENSOR_MODBUS_PORT, // _globalSensorMangerTemp->sensor_port_name,
  976. INTERL_SENSOR_MODBUS_BAUD, // _globalSensorMangerTemp->sensor_baud,
  977. 0,
  978. 0,
  979. "ip to user",
  980. 1);
  981. }
  982. pthread_mutex_init(&_globalDeviceManager->_sensor_update,NULL);
  983. thread_start(THREAD_ID_SENSOR, thread_sensor_or_485, _globalDeviceManager, 5*MB, 0);
  984. }
  985. extern void sensor_alarm(GlobalSensorManger *_globalSensorMangerTemp, int nAlarmType);
  986. void * thread_sensor_or_485(void*arg)
  987. {
  988. thread_handle_t *h=(thread_handle_t*)arg;
  989. //GlobalDeviceManager* _globalDeviceManager = (GlobalDeviceManager*)h->arg;
  990. GlobalDeviceManager *_globalDeviceManager = (GlobalDeviceManager *)&__globalDeviceManage;
  991. GlobalSensorManger *_globalSensorMangerTemp;
  992. int ret = 0;
  993. GlobalSensorInfo _globalSensorInfo;
  994. struct tm *t;
  995. struct timeval tv;
  996. struct timezone tz;
  997. int r = 0;
  998. mb_hdr_t mb_h;
  999. GlobalDeviceInfo *devInfo = &_globalDeviceManager->_globalDevInfo;
  1000. uint8_t query[512] = {0};
  1001. float temperature = 0.0;
  1002. float humidity = 0.0;
  1003. int nSaveIndex = 1;
  1004. char strTable[] = "Table_SensorInfo";
  1005. char strTemp[64] = {0};
  1006. // dev_search_last_Index(_globalDeviceManager->db, &nSaveIndex, strTable); // 查询日志最大点
  1007. // int nMaxIndex = 2000000000;
  1008. // int nDeleteNumber = 1000 / 120000 * 3600 * 24 * 30 * 10; // 1/60s;
  1009. while(_globalDeviceManager->dev_samp_flag)
  1010. {
  1011. if(devInfo->_gmodbus_info.product_modbus_type > 0)
  1012. {
  1013. //printf("12323451541545135435\n");
  1014. //dev_search_last_Index(_globalDeviceManager->db, &nSaveIndex, strTable);
  1015. // pthread_mutex_lock(&__globalDeviceManage._sensor_update);
  1016. // pthread_mutex_unlock(&__globalDeviceManage._sensor_update);
  1017. list_for_each_entry(_globalSensorMangerTemp, &_globalDeviceManager->_globalSensorManger.list, list)
  1018. {
  1019. if(_globalSensorMangerTemp->product_id == 0){
  1020. switch (_globalSensorMangerTemp->sensor_type)
  1021. {
  1022. case SENSOR_TYPE_TEMPERATURE:
  1023. {
  1024. _globalSensorInfo.val1 = 0.0;
  1025. _globalSensorInfo.val2 = 0.0;
  1026. _globalSensorMangerTemp->Cur_sensor_info=_globalSensorInfo;
  1027. _globalDeviceManager->g_modebus_read.temprature=0.0;
  1028. _globalDeviceManager->g_modebus_read.humidity=0.0;
  1029. _globalSensorMangerTemp->sensor_status = 1;
  1030. }
  1031. default:
  1032. break;
  1033. }
  1034. break;
  1035. }
  1036. }
  1037. r = g_modbus_receive(&_globalDeviceManager->sensor_modbus_manager,query);
  1038. if(r > 0)
  1039. {
  1040. _mb_hdr(query,r,&mb_h);
  1041. if(mb_h.func==MODBUS_FC_READ_HOLDING_REGISTERS) {
  1042. cascade_slave_read(mb_h.reg, mb_h.regcnt);
  1043. g_modbus_reply(&_globalDeviceManager->sensor_modbus_manager,query,r,cascade_slave_map());
  1044. }
  1045. }else
  1046. {
  1047. log_d("modbus err!!!!\n");
  1048. }
  1049. }else
  1050. {
  1051. //printf("--------------------------\n");
  1052. // if (nSaveIndex > nMaxIndex)
  1053. // {
  1054. // dev_change_last_Index(_globalDeviceManager->db, &nSaveIndex, nDeleteNumber, strTable);
  1055. // }
  1056. // pthread_mutex_lock(&__globalDeviceManage._sensor_update);
  1057. //list_for_each_entry(_globalSensorMangerTemp, &_globalDeviceManager->_globalSensorManger.list, list)
  1058. //{
  1059. // if(_globalSensorMangerTemp->product_id == 0)
  1060. // {
  1061. // switch (_globalSensorMangerTemp->sensor_type)
  1062. // {
  1063. // case SENSOR_TYPE_TEMPERATURE: // 温湿度
  1064. // {
  1065. // // printf("get \n");
  1066. // float temperature = 0.0;
  1067. // float humidity = 0.0;
  1068. // ret = _g_sensor_get_temperature_value((void *)&_globalDeviceManager->sensor_modbus_manager,
  1069. // _globalSensorMangerTemp->sensor_addr,
  1070. // &temperature,
  1071. // &humidity);
  1072. // if (ret == -1)
  1073. // {
  1074. // _globalSensorMangerTemp->sensor_status = 1;
  1075. // }
  1076. // else
  1077. // {
  1078. // _globalSensorMangerTemp->sensor_status = 0;
  1079. // }
  1080. // // log_d("sensor val:%0.2f %0.2f\n",temperature,humidity);
  1081. // // printf("get temperature=%f humidity=%f\n",temperature,humidity);
  1082. // gettimeofday(&tv, &tz);
  1083. // t = localtime(&tv.tv_sec);
  1084. // sprintf(_globalSensorInfo.samp_time, "%04d-%02d-%02d %02d:%02d:%02d.%03ld",
  1085. // t->tm_year + 1900, t->tm_mon, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec, tv.tv_usec / 1000);
  1086. // _globalSensorInfo.product_id = __globalDeviceManage._globalDevInfo.product_id;
  1087. // _globalSensorInfo.sensor_id = _globalSensorMangerTemp->sensor_id;
  1088. // _globalSensorInfo.val1 = temperature;
  1089. // _globalSensorInfo.val2 = humidity;
  1090. // _globalSensorInfo.product_log_time=_globalSensorMangerTemp->Cur_sensor_info.product_log_time;
  1091. // _globalSensorMangerTemp->Cur_sensor_info=_globalSensorInfo;
  1092. // _globalDeviceManager->g_modebus_read.temprature=temperature *1000;
  1093. // _globalDeviceManager->g_modebus_read.humidity=humidity *1000;
  1094. // }
  1095. // break;
  1096. // default:
  1097. // break;
  1098. // }
  1099. // // 通用功能
  1100. // // 写入数据库
  1101. // gettimeofday(&tv, NULL);
  1102. // time_t now;
  1103. // time(&now);
  1104. // t = localtime(&now);
  1105. // char buffer[80];
  1106. // strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", t);
  1107. // memset(_globalSensorMangerTemp->Cur_sensor_info.samp_time, 0, sizeof(_globalSensorMangerTemp->Cur_sensor_info.samp_time));
  1108. // strftime(_globalSensorMangerTemp->Cur_sensor_info.samp_time, sizeof(_globalSensorMangerTemp->Cur_sensor_info.samp_time), "%Y-%m-%d %H:%M:%S", t);
  1109. // sprintf(buffer, ".%03ld", tv.tv_usec / 1000);
  1110. // strcat(_globalSensorMangerTemp->Cur_sensor_info.samp_time, buffer);
  1111. // if (difftime(now, _globalSensorMangerTemp->Cur_sensor_info.product_log_time) > (30000 / 1000))
  1112. // {
  1113. // _globalSensorMangerTemp->Cur_sensor_info.product_log_time = now;
  1114. // // 插入数据库
  1115. // ret = dev_insert_sensor_info(_globalDeviceManager->db, &_globalSensorMangerTemp->Cur_sensor_info, &nSaveIndex);
  1116. // if (ret != 0)
  1117. // {
  1118. // log_e("sensor_temp_write database error.");
  1119. // }
  1120. // }
  1121. // if (_globalSensorMangerTemp->sensor_status == 0)
  1122. // {
  1123. // sensor_alarm(_globalSensorMangerTemp, SENSOR_VAL1_UPPER);
  1124. // sensor_alarm(_globalSensorMangerTemp, SENSOR_VAL1_LOWER);
  1125. // sensor_alarm(_globalSensorMangerTemp, SENSOR_VAL2_UPPER);
  1126. // sensor_alarm(_globalSensorMangerTemp, SENSOR_VAL2_LOWER);
  1127. // }
  1128. // break;
  1129. // }
  1130. // }
  1131. // pthread_mutex_unlock(&__globalDeviceManage._sensor_update);
  1132. sleep(1);
  1133. }
  1134. }
  1135. pthread_exit(NULL);
  1136. return NULL;
  1137. }