Files
CCU621M/app/mdu_comm/mdu_comm_task.h
T

215 lines
8.5 KiB
C

#ifndef MDU_COMM_TASK_H
#define MDU_COMM_TASK_H
#ifdef __cplusplus /*C++编译环境下兼容C语言*/
extern "C" {
#endif
/*------ Exported includes(头文件) ----------------------*/
#include "mdu_comm/mdu_interface.h"
#include "bsp_include.h"
#if MDU_UULN_EN
#include "mdu_comm/mdu_uuln_comm.h"
#endif
#include "mylog/mylog.h"
/*------ Exported macro(宏定义) -------------------------*/
#define MDU_CAN_PRINT_FLAG (0) //模块报文 调试打印标志
#define MODULE_BROADCAST_ADDR 0x9F //广播地址
#define MODULE_PILE_ADDR 0xA0 //主机地址
#define MODULE_MDU_FIRST_ADDR 0x80 //充电模块首地址
#define MODULE_CMD_HEARTBEAT 0x40 /* 模块心跳命令 */
#define MODULE_CMD_SETTING 0x80 /* 定值设置命令 */
#define MODULE_CMD_GETTING 0x82 /* 定值查询命令 */
#define MODULE_CMD_REMOTE_CONTROL 0x05 /* 遥控命令 */
#define MODULE_CMD_GROUP_SET 0x03 /* 组号设置命令 */
#define MODULE_CMD_HEARTBEAT_ACK 0x41 //心跳应答
#define MODULE_CMD_SETTING_ACK 0x81 //定值设置应答
#define MODULE_CMD_GETTING_ACK 0x83 //定值查询应答
#define MODULE_CMD_YXYC_20 0x20 //遥信遥测20帧
#define MODULE_CMD_YXYC_21 0x21 //遥信遥测21帧
#define MODULE_CMD_TEMP 0xE6 //温度查询帧
#define MODULE_TEMP_OFFSET (50) //模块温度偏移量,50
#define MODULE_ALL (0xFF) //模块接收数据 全部清空
/*------ Exported struct(结构体定义) --------------------*/
#define Mdu_Comm_LOG(fmt, ...) \
MYLOG_MSG(TASK_ID_MduComm,fmt, ##__VA_ARGS__) //任务打印
typedef enum {E_MDU_IDLE = 0, E_MDU_WORK = !E_MDU_IDLE} E_MDU_WORK_STATE;
//模块状态 枚举
typedef enum
{
E_MDU_STATE_NONE=0, //未通信
E_MDU_STATE_NORMAL, //正常
E_MDU_STATE_FAULT, //故障
}E_MDU_STATE;
//模块故障告警数据
typedef union
{
U8_T u8_mdu_alarm;
struct
{
U8_T b0_other:1; //其他故障,0正常,1故障
U8_T b1_relief:1; //泄放故障
U8_T b2_fan:1; //风扇故障
U8_T b3_DC_short:1; //直流输出短路
U8_T b4_overTemp:1; //过温
U8_T b5_DC_UV:1; //直流输出欠压
U8_T b6_DC_OV:1; //直流输出过压
U8_T b7_AC_IN:1; //交流输入故障
}bit_mdu_alarm;
}U_MDU_ALARM_DATA;
typedef union {
uint8_t raw; // 原始字节值
struct {
uint8_t operationCommand : 4; // Bit3~Bit0: 操作指令
/*0x01 --- 快速开机(绝缘检测阶段使用)
0x02 --- 停止充电(保留分组信息)
0x03 --- 软起开机(预启动阶段使用)
0x04 --- 显示地址(显示模块通信地址)
0x05 --- 参数修改
0x06 --- 停止充电(自动清除分组信息)
*/
uint8_t voltageRange : 1; // Bit4: 电压输出范围选择
uint8_t powerContactor : 1; // Bit5: 功率分配回路接触器状态
uint8_t mainContactor : 1; // Bit6: 充电回路主接触器状态
uint8_t reserved : 1; // Bit7: 预留
} bits;
}U_MDU_YK_DEVICE_STATUS;
typedef struct
{
U_MDU_YK_DEVICE_STATUS u_dev_state; //设备状态 包含功率分配回路接触器状态、充电回路主接触器状态等数据
U16_T u16_needVol; //需求电压 精度0.1
U16_T u16_oneMdu_needCur; //单模块需求电流 精度0.1
U16_T u16_battVol; //电池电压 精度0.1
}S_MDU_RemoteCtlrData;
typedef enum {
SEND_MODE_UNICAST, ///< 单点发送:命令发送给特定目标设备
SEND_MODE_BROADCAST ///< 广播发送:命令发送给所有设备
}E_CommandSendMode;
//充电模块接收状态 结构体
typedef struct
{
E_MDU_STATE e_state; //模块状态 未通讯、通信正常、故障
E_MDU_WORK_STATE e_work_state; //模块工作状态 空闲、工作
U8_T u8_groupNo; //模块组号
U8_T u8_GrpMode; //分组模式:【遥测分组模式:0固定分组,1动态分组】
U16_T u16_outVol; //输出电压 精度0.1
U16_T u16_outCur; //输出电流 精度0.1
U16_T u16_outtimecnt; //通信超时计数
U_MDU_ALARM_DATA u_alarm_data; //故障告警数据 0x20 遥信遥测帧上送
#if MDU_UULN_EN
U_UULN_MDU_STATUS u_uuln_state; //优优绿能模块状态保存
E_TrueHiLo_Status e_TrueHiLo_Status; //高低压状态读取 1: 1000V 2: 500V
#endif
//模块温度读取使能
#if( MDU_TEMP_READ_EN == 1)
S8_T s8_mdutemp_1; //模块温度1 进风口温度 单位摄氏度 注意有正负号 范围是 -127 ~ 127
S8_T s8_mduPara_2; //模块温度2 模块PFC温度 单位摄氏度 注意有正负号 范围是 -127 ~ 127
#endif
}S_MDU_STATE;
//充电模块控制命令 结构体
typedef struct
{
E_CMD e_mdu_start_flag; //模块启停状态控制 ON / OFF
U8_T u8_mdu_in_pile; //模块归属枪号 0未分配 1-N分配枪号
U8_T u8_swh_flag; //模块对应输出回路继电器 闭合标志
U8_T u8_mdu_fault_num; //模块故障次数 区分不充电正常,一充电就报错 直接就不能用得了-暂未使用
}S_MDU_CTRL;
typedef struct
{
U8_T u8_mdu_addr; //模块地址 0x80/0x60
S_MDU_CTRL s_ctrl; //模块控制
S_MDU_STATE s_state; //模块状态
}S_MDU_ONE_DATA; //单模块数据
typedef struct
{
U8_T u8_on_group_num; //模块组内模块数量 已分组模块数量
U8_T u8_work_state; //模块组工作状态 0空闲 1工作 --组内有一个模块输出 则是工作
U_MDU_YK_DEVICE_STATUS u_yk_dev_state; //遥控命令状态
U16_T u16_needVol; //需求电压 0.1V
U16_T u16_oneMdu_needCur; //单模块需求电流 0.1A 流程控制计算号后直接使用
U16_T u16_battVol; //电池电压 0.1V
U16_T u16_outVol; //模块组内输出电压0.1V-- 指已投入充电回路的模块
U16_T u16_outCur; //模块组内输出电流0.1A
}S_MDU_GROUP_DATA;
typedef struct
{
U8_T u8_mdu_type; //模块类型
U8_T u8_mdu_num; //模块数量
U8_T u8_mdu_group_num; //模块组数量-- 枪数量
U8_T u8_mdu_usable_num; //可用模块数量 所有通信正常 且无故障模块
U8_T u8_mdu_using_num; //在用模块的数量 所有以分配模块
U8_T u8_can_send_cnt; //can报文发送数量 用于报文发送延时
U16_T u16_timer; //周期计数值
U32_T u32_runing_time; //任务运行时间 刚插枪延时5秒再判断通信超时
U8_T u8_recv_most_pack[20]; //多包数据接收 最多2包,2*7=14个字节数据
//模块参数读取使能 -- 默认同一主机使用的模块参数一致 - 查询第一个可通信的模块参数
#if( MDU_PARA_READ_EN == 1)
U16_T u16_mduPara_MaxOutVol; //模块参数 最大输出电压 精度0.1
U16_T u16_mduPara_MinOutVol; //模块参数 最小输出电压 精度0.1
U16_T u16_mduPara_MaxOutCur; //模块参数 最大输出电流 精度0.1
U16_T u16_mduPara_MinOutCur; //模块参数 最小输出电流 精度0.1
#endif
S_MDU_ONE_DATA s_mdu[MDU_MAX_NUM]; //模块状态
S_MDU_GROUP_DATA s_mdu_group[GUN_MAX_CNT]; //模块组状态
}S_MDU_DATA;
/*------ Exported variables(变量定义) -------------------*/
/*------ Exported function prototypes (函数声明) -------*/
void v_MduCanMsg_send(CAN_DATA* can_data);
U8_T u8_MduCanMsg_recv(CAN_DATA *rx_can_data);
void v_mdu_clear_recv_data(U8_T u8_id);
void v_mdu_data_summ(void);
/* STM32 状态 CAN 数据获取接口 */
U8_T u8_stm_status_get_gun_plug(U8_T u8_gunNo); // 0:A枪 1:B枪 返回0未插枪 1插枪
U8_T u8_stm_status_get_di(U8_T u8_index); // 0:DI1 1:DI2 返回0/1
void v_Mdu_Comm_task(void *argument);
#ifdef __cplusplus
}
#endif
#endif /* MDU_COMM_TASK_H */