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

190 lines
9.4 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* @file diagnosis.h
* @author xxx
* @date 2023-09-05 09:18:39
* @brief 定位器诊断模块
* 诊断模块中的等级与D-31 扩展指令(压缩状态映射)绑定关系
* @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 3U // 防误判秒数
// 诊断等级
typedef enum
{
DIAGNOSIS_CLASS_NONE = 0, // 未使用的
DIAGNOSIS_CLASS_MAINT = 1, // 请求维护
DIAGNOSIS_CLASS_FAIL = 3, // 设备故障
DIAGNOSIS_CLASS_SPEC = 4, // 超出规格
DIAGNOSIS_CLASS_CHECK = 5, // 功能检查
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, ///< 存储器诊断 non_critical_nvm_alert
DIAGNOSIS_EEPROM_M95_2, ///< 存储器诊断
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, ///< 磁条诊断
DIAGNOSIS_MICRO_LOOP, ///< 小回路诊断 => mlfb_sensor_alarm
DIAGNOSIS_TRAVEL_SENSOR, ///< 行程传感器诊断 => travel_sensor_failure
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, ///< 存储器空间耗尽保护指示or写入保护 => 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_DEV_RESET, ///< 设备复位诊断
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
#pragma pack(1)
typedef struct
{
state_e diag_state; // 状态
} diag_storage_info_t;
// 诊断过程参数
typedef struct
{
BOOL change; // 状态是否改变
uint8_t start_tag; // 诊断开始标志
uint32_t start_time; // 用于记录诊断起始时间
} diag_process_t;
// 诊断信息
typedef struct
{
BOOL enable;
diag_item_e diag_id; // ID
diag_class_e diag_class; // 等级
state_e diag_state; // 状态
uint32_t timestamp;
diag_process_t process; // 诊断过程参数
} diag_msg_t;
// 诊断结果统计
typedef struct
{
uint8_t priority; // 故障最高等级
uint8_t cmd; // 故障处理方式
uint8_t record[DIAG_CLASS_NUM]; // 故障数量
diag_msg_t diag_msg[DIAGNOSIS_MENU_MAX]; // 诊断信息
} diag_result_t;
#pragma pack()
typedef struct
{
BOOL enable;
uint8_t diag_record_index[DIAGNOSIS_MENU_MAX]; // 用于观察哪些项目有错误,设备复位后会重新计时
uint8_t record_count[DIAG_CLASS_NUM];
uint8_t fail_total_1; // 故障总数从record中统计
uint8_t fail_total_2; // 故障总数从diag_record_index中统计
hart_device_specific_status_u device_specific_status; // 设备特定状态
} diag_t;
typedef struct
{
diag_class_e diag_class;
diag_item_e diag_id;
state_e diag_state;
} diagnosis_log_data_t; ///< 诊断日志数据
#pragma pack(1)
typedef struct
{
diagnosis_log_data_t data;
uint32_t timestamp;
} diagnosis_log_data_node_t; ///< 诊断日志数据响应
#pragma pack()
extern file_storage_t nvm1_file_storage; // 保存报警日志
extern diag_result_t diag_result; ///< 诊断结果
extern void diagnosis_init(void); ///< 诊断模块初始化
extern diag_t *diagnosis_get(void); ///< 获取诊断对象
extern void diagnosis_param_restart(void); ///< 诊断模块恢复出厂设置
extern void power_on_diagnosis(void); ///< 开机自检
extern void diagnosis_inspection(void); ///< 过程诊断
extern void diagnosis_synchronous(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 BOOL get_diagnosis_alarm(uint8_t id); ///< 获取诊断报警
#endif