#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;
|
|
|
}
|