NANO130_H2Press/User/485_sensor.c

1009 lines
27 KiB
C
Raw Normal View History

2025-04-10 14:54:41 +08:00
/*
*********************************************************************************************************
* IAR Development Kits
* on the
*
* M451
*
* Filename : spi_adc.c
* Version : V1.00
* Programmer(s) : Qian Xianghong
*********************************************************************************************************
*/
#include "includes.h"
// Ĭ<><C4AC>Ϊ˹<CEAA><CBB9><EFBFBD><EFBFBD>˼<EFBFBD><CBBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//
// <20>Ƿ<EFBFBD>SMARC<52><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//#define _SMARC_FLOWMETER_
// <20>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƣ<EFBFBD>MODBUS/A4Э<34>
//#define _TIANCYA4_FLOWMETER_
// <20><><EFBFBD><EFBFBD><EFBFBD>жϴ<D0B6><CFB4><EFBFBD><EFBFBD>Ļص<C4BB><D8B5><EFBFBD><EFBFBD><EFBFBD>
typedef void (*RS485_Read_CallBack)(uint8_t c);
RS485_Read_CallBack RS485_Read = NULL;
#define RS485_EN PC7
const uint8_t VACUUM_ID[] = {1, 2}; // <20><><EFBFBD>ռ<EFBFBD>ͨ<EFBFBD>ŵ<EFBFBD>ַ
#define VACUUM_CMD 4 // <20><><EFBFBD>ռƶ<D5BC>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
#define VACUUM_ADDR 608 // <20><><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD>ʼ<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
#define VACUUM_LEN 8 // <20><><EFBFBD>ռƶ<D5BC>ȡ<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
const uint8_t LEAK_ID = 3; // й¶<D0B9><C2B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD>ŵ<EFBFBD>ַ
#define LEAK_CMD 3 // й¶<D0B9><C2B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
#define LEAK_ADDR 0x08 // й¶<D0B9><C2B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
#define LEAK_LEN 8 // й¶<D0B9><C2B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
const uint8_t FLOW_ID = 4; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD>ŵ<EFBFBD>ַ
#if defined(_SMARC_FLOWMETER_)
#define FLOW_CMD 3 // <20><><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
#define FLOW_ADDR 4068 // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
#define FLOW_LEN 12 // <20><><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD>ȡ<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#elif defined(_TIANCYA4_FLOWMETER_)
#define FLOW_CMD 3 // <20><><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
#define FLOW_ADDR 0 // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
#define FLOW_LEN 12 // <20><><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD>ȡ<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#else
#define FLOW_CMD 3 // <20><><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
#define FLOW_ADDR 0 // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
#define FLOW_LEN 15 // <20><><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD>ȡ<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#endif
#pragma pack(push, 1)
typedef struct
{
uint8_t id;
uint8_t cmd;
uint16_t addr;
uint16_t len;
uint16_t crc;
} modbus_send_t;
typedef struct
{
struct
{
uint8_t id;
uint8_t cmd;
uint8_t len;
} header;
union{
// <20><><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD><EFBFBD><EFBFBD>
struct
{
uint16_t staVacuum; // ״̬
uint16_t lifeVacuum; // ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint32_t vacuum; // <20><><EFBFBD>նȣ<D5B6>float<61>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ν<EFBFBD><CEBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>
uint32_t rateVacuum; // ©<><C2A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʣ<EFBFBD>float<61>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ν<EFBFBD><CEBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>
uint32_t tempr; // <20>ȣ<C2B6>float<61>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ν<EFBFBD><CEBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>
} vacuum;
// й©<D0B9><C2A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
struct
{
unsigned unit : 4; // <20><><EFBFBD>嵥λ
unsigned ratio : 4; // <20><>ֵ<EFBFBD><D6B5>λ
uint8_t type; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint16_t A1; // A1<41><31><EFBFBD><EFBFBD>ֵ
uint16_t A2;
uint16_t A3;
uint16_t A4;
uint16_t range; // <20><><EFBFBD><EFBFBD>
uint16_t concentrations; // Ũ<><C5A8>
uint8_t staLeak; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬
unsigned : 8;
} leak;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
struct
{
uint32_t nM3_int; // <20><><EFBFBD><EFBFBD><EFBFBD>ۻ<EFBFBD><DBBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint16_t nM3_frac; // <20><><EFBFBD><EFBFBD><EFBFBD>ۻ<EFBFBD><DBBB><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD>֣<EFBFBD><D6A3>Ŵ<EFBFBD>10000<30><30><EFBFBD><EFBFBD>
uint32_t M3_int; // <20><><EFBFBD><EFBFBD><EFBFBD>ۻ<EFBFBD><DBBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint16_t M3_frac; // <20><><EFBFBD><EFBFBD><EFBFBD>ۻ<EFBFBD><DBBB><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD>֣<EFBFBD><D6A3>Ŵ<EFBFBD>10000<30><30><EFBFBD><EFBFBD>
uint32_t nM3_h; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>nM3/h<><68><EFBFBD>Ŵ<EFBFBD>100<30><30><EFBFBD><EFBFBD>
uint32_t M3_h; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>M3/h<><68><EFBFBD>Ŵ<EFBFBD>100<30><30><EFBFBD><EFBFBD>
int16_t tempr; // <20>ȣ<C2B6><C8A3><EFBFBD>Ŵ<EFBFBD>10<31><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һλ<D2BB><CEBB><EFBFBD><EFBFBD>λ(<28><><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>0x7FFFΪ<46><CEAA>)<29><>
uint32_t pressure; // ѹ<><D1B9>(<28><>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD>KPa, <20>Ŵ<EFBFBD>10<31><30>)
uint16_t err1; // <20><EFBFBD><ECB3A3>־λ1
//<2F>¶ȴ<C2B6><C8B4><EFBFBD><EFBFBD><EFBFBD>־λ: 0x0003
//ѹ<><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־λ: 0x0030
//<2F><><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD>ͱ<EFBFBD>־λ: 0x0300
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>󹤿<EFBFBD><F3B9A4BF><EFBFBD><EFBFBD><EFBFBD>: 0x3000
//<2F><><EFBFBD><EFBFBD><ECB3A3>0x0000
uint16_t err2; // <20><EFBFBD><ECB3A3>־λ2
//<2F><EFBFBD><E6B4A2><EFBFBD><EFBFBD><ECB3A3>־λ: 0x0003
//<2F><><EFBFBD><EFBFBD><ECB3A3>0x0000
} flow;
// SMARC<52><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
struct
{
uint32_t nM3_h; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: float, <20><><EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>uint32_t<5F>ͽ<EFBFBD><CDBD><EFBFBD>
uint32_t M3_h; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: float, <20><><EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>uint32_t<5F>ͽ<EFBFBD><CDBD><EFBFBD>
uint32_t tempr; // <20><EFBFBD>: float, <20><><EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>uint32_t<5F>ͽ<EFBFBD><CDBD><EFBFBD>
uint32_t pressure; // ѹ<><D1B9>: float, <20><><EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>uint32_t<5F>ͽ<EFBFBD><CDBD><EFBFBD>
uint16_t warnFlag; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־
uint8_t nM3_BCD[6]; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
} flow_SMARC;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD>Modbus/A4ͨ<34><CDA8>Э<EFBFBD>
struct
{
double nM3; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint32_t nM3_h; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: float, <20><><EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>uint32_t<5F>ͽ<EFBFBD><CDBD><EFBFBD>
uint32_t M3_h; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: float, <20><><EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>uint32_t<5F>ͽ<EFBFBD><CDBD><EFBFBD>
uint32_t tempr; // <20><EFBFBD>: float, <20><><EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>uint32_t<5F>ͽ<EFBFBD><CDBD><EFBFBD>
uint32_t pressure; // ѹ<><D1B9>: float, <20><><EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>uint32_t<5F>ͽ<EFBFBD><CDBD><EFBFBD>
} flow_TancyA4;
};
uint16_t crc; // ռλ<D5BC><CEBB>
} modbus_recv_t;
typedef union
{
modbus_send_t send;
modbus_recv_t recv;
uint8_t buff[sizeof(modbus_recv_t)];
} modbus_comm_t;
// DYQ-7ͨ<37><CDA8>Э<EFBFBD><D0AD><EFBFBD><EFBFBD>й¶<D0B9><C2B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define RS_MIN_FRAME_LEN (15)
#define RS_MAX_FRAME_LEN (39)
#define RS_MIN_DATA_LEN (0)
#define RS_MAX_DATA_LEN (RS_MAX_FRAME_LEN - RS_MIN_FRAME_LEN)
#define RS_FRAME_SOF (0x1B) // <20><>ʶһ<CAB6><D2BB>֡<EFBFBD>Ŀ<EFBFBD>ʼ
#define RS_DIR_M2S (0) // Master->Slave
#define RS_DIR_S2M (1) // Slave->Master
#define RS_PROTOCOL_VER_1 (1)
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define RS_CMD_READ_DATA (5) // <20><><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define RS_RESULT_SUCC (0) // <20><><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD>
#define RS_RESULT_FAIL (-1) // <20><><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>
// ͨ<><CDA8>Э<EFBFBD><D0AD><EFBFBD>
const uint8_t RS_PROTOCOL_VER = RS_PROTOCOL_VER_1;
// 485й¶<D0B9><C2B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
typedef struct // size = RS_MAX_FRAME_LEN
{
uint8_t sof; // RS_FRMAE_SOF
uint8_t len; // bytes from sof to crc<72><63>RS_MIN_FRAME_LEN~RS_MAX_FRAME_LEN<45><4E>
uint8_t destAddr;
uint8_t srcAddr;
uint8_t srcPSN[6];
uint8_t dir;
uint8_t protocol_ver; // RS_PROTOCOL
uint8_t cmd;
uint8_t data[RS_MAX_DATA_LEN];
uint16_t crc; // ռλ<D5BC>ã<EFBFBD>ʵ<EFBFBD><CAB5>crc<72><63><EFBFBD>ܸ<EFBFBD><DCB8><EFBFBD>ǰ
} rs_frame_t;
// 485й¶<D0B9><C2B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
typedef struct // size = 20
{
uint16_t adc; // <20>ɼ<EFBFBD>ADCֵ
float measureValue; // <20>ɼ<EFBFBD>ֵ
uint8_t measureState; // <20><><EFBFBD><EFBFBD>ֵ״̬
uint16_t levelHeight; // Һλ<D2BA>߶<EFBFBD>
uint16_t volume; // ʣ<><CAA3>Һ<EFBFBD><D2BA>
uint16_t volumeMax; // <20><>Ч<EFBFBD>ݻ<EFBFBD>
uint16_t quality; // ʣ<><CAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint8_t warnState; // <20><><EFBFBD><EFBFBD>״̬
uint16_t envAdc; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ADC
int16_t envTempr; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
} rs_data_t;
#pragma pack(pop)
rs_frame_t RS_TranFrame;
modbus_comm_t modbus;
uint8_t modbus_idx = 0;
uint8_t vaccum_idx = 0;
data_sample_t *modbus_sample;
// MODBUS<55><53>CRC<52>
uint16_t MODBUS_RTU_CRC16(const uint8_t *puchMsg, uint16_t usDataLen)
{
uint16_t crc = 0xFFFF;
uint8_t i;
while (usDataLen--) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
crc ^= *puchMsg++;
for(i = 0; i < 8; i++)
{
if(crc & 0x0001)
{
crc >>= 1;
crc ^= 0xA001;
}
else
{
crc >>= 1;
}
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD><DFB5>ֽ<EFBFBD>˳<EFBFBD><CBB3>
return ((crc & 0xFF) << 8) | ((crc >> 8) & 0xFF);
}
// <20><>ʮ<EFBFBD><CAAE><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>BCD
void dec2bcd(uint32_t dec, uint8_t *bcd, uint8_t len)
{
char fmt[10], str[20];
uint8_t i;
// <20><><EFBFBD>ɸ<EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD><EFBFBD>磺%010u<30><75>
sprintf(fmt, "%%0%du", len * 2);
// <20><>decֵת<D6B5><D7AA><EFBFBD><EFBFBD>ǰ<EFBFBD>油0<E6B2B9><30><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>磺000000123456)
sprintf(str, fmt, dec);
// ת<><D7AA>
for(i = 0; i < strlen(str); i += 2)
{
bcd[i / 2] = ((str[i] - '0') << 4) | (str[i + 1] - '0');
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߣ<EFBFBD>Zhang Jm<4A><6D><EFBFBD><EFBFBD><E1B9A9><EFBFBD><EFBFBD><EFBFBD>ڶԶ<DAB6><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD><EFBFBD>ڹ<EFBFBD><DAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ-2<><32>0.01Pa<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/**
* @brief Function of Fuzzy Processing.
* @param value: vacuun value.
* @retval None.
*/
float Mode1_Fuzzy_Process(float value)
{
static const float beta1 = -0.2539755;
static const float beta2 = 13.15659;
static const float theta = 0.011666666;
static const float eta = 0.9999999;
static const float kappa = 0.006666666;
float temp1, temp2, result, lower_t = 0.0101;
if((value < 0.09f) && (value > 0.04f))
{
temp1 = -beta1 * value;
temp2 = beta2 * pow(value, 2.0);
return(1 - exp(temp1 - temp2));
}
else if((value <= 0.04f) && (value > 0.005f))
{/*y = theta*x^eta/(kappa^eta+x^eta)*/
temp1 = pow(value, eta);
temp2 = pow(kappa, eta) + temp1;
result = theta * temp1 / temp2;
if(result < lower_t)
return(lower_t);
else
return(result);
}
else
return(value);
}
void Modbus_Read(uint8_t c)
{
uint8_t i;
uint32_t reversed;
int32_t i_reversed;
float f;
uint8_t d_reversed[8];
double d;
/* Receive data */
if(modbus_idx < sizeof(modbus_recv_t))
{
modbus.buff[modbus_idx++] = c;
if(modbus.recv.header.id == LEAK_ID && modbus.recv.header.cmd == LEAK_CMD
&& modbus.recv.header.len == sizeof(modbus.recv.leak)
&& modbus_idx == sizeof(modbus.recv.header) + sizeof(modbus.recv.leak) + sizeof(modbus.recv.crc)
&& MODBUS_RTU_CRC16(modbus.buff, modbus_idx) == 0)
{
/* Print the received data */
// printf("Received data:\n");
// for(i = 0; i < modbus_idx; i++)
// {
// printf("%02X ", modbus.buff[i]);
// }
// printf("\n");
// ̽<><CCBD><EFBFBD><EFBFBD>״̬
modbus_sample->leak.staLeak = modbus.recv.leak.staLeak;
// Ũ<><C5A8>
modbus_sample->leak.concentrations = ntohs(modbus.recv.leak.concentrations);
if(modbus.recv.leak.ratio == 1)
modbus_sample->leak.concentrations /= 10;
else if(modbus.recv.leak.ratio == 2)
modbus_sample->leak.concentrations /= 100;
else if(modbus.recv.leak.ratio == 3)
modbus_sample->leak.concentrations /= 1000;
NVIC_SetPendingIRQ(TMR1_IRQn);
}
else if(modbus.recv.header.id == VACUUM_ID[vaccum_idx] && modbus.recv.header.cmd == VACUUM_CMD
&& modbus.recv.header.len == sizeof(modbus.recv.vacuum)
&& modbus_idx == sizeof(modbus.recv.header) + sizeof(modbus.recv.vacuum) + sizeof(modbus.recv.crc)
&& MODBUS_RTU_CRC16(modbus.buff, modbus_idx) == 0)
{
/* Print the received data */
printf("Received data:\n");
for(i = 0; i < modbus_idx; i++)
{
printf("%02X ", modbus.buff[i]);
}
printf("\n");
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬
modbus_sample->vacuum[vaccum_idx].staVacuum = ntohs(modbus.recv.vacuum.staVacuum);
// ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
modbus_sample->vacuum[vaccum_idx].lifeVacuum = ntohs(modbus.recv.vacuum.lifeVacuum);
// <20><><EFBFBD>ն<EFBFBD>
reversed = ntohl(modbus.recv.vacuum.vacuum);
memmove(&modbus_sample->vacuum[vaccum_idx].vacuum, &reversed, sizeof(modbus_sample->vacuum[vaccum_idx].vacuum));
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2021.11.03<EFBFBD><EFBFBD>
modbus_sample->vacuum[vaccum_idx].vacuum = Mode1_Fuzzy_Process(modbus_sample->vacuum[vaccum_idx].vacuum);
// ©<><C2A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
reversed = ntohl(modbus.recv.vacuum.rateVacuum);
memmove(&modbus_sample->vacuum[vaccum_idx].rateVacuum, &reversed, sizeof(modbus_sample->vacuum[vaccum_idx].rateVacuum));
// <20><EFBFBD>
reversed = ntohl(modbus.recv.vacuum.tempr);
memmove(&modbus_sample->vacuum[vaccum_idx].tempr, &reversed, sizeof(modbus_sample->vacuum[vaccum_idx].tempr));
NVIC_SetPendingIRQ(TMR1_IRQn);
}
#if defined(_SMARC_FLOWMETER_)
else if(modbus.recv.header.id == FLOW_ID && modbus.recv.header.cmd == FLOW_CMD
&& modbus.recv.header.len == sizeof(modbus.recv.flow_SMARC)
&& modbus_idx == sizeof(modbus.recv.header) + sizeof(modbus.recv.flow_SMARC) + sizeof(modbus.recv.crc)
&& MODBUS_RTU_CRC16(modbus.buff, modbus_idx) == 0)
{
// /* Print the received data */
// printf("Received data:\n");
// for(i = 0; i < modbus_idx; i++)
// {
// printf("%02X ", modbus.buff[i]);
// }
// printf("\n");
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
reversed = 0;
for(i = 0; i < 9; i++)
{
reversed *= 10;
if(i % 2 == 0)
reversed += (modbus.recv.flow_SMARC.nM3_BCD[i / 2] >> 4);
else
reversed += (modbus.recv.flow_SMARC.nM3_BCD[i / 2] & 0x0F);
}
dec2bcd(reversed, modbus_sample->flow.nM3, 5);
// С<><D0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
reversed = 0;
for(i = 9; i < 11; i++)
{
reversed *= 10;
if(i % 2 == 0)
reversed += (modbus.recv.flow_SMARC.nM3_BCD[i / 2] >> 4);
else
reversed += (modbus.recv.flow_SMARC.nM3_BCD[i / 2] & 0x0F);
}
dec2bcd(reversed, modbus_sample->flow.nM3 + 5, 1);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
reversed = ntohl(modbus.recv.flow_SMARC.nM3_h);
memmove(&f, &reversed, 4);
reversed = f * 100;
dec2bcd(reversed, modbus_sample->flow.nM3_h, 4);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
reversed = ntohl(modbus.recv.flow_SMARC.M3_h);
memmove(&f, &reversed, 4);
reversed = f * 100;
dec2bcd(reversed, modbus_sample->flow.M3_h, 4);
// <20><EFBFBD>
reversed = ntohl(modbus.recv.flow_SMARC.tempr);
memmove(&f, &reversed, 4);
i_reversed = f * 100;
if(i_reversed >= 0)
dec2bcd(i_reversed, modbus_sample->flow.tempr, 4);
else
{
dec2bcd(-i_reversed, modbus_sample->flow.tempr, 4);
modbus_sample->flow.tempr[0] = 0x80;
}
// ѹ<><D1B9>
reversed = ntohl(modbus.recv.flow_SMARC.pressure);
memmove(&f, &reversed, 4);
reversed = f * 100;
dec2bcd(reversed, modbus_sample->flow.pressure, 4);
/* Print the converted bcd data */
printf("Flowmeter BCD data:\n");
for(i = 0; i < sizeof(modbus_sample->flow); i++)
{
printf("%02X ", *(((uint8_t *) &modbus_sample->flow) + i));
}
printf("\n");
NVIC_SetPendingIRQ(TMR1_IRQn);
}
#elif defined(_TIANCYA4_FLOWMETER_)
else if(modbus.recv.header.id == FLOW_ID && modbus.recv.header.cmd == FLOW_CMD
&& modbus.recv.header.len == sizeof(modbus.recv.flow_TancyA4)
&& modbus_idx == sizeof(modbus.recv.header) + sizeof(modbus.recv.flow_TancyA4) + sizeof(modbus.recv.crc)
&& MODBUS_RTU_CRC16(modbus.buff, modbus_idx) == 0)
{
// /* Print the received data */
// printf("Received data:\n");
// for(i = 0; i < modbus_idx; i++)
// {
// printf("%02X ", modbus.buff[i]);
// }
// printf("\n");
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: double<6C><65>, <20>ȵߵ<C8B5>˳<EFBFBD><CBB3>
memmove(d_reversed, &modbus.recv.flow_TancyA4.nM3, 8);
i = d_reversed[0];
d_reversed[0] = d_reversed[7];
d_reversed[7] = i;
i = d_reversed[1];
d_reversed[1] = d_reversed[6];
d_reversed[6] = i;
i = d_reversed[2];
d_reversed[2] = d_reversed[5];
d_reversed[5] = i;
i = d_reversed[3];
d_reversed[3] = d_reversed[4];
d_reversed[4] = i;
memmove(&d, &d_reversed, 8);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
reversed = (uint32_t) d;
dec2bcd(reversed, modbus_sample->flow.nM3, 5);
// С<><D0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
reversed = (uint32_t) ((d - reversed) * 100);
dec2bcd(reversed, modbus_sample->flow.nM3 + 5, 1);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
reversed = ntohl(modbus.recv.flow_TancyA4.nM3_h);
memmove(&f, &reversed, 4);
reversed = f * 100;
dec2bcd(reversed, modbus_sample->flow.nM3_h, 4);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
reversed = ntohl(modbus.recv.flow_TancyA4.M3_h);
memmove(&f, &reversed, 4);
reversed = f * 100;
dec2bcd(reversed, modbus_sample->flow.M3_h, 4);
// <20><EFBFBD>
reversed = ntohl(modbus.recv.flow_TancyA4.tempr);
memmove(&f, &reversed, 4);
i_reversed = f * 100;
if(i_reversed >= 0)
dec2bcd(i_reversed, modbus_sample->flow.tempr, 4);
else
{
dec2bcd(-i_reversed, modbus_sample->flow.tempr, 4);
modbus_sample->flow.tempr[0] = 0x80;
}
// ѹ<><D1B9>
reversed = ntohl(modbus.recv.flow_TancyA4.pressure);
memmove(&f, &reversed, 4);
reversed = f * 100;
dec2bcd(reversed, modbus_sample->flow.pressure, 4);
/* Print the converted bcd data */
printf("Flowmeter BCD data:\n");
for(i = 0; i < sizeof(modbus_sample->flow); i++)
{
printf("%02X ", *(((uint8_t *) &modbus_sample->flow) + i));
}
printf("\n");
NVIC_SetPendingIRQ(TMR1_IRQn);
}
#else
else if(modbus.recv.header.id == FLOW_ID && modbus.recv.header.cmd == FLOW_CMD
&& modbus.recv.header.len == sizeof(modbus.recv.flow)
&& modbus_idx == sizeof(modbus.recv.header) + sizeof(modbus.recv.flow) + sizeof(modbus.recv.crc)
&& MODBUS_RTU_CRC16(modbus.buff, modbus_idx) == 0)
{
// /* Print the received data */
// printf("Received data:\n");
// for(i = 0; i < modbus_idx; i++)
// {
// printf("%02X ", modbus.buff[i]);
// }
// printf("\n");
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>BCD<43><EFBFBD>Ŵ<EFBFBD>100<30><30><EFBFBD><EFBFBD>
if((htons(modbus.recv.flow.err2) & 0x000F) == 0x0003) // <20>Ƿ<EFBFBD><C7B7><EFBFBD><E6B4A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
dec2bcd(0, modbus_sample->flow.nM3, 6);
else
{
reversed = ntohl(modbus.recv.flow.nM3_int); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
dec2bcd(reversed, modbus_sample->flow.nM3, 5);
reversed = ntohs(modbus.recv.flow.nM3_frac); // С<><D0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
reversed /= 100; // <20>Ŵ<EFBFBD>10000<30><30>-><3E>Ŵ<EFBFBD>100<30><30>
dec2bcd(reversed, modbus_sample->flow.nM3 + 5, 1);
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>BCD<43><EFBFBD>Ŵ<EFBFBD>100<30><30><EFBFBD><EFBFBD>
reversed = ntohl(modbus.recv.flow.nM3_h);
dec2bcd(reversed, modbus_sample->flow.nM3_h, 4);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>BCD<43><EFBFBD>Ŵ<EFBFBD>100<30><30><EFBFBD><EFBFBD>
reversed = ntohl(modbus.recv.flow.M3_h);
dec2bcd(reversed, modbus_sample->flow.M3_h, 4);
// <20>ȣ<C2B6>BCD<43><EFBFBD>Ŵ<EFBFBD>100<30><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD>ֽ<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD>ţ<EFBFBD> 80H Ϊ<><CEAA><EFBFBD><EFBFBD>00H Ϊ<><CEAA><EFBFBD><EFBFBD>
if((htons(modbus.recv.flow.err1) & 0x000F) == 0x0003) // <20>Ƿ<EFBFBD><C7B7>¶ȴ<C2B6><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
i_reversed = 0;
else
{
i_reversed = ntohs(modbus.recv.flow.tempr);
i_reversed *= 10; // <20>Ŵ<EFBFBD>10<31><30>-><3E>Ŵ<EFBFBD>100<30><30>
}
if(i_reversed >= 0)
dec2bcd(i_reversed, modbus_sample->flow.tempr, 4);
else
{
dec2bcd(-i_reversed, modbus_sample->flow.tempr, 4);
modbus_sample->flow.tempr[0] = 0x80;
}
// ѹ<><D1B9><EFBFBD><EFBFBD>BCD<43><EFBFBD>Ŵ<EFBFBD>100<30><30><EFBFBD><EFBFBD>
if((htons(modbus.recv.flow.err1) & 0x00F0) == 0x0030) // <20>Ƿ<EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
reversed = 0;
else
{
reversed = ntohl(modbus.recv.flow.pressure);
reversed *= 10; // <20>Ŵ<EFBFBD>10<31><30>-><3E>Ŵ<EFBFBD>100<30><30>
}
dec2bcd(reversed, modbus_sample->flow.pressure, 4);
/* Print the converted bcd data */
printf("Flowmeter BCD data:\n");
for(i = 0; i < sizeof(modbus_sample->flow); i++)
{
printf("%02X ", *(((uint8_t *) &modbus_sample->flow) + i));
}
printf("\n");
NVIC_SetPendingIRQ(TMR1_IRQn);
}
#endif
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><D0A3>
uint8_t rs_phy_valid(rs_frame_t *frame)
{
if(frame->protocol_ver != RS_PROTOCOL_VER || frame->dir != RS_DIR_S2M)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><D0A3>ʧ<EFBFBD><CAA7>
return 0;
}
return 1;
}
// mac<61><63>У<EFBFBD><D0A3>
uint8_t rs_mac_valid(rs_frame_t *frame, uint8_t dir)
{
if(frame->destAddr != dcBuff.configBottle.addr)
{
// mac<61><63>У<EFBFBD><D0A3>ʧ<EFBFBD><CAA7>
return 0;
}
return 1;
}
// <20><>ʼ<EFBFBD><CABC>֡
void rs_initial_frame(rs_frame_t *frame)
{
memset((uint8_t *) frame, 0, sizeof(rs_frame_t));
frame->len = RS_MIN_FRAME_LEN;
}
// ׷<>Ӹ<EFBFBD><D3B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint8_t rs_append_data(rs_frame_t *frame, uint8_t *data, uint8_t len)
{
if(frame->len < RS_MIN_FRAME_LEN || frame->len + len > RS_MAX_FRAME_LEN)
return 0;
if(len > 0)
memmove(frame->data + (frame->len - RS_MIN_FRAME_LEN), data, len);
frame->len += len;
return 1;
}
// <20><><EFBFBD><EFBFBD>Ѱ<EFBFBD><D1B0>SOF
void RS_SearchSOF(uint8_t *buf, uint16_t fromPos, uint8_t *len)
{
uint8_t i;
for(i = fromPos; i < *len && buf[i] != RS_FRAME_SOF; i++)
{
}
*len -= i;
memmove(buf, buf + i, *len);
}
// ģ<><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E5A3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void RS_ParseFrame(uint8_t c)
{
uint8_t *RS_ModuleData = (uint8_t *) &RS_TranFrame;
uint16_t i;
uint8_t frameOk, frameErr;
uint32_t mask;
rs_data_t *rsData = (rs_data_t *) (RS_TranFrame.data + sizeof(mask));
if(modbus_idx == 0 && c != RS_FRAME_SOF)
return;
RS_ModuleData[modbus_idx++] = c;
do
{
frameErr = (modbus_idx >= 2 &&
(RS_ModuleData[1] < RS_MIN_FRAME_LEN || RS_ModuleData[1] > RS_MAX_FRAME_LEN));
if(frameErr)
{
// <20><>1<EFBFBD><31>ʼѰ<CABC><D1B0>SOF
RS_SearchSOF(RS_ModuleData, 1, &modbus_idx);
}
frameOk = (modbus_idx >= 2 && RS_ModuleData[1] >= RS_MIN_FRAME_LEN && RS_ModuleData[1] <= RS_MAX_FRAME_LEN
&& modbus_idx >= RS_ModuleData[1]);
if(frameOk)
{
if(MODBUS_RTU_CRC16(RS_ModuleData, RS_ModuleData[1]) == 0)
{
if(rs_phy_valid(&RS_TranFrame) && rs_mac_valid(&RS_TranFrame, RS_DIR_M2S))
{
// <20>յ<EFBFBD>һ֡
printf("\r\nRS recv %d bytes:\r\n", RS_ModuleData[1]);
for(i = 0; i < RS_ModuleData[1]; i++)
printf(" %02X", RS_ModuleData[i]);
printf("\r\n");
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ֡
{
memmove(&mask, RS_TranFrame.data, 4);
mask = ntohl(mask);
if((mask & 0x61000000) == 0x61000000) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
modbus_sample->leak.typeLeak = LEAK_TYPE_MODBUS;
if(rsData->measureState > 1)
modbus_sample->leak.staLeak = LEAK_STATUS_FAULT;
else if(rsData->warnState == 4)
modbus_sample->leak.staLeak = LEAK_STATUS_A2_ALARM;
else
modbus_sample->leak.staLeak = LEAK_STATUS_OK;
if(rsData->warnState < 3)
modbus_sample->leak.concentrations = 0;
else
{
memmove(&mask, &rsData->measureValue, 4);
mask = ntohl(mask);
memmove(&rsData->measureValue, &mask, 4);
modbus_sample->leak.concentrations = rsData->measureValue / 1000;
}
}
NVIC_SetPendingIRQ(TMR1_IRQn);
}
}
// <20><><EFBFBD><EFBFBD>Ѱ<EFBFBD><D1B0><EFBFBD><EFBFBD>һ֡
modbus_idx -= RS_ModuleData[1];
memmove(RS_ModuleData, RS_ModuleData + RS_ModuleData[1], modbus_idx);
// <20><>0<EFBFBD><30>ʼѰ<CABC><D1B0>SOF
RS_SearchSOF(RS_ModuleData, 0, &modbus_idx);
}
else
{
// <20><>1<EFBFBD><31>ʼѰ<CABC><D1B0>SOF
RS_SearchSOF(RS_ModuleData, 1, &modbus_idx);
}
}
} while(frameOk || frameErr);
}
void SC0_IRQHandler(void)
{
uint8_t c;
// <20><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
if(SCUART_GET_INT_FLAG(SC0, SC_ISR_RDA_IS_Msk) || SCUART_GET_INT_FLAG(SC0, SC_ISR_RTMR_IS_Msk)) /* Rx Ready or Time-out INT*/
{
c = SC0->RBR;
//printf("<%02X>", c);
if(RS485_Read != NULL)
RS485_Read(c);
}
// <20><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
if(SCUART_GET_INT_FLAG(SC0, SC_ISR_TERR_IS_Msk))
{
SCUART_CLR_INT_FLAG(SC0, SC_ISR_TERR_IS_Msk);
}
}
void Sensor_Init()
{
/* Select SC UART module clock source as HXT and UART module clock divider as 1 */
CLK_SetModuleClock(SC0_MODULE, CLK_CLKSEL2_SC_S_HXT, CLK_SC0_CLK_DIVIDER(1));
/* Set PA.8 and PA.9 pin for SC UART mode */
SYS->PA_H_MFP &= ~(SYS_PA_H_MFP_PA8_MFP_Msk | SYS_PA_H_MFP_PA9_MFP_Msk);
SYS->PA_H_MFP |= (SYS_PA_H_MFP_PA8_MFP_SC0_CLK | SYS_PA_H_MFP_PA9_MFP_SC0_DAT);
GPIO_ENABLE_PULL_UP(PA, BIT9);
/* Enable SC UART module clock */
CLK_EnableModuleClock(SC0_MODULE);
SYS->PC_L_MFP &= ~SYS_PC_L_MFP_PC7_MFP_Msk;
SYS->PC_L_MFP |= SYS_PC_L_MFP_PC7_MFP_GPC7;
GPIO_SetMode(PC, 1 << 7, GPIO_PMD_OUTPUT);
RS485_EN = 0;
}
void Sensor_Open()
{
SCUART_Open(SC0, 9600);
SCUART_ENABLE_INT(SC0, (SC_IER_RDA_IE_Msk)); // | SC_IER_RTMR_IE_Msk));// | SC_IER_TERR_IE_Msk));
NVIC_SetPriority(SC0_IRQn, 1);
NVIC_EnableIRQ(SC0_IRQn);
}
static void RS485_SendDataByte(uint8_t *pu8TxBuf, uint32_t u32WriteBytes)
{
RS485_EN = 1;
delay_us(1);
/* Send data */
SCUART_Write(SC0, pu8TxBuf, u32WriteBytes);
delay_ms(6); // <20><><EFBFBD><EFBFBD>5ms<6D><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>6ms
RS485_EN = 0;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E3B7A2>
uint8_t rs_uart_send(rs_frame_t *frame, uint8_t destAddr, uint8_t dir)
{
uint16_t crc;
uint8_t i;
// <20><>д<EFBFBD>̶<EFBFBD><CCB6>ֶ<EFBFBD>
frame->sof = RS_FRAME_SOF;
frame->destAddr = destAddr;
frame->srcAddr = dcBuff.configBottle.addr;
memmove(frame->srcPSN, dcBuff.configBottle.PSN, 6);
frame->dir = dir;
frame->protocol_ver = RS_PROTOCOL_VER;
crc = MODBUS_RTU_CRC16((uint8_t *) frame, frame->len - 2);
((uint8_t *) frame)[frame->len - 2] = crc >> 8;
((uint8_t *) frame)[frame->len - 1] = crc & 0xFF;
printf("\r\nRS send %d bytes:\r\n", frame->len);
for(i = 0; i < frame->len; i++)
printf(" %02X", ((uint8_t *) frame)[i]);
printf("\r\n");
RS485_SendDataByte((uint8_t *) frame, frame->len);
return 1;
}
// <20><>ȡ<EFBFBD><C8A1><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD><EFBFBD><EFBFBD>
void Sensor_ReadVacuum(uint8_t sensorIdx, data_sample_t *sample)
{
// <20><><EFBFBD><EFBFBD><EFBFBD>жϻص<CFBB><D8B5><EFBFBD><EFBFBD><EFBFBD>
RS485_Read = Modbus_Read;
// <20>޸IJ<DEB8><C4B2><EFBFBD><EFBFBD><EFBFBD>
SCUART_Open(SC0, 9600);
// Ĭ<>϶<EFBFBD>ȡʧ<C8A1><CAA7>
sample->vacuum[sensorIdx].staVacuum = VACUUM_STATUS_COMM_FAULT;
sample->vacuum[sensorIdx].lifeVacuum = 0;
sample->vacuum[sensorIdx].vacuum = 0;
sample->vacuum[sensorIdx].rateVacuum = 0;
/* Flush FIFO */
while(SCUART_GET_RX_EMPTY(SC0) == 0)
{
SCUART_READ(SC0);
}
// <20><>ʼ<EFBFBD><CABC>
modbus_sample = sample;
vaccum_idx = sensorIdx;
modbus_idx = 0;
// <20><><EFBFBD><EFBFBD>
modbus.send.id = VACUUM_ID[sensorIdx];
modbus.send.cmd = VACUUM_CMD;
modbus.send.addr = htons(VACUUM_ADDR - 1);
modbus.send.len = htons(VACUUM_LEN);
modbus.send.crc = htons(MODBUS_RTU_CRC16(modbus.buff, sizeof(modbus_send_t) - 2));
RS485_SendDataByte(modbus.buff, sizeof(modbus_send_t));
// <20>ȴ<EFBFBD><C8B4>жϴ<D0B6><CFB4><EFBFBD>
}
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void Sensor_ReadFlow(data_sample_t *sample)
{
// <20><><EFBFBD><EFBFBD><EFBFBD>жϻص<CFBB><D8B5><EFBFBD><EFBFBD><EFBFBD>
RS485_Read = Modbus_Read;
// <20>޸IJ<DEB8><C4B2><EFBFBD><EFBFBD><EFBFBD>
SCUART_Open(SC0, 9600);
// Ĭ<>϶<EFBFBD>ȡʧ<C8A1><CAA7>
memset(&sample->flow, 0, sizeof(sample->flow));
/* Flush FIFO */
while(SCUART_GET_RX_EMPTY(SC0) == 0)
{
SCUART_READ(SC0);
}
// <20><>ʼ<EFBFBD><CABC>
modbus_sample = sample;
modbus_idx = 0;
// <20><><EFBFBD><EFBFBD>
modbus.send.id = FLOW_ID;
modbus.send.cmd = FLOW_CMD;
modbus.send.addr = htons(FLOW_ADDR);
modbus.send.len = htons(FLOW_LEN);
modbus.send.crc = htons(MODBUS_RTU_CRC16(modbus.buff, sizeof(modbus_send_t) - 2));
RS485_SendDataByte(modbus.buff, sizeof(modbus_send_t));
// <20>ȴ<EFBFBD><C8B4>жϴ<D0B6><CFB4><EFBFBD>
}
// <20><>ȡй©<D0B9><C2A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void Sensor_ReadLeak(data_sample_t *sample)
{
uint8_t reSample = 0;
#if 0
// <20><><EFBFBD><EFBFBD><EFBFBD>жϻص<CFBB><D8B5><EFBFBD><EFBFBD><EFBFBD>
RS485_Read = Modbus_Read;
// <20>޸IJ<DEB8><C4B2><EFBFBD><EFBFBD><EFBFBD>
SCUART_Open(SC0, 9600);
#else
// <20><><EFBFBD><EFBFBD><EFBFBD>жϻص<CFBB><D8B5><EFBFBD><EFBFBD><EFBFBD>
RS485_Read = RS_ParseFrame;
// <20>޸IJ<DEB8><C4B2><EFBFBD><EFBFBD><EFBFBD>
SCUART_Open(SC0, 19200);
#endif
// Ĭ<>϶<EFBFBD>ȡʧ<C8A1><CAA7>
sample->leak.staLeak = LEAK_STATUS_COMM_FAULT;
sample->leak.concentrations = 0;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
sample->leak.typeLeak = LEAK_TYPE_SWITCH | LEAK_TYPE_CURRENT | LEAK_TYPE_MODBUS;
/* Flush FIFO */
while(SCUART_GET_RX_EMPTY(SC0) == 0)
{
SCUART_READ(SC0);
}
// <20><>ʼ<EFBFBD><CABC>
modbus_sample = sample;
modbus_idx = 0;
// <20><><EFBFBD><EFBFBD>
#if 0
modbus.send.id = LEAK_ID;
modbus.send.cmd = LEAK_CMD;
modbus.send.addr = htons(LEAK_ADDR);
modbus.send.len = htons(LEAK_LEN);
modbus.send.crc = htons(MODBUS_RTU_CRC16(modbus.buff, sizeof(modbus_send_t) - 2));
RS485_SendDataByte(modbus.buff, sizeof(modbus_send_t));
#else
rs_initial_frame(&RS_TranFrame);
RS_TranFrame.cmd = RS_CMD_READ_DATA;
rs_append_data(&RS_TranFrame, (uint8_t *) &reSample, 1);
rs_uart_send(&RS_TranFrame, 0x50, RS_DIR_M2S);
#endif
// <20>ȴ<EFBFBD><C8B4>жϴ<D0B6><CFB4><EFBFBD>
}
uint32_t Sensor_ReadDOL()
{
uint8_t buf[14];
uint8_t c, i;
uint8_t idx = 0;
int16_t fld;
uint32_t adc[20] = {-1};
uint8_t cnt = 0;
uint32_t tick = GetDelayTick(1000);
// <20><>ֹ<EFBFBD>ж<EFBFBD>
NVIC_DisableIRQ(UART0_IRQn);
// <20><><EFBFBD><EFBFBD><EFBFBD>ڸ<EFBFBD><DAB8><EFBFBD>Ϊ19200bps
UART_Open(UART0, 19200);
while(!IsTickOut(tick))
{
if(UART_GET_INT_FLAG(UART0, UART_ISR_BUF_ERR_IS_Msk)) /* Buffer Error INT */
{
UART_ClearIntFlag(UART0, UART_ISR_BUF_ERR_IS_Msk);
}
if(UART_GET_INT_FLAG(UART0, UART_ISR_RLS_IS_Msk)) /* RLS INT */
{
UART_ClearIntFlag(UART0, UART_ISR_RLS_IS_Msk);
}
// <20><><EFBFBD><EFBFBD>DOL<4F><4C><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>TTL<54><4C><EFBFBD>ݣ<EFBFBD>ÿ13<31><33><EFBFBD>ֽ<EFBFBD>Ϊһ֡<D2BB><D6A1><EFBFBD><EFBFBD>0x35<33><35>ͷ<EFBFBD><CDB7>
// <20><><EFBFBD>ڲ<EFBFBD>֪<EFBFBD><D6AA>֡У<D6A1>ʽ<E9B7BD><CABD><EFBFBD><EFBFBD><EFBFBD>Խ<EFBFBD><D4BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2<EFBFBD><32>֡ͷ<D6A1><CDB7>һͷһβ<D2BB><CEB2><EFBFBD>ҵ<EFBFBD>10<31><30><EFBFBD>ֽ<EFBFBD>Ϊ0x81<38><31><EFBFBD><EFBFBD>Ϊ<EFBFBD>Ϸ<EFBFBD>֡<EFBFBD>ı<EFBFBD>׼
if(UART_GET_INT_FLAG(UART0, UART_ISR_RDA_IS_Msk) || UART_GET_INT_FLAG(UART0, UART_ISR_RTO_IS_Msk))
{
c = UART0->RBR;
// <20><>λ<EFBFBD><CEBB>1<EFBFBD><31>֡ͷ
if(idx == 0 && c != 0x35)
continue;
buf[idx++] = c;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2<EFBFBD><32>֡ͷ<D6A1><CDB7>ȷ<EFBFBD><C8B7><EFBFBD>յ<EFBFBD><D5B5><EFBFBD>ȷ<EFBFBD><C8B7>һ֡
if(idx == 14 && (buf[13] != 0x35 || buf[10] != 0x81))
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD>м<EFBFBD><D0BC><EFBFBD>֡ͷ
for(i = 1; i < idx; i++)
{
if(buf[i] == 0x35)
break;
}
// <20><><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD><EFBFBD>i<EFBFBD><69><EFBFBD><EFBFBD>idx<64><78>idx<64><78><EFBFBD><EFBFBD>Ϊ0
idx -= i;
memmove(buf, buf + i, idx);
}
// <20>յ<EFBFBD>һ֡
if(idx == 14)
{
// ȡ<><C8A1>2~3<>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD>ɵ<EFBFBD><C9B5>з<EFBFBD><D0B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5>27.3<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΪӢ<EFBFBD><EFBFBD>ˮ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
memmove(&fld, buf + 2, 2);
if(fld < 0)
adc[cnt] = 0;
else
adc[cnt] = fld;
// <20>չ<EFBFBD>20֡
if(++cnt == 20)
{
// <20><><EFBFBD><EFBFBD><EFBFBD>Ժ<EFBFBD>ȡ<EFBFBD>м<EFBFBD>10֡<30><D6A1>ƽ<EFBFBD><C6BD>ֵ
sort(adc, cnt);
adc[0] = 0;
for(i = 5; i < 15; i++)
adc[0] += adc[i];
adc[0] /= 10;
break;
}
// ׼<><D7BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ֡<D2BB><D6A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ֡ͷ<D6A1><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
idx = 0;
buf[idx++] = c;
}
}
}
// <20>ָ<EFBFBD><D6B8>ж<EFBFBD>
UART_Open(UART0, 115200ul);
NVIC_EnableIRQ(UART0_IRQn);
return adc[0];
}