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