#include "rs485_data_analysis_pro.h" #include "rs485_read_data.h" #include "mbcrc.h" #include "uart.h" FLOW_METER_DATA_T flow_meter_data_g; /************ͨÓÃmodbus¶Áȡ֡*************************/ void sendModbusReadFrame(uint8_t slaveAddress,uint16_t dataAddress,uint8_t regNum) { uint16_t crc; uint8_t sendFrame[8]; sendFrame[0] = slaveAddress; //´Ó»úµØÖ· sendFrame[1] = 0x03; //¹¦ÄܺŠsendFrame[2] = dataAddress>>8; //Êý¾ÝµØÖ·¸ß8λ sendFrame[3] = dataAddress&0x00FF; //Êý¾ÝµØÖ·µÍ8λ sendFrame[4] = regNum>>8; //¶ÁÈ¡Êý¾Ý¸öÊý¸ß8λ sendFrame[5] = regNum&0x00FF; //¶ÁÈ¡Êý¾Ý¸öÊýµÍ8λ crc = usMBCRC16(0xFFFF,sendFrame,6); sendFrame[6] = crc&0x00FF; //CRC16УÑéµÍ8λ sendFrame[7] = crc>>8; //CRC16УÑé¸ß8λ //´®¿Ú·¢ËÍ RS485_SEND_NORMAL(sendFrame,8); //ÖØÖÃDMA½ÓÊÕ RS485_read_data_RX_DMA_CH3_reload(); } /************×Ô¶¨Òå¶Áȡ֡*************************/ /************¸÷ÐͺÅÊý¾Ý½âÎö*************************/ //modbusЭÒé03¶ÁÈ¡ÏìÓ¦Êý¾Ýͳһ¼ì²é ErrorStatus modbus03AnswerCheck(uint8_t * buf_p,uint8_t slaveAddress) { uint16_t crc; uint8_t dataNum; //Ö÷Òª¼ì²éCRC£¬¿¼ÂÇ´Ó»úµØÖ·ºÍ¹¦ÄÜÂëµÄ¼ì²é if((slaveAddress!=buf_p[0])||(buf_p[1]!=0x03)) return FAIL; dataNum = buf_p[2]; if(dataNum>250) return FAIL; crc = buf_p[3 + dataNum +1 ]; crc = (crc<<8) +buf_p[3 + dataNum ]; if(crc != usMBCRC16(0xFFFF,buf_p,3 + dataNum)) return FAIL; return PASS; } ErrorStatus SIZHUMODBUSV2_0_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]; if(modbus03AnswerCheck(buf_p,slaveAddress) == FAIL) return FAIL; 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); 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) ; 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, 8, LITTLE_ENDIAN) ; 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]; if(modbus03AnswerCheck(buf_p,slaveAddress) == FAIL) return FAIL; buf_p+=3; if(rs485_com_ctrl_pata_l.modbus_step_status ==MODBUS_STEP1) { (*(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) { (*(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) { (*(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,RS485_COM_CTRL_PARA_T rs485_com_ctrl_pata_l ) { uint8_t *buf_p; 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) { buf_p = &uart_para_p.recv_buf[count_i]; break; }else { if(count_i > (RS485_COM_REC_BUF_LENGTH >>2)) { //buf¹ý°ë¶¼ÊÇ0£¬Ö±½Ó·µ»ØFAIL£¬·ÀÖ¹ºóÃæÊý¾Ý´¦ÀíÔ½½ç return FAIL; } } } switch (device_code){ case SIZHUMODBUS1: return FAIL; case SIZHUMODBUS2: return FAIL; case SIZHUMODBUS3: return FAIL; 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; } }