checker_save.py 根据实际方案来调整保存数据,可以调用lua脚本来判定
添加xt赋码仪检测脚本,还有点问题
This commit is contained in:
		
							
								
								
									
										560
									
								
								python/file/judge-xt.lua
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										560
									
								
								python/file/judge-xt.lua
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,560 @@ | ||||
| ---@diagnostic disable: lowercase-global, undefined-global | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| -- 芯跳赋码仪错误判定脚本 | ||||
|  | ||||
|  | ||||
|  | ||||
| -- 方案配置文件: | ||||
| -- cfg_name | ||||
| -- 检测数据 | ||||
| -- check_data | ||||
| -- 当前路径 | ||||
| -- get_path() | ||||
| -- 打印表 | ||||
| -- prints:print_t() | ||||
| -- json解码 | ||||
| -- json:decode() | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| -- 读取方案配置信息 | ||||
| -- print(cfg_name) | ||||
| check_cfg_file=io.open(cfg_name,"r") | ||||
| check_cfg_str=check_cfg_file:read("*a") | ||||
| check_cfg_file:close() | ||||
| json_table = json:decode(check_cfg_str) | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| -- 表长度 | ||||
| function len(t) | ||||
|     local res=0 | ||||
|     if(t==nil)then return 0 end | ||||
|     for k,v in pairs(t) do | ||||
|         res=res+1 | ||||
|     end | ||||
|     return res | ||||
| end | ||||
|  | ||||
| -- 截取数组 | ||||
| function mid(array,start,length) | ||||
|     if(len(array)<(start+length-1)) then | ||||
|         print("mid:out of range",start,length) | ||||
|         return nil | ||||
|     end | ||||
|     return table.pack(table.unpack(array,start,start+length-1)) | ||||
| end | ||||
|  | ||||
|  | ||||
| -- 把n插入t中,不允许重复 | ||||
| function insert(t,n) | ||||
|     for k,v in pairs(t) do | ||||
|         if(v==n) then | ||||
|             return | ||||
|         end | ||||
|     end | ||||
|     table.insert(t,n) | ||||
| end | ||||
|  | ||||
|  | ||||
| -- 删除t中的值n | ||||
| function del(t,n) | ||||
|     for k,v in pairs(t) do | ||||
|         if(v==n) then | ||||
|             table.remove(t,k) | ||||
|             break | ||||
|         end | ||||
|     end | ||||
| end | ||||
|  | ||||
| -- 删除t中除n之外的所有值 | ||||
| function only(t,n) | ||||
|     for k,v in pairs(t) do | ||||
|         if(v~=n) then | ||||
|             -- table.remove(t,k) | ||||
|             t[k]=nil | ||||
|         end | ||||
|     end | ||||
| end | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| -- 计算2的n次幂 | ||||
| function exp2(n) | ||||
|     local ret=1 | ||||
|     for i=1,n,1 do | ||||
|         ret=ret*2 | ||||
|     end | ||||
|     return ret | ||||
| end | ||||
|  | ||||
|  | ||||
| -- 计算参数错误占用的字节 | ||||
| function clac_cfg_errbytenum() | ||||
|     local num=0 | ||||
|     local tasks=json_table["TaskArray"] | ||||
|     for i=1,len(tasks),1 do | ||||
|         num=num+tasks[i]["ReturnCount"] | ||||
|     end | ||||
|     return math.floor((num+7)/8) | ||||
| end | ||||
|  | ||||
|  | ||||
|  | ||||
| -- 8个字节描述执行结果0成功,1失败 | ||||
| function find_ack(index,acks) | ||||
|     if(index>len(acks)*8) or index<1 then | ||||
|         print("index out of range.index=",index) | ||||
|         return false | ||||
|     end | ||||
|     local temp=acks[math.floor((index-1)/8)+1] | ||||
|     local i=(index-1)%8 | ||||
|     if ((math.floor((temp % exp2(i+1))/exp2(i)))~=0) then | ||||
|         return false | ||||
|     else | ||||
|         return true | ||||
|     end | ||||
| end | ||||
|  | ||||
|  | ||||
| -- 展示任务回复,0成功,1失败 | ||||
| function show_acks(acks) | ||||
|     -- prints:print_a(acks) | ||||
|     print("return_ack:(0:ok;1:err)") | ||||
|     local str="" | ||||
|     for i=1,len(json_table["TaskArray"]),1 do | ||||
|         local ack=find_ack(i,acks) | ||||
|         if ack==true then | ||||
|             str=str.."0, " | ||||
|         else | ||||
|             str=str.."1, " | ||||
|         end | ||||
|     end | ||||
|     print(str) | ||||
| end | ||||
|  | ||||
|  | ||||
|  | ||||
| -- 统计指定index之前应该跳过的数据长度和当前index的返回长度 | ||||
| function calc_skip(index,tasks) | ||||
|     local len=0 | ||||
|     -- for i=1,table.getn(tasks),1 do | ||||
|     local i=1 | ||||
|     while i<index do | ||||
|     -- for i=1,index,1 do | ||||
|         -- print("calc_skip,index=",index,"i=",i) | ||||
|         len=len+tasks[i]["ReturnCount"] | ||||
|         i=i+1 | ||||
|     end | ||||
|     -- print("calc_skip,len=",len) | ||||
|     return len*2,tasks[index]["ReturnCount"]*2 | ||||
| end | ||||
|  | ||||
|  | ||||
|  | ||||
| -- 找到指定index的任务返回数和值,把两个字节合并为一个值 | ||||
| function find_return(index) | ||||
|     local data=check_data | ||||
|     local skip_len,len=calc_skip(index,json_table["TaskArray"]) | ||||
|     local ret={} | ||||
|     local temp=mid(data,skip_len+1+8+check_erryternum,len) | ||||
|     if(temp==nil) then return ret end | ||||
|     -- print("find_return,temp=") | ||||
|     -- prints:print_a(temp) | ||||
|     local len_t=math.floor(len/2) | ||||
|     for i=1,len_t,1 do | ||||
|         ret[i]=temp[i*2-1]+(temp[i*2]*exp2(8)) | ||||
|     end | ||||
|     return ret | ||||
| end | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| -- Checker_PowerPrapare,                        //0 电源准备   | ||||
| -- XT_Test_PowerOn,                             //1 上电充能 | ||||
| -- XT_Test_SetBusV,                             //2 设置总线电压 | ||||
| -- XT_Test_BaseCur,                             //3 获取总线电流 | ||||
| -- XT_Test_ScanUID,                             //4 扫描UID | ||||
| -- XT_Test_WriteChipCfg,                        //5 写配置参数 | ||||
| -- XT_Test_CheckChipCfg,                        //6 验证配置 | ||||
| -- XT_Test_BindTestCode,                        //7 模拟注码 | ||||
| -- XT_Test_ChgEnergy,                           //8 充能统计 | ||||
| -- XT_Test_WriteRunField,                       //9 写现场值 网络id 延时 | ||||
| -- XT_Test_CheckRunField,                       //10 比对现场值 | ||||
| -- XT_Test_Resister,                            //11 桥丝通断检测 | ||||
| -- XT_Test_Cap,                                 //12 电容容量统计 | ||||
| -- Checker_WaitDelay,                           //13 延时等待 | ||||
| -- XT_Test_WriteShell,                          //14 写管壳号/工厂信息 | ||||
| -- XT_Test_WriteUID,                            //15 写UID | ||||
| -- XT_Test_WritePWD,                            //16 写密码 | ||||
| -- XT_Test_CheckBackFlag,                       //17 写入/检测备份区标志 | ||||
| -- XT_Test_ReadBackFlag,                        //18 读取备份区数据 | ||||
| -- XT_Test_Trim,                                //19 校准 | ||||
| -- XT_Test_EnCommEndCur,                        //20 使能通讯末电流采集 | ||||
| -- XT_Test_GetCommEndCur,                       //21 获取通讯末电流 | ||||
| -- XT_Test_Discharge,                           //22 放电 | ||||
| -- XT_Test_OneLineCheck,                        //23 在线检测 | ||||
| -- XT_Test_CheckState,                          //24 状态检测 | ||||
| -- XT_Test_Boom,                                //25 起爆 | ||||
| -- XT_Test_Reset,                               //26 复位 | ||||
| -- XT_Test_PowerOFF,                            //27 关总线	 | ||||
| -- XT_Test_LockCmdC,                            //28 芯片锁存 | ||||
| -- XT_Test_CodeBindEn,                          //29 使能赋码设备 | ||||
| -- XT_Test_InputCheck,                          //30 在线检测 | ||||
| -- XT_Test_CheckPWD,                            //31 密码验证 | ||||
| -- XT_Test_LoadChipCfg,                         //32 加载芯片配置 | ||||
| -- XT_Test_CapVoltage,                          //33 电容压差测试 | ||||
| -- Checker_ResistorSample,                      //34 桥丝电阻测试 | ||||
| -- XT_Test_UID_PWD_Bind,                        //35 检测过程中注码 | ||||
| -- XT_Test_UID_PWD_Verify,                      //36 验证注码 | ||||
|  | ||||
|  | ||||
|  | ||||
| -- 根据任务id找到下一个任务 | ||||
| function find_index(index,task_id) | ||||
|     -- print("find_index:index=",index) | ||||
|     local tasks=json_table["TaskArray"] | ||||
|     -- prints:print_t(tasks) | ||||
|     for i=index,len(tasks),1 do | ||||
|         if(tasks[i]["TaskID"]==task_id) then | ||||
|             return tasks[i] | ||||
|         end | ||||
|     end | ||||
|     print("find_index err:index=",index,"task_id=",task_id) | ||||
|     return nil | ||||
| end | ||||
|  | ||||
|  | ||||
| -- 检测器异常,1 | ||||
| -- 主电容异常,2 | ||||
| -- 接触异常,3 | ||||
| -- 桥丝阻值异常,4 | ||||
| -- 芯片异常,5 | ||||
| -- 其他异常,6 | ||||
|  | ||||
|  | ||||
| -- 判断上电错误,返回下一个检测任务,nil停止检测 | ||||
| function Checker_PowerPrapare(task,err_code) | ||||
|     if(find_ack(task["TaskIndex"]+1,mid(check_data,1,8))==false)then | ||||
|         -- 上电错误只能是检测器异常,检测结束 | ||||
|         print("task failed.index=",task["TaskIndex"]) | ||||
|         only(err_code,1) | ||||
|         return nil | ||||
|     else | ||||
|         -- 上电正常,排除检测器异常 | ||||
|         -- del(err_code,1) | ||||
|         print("check poweron") | ||||
|         -- 下一步是上电充能 | ||||
|         return find_index(task["TaskIndex"]+2,1) | ||||
|     end | ||||
| end | ||||
|  | ||||
|  | ||||
| -- 判断上电充能错误,返回下一个检测任务,nil停止检测 | ||||
| function XT_Test_PowerOn(task,err_code) | ||||
|     local ret_value={} | ||||
|     if(find_ack(task["TaskIndex"]+1,mid(check_data,1,8))==false)then | ||||
|         -- 上电充能异常 | ||||
|         del(err_code,0) | ||||
|         print("task failed.index=",task["TaskIndex"]) | ||||
|         -- 下一步检测电流 | ||||
|         return find_index(task["TaskIndex"]+2,3) | ||||
|     else | ||||
|         -- 充能流程正常,返回第一个值是电压,第二个值是充能时间 | ||||
|         ret_value=find_return(task["TaskIndex"]+1) | ||||
|         prints:print_a(ret_value) | ||||
|         -- 电压无法上升,检测器异常 | ||||
|         if(ret_value[1]<task["TestStandard"][1]["Min"]) then | ||||
|             print("voltage too low",ret_value[1]) | ||||
|             only(err_code,1) | ||||
|             return nil | ||||
|         end | ||||
|         -- 充电时间过长,进一步检测电流,判断开路还是短路 | ||||
|         if(ret_value[2]>39000) then | ||||
|             del(err_code,0) | ||||
|             print("check current") | ||||
|             return find_index(task["TaskIndex"]+2,3) | ||||
|         elseif(ret_value[2]<1) then | ||||
|         -- 新小板程序在开路时会返回0,保险起见还是看一下电流 | ||||
|             del(err_code,0) | ||||
|             print("check current") | ||||
|             return find_index(task["TaskIndex"]+2,3) | ||||
|         end | ||||
|         ---- 排除检测板异常 | ||||
|         del(err_code,1) | ||||
|         print("check chip UID") | ||||
|         -- 下一步检测UID | ||||
|         return find_index(task["TaskIndex"]+2,4) | ||||
|     end | ||||
| end | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| -- 扫描uid,成功则芯片正常,返回下一个检测任务,nil停止检测 | ||||
| function XT_Test_ScanUID(task,err_code) | ||||
|     if(find_ack(task["TaskIndex"]+1,mid(check_data,1,8))==false)then | ||||
|         -- 通信失败,返回芯片异常,检测结束 | ||||
|         print("task failed.task_index=",task["TaskIndex"]) | ||||
|         only(err_code,5) | ||||
|         return nil | ||||
|     else | ||||
|         -- ret_value=find_return(task["TaskIndex"]+1) | ||||
|         -- -- 最大反馈时间在范围之外,芯片异常 | ||||
|         -- if(ret_value[2]<task["TestStandard"][2]["Min"]) or (ret_value[2]>task["TestStandard"][2]["Max"]) then | ||||
|         --     only(err_code,5) | ||||
|         --     return nil | ||||
|         -- end | ||||
|  | ||||
| 		print("check charge") | ||||
| 		return find_index(task["TaskIndex"]+2,8) | ||||
|         --print("读取芯片代码") | ||||
|         --return find_index(task["TaskIndex"]+2,6) | ||||
|     end | ||||
| end | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| -- 判断低压电流,返回下一个检测任务,nil停止检测 | ||||
| function XT_Test_BaseCurLow(task,err_code) | ||||
|     if(find_ack(task["TaskIndex"]+1,mid(check_data,1,8))==false)then | ||||
|         -- 电流检测错误只能是检测器异常,检测结束 | ||||
|         print("task failed.task_index=",task["TaskIndex"]) | ||||
|         only(err_code,1) | ||||
|         return nil | ||||
|     else | ||||
|         -- 返回正向电流,反向电流 | ||||
|         ret_value=find_return(task["TaskIndex"]+1) | ||||
| 		print("current:",ret_value[1]) | ||||
|         -- 电流为0,开路,返回接触异常 | ||||
|         if(ret_value[1]<10) and (ret_value[2]<10)then | ||||
|             only(err_code,3) | ||||
|             return nil | ||||
|         -- 电流过大,短路,返回芯片异常 | ||||
|         elseif((ret_value[1]>task["TestStandard"][1]["Max"]) and (ret_value[1]<1500)) | ||||
| 			or ((ret_value[2]>task["TestStandard"][2]["Max"]) and (ret_value[2]<1500)) | ||||
| 		then | ||||
|             only(err_code,5) | ||||
|             return nil | ||||
|         elseif((ret_value[1]>1500) and (ret_value[2]>1500))then | ||||
|             only(err_code,3) | ||||
|             return nil | ||||
|         end | ||||
|         -- 排除接触异常 | ||||
|         del(err_code,3) | ||||
|         print("read chip UID") | ||||
|         -- 下一步检测芯片 | ||||
|         return find_index(task["TaskIndex"]+2,4) | ||||
|         -- print("读取芯片代码") | ||||
|         -- return find_index(task["TaskIndex"]+2,6) | ||||
|     end | ||||
| end | ||||
|  | ||||
|  | ||||
| -- 检测充能,失败则电容异常 | ||||
| function JQ_Test_ChgEnergy(task,err_code) | ||||
|     if(find_ack(task["TaskIndex"]+1,mid(check_data,1,8))==false)then | ||||
|         -- 充能错误只能是检测器异常,检测结束 | ||||
|         print("task failed.task_index=",task["TaskIndex"]) | ||||
|         only(err_code,1) | ||||
|         return nil | ||||
|     else | ||||
|         ret_value=find_return(task["TaskIndex"]+1) | ||||
|         if((ret_value[1]>task["TestStandard"][1]["Max"]) or (ret_value[1]<task["TestStandard"][1]["Min"])) then | ||||
|             only(err_code,2) | ||||
|             return nil | ||||
|         end | ||||
|         if((ret_value[2]>task["TestStandard"][2]["Max"]) or (ret_value[2]<task["TestStandard"][2]["Min"])) then | ||||
|             only(err_code,2) | ||||
|             return nil | ||||
|         end | ||||
|         if((ret_value[3]>task["TestStandard"][3]["Max"]) or (ret_value[3]<task["TestStandard"][3]["Min"])) then | ||||
|             only(err_code,2) | ||||
|             return nil | ||||
|         end | ||||
|         print("judge end") | ||||
|         only(err_code,0) | ||||
|         return nil | ||||
|     end | ||||
| end | ||||
|  | ||||
|  | ||||
| -- 定义占位函数,不应该调用 | ||||
| function JQ_Test_Empty(task,err_code) | ||||
|     print("err function call,task index=",task["TaskIndex"]) | ||||
|     insert(err_code,6) | ||||
|     return nil | ||||
| end | ||||
|  | ||||
|  | ||||
| -- 这个数组根据方案检测顺序确定 | ||||
| tasks_judge_fun={ | ||||
|     Checker_PowerPrapare,--0 | ||||
|     XT_Test_PowerOn,--1 | ||||
|     JQ_Test_Empty,--2 | ||||
|     JQ_Test_Empty,--3 | ||||
|     XT_Test_ScanUID,--4 | ||||
|     JQ_Test_Empty,--5 | ||||
|     JQ_Test_ChgEnergy,--6 | ||||
|     JQ_Test_Empty,--7 | ||||
|     JQ_Test_Empty,--8 | ||||
|     JQ_Test_Empty,--9 | ||||
|     JQ_Test_Empty,--10 | ||||
|     JQ_Test_Empty,--11 | ||||
|     JQ_Test_Empty,--12 | ||||
|     JQ_Test_Empty,--13 | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| -- 取得表中第一个值 | ||||
| function get_err_code(err_code) | ||||
|     for k,v in pairs(err_code) do | ||||
|         if(v~=nil) then | ||||
|             return v | ||||
|         end | ||||
|     end | ||||
|     return nil | ||||
| end | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| -- 根据任务依次判断 | ||||
| function judge() | ||||
|     local fun_index=1 | ||||
|     local err_code={0,1,2,3,4,5} | ||||
|     -- 找到上电任务 | ||||
|     local task=find_index(1,0) | ||||
|     while true do | ||||
|         if(task==nil)then | ||||
|             if(len(err_code)>1)then | ||||
|                 -- 如果找不到任务,则应该是方案错误,这里返回其他异常 | ||||
|                 print("can not find task,fun_index=",fun_index) | ||||
|                 insert(err_code,6) | ||||
|             end | ||||
|             break | ||||
|         end | ||||
|         fun_index=task["TaskIndex"]+1 | ||||
|         task=tasks_judge_fun[fun_index](task,err_code) | ||||
|     end | ||||
|     return err_code | ||||
| end | ||||
|  | ||||
| -- 判断一个任务的子错误 | ||||
| function judge_task(task,data) | ||||
|     local range=task["TestStandard"] | ||||
|     local ret={} | ||||
|     -- print("judge task") | ||||
|     if range~=nil then | ||||
|         -- print("judge task") | ||||
|         for i=1,len(range),1 do | ||||
|             if(data[i]<range[i]["Min"]) or (data[i]>range[i]["Max"]) then | ||||
|                 -- print("task=",task["TaskBrief"],"out of range:") | ||||
|                 -- print("err code=",task["ResultErrCode"][i]) | ||||
|                 table.insert(ret,task["ResultErrCode"][i]) | ||||
|             end | ||||
|         end | ||||
|     end | ||||
|     return ret | ||||
| end | ||||
|  | ||||
|  | ||||
| -- 依次判断主错误 | ||||
| function judge_list() | ||||
|     local acks=mid(check_data,1,8) | ||||
|     for i=1,len(json_table["TaskArray"]),1 do | ||||
|         local ack=find_ack(i,acks) | ||||
|         local task_p=json_table["TaskArray"][i] | ||||
|         local ret_value=find_return(i) | ||||
|         local err_code=judge_task(task_p,ret_value) | ||||
|         if ack==false then | ||||
|             table.insert(err_code,task_p["ExecuteErrCode"]) | ||||
|         end | ||||
|         if len(err_code)>0 then | ||||
|             print("task:",task_p["TaskBrief"],"err_code:") | ||||
|             prints:print_a(err_code) | ||||
|             return get_err_code(err_code) | ||||
|         end | ||||
|     end | ||||
|     return nil | ||||
| end | ||||
|  | ||||
|  | ||||
| -- 要校验小板的版本号,方案的版本号 | ||||
| -- 脚本产生的异常从210开始,0xd2 | ||||
|  | ||||
| function check_env() | ||||
|     -- 校验输入数据的长度 | ||||
|     local skip,l=calc_skip(len(json_table["TaskArray"]),json_table["TaskArray"]) | ||||
|     -- print("requier len=",skip+l) | ||||
|     local num_requre=skip+l+8+check_erryternum | ||||
|     if(num_requre>len(check_data)) then | ||||
|         print("check data too less.",num_requre,len(check_data)) | ||||
|         return "数据长度与方案不符",210 | ||||
|     end | ||||
|     -- if(json_table["PlanID"]~=PLAN_ID) then | ||||
|     --     print("plan id check err.") | ||||
|     --     return "方案ID不符",211 | ||||
|     -- end | ||||
|     return "ok",0 | ||||
| end | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| function main() | ||||
|     check_erryternum=clac_cfg_errbytenum() | ||||
|     local err_str_table={"检测器异常","主电容异常","接触异常","桥丝阻值异常","芯片异常"} | ||||
|     local ch_err,ch_code=check_env() | ||||
|     if(ch_code~=0) then | ||||
|         return ch_err,ch_code | ||||
|     end | ||||
|     -- 展示任务执行结果 | ||||
|     show_acks(mid(check_data,1,8)) | ||||
|     -- 开始判定 | ||||
|     local err_code=judge() | ||||
|     if(len(err_code)>1) then | ||||
| 		prints:print_a(err_code) | ||||
|         return "检测项目不足,无法判定",212 | ||||
|     end | ||||
|     prints:print_a(err_code) | ||||
|     local err=get_err_code(err_code) | ||||
|     if(err~=nil) then | ||||
|         if(err==0) then | ||||
|             err=judge_list() | ||||
|             if(err==nil)then | ||||
|                 return "ok",0 | ||||
|             else | ||||
|                 return "具体错误待定义",err | ||||
|             end | ||||
|         else | ||||
|             return err_str_table[err],err | ||||
|         end | ||||
|     else | ||||
|         print("err:err_code is none.") | ||||
|         return "数据不合规",213 | ||||
|     end | ||||
| end | ||||
|  | ||||
|  | ||||
| -- 先返回错误描述,再返回错误码 | ||||
| return main() | ||||
|  | ||||
|  | ||||
|  | ||||
		Reference in New Issue
	
	Block a user
	 ranchuan
					ranchuan