Files
CCU621M/app/mdu_comm/PCM_comm.h
T

247 lines
8.5 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.
#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 */