This repository has been archived on 2025-02-28. You can view files and clone it, but cannot push or open issues or pull requests.
controller-hd/User/application/inc/diagnosis.h

152 lines
8.5 KiB
C

/**
* @file diagnosis.h
* @author xxx
* @date 2023-09-05 09:18:39
* @brief 定位器诊断模块
* @copyright Copyright (c) 2023 by xxx, All Rights Reserved.
*/
#ifndef __DIAGNOSIS_H__
#define __DIAGNOSIS_H__
#include "lib.h"
#include "entity.h"
#define DIAGNOSIS_ALARM_TIME_SEC 5U // 防误判秒数
// 诊断等级
typedef enum
{
DIAGNOSIS_CLASS_FAIL = 0, // 设备故障
DIAGNOSIS_CLASS_SPEC, // 超出规格
DIAGNOSIS_CLASS_MAINT, // 请求维护
DIAGNOSIS_CLASS_CHECK, // 功能检查
DIAGNOSIS_CLASS_NONE, // 未使用的
DIAGNOSIS_CLASS_OK, // 诊断正常
} diag_class_e;
#define DIAG_CLASS_NUM DIAGNOSIS_CLASS_OK
/* 注意:新增某个级别的诊断项目时,必须在该级别的后面添加,不能在前面添加 */
typedef enum
{
/****************************************** DIAGNOSIS_CLASS_FAIL *********************************************/
DIAGNOSIS_VREF = 0, ///< 基准电压诊断 => reference_voltage_failure
DIAGNOSIS_INPUT, ///< 输入电流诊断
DIAGNOSIS_IP_DRIVER, ///< I/P驱动诊断 => drive_current_failure
DIAGNOSIS_EEPROM_M95_1, ///< 存储器诊断 critical_nvm_failure
DIAGNOSIS_EEPROM_M95_2, ///< 存储器诊断 non_critical_nvm_alert
DIAGNOSIS_EEPROM_FM24, ///< 存储器诊断 critical_nvm_failure
DIAGNOSIS_EEPROM_LC02, ///< 存储器诊断 critical_nvm_failure
DIAGNOSIS_CRITICAL_NVM, ///< 主要存储器诊断 => critical_nvm_failure
DIAGNOSIS_NON_CRITICAL_NVM, ///< 次要存储器诊断 => non_critical_nvm_alert
DIAGNOSIS_RTC, ///< RTC诊断
DIAGNOSIS_MAGNET, ///< 磁条诊断 => travel_sensor_failure
DIAGNOSIS_MICRO_LOOP, ///< 小回路诊断 => mlfb_sensor_alarm
DIAGNOSIS_PRESS_SENSOR_S, ///< 压力传感器S诊断
DIAGNOSIS_PRESS_SENSOR_A, ///< 压力传感器A诊断
DIAGNOSIS_PRESS_SENSOR_B, ///< 压力传感器B诊断
DIAGNOSIS_PRESS_SENSOR, ///< 压力传感器诊断 => pressure_sensor_failure
DIAGNOSIS_TEMPERATURE_SENSOR, ///< 温度传感器诊断 => temperature_sensor_failure
DIAGNOSIS_FLASH_INTEGRITY, ///< FLASH相关诊断 => flash_integrity_failure
DIAGNOSIS_DRIVE_SIGNAL, ///< 驱动信号诊断 => drive_signal_alert
DIAGNOSIS_OUTPUT_CIRCUIT_ERROR, ///< 输出电路诊断 => output_circuit_error
/****************************************** DIAGNOSIS_CLASS_SPEC *********************************************/
DIAGNOSIS_TEMPERATURE_UPPER, ///< 温度上限诊断
DIAGNOSIS_TEMPERATURE_LOWER, ///< 温度下限诊断
DIAGNOSIS_SUPPLY_UPPER, ///< 气源压力上限诊断 => supply_pressure_high_alert
DIAGNOSIS_SUPPLY_LOWER, ///< 气源压力下限诊断 => supply_pressure_low_alert
DIAGNOSIS_FRICTION_UPPER, ///< 摩擦力上限诊断
DIAGNOSIS_FRICTION_LOWER, ///< 摩擦力下限诊断
DIAGNOSIS_ELASTICITY_UPPER, ///< 弹簧力上限诊断
DIAGNOSIS_ELASTICITY_LOWER, ///< 弹簧力下限诊断
DIAGNOSIS_TRAVEL_HI, ///< 行程上限诊断 => travel_alert_hi
DIAGNOSIS_TRAVEL_LO, ///< 行程下限诊断 => travel_alert_lo
DIAGNOSIS_TRAVEL_HI_HI, ///< 行程上限过高诊断 => travel_alert_hi_hi
DIAGNOSIS_TRAVEL_LO_LO, ///< 行程下限过低诊断 => travel_alert_lo_lo
DIAGNOSIS_TRAVEL_ERROR, ///< 行程偏差诊断 => travel_deviation_alert
DIAGNOSIS_OUTPUT_PRESS_LIMIT, ///< 输出压力限制诊断 => output_pressure_limiting
DIAGNOSIS_PRESS_ERROR, ///< 压力偏差诊断 => end_point_pressure_deviation_alert
DIAGNOSIS_UI_SATURATED_LOW, ///< 积分饱和下限诊断 => integrator_saturated_low_alert
DIAGNOSIS_UI_SATURATED_HIGH, ///< 积分饱和上限诊断 => integrator_saturated_high_alert
DIAGNOSIS_LIMIT_CUTOFF_LO, ///< 切割点下限诊断 => travel_limit_cutoff_lo_alert
DIAGNOSIS_LIMIT_CUTOFF_HI, ///< 切割点上限诊断 => travel_limit_cutoff_hi_alert
/****************************************** DIAGNOSIS_CLASS_MAINT *********************************************/
INDICATE_AUTO_CALIBRATION, ///< 自动校准正在进行指示 => auto_cal_in_progress_alert
INDICATE_PRESS_ACTIVE, ///< 切换压力控制指示 => pressure_fallback_active_alert
INDICATE_TEST_PROGRESS, ///< 诊断测试正在进行指示 => diagnostics_in_progress_alert
INDICATE_CALIBRATION, ///< 校准正在进行指示 => calibration_in_progress_alert
INDICATE_ALERT_RECORD_NOT_EMPTY, ///< 报警记录不为空指示 => alert_record_not_empty_alert
INDICATE_ALERT_RECORD_FULL, ///< 报警记录已满指示 => alert_record_full_alert
INDICATE_OFFLINE, ///< 离线状态指示 => offline_failed_alert
INDICATE_NVM_PROTECT_MODE, ///< 存储器空间耗尽保护指示 => nvm_protective_mode
INDICATE_DIAG_DATA_AVAILABLE, ///< 诊断数据可用指示 => diagnostic_data_available_alert
/****************************************** DIAGNOSIS_CLASS_CHECK *********************************************/
DIAGNOSIS_CPU_USAGE, ///< CPU使用率诊断
DIAGNOSIS_MEM_USAGE, ///< 内存使用率诊断
DIAGNOSIS_TRAVEL_SUM, ///< 行程累计诊断 => travel_accumulator_high_alert
DIAGNOSIS_ACT_SUM, ///< 动作次数诊断 => cycle_counter_high_alert
DIAGNOSIS_DEV_REALTIME, ///< 设备时间诊断 => instrument_time_is_approximate_alert
DIAGNOSIS_MENU_MAX, // 到达结尾
} diag_item_e;
#define DEFALT_CLASS_FAIL_MIN_NUM 0
#define DEFALT_CLASS_FAIL_MAX_NUM DIAGNOSIS_TEMPERATURE_UPPER
#define DEFALT_CLASS_SPEC_MIN_NUM DIAGNOSIS_TEMPERATURE_UPPER
#define DEFALT_CLASS_SPEC_MAX_NUM INDICATE_AUTO_CALIBRATION
#define DEFALT_CLASS_MAINT_MIN_NUM INDICATE_AUTO_CALIBRATION
#define DEFALT_CLASS_MAINT_MAX_NUM DIAGNOSIS_CPU_USAGE
#define DEFALT_CLASS_CHECK_MIN_NUM DIAGNOSIS_CPU_USAGE
#define DEFALT_CLASS_CHECK_MAX_NUM DIAGNOSIS_MENU_MAX
// 诊断过程参数
typedef struct
{
uint8_t start_tag; // 诊断开始标志
uint32_t start_time; // 用于记录诊断起始时间
} diag_process_t;
// 诊断信息
typedef struct
{
uint8_t diag_id; // ID
uint8_t diag_class; // 等级
uint8_t diag_state; // 状态
date_time_t last_mark_time; // 故障产生时间
date_time_t last_clear_time; // 故障清除时间
// 不用记录到存储中的参数
diag_process_t process; // 诊断过程参数
} diag_msg_t; // 长度 = 3+6+6 = 15
// 诊断结果统计
typedef struct
{
uint8_t priority; // 故障最高等级
uint8_t cmd; // 故障处理方式
uint8_t record[DIAG_CLASS_NUM]; // 故障数量
diag_msg_t diag_msg[DIAGNOSIS_MENU_MAX]; // 诊断信息
uint32_t crc; // CRC校验
} diag_result_t;
extern diag_result_t diag_result; ///< 诊断结果
extern void diagnosis_init(void); ///< 诊断模块初始化
extern void diagnosis_param_restart(void); ///< 诊断模块恢复出厂设置
extern void power_on_diagnosis(void); ///< 开机自检
extern void diagnosis_inspection(void); ///< 过程诊断
extern void diagnosis_fault_indicate(diag_class_e sta); ///< 故障指示
extern void diagnosis_fault_deal(void); ///< 故障处理
extern void diagnosis_driver_swo1(float32 cmd); ///< SWO1测试
extern void diagnosis_driver_swo2(float32 cmd); ///< SWO2测试
extern void diagnosis_driver_output(float32 cmd); ///< PWM输出测试
extern void diagnosis_set_status(uint8_t id, state_e state); ///< 设置故障状态
extern uint8_t get_diagnosis_items_num(diag_class_e cls); ///< 获取诊断项数量
extern uint8_t get_diagnosis_fault_num(diag_class_e cls); ///< 获取故障数量
extern state_e get_diagnosis_fault_result(uint8_t id); ///< 获取故障状态
extern diag_class_e get_diagnosis_fault_priority(void); ///< 获取故障优先级
extern diag_result_t *get_diagnosis_result(void); ///< 获取诊断结果对象
extern state_e get_diagnosis_fault_result_of_enable_state(uint8_t id); ///< 基于标志使能状态获取诊断状态
#endif