ir_check.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528
  1. // #include "ir_check.h"
  2. // #include "user_uart.h"
  3. // #include "user_crc16.h"
  4. // static uint16_t check_ir_check_count = 0;
  5. // static ir_check_work_s ir_check_work = {
  6. // .workStat = IR_CHECK_DEV_TYPE,
  7. // .ir_check_ready;
  8. // .ir_check_count;
  9. // .sw_stat[IR_CHECK_MAX_COUNT];
  10. // .set_stat[IR_CHECK_MAX_COUNT];
  11. // .set_stat_enable[IR_CHECK_MAX_COUNT];
  12. // .set_stat_enable_idx;
  13. // };
  14. // static uint32_t ir_check_offline_timeout = 0;
  15. // static bool ir_check_offline_stat = true;
  16. // static void set_ir_check_offline(bool stat);
  17. // modbus_work_s ir_check_modbus_work = {
  18. // .rtu_addr = IR_CHECK_UART_ADDR,
  19. // .tx_size = 0,
  20. // .rx_size = 0,
  21. // .tx_buffer = {0},
  22. // .rx_buffer = {0},
  23. // .rtu_rec = {0},
  24. // .modbusRx_stat = false,
  25. // .modbusTx_stat = false,
  26. // };
  27. // /*******************************************************************************
  28. // * @函数名称 downloadRx_receive
  29. // * @函数说明 处理接收数据
  30. // * @输入参数 data:数据指针
  31. // size:数据长度
  32. // * @输出参数 无
  33. // * @返回参数 无
  34. // *******************************************************************************/
  35. // static void downloadRx_receive(uint8_t *data, uint16_t size)
  36. // {
  37. // memcpy(ir_check_modbus_work.rx_buffer, data, size);
  38. // ir_check_modbus_work.rx_size = size;
  39. // memcpy((void *)&(ir_check_modbus_work.rtu_rd), ir_check_modbus_work.rx_buffer, ir_check_modbus_work.rx_size);
  40. // memcpy((void *)&(ir_check_modbus_work.rtu_rd.crc), &(ir_check_modbus_work.rx_buffer[ir_check_modbus_work.rx_size - 2]), 2);
  41. // memcpy((void *)&(ir_check_modbus_work.rtu_rec), ir_check_modbus_work.rx_buffer, ir_check_modbus_work.rx_size);
  42. // memcpy((void *)&(ir_check_modbus_work.rtu_rec.crc), &(ir_check_modbus_work.rx_buffer[ir_check_modbus_work.rx_size - 2]), 2);
  43. // ir_check_modbus_work.rtu_rec.dataSize = ir_check_modbus_work.rx_size - 6;
  44. // ir_check_modbus_work.modbusRx_stat = true;
  45. // }
  46. // /*******************************************************************************
  47. // * @函数名称 downloadTx_send
  48. // * @函数说明 发送数据
  49. // * @输入参数 无
  50. // * @输出参数 无
  51. // * @返回参数 无
  52. // *******************************************************************************/
  53. // static void downloadTx_send(uint8_t *data, int size)
  54. // {
  55. // #if USE_BASE64 == 1
  56. // base64_encode(data, (char *)download_work.tx_buffer, size);
  57. // int len = strlen((char *)download_work.tx_buffer);
  58. // download_work.tx_buffer[len] = '\r';
  59. // download_work.tx_buffer[len + 1] = '\n';
  60. // download_work.tx_buffer[len + 2] = '\0';
  61. // download_work.tx_size = len + 2;
  62. // #else
  63. // memcpy(download_work.tx_buffer, data, size);
  64. // download_work.tx_size = size;
  65. // #endif
  66. // download_work.modbusTx_stat = true;
  67. // vUser_usart1_send(download_work.tx_buffer, download_work.tx_size);
  68. // }
  69. // /*******************************************************************************
  70. // * @函数名称 rtu_protocol_sd_dev_type
  71. // * @函数说明 设置询问从机设备类型数据
  72. // * @输入参数 data:数据指针
  73. // * @输出参数 无
  74. // * @返回参数 无
  75. // *******************************************************************************/
  76. // static uint16_t rtu_protocol_sd_dev_type(uint8_t *data)
  77. // {
  78. // data[0] = download_work.rtu_addr;
  79. // data[1] = CMD_RD_REG;
  80. // data[2] = (uint8_t)(REG_DEV_TYPE_ADDR >> 8);
  81. // data[3] = (uint8_t)REG_DEV_TYPE_ADDR;
  82. // data[4] = 0x00;
  83. // data[5] = 0x01;
  84. // check_download_count++;
  85. // return 6;
  86. // }
  87. // /*******************************************************************************
  88. // * @函数名称 rtu_protocol_sd_coll_stat
  89. // * @函数说明 设置询问从机就绪状态数据
  90. // * @输入参数 data:数据指针
  91. // * @输出参数 无
  92. // * @返回参数 无
  93. // *******************************************************************************/
  94. // static uint16_t rtu_protocol_sd_coll_stat(uint8_t *data)
  95. // {
  96. // data[0] = download_work.rtu_addr;
  97. // data[1] = CMD_RD_REG;
  98. // data[2] = (uint8_t)(REG_COLL_STAT_ADDR >> 8);
  99. // data[3] = (uint8_t)REG_COLL_STAT_ADDR;
  100. // data[4] = 0x00;
  101. // data[5] = 0x01;
  102. // return 6;
  103. // }
  104. // /*******************************************************************************
  105. // * @函数名称 rtu_protocol_sd_coll_count
  106. // * @函数说明 设置询问从机包含的主板总数数据
  107. // * @输入参数 data:数据指针
  108. // * @输出参数 无
  109. // * @返回参数 无
  110. // *******************************************************************************/
  111. // static uint16_t rtu_protocol_sd_coll_count(uint8_t *data)
  112. // {
  113. // data[0] = download_work.rtu_addr;
  114. // data[1] = CMD_RD_REG;
  115. // data[2] = (uint8_t)(REG_COLL_COUNT_ADDR >> 8);
  116. // data[3] = (uint8_t)REG_COLL_COUNT_ADDR;
  117. // data[4] = 0x00;
  118. // data[5] = 0x01;
  119. // return 6;
  120. // }
  121. // /*******************************************************************************
  122. // * @函数名称 rtu_protocol_sd_sw_stat
  123. // * @函数说明 设置询问从机包含的开关量数据
  124. // * @输入参数 data:数据指针
  125. // * @输出参数 无
  126. // * @返回参数 无
  127. // *******************************************************************************/
  128. // static uint16_t rtu_protocol_sd_sw_stat(uint8_t *data)
  129. // {
  130. // data[0] = download_work.rtu_addr;
  131. // data[1] = CMD_RD_REG;
  132. // data[2] = (uint8_t)(REG_COLL_SW_HIGH_STAT_ADDR >> 8);
  133. // data[3] = (uint8_t)REG_COLL_SW_HIGH_STAT_ADDR;
  134. // data[4] = 0x00;
  135. // data[5] = 0x02;
  136. // return 6;
  137. // }
  138. // /*******************************************************************************
  139. // * @函数名称 rtu_protocol_send
  140. // * @函数说明 发送数据
  141. // * @输入参数 data:数据指针
  142. // size:数据长度
  143. // * @输出参数 无
  144. // * @返回参数 无
  145. // *******************************************************************************/
  146. // static void rtu_protocol_send(uint8_t *data, int size)
  147. // {
  148. // uint16_t crc = 0xFFFF;
  149. // crc = GetCRC16(data, size, crc);
  150. // memcpy(&data[size], &crc, 2);
  151. // downloadTx_send(data, size + 2);
  152. // }
  153. // /*******************************************************************************
  154. // * @函数名称 rtu_protocol_sd_task
  155. // * @函数说明 发送数据任务
  156. // * @输入参数 无
  157. // * @输出参数 无
  158. // * @返回参数 无
  159. // *******************************************************************************/
  160. // static void rtu_protocol_sd_task(void)
  161. // {
  162. // uint8_t data[MODBUS_DATA_SIZE] = {0};
  163. // uint16_t datasize = 0;
  164. // switch(download_work_stat)
  165. // {
  166. // case DOWNLOAD_DEV_TYPE:datasize = rtu_protocol_sd_dev_type(data);break;
  167. // case DOWNLOAD_COLL_REDAY_STAT:datasize = rtu_protocol_sd_coll_stat(data);break;
  168. // case DOWNLOAD_COLL_COUNT:datasize = rtu_protocol_sd_coll_count(data);break;
  169. // case DOWNLOAD_SW_STAT:datasize = rtu_protocol_sd_sw_stat(data);break;
  170. // default:{
  171. // download_work_stat = DOWNLOAD_DEV_TYPE;
  172. // datasize = rtu_protocol_sd_dev_type(data);
  173. // }break;
  174. // }
  175. // rtu_protocol_send(data, datasize);
  176. // }
  177. // /*******************************************************************************
  178. // * @函数名称 rtu_protocol_rd_dev_type_parsing
  179. // * @函数说明 解析读取设备类型
  180. // * @输入参数 rd:数据
  181. // * @输出参数 无
  182. // * @返回参数 无
  183. // *******************************************************************************/
  184. // static bool rtu_protocol_rd_dev_type_parsing(rtu_rd_s *rd)
  185. // {
  186. // uint16_t temp = 0;
  187. // temp = rd->data[0];
  188. // temp <<= 8;
  189. // temp += rd->data[1];
  190. // if(temp == (uint16_t)COLL_UART_ADDR)
  191. // {
  192. // download_work_stat = DOWNLOAD_COLL_REDAY_STAT;
  193. // check_download_count = 0;
  194. // return true;
  195. // }
  196. // return false;
  197. // }
  198. // /*******************************************************************************
  199. // * @函数名称 rtu_protocol_rd_coll_stat_parsing
  200. // * @函数说明 解析读取设备就绪状态
  201. // * @输入参数 rd:数据
  202. // * @输出参数 无
  203. // * @返回参数 无
  204. // *******************************************************************************/
  205. // static bool rtu_protocol_rd_coll_stat_parsing(rtu_rd_s *rd)
  206. // {
  207. // uint16_t temp = 0;
  208. // temp = rd->data[0];
  209. // temp <<= 8;
  210. // temp += rd->data[1];
  211. // if(temp == COLL_READY_STAT)
  212. // {
  213. // download_work_stat = DOWNLOAD_COLL_COUNT;
  214. // coll_ready_stat = true;
  215. // return true;
  216. // }
  217. // return false;
  218. // }
  219. // /*******************************************************************************
  220. // * @函数名称 rtu_protocol_rd_coll_count_parsing
  221. // * @函数说明 解析读取下挂主板数量
  222. // * @输入参数 rd:数据
  223. // * @输出参数 无
  224. // * @返回参数 无
  225. // *******************************************************************************/
  226. // static bool rtu_protocol_rd_coll_count_parsing(rtu_rd_s *rd)
  227. // {
  228. // uint16_t temp = 0;
  229. // temp = rd->data[0];
  230. // temp <<= 8;
  231. // temp += rd->data[1];
  232. // if(temp < COLL_MAX_COUNT)
  233. // {
  234. // coll_sw_count = temp;
  235. // download_work_stat = DOWNLOAD_SW_STAT;
  236. // vUser_server_set_coll_stat(coll_sw_count);
  237. // return true;
  238. // }
  239. // return false;
  240. // }
  241. // /*******************************************************************************
  242. // * @函数名称 rtu_protocol_rd_sw_stat_parsing
  243. // * @函数说明 解析读取下挂主板开关量状态
  244. // * @输入参数 rd:数据
  245. // * @输出参数 无
  246. // * @返回参数 无
  247. // *******************************************************************************/
  248. // static bool rtu_protocol_rd_sw_stat_parsing(rtu_rd_s *rd)
  249. // {
  250. // uint32_t temp = 0;
  251. // if(rd->dataSize != 4)
  252. // {
  253. // return false;
  254. // }
  255. // temp = rd->data[0];
  256. // temp <<= 8;
  257. // temp += rd->data[1];
  258. // temp <<= 8;
  259. // temp += rd->data[2];
  260. // temp <<= 8;
  261. // temp += rd->data[3];
  262. // vUser_server_set_download_sw_stat(temp);
  263. // return true;
  264. // }
  265. // /*******************************************************************************
  266. // * @函数名称 rtu_protocol_rd_reg_parsing
  267. // * @函数说明 解析读指令返回的数据
  268. // * @输入参数 rd:数据
  269. // * @输出参数 无
  270. // * @返回参数 无
  271. // *******************************************************************************/
  272. // static bool rtu_protocol_rd_reg_parsing(rtu_rd_s *rd)
  273. // {
  274. // bool stat = false;
  275. // switch(download_work_stat)
  276. // {
  277. // case DOWNLOAD_DEV_TYPE:stat = rtu_protocol_rd_dev_type_parsing(rd);break;
  278. // case DOWNLOAD_COLL_REDAY_STAT:stat = rtu_protocol_rd_coll_stat_parsing(rd);break;
  279. // case DOWNLOAD_COLL_COUNT:stat = rtu_protocol_rd_coll_count_parsing(rd);break;
  280. // case DOWNLOAD_SW_STAT:stat = rtu_protocol_rd_sw_stat_parsing(rd);break;
  281. // default:break;
  282. // }
  283. // return stat;
  284. // }
  285. // /*******************************************************************************
  286. // * @函数名称 rtu_rd_protocol_parsing
  287. // * @函数说明 读指令返回解析
  288. // * @输入参数 rd:数据
  289. // * @输出参数 无
  290. // * @返回参数 无
  291. // *******************************************************************************/
  292. // static bool rtu_rd_protocol_parsing(rtu_rd_s *rd)
  293. // {
  294. // uint16_t crc = 0xFFFF;
  295. // crc = GetCRC16((uint8_t *)rd, rd->dataSize + 3, crc);
  296. // if(crc != rd->crc)
  297. // {
  298. // return false;
  299. // }
  300. // if(rd->func == CMD_RD_REG)
  301. // {
  302. // if(true == rtu_protocol_rd_reg_parsing(rd))
  303. // {
  304. // return true;
  305. // }
  306. // }
  307. // return false;
  308. // }
  309. // /*******************************************************************************
  310. // * @函数名称 rtu_protocol_wr_reg_parsing
  311. // * @函数说明 写指令数据解析
  312. // * @输入参数 rec:数据
  313. // * @输出参数 无
  314. // * @返回参数 无
  315. // *******************************************************************************/
  316. // static bool rtu_protocol_wr_reg_parsing(rtu_rec_s *rec)
  317. // {
  318. // uint16_t reg_addr = 0;
  319. // reg_addr = rec->regAddr[0];
  320. // reg_addr <<= 8;
  321. // reg_addr += rec->regAddr[1];
  322. // switch(reg_addr)
  323. // {
  324. // default:break;
  325. // }
  326. // return false;
  327. // }
  328. // /*******************************************************************************
  329. // * @函数名称 rtu_rec_protocol_parsing
  330. // * @函数说明 写指令返回解析
  331. // * @输入参数 rec:数据
  332. // * @输出参数 无
  333. // * @返回参数 无
  334. // *******************************************************************************/
  335. // static bool rtu_rec_protocol_parsing(rtu_rec_s *rec)
  336. // {
  337. // uint16_t crc = 0xFFFF;
  338. // crc = GetCRC16((uint8_t *)rec, rec->dataSize + 4, crc);
  339. // if(crc != rec->crc)
  340. // {
  341. // return false;
  342. // }
  343. // if(rec->func == CMD_WR_REG)
  344. // {
  345. // if(true == rtu_protocol_wr_reg_parsing(rec))
  346. // {
  347. // return true;
  348. // }
  349. // }
  350. // return false;
  351. // }
  352. // /*******************************************************************************
  353. // * @函数名称 rtu_protocol_parsing
  354. // * @函数说明 返回数据解析
  355. // * @输入参数 无
  356. // * @输出参数 无
  357. // * @返回参数 无
  358. // *******************************************************************************/
  359. // static bool rtu_protocol_parsing(void)
  360. // {
  361. // if(download_work.rtu_rec.addr != download_work.rtu_addr)
  362. // {
  363. // return false;
  364. // }
  365. // if(download_work.rtu_rec.func == CMD_RD_REG)
  366. // {
  367. // if(true == rtu_rd_protocol_parsing(&(download_work.rtu_rd)))
  368. // {
  369. // set_download_offline(false);
  370. // }
  371. // }
  372. // else if(download_work.rtu_rec.func == CMD_WR_REG)
  373. // {
  374. // if(true == rtu_rec_protocol_parsing(&(download_work.rtu_rec)))
  375. // {
  376. // set_download_offline(false);
  377. // }
  378. // }
  379. // else{
  380. // download_work_stat = DOWNLOAD_DEV_TYPE;
  381. // }
  382. // }
  383. // /************************************************
  384. // * 函数名:set_ir_check_offline
  385. // * 描述 :设置从机通讯状态灯
  386. // * 输入 :stat:通讯状态
  387. // * 输出 :无
  388. // * 注意 :无
  389. // ************************************************/
  390. // static void set_ir_check_offline(bool stat)
  391. // {
  392. // if(stat == true)
  393. // {
  394. // ir_check_offline_timeout = 5000;
  395. // if(ir_check_offline_stat == false)
  396. // {
  397. // ir_check_offline_stat = true;
  398. // }
  399. // }
  400. // else{
  401. // if(ir_check_offline_stat == true)
  402. // {
  403. // ir_check_offline_stat = false;
  404. // }
  405. // }
  406. // }
  407. // /************************************************
  408. // * 函数名:vIr_check_tick
  409. // * 描述 :任务计时器
  410. // * 输入 :无
  411. // * 输出 :无
  412. // * 注意 :无
  413. // ************************************************/
  414. // void vIr_check_tick(void)
  415. // {
  416. // if(ir_check_delay_count > 0)
  417. // {
  418. // ir_check_delay_count--;
  419. // }
  420. // if(ir_check_offline_timeout > 0)
  421. // {
  422. // ir_check_offline_timeout--;
  423. // }
  424. // else{
  425. // set_ir_check_offline(true);
  426. // }
  427. // }
  428. // /************************************************
  429. // * 函数名:vDownload_pro
  430. // * 描述 :执行任务
  431. // * 输入 :无
  432. // * 输出 :无
  433. // * 注意 :无
  434. // ************************************************/
  435. // void vDownload_pro(void)
  436. // {
  437. // if(download_delay_count == 0)
  438. // {
  439. // download_delay_count = 500;
  440. // if(check_download_count >= MAX_REPLAY_COUNT)
  441. // {
  442. // vUser_server_set_coll_stat(0);
  443. // }
  444. // rtu_protocol_sd_task();
  445. // }
  446. // if(download_work.modbusRx_stat == true)
  447. // {
  448. // download_work.modbusRx_stat = false;
  449. // rtu_protocol_parsing();
  450. // }
  451. // }
  452. // /*******************************************************************************
  453. // * @函数名称 vUpload_init
  454. // * @函数说明 初始化
  455. // * @输入参数 无
  456. // * @输出参数 无
  457. // * @返回参数 无
  458. // *******************************************************************************/
  459. // void vDownload_init(void)
  460. // {
  461. // user_uart_param_s param = {
  462. // .baudrate = 115200,
  463. // .wordlength = USART_WordLength_8b,
  464. // .stopbit = USART_StopBits_1,
  465. // .parity = USART_Parity_No,
  466. // };
  467. // vUser_usart1_init(&param);
  468. // vUser_usart1_set_data_upload_func(downloadRx_receive);
  469. // }