---@diagnostic disable: lowercase-global, undefined-global -- 芯跳赋码仪错误判定脚本 -- 方案配置文件: -- cfg_name -- 检测数据 -- check_data -- 当前路径 -- get_path() -- 打印表 -- prints:print_t() -- json解码 -- json:decode() -- 2023.7.5 -- 调用者可以设置 check_cfg_str 变量,此时脚本不会使用io函数而直接使用 -- 如果 check_cfg_str 为 nil 时自动读取 cfg_name 文件 -- 改为调用main函数来运行脚本 -- 表长度 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 i39000) 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) print("check current") return find_index(task["TaskIndex"]+2,3) 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]["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"][2]["Max"]) or (ret_value[2]task["TestStandard"][3]["Max"]) or (ret_value[3]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 -- prints:print_t(range[i]) -- print("data=",data[i]) if(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) -- print("taskindex:",task_p["TaskIndex"]) local err_code=judge_task(task_p,ret_value) -- print("err_code:") -- prints:print_a(err_code) 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() -- 读取方案配置信息 -- print(cfg_name) if(check_cfg_str==nil)then check_cfg_file=io.open(cfg_name,"r") check_cfg_str=check_cfg_file:read("*a") check_cfg_file:close() end json_table = json:decode(check_cfg_str) 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()