diff --git a/checher_slave.uvoptx b/checher_slave.uvoptx index 2d0fd03..32729a5 100644 --- a/checher_slave.uvoptx +++ b/checher_slave.uvoptx @@ -299,7 +299,7 @@ 1 0 - 1 + 0 18 @@ -523,7 +523,7 @@ 1 0 - 0 + 1 18 @@ -551,7 +551,7 @@ 1 0 0 - 6 + 4 @@ -562,7 +562,7 @@ - STLink\ST-LINKIII-KEIL_SWO.dll + Segger\JL2CM3.dll @@ -583,7 +583,7 @@ 0 DLGUARM - (105=-1,-1,-1,-1,0) + d 0 @@ -612,8 +612,8 @@ 1 - 0 - uid_psw + 1 + 0x200033B0 0 @@ -1459,6 +1459,18 @@ 0 0 + + 6 + 61 + 1 + 0 + 0 + 0 + .\source\elec_det\elec_judge.c + elec_judge.c + 0 + 0 + @@ -1469,7 +1481,7 @@ 0 7 - 61 + 62 1 0 0 @@ -1481,7 +1493,7 @@ 7 - 62 + 63 1 0 0 @@ -1501,7 +1513,7 @@ 0 8 - 63 + 64 1 0 0 @@ -1513,7 +1525,7 @@ 8 - 64 + 65 1 0 0 @@ -1525,7 +1537,7 @@ 8 - 65 + 66 1 0 0 @@ -1537,7 +1549,7 @@ 8 - 66 + 67 1 0 0 @@ -1549,7 +1561,7 @@ 8 - 67 + 68 1 0 0 @@ -1561,7 +1573,7 @@ 8 - 68 + 69 1 0 0 @@ -1573,7 +1585,7 @@ 8 - 69 + 70 1 0 0 @@ -1585,7 +1597,7 @@ 8 - 70 + 71 1 0 0 @@ -1597,7 +1609,7 @@ 8 - 71 + 72 1 0 0 @@ -1609,7 +1621,7 @@ 8 - 72 + 73 1 0 0 @@ -1621,7 +1633,7 @@ 8 - 73 + 74 1 0 0 @@ -1633,7 +1645,7 @@ 8 - 74 + 75 1 0 0 @@ -1645,7 +1657,7 @@ 8 - 75 + 76 1 0 0 @@ -1657,7 +1669,7 @@ 8 - 76 + 77 1 0 0 @@ -1669,7 +1681,7 @@ 8 - 77 + 78 1 0 0 @@ -1681,7 +1693,7 @@ 8 - 78 + 79 1 0 0 @@ -1693,7 +1705,7 @@ 8 - 79 + 80 1 0 0 @@ -1705,7 +1717,7 @@ 8 - 80 + 81 1 0 0 @@ -1717,7 +1729,7 @@ 8 - 81 + 82 2 0 0 @@ -1737,7 +1749,7 @@ 0 9 - 82 + 83 1 0 0 @@ -1749,7 +1761,7 @@ 9 - 83 + 84 1 0 0 @@ -1761,7 +1773,7 @@ 9 - 84 + 85 1 0 0 @@ -1773,7 +1785,7 @@ 9 - 85 + 86 1 0 0 @@ -1785,7 +1797,7 @@ 9 - 86 + 87 1 0 0 @@ -1797,7 +1809,7 @@ 9 - 87 + 88 1 0 0 @@ -1809,7 +1821,7 @@ 9 - 88 + 89 1 0 0 @@ -1821,7 +1833,7 @@ 9 - 89 + 90 1 0 0 @@ -1833,7 +1845,7 @@ 9 - 90 + 91 1 0 0 @@ -1845,7 +1857,7 @@ 9 - 91 + 92 1 0 0 @@ -1857,7 +1869,7 @@ 9 - 92 + 93 1 0 0 @@ -1877,7 +1889,7 @@ 0 10 - 93 + 94 1 0 0 @@ -1889,7 +1901,7 @@ 10 - 94 + 95 1 0 0 @@ -1901,7 +1913,7 @@ 10 - 95 + 96 1 0 0 @@ -1913,7 +1925,7 @@ 10 - 96 + 97 1 0 0 @@ -1925,7 +1937,7 @@ 10 - 97 + 98 1 0 0 @@ -1945,7 +1957,7 @@ 0 11 - 98 + 99 1 0 0 @@ -1965,7 +1977,7 @@ 0 12 - 99 + 100 1 0 0 @@ -1977,7 +1989,7 @@ 12 - 100 + 101 1 0 0 @@ -1989,7 +2001,7 @@ 12 - 101 + 102 1 0 0 @@ -2001,7 +2013,7 @@ 12 - 102 + 103 1 0 0 @@ -2013,7 +2025,7 @@ 12 - 103 + 104 1 0 0 @@ -2025,7 +2037,7 @@ 12 - 104 + 105 1 0 0 @@ -2045,7 +2057,7 @@ 0 13 - 105 + 106 5 0 0 @@ -2065,7 +2077,7 @@ 0 14 - 106 + 107 5 0 0 @@ -2077,7 +2089,7 @@ 14 - 107 + 108 5 0 0 diff --git a/checher_slave.uvprojx b/checher_slave.uvprojx index a6deba6..eda6663 100644 --- a/checher_slave.uvprojx +++ b/checher_slave.uvprojx @@ -929,6 +929,11 @@ 1 .\source\elec_det\elec_io.c + + elec_judge.c + 1 + .\source\elec_det\elec_judge.c + @@ -3684,6 +3689,11 @@ 1 .\source\elec_det\elec_io.c + + elec_judge.c + 1 + .\source\elec_det\elec_judge.c + @@ -4919,6 +4929,11 @@ 1 .\source\elec_det\elec_io.c + + elec_judge.c + 1 + .\source\elec_det\elec_judge.c + diff --git a/python/prottcp.py b/python/prottcp.py index e46c48a..8eb04c4 100644 --- a/python/prottcp.py +++ b/python/prottcp.py @@ -141,30 +141,36 @@ def scheme_to_byte(j:json): # int转数组 def arr_from_int(num:int): return bytearray([num&0xff,(num>>8)&0xff,(num>>16)&0xff,(num>>24)&0xff]) +# uchar转数组 +def arr_from_uchar(num:int): + return bytearray([num&0xff]) +# u16转数组 +def arr_from_u16(num:int): + return bytearray([num&0xff,(num>>8)&0xff]) # 提取方案中的范围数据, 先max后min def scheme_get_task_range(j:json): t=bytearray() - t+=arr_from_int(j["TaskID"]) - t+=arr_from_int(j["TaskIndex"]) - t+=arr_from_int(j["ReturnCount"]) - t+=arr_from_int(j["ExecuteErrCode"]) + t+=arr_from_uchar(j["TaskID"]) + t+=arr_from_uchar(j["TaskIndex"]) + t+=arr_from_uchar(j["ReturnCount"]) + t+=arr_from_uchar(j["ExecuteErrCode"]) index=0 for i in j["TestStandard"]: - t+=arr_from_int(i["Max"]) - t+=arr_from_int(i["Min"]) + t+=arr_from_u16(i["Max"]) + t+=arr_from_u16(i["Min"]) if (index=e->scheme->task_num) {\ + elec_add_errcode(e,6);\ + return ;} +// 任务判定标志校验 +#define TASK_FLAG_CHECK(index){\ + if(e->judge_flag[index/8]&(1<<(index%8))){\ + return;}\ + else{\ + e->judge_flag[index/8]|=(1<<(index%8));}}\ +// 任务执行结果校验 +#define EXE_FLAG_CHECK(index)\ + (e->exe_flag[index/8]&(1<<(index%8)))?1:0 +// 取任务结果的第index位 +#define GET_RET_DATA(i)\ + (data[i*2]|(data[i*2+1]<<8)) + + + +// 添加错误代码 +static void elec_add_errcode(elec_judge_def *e,int err) +{ + int index=-1; + for(int i=0;ierr_list[i]==0){ + if(index<0) index=i; + } + if(e->err_list[i]==err){ + return; + } + } + if(index>=0){ + e->err_list[index]=err; + } +} + + + +// 计算方案有多少个返回值 +static int elec_get_ret_num(void) +{ + const scheme_def *s=check_scheme(); + const scheme_task_def *t; + int index=0; + for(int i=0;itask_num;i++) + { + t=&s->task[i]; + index+=t->item_num; + } + return index; +} + + + + +// 通用任务判定函数 +static void elec_task_judge(elec_judge_def *e,int index,uint8_t *data) +{ + INDEX_CHECK(index); + TASK_FLAG_CHECK(index); + const scheme_task_def *task=&e->scheme->task[index]; + uint16_t temp; + if(EXE_FLAG_CHECK(index)){ + elec_add_errcode(e,task->err); + } + for(int i=0;iitem_num;i++){ + temp=data[i*2]|(data[i*2+1]<<8); + if(temprange[i].min||temp>task->range[i].max){ + elec_add_errcode(e,task->range[i].err); + } + } +} + + + +// 电源准备 +static void elec_power_on(elec_judge_def *e,int index,uint8_t *data) +{ + INDEX_CHECK(index); + TASK_FLAG_CHECK(index); + const scheme_task_def *task=&e->scheme->task[index]; + uint16_t temp; + if(EXE_FLAG_CHECK(index)){ + elec_add_errcode(e,1); + } +} + + +// 上电充能 +static void elec_charge(elec_judge_def *e,int index,uint8_t *data) +{ + INDEX_CHECK(index); + TASK_FLAG_CHECK(index); + const scheme_task_def *task=&e->scheme->task[index]; + uint16_t temp; + temp=GET_RET_DATA(0); + if(temprange[0].min||temp>task->range[0].max){ + elec_add_errcode(e,1); + } + temp=GET_RET_DATA(1); + if(temprange[1].min||temp>task->range[1].max){ + elec_add_errcode(e,task->range[1].err); + } +} + + + +// 检测电流 +static void elec_current(elec_judge_def *e,int index,uint8_t *data) +{ + INDEX_CHECK(index); + TASK_FLAG_CHECK(index); + const scheme_task_def *task=&e->scheme->task[index]; + uint16_t temp,temp2; + uint16_t short_c=e->short_circuited; + uint16_t open_c=e->open_circuited; + temp=GET_RET_DATA(0); + temp2=GET_RET_DATA(1); + if((temptask->range[0].max)&&(temptask->range[1].max)&&(temp2short_c)&&(temp2>short_c)) + { + // 短路 + elec_add_errcode(e,8); + }else{ + if((temprange[0].min||temp>task->range[0].max)|| + (temp2range[1].min||temp2>task->range[1].max)) + { + // 芯片异常 + elec_add_errcode(e,5); + } + } +} + + + + + + + + +const static elec_judge_fun g_jq_judge_table[]={ +elec_power_on, //0 电源准备 +elec_charge, //1 上电充能 +elec_task_judge, //2 设置总线电压 +elec_current, //3 获取总线电流 +elec_task_judge, //4 扫描UID +elec_task_judge, //5 密码验证 +elec_task_judge, //6 读取芯片代码 +elec_task_judge, //7 OTP检测 +elec_task_judge, //8 工厂测试检测 +elec_task_judge, //9 读取状态 +elec_task_judge, //10 写工厂信息 +elec_task_judge, //11 充能统计 +elec_task_judge, //12 充电电压检测 +elec_task_judge, //13 延时等待 +elec_task_judge, //14 设置延时 +elec_task_judge, //15 读取延时 +elec_task_judge, //16 时钟校准 +elec_task_judge, //17 放电 +elec_task_judge, //18 复位 +elec_task_judge, //19 起爆使能 +elec_task_judge, //20 起爆充能 +elec_task_judge, //21 使能通讯末电流采集 +elec_task_judge, //22 获取通讯末电流 +elec_task_judge, //23 写OTP +elec_task_judge, //24 读OTP +elec_task_judge, //25 清除起爆计数 +elec_task_judge, //26 关总线 +elec_task_judge, //27 将缓存区数据写入OTP +elec_task_judge, //28 三码写入错误 +elec_task_judge, //29 三码验证错误 +elec_task_judge, //30 测量电容压差 +elec_task_judge, //31 测量桥丝阻值 +elec_task_judge, //32 使能OTP写 +elec_task_judge, //33 写模块版本 +elec_task_judge, //34 读取版本号 +elec_task_judge, //35 写缓存数据 +elec_task_judge, //36 验证缓存数据 +0, +}; + + +const static elec_judge_fun g_xt_judge_table[]={ +elec_power_on, //0 电源准备 +elec_charge, //1 上电充能 +elec_task_judge, //2 设置总线电压 +elec_current, //3 获取总线电流 +elec_task_judge, //4 扫描UID +elec_task_judge, //5 写配置参数 +elec_task_judge, //6 验证配置 +elec_task_judge, //7 模拟注码 +elec_task_judge, //8 充能统计 +elec_task_judge, //9 写现场值 网络id 延时 +elec_task_judge, //10比对现场值 +elec_task_judge, //11 桥丝通断检测 +elec_task_judge, //12 电容容量统计 +elec_task_judge, //13 延时等待 +elec_task_judge, //14 写管壳号/工厂信息 +elec_task_judge, //15 写UID +elec_task_judge, //16 写密码 +elec_task_judge, //17 写入/检测备份区标志 +elec_task_judge, //18 读取备份区数据 +elec_task_judge, //19 校准 +elec_task_judge, //20 使能通讯末电流采集 +elec_task_judge, //21 获取通讯末电流 +elec_task_judge, //22 放电 +elec_task_judge, //23 在线检测 +elec_task_judge, //24 状态检测 +elec_task_judge, //25 起爆 +elec_task_judge, //26 复位 +elec_task_judge, //27 关总线 +elec_task_judge, //28 芯片锁存 +elec_task_judge, //29 使能赋码设备 +elec_task_judge, //30 在线检测 +elec_task_judge, //31 密码验证 +elec_task_judge, //32 加载芯片配置 +elec_task_judge, //33 电容压差测试 +elec_task_judge, //34 桥丝电阻测试 +elec_task_judge, //35 检测过程中注码 +elec_task_judge, //36 验证注码 +elec_task_judge, //37 模块在线检测 +elec_task_judge, //38 验证管壳码 +0, +}; + + + +const static elec_judge_fun g_ew_judge_table[]={ +elec_power_on, //0 电源准备 +elec_charge, //1 上电充能 +elec_task_judge, //2 设置总线电压 +elec_current, //3 获取总线电流 +elec_task_judge, //4 扫描UID +elec_task_judge, //5 写配置参数 +elec_task_judge, //6 验证配置 +elec_task_judge, //7 模拟注码 +elec_task_judge, //8 充能统计 +elec_task_judge, //9 写现场值 网络id 延时 +elec_task_judge, //10比对现场值 +elec_task_judge, //11 桥丝通断检测 +elec_task_judge, //12 电容容量统计 +elec_task_judge, //13 延时等待 +elec_task_judge, //14 写管壳号/工厂信息 +elec_task_judge, //15 写UID +elec_task_judge, //16 写密码 +elec_task_judge, //17 写入/检测备份区标志 +elec_task_judge, //18 读取备份区数据 +elec_task_judge, //19 校准 +elec_task_judge, //20 使能通讯末电流采集 +elec_task_judge, //21 获取通讯末电流 +elec_task_judge, //22 放电 +elec_task_judge, //23 在线检测 +elec_task_judge, //24 状态检测 +elec_task_judge, //25 起爆 +elec_task_judge, //26 复位 +elec_task_judge, //27 关总线 +elec_task_judge, //28 芯片锁存 +elec_task_judge, //29 使能赋码设备 +elec_task_judge, //30 在线检测 +elec_task_judge, //31 密码验证 +elec_task_judge, //32 加载芯片配置 +elec_task_judge, //33 电容压差测试 +elec_task_judge, //34 桥丝电阻测试 +elec_task_judge, //35 检测过程中注码 +elec_task_judge, //36 验证注码 +elec_task_judge, //37 模块在线检测 +elec_task_judge, //38 升级 +0, +}; + + +static const elec_judge_fun *g_judge_fun_table[]={g_jq_judge_table,g_xt_judge_table,g_ew_judge_table}; + +static int elec_calc_judge_fun_num(const elec_judge_fun *table) +{ + int i=0; + while(table[i]){ + i++; + } + return i; +} + + +// 根据方案获取模块芯片类型 +int elec_extract_chip(int id) +{ + const scheme_def *s=check_scheme(); + if(id==0) id=s->plan_id; + // 日bit0~bit4 月bit5~bit8 年bit9~bit15 + int sid=(id>>0)&0x7f; + int modele=(id>>7)&0x1f; + int chip=(id>>12)&0xf; + int day=(id>>16)&0x1f; + int month=(id>>21)&0xf; + int year=((id>>25)&0x7f)+2022; + return chip; +} + + + +// 根据子错误找到主错误 +int elec_err_classify(int err) +{ + const scheme_def *s=check_scheme(); + const marerr_def *marerr; + if(err<=20){ + return err; + } + for(int i=0;imarerr_num;i++){ + marerr=&s->marerr[i]; + for(int j=0;jsuberr_num;j++){ + if(marerr->suberr[j]==err) + return marerr->err; + } + } + return err; +} + +// 根据优先级报错 +int elec_report_err(elec_judge_def *e) +{ + static const uint8_t pro_table[]={1,3,7,8,2,4,5,6,0}; + uint8_t err=0; + for (int i=0;ierr_list[j]==pro_table[i]) + return pro_table[i]; + if((err==0)&&(e->err_list[j]!=0)){ + err=e->err_list[j]; + } + } + } + return err; +} + + + +// 异常判断 +// task_num,要判断的任务数 +void elec_judge(elec_judge_def *e,int task_num,uint8_t *exe_flag,uint8_t *data) +{ + const scheme_task_def *task; + memset(e,0,sizeof(elec_judge_def)); + e->scheme=check_scheme(); + e->judge_fun_table=g_judge_fun_table[elec_extract_chip(e->scheme->plan_id)]; + e->judge_fun_num=elec_calc_judge_fun_num(e->judge_fun_table); + e->short_circuited=1500; + e->open_circuited=80; + e->exe_flag=exe_flag; + if(task_num>e->scheme->task_num) + task_num=e->scheme->task_num; + for(int i=0;ischeme->task[i]; + if(task->taskidjudge_fun_num){ + e->judge_fun_table[i](e,i,data); + }else{ + elec_add_errcode(e,6); + } + data+=task->item_num*2; + } + DBG_LOG("err_table:%02x %02x %02x %02x %02x %02x %02x %02x", + e->err_list[0],e->err_list[1],e->err_list[2],e->err_list[3],e->err_list[4], + e->err_list[5],e->err_list[6],e->err_list[7],e->err_list[8],e->err_list[9] + ); + for(int i=0;ierr_list[i]=elec_err_classify(e->err_list[i]); + } + DBG_LOG("err_table2:%02x %02x %02x %02x %02x %02x %02x %02x", + e->err_list[0],e->err_list[1],e->err_list[2],e->err_list[3],e->err_list[4], + e->err_list[5],e->err_list[6],e->err_list[7],e->err_list[8],e->err_list[9] + ); + DBG_LOG("err report=%d",elec_report_err(e)); +} + + + diff --git a/source/elec_det/elec_judge.h b/source/elec_det/elec_judge.h new file mode 100644 index 0000000..e3b0d8c --- /dev/null +++ b/source/elec_det/elec_judge.h @@ -0,0 +1,41 @@ + +#ifndef elec_judge_h__ +#define elec_judge_h__ + +#include "dev_flash.h" + + +// 定义错误列表长度 +#define ERR_LIST_LEN 10 + + + +struct _elec_judge_def; +typedef void (*elec_judge_fun)(struct _elec_judge_def *e,int index,uint8_t *data); + +typedef struct _elec_judge_def{ + const scheme_def *scheme; + uint8_t judge_fun_num; + uint8_t judge_flag[8]; + uint8_t *exe_flag; + uint8_t err_list[ERR_LIST_LEN]; + uint16_t short_circuited; + uint16_t open_circuited; + const elec_judge_fun *judge_fun_table; +}elec_judge_def; + + + + +void elec_judge(elec_judge_def *e,int task_num,uint8_t *exe_flag,uint8_t *data); + + + + +#endif + + + + + + diff --git a/source/main/compiler_info.h b/source/main/compiler_info.h index e017d40..4ce92d4 100644 --- a/source/main/compiler_info.h +++ b/source/main/compiler_info.h @@ -6,7 +6,7 @@ -#define BUILD_DATE "2023-10-27 18:16:13" +#define BUILD_DATE "2023-10-30 18:23:29" #define SOFT_VERSION "2.03" diff --git a/source/mycopy.py b/source/mycopy.py index 90a78e6..c7fafed 100644 --- a/source/mycopy.py +++ b/source/mycopy.py @@ -97,6 +97,12 @@ def arr_byte_copy(byte:int,num:int): # int转数组 def arr_from_int(num:int): return bytearray([num&0xff,(num>>8)&0xff,(num>>16)&0xff,(num>>24)&0xff]) +# uchar转数组 +def arr_from_uchar(num:int): + return bytearray([num&0xff]) +# u16转数组 +def arr_from_u16(num:int): + return bytearray([num&0xff,(num>>8)&0xff]) # 字符串转数组,不足填充0 def arr_from_str(txt:str,num:int): t=bytearray(txt.encode(encoding="utf-8")) diff --git a/source/soft/debug.c b/source/soft/debug.c index 311b1ed..6dca1fe 100644 --- a/source/soft/debug.c +++ b/source/soft/debug.c @@ -10,7 +10,7 @@ #endif -#if 1 +#if 0 #define DBG_DEV_INIT() rtt()->init()