/** * @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