#ifndef PCM_COMM_H #define PCM_COMM_H #ifdef __cplusplus extern "C" { #endif /*------ Exported includes(头文件) ----------------------*/ #include "publicdata/publicdata.h" /*------ Exported macro(宏定义) -------------------------*/ /* PCM UDP 网络参数 */ #define PCM_UDP_SRC_PORT 502 /* 本机(终端)UDP socket绑定的源端口 */ #define PCM_UDP_DST_PORT 502 /* 目标(主机)UDP端口 */ /* 终端IP地址基址:本机(终端)从192.168.1.100开始 */ #define PCM_TERM_IP_BASE0 192 #define PCM_TERM_IP_BASE1 168 #define PCM_TERM_IP_BASE2 1 #define PCM_TERM_IP_BASE3 100 /* 主机IP地址基址:1号主机从192.168.1.200开始 */ #define PCM_HOST_IP_BASE0 192 #define PCM_HOST_IP_BASE1 168 #define PCM_HOST_IP_BASE2 1 #define PCM_HOST_IP_BASE3 200 /* 每台主机占用的终端IP地址偏移量(10个地址) */ #define PCM_TERM_IP_OFFSET 10 /* 帧结构定义 */ #define PCM_FRAME_HEAD 0x5A99 /* 帧头 */ #define PCM_FRAME_TAIL 0xA5 /* 帧尾 */ /* 帧功能码 */ #define PCM_CMD_TERM_HEARTBEAT 0x10 /* 分桩心跳帧:终端->主机 */ #define PCM_CMD_HOST_HEARTBEAT 0x11 /* 主机心跳帧:主机->终端 */ #define PCM_CMD_TERM_REQUEST 0x12 /* 分桩请求帧:终端->主机 */ #define PCM_CMD_HOST_RESPONSE 0x13 /* 分桩请求应答帧:主机->终端 */ /* 帧最小长度:帧头(2) + 功能码(1) + 长度(1) + CRC(1) + 帧尾(1) = 6 */ #define PCM_FRAME_MIN_LEN 6 /* 帧最大数据长度 */ #define PCM_FRAME_MAX_DATA_LEN 128 /* 帧最大总长度 */ #define PCM_FRAME_MAX_LEN (PCM_FRAME_MIN_LEN + PCM_FRAME_MAX_DATA_LEN) /* 通信周期(ms) */ #define PCM_HEARTBEAT_PERIOD_MS 1000 /* 心跳周期 */ #define PCM_REQUEST_PERIOD_MS 200 /* 请求/应答周期 */ /* 通信超时时间(ms) */ #define PCM_COMM_TIMEOUT_MS 5000 /* 5秒无通信判定超时 */ /* 终端枪工作状态 */ #define PCM_GUN_STATE_IDLE 0 /* 空闲 */ #define PCM_GUN_STATE_PLUG 1 /* 插枪 */ #define PCM_GUN_STATE_INSU_START 2 /* 绝缘启动 */ #define PCM_GUN_STATE_INSU_STOP 3 /* 绝缘停止 */ #define PCM_GUN_STATE_PRE_CHARGE 4 /* 预充启动 */ #define PCM_GUN_STATE_CHARGING 5 /* 充电中 */ #define PCM_GUN_STATE_CHARGE_STOP 6 /* 充电停止 */ #define PCM_GUN_STATE_CHARGE_STOPPED 7 /* 充电停止完成 */ /* 接触器状态 */ #define PCM_CONTACTOR_OPEN 0 /* 断开 */ #define PCM_CONTACTOR_CLOSE 1 /* 闭合 */ /* 模块启停状态 */ #define PCM_MODULE_STANDBY 0 /* 待机 */ #define PCM_MODULE_WORK 1 /* 工作 */ /* 故障状态 */ #define PCM_FAULT_NONE 0 /* 无故障 */ #define PCM_FAULT_EXIST 1 /* 故障 */ /*------ Exported struct(结构体定义) --------------------*/ /** * @brief PCM 通用帧头结构 */ typedef struct { U16_T u16_head; /* 帧头:0x5A99 */ U8_T u8_cmd; /* 帧功能码 */ U8_T u8_len; /* 数据长度 */ }__attribute__((packed)) S_PCM_FRAME_HEAD; /** * @brief PCM 通用帧结构(完整帧) */ typedef struct { U16_T u16_head; /* 帧头:0x5A99 */ U8_T u8_cmd; /* 帧功能码 */ U8_T u8_len; /* 数据长度 */ U8_T u8_data[PCM_FRAME_MAX_DATA_LEN]; /* 帧数据 */ U8_T u8_crc; /* CRC校验 */ U8_T u8_tail; /* 帧尾:0xA5 */ }__attribute__((packed)) S_PCM_FRAME; /** * @brief 单组终端枪数据(用于终端发送请求帧) * 对应协议中:终端枪地址 + 工作状态 + 接触器状态x2 + 需求电压 + 需求电流 + 故障状态 + 故障原因 * 每组 11 字节 */ typedef struct { U8_T u8_gun_addr; /* 终端枪地址 */ U8_T u8_work_state; /* 终端枪工作状态 */ U8_T u8_contactor_dc; /* 直流输出接触器状态 */ U8_T u8_contactor_discharge; /* 直流输出泄放接触器状态 */ U16_T u16_need_vol; /* 需求电压 BE 0.1V */ U16_T u16_need_cur; /* 需求电流 BE 0.1A */ U8_T u8_fault_state; /* 终端枪故障状态 */ U16_T u16_fault_reason; /* 终端枪故障原因 BE */ }__attribute__((packed)) S_PCM_GUN_TERM_DATA; /** * @brief 单组主机应答数据(用于解析主机应答帧) * 对应协议中:终端枪地址 + 模块启停 + 输出电压 + 输出电流 + 主机故障状态 + 主机故障原因 * 每组 9 字节 */ typedef struct { U8_T u8_gun_addr; /* 终端枪地址 */ U8_T u8_module_state; /* 模块启停状态 */ U16_T u16_out_vol; /* 输出电压 BE 0.1V */ U16_T u16_out_cur; /* 输出电流 BE 0.1A */ U8_T u8_host_fault; /* 主机故障状态 */ U16_T u16_host_fault_reason; /* 主机故障原因 BE */ }__attribute__((packed)) S_PCM_GUN_HOST_DATA; /** * @brief PCM 主机通信状态(收到的对端信息) */ typedef struct { U32_T u32_host_ip; /* 主机IP地址(网络字节序) */ U16_T u16_host_port; /* 主机端口(网络字节序) */ /* 主机下发的应答数据 */ U8_T u8_gun_num; /* 主机回复的枪数量 */ S_PCM_GUN_HOST_DATA s_gun_data[GUN_MAX_CNT]; /* 各枪应答数据 */ /* 通信状态 */ U32_T u32_last_recv_time; /* 最后接收时间(ms) */ U8_T u8_comm_ok; /* 通信状态:0超时 1正常 */ }__attribute__((packed)) S_PCM_HOST_STATE; /** * @brief PCM 终端通信数据 */ typedef struct { U8_T u8_term_no; /* 终端编号(1开始,对应主机编号) */ U32_T u32_term_ip; /* 本机(终端)IP地址(网络字节序) */ U16_T u16_term_port; /* 本机(终端)端口(网络字节序) */ /* 主机信息 */ U32_T u32_host_ip; /* 目标主机IP地址(网络字节序) */ U16_T u16_host_port; /* 目标主机端口(网络字节序) */ S_PCM_HOST_STATE s_host; /* 主机通信状态 */ /* 本机(终端)枪数据(待发送给主机) */ U8_T u8_gun_num; /* 本机终端枪数量 */ S_PCM_GUN_TERM_DATA s_gun_data[GUN_MAX_CNT]; /* 各枪数据 */ /* 定时器 */ U32_T u32_heartbeat_tick; /* 心跳发送计时 */ U32_T u32_request_tick; /* 请求发送计时 */ }__attribute__((packed)) S_PCM_COMM_DATA; /*------ Exported variables(变量定义) -------------------*/ /*------ Exported function prototypes (函数声明) -------*/ /** * @brief 初始化 PCM UDP 通信(终端角色) * * @param u8_term_no 终端编号(1开始,对应主机编号) * @return S8_T 0成功 -1失败 */ S8_T s8_pcm_udp_init(void); /** * @brief PCM UDP 周期处理函数 * * @param u16_sleep_time_ms 任务周期时间(ms) */ void v_pcm_udp_periodic_handler(U16_T u16_sleep_time_ms); /** * @brief PCM UDP 非阻塞接收处理 * * @return U8_T 0无数据 1收到有效数据 */ U8_T u8_pcm_udp_recv_process(void); /** * @brief PCM 通信主处理函数(由 mdu_comm_task 调用) * * @param u16_sleep_time_ms 任务周期时间(ms) */ void v_pcm_comm_gw_action(U16_T u16_sleep_time_ms); /** * @brief 发送分桩心跳帧(功能码0x10) * * @return S8_T 0成功 -1失败 */ S8_T s8_pcm_send_term_heartbeat(void); /** * @brief 发送分桩请求帧(功能码0x12) * * @return S8_T 0成功 -1失败 */ S8_T s8_pcm_send_term_request(void); /** * @brief 获取主机通信状态 * * @return U8_T 0超时 1正常 */ U8_T u8_pcm_get_host_comm_status(void); /** * @brief 获取主机应答枪数据 * * @param u8_gun_index 枪索引 * @return S_PCM_GUN_HOST_DATA* 主机应答数据指针,失败返回NULL */ S_PCM_GUN_HOST_DATA* ps_pcm_get_host_gun_data(U8_T u8_gun_index); /** * @brief 更新本机(终端)枪数据(由外部模块调用) * * @param u8_gun_index 枪索引 * @param ps_data 终端枪数据指针 */ void v_pcm_update_term_gun_data(U8_T u8_gun_index, const S_PCM_GUN_TERM_DATA *ps_data); #ifdef __cplusplus } #endif #endif /* PCM_COMM_H */