152 lines
8.5 KiB
C
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
|