/*** * @Author: xushenghao * @Date: 2023-03-20 19:27:47 * @LastEditors: xushenghao * @LastEditTime: 2023-03-30 00:29:48 * @FilePath: \hart\hart\inc\hart_frame.h * @Description: * @email: * @Copyright (c) 2023 by xushenghao, All Rights Reserved. */ #ifndef __HART_FRAME_H_ #define __HART_FRAME_H_ #include "lib.h" #include "./hart_common_tables_specification.h" #include "./hart_frame_user.h" #ifndef LL_FLASH_PAGE_SIZE #define LL_FLASH_PAGE_SIZE (2 * 1024) #endif /* flash : bank1 0x0800 0000 - 0x0800 FFFF bank2 0x0801 0000 - 0x0801 FFFF EEPROM : bank1 0x0808 0000 - 0x0808 0BFF bank2 0x0808 0C00 - 0x0808 17FF 6 Kbytes of data EEPROM with ECC 在写入EEPROM 的时候,如果发生了串口中断,那么就很容易出问题 */ // 内部调试开关,本地调试使用,上线后请根据需要设置 #define HART_PROTOCOL_VERSION_SUPPORT_COMMAND 1U // hart版本指令检查 1:打开 0:关闭 #define HART_REQUEST_ADDRESS_CHECK TRUE // 请求地址检查 TRUE:打开 FALSE:关闭 // 国家代码 #define COUNTRY_CODE_CN 86 // 中国 #define MANUFACTURER_IDENTIFICATION_CODE MANUFACTURER_IDENTIFIER_GSDT // 制造商标识码 // HART缓存区生命周期 #define KEY_CACHE_TIME_SEC (30 * 1000) #define HART_INTERNAL (3U) #define HART_PROTOCOL_VERSION_5 5U // hart协议版本号5.0 #define HART_PROTOCOL_VERSION_7 7U // hart协议版本号7.2 #define HART_SHORT_ADDRESS 0x00 // 默认短地址 #define HART_VARIABLE_UNITS_ALLOWED_CNT 4U // 变量单位允许数量 #define HART_LONG_ADDRESS (((uint64_t)(EXTENDED_DEVICE_TYPE_GSDT_GPS2000) << 24) + (uint64_t)(0x000001)) // 默认长地址 // 定时器检查周期 #define HART_BYTE_INTERVAL_TIME 20U // 串口字节间隔周期 #define HART_DATA_PARSE_TIME 257U // 数据解析周期 // 从机参数宏定义 #define HART_PREAMBLE 0xFF // 前导符 #define HART_PREAMBLE_DEFAULT_LEN 5U // 前导符默认长度 #define HART_BURST_FRAME 0x01 // 突发帧 #define HART_STX_FRAME 0x02 // 请求帧, 主->从 #define HART_ACK_FRAME 0x06 // 应答帧, 从->主 #define HART_MASTER 0x01 // 主设备;第一主机 #define HART_SLAVE 0x00 // 从设备;第二主机 #define HART_DELIMITER_TYPE_SHORT 0x00 // 短帧类型 #define HART_DELIMITER_TYPE_LONG 0x01 // 长帧类型 #define HART_SHORT_ADDRESS_LEN 1U // 短帧格式地址长度 #define HART_LONG_ADDRESS_LEN 5U // 长帧格式地址长度 #define HART_SOLT_DEVICE_VARIABLE_LEN 8U // 插槽设备变量长度 #define HART_DEVICE_VARIABLE_LEN 11 // 设备变量长度,统计device_key_e中的数值 #define HART_DEVICE_CONSTANT_LEN 135 // 设备常数长度,统计device_key_e中的数值 #define HART_DEVICE_STANDARD_VARIABLE_LEN 8 // 标准设备变量长度 #define HART_ANALOG_CHANNEL_LEN ANALOG_CHANNEL_NUMBER_CODES_MAX // 模拟通道长度 #define HART_INVALID_VALUE 0x7FA00000 // 无效值 #define HART_SQUAWK_CONTROL_ONCE_TIME 0x02 // 一次性响应时间(秒) #define TREND_CONFIGURATIONS_LEN 1U // 趋势配置长度 #define TREND_VALUES_LEN 12U // 趋势值长度 #define SYNCHRONIZATION_OPERATION_LEN 1U // 同步操作长度 #define SYNCHRONIZATION_OPERATION_COMMAND_DATA_LEN 4U // 同步操作命令数据长度 #define BURST_MESSAGE_LEN HART_SOLT_DEVICE_VARIABLE_LEN // 突发消息长度 #define BURST_MESSAGE_UPDATE_TIME_MAX 3600U // 突发消息更新时间最大值 // 主机参数宏定义 #define HART_IO_MAXIMUM_NUMBER_CARDS 1U // 最大卡数 #define HART_IO_MAXIMUM_NUMBER_CHANNELS_CARD 1U // 每张卡最大通道数 #define HART_IO_MAXIMUM_NUMBER_DEVICES_CHANNEL 1U // 每个通道最大设备数 #define HART_IO_MAXIMUM_NUMBER_DELAY_RESPONSE 2U // 最大延迟响应数 #define HART_IO_MAXIMUM_NUMBER_RETRY_COUNT 3U // 重试次数 #define HART_IO_PRIMARY_MODE 1U // 主模式 #define HART_IO_SECONDARY_MODE 0U // 辅助主模式 // #define HART_USER_STORAGE_ADDRESS 20000U // 用户存储地址 typedef enum { // 无错误 HART_UART_NO_ERROR = BIT0, // 奇偶校验错误中断 HART_UART_PARITY_ERROR = BIT1, // 帧错误中断 HART_UART_FRAME_ERROR = BIT2, // 噪声错误中断 HART_UART_NOISE_ERROR = BIT3, // 溢出错误中断 HART_UART_OVERRUN_ERROR = BIT4, } hart_uarts_interupt_error_e; ///< UART中断错误枚举 和 uarts_interupt_error_e 定义一致 // 结束:响应数据域结构 typedef enum { HART_STORAGE_PARAMS = 1, HART_STORAGE_VARIABLE, HART_STORAGE_CONSTANT, HART_STORAGE_STANDARD_VARIABLE, HART_STORAGE_SPECIFICATION_TABLE, } hart_storage_e; #pragma pack(1) typedef struct { uint24_t serial_number; // 传感器序列号 uint8_t limits_and_minimum_span_units_code; // 传感器限制和最小跨度单位代码 float32_u upper_limit; // 传感器上限 float32_u lower_limit; // 传感器下限 float32_u minimum_span; // 传感器最小跨度 } transducer_t; // 传感器 typedef struct { uint8_t trim_points; // 支持的微调点 trim_points_e uint8_t units_code; float32 value; // 微调点值 float32 lower; // 下端点值,单点值 float32 mini_lower; // 最小下微调点值(在低微调过程中,仪表不会接受低于此值的值) float32 max_lower; // 最大下微调点值(在低微调过程中,仪表不会接受高于此值的值) float32 upper; // 上端点值 float32 mini_upper; // 最小上微调点值(在高微调过程中,仪表不会接受低于此值的值) float32 max_upper; // 最大上微调点值(在高微调过程中,仪表不会接受高于此值的值) float32 mini_differential; // 最小差值(上边缘点和下边缘点之间可接受的最小差值) } trim_point_t; // 修正点 typedef struct { uint8_t alarm_selection_code; // 报警选择代码 uint8_t transfer_function_code; // 传递函数代码 uint8_t upper_and_lower_range_values_units_code; // 上限值和下限值单位代码 float32 damping_value; // 阻尼值(以秒为单位) float32 upper_range_value; // 上限值 float32 lower_range_value; // 下限值 uint8_t analog_channel_flags; // 模拟通道标志 analog_channel_code_e } device_attribute_t; // 设备属性 typedef struct { uint8_t code; // 设备变量代码 device_key_e uint8_t write_device_variable_command_code; // 写入设备变量命令代码 write_device_variable_command_code_e uint8_t classification; // 设备变量分类 device_variable_classification_code_e uint8_t family; // 设备变量家族 device_variable_family_code_e uint8_t units_code; // 单位代码 transmission_function_code_e uint8_t units_code_allow[HART_VARIABLE_UNITS_ALLOWED_CNT]; // 单位代码 transmission_function_code_e uint8_t properties; // 设备变量属性,默认0,device_variable_property_flags_e uint8_t alarm_code; // 报警代码,报警选择代码表示设备在错误条件下所采取的措施 alarms_code_e uint32_t acquisition_period; // 采集周期,the Acquisition Period indicates the maximum period betweenDevice Variable updates device_variable_status_t status; // 设备变量状态 device_attribute_t attribute; // 设备属性 user_variable_t user_param; // 用户自定义 __IO void *value; // 变量值 transducer_t transducer; // 传感器 trim_point_t trim_point; // 修正点 } hart_device_variable_t; // 设备变量 typedef struct { uint8_t code; // 设备变量代码 device_key_e uint8_t dynamic_variable_code; // 动态设备变量,不支持的动态变量返回250(未使用)作为分配的设备变量( Primary, Secondary, Tertiary, and Quaternary Variables) } hart_device_standard_variable_t; // 标准设备变量 typedef struct { uint8_t code; // 设备变量代码 device_key_e uint8_t classification; // 设备变量分类 device_variable_classification_code_e uint8_t family; // 设备变量家族 device_variable_family_code_e uint8_t units_code; // 单位代码 transmission_function_code_e user_variable_t user_param; // 用户自定义 __IO void *value; // 变量值 } hart_device_constant_t; // 设备常数 // 响应数据域结构 typedef union { uint8_t version; struct { uint8_t physical_signaling_code : 3; // 物理层信号编码 uint8_t hardware_revision : 5; // 硬件版本 } bits; } device_hardware_revision_u; // 硬件版本 typedef struct { uint8_t tag[HART_PACKED6_LEN]; // 单位标签6个字节 uint8_t descriptor[HART_PACKED12_LEN]; // 单位描述符12个字节 uint8_t date[HART_DATE_LEN]; // 单位日期3个字节 } unit_device_t; typedef struct { uint8_t code; // 设备变量代码 device_key_e uint8_t burst_message_trigger_code; // 突发触发模式选择代码 burst_message_trigger_code_e uint8_t device_variable_vlassification_for_trigger_level; // 触发电平的设备变量分类 device_variable_classification_code_e uint8_t units_code; // 单位代码 units_code_e uint8_t burst_mode_control_code; // 突发模式控制代码 burst_mode_control_code_e uint8_t command_number_expansion_flag; // 31(0x1F)-命令编号扩展标志 不清楚怎么用 uint16_t extended_command_number; // 扩展命令号 uint32_t update_period_time; // 更新周期为1/32毫秒。更新周期不得超过3600秒 uint32_t max_update_period_time; // 更新周期为1/32毫秒。更新周期不得超过3600秒 float32 trigger_level; // 触发电平 } burst_message_t; typedef struct { uint8_t phost_command38; uint8_t shost_command38; uint8_t phost_command48; uint8_t shost_command48; } simulation_test_t; // HTS测试使用 add by ZKBW typedef struct { uint16_t init_flag; // 初始化标志 uint8_t poll_address; // 设备的轮询地址,地址1个字节 uint8_t long_address[HART_LONG_ADDRESS_LEN]; // 长帧地址5个字节,上位机发送时从低位到高位填充,例如短地址:0x01,长地址:0x00 0x00 0x00 0x00 0x01 uint8_t write_protect_code; // 写保护代码 uint16_t write_protect_code_count; // 写保护代码计数,每1s计数减1 uint8_t message[HART_PACKED32_LEN]; // 设备消息24个字节,command17写入,command12读取 uint8_t tag[HART_PACKED8_LEN]; // 标签8个字节 uint8_t long_tag[HART_PACKED32_LEN]; // 长标签32个字节 uint8_t descriptor[HART_PACKED16_LEN]; // 描述符16个字节 uint8_t date[HART_DATE_LEN]; // 用于记录保存的日期代码3个字节 uint8_t final_assembly_number[HART_PACKED3_LEN]; // 总装编号3个字节 uint8_t device_profile; // 设备配置文件 uint8_t device_revision; // 设备版本 uint8_t device_software_revision; // 设备软件版本,254,255保留 uint8_t s2m_preambles; // 从设备到主设备的响应前导码个数 uint16_t extended_device_type; // ?扩展设备类型 uint16_t manufacturer_identification_code; // 制造商标识码 uint16_t private_label_distributor_code; // 私有标签分销商代码 device_hardware_revision_u device_hardware_revision; // 硬件版本 unit_device_t unit_device; // 单位设备 // 以下V7版本才有 uint16_t country_code; // 国家代码 uint8_t si_units_control_code; // SI单位控制代码 uint8_t loop_current_mode; // 回路电流模式 uint8_t lock_code; // 锁定代码,默认0 uint8_t event_manager_registration_control_code; // 事件管理器注册控制代码 event_manager_registration_control_code_e burst_message_t burst_messages[BURST_MESSAGE_LEN]; // 突发消息 存储 uint16_t master_cfg_update_count; // 第一主机配置更新次数 uint16_t slave_cfg_update_count; // 第二主机配置更新次数 simulation_test_t simulation; // 仿真测试 // analog_channel_t analog_channel[HART_ANALOG_CHANNEL_LEN]; // 模拟通道 // trend_configuration_t trend_configurations[TREND_CONFIGURATIONS_LEN]; // 趋势配置 // synchronization_operation_t synchronization_operations[SYNCHRONIZATION_OPERATION_LEN]; // 同步操作 } hart_storage_variable_t; // flash变量 #pragma pack() #pragma pack(1) typedef union { uint8_t data; struct { uint8_t frame_type : 3; // 帧类型,1-突发模式(HART_BURST_FRAME),2-请求数据(HART_STX_FRAME), 6-应答数据(HART_ACK_FRAME) uint8_t physical_layer : 2; // 物理层类型,0-异步,1-同步 uint8_t ext_bytes : 2; // 扩展字节数量,0-3 uint8_t addr_type : 1; // 地址类型,0-短帧,1-长帧 } bits; } hart_delimiter_u; // 定界符 typedef union { uint8_t data; struct { uint8_t slave : 4; // 从机巡检地址 1-127 uint8_t reserved : 2; // 第四、五位必须置为0 uint8_t group : 1; // 成组模式,0-没有成组,1-从设备处于成组模式 uint8_t master : 1; // 主机地址,0-第二主机,1-第一主机 } bits; } hart_short_address_u; // 短帧地址格式:共1个字节(8位) typedef union { uint40_t data; struct { uint8_t reserved : 6; uint8_t group : 1; // 成组模式,0-没有成组,1-从设备处于成组模式 uint8_t master : 1; // 主机地址,0-第二主机,1-第一主机 uint8_t slave[4]; // 设备的唯一标识符,共38位。均为0表示广播地址 } bits; } hart_long_address_u; // 长帧格式地址:共5个字节(40位) typedef struct { hart_uarts_interupt_error_e uart_error; // UART错误 uint16_t rx_index; // 接收到的第几个字节 } hart_uart_error_t; // hart命令码数据结构定义 typedef struct { uint8_t def; uint16_t expanded_device_type; // 扩展设备类型 uint8_t m2s_preambles_limit_count; // 主机到从机前导符限制计数 uint8_t hart_revision; // HART协议版本 uint8_t device_revision; // 设备版本 uint8_t device_software_revision; // 设备软件版本 device_hardware_revision_u device_hardware_revision; // 硬件版本 uint8_t reserve; // 保留 uint24_t device_id; // 设备ID,长ID的后3个字节 // 以下V7版本才有 uint8_t s2m_response_preambles_count; // 从机到主机前导符计数 uint8_t last_device_variable_code; // 上一个设备变量,这表示应用程序应在现场设备中找到的最后一个设备变量代码(在执行Command 54时读取设备的变量) uint16_t configuration_change_counter; // 配置被更新的次数 uint8_t extended_device_status; // 扩展设备状态,未指定的任何位都是未定义的,必须设置为零。 uint16_t manufacturer_identification_code; // 制造商标识码 uint16_t private_label_distributor_code; // 私有标签分销商代码 uint8_t device_profile; // 设备配置文件 } hart_command_0_t; // 读取唯一标识命令 typedef struct { uint8_t unit; // 单位代码 float32 value; // 变量值 } hart_command_1_t; // 读取主变量 typedef struct { float32 primary_variable_loop_current; // 主要回路电流(单位:毫安) float32 primary_variable_percent_of_range; // 主要变量量程百分比 } hart_command_2_t; // 读取环路电流和量程百分比 typedef struct { float32 primary_variable_loop_current; // 主要回路电流(单位:毫安) uint8_t primary_variable_units_code; // 主要变量单位代码 float32 primary_variable; // 主要变量值 uint8_t secondary_variable_units_code; // 次要变量单位代码 float32 secondary_variable; // 次要变量值 uint8_t tertiary_variable_units_code; // 第三变量单位代码 float32 tertiary_variable; // 第三变量值 uint8_t quaternary_variable_units_code; // 第四变量单位代码 float32 quaternary_variable; // 第四变量值 } hart_command_3_t; // 读取动态变量和环路电流 typedef struct { uint8_t poll_address; // 设备的轮询地址 V5 // 以下V7版本才有 uint8_t loop_current_mode; // 回路电流模式 } hart_command_6_t; // 写入轮训地址 typedef struct { uint8_t poll_address; // 设备的轮询地址 V5 // 以下V7版本才有 uint8_t loop_current_mode; // 回路电流模式 } hart_command_7_t; // 读取循环配置 typedef struct { uint8_t primary_variable_classification; // 主要变量分类 uint8_t secondary_variable_classification; // 次要变量分类 uint8_t tertiary_variable_classification; // 第三变量分类 uint8_t quaternary_variable_classification; // 第四变量分类 } hart_command_8_t; typedef struct { uint8_t slot0; uint8_t slot1; uint8_t slot2; uint8_t slot3; uint8_t slot4; uint8_t slot5; uint8_t slot6; uint8_t slot7; } hart_command_9_req_t; typedef struct { uint8_t code; // 设备变量代码(参见通用表5.34,设备变量代码表和适当的设备特定文件) uint8_t classification; // 设备变量分类(参见通用表5.21) uint8_t units_code; // 单位代码(请参阅通用表格规范5.2) float32_u value; // 设备变量值 uint8_t status; } slot_device_variable_rsp_t; typedef struct { uint8_t extended_field_device_status; // 扩展现场设备状态(参考通用表5.17,扩展现场设备状况) slot_device_variable_rsp_t slot[HART_PACKED8_LEN]; uint32_t slot_data_timestamp; // 插槽0数据时间戳 } hart_command_9_rsp_t; typedef union { hart_command_9_req_t hart_command_9_req; hart_command_9_rsp_t hart_command_9_rsp; } hart_command_9_t; // 读取具有状态的设备变量 typedef struct { uint8_t tag[HART_PACKED6_LEN]; // 标签 } hart_command_11_t; // 读取与标签关联的唯一标识符 typedef struct { uint24_t pv_transducer_serial_number; // 主要变量传感器序列号 uint8_t pv_transducer_limits_and_minimum_span_units_code; // 主要变量传感器限制和最小跨度单位代码 float32_u pv_upper_transducer_limit; // 主要变量传感器上限 float32_u pv_lower_transducer_limit; // 主要变量传感器下限 float32_u pv_minimum_span; // 主要变量传感器最小跨度 } hart_command_14_t; // 读取主变量传感器信息 typedef struct { uint8_t pv_alarm_selection_code; // 主要变量报警选择代码 uint8_t pv_transfer_function_code; // 主要变量传递函数代码 uint8_t pv_upper_and_lower_range_values_units_code; // 主要变量上限和下限值单位代码 float32_u pv_upper_range_value; // 主要变量上限值 float32_u pv_lower_range_value; // 主要变量下限值 float32_u pv_damping_value; // 主要变量阻尼值 uint8_t write_protect_code; // 写保护代码 uint8_t reserved; // 保留,必须设置250 uint8_t pv_analog_channel_flags; // 主要变量模拟通道标志 } hart_command_15_t; // 读取设备信息 typedef struct { uint8_t message[HART_PACKED24_LEN]; // 设备消息24个字节,command17写入,command12读取 } hart_command_17_t; // 消息 typedef struct { uint8_t tag[HART_PACKED6_LEN]; // 标签 uint8_t descriptor[HART_PACKED12_LEN]; // 描述符 uint8_t date[HART_DATE_LEN]; // 用于记录保存的日期代码 } hart_command_18_t; // 标签、描述符、日期 typedef struct { uint8_t final_assembly_number[HART_PACKED3_LEN]; // 总装编号 } hart_command_19_t; typedef struct { uint8_t long_tag[HART_PACKED32_LEN]; // 长标签 } hart_command_21_t; // 读取与标签关联的唯一标识符 typedef struct { uint16_t configuration_change_counter; // 配置被更新的次数 } hart_command_38_t; typedef struct { uint8_t slot_0; // 插槽0 uint8_t slot_1; // 插槽1 uint8_t slot_2; // 插槽2 uint8_t slot_3; // 插槽3 } hart_command_33_t; typedef struct { float32 pv_damping_value; // 主要变量阻尼值(以秒为单位) } hart_command_34_t; typedef struct { uint8_t pv_upper_and_lower_range_values_units_code; // 主要变量上限值和下限值单位代码 float32 pv_upper_range_value; // 主要变量上限值 float32 pv_lower_range_value; // 主要变量下限值 } hart_command_35_t; typedef struct { uint8_t control_code; // 0 刻录EEPROM 1 恢复影子内存 } hart_command_39_t; typedef struct { float32 pv_fixed_current_level; } hart_command_40_t; typedef struct { uint8_t pv_units_code; // 主要变量单位代码 } hart_command_44_t; typedef struct { float32 pv_loop_current_level; } hart_command_45_t; typedef struct { float32 pv_loop_current_level; } hart_command_46_t; typedef struct { uint8_t pv_transfer_function_code; } hart_command_47_t; typedef struct { uint8_t command48_status[24]; // 配置被更新的次数 } hart_command_48_t; typedef struct { uint24_t pv_transducer_serial_number; } hart_command_49_t; typedef struct { uint8_t device_ariables[4]; } hart_command_51_t; typedef struct { uint8_t device_ariable; } hart_command_52_t; typedef struct { uint8_t device_ariable; // 设备变量代码,参考device_variable_code_e uint8_t device_ariable_unit_code; // 设备变量单位代码 } hart_command_53_t; typedef struct { uint8_t device_ariable; // 设备变量代码 } hart_command_54_t; typedef struct { uint8_t device_ariable; // 设备变量代码 float32 damping_value; // 阻尼值(以秒为单位) } hart_command_55_t; typedef struct { uint8_t device_ariable; // 设备变量代码 uint24_t serial_number; // 传感器序列号 } hart_command_56_t; typedef struct { uint8_t tag[HART_PACKED6_LEN]; // 单位标签6个字节 uint8_t descriptor[HART_PACKED12_LEN]; // 单位描述符12个字节 uint8_t date[HART_DATE_LEN]; // 单位日期3个字节 } hart_command_58_t; typedef struct { uint8_t s2m_preambles; // 从属设备向主设备发送响应消息时要发送的前导码数 } hart_command_59_t; typedef struct { uint8_t analog_channel_number_code; // 模拟通道编号代码 } hart_command_60_t; typedef struct { uint8_t slot0_analog_channel_number_code; // 插槽0模拟通道编号代码 uint8_t slot1_analog_channel_number_code; // 插槽1模拟通道编号代码 uint8_t slot2_analog_channel_number_code; // 插槽2模拟通道编号代码 uint8_t slot3_analog_channel_number_code; // 插槽3模拟通道编号代码 } hart_command_62_t; typedef struct { uint8_t analog_channel_number_code; // 模拟通道编号代码 } hart_command_63_t; typedef struct { uint8_t analog_channel_number_code; // 模拟通道编号代码 float32 damping_value; // 阻尼值(以秒为单位) } hart_command_64_t; typedef struct { uint8_t analog_channel_number_code; // 模拟通道编号代码 uint8_t upper_and_lower_range_values_units_code; // 上限值和下限值单位代码 float32 upper_range_value; // 上限值 float32 lower_range_value; // 下限值 } hart_command_65_t; typedef struct { uint8_t analog_channel_number_code; // 模拟通道编号代码 uint8_t units_code; // 模拟通道单位代码 float32 fixed_analog_channel_level; // 固定模拟通道电平 } hart_command_66_t; typedef struct { uint8_t analog_channel_number_code; // 模拟通道编号代码 uint8_t units_code; // 模拟通道单位代码 float32 actual_analog_channel_level; // 实际模拟通道电平 } hart_command_67_t; typedef struct { uint8_t analog_channel_number_code; // 模拟通道编号代码 uint8_t units_code; // 模拟通道单位代码 float32 externally_measured_analog_channel_level; // 外部测量模拟通道电平 } hart_command_68_t; typedef struct { uint8_t analog_channel_number_code; // 模拟通道编号代码 uint8_t transfer_function_code; // 模拟通道传递函数代码 } hart_command_69_t; typedef struct { uint8_t analog_channel_number_code; // 模拟通道编号代码 } hart_command_70_t; typedef struct { uint8_t lock_code; // 锁定代码 } hart_command_71_t; typedef struct { uint8_t squawk_control_code; // Squawk控制代码 } hart_command_72_t; typedef struct { uint8_t card; uint8_t channel; uint8_t poll_address; } hart_command_75_t; typedef struct { uint16_t command; uint8_t payload_length; uint8_t *command_payload; } hart_command_78_item_t; typedef struct { uint8_t count; uint8_t *item; } hart_command_78_t; typedef struct { uint8_t device_ariable; // 设备变量代码 uint8_t device_ariable_command_code; // 设备变量命令代码 uint8_t device_ariable_unit_code; // 设备变量单位代码 float32 device_ariable_value; // 设备变量值 uint8_t status; // 状态 } hart_command_79_t; typedef struct { uint8_t device_ariable; // 设备变量代码 } hart_command_80_t; typedef struct { uint8_t device_ariable; // 设备变量代码 } hart_command_81_t; typedef struct { uint8_t device_ariable; // 设备变量代码 uint8_t trim_points; // 微调点 uint8_t units_code; // 单位代码 float32 value; } hart_command_82_t; typedef struct { uint8_t device_ariable; // 设备变量代码 } hart_command_83_t; typedef struct { uint16_t identifier; // 子设备在IO系统中的索引 } hart_command_84_t; typedef struct { uint8_t card; // 卡索引 uint8_t channel; // 通道索引 } hart_command_85_t; typedef struct { uint16_t identifier; // 子设备在IO系统中的索引 } hart_command_86_t; typedef struct { uint8_t master_mode; // 主模式 } hart_command_87_t; typedef struct { uint8_t retry_count; // 重试计数 } hart_command_88_t; typedef struct { uint8_t time_set_code; // 时间集代码 uint8_t date[HART_DATE_LEN]; // 设置设备实时时钟的日期代码 uint32_t time; // 设置设备实时时钟的时间 uint16_t transmission_time; // 应设置为0。两个字节,以确保请求和响应占用相等的时间(补偿响应中响应代码和设备状态的传输时间 } hart_command_89_t; typedef struct { uint8_t trend_number; // 趋势编号 } hart_command_91_t; typedef struct { uint8_t trend_number; // 趋势编号 uint8_t trend_code; // 趋势控制代码 uint8_t device_variable_code; // 设备变量代码 uint32_t trend_sample_interval; // 趋势样本间隔(最大为2小时:每天一个趋势) } hart_command_92_t; typedef struct { uint8_t trend_number; // 趋势编号 } hart_command_93_t; typedef struct { uint8_t action_number; // 行动编号 } hart_command_96_t; typedef struct { uint8_t action_number; // 行动编号 uint8_t action_control_code; // 动作控制 synchronization_operation_control_code_e uint8_t device_variable_code; // 设备变量代码。如果操作执行命令,则设备变量代码必须设置为251,“NONE”。 device_key_e uint16_t command_number; // 命令编号。如果操作是对设备变量进行采样,则命令编号必须设置为0xFFFF uint8_t trigger_date[HART_DATE_LEN]; // 触发日期 uint32_t trigger_time; // 触发时间 } hart_command_97_t; typedef struct { uint8_t action_number; // 行动编号 } hart_command_98_t; typedef struct { uint8_t action_number; // 行动编号 uint16_t command_number; // 命令编号。 uint8_t command_data_length; // 命令数据长度 uint8_t command_data[SYNCHRONIZATION_OPERATION_COMMAND_DATA_LEN]; // 命令数据 } hart_command_99_t; typedef struct { uint8_t pv_alarm_selection_code; // 主要变量报警选择代码 alarms_code_e } hart_command_100_t; typedef struct { uint8_t burst_message; // 突发消息 } hart_command_101_t; typedef struct { uint8_t burst_message; // 突发消息 uint16_t sub_device_index; // 子设备索引(索引0表示输入输出系统本身) } hart_command_102_t; typedef struct { uint8_t burst_message; // 突发消息 uint32_t update_period_time; // 更新周期为1/32毫秒。更新周期不得超过3600秒 uint32_t max_update_period_time; // 更新周期为1/32毫秒。更新周期不得超过3600秒 } hart_command_103_t; typedef struct { uint8_t burst_message; // 突发消息 uint8_t burst_message_trigger_code; // 突发触发模式选择代码 burst_message_trigger_code_e uint8_t device_variable_vlassification_for_trigger_level; // 触发电平的设备变量分类 device_variable_classification_code_e uint8_t units_code; // 单位代码 float32 trigger_level; // 触发电平 } hart_command_104_t; typedef struct { uint8_t burst_message; // 突发消息 } hart_command_105_t; typedef struct { uint8_t solt_device_variable_codes[8]; uint8_t burst_message; // 突发消息 } hart_command_107_t; typedef struct { uint16_t country_code; // 国家代码 uint8_t si_units_control_code; // SI单位控制代码 } hart_command_513_t; typedef struct { uint8_t event_manager_registration_control_code; } hart_command_514_t; // 结束:hart命令码数据结构定义 typedef union { hart_command_6_t command_6; // 写入轮训地址 hart_command_9_t command_9; // 读取具有状态的设备变量 hart_command_11_t command_11; // 读取与标签关联的唯一标识符 hart_command_17_t command_17; // 写入消息 hart_command_18_t command_18; // 标签、描述符、日期 hart_command_19_t command_19; // 总装编号 hart_command_21_t command_21; // 读取与标签关联的唯一标识符 hart_command_21_t command_22; // 写长标签 hart_command_38_t command_38; // 重置配置更改标志 hart_command_33_t command_33; // 读取设备变量 hart_command_34_t command_34; // 写入主变量阻尼值 hart_command_35_t command_35; // 写入主变量范围值 hart_command_39_t command_39; // EEPROM控制 hart_command_40_t command_40; // 进入/退出固定电流模式 hart_command_44_t command_44; // 编写主变量单元 hart_command_45_t command_45; // 微调回路电流归零 hart_command_46_t command_46; // 微调回路电流增益 hart_command_47_t command_47; // 编写主变量传递函数 hart_command_48_t command_48; // 重置配置更改标志 hart_command_49_t command_49; // 写入主变量传感器序列号 hart_command_51_t command_51; // 编写动态变量赋值 hart_command_52_t command_52; // 设置设备变量零 hart_command_53_t command_53; // 写入设备变量单位 hart_command_54_t command_54; // 读取设备变量信息 hart_command_55_t command_55; // 写入设备可变阻尼值 hart_command_56_t command_56; // 写入设备可变传感器序列号 hart_command_58_t command_58; // 编写单位标签、描述符、日期V5 hart_command_59_t command_59; // 写入从属设备到主设备响应前导符计数 hart_command_60_t command_60; // 写入模拟通道编号代码 hart_command_62_t command_62; // 读取模拟通道V5 hart_command_63_t command_63; // 读取模拟通道信息V5 hart_command_64_t command_64; // 写入模拟通道阻尼值V5 hart_command_65_t command_65; // 写入模拟通道上限值和下限值V5 hart_command_66_t command_66; // 写入模拟通道固定电平V5 hart_command_67_t command_67; // 写入模拟通道实际电平V5 hart_command_68_t command_68; // 外部测量模拟通道电平 hart_command_69_t command_69; // 写入模拟通道传递函数代码 hart_command_70_t command_70; // 读取模拟通道传递函数代码 hart_command_71_t command_71; // 写入锁定代码 hart_command_72_t command_72; // 写入Squawk控制代码 hart_command_75_t command_75; // 轮询子设备 hart_command_78_t command_78; // 读取聚合命令(需要动态内存,暂不实现) hart_command_79_t command_79; // 写入设备变量 hart_command_80_t command_80; // 读取设备可变微调点 hart_command_81_t command_81; // 读取设备变量调整指南 hart_command_82_t command_82; // 写入设备可变微调点 hart_command_83_t command_83; // 重置设备变量调整 hart_command_84_t command_84; // 读取子设备标识摘要 hart_command_85_t command_85; // 读取I/O通道统计信息 hart_command_86_t command_86; // 读取子设备统计信息 hart_command_87_t command_87; // 写入主模式 hart_command_88_t command_88; // 写入重试计数 hart_command_89_t command_89; // 写入实时时钟 hart_command_91_t command_91; // 读取趋势数据 hart_command_92_t command_92; // 写入趋势控制 hart_command_93_t command_93; // 读取趋势控制 hart_command_96_t command_96; // 读取同步操作 hart_command_97_t command_97; // 配置同步操作 hart_command_98_t command_98; // 读取命令操作 hart_command_99_t command_99; // 配置命令操作 hart_command_100_t command_100; // 写入主要变量报警选择代码 hart_command_101_t command_101; // 读取子设备到突发消息映射 hart_command_102_t command_102; // 将子设备映射到突发信息 hart_command_103_t command_103; // 写入突发周期 hart_command_104_t command_104; // 写入突发触发器 hart_command_105_t command_105; // 读取突发模式配置 hart_command_107_t command_107; // 写入突发设备变量 hart_command_513_t command_513; // 编写国家代码 hart_command_514_t command_514; // 注册事件管理器 // 用户自定义 hart_user_command_req_data_u; } hart_command_req_data_u; // HART请求指令数据域 typedef struct { uint8_t delimiter_type; // 界定符类型: 0:短帧 1:长帧 默认1 uint8_t address[HART_LONG_ADDRESS_LEN]; // 短帧地址1个字节,长帧地址5个字节,上位机发送时从低位到高位填充,例如短地址:0x01,长地址:0x00 0x00 0x00 0x00 0x01 uint8_t command; // HART命令码 uint16_t expansion_command; // 扩展命令码 BOOL expansion; // 是否扩展命令 hart_command_req_data_u data; // 数据域 // 以下解析数据后填充 uint8_t data_length; // 数据域长度 uint8_t master; // 主机地址,0-第二主机,1-第一主机 } hart_command_req_t; // 主机请求指令接口参数定义:hart_master_command_req typedef struct { uint64_t uuid; // 唯一标识 uint32_t hart_cache_time; // hart缓存区寿命 hart_delimiter_u delimiter; // 分隔符 uint8_t address[HART_LONG_ADDRESS_LEN]; // 短帧地址1个字节,长帧地址5个字节,上位机发送时从低位到高位填充,例如短地址:0x01,长地址:0x00 0x00 uint8_t command; // HART命令码 uint16_t expansion_command; // 扩展命令码 // private: BOOL expansion; // 是否扩展命令 uint8_t address_length; // 地址长度 response_communication_code_e code; // 回复状态码 uint8_t *payload; uint8_t payload_length; uint8_t uart_index; // 串口索引 } hart_cache_t; // 缓存数据结构 typedef struct { uint8_t data[HART_RESPONSE_MAX_LEN]; // 回复数据缓冲区 uint16_t data_length; // 回复数据实际长度 uint8_t *data_p; // 回复数据指针 response_communication_code_e code; // 回复状态码 hart_cache_t cache_data; // 需要缓存的数据 } hart_response_t; // 主机和从机回复数据结构 typedef struct { uint16_t stx; // 此设备接收的STX消息计数 uint16_t phack; // 从该设备发送到第一主站的ACK消息计数 uint16_t shack; // 从该设备发送到第二主站的ACK消息计数 uint16_t back; // 从此设备发送的BACK消息计数 } message_count_t; typedef struct { uint8_t code; // 模拟通道编号代码 uint8_t units_code; // 模拟通道单位代码 float32_u level; // 模拟通道电平 float32_u percent_range; // 模拟通道量程百分比 float32_u fixed_analog_channel_level; // 固定模拟通道电平 重启后恢复 float32_u actual_analog_channel_level; // 下端点值,实际模拟通道电平 重启后恢复 float32_u externally_measured_analog_channel_level; // 上端点值,外部测量的模拟通道电平 重启后恢复 device_attribute_t attribute; // 设备属性 } analog_channel_t; // 模拟通道 typedef struct { float32 latitude; // 纬度(度)正值表示北,负值表示南。绝对值不得大于90.0 float32 longitude; // 经度(度)正值表示东,负值表示西。绝对值不得大于180.0 float32 altitude; // 高于平均海平面的高度(米)。海平面以上数值为正,海平面以下数值为负 uint8_t location; // 选址方法/质量 location_method_code_e } position_t; typedef struct { uint8_t time_set_code; // 时间集代码 uint8_t date[HART_DATE_LEN]; // 设置设备实时时钟的日期代码 uint32_t time; // 设置设备实时时钟的时间 uint16_t transmission_time; // 应设置为0。两个字节,以确保请求和响应占用相等的时间(补偿响应中响应代码和设备状态的传输时间 uint8_t rtc_flags; // 实时时钟标志 } real_time_clock_t; typedef struct { float32 value; // 趋势值 device_variable_status_t status; // 趋势值状态 } trend_value_t; typedef struct { uint8_t device_variable_code; // 设备变量代码 device_key_e uint8_t device_variable_classification; // 设备变量分类 device_variable_classification_code_e uint8_t device_variable_unit_code; // 设备变量单位代码 units_code_e uint8_t trend_code; // 趋势控制代码 trend_control_code_e uint32_t trend_sample_interval; // 趋势样本间隔(最大为2小时:每天一个趋势) uint8_t trend_value_date[HART_DATE_LEN]; // 趋势值的日期戳 uint32_t trend_value_time; // 趋势值的时间戳 trend_value_t trend_values[TREND_VALUES_LEN]; } trend_configuration_t; // 趋势配置 typedef struct { uint8_t action_control_code; // 动作控制 synchronization_operation_control_code_e uint8_t device_variable_code; // 设备变量代码。如果操作执行命令,则设备变量代码必须设置为251,“NONE”。 device_key_e uint16_t command_number; // 命令编号。如果操作是对设备变量进行采样,则命令编号必须设置为0xFFFF uint8_t trigger_date[HART_DATE_LEN]; // 触发日期 uint32_t trigger_time; // 触发时间 uint8_t command_data_length; // 命令数据长度 uint8_t command_data[SYNCHRONIZATION_OPERATION_COMMAND_DATA_LEN]; // 命令数据 } synchronization_operation_t; // 同步操作 typedef struct { uint8_t device_variable_code; // 设备变量代码 device_key_e } burst_message_slot; // 突发消息 typedef struct { uint8_t device_specific_status[HART_PACKED6_LEN]; // 设备特定状态 device_specific_status_e uint8_t extended_device_status; // 实现:扩展设备状态 extended_device_status_e uint8_t device_operating_mode; // 设备操作模式,所有设备必须在command48读取附加状态中为该字节返回0 operating_mode_codes_e uint8_t standardized_status0; // 实现:标准化状态0 standardized_status0_e uint8_t standardized_status1; // 标准化状态1 standardized_status1_e // 根据费舍尔提交的文档上面48号指令下面的没有,下面的字段在7.2版本才有 // uint8_t analog_channel_saturated; // 模拟通道饱和 analog_channel_saturated_e // uint8_t standardized_status2; // 标准化状态2 standardized_status2_e // uint8_t standardized_status3; // 标准化状态3 standardized_status3_e // uint8_t analog_channel_fixed; // 固定模拟通道 analog_channel_fixed_e // uint8_t extended_device_specific_status[11]; // 设备特定状态 device_specific_status_e } additional_device_status_t; // 读取附加设备状态 typedef struct { BOOL reset; // 设备重启标志(应用层看到这个标志重启设备) BOOL busy; // 设备自检过程中busy=TRUE,自检结束设置busy=FALSE uint8_t communication_code; // 通讯状态码 uint8_t operational_state; // 设备操作状态 device_operational_state_e,该字段掉电不恢复 additional_device_status_t additional_device_status; // 附加设备状态 uint16_t additional_device_status_crc; // 附加设备状态crc校验码,设备初始化、设备状态也设置完成后,调用接口更新该字段记录设备状态初始值 } hart_device_status_t; // 设备状态,所有状态位都是可选的,未指定的任何位都是未定义的,必须设置为零。 typedef struct { // 这里存放的都是动态变量 } device_variable_dynamics_t; // 设备变量动态,开发人员对该结构体进行初始化 #pragma pack() typedef struct { // 需要实时写入到FLASH中的变量,上电时需要从falsh中读取,在协议中被更新时需要写入到falsh中,地址HART_FLASH_ADDRESS hart_storage_variable_t flash_variable; // flash变量 存储 hart_device_variable_t device_variable[HART_DEVICE_VARIABLE_LEN]; // 设备变量 存储 hart_device_constant_t device_constant[HART_DEVICE_CONSTANT_LEN]; // 设备常量 存储 hart_device_standard_variable_t device_standard_variable[HART_DEVICE_STANDARD_VARIABLE_LEN]; // 设备标准变量 存储 // 不需要写入到FLASH中的变量 uint8_t *hart_protocol_version; // hart协议版本号 BOOL private_command; // 是否支持大命令 float32 *actual_pv_current_level; // 实际PV电流水平,单位毫安 float32 pv_fixed_current_level; // 固定电流模式,值为0或设备重启后退出固定电流模式,单位毫安 float32 pv_loop_current_level; // 外部测量的PV回路电流水平,单位毫安 real_time_clock_t real_time_clock; // 实时时钟 hart_device_status_t device_status; // 设备状态,需要提供接口更新字段 // 指针映射到flash变量中 uint8_t *last_device_variable; // 上一个设备变量,这表示应用程序应在现场设备中找到的最后一个设备变量代码(在执行Command 54时读取设备的变量) message_count_t message_count; // 消息计数 device_variable_dynamics_t dynamics; // 设备变量动态 uint16_t internal; // 当前请求来自第一还是第二主机 uint8_t host; // 仿真 uint8_t simulation_command52; } hart_device_attribute_t; // 设备属性 // 主机属性定义 #pragma pack(1) typedef struct { uint16_t stx; // I/O系统在此通道上发送的STX消息的计数 uint16_t ack; // 接收到的ACK消息的计数 uint16_t ostx; // 接收到的OSTX消息的计数(来自其他主机的消息) uint16_t oack; // 接收到的OACK消息的计数(对其他主机的答复) uint16_t back; // 接收到的BACK消息计数(寻址到任一主机) } io_system_message_count_t; typedef struct { uint16_t identifier; // 索引标识符 BOOL online; // 在线状态 uint16_t extended_device_type; // 扩展设备类型 uint8_t m2s_preambles_limit_count; // 主设备到从设备的最少同步前导码数量 uint8_t hart_revision; uint8_t device_revision; uint8_t device_software_revision; device_hardware_revision_u device_hardware_revision; uint8_t device_id[3]; // 以下版本7才有 uint8_t s2m_preambles; // 从设备到主设备的响应前导码个数 uint8_t last_device_variable; // 上一个设备变量,这表示应用程序应在现场设备中找到的最后一个设备变量代码(在执行Command 54时读取设备的变量) uint16_t configuration_update_count; // 配置被更新的次数 uint8_t extended_device_status; // 扩展设备状态 extended_device_status_e uint16_t manufacturer_identification_code; // 制造商标识码 uint16_t private_label_distributor_code; // 私有标签分销商代码 uint8_t device_profile; // 设备配置文件 uint8_t long_tag[HART_PACKED32_LEN]; // 长标签32个字节 io_system_message_count_t message_count; // 消息计数 } io_system_device_t; typedef struct { io_system_device_t devices[HART_IO_MAXIMUM_NUMBER_DEVICES_CHANNEL]; io_system_message_count_t message_count; // 消息计数 } io_system_channel_t; // IO系统通道 typedef struct { io_system_channel_t channels[HART_IO_MAXIMUM_NUMBER_CHANNELS_CARD]; } io_system_card_t; // IO系统卡 typedef struct { uint8_t write_protect_code; // 写保护代码 uint8_t retry_count; // 重试计数 uint16_t master_mode; // 主模式(0=辅助主模式;1=主模式) io_system_card_t cards[HART_IO_MAXIMUM_NUMBER_CARDS]; } io_system_t; // IO系统 typedef struct { io_system_t io_system; // IO系统 } hart_master_attribute_t; // 主机属性 #pragma pack() typedef void (*response_cb)(uint8_t uart_index, uint8_t *data, uint16_t len); // 回复消息接口回调定义 typedef struct { // 主从回复应答消息接口 response_cb response; // 获取串口通讯错误长度 uint16_t (*uart_error_count)(uint8_t uart_index); // 获取串口通讯错误 void (*uart_errors)(uint8_t uart_index, hart_uart_error_t *errors); // 数据组包解析超时判断开始 void (*frame_data_parse_time_start)(uint16_t timer_period); // 获取时间戳 uint32_t (*get_timestamp)(void); // flash 读写接口 BOOL(*flash_read) (hart_storage_e index, uint8_t *data); BOOL(*flash_write) (hart_storage_e index, uint8_t *data); BOOL(*flash_read_item) (hart_storage_e index, uint8_t item, uint8_t *data); BOOL(*flash_write_item) (hart_storage_e index, uint8_t item, uint8_t *data); // 执行自检 void (*perform_self_test)(void); // 设备重置 void (*device_reset)(void); // 设备呼叫,0一直呼叫,1-255秒 void (*squawk_control)(BOOL open, uint8_t second); // 技术人员按下一个特殊的按钮或按钮组合,指示从机应响应command74 BOOL(*armed) (void); // 用户自定义接口 BOOL(*user_common_event) (hart_interface_user_event_e event, const void *const data); // 属性初始化 void (*attribute_init)(void); // 变量初始化 void (*variable_init)(void); // 自定义属性初始化 void (*attribute_user_init)(void); // 设置动态变量 BOOL(*set_dynamics) (device_variable_dynamics_t *const dynamics); // 设置实时时钟 void (*set_real_time_clock)(uint8_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t min, uint8_t sec); void (*get_real_time_clock)(uint8_t *year, uint8_t *month, uint8_t *day, uint8_t *hour, uint8_t *min, uint8_t *sec); } hart_interface_t; extern BOOL (*hart_command_ptr_arr[HART_COMMAND_MAX])(const hart_command_req_t *const req, hart_response_t *resp); // 命令处理函数指针数组 extern void hart_timer_interupt_cb(void); extern void hart_timer_start(uint16_t timer_period); extern BOOL hart_timeout_compare(void); extern uint16_t hart_uart_error_count(uint8_t uart_index); // 获取uart错误计数 extern void hart_uart_errors(uint8_t uart_index, hart_uart_error_t *errors); // 获取uart错误 extern void frame_data_parse_time_start(uint16_t timer_period); // 开始解析帧数据的计时 extern uint32_t hart_get_timestamp(void); // 获取时间戳 // flash 写信号量更新 extern BOOL hart_storage_write(hart_storage_e index, uint8_t *data); // flash 读写接口 extern BOOL hart_storage_read(hart_storage_e index, uint8_t *data); extern BOOL hart_storage_write_item(hart_storage_e index, uint8_t item, uint8_t *data); // flash 读写接口 extern BOOL hart_storage_read_item(hart_storage_e index, uint8_t item, uint8_t *data); // flash 读写接口 extern void hart_perform_self_test(void); // 执行自检 extern void hart_device_reset(void); // 设备重置 extern void hart_squawk_control(BOOL open, uint8_t second); // 设备呼叫,0一直呼叫,1-255秒 extern BOOL hart_armed(void); // 技术人员按下一个特殊的按钮或按钮组合,指示从机应响应command74 extern void hart_set_real_time_clock(uint8_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t min, uint8_t sec); // 设置实时时钟 extern void hart_get_real_time_clock(uint8_t *year, uint8_t *month, uint8_t *day, uint8_t *hour, uint8_t *min, uint8_t *sec); // 获取实时时钟 extern BOOL hart_user_common_event(hart_interface_user_event_e event, const void *const data); // 用户自定义事件 extern uint8_t hart_get_current_protocol_version(void); // 获取当前协议版本 extern BOOL hart_is_support_command(uint16_t command, BOOL private_command); // 判断是否支持命令 extern BOOL hart_is_write_command(uint16_t command); // 判断是否写命令 extern void hart_frame_data_length_start(uint8_t **data_p); // 帧数据长度 extern void hart_frame_data_length_end(uint8_t *data_p); // 帧数据长度 extern BOOL hart_frame_data_length_check(uint8_t data_length, uint8_t data_structure_length, uint8_t *resp_code); // 数据域长度检查 extern void hart_frame_response_code_start(uint8_t **data_p); // 响应码 extern void hart_frame_response_communication_code(uint8_t code); // 通信响应码 extern void hart_frame_slave_response_operate_code(hart_device_attribute_t *hart_device_attribute); // 从设备响应操作码 extern void hart_frame_master_response_operate_code(void); // 主设备响应操作码 extern BOOL is_broadcast_address(uint8_t *address, uint8_t len); // 判断是否广播地址 extern void encode_ascii_6(const uint8_t *input, uint16_t input_length, uint8_t *output); // ASCII6编码 extern void decode_ascii_6(const uint8_t *input, uint16_t input_length, uint8_t *output); // ASCII6解码 extern void convert_time(uint32_t t, uint8_t *h, uint8_t *m, uint8_t *s); extern void convert_timestrap(uint32_t *t, uint8_t h, uint8_t m, uint8_t s, uint16_t ms); extern void covert_year_rtc(uint8_t *year); // 年份转换,HART的年份是从1900年开始的,如果要转换到标准的年份,需要加上1900。另外,HART的年份是一个字节,所以最大只能表示到2155年。 extern void covert_rtc_year(uint8_t *year); // 将RTC的年份转换为HART的年份 extern void covert_rtc_year_to_standard(uint16_t *year); // 将RTC的年份转换成标准的年份 extern float32 covert_float(user_param_type_e data_type, void *data_p); // 转换浮点数 extern void hart_cache_init(void); // 缓存消息初始化 extern void hart_cache_add(hart_cache_t data); // 向缓存中添加数据 extern void hart_cache_free(hart_cache_t *data); // 释放缓存数据 extern hart_cache_t *hart_cache_get(uint64_t uuid); // 从缓存中获取数据 extern void hart_cache_remove(uint64_t uuid); // 将指定的uuid对应的数据从缓存区移除 extern void hart_cache_detection(void); // 检查HART缓存区是否存活 INTERNAL_EXTERN void hart_execution_inspection_sem(void); // 执行自检信号量 #endif //__HART_FRAME_H_