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/app_hart_user.h

694 lines
28 KiB
C
Raw Permalink 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 app_hart_user.h
* @author xxx
* @date 2024-08-06 08:17:13
* @brief HART扩展协议
* @copyright Copyright (c) 2024 by xxx, All Rights Reserved.
*/
#ifndef __APP_HART_USER_H
#define __APP_HART_USER_H
#include "lib.h"
#include "hart.h"
#include "hart_frame.h"
#include "hart_frame_user.h"
#pragma pack(1)
// 规格表数据
typedef struct
{
uint8_t ss2_ver; // 版本
uint8_t ss2_u_travel; // 行程单位
uint8_t ss2_u_length; // 长度单位
uint8_t ss2_u_area; // 面积单位
uint8_t ss2_u_torque; // 扭矩单位
uint8_t ss2_u_springrate; // 弹簧力单位
uint32_t ss2_v_manuf; // 阀门制造商
uint16_t ss2_v_model; // 阀门型号
uint16_t ss2_v_size; // 阀门尺寸
uint8_t ss2_v_class; // 阀门等级
float32_t ss2_v_rated_travel; // 阀门额定行程
float32_t ss2_v_actual_travel; // 阀门实际行程
float32_t ss2_v_stem_size; // 阀杆直径
uint8_t ss2_v_packing; // 阀门填料类型
float32_t ss2_v_inlet_press; // 阀门入口压力
float32_t ss2_v_outlet_press; // 阀门出口压力
float32_t ss2_v_dyn_torque; // 阀门动态扭矩
float32_t ss2_v_breakout_torque; // 阀门突破扭矩
uint8_t ss2_t_seat_type; // 阀座类型
uint8_t ss2_t_class; // 阀门泄露等级
float32_t ss2_t_port_diam; // 阀门端口直径
uint8_t ss2_t_port_type_ss2_t_flow_dir_ss2_t_pdt_ss2_t_ftt; // 阀门端口类型、流向、按下类型、流动趋势
float32_t ss2_t_unbal_area; // 不平衡面积
uint32_t ss2_a_manuf; // 执行机构制造商
uint16_t ss2_a_model; // 执行机构型号
uint16_t ss2_a_size; // 执行机构尺寸
float32_t ss2_a_eff_area; // 执行机构有效面积
uint8_t ss2_a_air; // 执行机构气源
uint8_t ss2_a_lever_style; // 执行机构杠杆类型
float32_t ss2_a_bench_lo; // 执行机构下限设置
float32_t ss2_a_bench_hi; // 执行机构上限设置
float32_t ss2_a_nom_press; // 执行机构额定供应压力
float32_t ss2_a_springrate; // 执行机构弹簧率
float32_t ss2_a_lever_arm_length; // 执行机构杠杆臂长度
uint8_t ss2_acc_vol_booster_ss2_acc_quick_rel; // 执行机构体积助推器快速释放(增速器、快排阀)
uint8_t ss2_acc_sol_valve; // 执行机构电磁阀
uint8_t ss2_acc_pos_xmtr; // 执行机构位置变送器
uint8_t ss2_acc_lim_sw_open_ss2_acc_lim_sw_closed; // 执行机构限位开关,阀门打开限位开关,阀门关闭
uint8_t ss2_t_trim1; // 阀内件样式
uint8_t reserve_1[26]; // 保留
uint8_t ss2_t_trim1_str[20]; // 其他修整样式
uint8_t ss2_v_manuf_str[20]; // 其他阀门制造商
uint8_t ss2_v_model_str[20]; // 其他阀门型号
uint8_t ss2_v_size_str[20]; // 其他阀门尺寸
uint8_t ss2_v_class_str[20]; // 其他阀门等级
uint8_t ss2_v_packing_str[20]; // 其他阀门填料
uint8_t ss2_t_seat_type_str[20]; // 其他座类型
uint8_t ss2_a_manuf_str[20]; // 其他执行机构制造商
uint8_t ss2_a_model_str[20]; // 其他执行机构型号
uint8_t ss2_a_size_str[20]; // 其他执行机构尺寸
uint8_t ss2_a_lever_style_str[20]; // 其他杠杆样式
uint8_t ss2_acc_vol_booster_str[20]; // 其他体积助推器(增速器)
uint8_t ss2_acc_quick_rel_str[20]; // 其他快速释放
uint8_t ss2_acc_sol_valve_str[20]; // 其他电磁阀
uint8_t ss2_acc_pos_xmtr_str[20]; // 其他位置发射器
uint8_t ss2_acc_lim_sw_open_str[20]; // 其他限位开关 - 阀门打开
uint8_t ss2_acc_lim_sw_closed_str[20]; // 其他限位开关 - 阀门关闭
uint8_t reserve_2[40]; // 保留
float32_t ss2_v_rated_pressure; // 阀门额定压力
float32_t ss2_a_rangemax_spring; // 执行机构-弹簧最大值
float32_t ss2_a_rangemin_spring; // 执行机构-弹簧最小值
float32_t ss2_v_nominal_diameter; // 阀门公称通径
} specification_table_data_t;
#pragma pack()
typedef enum
{
HART_STATE_COMMAND_31_NONE = 0, // 无状态
HART_STATE_COMMAND_31_MAINTENANCE_REQUIRED = 1, // 需要维护
HART_STATE_COMMAND_31_FAILURE = 3, // 故障
HART_STATE_COMMAND_31_OUT_OF_SPECIFICATION = 4, // 超出规格
HART_STATE_COMMAND_31_FUNCTION_CHECK = 5, // 功能检查
} hart_state_command_31_e;
typedef enum
{
HART_TUNING_ENTER = 0, // 校准进入
HART_TUNING_EXIT, // 校准退出
HART_RESTORE_FACTORY, // 恢复出厂
HART_TUNING_AUTO, // 自动校准
HART_TUNING_AUTO_MIN, // 小回路校准
} hart_tuning_e;
// 文件状态代码
typedef enum
{
FILE_STATUS_NOT_READ_WRITE = 1, // 不可读
FILE_STATUS_READ_ONLY = 2, // 只读
FILE_STATUS_WRITE_ONLY = 3, // 只写
FILE_STATUS_READ_WRITE = 4, // 可读可写
} file_status_e;
// 制造信息
typedef enum
{
HART_MAN_INFO = 0, // 制造信息
HART_MAN_SCHEME = 1, // 制造方案
} hart_man_info_e;
// 诊断类型
typedef enum
{
DIAG_TYPE_OFFLINE_COMMANDED = 0, // 离线命令:表示诊断是在设备离线状态下由用户或系统命令触发的
DIAG_TYPE_OFFLINE_PTCWITH_CUTOFFS, // 离线PTC带截止表示诊断是在离线状态下进行并且带有特定的截止条件
DIAG_TYPE_OFFLINE_PTCWITHOUT_CUTOFFS, // 离线PTC无截止表示诊断是在离线状态下进行但不包含特定的截止条件
DIAG_TYPE_PROCESS, // 过程诊断:表示诊断是在设备的正常运行过程中进行的
DIAG_TYPE_OFFLINE_SCRIPTED, // 离线脚本:表示诊断是通过执行预定的脚本在离线状态下触发的
DIAG_TYPE_ONLINE_COMMANDED = 5, // 在线命令:表示诊断是在设备在线状态下由用户或系统命令触发的
DIAG_TYPE_ONLINE_TRAVEL_TRIGGERED, // 在线行程触发:表示诊断是在设备在线状态下,由设备的某种行程(如移动距离)触发的
DIAG_TYPE_ONLINE_AUX_TRIGGERED, // 在线辅助触发:表示诊断是在设备在线状态下,由某种辅助设备或信号触发的
DIAG_TYPE_SOVTEST = 13, // SOV测试可能表示对某种安全输出阀Safety Output Valve的测试
DIAG_TYPE_OFFLINE_SINE_COMMANDED = 50, // 离线SINE命令表示诊断是在离线状态下由SINE信号触发的
} diag_type_e;
#pragma pack(1)
// 133-读取文件信息
typedef struct
{
uint16_t readwrite_bytes; // 读写字节个数
uint16_t max_bytes; // 最大字节数
uint8_t write_access_control; // 写访问控制
} hart_read_file_information_t; // 命令133响应数据
// 138-读取其他状态
typedef union
{
uint8_t data[7];
struct
{
struct
{
uint8_t stem_position_sensor_fail : 1; // 行程传感器故障
uint8_t pressure_sensor_fail : 1; // 压力传感器故障
uint8_t temp_sensor_fail : 1; // 温度传感器故障
uint8_t nvm_alert : 1; // NVM警报
uint8_t drive_current_fail : 1; // 驱动电流故障
uint8_t ref_voltage_fail_and_ram_fail : 1; // 参考电压故障和RAM故障 2个变量共用一个bit
uint8_t mlfb_sensor_fail_and_no_free_time : 1; // 小回路传感器故障和无空闲时间 2个变量共用一个bit
uint8_t flash_crc_error : 1; // 闪存CRC错误
} hard_failures;
struct
{
uint8_t auto_cal_in_progress6k_and_auto_tune_in_progress6k : 1; // 自动校准进行中和自动整定进行中 2个变量共用一个bit
uint8_t nvm_protective_mode_and_input_char_selected : 1; // NVM保护模式和输入特性选择 2个变量共用一个bit
uint8_t program_flow_and_set_point_char_selected : 1; // 程序流程和设定点特性选择 2个变量共用一个bit
uint8_t press_fallback_and_alternate_servo_range : 1; // 压力回落和备用伺服范围 2个变量共用一个bit
uint8_t diag_in_progress : 1; // 诊断进行中
uint8_t cal_in_progress : 1; // 校准进行中
uint8_t lcpdemand_and_auto_tune_in_progress2k_and_servo_dynamic_bypass : 1; // LCP本地控制面板需求、自动调谐进行中、伺服动态旁路 3个变量共用一个bit
uint8_t aernot_empty_and_auto_cal_in_progress : 1; // 报警记录不为空和自动校准进行中 2个变量共用一个bit
} status_integ_1;
struct
{
uint8_t aux_alarm_alert : 1; // 辅助报警警报
uint8_t offline_or_failed : 1; // 离线或失败
uint8_t aeris_full_and_burst_comm_timeout : 1; // 报警记录满和突发通信超时 2个变量共用一个bit
uint8_t time_invalid_and_friction_alert : 1; // 时间无效和摩擦警报 2个变量共用一个bit
uint8_t accumulator_alert : 1; // 累加器警报
uint8_t cycle_counter_alert : 1; // 周期计数器警报
uint8_t non_critical_nvm_alert : 1; // 非关键NVM警报
uint8_t multidrop_and_sisoverride_fail_and_pid_auto_tune_in_progress : 1; // 多点通信、SIS安全仪表系统覆盖失败、PID 自动调谐进行中 3个变量共用一个bit
} status_integ_2;
struct
{
uint8_t integrator_saturated_lo_and_loop_arwlo : 1; // 积分饱和低和回路低 2个变量共用一个bit
uint8_t integrator_saturated_hi_and_loop_arwhi : 1; // 积分饱和高和回路高 2个变量共用一个bit
uint8_t low_power : 1; // 低功耗
uint8_t locked_in_safety : 1; // 安全锁定
uint8_t press_dev : 1; // 压力偏差
uint8_t supply_pressure : 1; // 供应压力
uint8_t valve_stuck : 1; // 阀门卡住
uint8_t is_diag_data_in_diag_buffer : 1; // 诊断数据在诊断缓冲区
} alarm_1;
struct
{
uint8_t output_bad : 1; // 输出故障
uint8_t loop_set_point_lo : 1; // 回路设定点低
uint8_t loop_set_point_hi : 1; // 回路设定点高
uint8_t loop_deviation : 1; // 回路偏差
uint8_t loop_feedback_hi_hi : 1; // 回路反馈高点高
uint8_t loop_feedback_hi : 1; // 回路反馈高,反馈大于设定点
uint8_t loop_feedback_lo_lo : 1; // 回路反馈低点低
uint8_t loop_feedback_lo : 1; // 回路反馈低,反馈小于设定点
} alarm_2;
struct
{
uint8_t limit_switch1closed : 1; // 限位开关1关闭
uint8_t limit_switch2closed : 1; // 限位开关2关闭
uint8_t option_module_error : 1; // 选项模块错误
uint8_t lcpcomm : 1; // LCP通信
} status;
struct
{
uint8_t maint_required : 1; // 需要维护
uint8_t dev_var_out_of_range : 1; // 设备变量超出范围
uint8_t power_critically_low : 1; // 电源严重不足
uint8_t fault : 1; // 故障
uint8_t ne107out_of_spec : 1; // 超出规格
uint8_t function_check : 1; // 功能检查
} extended_status;
} bits;
} hart_other_status_u;
// 140-读取触发器定义的内容
typedef struct
{
uint16_t start_addr; // 触发器起始地址
uint8_t trigger_type; // 诊断类型类型
uint8_t variable_1; // 变量1
uint8_t variable_2; // 变量2
uint8_t variable_3; // 变量3
uint8_t variable_4; // 变量4
uint8_t acquisition_time; // 采集时间
uint16_t data_points; // 数据点数
uint8_t trigger_enable; // 触发器事件
uint32_t unknow; // 未知
} hart_read_trigger_definition_t;
// 146-读取标准跨度信息
typedef struct
{
uint16_t upper_limit_of_span; // 标准跨度上限
uint16_t lower_limit_of_span; // 标准跨度下限
uint16_t flash_address; // 非易失性存储器地址
uint16_t download_address; // 下载状态地址
} hart_standard_span_information_t;
// 155-执行诊断
typedef struct
{
uint8_t undefine[HART_PACKED4_LEN]; // 不处理
uint8_t variable_code[HART_PACKED4_LEN]; // 设备变量和HART中的设备变量有关系
uint8_t sampling_time; // 采样时间 sampling_time*12.5ms
uint16_t target; // 目标行程 (target-2048)/8192
uint16_t ramp; // 斜率
uint16_t points; // 总数据点
} hart_diagnosis_slope_t;
typedef struct
{
uint8_t variable_code[HART_PACKED4_LEN]; // 设备变量和HART中的设备变量有关系
uint8_t sampling_time; // 采样时间 sampling_time*12.5ms
uint16_t start_target; // 开始行程 (start_target-2048)/8192
uint16_t amplitude; // 振幅 (amplitude-2048)/8192
uint32_t frequency; // 频率
uint16_t undefine; // 不处理
} hart_diagnosis_sine_t;
typedef union
{
hart_diagnosis_slope_t diagnosis_slope;
hart_diagnosis_sine_t diagnosis_sine;
} hart_diagnosis_type_u;
typedef struct
{
uint8_t diag_type; // 诊断类型 见diag_type_e
hart_diagnosis_type_u diag_type_u;
} hart_diagnosis_t;
// 158-在线诊断测试
typedef struct
{
uint8_t diag_type; // 诊断类型 diag_type_e
uint8_t v1; // 变量1
uint8_t v2; // 变量2
uint8_t v3; // 变量3
uint8_t v4; // 变量4
uint8_t collection_time; // 采集时间
uint16_t total_data_points; // 总数据点
} mode_diagnosis_test_t;
// D-31 扩展指令(压缩状态映射)
typedef union
{
uint8_t data[28];
struct
{
struct
{
uint8_t reserved1 : 4; // 保留
uint8_t reserved2 : 4; // 保留
} u0;
struct
{
uint8_t csm_loop_current : 4; // 回路电流校准警报
uint8_t reserved : 4; // 保留
} u1;
uint8_t csm_reserved_2; // 保留
uint8_t csm_reserved_3; // 保留
struct
{
uint8_t csm_travel_sensor : 4; // 行程传感器故障
uint8_t reserved : 4; // 保留
} u4;
struct
{
uint8_t csm_temp_sensor : 4; // 温度传感器故障
uint8_t csm_critical_nvm : 4; // 关键NVM故障
} u5;
struct
{
uint8_t csm_drive_current : 4; // 驱动电流故障
uint8_t csm_refvolt_fail : 4; // 参考电压故障
} u6;
struct
{
uint8_t csm_mlfb_fail : 4; // 小回路传感器故障
uint8_t csm_flash_fail : 4; // Flash完整性故障(无)
} u7;
struct
{
uint8_t csm_autocal_in_prog : 4; // 正在自动行程校准
uint8_t reserved : 4; // 保留
} u8;
struct
{
uint8_t reserved : 4; // 保留
uint8_t csm_press_fallback : 4; // 压力回落激活
} u9;
struct
{
uint8_t csm_diag_in_prog : 4; // 诊断正在进行
uint8_t csm_cal_in_prog : 4; // 校准正在进行
} u10;
struct
{
uint8_t csm_lcp_trip : 4; // 未知
uint8_t csm_aer_not_empty : 4; // 报警记录不为空
} u11;
struct
{
uint8_t csm_sis_stroke : 4; // 未知
uint8_t csm_offline_fail : 4; // 停机激活
} u12;
struct
{
uint8_t csm_aer_full : 4; // 报警记录满
uint8_t csm_time_inval : 4; // 未知
} u13;
struct
{
uint8_t csm_travel_accum : 4; // 行程累计上限
uint8_t csm_cycle_counter : 4; // 周期计数上限
} u14;
struct
{
uint8_t csm_noncritical_nvm : 4; // 非关键NVM故障
uint8_t csm_hardware_shutdown_fail : 4; // 硬件关机失败
} u15;
struct
{
uint8_t csm_integ_low : 4; // 积分饱和低
uint8_t csm_integ_high : 4; // 积分饱和高
} u16;
struct
{
uint8_t csm_supply_press_hi : 4; // 供应压力高
uint8_t csm_locked_in_safety : 4; // 未知
} u17;
struct
{
uint8_t csm_press_dev : 4; // 压力偏差
uint8_t csm_supply_press_lo : 4; // 供应压力低
} u18;
struct
{
uint8_t csm_pst_abnormal : 4; // 未知
uint8_t csm_diag_data_avail : 4; // 诊断数据可用
} u19;
struct
{
uint8_t csm_drive_signal : 4; // 驱动信号
uint8_t csm_lo_limit : 4; // 行程低切割点
} u20;
struct
{
uint8_t csm_hi_limit : 4; // 行程高切割点
uint8_t csm_travel_dev : 4; // 行程偏差
} u21;
struct
{
uint8_t csm_travel_hihi : 4; // 行程上限高
uint8_t csm_travel_hi : 4; // 行程上限
} u22;
struct
{
uint8_t csm_travel_lolo : 4; // 行程下限低
uint8_t csm_travel_lo : 4; // 行程下限
} u23;
struct
{
uint8_t reserved : 4; // 保留
uint8_t csm_porta : 4; // 未知
} u24;
struct
{
uint8_t csm_output_circuit : 4; // 未知
uint8_t csm_lcp_comm : 4; // 未知
} u25;
struct
{
uint8_t csm_lcp_stuck : 4; // 未知
uint8_t reserved : 4; // 保留
} u26;
struct
{
uint8_t csm_pst_prohibit : 4; // 未知
uint8_t csm_pst_pass : 4; // 未知
} u27;
} bits;
} condensed_status_map_u;
// 48-设备特定状态(使能/禁用状态)
typedef union
{
uint8_t data[HART_PACKED6_LEN];
struct
{
struct
{
/**
如果感测行程超出校准行程的25.0%到125.0%的范围,则激活。
*/
uint8_t travel_sensor_failure : 1; // 行程传感器故障
/**
如果任何一个压力传感器的读数超出校准压力的24.0%到125.0%的范围超过60秒则激活。
*/
uint8_t pressure_sensor_failure : 1; // 压力传感器故障
/**
当仪器温度传感器故障或传感器读数超出60°到100°C76°到212°F的范围时激活。
*/
uint8_t temperature_sensor_failure : 1; // 温度传感器故障
/**
如果用于存储对仪器操作至关重要的配置数据的非易失性内存出现故障,则激活。
*/
uint8_t critical_nvm_failure : 1; // 临界NVM故障
/**
当驱动器电流不如预期流动时激活。
*/
uint8_t drive_current_failure : 1; // 驱动电流故障
/**
如果与内部电压参考有关的故障,则激活。
*/
uint8_t reference_voltage_failure : 1; // 参考电压故障
/**
如果气动继电器位置读数超出有效范围,则激活。
*/
uint8_t mlfb_sensor_alarm : 1; // 小回路传感器警报
/**
如果与闪存ROM只读存储器有关的故障则激活。
*/
uint8_t flash_integrity_failure : 1; // 闪存完整性失故障
} u1;
struct
{
/**
当自动校准正在进行时激活。
*/
uint8_t auto_cal_in_progress_alert : 1; // 自动校准正在进行警报
/**
当检测到过多的NVM写入并且进一步的写入到NVM被拒绝以避免NVM磨损时激活。
*/
uint8_t nvm_protective_mode : 1; // NVM保护模式
uint8_t reserved_1 : 1; // 保留
/**
当仪器检测到行程反馈有问题并且现在像I/P变换器一样控制输出时激活。
*/
uint8_t pressure_fallback_active_alert : 1; // 压力回落激活警报
/**
当诊断测试正在进行时激活。
*/
uint8_t diagnostics_in_progress_alert : 1; // 诊断正在进行警报
/**
当校准正在进行时激活。
*/
uint8_t calibration_in_progress_alert : 1; // 校准正在进行警报
uint8_t reserved_2 : 1; // 保留
/**
当警报记录中存储有1个或多个警报时激活。
*/
uint8_t alert_record_not_empty_alert : 1; // 警报记录不为空警报
} u2;
struct
{
uint8_t reserved_1 : 1; // 保留
/**
如果关闭警报使DVC6200处于失败状态则激活。
*/
uint8_t offline_failed_alert : 1; // 设备处于离线状态警报
/**
当警报记录包含最大数量的20个警报时激活。
*/
uint8_t alert_record_full_alert : 1; // 警报记录满警报
/**
如果仪器自上次设置仪器时钟以来已经断电,则激活。
*/
uint8_t instrument_time_is_approximate_alert : 1; // 仪器时间不准确警报
/**
如果行程累计器超过行程累计器警报点,则激活。
*/
uint8_t travel_accumulator_high_alert : 1; // 行程累计高警报
/**
如果周期计数器超过周期计数警报点,则激活。
*/
uint8_t cycle_counter_high_alert : 1; // 动作次数高警报
/**
如果用于存储对仪器操作不重要的数据的非易失性内存出现故障,则激活。
*/
uint8_t non_critical_nvm_alert : 1; // 非关键NVM警报
uint8_t reserved_2 : 1; // 保留
} u3;
struct
{
/**
如果仪器积分器在低极限处饱和,则激活。
*/
uint8_t integrator_saturated_low_alert : 1; // 积分饱和下限警报
/**
如果仪器积分器在高极限处饱和,则激活。
*/
uint8_t integrator_saturated_high_alert : 1; // 积分饱和上限警报
/**
如果供应压力超过供应压力高警报点,则激活。
*/
uint8_t supply_pressure_high_alert : 1; // 供应压力高警报/气源压力上限
uint8_t reserved_1 : 1; // 保留
/**
如果仪器处于压力控制状态,并且压力没有在配置的偏差许可范围内跟踪设定点,则激活。
*/
uint8_t end_point_pressure_deviation_alert : 1; // 压力偏差警报
/**
如果供应压力低于供应压力低警报点,则激活。
*/
uint8_t supply_pressure_low_alert : 1; // 供应压力低警报/气源压力下限
uint8_t reserved_2 : 1; // 保留
/**
当诊断数据已经收集并存储在仪器中时,警报激活。
*/
uint8_t diagnostic_data_available_alert : 1; // 诊断数据可用警报
} u4;
struct
{
/**
当驱动信号超过目标限制(<10%或>90%超过20秒且不处于切断条件时激活。
*/
uint8_t drive_signal_alert : 1; // 驱动信号警报
/**
当行程低于Lo Limit/Cutoff Point时激活。
*/
uint8_t travel_limit_cutoff_lo_alert : 1; // 行程下限切割点警报
/**
当行程超过Hi Limit/Cutoff Point时激活。
*/
uint8_t travel_limit_cutoff_hi_alert : 1; // 行程上限切割点警报
/**
如果行程目标和行程之间的差值超过行程偏差警报点超过行程偏差时间,则激活。
*/
uint8_t travel_deviation_alert : 1; // 行程偏差警报
/**
当行程超过行程警报Hi Hi Point时激活。
*/
uint8_t travel_alert_hi_hi : 1; // 行程上限高警报
/**
当行程超过行程警报Hi Point时激活。
*/
uint8_t travel_alert_hi : 1; // 行程上限警报
/**
当行程低于行程警报Lo Lo Point时激活。
*/
uint8_t travel_alert_lo_lo : 1; // 行程下限低警报
/**
当行程低于行程警报Lo Point时激活。
*/
uint8_t travel_alert_lo : 1; // 行程下限警报
} u5;
struct
{
uint8_t reserved_1 : 1; // 保留
/**
如果气动输出A超过配置的限制则激活。
*/
uint8_t output_pressure_limiting : 1; // 输出压力限制
/**
如果输出电路没有响应,则激活。
*/
uint8_t output_circuit_error : 1; // 输出电路错误
uint8_t reserved : 5; // 保留
} u6;
} bits;
} hart_device_specific_status_u;
// 156
typedef union
{
uint8_t data;
union
{
uint8_t is_in_diagnosis : 1; // 是否在诊断中
uint8_t trigger_status : 1; // 触发器状态
uint8_t data_compression_enabled : 1; // 数据压缩开启
uint8_t diag_type : 5; // 诊断类型
} bits;
} diagnosis_state_u;
#pragma pack()
extern specification_table_data_t spec_table_data;
extern condensed_status_map_u condensed_status_map;
extern BOOL hart_user_handle(hart_interface_user_event_e event, const void *const data); ///< HART user event handler
#endif // __APP_HART_USER_H