forked from SZV10X_Software/SZV103_FM33A0xxEV_SiZhu

jinlicong
2024-06-14 d352b1982dc9b4fb2135c64cd909bb9cecc62139
Function/FLOW_METER_DATA_COLLECT/rs485_data_analysis_pro.c
@@ -1,6 +1,7 @@
#include "rs485_data_analysis_pro.h"
#include "rs485_read_data.h"
#include "mbcrc.h"
#include "mbcrc1.h"
#include "uart.h"
FLOW_METER_DATA_T   flow_meter_data_g;
@@ -21,14 +22,11 @@
  sendFrame[7] = crc>>8;               //CRC16УÑé¸ß8λ
   
   //´®¿Ú·¢ËÍ
//  RS485_Send_Data(sendFrame,8);
   RS485_SEND_NORMAL(sendFrame,8);
   
   //ÖØÖÃDMA½ÓÊÕ
   RS485_read_data_RX_DMA_CH3_reload();
   
}
@@ -42,69 +40,173 @@
/************¸÷ÐͺÅÊý¾Ý½âÎö*************************/
//modbusЭÒé03¶ÁÈ¡ÏìÓ¦Êý¾Ýͳһ¼ì²é
ErrorStatus   modbus03AnswerCheck(uint8_t * buf_p,uint8_t slaveAddress)
ErrorStatus   modbus03AnswerCheck(uint8_t * buf_p,uint8_t slaveAddress,uint8_t *Byte_Num)
{
   uint16_t   crc;
   uint8_t   dataNum;
//   uint8_t   dataNum;
   //Ö÷Òª¼ì²éCRC£¬¿¼ÂÇ´Ó»úµØÖ·ºÍ¹¦ÄÜÂëµÄ¼ì²é
   if((slaveAddress!=buf_p[0])||(buf_p[1]!=0x03))
      return FAIL;
   
   dataNum = buf_p[2];
   if(dataNum>250)
   *Byte_Num = buf_p[2];
   if(*Byte_Num>250)
         return FAIL;
   crc = buf_p[3 + dataNum +1 ];
   crc = (crc<<8) +buf_p[3 + dataNum ];
   if(crc != usMBCRC16(0xFFFF,buf_p,3 + dataNum))
   crc = buf_p[3 + *Byte_Num +1 ];
   crc = (crc<<8) +buf_p[3 + *Byte_Num ];
   if(crc != usMBCRC16(0xFFFF,buf_p,3 + *Byte_Num))
      return FAIL;
   
   return PASS;
}
ErrorStatus   SIZHUMODBUSV2_0_dataAnalysis(uint8_t * buf_p,uint8_t slaveAddress)
ErrorStatus   SIZHUMODBUSV2_0_dataAnalysis(uint8_t * buf_p,uint8_t slaveAddress,RS485_COM_CTRL_PARA_T rs485_com_ctrl_pata_l)
{
   uint32_t SC_Accumulation_zs;
   uint16_t SC_Accumulation_xs;
   uint32_t WC_Accumulation_zs;
   uint16_t  WC_Accumulation_xs;
   uint32_t SC_Accumulation_zs_reverse;
   uint16_t SC_Accumulation_xs_reverse;
   uint32_t WC_Accumulation_zs_reverse;
   uint16_t  WC_Accumulation_xs_reverse;
   double WC_Accumulation_reverse;
   double SC_Accumulation_reverse;
   if(modbus03AnswerCheck(buf_p,slaveAddress) == FAIL)
   uint32_t u32temp_zs;
   uint16_t u16temp_xs;
   uint8_t   status[12];
   uint8_t   Byte_Num = 0;
   if(modbus03AnswerCheck(buf_p,slaveAddress,&Byte_Num) == FAIL)
      return FAIL;
   
   arrayA_2_arrayB(buf_p + 3 , (uint8_t *)&WC_Accumulation_zs, 4, BIG_ENDIAN) ;
   arrayA_2_arrayB(buf_p + 7 , (uint8_t *)&WC_Accumulation_xs, 2, BIG_ENDIAN) ;
   arrayA_2_arrayB(buf_p + 14 , (uint8_t *)&WC_Accumulation_xs, 2, BIG_ENDIAN) ;
   if(Byte_Num >= 34){
      buf_p+=3;
      arrayA_2_arrayB(buf_p, (uint8_t *)&flow_meter_data_g.time_BCD.year, 6, LITTLE_ENDIAN) ;
      arrayA_2_arrayB(buf_p + 6 , (uint8_t *)&u32temp_zs, 4, BIG_ENDIAN) ;
      arrayA_2_arrayB(buf_p + 10 , (uint8_t *)&u16temp_xs, 2, BIG_ENDIAN) ;
      flow_meter_data_g.cumulate_s.forward_cumulate_wc = ZS_2XS_2_DOUBLE(u32temp_zs,u16temp_xs);
      arrayA_2_arrayB(buf_p + 12 , (uint8_t *)&u32temp_zs, 4, BIG_ENDIAN) ;
      arrayA_2_arrayB(buf_p + 16 , (uint8_t *)&u16temp_xs, 2, BIG_ENDIAN) ;
      flow_meter_data_g.cumulate_s.forward_cumulate_sc = ZS_2XS_2_DOUBLE(u32temp_zs,u16temp_xs);
      
   return PASS;
      arrayA_2_arrayB(buf_p + 18 , (uint8_t *)&flow_meter_data_g.instant_wc, 4, BIG_ENDIAN) ;
      arrayA_2_arrayB(buf_p + 22 , (uint8_t *)&flow_meter_data_g.instant_sc, 4, BIG_ENDIAN) ;
      arrayA_2_arrayB(buf_p + 26 , (uint8_t *)&flow_meter_data_g.temperature, 4, BIG_ENDIAN) ;
      arrayA_2_arrayB(buf_p + 30, (uint8_t *)&flow_meter_data_g.pressure, 4, BIG_ENDIAN) ;
   }else
   {
      return FAIL;
   }
   
   if(Byte_Num >= 98){
      arrayA_2_arrayB(buf_p + 34 , (uint8_t *)&u32temp_zs, 4, BIG_ENDIAN) ;
      arrayA_2_arrayB(buf_p + 38 , (uint8_t *)&u16temp_xs, 2, BIG_ENDIAN) ;
      flow_meter_data_g.cumulate_s.err_forward_cumulate_wc = ZS_2XS_2_DOUBLE(u32temp_zs,u16temp_xs);
      arrayA_2_arrayB(buf_p + 40 , (uint8_t *)&u32temp_zs, 4, BIG_ENDIAN) ;
      arrayA_2_arrayB(buf_p + 44 , (uint8_t *)&u16temp_xs, 2, BIG_ENDIAN) ;
      flow_meter_data_g.cumulate_s.err_forward_cumulate_sc = ZS_2XS_2_DOUBLE(u32temp_zs,u16temp_xs);
      arrayA_2_arrayB(buf_p + 70 , (uint8_t *)&flow_meter_data_g.cumulate_s.cal_cumulate_wc, 8, BIG_ENDIAN) ;
      arrayA_2_arrayB(buf_p + 78 , (uint8_t *)&flow_meter_data_g.cumulate_s.cal_cumulate_sc, 8, BIG_ENDIAN) ;
      /*****״̬×Ö¡¢±¨¾¯×Ö½âÎö£¬°´Á÷Á¿¼ÆÐ­ÒéÓ³É䵽˼ÖþµÄ¶¨Òå±í******/
      arrayA_2_arrayB(buf_p + 86 , status, 12, LITTLE_ENDIAN) ;
   }else{
      flow_meter_data_g.cumulate_s.err_forward_cumulate_wc = 0;
      flow_meter_data_g.cumulate_s.err_forward_cumulate_sc = 0;
      flow_meter_data_g.cumulate_s.cal_cumulate_wc = 0;
      flow_meter_data_g.cumulate_s.cal_cumulate_sc = 0;
   }
   if(rs485_com_ctrl_pata_l.modbus_step_status >=rs485_com_ctrl_pata_l.modbus_last_status) //È«²¿¶ÁÈ¡Íê³É
   {
   }
   return PASS;
}
//EK°£¶ûË¹ÌØ£¬×Ö½Ú˳Ðò±È½ÏÌØÊâÊÇ0x¡®2¡¯¡®3¡¯¡®0¡¯¡®1¡¯
ErrorStatus   EKMODBUS_dataAnalysis(uint8_t * buf_p,uint8_t slaveAddress,RS485_COM_CTRL_PARA_T rs485_com_ctrl_pata_l)
{
   uint32_t u32temp_zs;
//   uint16_t u16temp_xs;
//   uint8_t   status[12];
   uint8_t   Byte_Num = 0;
   if(modbus03AnswerCheck(buf_p,slaveAddress,&Byte_Num) == FAIL)
      return FAIL;
   buf_p+=3;
   if((rs485_com_ctrl_pata_l.modbus_step_status ==MODBUS_STEP1)&&(Byte_Num >=8))
   {
      (*(uint8_t *)(&u32temp_zs))=buf_p[1];
      (*((uint8_t *)(&u32temp_zs) + 1))=buf_p[0];
      (*((uint8_t *)(&u32temp_zs) + 2))=buf_p[3];
      (*((uint8_t *)(&u32temp_zs) + 3))=buf_p[2];
      flow_meter_data_g.cumulate_s.forward_cumulate_wc = u32temp_zs;
      (*(uint8_t *)(&u32temp_zs))=buf_p[5];
      (*((uint8_t *)(&u32temp_zs) + 1))=buf_p[4];
      (*((uint8_t *)(&u32temp_zs) + 2))=buf_p[7];
      (*((uint8_t *)(&u32temp_zs) + 3))=buf_p[6];
      flow_meter_data_g.cumulate_s.forward_cumulate_sc = u32temp_zs;
   }else if((rs485_com_ctrl_pata_l.modbus_step_status ==MODBUS_STEP2)&&(Byte_Num >=8))
   {
      (*(uint8_t *)(&flow_meter_data_g.pressure))=buf_p[1];
      (*((uint8_t *)(&flow_meter_data_g.pressure) + 1))=buf_p[0];
      (*((uint8_t *)(&flow_meter_data_g.pressure) + 2))=buf_p[3];
      (*((uint8_t *)(&flow_meter_data_g.pressure) + 3))=buf_p[2];
      (*(uint8_t *)(&flow_meter_data_g.temperature))=buf_p[5];
      (*((uint8_t *)(&flow_meter_data_g.temperature) + 1))=buf_p[4];
      (*((uint8_t *)(&flow_meter_data_g.temperature) + 2))=buf_p[7];
      (*((uint8_t *)(&flow_meter_data_g.temperature) + 3))=buf_p[6];
   }else if((rs485_com_ctrl_pata_l.modbus_step_status ==MODBUS_STEP3)&&(Byte_Num >=8))
   {
      (*(uint8_t *)(&flow_meter_data_g.instant_wc))=buf_p[1];
      (*((uint8_t *)(&flow_meter_data_g.instant_wc) + 1))=buf_p[0];
      (*((uint8_t *)(&flow_meter_data_g.instant_wc) + 2))=buf_p[3];
      (*((uint8_t *)(&flow_meter_data_g.instant_wc) + 3))=buf_p[2];
      (*(uint8_t *)(&flow_meter_data_g.instant_sc))=buf_p[5];
      (*((uint8_t *)(&flow_meter_data_g.instant_sc) + 1))=buf_p[4];
      (*((uint8_t *)(&flow_meter_data_g.instant_sc) + 2))=buf_p[7];
      (*((uint8_t *)(&flow_meter_data_g.instant_sc) + 3))=buf_p[6];
   }
   /*****״̬×Ö¡¢±¨¾¯×Ö½âÎö£¬°´Á÷Á¿¼ÆÐ­ÒéÓ³É䵽˼ÖþµÄ¶¨Òå±í******/
   if(rs485_com_ctrl_pata_l.modbus_step_status >=rs485_com_ctrl_pata_l.modbus_last_status) //È«²¿¶ÁÈ¡Íê³É
   {
   }
   return PASS;
}
/**********************·µ»ØÊý¾Ý·ÖÎö*******************************/
ErrorStatus   rs485ComDataAnalysis(RS485_COM_UART_PARA_T * uart_para_p,uint16_t device_code,uint8_t slaveAddress)
ErrorStatus   rs485ComDataAnalysis(RS485_COM_UART_PARA_T  uart_para_p,uint16_t device_code,uint8_t slaveAddress,RS485_COM_CTRL_PARA_T rs485_com_ctrl_pata_l )
{
   uint8_t *buf_p;
   if(uart_para_p->recv_length < 6)  //ĿǰӦ¸ÃûÓöµ½¹ý·µ»ØÊý¾ÝÉÙÓÚ6×Ö½ÚµÄ
   if(uart_para_p.recv_length < 6)  //ĿǰӦ¸ÃûÓöµ½¹ý·µ»ØÊý¾ÝÉÙÓÚ6×Ö½ÚµÄ
      return FAIL;
   
   //ȥ0
   for(uint16_t count_i=0;count_i< RS485_COM_REC_BUF_LENGTH;count_i ++)
   {
      if(uart_para_p->recv_buf[count_i] !=0)
      if(uart_para_p.recv_buf[count_i] !=0)
      {
         buf_p = &uart_para_p->recv_buf[count_i];
         buf_p = &uart_para_p.recv_buf[count_i];
         break;
      }else
      {
@@ -121,10 +223,12 @@
            case SIZHUMODBUS1:      return FAIL;
            case SIZHUMODBUS2:   return FAIL;
            case SIZHUMODBUS3:   return FAIL;
        case SIZHUMODBUSV2_0:      return SIZHUMODBUSV2_0_dataAnalysis(buf_p,slaveAddress);
        case SIZHUMODBUSV2_0:      return SIZHUMODBUSV2_0_dataAnalysis(buf_p,slaveAddress,rs485_com_ctrl_pata_l);
        case TIANXINCUSTOM:      return FAIL;
            case TIANXINMODBUS:   return FAIL;
            //ÐèÒª²¹³ä......
            case   EKMODBUS:   return EKMODBUS_dataAnalysis(buf_p,slaveAddress,rs485_com_ctrl_pata_l);
            //?ÐèÒª²¹³ä......
        default:return FAIL;
    }