#include "rs485_read_data.h" #include "rs485_data_analysis_pro.h" #include "tim.h" /****ÕûÌå¿ØÖÆË¼Â·****************** *RS485ÕûÌå¿ØÖÆ·ÖΪÉϵ硢·¢ËͶÁȡָÁî¡¢µÈ´ý½ÓÊÕÊý¾Ý²¢´¦ÀíÈý¸ö״̬»ú²½Ö裻¿ÉÒÔʵÏֵȴý³¬Ê±ÅжϺͶà´ÎÖØ¶Á¡£ *Õë¶ÔmodbusµØÖ··ÖµÄ±È½Ï¿ª£¬²»ÄÜÒ»´ÎÐÔ¶ÁÈ¡µÄÇé¿ö£¬·ÖRS485_MODBUS_STEP_STATUS_T¶ÁÈ¡£¬ÊÂÏÈÅäÖÃ×îºóÒ»¸öSTEP£¬ËùÓÐÐͺŵĵÚÒ»¸ö²½Öè¶¼ÊÇSTEP1£¬ *µ±³É¹¦¶Áȡһ´ÎÖ¸ÁîÖ®ºó£¬Åжϵ±Ç°STEPÊÇ·ñ´óÓÚµÈÓÚ×îºóÒ»¸öSTEP£¬ÊÇÔò±íʾȫ²¿¶ÁÈ¡Íê³É£¬·ñ´ú±íÐèÒª¼ÌÐø·¢ËÍÏÂÒ»¸öSTEPµÄ¶ÁȡָÁ * **********************************/ //__IO RS485_COM_STATUS_T rs485_com_status_g = RS485_COM_IDLE; //__IO FlagStatus rs485_pwr_delay_status_g = RESET; //¹©µçʱ¼äµ½´ï±êÖ¾ //static uint8_t rs485_pwr_delay_time_out_cnt =0; __IO RS485_COM_CTRL_PARA_T rs485_com_ctrl_pata_g={ .status = RS485_COM_IDLE, \ .reread_num_cnt =0, \ }; RS485_COM_UART_PARA_T rs485_com_uart_data_g ={ .recv_flag = RESET, \ }; //¸ù¾ÝÉ豸´úÂë´¦Àí£¬²¢·µ»Ø¹©µçÑÓʱʱ¼äÕûÊýÃë uint8_t rs485GetDelayTime(uint16_t device_code) { //ÓÉÓÚ±¾Éí¹¤×÷ÖÜÆÚÊÇ1ÃëÒ»´Î£¬ËùÒÔÑÓʱµÄ²½½øÊÇ1000ms£¬ ±ÈÈçÊýÖµÔÚ0-1000msÖ®¼ä£¬Êµ¼ÊÑÓʱ¶¼Îª1Ãë×óÓÒ£¬ ÊýÖµÔÚ1000-2000msÖ®¼ä£¬Êµ¼ÊÑÓʱ¶¼Îª2Ãë×óÓÒ switch (device_code){ case SIZHUMODBUS1: rs485_com_ctrl_pata_g.modbus_last_status = MODBUS_STEP1; return 1; case SIZHUMODBUS2: rs485_com_ctrl_pata_g.modbus_last_status = MODBUS_STEP1; return 1; case SIZHUMODBUS3: rs485_com_ctrl_pata_g.modbus_last_status = MODBUS_STEP1;return 1; case SIZHUMODBUSV2_0: rs485_com_ctrl_pata_g.modbus_last_status = MODBUS_STEP1;return 1; case TIANXINCUSTOM: rs485_com_ctrl_pata_g.modbus_last_status = MODBUS_STEP1;return 1; case TIANXINMODBUS: rs485_com_ctrl_pata_g.modbus_last_status = MODBUS_STEP1;return 1; case EKMODBUS: rs485_com_ctrl_pata_g.modbus_last_status = MODBUS_STEP3;return 1; //?ÐèÒª²¹³ä...... default:return 100; } } //¸ù¾ÝÉ豸´úÂë·¢ËͶÁȡ֡ void rs485SendReadData(uint16_t device_code,uint8_t slaveAddress) { switch (device_code){ case SIZHUMODBUS1: break; case SIZHUMODBUS2: break; case SIZHUMODBUS3: break; case SIZHUMODBUSV2_0: sendModbusReadFrame(slaveAddress,501,49);break; case TIANXINCUSTOM: break; case TIANXINMODBUS: break; case EKMODBUS: if(rs485_com_ctrl_pata_g.modbus_step_status ==MODBUS_STEP1) sendModbusReadFrame(slaveAddress,100,4); else if(rs485_com_ctrl_pata_g.modbus_step_status ==MODBUS_STEP2) sendModbusReadFrame(slaveAddress,306,4); else if(rs485_com_ctrl_pata_g.modbus_step_status ==MODBUS_STEP3) sendModbusReadFrame(slaveAddress,326,4); break; //?ÐèÒª²¹³ä...... default:break; } } RS485_COM_STATUS_T rs485ComPwrOnHandle(void) { uint8_t delay_time_s; //?IO¿Ú³õʼ»¯ //?´ò¿ª¹©µç //´ò¿ª¶¨Ê±Æ÷Öжϣ¬²»Í¬É豸¹©µçÑÓʱ²»µÈ£¬Òª²»Òª¿¼Âǹ©µçºó¿ÉÒÔÁ¢Âí¶ÁÈ¡µÄÇé¿ö£¿ delay_time_s = rs485GetDelayTime(SIZHUMODBUSV2_0); rs485_com_ctrl_pata_g.pwr_delay_status = RESET; rs485_com_ctrl_pata_g.pwr_delay_time_out_cnt = 0; //²ÎÊý״̬ÖÃλ rs485_com_ctrl_pata_g.reread_num_cnt = RS485_REREAD_NUM; rs485_com_ctrl_pata_g.reread_wait_time_cnt = RS485_REREAD_WATI_TIME; rs485_com_ctrl_pata_g.pwr_delay_time_out_cnt = delay_time_s; rs485_com_ctrl_pata_g.modbus_step_status = MODBUS_STEP1; return RS485_COM_SEND; } RS485_COM_STATUS_T rs485ComSendHandle(void) { //ÑÓʱÏÈ--£¬ Èç¹ûÑÓʱ1Ã룬ÏÈ--¾ÍµÈÓÚ0ÁË£¬ ÔÙÅжÏ==0¾Í¿ÉÒÔ¶ÁÈ¡Êý¾Ý¡£ÒòΪÉϵ絽·¢ËÍÊý¾Ý°´×´Ì¬»úÖ´ÐУ¬±¾Éí¾Í²îÁËÒ»¸öÑ­»·ÖÜÆÚµÄʱ¼ä£¨ÖÜÆÚ1Ã룩 if(rs485_com_ctrl_pata_g.pwr_delay_time_out_cnt) { rs485_com_ctrl_pata_g.pwr_delay_time_out_cnt--; } if(rs485_com_ctrl_pata_g.pwr_delay_time_out_cnt == 0) //ÑÓʱµ½0¾Í¿ÉÒÔ·¢ËͶÁȡָÁî { rs485SendReadData(SIZHUMODBUSV2_0,1); //?´Ë´¦Èë²ÎÒª¸Ä rs485_com_ctrl_pata_g.reread_wait_time_cnt = RS485_REREAD_WATI_TIME; //ÖØÖõȴýÏìӦʱ¼ä return RS485_COM_WAIT_ANSWER; } } RS485_COM_STATUS_T rs485ComWaitAnswerHandle(void) { ErrorStatus read_ok = FAIL; //?¼ì²é´®¿ÚÊý¾Ý //·ÖÎöÊý¾Ý,Èç¹û³É¹¦¶Áµ½Êý¾Ýread_ok = PASS if(rs485_com_uart_data_g.recv_flag == SET) { rs485_com_uart_data_g.recv_flag =RESET; read_ok = rs485ComDataAnalysis(rs485_com_uart_data_g,SIZHUMODBUSV2_0,1,rs485_com_ctrl_pata_g ) ;//?É豸´úÂë¡¢´Ó»úµØÖ·Èë²ÎÒª¸Ä } if(read_ok==PASS) { if(rs485_com_ctrl_pata_g.modbus_step_status >= rs485_com_ctrl_pata_g.modbus_last_status) { //?´ú±íͨѶȫ²¿³É¹¦£¬½øÐÐÏàÓ¦µÄ´¦Àí //¹Ø±ÕµçÔ´¡¢¹Ø±Õ´®¿Ú return RS485_COM_IDLE; } else { rs485_com_ctrl_pata_g.modbus_step_status ++; return RS485_COM_SEND; } } if((--rs485_com_ctrl_pata_g.reread_wait_time_cnt)==0) { if((--rs485_com_ctrl_pata_g.reread_num_cnt)==0) { //?³¬Ê±ÇÒÖØ¶Á´ÎÊýÓÃÍ꣬´ú±íͨѶ×îÖÕÒÔʧ°Ü¸æÖÕ£¬½øÐÐÏàÓ¦µÄ´¦Àí //¹Ø±ÕµçÔ´¡¢¹Ø±Õ´®¿Ú£¬RS485ͨѶʧ°Ü+1, return RS485_COM_IDLE; }else { //³¬Ê±µ«ÊÇÖØ¸´´ÎÊý»¹ÓУ¬·µ»ØÖØÐ·¢ËͶÁÈ¡Êý¾Ý return RS485_COM_SEND; } } return RS485_COM_WAIT_ANSWER; } void rs485ReadDataPro(FUN_START_CTRL_PARA_T * sys_fun_run_ctrl_p) { if((sys_fun_run_ctrl_p->rs485_ctrl_flag.start_flag ==SET)&&(sys_fun_run_ctrl_p->valve_ctrl_flag.running_flag == RESET)&&(sys_fun_run_ctrl_p->wrc_ctrl_flag.running_flag == RESET))//?ÅжÏ485²É¼¯±êʶ { sys_fun_run_ctrl_p->rs485_ctrl_flag.start_flag = RESET; if(rs485_com_ctrl_pata_g.status == RS485_COM_IDLE) { rs485_com_ctrl_pata_g.status = RS485_COM_PWR_ON; sys_fun_run_ctrl_p->rs485_ctrl_flag.running_flag = SET; } } switch (rs485_com_ctrl_pata_g.status){ case RS485_COM_IDLE: break; case RS485_COM_PWR_ON: rs485_com_ctrl_pata_g.status = rs485ComPwrOnHandle();break; case RS485_COM_SEND: rs485_com_ctrl_pata_g.status = rs485ComSendHandle();break; case RS485_COM_WAIT_ANSWER: rs485_com_ctrl_pata_g.status = rs485ComWaitAnswerHandle();break; default:; } if(rs485_com_ctrl_pata_g.status == RS485_COM_IDLE) sys_fun_run_ctrl_p->rs485_ctrl_flag.running_flag = RESET; }