1151 lines
31 KiB
C
1151 lines
31 KiB
C
|
|
/*
|
|||
|
|
*********************************************************************************************************
|
|||
|
|
* IAR Development Kits
|
|||
|
|
* on the
|
|||
|
|
*
|
|||
|
|
* M451
|
|||
|
|
*
|
|||
|
|
* Filename : spi_adc.c
|
|||
|
|
* Version : V1.00
|
|||
|
|
* Programmer(s) : Qian Xianghong
|
|||
|
|
*********************************************************************************************************
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
#include "includes.h"
|
|||
|
|
|
|||
|
|
// <20>Ƿ<EFBFBD>SMARC<52><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
//#define _SMARC_FLOWMETER_
|
|||
|
|
|
|||
|
|
//#define RS485_EN() LL_GPIO_SetOutputPin(GPIOB, LL_GPIO_PIN_2);
|
|||
|
|
//#define RS485_DIS() LL_GPIO_ResetOutputPin(GPIOB, LL_GPIO_PIN_2);
|
|||
|
|
|
|||
|
|
// <20>Ƿ<EFBFBD><C7B7><EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
//#define _THERMAL_FLOWMETER_
|
|||
|
|
|
|||
|
|
// <20>Ƿ<EFBFBD>ϣ<EFBFBD><CFA3>˼S401<30><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
//#define _S401_FLOWMETER_
|
|||
|
|
|
|||
|
|
// Ĭ<><C4AC>Ϊ˹<CEAA><CBB9><EFBFBD><EFBFBD>˼<EFBFBD><CBBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
// <20><>ȡ<EFBFBD><C8A1>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
|
|||
|
|
volatile uint32_t modbus_outTick = 0;
|
|||
|
|
|
|||
|
|
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>
|
|||
|
|
|
|||
|
|
#if defined(_SMARC_FLOWMETER_)
|
|||
|
|
const uint8_t FLOW_ID = 1; // SMARC<52><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD>ŵ<EFBFBD>ַ
|
|||
|
|
#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(_THERMAL_FLOWMETER_)
|
|||
|
|
const uint8_t FLOW_ID = 4; // <20><>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD>ŵ<EFBFBD>ַ
|
|||
|
|
#define FLOW_CMD 3 // <20><><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
|
|||
|
|
#define FLOW_ADDR 7 // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
|
|||
|
|
#define FLOW_LEN 6 // <20><><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD>ȡ<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
#elif defined(_S401_FLOWMETER_)
|
|||
|
|
const uint8_t FLOW_ID = 4; // S401<30><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD>ŵ<EFBFBD>ַ
|
|||
|
|
#define FLOW_CMD 3 // <20><><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
|
|||
|
|
#define FLOW_ADDR 6 // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
|
|||
|
|
#define FLOW_LEN 4 // <20><><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD>ȡ<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
#else
|
|||
|
|
const uint8_t FLOW_ID = 4; // ˹<><CBB9><EFBFBD><EFBFBD>˼<EFBFBD><CBBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD>ŵ<EFBFBD>ַ
|
|||
|
|
#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
|
|||
|
|
|
|||
|
|
const uint8_t LEAK_O2_ID = 1; // O2Ũ<32>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD>ŵ<EFBFBD>ַ
|
|||
|
|
#define LEAK_O2_SOF 0xFF // O2Ũ<32>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>
|
|||
|
|
#define LEAK_O2_CMD 0x86 // O2Ũ<32>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
#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><CABD><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 nM3x100; // <20>ۼ<EFBFBD><DBBC><EFBFBD><EFBFBD><EFBFBD>100<30><30><EFBFBD>ϣ<EFBFBD>uint32_t
|
|||
|
|
uint32_t nM3r100; // <20>ۼ<EFBFBD><DBBC><EFBFBD><EFBFBD><EFBFBD>100<30><30><EFBFBD>£<EFBFBD>float, <20><><EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>uint32_t<5F>ͽ<EFBFBD><CDBD><EFBFBD>
|
|||
|
|
} flow_Thermal;
|
|||
|
|
|
|||
|
|
// S401<30><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
struct
|
|||
|
|
{
|
|||
|
|
uint32_t nM3_h; // <20><><EFBFBD><EFBFBD>: <20>ֱ<EFBFBD><D6B1><EFBFBD>0.1, uint32_t
|
|||
|
|
uint32_t nM3; // <20>ۻ<EFBFBD><DBBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD>1<EFBFBD><31>uint32_t
|
|||
|
|
} flow_S401;
|
|||
|
|
};
|
|||
|
|
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;
|
|||
|
|
|
|||
|
|
// O2Ũ<32>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
|
|||
|
|
typedef struct
|
|||
|
|
{
|
|||
|
|
uint8_t addr;
|
|||
|
|
uint8_t cmd;
|
|||
|
|
uint8_t reserved[5];
|
|||
|
|
} leak_o2_send_t;
|
|||
|
|
|
|||
|
|
// O2Ũ<32>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؽ<EFBFBD><D8BD><EFBFBD>
|
|||
|
|
typedef struct
|
|||
|
|
{
|
|||
|
|
uint8_t cmd;
|
|||
|
|
uint16_t concentrations; // Ũ<><C5A8>
|
|||
|
|
uint8_t reserved[4];
|
|||
|
|
} leak_o2_recv_t;
|
|||
|
|
|
|||
|
|
// O2Ũ<32>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8>֡
|
|||
|
|
typedef union
|
|||
|
|
{
|
|||
|
|
struct
|
|||
|
|
{
|
|||
|
|
uint8_t sof;
|
|||
|
|
union
|
|||
|
|
{
|
|||
|
|
leak_o2_send_t send;
|
|||
|
|
leak_o2_recv_t recv;
|
|||
|
|
};
|
|||
|
|
uint8_t cs;
|
|||
|
|
};
|
|||
|
|
uint8_t buff[9];
|
|||
|
|
} leak_o2_comm_t;
|
|||
|
|
|
|||
|
|
// DYQ-7ͨ<37><CDA8>Э<EFBFBD><D0AD><EFBFBD><EFBFBD>й¶<D0B9><C2B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݲɼ<DDB2>ͷ<EFBFBD><CDB7>ѹ<EFBFBD><D1B9><EFBFBD>ɼ<EFBFBD>ͷ<EFBFBD><CDB7>
|
|||
|
|
#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;
|
|||
|
|
|
|||
|
|
leak_o2_comm_t leakO2;
|
|||
|
|
|
|||
|
|
// <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>O2Ũ<32>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD>
|
|||
|
|
uint8_t leak_o2_calcuCS(uint8_t *data, uint16_t len)
|
|||
|
|
{
|
|||
|
|
uint8_t cs = 0;
|
|||
|
|
|
|||
|
|
while(len--)
|
|||
|
|
cs += *data++;
|
|||
|
|
|
|||
|
|
return (~cs) + 1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><>ʼ<EFBFBD><CABC>O2Ũ<32><C5A8>ͨ<EFBFBD><CDA8>֡
|
|||
|
|
void leak_o2_init_frame(leak_o2_comm_t *frame)
|
|||
|
|
{
|
|||
|
|
memset(frame, 0, sizeof(leak_o2_comm_t));
|
|||
|
|
frame->sof = LEAK_O2_SOF;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <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(USART_Handle *huart)
|
|||
|
|
{
|
|||
|
|
uint8_t i;
|
|||
|
|
uint32_t reversed;
|
|||
|
|
int32_t i_reversed;
|
|||
|
|
float f;
|
|||
|
|
uint8_t c = (uint8_t) huart->Instance->RDR;
|
|||
|
|
|
|||
|
|
/* 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;
|
|||
|
|
|
|||
|
|
// <20>˳<EFBFBD><CBB3><EFBFBD>ʱ<EFBFBD>ȴ<EFBFBD>
|
|||
|
|
modbus_outTick = GetDelayTick(0);
|
|||
|
|
}
|
|||
|
|
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.10.28<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));
|
|||
|
|
|
|||
|
|
// <20>˳<EFBFBD><CBB3><EFBFBD>ʱ<EFBFBD>ȴ<EFBFBD>
|
|||
|
|
modbus_outTick = GetDelayTick(0);
|
|||
|
|
}
|
|||
|
|
#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");
|
|||
|
|
|
|||
|
|
// <20>˳<EFBFBD><CBB3><EFBFBD>ʱ<EFBFBD>ȴ<EFBFBD>
|
|||
|
|
modbus_outTick = GetDelayTick(0);
|
|||
|
|
}
|
|||
|
|
#elif defined(_THERMAL_FLOWMETER_)
|
|||
|
|
else if(modbus.recv.header.id == FLOW_ID && modbus.recv.header.cmd == FLOW_CMD
|
|||
|
|
&& modbus.recv.header.len == sizeof(modbus.recv.flow_Thermal)
|
|||
|
|
&& modbus_idx == sizeof(modbus.recv.header) + sizeof(modbus.recv.flow_Thermal) + 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>
|
|||
|
|
reversed = ntohl(modbus.recv.flow_Thermal.nM3_h);
|
|||
|
|
memmove(&f, &reversed, 4);
|
|||
|
|
reversed = f * 100;
|
|||
|
|
dec2bcd(reversed, modbus_sample->flow.nM3_h, 4);
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Э<EFBFBD><D0AD><EFBFBD>ޣ<EFBFBD><DEA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
dec2bcd(reversed, modbus_sample->flow.M3_h, 4);
|
|||
|
|
// <20>¶ȣ<C2B6>Э<EFBFBD><D0AD><EFBFBD>ޣ<EFBFBD><DEA3><EFBFBD>0<EFBFBD><30>
|
|||
|
|
dec2bcd(0, modbus_sample->flow.tempr, 4);
|
|||
|
|
// ѹ<><D1B9><EFBFBD><EFBFBD>Э<EFBFBD><D0AD><EFBFBD>ޣ<EFBFBD><DEA3><EFBFBD>0<EFBFBD><30>
|
|||
|
|
dec2bcd(0, modbus_sample->flow.pressure, 4);
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
// 100<30><30><EFBFBD>ϲ<EFBFBD><CFB2><EFBFBD>
|
|||
|
|
reversed = ntohl(modbus.recv.flow_Thermal.nM3x100);
|
|||
|
|
dec2bcd(reversed, modbus_sample->flow.nM3, 4);
|
|||
|
|
// 100<30><30><EFBFBD>²<EFBFBD><C2B2><EFBFBD>
|
|||
|
|
reversed = ntohl(modbus.recv.flow_Thermal.nM3r100);
|
|||
|
|
memmove(&f, &reversed, 4);
|
|||
|
|
reversed = f * 100;
|
|||
|
|
dec2bcd(reversed, modbus_sample->flow.nM3 + 4, 2);
|
|||
|
|
|
|||
|
|
/* 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");
|
|||
|
|
|
|||
|
|
// <20>˳<EFBFBD><CBB3><EFBFBD>ʱ<EFBFBD>ȴ<EFBFBD>
|
|||
|
|
modbus_outTick = GetDelayTick(0);
|
|||
|
|
}
|
|||
|
|
#elif defined(_S401_FLOWMETER_)
|
|||
|
|
else if(modbus.recv.header.id == FLOW_ID && modbus.recv.header.cmd == FLOW_CMD
|
|||
|
|
&& modbus.recv.header.len == sizeof(modbus.recv.flow_S401)
|
|||
|
|
&& modbus_idx == sizeof(modbus.recv.header) + sizeof(modbus.recv.flow_S401) + 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>
|
|||
|
|
reversed = ntohl(modbus.recv.flow_S401.nM3_h) * 10; // x10->x100
|
|||
|
|
dec2bcd(reversed, modbus_sample->flow.nM3_h, 4);
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Э<EFBFBD><D0AD><EFBFBD>ޣ<EFBFBD><DEA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
dec2bcd(reversed, modbus_sample->flow.M3_h, 4);
|
|||
|
|
// <20>¶ȣ<C2B6>Э<EFBFBD><D0AD><EFBFBD>ޣ<EFBFBD><DEA3><EFBFBD>0<EFBFBD><30>
|
|||
|
|
dec2bcd(0, modbus_sample->flow.tempr, 4);
|
|||
|
|
// ѹ<><D1B9><EFBFBD><EFBFBD>Э<EFBFBD><D0AD><EFBFBD>ޣ<EFBFBD><DEA3><EFBFBD>0<EFBFBD><30>
|
|||
|
|
dec2bcd(0, modbus_sample->flow.pressure, 4);
|
|||
|
|
|
|||
|
|
// <20>ۻ<EFBFBD><DBBB><EFBFBD>
|
|||
|
|
reversed = ntohl(modbus.recv.flow_S401.nM3) * 100; // x1->x100
|
|||
|
|
dec2bcd(reversed, modbus_sample->flow.nM3, 6);
|
|||
|
|
|
|||
|
|
/* 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");
|
|||
|
|
|
|||
|
|
// <20>˳<EFBFBD><CBB3><EFBFBD>ʱ<EFBFBD>ȴ<EFBFBD>
|
|||
|
|
modbus_outTick = GetDelayTick(0);
|
|||
|
|
}
|
|||
|
|
#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");
|
|||
|
|
|
|||
|
|
// <20>˳<EFBFBD><CBB3><EFBFBD>ʱ<EFBFBD>ȴ<EFBFBD>
|
|||
|
|
modbus_outTick = GetDelayTick(0);
|
|||
|
|
}
|
|||
|
|
#endif
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void LeakO2_Read(USART_Handle *huart)
|
|||
|
|
{
|
|||
|
|
uint8_t i;
|
|||
|
|
uint8_t c = (uint8_t) huart->Instance->RDR;
|
|||
|
|
uint16_t concentrations = 0;
|
|||
|
|
|
|||
|
|
/* Receive data */
|
|||
|
|
if(modbus_idx < sizeof(leak_o2_comm_t))
|
|||
|
|
{
|
|||
|
|
leakO2.buff[modbus_idx++] = c;
|
|||
|
|
|
|||
|
|
if(modbus_idx == sizeof(leak_o2_comm_t)
|
|||
|
|
&& leakO2.sof == LEAK_O2_SOF && leakO2.recv.cmd == LEAK_O2_CMD
|
|||
|
|
&& leak_o2_calcuCS(leakO2.buff + 1, sizeof(leak_o2_comm_t) - 2) == leakO2.cs)
|
|||
|
|
{
|
|||
|
|
/* Print the received data */
|
|||
|
|
printf("Received data:\n");
|
|||
|
|
for(i = 0; i < modbus_idx; i++)
|
|||
|
|
{
|
|||
|
|
printf("%02X ", leakO2.buff[i]);
|
|||
|
|
}
|
|||
|
|
printf("\n");
|
|||
|
|
|
|||
|
|
#if 1
|
|||
|
|
// Ũ<><C5A8>: <20>ֱ<EFBFBD><D6B1><EFBFBD>0.1%
|
|||
|
|
concentrations = ntohs(leakO2.recv.concentrations);
|
|||
|
|
#else
|
|||
|
|
// <20><><EFBFBD>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
concentrations = 240;
|
|||
|
|
#endif
|
|||
|
|
// Ũ<>Ƚ<EFBFBD><C8BD><EFBFBD>21.5%<25><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>й¶<D0B9><C2B6><EFBFBD><EFBFBD>
|
|||
|
|
if(concentrations <= 215)
|
|||
|
|
Leak_Alarm_Enabled = 1;
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>Ũ<EFBFBD>ȴﵽ23%
|
|||
|
|
if(concentrations >= 230)
|
|||
|
|
{
|
|||
|
|
modbus_sample->leak.staLeak = LEAK_STATUS_A2_ALARM;
|
|||
|
|
modbus_sample->leak.concentrations = 1;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
modbus_sample->leak.staLeak = LEAK_STATUS_OK;
|
|||
|
|
modbus_sample->leak.concentrations = 0;
|
|||
|
|
}
|
|||
|
|
// <20>˳<EFBFBD><CBB3><EFBFBD>ʱ<EFBFBD>ȴ<EFBFBD>
|
|||
|
|
modbus_outTick = GetDelayTick(0);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <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(USART_Handle *huart)
|
|||
|
|
{
|
|||
|
|
uint8_t *RS_ModuleData = (uint8_t *) &RS_TranFrame;
|
|||
|
|
uint16_t i;
|
|||
|
|
uint8_t frameOk, frameErr;
|
|||
|
|
uint8_t c = (uint8_t) huart->Instance->RDR;
|
|||
|
|
|
|||
|
|
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(RS_TranFrame.srcAddr == 0x51)
|
|||
|
|
{
|
|||
|
|
// й©<D0B9><C2A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
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;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else if(RS_TranFrame.srcAddr == 0x31)
|
|||
|
|
{
|
|||
|
|
// <20><>ѹ/<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3>ڲɼ<DAB2>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
if((mask & 0xE0000000) == 0xE0000000) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
if(dcBuff.configDisplay.op_USE_CAPACITY_SENSOR)
|
|||
|
|
{
|
|||
|
|
// <20><><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD><EFBFBD><EFBFBD>ֻҪ<D6BB><D2AA><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD>ܹ<EFBFBD>һ<EFBFBD><D2BB>״̬
|
|||
|
|
modbus_sample->staDPress.status = SENSOR_STATUS_NORMAL;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
modbus_sample->staDPress.status = rsData->measureState;
|
|||
|
|
modbus_sample->adDPress = ntohs(rsData->adc);
|
|||
|
|
modbus_sample->diff = ntohf(rsData->measureValue);
|
|||
|
|
if(dcBuff.configDisplay.op_USE_CAPACITY_SENSOR)
|
|||
|
|
{
|
|||
|
|
// <20><><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD>1λС<CEBB><D0A1>
|
|||
|
|
modbus_sample->diff = ((int16_t) (modbus_sample->diff * 10)) * 0.1;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else if(RS_TranFrame.srcAddr == 0x41)
|
|||
|
|
{
|
|||
|
|
// ѹ<><D1B9><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3>ڲɼ<DAB2>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
if((mask & 0xE0000000) == 0xE0000000) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
modbus_sample->staPress.status = rsData->measureState;
|
|||
|
|
modbus_sample->adPress = ntohs(rsData->adc);
|
|||
|
|
modbus_sample->pressure = ntohf(rsData->measureValue);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
// <20>˳<EFBFBD><CBB3><EFBFBD>ʱ<EFBFBD>ȴ<EFBFBD>
|
|||
|
|
modbus_outTick = GetDelayTick(0);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <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 Sensor_Init()
|
|||
|
|
{
|
|||
|
|
LL_GPIO_InitTypeDef GPIO_InitStruct = {0};
|
|||
|
|
|
|||
|
|
LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOA);
|
|||
|
|
/**LPUART1 GPIO Configuration
|
|||
|
|
PA2 ------> LPUART1_TX
|
|||
|
|
PA3 ------> LPUART1_RX
|
|||
|
|
PB1 ------> LPUART1_DE
|
|||
|
|
*/
|
|||
|
|
GPIO_InitStruct.Pin = LL_GPIO_PIN_2|LL_GPIO_PIN_3;
|
|||
|
|
GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
|
|||
|
|
GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_MEDIUM;
|
|||
|
|
GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
|
|||
|
|
GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
|
|||
|
|
GPIO_InitStruct.Alternate = LL_GPIO_AF_8;
|
|||
|
|
LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
|
|||
|
|
|
|||
|
|
LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOB);
|
|||
|
|
|
|||
|
|
GPIO_InitStruct.Pin = LL_GPIO_PIN_1;
|
|||
|
|
GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
|
|||
|
|
GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_MEDIUM;
|
|||
|
|
GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
|
|||
|
|
GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
|
|||
|
|
GPIO_InitStruct.Alternate = LL_GPIO_AF_8;
|
|||
|
|
LL_GPIO_Init(GPIOB, &GPIO_InitStruct);
|
|||
|
|
|
|||
|
|
//RS485_DIS();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void Sensor_Open(uint32_t baudrate)
|
|||
|
|
{
|
|||
|
|
LL_LPUART_InitTypeDef LPUART_InitStruct = {0};
|
|||
|
|
|
|||
|
|
/* Peripheral clock enable */
|
|||
|
|
LL_APB1_GRP2_EnableClock(LL_APB1_GRP2_PERIPH_LPUART1);
|
|||
|
|
|
|||
|
|
NVIC_SetPriority(LPUART1_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),5, 0));
|
|||
|
|
NVIC_EnableIRQ(LPUART1_IRQn);
|
|||
|
|
|
|||
|
|
LPUART_InitStruct.BaudRate = baudrate;
|
|||
|
|
LPUART_InitStruct.DataWidth = LL_LPUART_DATAWIDTH_8B;
|
|||
|
|
LPUART_InitStruct.StopBits = LL_LPUART_STOPBITS_1;
|
|||
|
|
LPUART_InitStruct.Parity = LL_LPUART_PARITY_NONE;
|
|||
|
|
LPUART_InitStruct.TransferDirection = LL_LPUART_DIRECTION_TX_RX;
|
|||
|
|
LPUART_InitStruct.HardwareFlowControl = LL_LPUART_HWCONTROL_NONE;
|
|||
|
|
LL_LPUART_Init(LPUART1, &LPUART_InitStruct);
|
|||
|
|
LL_LPUART_EnableDEMode(LPUART1);
|
|||
|
|
LL_LPUART_SetDESignalPolarity(LPUART1, LL_LPUART_DE_POLARITY_HIGH);
|
|||
|
|
LL_LPUART_SetDEAssertionTime(LPUART1, 0);
|
|||
|
|
LL_LPUART_SetDEDeassertionTime(LPUART1, 0);
|
|||
|
|
|
|||
|
|
SET_BIT(LPUART1->CR1, USART_CR1_PEIE | USART_CR1_RXNEIE);
|
|||
|
|
LL_LPUART_Enable(LPUART1);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20>л<EFBFBD><D0BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Modubsͨ<73><CDA8>ģʽ
|
|||
|
|
void Modbus_Open()
|
|||
|
|
{
|
|||
|
|
LL_LPUART_Disable(hlpuart1.Instance);
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>жϻص<CFBB><D8B5><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
hlpuart1.RxISR = Modbus_Read;
|
|||
|
|
// <20>IJ<DEB8><C4B2><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
Sensor_Open(9600);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20>л<EFBFBD><D0BB><EFBFBD>O2Ũ<32>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8>ģʽ
|
|||
|
|
void LeakO2_Open()
|
|||
|
|
{
|
|||
|
|
LL_LPUART_Disable(hlpuart1.Instance);
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>жϻص<CFBB><D8B5><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
hlpuart1.RxISR = LeakO2_Read;
|
|||
|
|
// <20>IJ<DEB8><C4B2><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
Sensor_Open(9600);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20>л<EFBFBD><D0BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>DYQ-7ͨ<37><CDA8>ģʽ
|
|||
|
|
void Modbus_Close()
|
|||
|
|
{
|
|||
|
|
LL_LPUART_Disable(hlpuart1.Instance);
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>жϻص<CFBB><D8B5><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
hlpuart1.RxISR = RS_ParseFrame;
|
|||
|
|
// <20>IJ<DEB8><C4B2><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
Sensor_Open(19200);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
static void RS485_SendDataByte(uint8_t *pu8TxBuf, uint32_t u32WriteBytes)
|
|||
|
|
{
|
|||
|
|
// RS485_EN();
|
|||
|
|
// delay_us(1);
|
|||
|
|
// <20><><EFBFBD>ó<EFBFBD>ʱ<EFBFBD>ͽ<EFBFBD><CDBD><EFBFBD>
|
|||
|
|
modbus_outTick = GetDelayTick(500);
|
|||
|
|
UART_Transmit_IT(&hlpuart1, pu8TxBuf, u32WriteBytes);
|
|||
|
|
// delay_ms(9); // <20><><EFBFBD><EFBFBD>8ms<6D><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>9ms
|
|||
|
|
// RS485_DIS();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <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)
|
|||
|
|
{
|
|||
|
|
Modbus_Open();
|
|||
|
|
|
|||
|
|
// Ĭ<>϶<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;
|
|||
|
|
|
|||
|
|
// <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)
|
|||
|
|
{
|
|||
|
|
Modbus_Open();
|
|||
|
|
|
|||
|
|
// Ĭ<>϶<EFBFBD>ȡʧ<C8A1><CAA7>
|
|||
|
|
memset(&sample->flow, 0, sizeof(sample->flow));
|
|||
|
|
|
|||
|
|
// <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><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
void Sensor_ReadLeakO2(data_sample_t *sample)
|
|||
|
|
{
|
|||
|
|
uint8_t reSample = 0;
|
|||
|
|
|
|||
|
|
LeakO2_Open();
|
|||
|
|
|
|||
|
|
// Ĭ<>϶<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;
|
|||
|
|
|
|||
|
|
// <20><>ʼ<EFBFBD><CABC>
|
|||
|
|
modbus_sample = sample;
|
|||
|
|
modbus_idx = 0;
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD>
|
|||
|
|
leak_o2_init_frame(&leakO2);
|
|||
|
|
leakO2.send.addr = LEAK_O2_ID;
|
|||
|
|
leakO2.send.cmd = LEAK_O2_CMD;
|
|||
|
|
leakO2.cs = leak_o2_calcuCS(leakO2.buff + 1, sizeof(leak_o2_comm_t) - 2);
|
|||
|
|
RS485_SendDataByte(leakO2.buff, sizeof(leak_o2_comm_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;
|
|||
|
|
|
|||
|
|
Modbus_Close();
|
|||
|
|
|
|||
|
|
// Ĭ<>϶<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;
|
|||
|
|
|
|||
|
|
// <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>
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><>ȡ<EFBFBD><C8A1>ѹ/<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
void Sensor_ReadDPress(data_sample_t *sample)
|
|||
|
|
{
|
|||
|
|
uint8_t reSample = 0;
|
|||
|
|
|
|||
|
|
Modbus_Close();
|
|||
|
|
|
|||
|
|
// Ĭ<>϶<EFBFBD>ȡʧ<C8A1><CAA7>
|
|||
|
|
sample->staDPress.status = SENSOR_STATUS_NOCONNECT;
|
|||
|
|
sample->adDPress = 0;
|
|||
|
|
sample->diff = 0;
|
|||
|
|
|
|||
|
|
// <20><>ʼ<EFBFBD><CABC>
|
|||
|
|
modbus_sample = sample;
|
|||
|
|
modbus_idx = 0;
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD>
|
|||
|
|
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, 0x31, RS_DIR_M2S);
|
|||
|
|
|
|||
|
|
// <20>ȴ<EFBFBD><C8B4>жϴ<D0B6><CFB4><EFBFBD>
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><>ȡѹ<C8A1><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
void Sensor_ReadPress(data_sample_t *sample)
|
|||
|
|
{
|
|||
|
|
uint8_t reSample = 0;
|
|||
|
|
|
|||
|
|
Modbus_Close();
|
|||
|
|
|
|||
|
|
// Ĭ<>϶<EFBFBD>ȡʧ<C8A1><CAA7>
|
|||
|
|
sample->staPress.status = SENSOR_STATUS_NOCONNECT;
|
|||
|
|
sample->adPress = 0;
|
|||
|
|
sample->pressure = 0;
|
|||
|
|
|
|||
|
|
// <20><>ʼ<EFBFBD><CABC>
|
|||
|
|
modbus_sample = sample;
|
|||
|
|
modbus_idx = 0;
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD>
|
|||
|
|
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, 0x41, RS_DIR_M2S);
|
|||
|
|
|
|||
|
|
// <20>ȴ<EFBFBD><C8B4>жϴ<D0B6><CFB4><EFBFBD>
|
|||
|
|
}
|