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

127 lines
4.9 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"
// 诊断等级
typedef enum
{
DIAGNOSIS_CLASS_FAIL = 0, // 设备故障
DIAGNOSIS_CLASS_SPEC, // 超出规格
DIAGNOSIS_CLASS_CHECK, // 功能检查
DIAGNOSIS_CLASS_MAINT, // 请求维护
DIAGNOSIS_CLASS_OK, // 诊断正常
} diag_class_e;
#define DIAG_FAULT_CLASS_NUM DIAGNOSIS_CLASS_OK
// 设备故障诊断
typedef enum
{
DIAGNOSIS_VREF = 0, ///< 基准电压诊断 => 供电系统故障
DIAGNOSIS_INPUT_UPPER, ///< 输入电流上限诊断 => 驱动电流报警
DIAGNOSIS_INPUT_LOWER, ///< 输入电流下限诊断
DIAGNOSIS_IP_DRIVER, ///< I/P驱动诊断
DIAGNOSIS_EEPROM_M95_1, ///< 存储器诊断 M95_1
DIAGNOSIS_EEPROM_M95_2, ///< 存储器诊断 M95_1
DIAGNOSIS_EEPROM_FM24, ///< 存储器诊断 FM24
DIAGNOSIS_EEPROM_LC02, ///< 存储器诊断 LC02
DIAGNOSIS_RTC, ///< RTC诊断
DIAGNOSIS_MAGNET, ///< 磁条诊断
DIAGNOSIS_MICRO_LOOP, ///< 小回路诊断
DIAGNOSIS_PRESS_SENSOR_S, ///< 压力传感器S诊断 => 气源压力传感器故障
DIAGNOSIS_PRESS_SENSOR_A, ///< 压力传感器A诊断 => 阀口A压力传感器故障
DIAGNOSIS_PRESS_SENSOR_B, ///< 压力传感器B诊断 => 阀口B压力传感器故障
DIAGNOSIS_FAIL_MAX,
} diag_fail_e;
// 超出规格诊断
typedef enum
{
DIAGNOSIS_TEMPERATURE_UPPER = 0, ///< 温度上限诊断
DIAGNOSIS_TEMPERATURE_LOWER, ///< 温度下限诊断
DIAGNOSIS_SUPPLY_UPPER, ///< 气源压力上限诊断
DIAGNOSIS_SUPPLY_LOWER, ///< 气源压力下限诊断
DIAGNOSIS_SUPPLY_ERROR, ///< 气源压力偏差诊断
DIAGNOSIS_FRICTION_UPPER, ///< 摩擦力上限诊断
DIAGNOSIS_FRICTION_LOWER, ///< 摩擦力下限诊断
DIAGNOSIS_ELASTICITY_UPPER, ///< 弹簧力上限诊断
DIAGNOSIS_ELASTICITY_LOWER, ///< 弹簧力下限诊断
DIAGNOSIS_TRAVEL_UPPER, ///< 行程上限诊断
DIAGNOSIS_TRAVEL_LOWER, ///< 行程下限诊断
DIAGNOSIS_TRAVEL_ERROR, ///< 行程偏差诊断
DIAGNOSIS_SPEC_MAX,
} diag_spec_e;
// 功能检查诊断
typedef enum
{
DIAGNOSIS_DRIVER_SWO1 = 0, ///< SWO1诊断
DIAGNOSIS_DRIVER_SWO2, ///< SW O2诊断
DIAGNOSIS_DRIVER_OUTPUT, ///< 4~20ma输出诊断
DIAGNOSIS_CHECK_MAX,
} diag_check_e;
// 请求维护诊断
typedef enum
{
DIAGNOSIS_CPU_USAGE = 0, ///< CPU使用率诊断
DIAGNOSIS_MEM_USAGE, ///< 内存使用率诊断
DIAGNOSIS_TRAVEL_SUM, ///< 行程累计诊断
DIAGNOSIS_ACT_SUM, ///< 动作次数诊断
DIAGNOSIS_DEV_REALTIME, ///< 设备时间诊断
DIAGNOSIS_MAINT_MAX,
} diag_maint_e;
// 诊断信息
typedef struct
{
uint8_t diag_state; // 状态
uDateTime_TypeDef last_mark_time; // 故障产生时间
uDateTime_TypeDef last_clear_time; // 故障清除时间
} diag_msg_t;
// 诊断记录
typedef struct
{
uint8_t fault_cnt; // 故障数量
diag_msg_t *fault_msg; // 故障信息
} diag_class_record_t;
// 诊断结果统计
typedef struct
{
diag_class_e priority; // 故障最高等级
diag_class_record_t record[DIAG_FAULT_CLASS_NUM]; // 设备故障
alarm_handle_mode_e cmd; // 故障处理
} diag_result_t;
// 诊断过程参数
typedef struct
{
uint8_t start_tag; // 诊断开始标志
uint32_t start_time; // 用于记录诊断起始时间
float32 start_target; // 用于记录诊断起始目标
float32 start_actual; // 用于记录诊断起始实际
} diag_process_t;
extern diag_result_t diag_result;
extern void diagnosis_init(void); ///< 诊断模块初始化
extern void power_on_diagnosis(void); ///< 开机自检
extern void diagnosis_inspection(void); ///< 过程诊断
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_fault_set(diag_class_e class, uint8_t code, uint8_t state); ///< 设置故障状态
extern uint8_t get_diagnosis_fault_num(diag_class_e cls); ///< 获取故障数量
extern state_e get_diagnosis_fault_result(diag_class_e cls, uint8_t code); ///< 获取故障状态
#endif