hdf.c 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317
  1. #include "hdf.h"
  2. void TOUCHUAN_UART_NUM(uint8_t* pTx) ;
  3. void Get_ZN_hdf_data(void) ;
  4. HDF_Inf hdf_inf[SENSOR_DEEP];
  5. uint16_t Uart_len_TouChuan= 0;
  6. uint8_t Get_DFState(uint8_t Cang_Num) //查询仓底阀状态
  7. {
  8. HDF_Inf* phdf = hdf_inf;
  9. return !phdf[Cang_Num].HDF_OFData[0];
  10. }
  11. GPIO_PinState Get_Pin(int Pin_No)
  12. {
  13. GPIO_PinState Pin_sts;
  14. switch (Pin_No)
  15. {
  16. case 0:
  17. Pin_sts = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_14);
  18. break;
  19. case 1:
  20. Pin_sts = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_15);
  21. break;
  22. case 2:
  23. Pin_sts = HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_6);
  24. break;
  25. case 3:
  26. Pin_sts = HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_7);
  27. break;
  28. case 4:
  29. Pin_sts = HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_8);
  30. break;
  31. case 5:
  32. Pin_sts = HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_9);
  33. break;
  34. case 6:
  35. Pin_sts = HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_8);
  36. break;
  37. case 7:
  38. Pin_sts = HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_11);
  39. break;
  40. default:
  41. break;
  42. }
  43. return Pin_sts;
  44. }
  45. /**
  46. ***************************************
  47. * mcu的IO口采集的一种连续性滤波式的认可机制
  48. * 原理为: 某一代号的管脚的输入电平,连续几次
  49. * 检查都是相同值,才认可检查
  50. * 输入:pinNo, 管脚代号,范围0-7
  51. * 输入:pstatus,存放查询当前的管脚输入值
  52. * 返回: 0-不认可,1-认可
  53. ***************************************
  54. */
  55. int DoPinIoHitSame(uint8_t pinNo, uint8_t *pstatus)
  56. {
  57. uint8_t status = 0;
  58. static struct pin_same {
  59. GPIO_PinState status;
  60. uint16_t same_count;
  61. }pin_cache[8];
  62. if(pinNo > 7) return 0;
  63. status = Get_Pin(pinNo);
  64. *pstatus = status;
  65. if(pin_cache[pinNo].status == status) {
  66. pin_cache[pinNo].same_count++;
  67. if(pin_cache[pinNo].same_count >= cang_inf.pinIOHitSameParam){
  68. pin_cache[pinNo].same_count = 0;
  69. return 1;
  70. }
  71. }else {
  72. pin_cache[pinNo].status = status;
  73. pin_cache[pinNo].same_count = 0;
  74. }
  75. return 0;
  76. }
  77. void DF_State(uint8_t Cang_Num) //查询仓底阀状态
  78. {
  79. Cang_Inf* pcang = &cang_inf;
  80. XYF_Inf* pxyf = xyf_inf;
  81. RKG_Inf* prkg = rkg_inf;
  82. HDF_Inf* phdf = hdf_inf;
  83. uint8_t i = 0,j = 0,HDF_MAX = 3,PinNo;
  84. uint8_t status = 0, hit = 0;
  85. if(pcang->HDF_Type == 0) //底阀监测器
  86. {
  87. if(i < HDF_BUF_DEP)
  88. {
  89. PinNo = 0;
  90. if (pcang->XYF_Type == 2)
  91. {
  92. for (j = 0, HDF_MAX = 0; j < pcang->Cang_Num; ++j)
  93. {
  94. HDF_MAX += pcang->XYF_Num[j];
  95. }
  96. for (j = 0; j < HDF_MAX; ++j)
  97. {
  98. hit = DoPinIoHitSame(PinNo++, &status);
  99. if(hit){
  100. pxyf[j + 1].XYF_State1 = status;
  101. }
  102. }
  103. }
  104. if (pcang->RKG_Type == 2)
  105. {
  106. for (j = 0, HDF_MAX = 0; j < pcang->Cang_Num; ++j)
  107. {
  108. HDF_MAX += pcang->RKG_Num[j];
  109. }
  110. for (j = 0; j < HDF_MAX; ++j)
  111. {
  112. hit = DoPinIoHitSame(PinNo++, &status);
  113. if(hit){
  114. prkg[1 + j].RKDG_State = status;
  115. }
  116. }
  117. }
  118. for (j = 0, HDF_MAX = 0; j < pcang->Cang_Num; ++j)
  119. {
  120. HDF_MAX += pcang->HDF_Num[j];
  121. }
  122. for (j = 0; j < HDF_MAX; ++j)
  123. {
  124. hit = DoPinIoHitSame(PinNo++, &status);
  125. if(hit){
  126. phdf[1 + j].HDF_OFData[i] = status;
  127. }
  128. }
  129. i++;
  130. }
  131. if(i >= HDF_BUF_DEP)
  132. i = 0;
  133. }
  134. else if(pcang->HDF_Type == 1) //其他底阀监测
  135. {
  136. phdf[1].HDF_OFData[0] = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_14);
  137. phdf[2].HDF_OFData[0] = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_15);
  138. phdf[3].HDF_OFData[0] = HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_6);
  139. phdf[4].HDF_OFData[0] = HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_7);
  140. phdf[5].HDF_OFData[0] = HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_8);
  141. phdf[6].HDF_OFData[0] = HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_9);
  142. phdf[7].HDF_OFData[0] = HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_8);
  143. phdf[8].HDF_OFData[0] = HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_11);
  144. /* for(j = 1;j <= HDF_MAX;j++) //SLM HDF_MAX
  145. {
  146. if(phdf[j].HDF_ErrorCnt > phdf->HDF_StateKeepNum)
  147. phdf[j].HDF_Error = 1;
  148. }*/
  149. }
  150. }
  151. void Get_ZN_hdf_data(void)
  152. {
  153. uint8_t receive_error = 0;
  154. // uint16_t ModbusCRC = 0;
  155. // Cang_Inf* pcang = &cang_inf;
  156. HDF_Inf* phdf = hdf_inf;
  157. phdf[USART1_RX_BUF002[0]-0x20].RTData_Num = 1;
  158. if(USART3_RX_BUF002[0]==0x21||USART3_RX_BUF002[0]==0x22)
  159. {
  160. if(USART3_RX_BUF002[1]!=0x03&&USART3_RX_BUF002[1]!=0x06) //校验读写属性
  161. {
  162. receive_error = 1;
  163. }
  164. /* else if(ModbusCRC != LIB_CRC_MODBUS(USART3_RX_BUF002,6)) //校验CRC
  165. {
  166. receive_error = 0;
  167. }*/
  168. if((USART3_RX_BUF002[1] == 0x03)&&(receive_error == 0)) //读取数据返回
  169. {
  170. phdf[USART3_RX_BUF002[0]-0x20].HDF_ErrorCnt = 0;
  171. phdf[USART3_RX_BUF002[0]-0x20].RTData_Num = 1;
  172. // if(pcang->HDF_Type == 1)
  173. // phdf[USART3_RX_BUF002[0]-0x20].RTData_Num = 1; //海底阀开关数据
  174. phdf[USART3_RX_BUF002[0]-0x20].HDF_OFData[0] = USART3_RX_BUF002[3] ;
  175. // phdf[USART3_RX_BUF002[0]-0x20].HDF_OFState = USART3_RX_BUF002[4] ;
  176. __NOP();
  177. }
  178. else if((USART3_RX_BUF002[1] == 0x06)&&(receive_error == 0))
  179. {
  180. USART3_RX_BUF002[3] = USART3_RX_BUF002[3] ;
  181. }
  182. }
  183. else if(USART3_RX_BUF002[0]==0x23||USART3_RX_BUF002[0]==0x24)
  184. {
  185. if(USART3_RX_BUF002[1]!=0x03&&USART3_RX_BUF002[1]!=0x06) //校验读写属性
  186. {
  187. receive_error = 1;
  188. }
  189. /* else if(ModbusCRC != LIB_CRC_MODBUS(USART3_RX_BUF002,6)) //校验CRC
  190. {
  191. receive_error = 0;
  192. }*/
  193. if((USART3_RX_BUF002[1] == 0x03)&&(receive_error == 0)) //读取数据返回
  194. {
  195. phdf[USART3_RX_BUF002[0]-0x20].HDF_ErrorCnt = 0;
  196. phdf[USART3_RX_BUF002[0]-0x20].RTData_Num = 1;
  197. // if(pcang->HDF_Type == 1)
  198. // phdf[USART3_RX_BUF002[0]-0x20].RTData_Num = 1; //海底阀开关数据
  199. phdf[USART3_RX_BUF002[0]-0x22].HDF_Data[1] = 1;//USART3_RX_BUF002[3] ;
  200. phdf[USART3_RX_BUF002[0]-0x22].HDF_OFState1 = 1;//USART3_RX_BUF002[4] ;
  201. __NOP();
  202. }
  203. else if((USART3_RX_BUF002[1] == 0x06)&&(receive_error == 0))
  204. {
  205. USART3_RX_BUF002[3] = USART3_RX_BUF002[3] ;
  206. }
  207. }
  208. }
  209. void TOUCHUAN_UART_NUM(uint8_t* pTx)
  210. {
  211. KZQ_Inf* pkzq = &kzq_inf;
  212. int retry;
  213. // Cang_Inf* pcang = &cang_inf;
  214. // uint8_t i = 0;
  215. // uint16_t ModBusCRC = 0;
  216. // uint8_t receive_error = 0;
  217. // uint16_t ModbusCRC = 0;
  218. // HDF_Inf* phdf = hdf_inf;
  219. uint16_t Uart_num = 0;
  220. Uart_num=USART2_RX_BUF002[18];
  221. Uart_num = Uart_num << 8;
  222. Uart_num |= USART2_RX_BUF002[19];
  223. if(Uart_num == 1)
  224. {//if(Uart_num == 0x0001)
  225. if(pkzq->USE_XYF == 0)
  226. {//if(pkzq->USE_XYF == 0)
  227. if(pkzq->data_buf[7] == 0x06)
  228. {//if(pkzq->data_buf[7] == 0x06)
  229. pkzq->USE_XYF = 1;
  230. Uart_len_TouChuan=USART2_RX_BUF002[20];
  231. Uart_len_TouChuan = Uart_len_TouChuan << 8;
  232. Uart_len_TouChuan |= USART2_RX_BUF002[21];
  233. memcpy(XYF_TxBuf,&USART2_RX_BUF002[22],Uart_len_TouChuan);
  234. //osDelay(50);
  235. for(retry=0;retry<300;++retry)
  236. {
  237. if(flagU3Rx && (pkzq->USE_XYF==0))
  238. break;
  239. osDelay(1);
  240. }
  241. if(flagU3Rx)
  242. {
  243. pTx[20] = (data_lengthU3>>8)&0xff;
  244. pTx[21] = data_lengthU3&0xff;
  245. memcpy(pTx+22,USART3_RX_BUF002,data_lengthU3);
  246. flagU1Rx=0;
  247. }
  248. else
  249. {
  250. pTx[20] = 0;
  251. pTx[21] = 0;
  252. }
  253. }//if(pkzq->data_buf[7] == 0x06)
  254. }//if(pkzq->USE_XYF == 0)
  255. }//if(Uart_num == 0x0001)
  256. if(Uart_num == 0)
  257. {//if(Uart_num == 0x0001)
  258. if(pkzq->USE_RKG == 0)
  259. {//if(pkzq->USE_XYF == 0)
  260. if(pkzq->data_buf[7] == 0x06)
  261. {//if(pkzq->data_buf[7] == 0x06)
  262. pkzq->USE_RKG = 1;
  263. Uart_len_TouChuan=USART2_RX_BUF002[20];
  264. Uart_len_TouChuan = Uart_len_TouChuan << 8;
  265. Uart_len_TouChuan |= USART2_RX_BUF002[21];
  266. memcpy(RKG_TxBuf,&USART2_RX_BUF002[22],Uart_len_TouChuan);
  267. //osDelay(50);
  268. for(retry=0;retry<300;++retry)
  269. {
  270. if(flagU1Rx && (pkzq->USE_RKG == 0))
  271. break;
  272. osDelay(1);
  273. }
  274. if(flagU1Rx)
  275. {
  276. pTx[20] = (data_lengthU1>>8)&0xff;
  277. pTx[21] = data_lengthU1&0xff;
  278. memcpy(pTx+22,USART1_RX_BUF002,data_lengthU1);
  279. flagU1Rx=0;
  280. }
  281. else
  282. {
  283. pTx[20] = 0;
  284. pTx[21] = 0;
  285. }
  286. }//if(pkzq->data_buf[7] == 0x06)
  287. }//if(pkzq->USE_XYF == 0)
  288. }//if(Uart_num == 0x0001)
  289. }