cascade_slave.c 52 KB

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