Files
CCU621M/app/mdu_comm/mdu_interface.c
T

554 lines
18 KiB
C

#include "mdu_comm/mdu_interface.h"
#include "mdu_comm/mdu_comm_task.h"
#include "publicdata/publicdata.h"
#include "fault_cheak/fault_interface.h"
#include "collect_ctrl/collect_task.h"
#include "flowctrl/flow_interface.h"
#include "mdu_comm/PCM_comm.h"
extern S_MDU_DATA s_mdu_data;
extern S_PCM_COMM_DATA s_pcm_comm;
#define TEST_MDU_CTRL_FLAG (0) //模块控制 测试标志
/* 0: 屏蔽系统取数(流程/采样/故障联动), 1: 使能系统取数 */
#define MDU_SYS_FETCH_ENABLE (1)
#if TEST_MDU_CTRL_FLAG
typedef struct
{
U8_T u8_start_flag; //模块任务执行标志 0 不执行 1执行
U8_T u8_cmd; //模块控制命令 0无 1快速启机 2快速启机停(不清空分组) 3软启开机 4充电停止(清空分组)
U16_T u16_need_vol; //单模块需求电压 0.1V
U16_T u16_one_mdu_need_cur; //单模块需求电压 0.1V
}TEST_MDU_TRL_DATA;
TEST_MDU_TRL_DATA test_mdu_ctrl[GUN_MAX_CNT]; //按枪控制
#endif
#if 1 //外部参数获取
/**
* ************************************************************************
* @brief - 流程控制任务 对外输出数据
* 0 空闲 1插枪 2绝缘启动 3绝缘停止 4预充启动 5充电中 6充电停止 7充电停止完成
* @param[in] u8_gunNo - 枪号 0-N 对于不分区枪号的数据,无意义
*
* @return U8_T - 数据返回值
*
* @author jiankalka
* @date 2025-09-03
* ************************************************************************
*/
U8_T u8_mdu_put_data(U8_T u8_gunNo)
{
U8_T u8_ret = 0;
U8_T u8_gunlink = u8_get_gun_yx_data(YX_GUN_LINK,u8_gunNo);
U16_T u16_gun_real_state = u16_flow_put_data(u8_gunNo, E_FLOW_PUT_DATA_GUN_REAL_STATE, 0);
if(u8_gunlink == 0 && u16_gun_real_state == 0)
{
u8_ret = 0; //枪未连接且状态为0空闲
}
else if(u8_gunlink == 1 && (u16_gun_real_state == 0 || u16_gun_real_state == 1))
{
u8_ret = 1; //枪已连接且状态为0空闲
}
else if(u8_gunlink == 1 && u16_gun_real_state == 2 )
{
u8_ret = 2; //枪已连接且状态为2绝缘启动
}
else if(u8_gunlink == 1 && (u16_gun_real_state == 4 || u16_gun_real_state == 3 || u16_gun_real_state == 8))
{
u8_ret = 3; //枪已连接且状态为4绝缘检测模块停止
}
else if(u8_gunlink == 1 && (u16_gun_real_state == 5 || u16_gun_real_state == 6))
{
u8_ret = 4; //枪已连接且状态为5开始预充
}
else if(u8_gunlink == 1 && u16_gun_real_state == 7)
{
u8_ret = 5; //枪已连接且状态为7充电中
}
else if(u8_gunlink == 1 && u16_gun_real_state == 9 )
{
u8_ret = 6; //枪已连接且状态为9充电停止
}
else if(u8_gunlink == 1 && u16_gun_real_state == 10)
{
u8_ret = 7; //枪已连接且状态为10充电停止完成
}
return u8_ret;
}
/**
* ************************************************************************
* @brief -获取充电枪 充电需求
*
* @param[in] u8_id -id号 当作为枪号时,0-N; 当作为模块地址号时,0-N
* @param[in] type - 数据类型
* E_MDU_GET_DATA_GUN_CMD = 0, //枪命令状态 0无 1快速启机 2快速启机停(不清空分组) 3软启开机 4充电停止(清空分组)
E_MDU_GET_DATA_MAIN_KY, //主回路接触器状态
E_MDU_GET_DATA_POWER_KY, //功率回路接触器状
E_MDU_GET_DATA_NEED_VOL, //需求电压 精度 0.1
E_MDU_GET_DATA_NEED_CUR, //需求电流 精度 0.1
E_MDU_GET_DATA_BAAT_VOL, //电池电压 精度 0.1
* @return U16_T - 对应数据值
*
* @author jiankalka
* @date 2025-07-04
* ************************************************************************
*/
U16_T u16_mdu_get_charge_need(U8_T u8_id, E_MDU_GET_DATA_TYPE type)
{
U16_T u16_res = 0;
switch (type)
{
case E_MDU_GET_DATA_GUN_CMD: //枪命令状态 0无 1快速启机 2快速启机停(不清空分组) 3软启开机 4充电停止(清空分组)
{
#if (MDU_SYS_FETCH_ENABLE == 1)
u16_res = u16_flow_put_data(u8_id , E_FLOW_PUT_DATA_MDU_YK_CMD,0); //模块遥控命令 0无 1快速启机 2快速启机停(不清空分组) 3软启开机 4充电停止(清空分组)
#else
u16_res = 0;
#endif
#if TEST_MDU_CTRL_FLAG
u16_res = test_mdu_ctrl[u8_id].u8_cmd;
#endif
break;
}
case E_MDU_GET_DATA_MAIN_KY: //主回路接触器状态
{
u16_res = 1;
break;
}
case E_MDU_GET_DATA_POWER_KY: //功率回路接触器状
{
u16_res = 1;
break;
}
case E_MDU_GET_DATA_NEED_VOL: //需求电压 精度 0.1
{
#if (MDU_SYS_FETCH_ENABLE == 1)
u16_res = u16_flow_put_data(u8_id , E_FLOW_PUT_DATA_MDU_NEED_VOL,0); //需求电压 精度 0.1
#else
u16_res = 0;
#endif
#if TEST_MDU_CTRL_FLAG
u16_res = test_mdu_ctrl[u8_id].u16_need_vol;
#endif
break;
}
case E_MDU_GET_DATA_NEED_CUR_ONE: //单模块需求电流 精度 0.1 -- 流程控制计算好
{
#if (MDU_SYS_FETCH_ENABLE == 1)
u16_res = u16_flow_put_data(u8_id , E_FLOW_PUT_DATA_MDU_ONE_NEED_CUR,0); //单模块需求电流值 精度0.1
#else
u16_res = 0;
#endif
#if TEST_MDU_CTRL_FLAG
u16_res = test_mdu_ctrl[u8_id].u16_one_mdu_need_cur;
#endif
break;
}
case E_MDU_GET_DATA_BAAT_VOL: //电池电压 精度 0.1
{
#if (MDU_SYS_FETCH_ENABLE == 1)
u16_res = (U16_T)((f32_get_gun_yc_data(ADC_GUN_VOLT_PLUS,u8_id) + f32_get_gun_yc_data(ADC_GUN_VOLT_MINUS,u8_id))*10);
#else
u16_res = 0;
#endif
#if TEST_MDU_CTRL_FLAG
u16_res = test_mdu_ctrl[u8_id].u16_need_vol;
#endif
break;
}
case E_MDU_GET_DATA_START_FALG: //模块启停标志
{
#if (MDU_SYS_FETCH_ENABLE == 1)
u16_res = u16_flow_put_data(u8_id ,E_FLOW_PUT_DATA_MDU_STAR_FLAG, 0);
#else
u16_res = 0;
#endif
break;
}
case E_MDU_GET_DATA_SHW_ON_FLAG: //模块对应开关闭合标志
{
#if (MDU_SYS_FETCH_ENABLE == 1)
u16_res = 1;
// u16_res = u16_flow_put_data(u8_id , E_FLOW_PUT_DATA_MDU_SHW_ON_FLAG, 0);
#else
u16_res = 1;
#endif
break;
}
case E_MDU_GET_DATA_IN_PILE_ID: //模块归属终端号
{
if(g_t_share_data.t_sys_fix_cfg.u8_gunCnt == 1 ||
u8_id < ((s_mdu_data.u8_mdu_num+1) / 2)) // 前半部分为1枪 后半部分为2枪 模块数量为奇数时,1枪多一个
u16_res = 1;
else
u16_res = 2;
break;
}
case E_MDU_GET_DATA_MDU_NUM: //充电模块数量
{
#if (MDU_SYS_FETCH_ENABLE == 1)
u16_res = g_t_share_data.t_sys_fix_cfg.u8_mdu_num;
#else
u16_res = s_mdu_data.u8_mdu_num;
#endif
break;
}
case E_MDU_GET_DATA_GUN_NUM: //充电枪数量
{
#if (MDU_SYS_FETCH_ENABLE == 1)
u16_res = g_t_share_data.t_sys_fix_cfg.u8_gunCnt;
#else
u16_res = s_mdu_data.u8_mdu_group_num;
#endif
break;
}
case E_MDU_GET_DATA_RUNING_FLAG: //模块任务运行标志 0模块任务不运行并清空模块数据 1模块任务运行-执行报文收发和超时判断
{
#if (MDU_SYS_FETCH_ENABLE == 1)
u16_res = u16_flow_put_data(u8_id , E_FLOW_PUT_DATA_MDU_STAR_FLAG,0); //模块运行开始标志 0未开始 1开始
#else
u16_res = 0;
#endif
#if TEST_MDU_CTRL_FLAG
u16_res = test_mdu_ctrl[u8_id].u8_start_flag;
#endif
break;
}
case E_MDU_GET_DATA_MDU_TYPE:
{
#if (MDU_SYS_FETCH_ENABLE == 1)
u16_res = g_t_share_data.t_sys_fix_cfg.u8_MduType;
#else
u16_res = s_mdu_data.u8_mdu_type;
#endif
break;
}
default:
break;
}
return u16_res;
}
#endif
#if 1 //对外数据提供
/**
* ************************************************************************
* @brief - 获取模块组内运行模块的数量 模块工作状态为 工作
*
* @param[in] u8_gunNo - 抢号序号 0-N
* @param[in] type - type 数据类型 0归属本枪模块数量 1归属本枪且正在运行中模块数量
*
* @return U8_T -
*
* @author jiankalka
* @date 2025-08-28
* ************************************************************************
*/
static U8_T u8_mdu_swh__get_runing_num(U8_T u8_gunNo ,U8_T type)
{
U8_T i;
U8_T u8_inPile_num = 0 , u8_runing_num = 0;
for ( i = 0; i < s_mdu_data.u8_mdu_num; i++) //遍历所有模块
{
if(s_mdu_data.s_mdu[i].s_ctrl.u8_mdu_in_pile == u8_gunNo+1)
{
u8_inPile_num ++;
if(s_mdu_data.s_mdu[i].s_state.e_work_state == E_MDU_WORK)
u8_runing_num ++;
}
}
if(type == 0)
return u8_inPile_num;
else
return u8_runing_num;
}
/**
* ************************************************************************
* @brief - 获取模块温度值
* 模块采集两个温度,进风口温度,内部元器件温度;咱们之前PT1000采集的是出风口温度。
* 之前不调速的风机方案:出风口温度取值为各个模块进风口温度与内部元器件温度的平均值的最大值。
*
* @return U16_T - 温度最大值
*
* @author jiankalka
* @date 2025-09-16
* ************************************************************************
*/
static U16_T u16_mdu_get_temp()
{
U8_T i;
S8_T s8_temp_1,s8_temp_2,s8_temp_3,s8_temp_max = 0;
for (i = 0; i < s_mdu_data.u8_mdu_num; i++) //遍历所有模块
{
if(s_mdu_data.s_mdu[i].s_state.e_state == E_MDU_STATE_NORMAL) //模块状态正常
{
s8_temp_1 = s_mdu_data.s_mdu[i].s_state.s8_mdutemp_1;
s8_temp_2 = s_mdu_data.s_mdu[i].s_state.s8_mduPara_2;
if(s8_temp_1 != 0 && s8_temp_2 != 0) //数据不为0
{
s8_temp_3 = (s8_temp_1+s8_temp_2)/2;
s8_temp_max = (s8_temp_max > s8_temp_3)?s8_temp_max:s8_temp_3; //获取最大值
}
}
}
if(s8_temp_max < 0) s8_temp_max = 0; //最小为0
return s8_temp_max;
}
U16_T u16_mdu_put_data(U8_T u8_id , E_MDU_PUT_DATA_TYPE e_type)
{
U16_T u16_res;
// 根据桩类型判断通讯方式:一体机(0/1)使用CAN模块通讯,分体机(2/3)使用PCM通讯
if(u16_flow_get_sys_data(0, E_FLOW_GET_DATA_PILE_TYPE,0) < 2)
{
switch (e_type)
{
case E_MDU_PUT_DATA_usable_num: //可用模块数量
{
u16_res = s_mdu_data.u8_mdu_usable_num;
break;
}
case E_MDU_PUT_DATA_using_num: //在用模块的数量
{
u16_res = s_mdu_data.u8_mdu_using_num;
break;
}
case E_MDU_PUT_DATA_ID_commFlag: //模块通信状态 0 未通信 1通信
{
u16_res = (s_mdu_data.s_mdu[u8_id].s_state.e_state == E_MDU_STATE_NONE)?0:1;
break;
}
case E_MDU_PUT_DATA_ID_workSate: //模块工作状态 0空闲 1工作
{
u16_res = s_mdu_data.s_mdu[u8_id].s_state.e_work_state;
break;
}
case E_MDU_PUT_DATA_ID_faultFlag: //模块故障标志 0正常 1故障
{
u16_res = (s_mdu_data.s_mdu[u8_id].s_state.e_state == E_MDU_STATE_FAULT)?1:0;
break;
}
case E_MDU_PUT_DATA_ID_gropNum: //模块组号 0-N
{
u16_res = s_mdu_data.s_mdu[u8_id].s_state.u8_groupNo;
break;
}
case E_MDU_PUT_DATA_ID_putVol: //模块输出电压 精度 0.1V
{
u16_res = s_mdu_data.s_mdu[u8_id].s_state.u16_outVol;
break;
}
case E_MDU_PUT_DATA_ID_putCur: //模块输出电流 精度 0.1A
{
u16_res = s_mdu_data.s_mdu[u8_id].s_state.u16_outCur;
break;
}
case E_MDU_PUT_DATA_GROUP_WORK_STATE:
{
u16_res = s_mdu_data.s_mdu_group[u8_id].u8_work_state; //模块组工作状态 0空闲 1工作
break;
}
case E_MDU_PUT_DATA_GROUP_putVol: //模块组输出电压 精度0.1V
{
u16_res = s_mdu_data.s_mdu_group[u8_id].u16_outVol;
break;
}
case E_MDU_PUT_DATA_GROUP_putCur: //模块组输出电流 精度0.1A
{
u16_res = s_mdu_data.s_mdu_group[u8_id].u16_outCur;
break;
}
case E_MDU_PUT_DATA_GROUP_mduNum: //模块组分配模块数量
{
u16_res = s_mdu_data.s_mdu_group[u8_id].u8_on_group_num;
break;
}
case E_MDU_PUT_DATA_GROUP_RUNING_mduNum: //模块组运行模块数量
{
u16_res = u8_mdu_swh__get_runing_num(u8_id,1);
break;
}
case E_MDU_PUT_DATA_MDU_TEMP: //获取模块上送温度值- 单位 度,范围0-100,注意最低为0度
{
u16_res = u16_mdu_get_temp();
break;
}
default:
break;
}
}
else // 分体机:使用网线PCM通讯
{
switch (e_type)
{
case E_MDU_PUT_DATA_usable_num: //可用模块数量
{
u16_res = s_mdu_data.u8_mdu_usable_num;
break;
}
case E_MDU_PUT_DATA_using_num: //在用模块的数量
{
u16_res = s_mdu_data.u8_mdu_using_num;
break;
}
case E_MDU_PUT_DATA_ID_commFlag: //模块通信状态 0 未通信 1通信
{
u16_res = (s_mdu_data.s_mdu[u8_id].s_state.e_state == E_MDU_STATE_NONE)?0:1;
break;
}
case E_MDU_PUT_DATA_ID_workSate: //模块工作状态 0空闲 1工作
{
u16_res = s_pcm_comm.s_host.s_gun_data[u8_id].u8_module_state;
break;
}
case E_MDU_PUT_DATA_ID_faultFlag: //模块故障标志 0正常 1故障
{
u16_res = (s_mdu_data.s_mdu[u8_id].s_state.e_state == E_MDU_STATE_FAULT)?1:0;
break;
}
case E_MDU_PUT_DATA_ID_gropNum: //模块组号 0-N
{
u16_res = s_mdu_data.s_mdu[u8_id].s_state.u8_groupNo;
break;
}
case E_MDU_PUT_DATA_ID_putVol: //模块输出电压 精度 0.1V
{
u16_res = s_pcm_comm.s_host.s_gun_data[u8_id].u16_out_vol;
break;
}
case E_MDU_PUT_DATA_ID_putCur: //模块输出电流 精度 0.1A
{
u16_res = s_pcm_comm.s_host.s_gun_data[u8_id].u16_out_cur;
break;
}
case E_MDU_PUT_DATA_GROUP_WORK_STATE:
{
u16_res = s_pcm_comm.s_host.s_gun_data[u8_id].u8_module_state; //模块组工作状态 0空闲 1工作
break;
}
case E_MDU_PUT_DATA_GROUP_putVol: //模块组输出电压 精度0.1V
{
u16_res = s_pcm_comm.s_host.s_gun_data[u8_id].u16_out_vol;
break;
}
case E_MDU_PUT_DATA_GROUP_putCur: //模块组输出电流 精度0.1A
{
u16_res = s_pcm_comm.s_host.s_gun_data[u8_id].u16_out_cur;
break;
}
case E_MDU_PUT_DATA_GROUP_mduNum: //模块组分配模块数量
{
u16_res = s_mdu_data.s_mdu_group[u8_id].u8_on_group_num;
break;
}
case E_MDU_PUT_DATA_GROUP_RUNING_mduNum: //模块组运行模块数量
{
u16_res = u8_mdu_swh__get_runing_num(u8_id,1);
break;
}
case E_MDU_PUT_DATA_MDU_TEMP: //获取模块上送温度值- 单位 度,范围0-100,注意最低为0度
{
u16_res = u16_mdu_get_temp();
break;
}
default:
break;
}
}
return u16_res;
}
#endif
#if 1 //模块故障告警控制
/**
* ************************************************************************
* @brief - 模块通信故障 设置
*
* @param[in] u8_id - 模块地址 0-N ,单模块通信超时 为告警; 值为0xFF时 表示所有模块通信超时,为故障
* @param[in] u8_flag - 0 回复 1超时
*
*
* @author jiankalka
* @date 2025-09-17
* ************************************************************************
*/
void v_mdu_set_comm_fault_info(U8_T u8_id,U8_T u8_flag)
{
#if (MDU_SYS_FETCH_ENABLE == 1)
U8_T u8_fault_flag;
E_FAULT_SITE e_fite;
E_FAULT_TYPE e_type;
if(u32_safe_seconds_since(s_mdu_data.u32_runing_time) < NUM_10) //模块上电10秒内 不进行故障判断
return;
if(u8_id == MODULE_ALL) //所有模块通信故障 动作
{
e_fite = E_WHOLE_HOST; //故障位置为整机
e_type = E_FAULT; //故障
}
else //单个模块 故障动作
{
e_fite = (E_FAULT_SITE)(E_CHAR_MDU+u8_id); //故障位置为模块
e_type = E_WARN; //告警
}
u8_fault_flag = u8_cheak_fault_flag(E_FAULT_14019,e_fite); //获取故障标志
if(u8_fault_flag == 0 && u8_flag == 1)
v_set_fault_data(e_fite,e_type,E_FAULT_14019,0,0,0);
else if(u8_fault_flag != 0 && u8_flag == 0)
v_set_fault_data(e_fite,E_RES,E_FAULT_14019,0,0,0);
#else
(void)u8_id;
(void)u8_flag;
#endif
}
/**
* ************************************************************************
* @brief - 模块故障告警动作
*
* @param[in] u8_id - 模块地址 0-N ,单模块通信超时 为告警; 值为0xFF时 表示所有模块通信超时,为故障
* @param[in] u8_flag - 0 回复 1超时
* @param[in] u_alarm_data - 故障信息
*
*
* @author jiankalka
* @date 2025-09-17
* ************************************************************************
*/
void v_mdu_set_alarm_info(U8_T u8_id,U8_T u8_flag, U_MDU_ALARM_DATA *u_alarm_data)
{
}
#endif