From e61d1595ebb1fa76b499cddec2df4bd66ec92b97 Mon Sep 17 00:00:00 2001
From: jinlicong <493886250@qq.com>
Date: Mon, 20 May 2024 20:02:47 +0800
Subject: [PATCH] 继续完善
---
Function/FLOW_METER_DATA_COLLECT/rs485_data_analysis_pro.c | 204 +++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 204 insertions(+), 0 deletions(-)
diff --git a/Function/FLOW_METER_DATA_COLLECT/rs485_data_analysis_pro.c b/Function/FLOW_METER_DATA_COLLECT/rs485_data_analysis_pro.c
index 4933c9c..5e45e42 100644
--- a/Function/FLOW_METER_DATA_COLLECT/rs485_data_analysis_pro.c
+++ b/Function/FLOW_METER_DATA_COLLECT/rs485_data_analysis_pro.c
@@ -1,4 +1,36 @@
#include "rs485_data_analysis_pro.h"
+#include "rs485_read_data.h"
+#include "mbcrc1.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();
+
+}
+
+/************�Զ����ȡ֡*************************/
@@ -6,6 +38,79 @@
+/************���ͺ����ݽ���*************************/
+//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;
+}
@@ -13,10 +118,109 @@
+//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;
+ }
+
+
+
+}
+
--
Gitblit v1.9.3