#include "hdf.h" void TOUCHUAN_UART_NUM(uint8_t* pTx) ; void Get_ZN_hdf_data(void) ; HDF_Inf hdf_inf[SENSOR_DEEP]; uint16_t Uart_len_TouChuan= 0; uint8_t Get_DFState(uint8_t Cang_Num) //查询仓底阀状态 { HDF_Inf* phdf = hdf_inf; return !phdf[Cang_Num].HDF_OFData[0]; } GPIO_PinState Get_Pin(int Pin_No) { GPIO_PinState Pin_sts; switch (Pin_No) { case 0: Pin_sts = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_14); break; case 1: Pin_sts = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_15); break; case 2: Pin_sts = HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_6); break; case 3: Pin_sts = HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_7); break; case 4: Pin_sts = HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_8); break; case 5: Pin_sts = HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_9); break; case 6: Pin_sts = HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_8); break; case 7: Pin_sts = HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_11); break; default: break; } return Pin_sts; } /** *************************************** * mcu的IO口采集的一种连续性滤波式的认可机制 * 原理为: 某一代号的管脚的输入电平,连续几次 * 检查都是相同值,才认可检查 * 输入:pinNo, 管脚代号,范围0-7 * 输入:pstatus,存放查询当前的管脚输入值 * 返回: 0-不认可,1-认可 *************************************** */ int DoPinIoHitSame(uint8_t pinNo, uint8_t *pstatus) { uint8_t status = 0; static struct pin_same { GPIO_PinState status; uint16_t same_count; }pin_cache[8]; if(pinNo > 7) return 0; status = Get_Pin(pinNo); *pstatus = status; if(pin_cache[pinNo].status == status) { pin_cache[pinNo].same_count++; if(pin_cache[pinNo].same_count >= cang_inf.pinIOHitSameParam){ pin_cache[pinNo].same_count = 0; return 1; } }else { pin_cache[pinNo].status = status; pin_cache[pinNo].same_count = 0; } return 0; } void DF_State(uint8_t Cang_Num) //查询仓底阀状态 { Cang_Inf* pcang = &cang_inf; XYF_Inf* pxyf = xyf_inf; RKG_Inf* prkg = rkg_inf; HDF_Inf* phdf = hdf_inf; uint8_t i = 0,j = 0,HDF_MAX = 3,PinNo; uint8_t status = 0, hit = 0; if(pcang->HDF_Type == 0) //底阀监测器 { if(i < HDF_BUF_DEP) { PinNo = 0; if (pcang->XYF_Type == 2) { for (j = 0, HDF_MAX = 0; j < pcang->Cang_Num; ++j) { HDF_MAX += pcang->XYF_Num[j]; } for (j = 0; j < HDF_MAX; ++j) { hit = DoPinIoHitSame(PinNo++, &status); if(hit){ pxyf[j + 1].XYF_State1 = status; } } } if (pcang->RKG_Type == 2) { for (j = 0, HDF_MAX = 0; j < pcang->Cang_Num; ++j) { HDF_MAX += pcang->RKG_Num[j]; } for (j = 0; j < HDF_MAX; ++j) { hit = DoPinIoHitSame(PinNo++, &status); if(hit){ prkg[1 + j].RKDG_State = status; } } } for (j = 0, HDF_MAX = 0; j < pcang->Cang_Num; ++j) { HDF_MAX += pcang->HDF_Num[j]; } for (j = 0; j < HDF_MAX; ++j) { hit = DoPinIoHitSame(PinNo++, &status); if(hit){ phdf[1 + j].HDF_OFData[i] = status; } } i++; } if(i >= HDF_BUF_DEP) i = 0; } else if(pcang->HDF_Type == 1) //其他底阀监测 { phdf[1].HDF_OFData[0] = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_14); phdf[2].HDF_OFData[0] = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_15); phdf[3].HDF_OFData[0] = HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_6); phdf[4].HDF_OFData[0] = HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_7); phdf[5].HDF_OFData[0] = HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_8); phdf[6].HDF_OFData[0] = HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_9); phdf[7].HDF_OFData[0] = HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_8); phdf[8].HDF_OFData[0] = HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_11); /* for(j = 1;j <= HDF_MAX;j++) //SLM HDF_MAX { if(phdf[j].HDF_ErrorCnt > phdf->HDF_StateKeepNum) phdf[j].HDF_Error = 1; }*/ } } void Get_ZN_hdf_data(void) { uint8_t receive_error = 0; // uint16_t ModbusCRC = 0; // Cang_Inf* pcang = &cang_inf; HDF_Inf* phdf = hdf_inf; phdf[USART1_RX_BUF002[0]-0x20].RTData_Num = 1; if(USART3_RX_BUF002[0]==0x21||USART3_RX_BUF002[0]==0x22) { if(USART3_RX_BUF002[1]!=0x03&&USART3_RX_BUF002[1]!=0x06) //校验读写属性 { receive_error = 1; } /* else if(ModbusCRC != LIB_CRC_MODBUS(USART3_RX_BUF002,6)) //校验CRC { receive_error = 0; }*/ if((USART3_RX_BUF002[1] == 0x03)&&(receive_error == 0)) //读取数据返回 { phdf[USART3_RX_BUF002[0]-0x20].HDF_ErrorCnt = 0; phdf[USART3_RX_BUF002[0]-0x20].RTData_Num = 1; // if(pcang->HDF_Type == 1) // phdf[USART3_RX_BUF002[0]-0x20].RTData_Num = 1; //海底阀开关数据 phdf[USART3_RX_BUF002[0]-0x20].HDF_OFData[0] = USART3_RX_BUF002[3] ; // phdf[USART3_RX_BUF002[0]-0x20].HDF_OFState = USART3_RX_BUF002[4] ; __NOP(); } else if((USART3_RX_BUF002[1] == 0x06)&&(receive_error == 0)) { USART3_RX_BUF002[3] = USART3_RX_BUF002[3] ; } } else if(USART3_RX_BUF002[0]==0x23||USART3_RX_BUF002[0]==0x24) { if(USART3_RX_BUF002[1]!=0x03&&USART3_RX_BUF002[1]!=0x06) //校验读写属性 { receive_error = 1; } /* else if(ModbusCRC != LIB_CRC_MODBUS(USART3_RX_BUF002,6)) //校验CRC { receive_error = 0; }*/ if((USART3_RX_BUF002[1] == 0x03)&&(receive_error == 0)) //读取数据返回 { phdf[USART3_RX_BUF002[0]-0x20].HDF_ErrorCnt = 0; phdf[USART3_RX_BUF002[0]-0x20].RTData_Num = 1; // if(pcang->HDF_Type == 1) // phdf[USART3_RX_BUF002[0]-0x20].RTData_Num = 1; //海底阀开关数据 phdf[USART3_RX_BUF002[0]-0x22].HDF_Data[1] = 1;//USART3_RX_BUF002[3] ; phdf[USART3_RX_BUF002[0]-0x22].HDF_OFState1 = 1;//USART3_RX_BUF002[4] ; __NOP(); } else if((USART3_RX_BUF002[1] == 0x06)&&(receive_error == 0)) { USART3_RX_BUF002[3] = USART3_RX_BUF002[3] ; } } } void TOUCHUAN_UART_NUM(uint8_t* pTx) { KZQ_Inf* pkzq = &kzq_inf; int retry; // Cang_Inf* pcang = &cang_inf; // uint8_t i = 0; // uint16_t ModBusCRC = 0; // uint8_t receive_error = 0; // uint16_t ModbusCRC = 0; // HDF_Inf* phdf = hdf_inf; uint16_t Uart_num = 0; Uart_num=USART2_RX_BUF002[18]; Uart_num = Uart_num << 8; Uart_num |= USART2_RX_BUF002[19]; if(Uart_num == 1) {//if(Uart_num == 0x0001) if(pkzq->USE_XYF == 0) {//if(pkzq->USE_XYF == 0) if(pkzq->data_buf[7] == 0x06) {//if(pkzq->data_buf[7] == 0x06) pkzq->USE_XYF = 1; Uart_len_TouChuan=USART2_RX_BUF002[20]; Uart_len_TouChuan = Uart_len_TouChuan << 8; Uart_len_TouChuan |= USART2_RX_BUF002[21]; memcpy(XYF_TxBuf,&USART2_RX_BUF002[22],Uart_len_TouChuan); //osDelay(50); for(retry=0;retry<300;++retry) { if(flagU3Rx && (pkzq->USE_XYF==0)) break; osDelay(1); } if(flagU3Rx) { pTx[20] = (data_lengthU3>>8)&0xff; pTx[21] = data_lengthU3&0xff; memcpy(pTx+22,USART3_RX_BUF002,data_lengthU3); flagU1Rx=0; } else { pTx[20] = 0; pTx[21] = 0; } }//if(pkzq->data_buf[7] == 0x06) }//if(pkzq->USE_XYF == 0) }//if(Uart_num == 0x0001) if(Uart_num == 0) {//if(Uart_num == 0x0001) if(pkzq->USE_RKG == 0) {//if(pkzq->USE_XYF == 0) if(pkzq->data_buf[7] == 0x06) {//if(pkzq->data_buf[7] == 0x06) pkzq->USE_RKG = 1; Uart_len_TouChuan=USART2_RX_BUF002[20]; Uart_len_TouChuan = Uart_len_TouChuan << 8; Uart_len_TouChuan |= USART2_RX_BUF002[21]; memcpy(RKG_TxBuf,&USART2_RX_BUF002[22],Uart_len_TouChuan); //osDelay(50); for(retry=0;retry<300;++retry) { if(flagU1Rx && (pkzq->USE_RKG == 0)) break; osDelay(1); } if(flagU1Rx) { pTx[20] = (data_lengthU1>>8)&0xff; pTx[21] = data_lengthU1&0xff; memcpy(pTx+22,USART1_RX_BUF002,data_lengthU1); flagU1Rx=0; } else { pTx[20] = 0; pTx[21] = 0; } }//if(pkzq->data_buf[7] == 0x06) }//if(pkzq->USE_XYF == 0) }//if(Uart_num == 0x0001) }