添加通用的异常判断算法

This commit is contained in:
ranchuan
2023-10-30 18:38:01 +08:00
parent 0471a91c84
commit 873029149d
12 changed files with 604 additions and 69 deletions

View File

@@ -230,3 +230,5 @@
版本号2.03JQ_UID_PWD_Bind 不注码时返回成功
2023.10.27
添加 HARD_VERSION 宏根据硬件版本不同来确定power参数
2023.10.30
添加通用的异常判断算法

View File

@@ -115,8 +115,9 @@ static int get_ack(const uint8_t *data,int index)
//-- 接触异常,3
//-- 桥丝阻值异常,4
//-- 芯片异常,5
//-- 过流7
//-- 短路8
//-- 判定任务缺失,6
//-- 过流,7
//-- 短路,8
#define TASK_FIND_NEXT(taskid) {\
task=find_task_next(index,taskid);\

View File

@@ -83,6 +83,26 @@ int flash_save_param(sys_param_def *par);
const sys_param_def *sys_param(void);
#if 1
__packed
typedef struct{
uint16_t max;
uint16_t min;
uint8_t err;
}scheme_range_def;
__packed
typedef struct
{
uint8_t taskid;
uint8_t taskindex;
uint8_t item_num;
uint8_t err;
scheme_range_def range[16];
}scheme_task_def;
#else
__packed
typedef struct{
uint32_t max;
@@ -102,6 +122,18 @@ typedef struct
scheme_range_def range[16];
}scheme_task_def;
#endif
__packed
typedef struct{
uint8_t err;
uint8_t suberr_num;
uint8_t suberr[30];
}marerr_def;
// 方案参数
__packed
typedef struct{
@@ -109,6 +141,8 @@ typedef struct{
uint32_t plan_id;
uint32_t timeout_m;
uint32_t task_num;
uint32_t marerr_num;
marerr_def marerr[21];
scheme_task_def task[0];
}scheme_def;

View File

@@ -7,6 +7,7 @@
#include "dev_flash.h"
#include "compiler_info.h"
#include "elec_judge.h"
#include "elec_det.h"
#include "base/delay.h"
#include "base/utility.h"
@@ -439,6 +440,9 @@ array_def *elec_check_with_scheme(array_def *uid_psw)
}
}
elec_judge_def *e=malloc(sizeof(elec_judge_def));
elec_judge(e,checker_runcfg.rtv_index,checker_runcfg.Task_Result,(uint8_t *)checker_runcfg.Test_Rtv);
free(e);
arr_append(r,0);
arr_appends(r,checker_runcfg.Task_Result,8);
arr_appends(r,checker_runcfg.Task_Excute,8);

View File

@@ -0,0 +1,414 @@
#include "dev_flash.h"
#include "string.h"
#include "debug.h"
#include "mystring.h"
#include "elec_judge.h"
// 通用异常判定逻辑
//-- 检测器异常,1
//-- 主电容异常,2
//-- 接触异常,3
//-- 桥丝阻值异常,4
//-- 芯片异常,5
//-- 判定任务缺失,6
//-- 过流,7
//-- 短路,8
// 任务序号校验
#define INDEX_CHECK(index)\
if(index<0||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;i<ERR_LIST_LEN;i++){
if(e->err_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;i<s->task_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;i<task->item_num;i++){
temp=data[i*2]|(data[i*2+1]<<8);
if(temp<task->range[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(temp<task->range[0].min||temp>task->range[0].max){
elec_add_errcode(e,1);
}
temp=GET_RET_DATA(1);
if(temp<task->range[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((temp<open_c)&&(temp2<open_c))
{
// 接触异常
elec_add_errcode(e,3);
}
else if(((temp>task->range[0].max)&&(temp<short_c))||
((temp2>task->range[1].max)&&(temp2<short_c)))
{
// 过流
elec_add_errcode(e,7);
}else if((temp>short_c)&&(temp2>short_c))
{
// 短路
elec_add_errcode(e,8);
}else{
if((temp<task->range[0].min||temp>task->range[0].max)||
(temp2<task->range[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;i<s->marerr_num;i++){
marerr=&s->marerr[i];
for(int j=0;j<marerr->suberr_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;i<sizeof(pro_table);i++){
for(int j=0;j<ERR_LIST_LEN;j++){
if(e->err_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;i<task_num;i++)
{
task=&e->scheme->task[i];
if(task->taskid<e->judge_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;i<ERR_LIST_LEN;i++){
e->err_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));
}

View File

@@ -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

View File

@@ -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"

View File

@@ -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"))

View File

@@ -10,7 +10,7 @@
#endif
#if 1
#if 0
#define DBG_DEV_INIT() rtt()->init()