#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½ÓÊÕ
|
|
|
}
|
|
/************×Ô¶¨Òå¶Áȡ֡*************************/
|
|
|
|
|
|
|
|
/************¸÷ÐͺÅÊý¾Ý½âÎö*************************/
|
//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;
|
}
|
|
|
|
}
|