FIX | 校准修改

master
yuliang 4 months ago
parent cd6991dc2a
commit 2d074ebdac

@ -45,22 +45,19 @@
/* Define --------------------------------------------------------------------*/
/* Exported types ------------------------------------------------------------*/
/* 实时数据传输结构体. */
/* 定时数据传输结构体 */
typedef struct
{
int16_t temperature; // 设备温度, 单位: 0.1℃.
uint16_t vbat; // 电池电压, 单位: mv.
int16_t CSQ; // 4G 信号质量 > -51dBm 统一显示 -51dBm, < -113 dBm 为无信号.
uint16_t vin; // 工作电压, 单位: mv.
uint32_t elec[DAU_PORT_POWER_CNT]; // 通道电流有效值 mA.
uint16_t vsc; // 超级电容电压, 单位: mv.
int16_t sen_temp[SENSOR_SUM]; // 传感器温度: 单位: 0.1℃.
uint16_t sen_x[SENSOR_SUM]; // 传感器震动 x 轴.
uint16_t sen_y[SENSOR_SUM]; // 传感器震动 y 轴.
uint16_t sen_z[SENSOR_SUM]; // 传感器震动 z 轴.
uint8_t energy_mode;
uint8_t sen_short; // 传感器是否短路, 0 没有短路, 1 短路.
uint8_t sen_valid[SENSOR_SUM]; // 传感器数据是否有效, 0 - 无效, 1 - 有效.
uint16_t vbat; // 电池电压,单位:mv
uint16_t vin; // 工作电压,单位:mv
int16_t temperature; // 设备温度,单位:0.1℃
uint8_t reserve[2];
uint32_t elec[8]; // 工频电流有效值mA
int16_t elec_defect_max[4]; // 缺陷电流最大值mA
uint32_t elec_fault[8]; // 故障工频电流有效值mA
int16_t elec_fault_max[4]; // 故障电流最大值mA
uint32_t fault_utc; // 故障触发时间
uint32_t fault_ns; // 故障触发时间 ns
} debug_real_data_t;
/* 校准命令信息. */

@ -200,20 +200,22 @@ enum DEBUG_CM_CMD
DEBUG_PRV_REALDATA_FUALT = 4,
DEBUG_PRV_POWER_FAULT = 5,
DEBUG_PRV_FAULT = 6,
DEBUG_PRV_ADJ_INFO = 7,
DEBUG_PRV_ADJ_INFO_SET = 8,
DEBUG_PRV_ADJ_AUTO = 9,
DEBUG_PRV_DEV_STATE = 10,
DEBUG_PRV_ADJ_GET = 7,
DEBUG_PRV_ADJ_SET_POWER = 8,
DEBUG_PRV_ADJ_SET_DEFECT = 9,
DEBUG_PRV_ADJ_SET_FAULT = 10,
DEBUG_PRV_WAVE_COL = 11,
DEBUG_PRV_WAVE_CAL = 12,
DEBUG_PRV_WAVE_FORCE = 13,
DEBUG_PRV_ADJ_DECFECT_ZERO = 12,
DEBUG_PRV_ADJ_DECFECT = 13,
DEBUG_PRV_LOG = 14,
DEBUG_PRV_HISTORY_DATA = 15,
DEBUG_PRV_ADJ_MANUAL = 16,
DEBUG_PRV_CSG_CONFIG = 17,
DEBUG_PRV_CSG_CONFIG_SET = 18,
DEBUG_PRV_ADJ_FAULT_ZERO = 17,
DEBUG_PRV_ADJ_FAULT = 18,
DEBUG_PRV_UPDATE_FPGA = 19,
DEBUG_PRV_UPDATE_RT = 20
DEBUG_PRV_UPDATE_RT = 20,
DEBUG_PRV_ADJ_AUTO = 21,
DEBUG_PRV_DEV_STATE = 22,
};
/* . */

@ -61,6 +61,79 @@
#define DAU_PKT_POWER_BYTE_CNT 1024 // DAU 工频波形每包数据大小
#define DAU_POWER_DATE_LEN 2048 // DAU 工频数据长度, 每个数据大小 2byte
/* 全局状态寄存器地址 -------------------------------- */
#define DAU_REG_ADDR_GSCR 0x0000 // 全局状态寄存器 - 软件特征寄存器
#define DAU_REG_ADDR_GSVR 0x0001 // 全局状态寄存器 - 软件版本寄存器
#define DAU_REG_ADDR_GSR 0x0002 // 全局状态寄存器 - 状态寄存器
#define DAU_REG_ADDR_GFTR 0x0003 // 全局状态寄存器 - 故障触发录波状态寄存器
#define DAU_REG_ADDR_GFTUR 0x0004 // 全局状态寄存器 - 故障触发 UTC 时间点寄存器
#define DAU_REG_ADDR_GFTNR 0x0006 // 全局状态寄存器 - 故障触发 ns 时间点寄存器
#define DAU_REG_ADDR_GRTR 0x0008 // 全局状态寄存器 - 寄存器触发录波状态寄存器
#define DAU_REG_ADDR_GUR 0x000a // 全局状态寄存器 - UTC 寄存器
#define DAU_REG_ADDR_GNR 0x000c // 全局状态寄存器 - ns 寄存器
/* 全局状态寄存器 - 状态寄存器 bit mask */
#define DAU_GSR_FLASH_Pos (2) // spi flash 空闲状态
#define DAU_GSR_FLASH_Msk (0x1 << DAU_GSR_FLASH_Pos) /*!< 0x0004 */
/* 全局状态寄存器 - 故障触发录波状态寄存器 bit mask */
#define DAU_GFTR_POWER_WAVE_Pos (3) // 故障触发工频电流波形状态
#define DAU_GFTR_POWER_WAVE_Msk (0x1 << DAU_GFTR_POWER_WAVE_Pos) /*!< 0x0008 */
#define DAU_GFTR_DEFECT_WAVE_Pos (2) // 故障触发缺陷电流波形状态
#define DAU_GFTR_DEFECT_WAVE_Msk (0x1 << DAU_GFTR_DEFECT_WAVE_Pos) /*!< 0x0004 */
#define DAU_GFTR_FAULT_WAVE_Pos (1) // 故障电流波形状态
#define DAU_GFTR_FAULT_WAVE_Msk (0x1 << DAU_GFTR_FAULT_WAVE_Pos) /*!< 0x0002 */
#define DAU_GFTR_FAULT_Pos (0) // 故障触发录波完成状态
#define DAU_GFTR_FAULT_Msk (0x1 << DAU_GFTR_FAULT_Pos) /*!< 0x0001 */
/* 全局状态寄存器 - 寄存器触发录波状态寄存器 bit mask */
#define DAU_GRTR_POWER_WAVE_Pos (3) // 寄存器触发工频电流波形状态
#define DAU_GRTR_POWER_WAVE_Msk (0x1 << DAU_GRTR_POWER_WAVE_Pos) /*!< 0x0008 */
#define DAU_GRTR_DEFECT_WAVE_Pos (2) // 寄存器触发缺陷电流波形状态
#define DAU_GRTR_DEFECT_WAVE_Msk (0x1 << DAU_GRTR_DEFECT_WAVE_Pos) /*!< 0x0004 */
#define DAU_GRTR_COMPLETE_Pos (0) // 寄存器触发录波完成状态
#define DAU_GRTR_COMPLETE_Msk (0x1 << DAU_GRTR_COMPLETE_Pos) /*!< 0x0001 */
/* 全局控制寄存器地址 -------------------------------- */
#define DAU_REG_ADDR_GFWSR 0x0200 // 全局控制寄存器 - Flash 写选择寄存器
#define DAU_REG_ADDR_GSUPR 0x0202 // 全局控制寄存器 - 固件升级页寄存器
#define DAU_REG_ADDR_GCFTR 0x0203 // 全局控制寄存器 - 故障触发录波控制寄存器
#define DAU_REG_ADDR_GCRTR 0x0204 // 全局控制寄存器 - 寄存器触发录波控制寄存器
#define DAU_REG_ADDR_GCUR 0x0205 // 全局控制寄存器 - UTC 配置寄存器
#define DAU_REG_ADDR_GCFTTR 0x0207 // 全局控制寄存器 - 故障电流触发阈值寄存器
#define DAU_REG_ADDR_GSUDR 0x0e00 // 全局控制寄存器 - 固件升级数据寄存器
/* 全局控制寄存器 - 故障触发录波控制寄存器 bit mask */
#define DAU_GCFTR_PORT_Pos (4) // 故障触发波形端口
#define DAU_GCFTR_PORT_Msk (0x7 << DAU_GCFTR_PORT_Pos) /*!< 0x0070 */
#define DAU_GCFTR_POWER_WAVE_Pos (3) // 故障触发波形端口
#define DAU_GCFTR_POWER_WAVE_Msk (0x1 << DAU_GCFTR_POWER_WAVE_Pos) /*!< 0x0008 */
#define DAU_GCFTR_DEFECT_WAVE_Pos (2) // 故障触发缺陷电流波形读取
#define DAU_GCFTR_DEFECT_WAVE_Msk (0x1 << DAU_GCFTR_DEFECT_WAVE_Pos) /*!< 0x0004 */
#define DAU_GCFTR_FAULT_WAVE_Pos (1) // 故障电流波形读取
#define DAU_GCFTR_FAULT_WAVE_Msk (0x1 << DAU_GCFTR_FAULT_WAVE_Pos) /*!< 0x0002 */
/* 全局控制寄存器 - 寄存器触发录波控制寄存器 bit mask */
#define DAU_GCRTR_PORT_Pos (4) // 寄存器触发波形端口
#define DAU_GCRTR_PORT_Msk (0x7 << DAU_GCRTR_PORT_Pos) /*!< 0x0070 */
#define DAU_GCRTR_POWER_WAVE_Pos (3) // 寄存器触发工频电流波形读取
#define DAU_GCRTR_POWER_WAVE_Msk (0x1 << DAU_GCRTR_POWER_WAVE_Pos) /*!< 0x0008 */
#define DAU_GCRTR_DEFECT_WAVE_Pos (2) // 寄存器触发缺陷电流波形读取
#define DAU_GCRTR_DEFECT_WAVE_Msk (0x1 << DAU_GCRTR_DEFECT_WAVE_Pos) /*!< 0x0004 */
#define DAU_GCRTR_START_WAVE_Pos (0) // 录波控制
#define DAU_GCRTR_START_WAVE_Msk (0x1 << DAU_GCRTR_START_WAVE_Pos) /*!< 0x0001 */
/* 通道状态寄存器地址 -------------------------------- */
#define DAU_REG_ADDR_PMSR 0x0300 // 通道状态寄存器 - 缺陷电流通道周波原始采样值的平均值寄存器
#define DAU_REG_ADDR_PPWR 0x03b0 // 通道状态寄存器 - 通道录波数据寄存器
#define DAU_REG_ADDR_PORT_BASE 0x1000 // 通道配置寄存器基地址
#define DAU_REG_ADDR_PORT_DEFECT_BASE 0x0 // 通道配置寄存器 - 缺陷电流通道零点原始值寄存器
#define DAU_REG_ADDR_PORT_FAULT_BASE 0x1 // 通道配置寄存器 - 故障电流通道零点原始值寄存器
#define DAU_REG_ADDR_PORT_DEFECT_ADJ 0xC // 通道配置寄存器 - 缺陷电流通道校准系数寄存器
#define DAU_REG_ADDR_PORT_FAULT_ADJ 0x22 // 通道配置寄存器 - 故障电流通道校准系数寄存器
/* Exported types ------------------------------------------------------------*/
/* 采集标志位 */
typedef enum
@ -72,7 +145,6 @@ typedef enum
DAU_COL_FLAG_WAVE_FORCE, // 强制录波
} DAU_COL_FLAG_E;
/* 共有命令字. */
typedef enum
{
DAU_UPD_NONE = 0,
@ -80,12 +152,22 @@ typedef enum
DAU_UPD_ERROR = 2,
} DAU_UPD_ERR_E;
/* 采集标志位 */
typedef enum
{
DAU_REG_PORT_WRITE = 0, // 写端口寄存器
} DAU_REG_FLAG_E;
typedef enum
{
DAU_ADJ_STATE_NONE = 0,
DAU_ADJ_STATE_POWER = 1, // 自动工频校准
DAU_ADJ_STATE_DEFECT_ZERO = 3, // 隐患归零
DAU_ADJ_STATE_DEFECT = 4, // 隐患校准
DAU_ADJ_STATE_FAULT_ZERO = 5, // 故障归零
DAU_ADJ_STATE_FAULT = 6 // 故障校准
} DAU_ADJ_STATE_E;
/* DAU 全局寄存器. */
typedef struct
{
@ -104,10 +186,10 @@ typedef struct
/* DAU 通道状态寄存器. */
typedef struct
{
int16_t DMAX[4]; // 缺陷电流通道周波最大值寄存器 (Defect Max Value Register).
uint16_t DAVR[4]; // 缺陷电流通道周波平均值寄存器 (Defect Average Value Register).
uint16_t FAVR[4]; // 故障电流通道周波平均值寄存器 (Fault Average Value Register).
int16_t FMAX[4]; // 故障电流通道原始采样值最大值寄存器 (Fault Max Value Register).
int16_t DMAX[DAU_PORT_DEFECT_MAX]; // 缺陷电流通道周波最大值寄存器 (Defect Max Value Register).
uint16_t DAVR[DAU_PORT_DEFECT_MAX]; // 缺陷电流通道周波平均值寄存器 (Defect Average Value Register).
uint16_t FAVR[DAU_PORT_FAULT_MAX]; // 故障电流通道周波平均值寄存器 (Fault Average Value Register).
uint16_t FMAX[DAU_PORT_FAULT_MAX]; // 故障电流通道原始采样值最大值寄存器 (Fault Max Value Register).
} dau_port_state_reg_t;
/* DAU 通道状态寄存器. */
@ -139,11 +221,11 @@ typedef struct
uint32_t update_len; // DAU 升级文件大小
uint32_t fault_utc; // 故障触发时间
uint32_t fault_ns; // 故障触发时间纳秒
int16_t fault_power[DAU_PORT_POWER_CNT][DAU_POWER_DATE_LEN]; // 故障触发工频波形采样电流值, 接地电流 0.1A, 运行电流 0.25A
uint32_t fault_elec[DAU_PORT_POWER_CNT];// 故障触发工频电流有效值 mA
int16_t fault_trig[DAU_PORT_FAULT_MAX]; // 故障触发电流值 A
int16_t reg_power[DAU_PORT_POWER_CNT][DAU_POWER_DATE_LEN]; // 寄存器触发工频波形采样电流值, 接地电流 0.1A, 运行电流 0.25A
uint32_t reg_elec[DAU_PORT_POWER_CNT]; // 寄存器触发工频电流有效值 mA
int16_t fault_power[DAU_PORT_POWER_CNT][DAU_POWER_DATE_LEN]; // 故障触发工频波形采样电流值, 接地电流 0.1A, 运行电流 A
uint32_t fault_elec[DAU_PORT_POWER_CNT];// 故障触发工频电流有效值 0.1A
uint16_t fault_max[DAU_PORT_FAULT_MAX]; // 故障触发电流最大0.2A
int16_t reg_power[DAU_PORT_POWER_CNT][DAU_POWER_DATE_LEN]; // 寄存器触发工频波形采样电流值, 接地电流 0.1A, 运行电流 A
uint32_t reg_elec[DAU_PORT_POWER_CNT]; // 寄存器触发工频电流有效值 0.1A
uint16_t reg_defect_max[DAU_PORT_DEFECT_MAX]; // 寄存器触发缺陷电流最大值 mA
dau_reg_global_t reg_global; // DAU 全局寄存器
dau_port_state_reg_t reg_port_state; // DAU 端口状态寄存器
@ -166,13 +248,13 @@ typedef struct
/* Extern global variables ---------------------------------------------------*/
extern dau_ctrl_t dau_ctrl;
extern uint8_t dau_adj_state;
/* Extern functions ----------------------------------------------------------*/
extern void dau_init(void);
extern void dau_adj_init(void);
extern void dau_spi_rw(int8_t rw, uint16_t addr, uint16_t len);
extern void dau_show(void);
extern HAL_StatusTypeDef _dau_base_auto(uint8_t ch_bitmap, uint8_t index);
#endif
/******************* (C) COPYRIGHT LandPower ***** END OF FILE ****************/

@ -118,14 +118,60 @@ typedef struct
/* 校准参数信息. */
typedef struct
{
uint16_t ADCRatio[DAU_PORT_POWER_CNT];
uint32_t ADCBase_elec[DAU_PORT_POWER_CNT][DAU_POWER_ADJ_CNT];
uint16_t ADCAdj[DAU_PORT_POWER_CNT][DAU_POWER_ADJ_CNT];
float ADCBase[DAU_PORT_POWER_CNT][DAU_POWER_ADJ_CNT];
uint16_t vin;
uint16_t power_adj[DAU_PORT_POWER_CNT];
uint16_t power_adj_point[DAU_PORT_POWER_CNT];
uint16_t defect_base[DAU_PORT_DEFECT_MAX];
uint16_t defect_adj[DAU_PORT_DEFECT_MAX];
uint16_t fault_base[DAU_PORT_FAULT_MAX];
uint16_t fault_adj[DAU_PORT_FAULT_MAX];
uint16_t vin_adj;
uint8_t ADC_turns[DAU_PORT_POWER_CNT];
} dev_adj_t;
uint8_t reserve[2];
} dev_adj_cfg_t;
/* 校准参数信息. */
typedef struct
{
uint16_t power_adj[DAU_PORT_POWER_CNT];
uint16_t power_adj_point[DAU_PORT_POWER_CNT];
uint16_t vin_adj;
int16_t return_value;
} dev_adj_power_cfg_t;
/* 校准参数信息. */
typedef struct
{
uint8_t bitmap;
uint8_t is_voltage_adj;
uint16_t elec;
} dev_adj_power_t;
/* 校准参数信息. */
typedef struct
{
uint16_t defect_base[DAU_PORT_DEFECT_MAX];
uint16_t defect_adj[DAU_PORT_DEFECT_MAX];
} dev_adj_defect_cfg_t;
/* 校准参数信息. */
typedef struct
{
uint16_t fault_base[DAU_PORT_FAULT_MAX];
uint16_t fault_adj[DAU_PORT_FAULT_MAX];
} dev_adj_fault_cfg_t;
/* 校准参数信息. */
typedef struct
{
uint16_t bitmap;
uint16_t defect_elec;
} dev_adj_defect_zero_t;
/* 校准参数信息. */
typedef struct
{
uint16_t bitmap;
uint16_t fault_elec;
} dev_adj_fault_zero_t;
/* 设备状态信息. */
typedef struct
@ -172,34 +218,30 @@ typedef struct
char password[DEV_PASSWORD_LEN];
/* 器件名字. 128byte */
char host[DEV_NAME_LEN];
/* ADC 校准. 424byte */
uint16_t ADC_ratio[DAU_PORT_POWER_CNT];
uint32_t ADC_base_elec[DAU_PORT_POWER_CNT][DAU_POWER_ADJ_CNT];
uint16_t ADC_adj[DAU_PORT_POWER_CNT][DAU_POWER_ADJ_CNT];
float ADC_base[DAU_PORT_POWER_CNT][DAU_POWER_ADJ_CNT];
uint8_t ADC_turns[DAU_PORT_POWER_CNT];
/* ADCi 电压校准配置. 4byte */
uint16_t vin;
uint16_t vin_adj;
/* 各种 bool 类型配置, 见 DEV_FLAG_E. 8byte */
uint32_t flag;
uint16_t keepalive; // 保活间隔单位: min
uint8_t reserve0[2];
/* 采样间隔配置. 8byte */
/* ADC 校准. 66byte */
uint16_t power_adj[DAU_PORT_POWER_CNT];
uint16_t power_adj_point[DAU_PORT_POWER_CNT];
uint16_t defect_base[DAU_PORT_DEFECT_MAX];
uint16_t defect_adj[DAU_PORT_DEFECT_MAX];
uint16_t fault_base[DAU_PORT_FAULT_MAX];
uint16_t fault_adj[DAU_PORT_FAULT_MAX];
uint16_t vin_adj;
uint16_t collect_interval; // 单位: min
uint16_t keepalive;
uint16_t power_threshold;
uint16_t fault_threshold;
uint16_t defect_threshold;
/* APN 配置. 128byte */
char APN[DEV_APN_LEN];
/* 缺陷故障校准配置 */
uint16_t defect_base[DAU_PORT_DEFECT_MAX];
uint16_t defect_adj[DAU_PORT_DEFECT_MAX];
uint16_t fault_base[DAU_PORT_FAULT_MAX];
uint16_t fault_adj[DAU_PORT_FAULT_MAX];
uint16_t ADC_adj_point[DAU_PORT_POWER_CNT];
uint32_t ADC_base_elec[DAU_PORT_POWER_CNT][DAU_POWER_ADJ_CNT];
uint16_t ADC_adj[DAU_PORT_POWER_CNT][DAU_POWER_ADJ_CNT];
float ADC_base[DAU_PORT_POWER_CNT][DAU_POWER_ADJ_CNT];
uint8_t ADC_turns[DAU_PORT_POWER_CNT];
/* 保证配置区 8K 的保留位. */
uint8_t reserve[252];
uint8_t reserve[256];
/* INIT_DONE_MAGIC. 4byte */
uint32_t magic_bak;
} dev_config_t;

@ -46,7 +46,7 @@
/* Private define ------------------------------------------------------------*/
#define ADC_COMP_TIMEOUT 1000 // ADCi 采样超时时间
#define ADC_RESOLUTION 4096 // ADCi 采样分辨率
#define ADC_RESOLUTION 36000 // ADCi 采样分辨率
#define ADC_ST_END 0x02 // ADCi 采样结束
#define ADC_ST_ERROR 0x04 // ADCi 采样错误

@ -36,6 +36,7 @@
/* Includes ------------------------------------------------------------------*/
#include "stdio.h"
#include "string.h"
#include "math.h"
#include "usart.h"
@ -85,19 +86,15 @@ typedef struct
/* RS485 调试通讯协议配置信息. */
typedef struct
{
uint16_t flag;
uint8_t energy_mode;
uint8_t is_voltage_col;
uint8_t sensor_id[SENSOR_SUM];
uint16_t collect_interval;
uint16_t wave_interval;
uint16_t collect_threshold;
uint16_t wave_threshold;
uint8_t main_cable;
uint8_t normal_sleep;
uint8_t is_temp_col;
uint8_t is_wave_col;
uint8_t APN[DEV_APN_LEN];
uint8_t debug_mode; // 调试模式.
uint8_t work_mode; // 工作模式.
uint16_t col_inr; // 采集间隔, 单位: 分钟.
uint16_t live_inr; // 保活间隔, 单位: 分钟.
uint16_t power_thr; // 工频阈值, 单位: A.
uint16_t defect_thr; // 隐患阈值, 单位: mA.
uint16_t fault_thr; // 故障阈值, 单位: A.
uint8_t APN[DEV_APN_LEN]; // APN 名字.
uint8_t reserve[20];
} debug_config_t;
/* Private macro -------------------------------------------------------------*/
@ -112,7 +109,9 @@ static UART_HandleTypeDef *debug_adj_uart = &huart4;
static uint8_t debug_state = 0;
/* 远程升级 flash 数据校验使用. */
static uint8_t debug_flash[DEBUG_FLASH_BUF_SIZE];
extern int8_t g_is_adj_status;
static dev_adj_defect_zero_t debug_adj_defect;
dev_adj_fault_zero_t debug_adj_fault;
dev_adj_power_t debug_adj_power;
/* Private function prototypes -----------------------------------------------*/
/* Internal functions --------------------------------------------------------*/
@ -537,19 +536,38 @@ static void _debug_pkt_config_get(void)
proto_head_t *head = (proto_head_t*)debug_buf.buf;
debug_config_t *data = (debug_config_t*)(debug_buf.buf + sizeof(proto_head_t));
uint32_t *crc = NULL;
uint8_t i = 0;
/* 封装报文头. */
_debug_pkt_head_init(sizeof(proto_head_t) + sizeof(debug_config_t), DEBUG_CT_REPLY);
/* 封装数据. */
data->flag = dev_config.flag;
for(i = 0; i < SENSOR_SUM; i++)
if (IS_MONITOR_BIT_SET(dev_config.flag, DEV_FLAG_CLI))
{
data->debug_mode = 0;
}
else
{
data->debug_mode = 1;
}
if (IS_MONITOR_BIT_SET(dev_config.flag, DEV_FLAG_ADJ))
{
data->work_mode = 1;
}
else if(IS_MONITOR_BIT_SET(dev_config.flag, DEV_FLAG_FACTORY))
{
data->sensor_id[i] = 0;
data->work_mode = 2;
}
data->collect_interval = dev_config.collect_interval;
data->wave_interval = 12;
else
{
data->work_mode = 0;
}
data->col_inr = dev_config.collect_interval;
data->live_inr = dev_config.keepalive;
data->power_thr = dev_config.power_threshold;
data->defect_thr = dev_config.defect_threshold;
data->fault_thr = dev_config.fault_threshold;
memcpy(data->APN, dev_config.APN, DEV_APN_LEN);
/* 计算校验和. */
@ -567,18 +585,37 @@ static void _debug_pkt_config_set(void)
{
proto_head_t *head = (proto_head_t*)debug_buf.buf;
debug_config_t *data = (debug_config_t*)(debug_buf.buf + sizeof(proto_head_t));
uint16_t flag = 0;
uint8_t is_reboot = FALSE;
uint32_t reset_delay = 2;
uint32_t *crc = NULL;
/* 保存数据. */
if (dev_config.flag != data->flag)
if (0 == data->debug_mode)
{
MONITOR_BITMAP_SET(flag, DEV_FLAG_CLI);
}
if (1 == data->work_mode)
{
MONITOR_BITMAP_SET(flag, DEV_FLAG_ADJ);
}
else if(2 == data->work_mode)
{
MONITOR_BITMAP_SET(flag, DEV_FLAG_FACTORY);
}
if (dev_config.flag != flag)
{
is_reboot = TRUE;
dev_config_flag_assgin(data->flag);
dev_config_flag_assgin(flag);
}
dev_config.collect_interval = data->collect_interval;
dev_config.collect_interval = data->col_inr;
dev_config.keepalive = data->live_inr;
dev_config.power_threshold = data->power_thr;
dev_config.defect_threshold = data->defect_thr;
dev_config.fault_threshold = data->fault_thr;
memcpy(dev_config.APN, data->APN, DEV_APN_LEN);
/* 封装报文头. */
@ -608,20 +645,15 @@ static void _debug_pkt_config_set(void)
static void _debug_pkt_adj_get(void)
{
proto_head_t *head = (proto_head_t*)debug_buf.buf;
dev_adj_t *data = (dev_adj_t*)(debug_buf.buf + sizeof(proto_head_t));
dev_adj_cfg_t *data = (dev_adj_cfg_t*)(debug_buf.buf + sizeof(proto_head_t));
uint32_t *crc = NULL;
/* 封装报文头. */
_debug_pkt_head_init(sizeof(proto_head_t) + sizeof(dev_adj_t), DEBUG_CT_PRV_REPLY);
_debug_pkt_head_init(sizeof(proto_head_t) + sizeof(dev_adj_cfg_t), DEBUG_CT_PRV_REPLY);
/* 封装数据, 这里减 4 是因为结构体最后 4byte 位置特殊. */
memcpy(data->ADCRatio, dev_config.ADC_ratio, sizeof(dev_config.ADC_ratio));
memcpy(data->ADCBase_elec, dev_config.ADC_base_elec, sizeof(dev_config.ADC_base_elec));
memcpy(data->ADCAdj, dev_config.ADC_adj, sizeof(dev_config.ADC_adj));
memcpy(data->ADCBase, dev_config.ADC_base, sizeof(dev_config.ADC_base));
data->vin = dev_config.vin;
memcpy(data->power_adj, dev_config.power_adj, 64);
data->vin_adj = dev_config.vin_adj;
memcpy(data->ADC_turns, dev_config.ADC_turns, DAU_PORT_POWER_CNT);
/* 计算校验和. */
crc = (uint32_t*)(debug_buf.buf + head->len);
@ -634,20 +666,67 @@ static void _debug_pkt_adj_get(void)
}
/* 校准参数设置报文处理. */
static void _debug_pkt_adj_set(void)
static void _debug_pkt_adj_set_power(void)
{
proto_head_t *head = (proto_head_t*)debug_buf.buf;
dev_adj_t *data = (dev_adj_t*)(debug_buf.buf + sizeof(proto_head_t));
dev_adj_power_cfg_t *data = (dev_adj_power_cfg_t*)(debug_buf.buf + sizeof(proto_head_t));
uint32_t *crc = NULL;
/* 配置参数. */
memcpy(dev_config.ADC_ratio, data->ADCRatio, sizeof(dev_config.ADC_ratio));
memcpy(dev_config.ADC_base_elec, data->ADCBase_elec, sizeof(dev_config.ADC_base_elec));
memcpy(dev_config.ADC_adj, data->ADCAdj, sizeof(dev_config.ADC_adj));
memcpy(dev_config.ADC_base, data->ADCBase, sizeof(dev_config.ADC_base));
dev_config.vin = data->vin;
memcpy(dev_config.power_adj, data->power_adj, 32);
dev_config.vin_adj = data->vin_adj;
memcpy(dev_config.ADC_turns, data->ADC_turns, DAU_PORT_POWER_CNT);
/* 封装报文头. */
_debug_pkt_head_init(sizeof(proto_head_t), DEBUG_CT_PRV_REPLY);
/* 计算校验和. */
crc = (uint32_t*)(debug_buf.buf + head->len);
*crc = crc32(debug_buf.buf, head->len);
/* 发送报文 */
_debug_pkt_send(head->len + 4, 20);
/* 保存参数. */
common_sys_set(COM_SYS_SAVE_CONFIG, 0);
return;
}
/* 校准参数设置报文处理. */
static void _debug_pkt_adj_set_defect(void)
{
proto_head_t *head = (proto_head_t*)debug_buf.buf;
dev_adj_defect_cfg_t *data = (dev_adj_defect_cfg_t*)(debug_buf.buf + sizeof(proto_head_t));
uint32_t *crc = NULL;
/* 配置参数. */
memcpy(dev_config.defect_base, data->defect_base, sizeof(dev_adj_defect_cfg_t));
/* 封装报文头. */
_debug_pkt_head_init(sizeof(proto_head_t), DEBUG_CT_PRV_REPLY);
/* 计算校验和. */
crc = (uint32_t*)(debug_buf.buf + head->len);
*crc = crc32(debug_buf.buf, head->len);
/* 发送报文 */
_debug_pkt_send(head->len + 4, 20);
/* 保存参数. */
common_sys_set(COM_SYS_SAVE_CONFIG, 0);
return;
}
/* 校准参数设置报文处理. */
static void _debug_pkt_adj_set_fault(void)
{
proto_head_t *head = (proto_head_t*)debug_buf.buf;
dev_adj_fault_cfg_t *data = (dev_adj_fault_cfg_t*)(debug_buf.buf + sizeof(proto_head_t));
uint32_t *crc = NULL;
/* 配置参数. */
memcpy(dev_config.fault_base, data->fault_base, sizeof(dev_adj_fault_cfg_t));
/* 封装报文头. */
_debug_pkt_head_init(sizeof(proto_head_t), DEBUG_CT_PRV_REPLY);
@ -943,6 +1022,77 @@ static HAL_StatusTypeDef _debug_adj_start(void)
return HAL_OK;
}
/* 工频系数自动计算. */
void _debug_adj_power_cal(void)
{
int16_t (*val)[DAU_POWER_DATE_LEN] = dau_ctrl.reg_power;
uint8_t ch = 0;
uint16_t i = 0;
uint64_t square_sum = 0;
int32_t mean = 0;
float base_elec = 0;
float temp = 0;
int16_t min = 32767;
int16_t max = -32768;
/* 遍历通道, 计算有效值 */
for(ch = 0; ch < DAU_PORT_POWER_CNT; ch++)
{
if (!IS_MONITOR_BIT_SET(debug_adj_power.bitmap, ch))
{
continue;
}
/* 计算所有值的算术平均值 */
mean = 0;
min = 32767;
max = -32768;
for(i = 0; i < DAU_POWER_DATE_LEN; i++)
{
if (val[ch][i] < min)
min = val[ch][i];
if (val[ch][i] > max)
max = val[ch][i];
mean += val[ch][i];
}
mean = mean / DAU_POWER_DATE_LEN;
vty_print("#DE P%d %d %d %d", ch, mean, min, max);
/* 遍历通道所有值, 求和, 并计算出最大值和最小值. */
square_sum = 0;
for(i = 0; i < DAU_POWER_DATE_LEN; i++)
{
val[ch][i] -= mean;
square_sum += val[ch][i] * val[ch][i];
}
/* 根据数据查找数据落在哪个分段点上. */
temp = (double)sqrt(square_sum / DAU_POWER_DATE_LEN);
/* 计算系数. */
if (ch < 4)
{
dev_config.power_adj[ch] = (uint16_t)(temp * 8000 / (debug_adj_power.elec * 10));
}
else
{
dev_config.power_adj[ch] = (uint16_t)(temp * 120000 / (debug_adj_power.elec * 10));
}
if (ch < 4)
{
base_elec = debug_adj_power.elec * 14.14 * 2;
dev_config.power_adj_point[ch] = (uint16_t)((max - min) * 8000 / base_elec);
}
else
{
base_elec = debug_adj_power.elec * 1.414 * 2;
dev_config.power_adj_point[ch] = (uint16_t)((max - min) * 12000 / base_elec);
}
}
}
/* 自动校准处理. */
static HAL_StatusTypeDef _debug_adj_auto(uint8_t bitmap)
{
@ -962,7 +1112,7 @@ static HAL_StatusTypeDef _debug_adj_auto(uint8_t bitmap)
for(i = 0; i < 1; i++)
{
/* 过滤不需要的通道. */
if (!IS_MONITOR_BIT_SET(bitmap, i) || 0 == dev_config.ADC_ratio[i])
if (!IS_MONITOR_BIT_SET(bitmap, i))
{
continue;
}
@ -971,8 +1121,7 @@ static HAL_StatusTypeDef _debug_adj_auto(uint8_t bitmap)
bitmap_new = 0;
for (j = i; j < DAU_PORT_POWER_CNT; j++)
{
if (!IS_MONITOR_BIT_SET(bitmap, j)
|| dev_config.ADC_ratio[i] != dev_config.ADC_ratio[j])
if (!IS_MONITOR_BIT_SET(bitmap, j))
{
continue;
}
@ -986,14 +1135,14 @@ static HAL_StatusTypeDef _debug_adj_auto(uint8_t bitmap)
{
HAL_E_RETURN(_debug_adj_source_set(bitmap_new, j));
osDelay(3000);
g_is_adj_status = 1;
while (g_is_adj_status != 2)
dau_adj_state = DAU_ADJ_STATE_POWER;
while (dau_adj_state != DAU_ADJ_STATE_NONE)
{
common_watchdog_set(COM_WDG_CLI);
osDelay(2000);
}
DBG(DBG_M_RS485_DEBUG, "capture end...\r\n");
HAL_E_RETURN(_dau_base_auto(bitmap_new, j + 1));
_debug_adj_power_cal();
}
}
@ -1021,7 +1170,7 @@ static HAL_StatusTypeDef _debug_adj_autoEx(uint8_t bitmap, uint16_t elec, uint8_
for(i = 0; i < 1; i++)
{
/* 过滤不需要的通道. */
if (!IS_MONITOR_BIT_SET(bitmap, i) || 0 == dev_config.ADC_ratio[i])
if (!IS_MONITOR_BIT_SET(bitmap, i))
{
continue;
}
@ -1030,8 +1179,7 @@ static HAL_StatusTypeDef _debug_adj_autoEx(uint8_t bitmap, uint16_t elec, uint8_
bitmap_new = 0;
for (j = i; j < DAU_PORT_POWER_CNT; j++)
{
if (!IS_MONITOR_BIT_SET(bitmap, j)
|| dev_config.ADC_ratio[i] != dev_config.ADC_ratio[j])
if (!IS_MONITOR_BIT_SET(bitmap, j))
{
continue;
}
@ -1045,15 +1193,14 @@ static HAL_StatusTypeDef _debug_adj_autoEx(uint8_t bitmap, uint16_t elec, uint8_
{
HAL_E_RETURN(_debug_adj_source_setEx(bitmap_new, index-1, elec));
osDelay(5000);
g_is_adj_status = 1;
while (g_is_adj_status != 2)
dau_adj_state = DAU_ADJ_STATE_POWER;
while (dau_adj_state != DAU_ADJ_STATE_NONE)
{
common_watchdog_set(COM_WDG_CLI);
osDelay(2000);
}
DBG(DBG_M_RS485_DEBUG, "capture end...\r\n");
HAL_E_RETURN(_dau_base_auto(bitmap_new, index));
g_is_adj_status = 0;
_debug_adj_power_cal();
}
}
@ -1064,52 +1211,6 @@ static HAL_StatusTypeDef _debug_adj_autoEx(uint8_t bitmap, uint16_t elec, uint8_
return HAL_OK;
}
/* 自动校准报文处理. */
void _debug_pkt_adj_auto(void)
{
proto_head_t *head = (proto_head_t*)debug_buf.buf;
debug_adj_set *data = (debug_adj_set*)(debug_buf.buf + sizeof(proto_head_t));
uint32_t *rt = (uint32_t*)(debug_buf.buf + sizeof(proto_head_t));
uint32_t *crc = NULL;
HAL_StatusTypeDef rv = HAL_ERROR;
if (IS_MONITOR_BIT_SET(dev_config.flag, DEV_FLAG_ADJ))
{
/* 开始自动校准. */
//data->ch_selecet = 1;
rv = _debug_adj_auto(data->ch_selecet);
if (rv == HAL_OK)
{
/* 完成后保存配置. */
common_sys_set(COM_SYS_SAVE_CONFIG, 0);
}
/* 电池电压自动校准. */
if (data->is_voltage_sel)
{
ADC_vbat_auto(dev_config.vin);
}
}
else
{
rv = HAL_ERROR;
}
*rt = rv;
/* 封装报文头. */
_debug_pkt_head_init(sizeof(proto_head_t) + 4, DEBUG_CT_PRV_REPLY);
/* 计算校验和. */
crc = (uint32_t*)(debug_buf.buf + head->len);
*crc = crc32(debug_buf.buf, head->len);
/* 发送报文 */
_debug_pkt_send(head->len + 4, 20);
return;
}
void _debug_pkt_adj_autoEx(uint16_t elec, uint8_t index)
{
proto_head_t *head = (proto_head_t*)debug_buf.buf;
@ -1136,7 +1237,6 @@ void _debug_pkt_adj_autoEx(uint16_t elec, uint8_t index)
/* 电池电压自动校准. */
if (data->is_voltage_sel)
{
ADC_vbat_auto(dev_config.vin);
}
}
else
@ -1174,12 +1274,18 @@ static void _debug_pkt_data_get(void)
data->temperature = ADC_ctrl.ADCi_temp;
data->vbat = ADC_ctrl.ADCi_vbat;
data->vin = ADC_ctrl.ADCi_vin;
data->vsc = ADC_ctrl.ADCi_vsc;
data->CSQ = wl_ctrl.CSQ;
for(i = 0; i < DAU_PORT_POWER_CNT; i++)
{
//data->elec[i] = ADC_ctrl.ADC_elec[i];
data->elec[i] = dau_ctrl.reg_elec[i];
data->elec_fault[i] = dau_ctrl.fault_elec[i];
}
for(i = 0; i < DAU_PORT_DEFECT_MAX; i++)
{
data->elec_defect_max[i] = dau_ctrl.reg_defect_max[i];
data->elec_fault_max[i] = dau_ctrl.fault_max[i];
}
data->fault_utc = dau_ctrl.fault_utc;
data->fault_ns = dau_ctrl.fault_ns;
/* 计算校验和. */
crc = (uint32_t*)(debug_buf.buf + head->len);
@ -1297,32 +1403,22 @@ static void _debug_pkt_wave_get(void)
}
/* 设备状态获取报文处理. */
static void _debug_pkt_dev_state_get(void)
static void _debug_pkt_wave_col(void)
{
proto_head_t *head = (proto_head_t*)debug_buf.buf;
dev_state_t *data = (dev_state_t*)(debug_buf.buf + sizeof(proto_head_t));
uint32_t *crc = NULL;
uint32_t reset_delay = 2;
/* 封装报文头. */
_debug_pkt_head_init(sizeof(proto_head_t) + sizeof(dev_state_t), DEBUG_CT_PRV_REPLY);
st_data.wave_time = 0;
st_data.wave_start = TRUE;
st_data.wave_up_start = TRUE;
st_data.wave_index = 0;
/* 装填数据. */
data->is_adc_up = ADC_ctrl.up_finish;
data->adci_cnt = ADC_ctrl.ADCi_err_cnt;
data->adci_state = ADC_ctrl.ADCi_state;
data->adc_cnt = ADC_ctrl.ADC_err_cnt;
data->adc_state = ADC_ctrl.ADC_state;
data->is_adc_thr = ADC_ctrl.is_ADC_thr;
data->wave_time = st_data.wave_time;
data->wave_start = st_data.wave_start;
data->wave_up_start = st_data.wave_up_start;
data->wave_idx = st_data.wave_index;
data->wave_force = st_data.wave_force;
data->wl_state = wl_ctrl.state;
data->wl_cnt = wl_ctrl.send_cnt;
data->force_sleep_up = st_data.force_sleep_up;
data->is_bat_charge = HAL_GPIO_ReadPin(BAT_CHECK_GPIO_Port, BAT_CHECK_Pin);
data->sys_time = HAL_GetTick() / 1000;
flash_log_write(FLASH_LOG_TYPE_INFO, "Force wavc collect system reset!\r\n");
common_sys_set(COM_SYS_RESET, (void*)&reset_delay);
/* 封装报文头. */
_debug_pkt_head_init(sizeof(proto_head_t), DEBUG_CT_PRV_REPLY);
/* 计算校验和. */
crc = (uint32_t*)(debug_buf.buf + head->len);
@ -1335,19 +1431,32 @@ static void _debug_pkt_dev_state_get(void)
}
/* 设备状态获取报文处理. */
static void _debug_pkt_wave_col(void)
static void _debug_pkt_adj_defect_zero(void)
{
proto_head_t *head = (proto_head_t*)debug_buf.buf;
dev_adj_defect_zero_t *data = (dev_adj_defect_zero_t*)(debug_buf.buf + sizeof(proto_head_t));
uint32_t *crc = NULL;
uint32_t reset_delay = 2;
uint8_t i = 0;
st_data.wave_time = 0;
st_data.wave_start = TRUE;
st_data.wave_up_start = TRUE;
st_data.wave_index = 0;
/* 解析数据. */
memcpy(&debug_adj_defect, data, sizeof(dev_adj_defect_zero_t));
flash_log_write(FLASH_LOG_TYPE_INFO, "Force wavc collect system reset!\r\n");
common_sys_set(COM_SYS_RESET, (void*)&reset_delay);
dau_adj_state = DAU_ADJ_STATE_DEFECT_ZERO;
while(dau_adj_state != DAU_ADJ_STATE_NONE)
{
osDelay(1000);
common_watchdog_set(COM_WDG_CLI);
}
for(i = 0; i < DAU_PORT_DEFECT_CNT; i++)
{
if (!IS_MONITOR_BIT_SET(debug_adj_defect.bitmap, i))
{
continue;
}
dev_config.defect_base[i] = dau_ctrl.reg_port_state.DAVR[i];
}
/* 封装报文头. */
_debug_pkt_head_init(sizeof(proto_head_t), DEBUG_CT_PRV_REPLY);
@ -1362,14 +1471,39 @@ static void _debug_pkt_wave_col(void)
return;
}
/* 校准参数设置报文处理. */
static void _debug_pkt_wave_cal(void)
/* 设备状态获取报文处理. */
static void _debug_pkt_adj_defect(void)
{
proto_head_t *head = (proto_head_t*)debug_buf.buf;
dev_adj_defect_cfg_t *data = (dev_adj_defect_cfg_t*)(debug_buf.buf + sizeof(proto_head_t));
uint32_t *crc = NULL;
uint32_t temp = 0;
uint8_t i = 0;
dau_adj_state = DAU_ADJ_STATE_DEFECT;
while(dau_adj_state != DAU_ADJ_STATE_NONE)
{
osDelay(1000);
common_watchdog_set(COM_WDG_CLI);
}
for(i = 0; i < DAU_PORT_DEFECT_CNT; i++)
{
if (!IS_MONITOR_BIT_SET(debug_adj_defect.bitmap, i))
{
continue;
}
temp = dau_ctrl.reg_port_state.DAVR[i] - dev_config.defect_base[i];
temp = 3276;
dev_config.defect_adj[i] = debug_adj_defect.defect_elec * 32768 / temp;
}
/* 封装报文头. */
_debug_pkt_head_init(sizeof(proto_head_t), DEBUG_CT_PRV_REPLY);
_debug_pkt_head_init(sizeof(proto_head_t) + sizeof(dev_adj_defect_cfg_t), DEBUG_CT_PRV_REPLY);
/* 配置参数. */
memcpy(data->defect_base, dev_config.defect_base, sizeof(dev_adj_defect_cfg_t));
/* 计算校验和. */
crc = (uint32_t*)(debug_buf.buf + head->len);
@ -1378,6 +1512,9 @@ static void _debug_pkt_wave_cal(void)
/* 发送报文 */
_debug_pkt_send(head->len + 4, 20);
/* 保存参数. */
common_sys_set(COM_SYS_SAVE_CONFIG, 0);
return;
}
@ -1544,7 +1681,7 @@ static HAL_StatusTypeDef _debug_adj_manual(uint8_t bitmap, uint8_t index)
for(i = 0; i < DAU_PORT_POWER_CNT; i++)
{
/* 过滤不需要的通道. */
if (!IS_MONITOR_BIT_SET(bitmap, i) || 0 == dev_config.ADC_ratio[i])
if (!IS_MONITOR_BIT_SET(bitmap, i))
{
continue;
}
@ -1565,7 +1702,7 @@ static HAL_StatusTypeDef _debug_adj_manual(uint8_t bitmap, uint8_t index)
}
}
HAL_E_RETURN(_dau_base_auto(bitmap, index + 1));
_debug_adj_power_cal();
return HAL_OK;
}
@ -1608,14 +1745,25 @@ static void _debug_pkt_adj_manual(void)
return;
}
/* 南网配置获取报文处理. */
static void _debug_pkt_csg_config_get(void)
/* 设备状态获取报文处理. */
static void _debug_pkt_adj_fault_zero(void)
{
proto_head_t *head = (proto_head_t*)debug_buf.buf;
dev_adj_fault_zero_t *data = (dev_adj_fault_zero_t*)(debug_buf.buf + sizeof(proto_head_t));
uint32_t *crc = NULL;
/* 解析数据. */
memcpy(&debug_adj_fault, data, sizeof(dev_adj_fault_zero_t));
dau_adj_state = DAU_ADJ_STATE_FAULT_ZERO;
while(dau_adj_state != DAU_ADJ_STATE_NONE)
{
osDelay(1000);
common_watchdog_set(COM_WDG_CLI);
}
/* 封装报文头. */
_debug_pkt_head_init(sizeof(proto_head_t) + sizeof(debug_csg_config_t), DEBUG_CT_PRV_REPLY);
_debug_pkt_head_init(sizeof(proto_head_t), DEBUG_CT_PRV_REPLY);
/* 计算校验和. */
crc = (uint32_t*)(debug_buf.buf + head->len);
@ -1627,14 +1775,43 @@ static void _debug_pkt_csg_config_get(void)
return;
}
/* 修改南网配置报文处理. */
static void _debug_pkt_csg_config_set(void)
/* 设备状态获取报文处理. */
static void _debug_pkt_adj_fault(void)
{
proto_head_t *head = (proto_head_t*)debug_buf.buf;
dev_adj_fault_cfg_t *data = (dev_adj_fault_cfg_t*)(debug_buf.buf + sizeof(proto_head_t));
uint32_t *crc = NULL;
uint8_t i = 0;
dau_adj_state = DAU_ADJ_STATE_FAULT;
while(dau_adj_state != DAU_ADJ_STATE_NONE)
{
osDelay(1000);
common_watchdog_set(COM_WDG_CLI);
}
for(i = 0; i < DAU_PORT_FAULT_CNT; i++)
{
data->fault_base[i] = dev_config.fault_base[i];
if (!IS_MONITOR_BIT_SET(debug_adj_fault.bitmap, i))
{
data->fault_adj[i] = dev_config.fault_adj[i];
continue;
}
if (!((dau_ctrl.reg_global.GFTR & DAU_GFTR_FAULT_Msk) >> DAU_GFTR_FAULT_Pos))
{
data->fault_adj[i] = 0;
continue;
}
//data->fault_adj[i] = abs_cal_u(dau_ctrl.reg_port_state.FMAX[i] - dev_config.fault_base[i]);
data->fault_adj[i] = 13107;
}
/* 封装报文头. */
_debug_pkt_head_init(sizeof(proto_head_t), DEBUG_CT_PRV_REPLY);
_debug_pkt_head_init(sizeof(proto_head_t) + sizeof(dev_adj_fault_cfg_t), DEBUG_CT_PRV_REPLY);
/* 计算校验和. */
crc = (uint32_t*)(debug_buf.buf + head->len);
@ -1669,6 +1846,80 @@ static void _debug_pkt_update_fpga_result()
return;
}
/* 自动校准报文处理. */
void _debug_pkt_adj_auto(void)
{
proto_head_t *head = (proto_head_t*)debug_buf.buf;
dev_adj_power_t *data = (dev_adj_power_t*)(debug_buf.buf + sizeof(proto_head_t));
dev_adj_power_cfg_t *cfg = (dev_adj_power_cfg_t*)(debug_buf.buf + sizeof(proto_head_t));
uint32_t *crc = NULL;
/* 解析数据. */
memcpy(&debug_adj_power, data, sizeof(dev_adj_power_t));
/* 组装数据 */
//cfg->return_value = _debug_adj_auto(debug_adj_power.bitmap);
cfg->return_value = 0;
if (debug_adj_power.is_voltage_adj)
{
ADC_vbat_auto(5000);
}
memcpy(cfg->power_adj, dev_config.power_adj, 32);
cfg->vin_adj = dev_config.vin_adj;
/* 封装报文头. */
_debug_pkt_head_init(sizeof(proto_head_t) + sizeof(dev_adj_power_cfg_t), DEBUG_CT_PRV_REPLY);
/* 计算校验和. */
crc = (uint32_t*)(debug_buf.buf + head->len);
*crc = crc32(debug_buf.buf, head->len);
/* 发送报文 */
_debug_pkt_send(head->len + 4, 20);
/* 保存参数. */
common_sys_set(COM_SYS_SAVE_CONFIG, 0);
return;
}
/* 设备状态获取报文处理. */
static void _debug_pkt_dev_state_get(void)
{
proto_head_t *head = (proto_head_t*)debug_buf.buf;
dev_state_t *data = (dev_state_t*)(debug_buf.buf + sizeof(proto_head_t));
uint32_t *crc = NULL;
/* 封装报文头. */
_debug_pkt_head_init(sizeof(proto_head_t) + sizeof(dev_state_t), DEBUG_CT_PRV_REPLY);
/* 装填数据. */
data->is_adc_up = ADC_ctrl.up_finish;
data->adci_cnt = ADC_ctrl.ADCi_err_cnt;
data->adci_state = ADC_ctrl.ADCi_state;
data->adc_cnt = ADC_ctrl.ADC_err_cnt;
data->adc_state = ADC_ctrl.ADC_state;
data->is_adc_thr = ADC_ctrl.is_ADC_thr;
data->wave_time = st_data.wave_time;
data->wave_start = st_data.wave_start;
data->wave_up_start = st_data.wave_up_start;
data->wave_idx = st_data.wave_index;
data->wave_force = st_data.wave_force;
data->wl_state = wl_ctrl.state;
data->wl_cnt = wl_ctrl.send_cnt;
data->force_sleep_up = st_data.force_sleep_up;
data->is_bat_charge = HAL_GPIO_ReadPin(BAT_CHECK_GPIO_Port, BAT_CHECK_Pin);
data->sys_time = HAL_GetTick() / 1000;
/* 计算校验和. */
crc = (uint32_t*)(debug_buf.buf + head->len);
*crc = crc32(debug_buf.buf, head->len);
/* 发送报文 */
_debug_pkt_send(head->len + 4, 20);
return;
}
/* 收包报文处理. */
static void _debug_pkt_process(void)
@ -1729,23 +1980,26 @@ static void _debug_pkt_process(void)
case DEBUG_PRV_DEFECT:
_debug_pkt_wave_get();
break;
case DEBUG_PRV_ADJ_INFO:
case DEBUG_PRV_ADJ_GET:
_debug_pkt_adj_get();
break;
case DEBUG_PRV_ADJ_INFO_SET:
_debug_pkt_adj_set();
case DEBUG_PRV_ADJ_SET_POWER:
_debug_pkt_adj_set_power();
break;
case DEBUG_PRV_ADJ_AUTO:
_debug_pkt_adj_auto();
case DEBUG_PRV_ADJ_SET_DEFECT:
_debug_pkt_adj_set_defect();
break;
case DEBUG_PRV_DEV_STATE:
_debug_pkt_dev_state_get();
case DEBUG_PRV_ADJ_SET_FAULT:
_debug_pkt_adj_set_fault();
break;
case DEBUG_PRV_WAVE_COL:
_debug_pkt_wave_col();
break;
case DEBUG_PRV_WAVE_CAL:
_debug_pkt_wave_cal();
case DEBUG_PRV_ADJ_DECFECT_ZERO:
_debug_pkt_adj_defect_zero();
break;
case DEBUG_PRV_ADJ_DECFECT:
_debug_pkt_adj_defect();
break;
case DEBUG_PRV_LOG:
_debug_pkt_log_get();
@ -1756,15 +2010,21 @@ static void _debug_pkt_process(void)
case DEBUG_PRV_ADJ_MANUAL:
_debug_pkt_adj_manual();
break;
case DEBUG_PRV_CSG_CONFIG:
_debug_pkt_csg_config_get();
case DEBUG_PRV_ADJ_FAULT_ZERO:
_debug_pkt_adj_fault_zero();
break;
case DEBUG_PRV_CSG_CONFIG_SET:
_debug_pkt_csg_config_set();
case DEBUG_PRV_ADJ_FAULT:
_debug_pkt_adj_fault();
break;
case DEBUG_PRV_UPDATE_FPGA:
_debug_pkt_update_fpga();
break;
case DEBUG_PRV_ADJ_AUTO:
_debug_pkt_adj_auto();
break;
case DEBUG_PRV_DEV_STATE:
_debug_pkt_dev_state_get();
break;
default:
break;
}

@ -880,9 +880,6 @@ void cli_start(void const * argument)
FLASH_If_Init();
/* 配置系统初始化. */
dev_config_init();
dev_config_flag_set(DEV_FLAG_CLI);
//dev_config_flag_unset(DEV_FLAG_CLI);
dev_config_flag_unset(DEV_FLAG_ADJ);
flash_log_init();
st_init();

@ -54,81 +54,6 @@
/* Private define ------------------------------------------------------------*/
#define DAU_WAVE_WAIT_MAX 8 // DAU 波形等待次数
/* 全局状态寄存器地址 -------------------------------- */
#define DAU_REG_ADDR_GSCR 0x0000 // 全局状态寄存器 - 软件特征寄存器
#define DAU_REG_ADDR_GSVR 0x0001 // 全局状态寄存器 - 软件版本寄存器
#define DAU_REG_ADDR_GSR 0x0002 // 全局状态寄存器 - 状态寄存器
#define DAU_REG_ADDR_GFTR 0x0003 // 全局状态寄存器 - 故障触发录波状态寄存器
#define DAU_REG_ADDR_GFTUR 0x0004 // 全局状态寄存器 - 故障触发 UTC 时间点寄存器
#define DAU_REG_ADDR_GFTNR 0x0006 // 全局状态寄存器 - 故障触发 ns 时间点寄存器
#define DAU_REG_ADDR_GRTR 0x0008 // 全局状态寄存器 - 寄存器触发录波状态寄存器
#define DAU_REG_ADDR_GUR 0x000a // 全局状态寄存器 - UTC 寄存器
#define DAU_REG_ADDR_GNR 0x000c // 全局状态寄存器 - ns 寄存器
/* 全局状态寄存器 - 状态寄存器 bit mask */
#define DAU_GSR_FLASH_Pos (2) // spi flash 空闲状态
#define DAU_GSR_FLASH_Msk (0x1 << DAU_GSR_FLASH_Pos) /*!< 0x0004 */
/* 全局状态寄存器 - 故障触发录波状态寄存器 bit mask */
#define DAU_GFTR_POWER_WAVE_Pos (3) // 故障触发工频电流波形状态
#define DAU_GFTR_POWER_WAVE_Msk (0x1 << DAU_GFTR_POWER_WAVE_Pos) /*!< 0x0008 */
#define DAU_GFTR_DEFECT_WAVE_Pos (2) // 故障触发缺陷电流波形状态
#define DAU_GFTR_DEFECT_WAVE_Msk (0x1 << DAU_GFTR_DEFECT_WAVE_Pos) /*!< 0x0004 */
#define DAU_GFTR_FAULT_WAVE_Pos (1) // 故障电流波形状态
#define DAU_GFTR_FAULT_WAVE_Msk (0x1 << DAU_GFTR_FAULT_WAVE_Pos) /*!< 0x0002 */
#define DAU_GFTR_FAULT_Pos (0) // 故障触发录波完成状态
#define DAU_GFTR_FAULT_Msk (0x1 << DAU_GFTR_FAULT_Pos) /*!< 0x0001 */
/* 全局状态寄存器 - 寄存器触发录波状态寄存器 bit mask */
#define DAU_GRTR_POWER_WAVE_Pos (3) // 寄存器触发工频电流波形状态
#define DAU_GRTR_POWER_WAVE_Msk (0x1 << DAU_GRTR_POWER_WAVE_Pos) /*!< 0x0008 */
#define DAU_GRTR_DEFECT_WAVE_Pos (2) // 寄存器触发缺陷电流波形状态
#define DAU_GRTR_DEFECT_WAVE_Msk (0x1 << DAU_GRTR_DEFECT_WAVE_Pos) /*!< 0x0004 */
#define DAU_GRTR_COMPLETE_Pos (0) // 寄存器触发录波完成状态
#define DAU_GRTR_COMPLETE_Msk (0x1 << DAU_GRTR_COMPLETE_Pos) /*!< 0x0001 */
/* 全局控制寄存器地址 -------------------------------- */
#define DAU_REG_ADDR_GFWSR 0x0200 // 全局控制寄存器 - Flash 写选择寄存器
#define DAU_REG_ADDR_GSUPR 0x0202 // 全局控制寄存器 - 固件升级页寄存器
#define DAU_REG_ADDR_GCFTR 0x0203 // 全局控制寄存器 - 故障触发录波控制寄存器
#define DAU_REG_ADDR_GCRTR 0x0204 // 全局控制寄存器 - 寄存器触发录波控制寄存器
#define DAU_REG_ADDR_GCUR 0x0205 // 全局控制寄存器 - UTC 配置寄存器
#define DAU_REG_ADDR_GCFTTR 0x0207 // 全局控制寄存器 - 故障电流触发阈值寄存器
#define DAU_REG_ADDR_GSUDR 0x0e00 // 全局控制寄存器 - 固件升级数据寄存器
/* 全局控制寄存器 - 故障触发录波控制寄存器 bit mask */
#define DAU_GCFTR_PORT_Pos (4) // 故障触发波形端口
#define DAU_GCFTR_PORT_Msk (0x7 << DAU_GCFTR_PORT_Pos) /*!< 0x0070 */
#define DAU_GCFTR_POWER_WAVE_Pos (3) // 故障触发波形端口
#define DAU_GCFTR_POWER_WAVE_Msk (0x1 << DAU_GCFTR_POWER_WAVE_Pos) /*!< 0x0008 */
#define DAU_GCFTR_DEFECT_WAVE_Pos (2) // 故障触发缺陷电流波形读取
#define DAU_GCFTR_DEFECT_WAVE_Msk (0x1 << DAU_GCFTR_DEFECT_WAVE_Pos) /*!< 0x0004 */
#define DAU_GCFTR_FAULT_WAVE_Pos (1) // 故障电流波形读取
#define DAU_GCFTR_FAULT_WAVE_Msk (0x1 << DAU_GCFTR_FAULT_WAVE_Pos) /*!< 0x0002 */
/* 全局控制寄存器 - 寄存器触发录波控制寄存器 bit mask */
#define DAU_GCRTR_PORT_Pos (4) // 寄存器触发波形端口
#define DAU_GCRTR_PORT_Msk (0x7 << DAU_GCRTR_PORT_Pos) /*!< 0x0070 */
#define DAU_GCRTR_POWER_WAVE_Pos (3) // 寄存器触发工频电流波形读取
#define DAU_GCRTR_POWER_WAVE_Msk (0x1 << DAU_GCRTR_POWER_WAVE_Pos) /*!< 0x0008 */
#define DAU_GCRTR_DEFECT_WAVE_Pos (2) // 寄存器触发缺陷电流波形读取
#define DAU_GCRTR_DEFECT_WAVE_Msk (0x1 << DAU_GCRTR_DEFECT_WAVE_Pos) /*!< 0x0004 */
#define DAU_GCRTR_START_WAVE_Pos (0) // 录波控制
#define DAU_GCRTR_START_WAVE_Msk (0x1 << DAU_GCRTR_START_WAVE_Pos) /*!< 0x0001 */
/* 通道状态寄存器地址 -------------------------------- */
#define DAU_REG_ADDR_PMSR 0x0300 // 通道状态寄存器 - 缺陷电流通道周波原始采样值的平均值寄存器
#define DAU_REG_ADDR_PPWR 0x03b0 // 通道状态寄存器 - 通道录波数据寄存器
#define DAU_REG_ADDR_PORT_BASE 0x1000 // 通道配置寄存器基地址
#define DAU_REG_ADDR_PORT_DEFECT_BASE 0x0 // 通道配置寄存器 - 缺陷电流通道零点原始值寄存器
#define DAU_REG_ADDR_PORT_FAULT_BASE 0x1 // 通道配置寄存器 - 故障电流通道零点原始值寄存器
#define DAU_REG_ADDR_PORT_DEFECT_ADJ 0xC // 通道配置寄存器 - 缺陷电流通道校准系数寄存器
#define DAU_REG_ADDR_PORT_FAULT_ADJ 0x22 // 通道配置寄存器 - 故障电流通道校准系数寄存器
#define DAU_ID 0x0702 // DAU 软件识别码
/* Private typedef -----------------------------------------------------------*/
@ -171,9 +96,13 @@ static struct tm _dau_tm;
int8_t _dau_spi_rw;
uint16_t _dau_spi_addr;
uint16_t _dau_spi_len;
int8_t g_is_adj_status = 0; // 1:采集 2:采集完成
uint8_t dau_adj_state = 0; // 1:采集 2:采集完成
extern dev_adj_fault_zero_t debug_adj_fault;
/* Private function prototypes -----------------------------------------------*/
extern int32_t _dau_adj_reg_write_port(uint32_t port);
/* Internal functions --------------------------------------------------------*/
/* description: DAU 写寄存器报文发送
param: addr --
@ -332,9 +261,8 @@ int32_t _dau_reg_write_port(uint32_t port)
/* 故障校准系数 */
addr = (port + 1) * DAU_REG_ADDR_PORT_BASE + DAU_REG_ADDR_PORT_FAULT_BASE;
//*temp = dev_config.fault_base[i];
//*temp = 34533;
*temp = 34547;
*temp = dev_config.fault_base[port];
//*temp = 35000;
E_RETURN(_dau_reg_write(addr, sizeof(uint16_t)));
addr = (port + 1) * DAU_REG_ADDR_PORT_BASE + DAU_REG_ADDR_PORT_FAULT_ADJ;
@ -454,9 +382,7 @@ int32_t _dau_update(void)
return: */
void _dau_utc(void)
{
static uint8_t is_start = FALSE;
uint32_t *utc = (uint32_t*)&dau_ctrl.buf_dau_tx[2];
uint16_t *temp = (uint16_t*)&dau_ctrl.buf_dau_tx[2];
/* dau 主循环大概 250ms 运行一次, 在第 3 次循环 (500 ~ 750ms) 对时, 此时 GPS 对时一定是可用的 */
if (50000000 < dau_ctrl.reg_global.GNR && dau_ctrl.reg_global.GNR <= 75000000
@ -516,6 +442,18 @@ int32_t _dau_wave_col_fault(void)
uint32_t addr = 0;
int32_t rv = HAL_ERROR;
dau_ctrl.fault_utc = dau_ctrl.reg_global.GFTUR;
dau_ctrl.fault_ns = dau_ctrl.reg_global.GFTNR;
vty_print("#D utc %d.%d\r\n", dau_ctrl.fault_utc, dau_ctrl.fault_ns);
/* 擦除 flash */
addr = dau_ctrl.addr_fault;
for(i = 0; i < 2; i++)
{
E_RETURN(spi_flash_erase(addr, SPI_CMD_BLOCK64_ERASE));
addr += SPI_FLASH_BLOCK64_SIZE;
}
/* 读取触发电流值 */
E_RETURN(_dau_reg_read_port_state());
@ -524,7 +462,7 @@ int32_t _dau_wave_col_fault(void)
/* 读取故障数据 */
for(i = 0; i < DAU_PORT_FAULT_CNT; i++)
{
dau_ctrl.fault_trig[i] = dau_ctrl.reg_port_state.FMAX[i];
dau_ctrl.fault_max[i] = dau_ctrl.reg_port_state.FMAX[i];
/* 请求读取故障波形 */
*reg = DAU_GCFTR_FAULT_WAVE_Msk | (i << DAU_GCFTR_PORT_Pos);
@ -560,29 +498,6 @@ int32_t _dau_wave_col_fault(void)
}
return HAL_OK;
#if 0
uint8_t i = 0;
uint8_t j = 0;
uint32_t addr = 0;
int32_t rv = HAL_ERROR;
/* 读取故障数据 */
addr = dau_ctrl.addr_fault;
for(i = 0; i < DAU_PORT_FAULT_CNT; i++)
{
dau_ctrl.fault_trig[i] = 100 + i;
memset(&dau_ctrl.buf_dau_rx[2], i, DAU_PKT_FAULT_BYTE_CNT);
for(j = 0; j < DAU_PKT_FAULT_CNT; j++)
{
E_RETURN(spi_flash_write(addr, &dau_ctrl.buf_dau_rx[2], DAU_PKT_FAULT_BYTE_CNT));
addr += DAU_PKT_FAULT_BYTE_CNT;
}
}
vty_print("#D2 %x\r\n", addr);
return rv;
#endif
}
/* description: 缺陷波形采集
@ -823,26 +738,18 @@ void _dau_power_calculate(DAU_SOURCE_E source)
uint64_t square_sum = 0;
int32_t mean = 0;
float temp = 0;
int16_t min = 32767;
int16_t max = -32768;
/* 遍历通道, 计算有效值 */
for(ch = 0; ch < DAU_PORT_POWER_CNT; ch++)
{
/* 计算所有值的算术平均值 */
mean = 0;
min = 32767;
max = -32768;
for(i = 0; i < DAU_POWER_DATE_LEN; i++)
{
if (val[ch][i] < min)
min = val[ch][i];
if (val[ch][i] > max)
max = val[ch][i];
mean += val[ch][i];
}
mean = mean / DAU_POWER_DATE_LEN;
vty_print("#DP%d %d %d %d", ch, mean, min, max);
vty_print("#DP%d %d", ch, mean);
/* 遍历通道所有值, 求和, 并计算出最大值和最小值. */
square_sum = 0;
@ -856,7 +763,15 @@ void _dau_power_calculate(DAU_SOURCE_E source)
temp = (double)sqrt(square_sum / DAU_POWER_DATE_LEN);
/* 根据分段点计算有效值. */
power[ch] = (uint32_t)(temp * 8000 / dev_config.ADC_adj[ch][0]);
if (ch < 4)
{
power[ch] = (uint32_t)(temp * 8000 / dev_config.power_adj[ch]);
}
else
{
power[ch] = (uint32_t)(temp * 120000 / dev_config.power_adj[ch]);
}
vty_print(" %f %d %d\r\n", temp, dev_config.ADC_adj[ch][0], power[ch]);
}
@ -885,9 +800,7 @@ void _dau_power_calculate(DAU_SOURCE_E source)
}
}
/* 计算工频录波每个点的电流值 */
#if 0
if (DAU_SOURCE_FAULT == source
|| IS_MONITOR_BIT_SET(dau_ctrl.col_flag, DAU_COL_FLAG_REG_POWER))
{
@ -895,79 +808,24 @@ void _dau_power_calculate(DAU_SOURCE_E source)
{
for(i = 0; i < DAU_POWER_DATE_LEN; i++)
{
val[ch][i] = (int32_t)val[ch][i] * 500 / dev_config.ADC_adj_point[ch];
}
}
}
#endif
}
/* dau data base 自动计算. */
HAL_StatusTypeDef _dau_base_auto(uint8_t ch_bitmap, uint8_t index)
{
int16_t (*val)[DAU_POWER_DATE_LEN] = dau_ctrl.reg_power;
//uint32_t *power = dau_ctrl.reg_elec;
uint8_t ch = 0;
uint16_t i = 0;
uint64_t square_sum = 0;
int32_t mean_sum = 0;
if (!ch_bitmap)
{
return HAL_OK;
}
/* 遍历通道, 计算有效值. */
index--;
for(ch = 0; ch < DAU_PORT_POWER_CNT; ch++)
{
/* 过滤通道. */
if (!IS_MONITOR_BIT_SET(ch_bitmap, ch))
{
continue;
}
square_sum = 0;
mean_sum = 0;
/* 遍历通道所有值, 求和, 并计算出最大值和最小值. */
for(i = 0; i < DAU_POWER_DATE_LEN; i++)
{
square_sum += val[ch][i] * val[ch][i];
mean_sum += val[ch][i];
}
/* 计算校准参数. */
dev_config.ADC_base[ch][index] = (double)sqrt(square_sum / DAU_POWER_DATE_LEN) - abs(mean_sum / DAU_POWER_DATE_LEN);
if (0 == index)
if (ch < 4)
{
dev_config.ADC_adj[ch][index] = (uint16_t)(dev_config.ADC_base_elec[ch][index] * 32768 / (dev_config.ADC_base[ch][index] * dev_config.ADC_ratio[ch] * 1.414));
val[ch][i] = val[ch][i] * 8000 / dev_config.power_adj_point[ch];
}
else
{
square_sum = (uint64_t)(dev_config.ADC_base_elec[ch][index] - dev_config.ADC_base_elec[ch][index - 1]) * 32768;
dev_config.ADC_adj[ch][index] = (uint16_t)(square_sum / ((dev_config.ADC_base[ch][index] - dev_config.ADC_base[ch][index - 1]) * dev_config.ADC_ratio[ch] * 1.414));
val[ch][i] = val[ch][i] * 12000 / dev_config.power_adj_point[ch];
}
}
/* 调试打印. */
if (dbg_stat_get(DBG_M_DAU))
{
DBG(DBG_M_DAU, "ADC_base[%d][%d] = %f \r\n", ch, index, dev_config.ADC_base[ch][index]);
DBG(DBG_M_DAU, "ADC_base_elec[%d][%d] = %d \r\n", ch, index, dev_config.ADC_base_elec[ch][index]);
DBG(DBG_M_DAU, "ADC_adj[%d][%d] = %d \r\n", ch, index, dev_config.ADC_adj[ch][index]);
}
}
return HAL_OK;
}
/* description: 故障触发波形采集
param:
return: HAL_xxx */
int32_t _dau_wave_col_trigger_by_fault(void)
{
uint8_t i = 0;
uint32_t addr = 0;
int32_t rv = HAL_ERROR;
/* 上次触发没有完成直接退出 */
@ -981,17 +839,6 @@ int32_t _dau_wave_col_trigger_by_fault(void)
{
return HAL_OK;
}
dau_ctrl.fault_utc = dau_ctrl.reg_global.GFTUR;
dau_ctrl.fault_ns = dau_ctrl.reg_global.GFTNR;
vty_print("#D utc %d.%d\r\n", dau_ctrl.fault_utc, dau_ctrl.fault_ns);
/* 擦除 flash */
addr = dau_ctrl.addr_fault;
for(i = 0; i < 2; i++)
{
E_RETURN(spi_flash_erase(addr, SPI_CMD_BLOCK64_ERASE));
addr += SPI_FLASH_BLOCK64_SIZE;
}
/* 采集波形 */
E_RETURN(_dau_wave_col_fault());
@ -1003,9 +850,10 @@ int32_t _dau_wave_col_trigger_by_fault(void)
#if 1
uint16_t *buf = (uint16_t*)(&dau_ctrl.buf_dau_rx[2]);
uint8_t i = 0;
uint8_t j = 0;
uint16_t k = 0;
addr = dau_ctrl.addr_fault;
uint32_t addr = dau_ctrl.addr_fault;
for(i = 0; i < 1; i++)
{
@ -1036,6 +884,11 @@ int32_t _dau_wave_col_trigger_by_fault(void)
}
#endif
#if 0
uint16_t *buf = NULL;
uint8_t i = 0;
uint8_t j = 0;
uint16_t k = 0;
for(i = 0; i < DAU_PORT_POWER_CNT; i++)
{
common_watchdog_set(COM_WDG_DAU);
@ -1083,7 +936,7 @@ int32_t _dau_wave_col_trigger_by_reg(void)
}
E_RETURN(_dau_wave_col_start());
//E_RETURN(_dau_wave_col_defect());
E_RETURN(_dau_wave_col_defect());
E_RETURN(_dau_wave_col_power(DAU_SOURCE_REG));
_dau_power_calculate(DAU_SOURCE_REG);
@ -1196,7 +1049,7 @@ static void _dau_init(void)
HAL_GPIO_WritePin(DAU_RST_GPIO_Port, DAU_RST_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(POWER_DAU_GPIO_Port, POWER_DAU_Pin, GPIO_PIN_SET);
osDelay(2500);
osDelay(2000);
//common_watchdog_set(COM_WDG_DAU);
//osDelay(10000);
//common_watchdog_set(COM_WDG_DAU);
@ -1213,19 +1066,23 @@ static void _dau_init(void)
}
}
if (!IS_MONITOR_BIT_SET(dev_config.flag, DEV_FLAG_ADJ))
{
/* 配置校准系数, 缺陷和故障因为都是 3 路, 统一使用一个寄存器组. */
for(i = 0; i < DAU_PORT_DEFECT_MAX - 1; i++)
for(i = 0; i < DAU_PORT_DEFECT_CNT; i++)
{
_dau_reg_write_port(i);
}
/* 触发阈值 */
*temp = 0xFFFF;
//*temp = dev_config.fault_threshold * 32768 / dev_config.fault_adj[i];
*temp = 0;
_dau_reg_write(DAU_REG_ADDR_GCFTTR, sizeof(uint16_t));
osDelay(500);
/* 开启 */
*temp = 1;
*temp = 1 ;
_dau_reg_write(0xf, sizeof(uint16_t));
}
}
/* description: DAU 主任务循环
@ -1254,6 +1111,12 @@ static void _dau_start(void *argument)
/* utc 对时处理 */
//_dau_utc();
/* 故障电流采集 */
_dau_wave_col_trigger_by_fault();
/* 循环工频缺陷电流采集 */
//_dau_wave_col_trigger_by_reg();
/* 处理升级 */
if (dau_ctrl.update_flag)
{
@ -1272,12 +1135,6 @@ static void _dau_start(void *argument)
flash_log_write(FLASH_LOG_TYPE_NOTIFY, "FPGA update %s!\r\n", dau_ctrl.update_rt == 1 ? "OK" : "ERROR");
}
/* 故障电流采集 */
//_dau_wave_col_trigger_by_fault();
/* 循环工频缺陷电流采集 */
_dau_wave_col_trigger_by_reg();
if (IS_MONITOR_BIT_SET(dau_ctrl.reg_flag, DAU_REG_PORT_WRITE))
{
MONITOR_BITMAP_RESET(dau_ctrl.reg_flag, DAU_REG_PORT_WRITE);
@ -1303,52 +1160,93 @@ static void _dau_start(void *argument)
}
}
/* description: DAU 校准任务循环
/* description: DAU 写端口配置寄存器报文发送
param:
return: */
static void _dau_adj_start(void *argument)
return: HAL_xxx */
int32_t _dau_adj_reg_write_port(uint32_t port)
{
//uint16_t *buf = (uint16_t*)(&dau_ctrl.buf_dau_rx[2]);
uint16_t *buf = NULL;
//uint32_t addr = 0;
uint8_t i = 0;
uint8_t j = 0;
uint16_t k = 0;
uint16_t *temp = (uint16_t*)&dau_ctrl.buf_dau_tx[2];
uint16_t addr = 0;
int32_t rv = HAL_ERROR;
/* 状态初始化 */
_dau_init();
/* 缺陷校准系数 */
addr = (port + 1) * DAU_REG_ADDR_PORT_BASE + DAU_REG_ADDR_PORT_DEFECT_BASE;
*temp = 0;
E_RETURN(_dau_reg_write(addr, sizeof(uint16_t)));
for (;;)
addr = (port + 1) * DAU_REG_ADDR_PORT_BASE + DAU_REG_ADDR_PORT_DEFECT_ADJ;
*temp = 32768;
E_RETURN(_dau_reg_write(addr, sizeof(uint16_t)));
/* 故障校准系数 */
addr = (port + 1) * DAU_REG_ADDR_PORT_BASE + DAU_REG_ADDR_PORT_FAULT_BASE;
*temp = 0;
E_RETURN(_dau_reg_write(addr, sizeof(uint16_t)));
addr = (port + 1) * DAU_REG_ADDR_PORT_BASE + DAU_REG_ADDR_PORT_FAULT_ADJ;
*temp = 32768;
E_RETURN(_dau_reg_write(addr, sizeof(uint16_t)));
return rv;
}
/* description: 寄存器触发波形采集
param:
return: HAL_xxx */
int32_t _dau_adj_wave_col_trigger_by_reg(void)
{
int32_t rv = HAL_ERROR;
E_RETURN(_dau_wave_col_start());
E_RETURN(_dau_wave_col_power(DAU_SOURCE_REG));
#if 0
uint16_t *buf = (uint16_t*)(&dau_ctrl.buf_dau_rx[2]);
uint32_t addr = dau_ctrl.addr_reg;
uint8_t i = 0;
uint8_t j = 0;
uint16_t k = 0;
//for(i = 0; i < DAU_PORT_DEFECT_CNT; i++)
for(i = 0; i < 1; i++)
{
osDelay(10000);
common_watchdog_set(COM_WDG_DAU);
if (g_is_adj_status == 1)
vty_print("DEFECT %x %d\r\n", addr, i);
for(j = 0; j < DAU_PKT_DEFECT_CNT; j++)
{
memset(dau_ctrl.reg_power, 0, sizeof(dau_ctrl.reg_power));
/* 读取全局状态寄存器 */
rv = _dau_reg_read_global_state();
if (rv != HAL_OK)
spi_flash_read(addr, &dau_ctrl.buf_dau_rx[2], 1024);
addr += DAU_PKT_DEFECT_BYTE_CNT;
for(k = 0; k < 512;)
{
vty_print("rv=%d\r\n", rv);
continue;
common_watchdog_set(COM_WDG_DAU);
vty_print("%04x ", buf[k++]);
if(0 == k % 32)
{
osDelay(100);
vty_print("\r\n");
}
/* 循环工频缺陷电流采集 */
dau_ctrl.col_time = 600000;
MONITOR_BITMAP_SET(dau_ctrl.col_flag, DAU_COL_FLAG_FAULT_CMP);
MONITOR_BITMAP_SET(dau_ctrl.col_flag, DAU_COL_FLAG_REG_CMP);
_dau_wave_col_trigger_by_reg();
}
if(k % 32 != 0)
{
osDelay(100);
vty_print("\r\n");
}
}
vty_print("\r\n");
}
#endif
#if 1
//for(i = 0; i < DAU_PORT_POWER_CNT; i++)
for(i = 0; i < 1; i++)
uint16_t *buf = (uint16_t*)(&dau_ctrl.buf_dau_rx[2]);
uint8_t i = 0;
uint8_t j = 0;
uint16_t k = 0;
//for(i = 5; i < DAU_PORT_POWER_CNT; i++)
for(i = 5; i < 6; i++)
{
common_watchdog_set(COM_WDG_DAU);
vty_print("POWER %d\r\n", i);
buf = (uint16_t*)dau_ctrl.reg_power[i];
for(j = 0; j < DAU_PKT_POWER_CNT; j++)
{
common_watchdog_set(COM_WDG_DAU);
for(k = 0; k < 512;)
{
vty_print("%-04x ", buf[k++]);
@ -1358,18 +1256,110 @@ static void _dau_adj_start(void *argument)
vty_print("\r\n");
}
}
/*if((j*512+k ) % 40 != 0)
{
osDelay(100);
vty_print("\r\n");
}*/
buf += 512;
}
vty_print("\r\n");
}
#endif
g_is_adj_status = 2;
_dau_base_auto(1, 0);
return rv;
}
/* description: DAU 校准任务循环
param:
return: */
static void _dau_adj_start(void *argument)
{
uint16_t *temp = (uint16_t*)&dau_ctrl.buf_dau_tx[2];
uint8_t i = 0;
/* 状态初始化 */
_dau_init();
for (;;)
{
if (DAU_ADJ_STATE_POWER == dau_adj_state)
{
_dau_adj_wave_col_trigger_by_reg();
dau_adj_state = DAU_ADJ_STATE_NONE;
}
else if(DAU_ADJ_STATE_DEFECT_ZERO == dau_adj_state
|| DAU_ADJ_STATE_DEFECT == dau_adj_state)
{
for(i = 0; i < DAU_PORT_DEFECT_CNT; i++)
{
_dau_adj_reg_write_port(i);
}
osDelay(5000);
_dau_reg_read_port_state();
dau_adj_state = DAU_ADJ_STATE_NONE;
}
else if(DAU_ADJ_STATE_FAULT_ZERO == dau_adj_state)
{
/* 恢复初始值 */
for(i = 0; i < DAU_PORT_DEFECT_CNT; i++)
{
_dau_adj_reg_write_port(i);
}
osDelay(5000);
/* 采集平均值 */
_dau_reg_read_port_state();
/* 下发零点采样值 */
for(i = 0; i < DAU_PORT_FAULT_CNT; i++)
{
if (!IS_MONITOR_BIT_SET(debug_adj_fault.bitmap, i))
{
continue;
}
dev_config.fault_base[i] = dau_ctrl.reg_port_state.FAVR[i];
}
for(i = 0; i < DAU_PORT_DEFECT_CNT; i++)
{
_dau_reg_write_port(i);
}
HAL_GPIO_WritePin(POWER_DAU_GPIO_Port, POWER_DAU_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(DAU_RST_GPIO_Port, DAU_RST_Pin, GPIO_PIN_RESET);
osDelay(1000);
HAL_GPIO_WritePin(DAU_RST_GPIO_Port, DAU_RST_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(POWER_DAU_GPIO_Port, POWER_DAU_Pin, GPIO_PIN_SET);
osDelay(2000);
/* 触发阈值 */
//*temp = 0x2800;
*temp = 0x0;
_dau_reg_write(DAU_REG_ADDR_GCFTTR, sizeof(uint16_t));
/* 开启 */
osDelay(500);
*temp = 1;
_dau_reg_write(0xf, sizeof(uint16_t));
dau_adj_state = DAU_ADJ_STATE_NONE;
}
else if(DAU_ADJ_STATE_FAULT == dau_adj_state)
{
osDelay(5000);
/* 读取全局寄存器判断故障是否被触发. */
_dau_reg_read_global_state();
/* 读取最大值. */
_dau_reg_read_port_state();
/* 开启 */
osDelay(500);
*temp = 0;
_dau_reg_write(0xf, sizeof(uint16_t));
dau_adj_state = DAU_ADJ_STATE_NONE;
}
else
{
osDelay(1000);
common_watchdog_set(COM_WDG_DAU);
}
}
}

@ -47,7 +47,7 @@
/* Private define ------------------------------------------------------------*/
#define DEV_FLASH_REPETITION 3 // 多次读取 flash 失败才认为失败.
#define DEV_VIN_ADJ_DEFAULT 5000
#define DEV_VIN_ADJ_DEFAULT 46189
/* Private macro -------------------------------------------------------------*/
#define DEV_IS_VERSION_CHG (strncmp((char*)dev_info.img_compile_time, COMPILE_TIME, DEV_COMPILE_TIME_LEN - 1) != 0)
@ -137,37 +137,41 @@ static HAL_StatusTypeDef _dev_config_default_set(void)
snprintf(dev_config.password, DEV_PASSWORD_LEN, "%s", DEV_DEFAULT_PASSWORD);
snprintf(dev_config.host, DEV_NAME_LEN, "%s", DEV_DEFAULT_HOST);
/* 默认工频校准系数 */
/* 默认校准系数 */
for(i = 0; i < DAU_PORT_POWER_CNT; i++)
{
dev_config.ADC_adj_point[i] = 29260;
if (i < 4)
{
dev_config.ADC_adj[i][0] = 46928;
dev_config.power_adj[i] = 46476;
dev_config.power_adj_point[i] = 46562;
}
else
{
dev_config.ADC_adj[i][0] = 2485;
dev_config.power_adj[i] = 42708;
dev_config.power_adj_point[i] = 42651;
}
}
dev_config.vin = DEV_VIN_ADJ_DEFAULT;
dev_config.vin_adj = DEV_VIN_ADJ_DEFAULT;
for(i = 0; i < DAU_PORT_DEFECT_MAX; i++)
{
dev_config.defect_base[i] = 0;
dev_config.defect_adj[i] = 3276;
dev_config.defect_base[i] = 34297;
dev_config.defect_adj[i] = 32768;
}
for(i = 0; i < DAU_PORT_FAULT_MAX; i++)
{
dev_config.fault_base[i] = 0;
dev_config.fault_adj[i] = 3276;
dev_config.fault_base[i] = 34530;
dev_config.fault_adj[i] = 32768;
}
dev_config.keepalive = 5;
dev_config.vin_adj = DEV_VIN_ADJ_DEFAULT;
/* 默认配置下发 */
dev_config.collect_interval = 10;
dev_config.keepalive = 5;
dev_config.power_threshold = 5;
dev_config.fault_threshold = 2000;
dev_config.defect_threshold = 1000;
snprintf(dev_config.APN, DEV_APN_LEN, "CMIOT");
dev_config.magic_bak = INIT_DONE_MAGIC;

@ -1477,7 +1477,7 @@ static void _wl_4G_send_realdata_fault(void)
for(i = 0; i < DAU_PORT_DEFECT_CNT; i++)
{
data->fault_trig[i] = dau_ctrl.fault_trig[i];
data->fault_trig[i] = dau_ctrl.fault_max[i];
}
for(i = 0; i < DAU_PORT_POWER_CNT; i++)

@ -356,7 +356,6 @@
<file>$PROJ_DIR$\..\Core\Inc\usart.h</file>
<file>$PROJ_DIR$\CableMonitor_APP_V3.2\Obj\stm32l4xx_hal_tim_ex.pbi</file>
<file>$PROJ_DIR$\CableMonitor_APP_V3.2\Obj\system_stm32l4xx.__cstat.et</file>
<file>$TOOLKIT_DIR$\inc\c\stdarg.h</file>
</outputs>
<file>
<name>[ROOT_NODE]</name>
@ -384,10 +383,6 @@
</tool>
</outputs>
<inputs>
<tool>
<name>BICOMP</name>
<file> 177 207 157 39 65 348 104 135 338 90 351 320 344 209 94 176 330 318 343 229 132 245 303 310 191 326 151 284 59 63 158 38 173 251 126 145 283 114 107 332 342 237 58 246 85 293 228 255 124 103 331 250 123 52 308 265 260 164 301 119 272 161 108 294 167 172 306 60 134 131 298 280 140 302 325 77 189</file>
</tool>
<tool>
<name>ICCARM</name>
<file> 60 94 177 246 85 293 104 145 326 283 228 65 59 255 124 151 284 161 63 330 294 167 172 343 318 108 272 157 176 103 135 331 250 123 229 158 52 308 306 134 265 38 260 338 164 131 301 39 119 173 245 298 251 280 140 126 302 325 132 320 77 114 189 348 107 303 332 344 90 342 310 237 207 58 191 209</file>
@ -457,10 +452,6 @@
</tool>
</outputs>
<inputs>
<tool>
<name>BICOMP</name>
<file> 151 123 59 124 260 161 114 332 104 255 331 308 301 167 172 177 131 65 237 94 326 103 250 52 265 164 119 272 108 294 330 134 60 344 90 246 85 293 176 284 157 63 318 343 245 189 251 126 132 145 135 229 158 306 38 338 39 173 320 298 280 140 302 325 77</file>
</tool>
<tool>
<name>ICCARM</name>
<file> 145 94 177 246 85 293 104 326 60 65 59 255 124 151 284 161 63 330 294 167 172 343 318 108 272 157 176 103 135 331 250 123 229 158 52 308 306 134 265 38 260 338 164 131 301 39 119 173 114 245 298 251 280 140 126 302 325 132 320 77 189 332 344 90 237</file>
@ -807,7 +798,7 @@
<inputs>
<tool>
<name>ICCARM</name>
<file> 60 94 177 246 85 293 104 145 326 348 65 59 255 124 151 284 161 63 330 294 167 172 343 318 108 272 157 176 103 135 331 250 123 229 158 52 308 306 134 265 38 260 338 164 131 301 39 119 173 332 114 245 298 251 280 140 126 302 325 132 320 77 189 344 90 191 58 207 237 209</file>
<file> 60 94 177 246 85 293 104 145 326 115 319 348 65 59 255 124 151 284 161 63 330 294 167 172 343 318 108 272 157 176 103 135 331 250 123 229 158 52 308 306 134 265 38 260 338 164 131 301 39 119 173 332 114 245 298 251 280 140 126 302 325 132 320 77 189 344 90 191 58 207 237 209</file>
</tool>
</inputs>
</file>
@ -1136,10 +1127,6 @@
</tool>
</outputs>
<inputs>
<tool>
<name>BICOMP</name>
<file> 103 164 94 151 298 330 207 104 52 272 140 114 320 156 191 177 250 265 119 108 157 245 283 303 58 209 326 59 255 124 331 123 308 260 301 161 167 172 306 65 302 77 90 145 348 107 332 344 237 246 85 293 228 176 284 63 294 135 229 158 38 338 39 173 280 325 60 318 343 134 131 189 251 126 132</file>
</tool>
<tool>
<name>ICCARM</name>
<file> 60 94 177 246 85 293 104 145 326 283 228 348 65 59 255 124 151 284 161 63 330 294 167 172 343 318 108 272 157 176 103 135 331 250 123 229 158 52 308 306 134 265 38 260 338 164 131 301 39 119 173 156 107 303 332 114 245 298 251 280 140 126 302 325 132 320 77 189 207 344 90 58 237 191 209</file>

@ -86,7 +86,7 @@
<RecentlyUsedMenus>1</RecentlyUsedMenus>
<MenuShadows>1</MenuShadows>
<ShowAllMenusAfterDelay>1</ShowAllMenusAfterDelay>
<CommandsUsage>2A0B00000E0040E10000020000005984000002000000568400000200000010860000100000000F810000010000005F860000070000000C810000DF0A000055840000030000000E810000080000000B810000110000000584000003000000108400001A00000046810000010000000D81000007000000</CommandsUsage>
<CommandsUsage>5A0B00000E0040E10000020000005984000002000000568400000200000010860000100000000F810000010000005F860000070000000C8100000A0B000055840000030000000E810000080000000B810000110000000584000003000000108400001F00000046810000010000000D81000007000000</CommandsUsage>
</MFCToolBarParameters>
<CommandManager>
<CommandsWithoutImages>49000D8400000F84000008840000FFFFFFFF54840000328100001C810000098400007784000007840000808C000044D50000538400000088000001880000028800000388000004880000058800001C8F00001D8F00001F8F0000208F0000218F00002AE10000118F000055840000568400005984000001B0000002B0000003B0000004B0000005B0000006B0000007B0000008B0000009B000000AB000000BB000000CB000000DB000000EB0000000B000002481000040E100000C840000338400007884000011840000008200001C820000018200006786000020DE000021DE000026DE000028DE000023DE000022DE000024DE000027DE000025DE000020920000289200002992000037920000389200003492000033920000259200001E9200001D920000</CommandsWithoutImages>
@ -381,7 +381,7 @@
</BasePane-34049>
<MFCToolBar-34050>
<Name>Main</Name>
<Buttons>00200000010000002000FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000035000000FFFEFF000000000000000000000000000100000001000000018001E100000000000036000000FFFEFF000000000000000000000000000100000001000000018003E100000000000038000000FFFEFF0000000000000000000000000001000000010000000180008100000000000019000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E10000000000003B000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E10000000004003D000000FFFEFF000000000000000000000000000100000001000000018022E10000000004003C000000FFFEFF000000000000000000000000000100000001000000018025E10000000000003F000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE100000000040042000000FFFEFF00000000000000000000000000010000000100000001802CE100000000040043000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6E4281000000000000FFFFFFFFFFFEFF0000000000000000000100000000000000010000007800000002002050FFFFFFFFFFFEFF0096000000000000000000018021810000000004002C000000FFFEFF000000000000000000000000000100000001000000018024E10000000000003E000000FFFEFF000000000000000000000000000100000001000000018028E100000000040040000000FFFEFF000000000000000000000000000100000001000000018029E100000000000041000000FFFEFF000000000000000000000000000100000001000000018002810000000000001B000000FFFEFF0000000000000000000000000001000000010000000180298100000000000030000000FFFEFF000000000000000000000000000100000001000000018027810000000000002E000000FFFEFF000000000000000000000000000100000001000000018028810000000000002F000000FFFEFF00000000000000000000000000010000000100000001801D8100000000040028000000FFFEFF00000000000000000000000000010000000100000001801E8100000000040029000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B810000000000001F000000FFFEFF00000000000000000000000000010000000100000001800D8100000000020021000000FFFEFF00000000000000000000000000010000000100000001805F8600000000000034000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800E8100000000000022000000FFFEFF00000000000000000000000000010000000100000001800F8100000000000023000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E00E8020000</Buttons>
<Buttons>00200000010000002000FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000035000000FFFEFF000000000000000000000000000100000001000000018001E100000000000036000000FFFEFF000000000000000000000000000100000001000000018003E100000000040038000000FFFEFF0000000000000000000000000001000000010000000180008100000000000019000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E10000000004003B000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E10000000004003D000000FFFEFF000000000000000000000000000100000001000000018022E10000000004003C000000FFFEFF000000000000000000000000000100000001000000018025E10000000004003F000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE100000000040042000000FFFEFF00000000000000000000000000010000000100000001802CE100000000040043000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6E4281000000000400FFFFFFFFFFFEFF0000000000000000000100000000000000010000007800000002002050FFFFFFFFFFFEFF0096000000000000000000018021810000000004002C000000FFFEFF000000000000000000000000000100000001000000018024E10000000004003E000000FFFEFF000000000000000000000000000100000001000000018028E100000000040040000000FFFEFF000000000000000000000000000100000001000000018029E100000000040041000000FFFEFF000000000000000000000000000100000001000000018002810000000004001B000000FFFEFF0000000000000000000000000001000000010000000180298100000000040030000000FFFEFF000000000000000000000000000100000001000000018027810000000004002E000000FFFEFF000000000000000000000000000100000001000000018028810000000004002F000000FFFEFF00000000000000000000000000010000000100000001801D8100000000000028000000FFFEFF00000000000000000000000000010000000100000001801E8100000000040029000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B810000000004001F000000FFFEFF00000000000000000000000000010000000100000001800D8100000000020021000000FFFEFF00000000000000000000000000010000000100000001805F8600000000000034000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800E8100000000000022000000FFFEFF00000000000000000000000000010000000100000001800F8100000000000023000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E00E8020000</Buttons>
</MFCToolBar-34050>
<Pane-34050>
<ID>34050</ID>
@ -419,7 +419,7 @@
</ChildIdMap>
<MDIWindows>
<MDIClientArea-0>
<MDITabsState>010000000300000001000000000000000000000001000000010000000200000000000000010000000100000000000000280000002800000001000000010000000000000001000000FFFEFF1A2400570053005F0044004900520024005C002E002E005C0043006F00720065005C005300720063005C0063006C0069002E00630001000000FFFF010014004966436F6E74656E7453746F72616765496D706CFFFEFF00FFFEFFFF22013C003F0078006D006C002000760065007200730069006F006E003D00220031002E0030002200200065006E0063006F00640069006E0067003D0022005500540046002D00380022003F003E000A003C0052006F006F0074003E000A0020002000200020003C004E0075006D0052006F00770073003E0031003C002F004E0075006D0052006F00770073003E000A0020002000200020003C004E0075006D0043006F006C0073003E0031003C002F004E0075006D0043006F006C0073003E000A0020002000200020003C00580050006F0073003E0030003C002F00580050006F0073003E000A0020002000200020003C00590050006F0073003E0030003C002F00590050006F0073003E000A0020002000200020003C00530065006C00530074006100720074003E0030003C002F00530065006C00530074006100720074003E000A0020002000200020003C00530065006C0045006E0064003E0030003C002F00530065006C0045006E0064003E000A0020002000200020003C00580050006F00730032003E0030003C002F00580050006F00730032003E000A0020002000200020003C00590050006F00730032003E003900340036003C002F00590050006F00730032003E000A0020002000200020003C00530065006C005300740061007200740032003E0030003C002F00530065006C005300740061007200740032003E000A0020002000200020003C00530065006C0045006E00640032003E0030003C002F00530065006C0045006E00640032003E000A003C002F0052006F006F0074003E000A00FFFEFF0563006C0069002E00630000000000FFFFFFFFFFFFFFFF0000000010000000C5D4F200FFDC7800BECEA100F0A0A100BCA8E1009CC1B600F7B88600D9ADC200A5C2D700B3A6BE00EAD6A300F6FA7D00B5E99D005FC3CF00C1838300CACAD500010000000100000002000000AC0100004900000080070000CC020000</MDITabsState>
<MDITabsState>010000000300000001000000000000000000000001000000010000000200000000000000010000000100000000000000280000002800000000000000</MDITabsState>
</MDIClientArea-0>
</MDIWindows>
</WindowStorage>

Loading…
Cancel
Save