#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 */