diff --git a/checker_gen1.uvoptx b/checker_gen1.uvoptx index 18269cd..0b92649 100644 --- a/checker_gen1.uvoptx +++ b/checker_gen1.uvoptx @@ -1177,7 +1177,7 @@ rt_thread - 1 + 0 0 0 0 @@ -2297,6 +2297,18 @@ 0 0 + + 13 + 142 + 1 + 0 + 0 + 0 + .\source\coder\coder_judge.c + coder_judge.c + 0 + 0 + @@ -2307,7 +2319,7 @@ 0 14 - 142 + 143 5 0 0 diff --git a/checker_gen1.uvprojx b/checker_gen1.uvprojx index e9e6aed..d15258b 100644 --- a/checker_gen1.uvprojx +++ b/checker_gen1.uvprojx @@ -1351,6 +1351,11 @@ 1 .\source\coder\coder_lib.c + + coder_judge.c + 1 + .\source\coder\coder_judge.c + @@ -4266,6 +4271,11 @@ 1 .\source\coder\coder_lib.c + + coder_judge.c + 1 + .\source\coder\coder_judge.c + diff --git a/python/checker_save.py b/python/checker_save.py index e057a32..03c0c1a 100644 --- a/python/checker_save.py +++ b/python/checker_save.py @@ -3,6 +3,8 @@ import lupa from lupa import LuaRuntime import execjs import json +import datetime +from datetime import datetime, timedelta @@ -18,8 +20,16 @@ def lua_test(lua_file:str,json_file:str,data:bytearray): save_prints=lua.eval("function(a) prints=a end") with open("file/prints.lua",encoding="utf-8") as f: save_prints(lua.execute(f.read())) + # 初始化全局变量 cfg_name - lua.execute("cfg_name=\""+json_file+"\"\n") + # lua.execute("cfg_name=\""+json_file+"\"\n") + + # 初始化配置字符串 + save_cfg_str=lua.eval("function(a) check_cfg_str=a end") + with open(json_file,encoding="utf-8") as f: + a=f.read() + save_cfg_str(a) + # 初始化全局变量 check_data s=data.hex(' ') # print("输入数据",s) @@ -28,15 +38,20 @@ def lua_test(lua_file:str,json_file:str,data:bytearray): lua.execute("check_data={"+s+"}\n") # 执行判定脚本 with open(lua_file,encoding="utf-8") as f: - a,b=lua.execute(f.read()) - print(a,b) + lua.execute(f.read()) + a,b=lua.globals().main() + return a,b + return "脚本执行失败",0xd1 class save: - def __init__(self,scheme:str) -> None: + def __init__(self,scheme:str,script:str) -> None: self.scheme=scheme + self.script=script + self.save_file=scheme.split(".")[0]+".csv" + print("save file:",self.save_file) with open(scheme,"rb") as f: self.json_obj=json.loads(f.read()) @@ -54,24 +69,34 @@ class save: def save(self,data:bytearray): d=data[1:] ret_num=self.calc_retnum()*2+8+self.calc_parerrnum() - for i in range(20): - self.save_item(d[i*ret_num:i*ret_num+ret_num]) - def save_item(self,d:bytearray): + slave_num=len(d)//ret_num + for i in range(slave_num): + print("slave:",i+1) + self.save_item(i+1,d[i*ret_num:i*ret_num+ret_num]) + + # 保存一个条目 + def save_item(self,slave_addr:int,d:bytearray): # print("save_item",d.hex(" ")) errnum=self.calc_parerrnum() - s='=\"'+d[0:8].hex()+'\"'+',' + s=str(slave_addr)+',' + s+='=\"'+d[0:8].hex()+'\"'+',' s+='=\"'+self.hex2bit(d[8:8+errnum])+'\"'+',' s+=self.hex2int(d[8+errnum:]) # print(d[8:8+errnum].hex(' ')) + a,b=lua_test(self.script,self.scheme,d) + s=s+a+','+str(b) print(s) - lua_test("file/judge-xt.lua",self.scheme,d) - with open("./file/save.csv","+a") as f: + with open(self.save_file,"+a") as f: f.write(s+'\n') + + # 把两个字节拼为一个int def hex2int(self,d:bytearray): s="" for i in range(len(d)//2): s+=str(d[i*2]|(d[i*2+1]<<8))+',' return s + + # 把数据转换为二进制字符串 def hex2bit(self,d:bytearray): s="" for i in range(len(d)*8): diff --git a/python/checker_test.py b/python/checker_test.py index 42167d2..48775ed 100644 --- a/python/checker_test.py +++ b/python/checker_test.py @@ -58,7 +58,7 @@ class port: self.ser = serial.Serial(port=name, baudrate=bsp,bytesize=serial.EIGHTBITS,parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE,timeout=None) else: - self.ser=utcp(9527) + self.ser=utcp(bsp) def start_recv(self): self.thread_ = threading.Thread(target=self.recv, args=()) self.thread_.start() @@ -123,7 +123,7 @@ class port: length=data[8]|(data[9]<<8)|(data[10]<<16)|(data[11]<<24) self.num_to_recv=5+length+2 if(self.num_to_recv>0 and self.num_to_recv==len(data)): - # print("recv:",data.hex(" ")) + print("recv:",data.hex(" ")) return self.decode(data) def encode(self,data:bytearray): t=bytearray() @@ -148,10 +148,10 @@ class port: # print("send:",d.hex(",")) self.ser.write(d) # 测试批检仪 - def checker_test(self,times:int,scheme:str): + def checker_test(self,times:int,scheme:str,script:str): print("批检仪测试:") tick=0 - save=checker_save.save(scheme) + save=checker_save.save(scheme,script) data=bytearray() while(tickrange[i]["Max"]) then -- print("task=",task["TaskBrief"],"out of range:") -- print("err code=",task["ResultErrCode"][i]) @@ -481,12 +480,15 @@ function judge_list() 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:") + -- print("task:",task_p["TaskBrief"],"err_code:") prints:print_a(err_code) return get_err_code(err_code) end @@ -519,6 +521,14 @@ 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() @@ -554,7 +564,7 @@ end -- 先返回错误描述,再返回错误码 -return main() +-- return main() diff --git a/python/prottcp.py b/python/prottcp.py index ca03f77..a041b7c 100644 --- a/python/prottcp.py +++ b/python/prottcp.py @@ -147,6 +147,8 @@ def arr_from_int(num:int): def scheme_get_task_range(j:json): t=bytearray() return_count=j["ReturnCount"] + t+=j["TaskID"] + t+=j["TaskIndex"] t+=arr_from_int(return_count) t+=arr_from_int(j["ExecuteErrCode"]) index=0 diff --git a/source/ReadMe.txt b/source/ReadMe.txt index e37a5cd..4aa4ab6 100644 --- a/source/ReadMe.txt +++ b/source/ReadMe.txt @@ -132,4 +132,8 @@ 2023.7.3 检测错误码 解决tcp下升级方案死机的问题,原因是内存没有回收导致的内存不足 +2023.7.6 + UID转存储码特征码从*10000改为*100000 + 赋码仪接收上位机的0x81,0x82回复 + 添加错误判断,未完成 \ No newline at end of file diff --git a/source/coder/coder_judge.c b/source/coder/coder_judge.c new file mode 100644 index 0000000..f18701c --- /dev/null +++ b/source/coder/coder_judge.c @@ -0,0 +1,215 @@ +#include "coder_judge.h" +#include "dev_flash.h" +#include "string.h" + + +// d aУظ +static void c_insert(uint8_t *a,uint8_t d) +{ + int len=sizeof(uint8_t [6]); + for(int i=0;itask_num;i++) + { + t=&s->task[i]; + if(t->taskid==taskid) + return t; + } + return 0; +} + +// ȡindexIJ + + +// ȡindexΧ +static int get_range(int index,int *min,int *max) +{ + const scheme_def *s=check_scheme(); + const scheme_task_def *t; + int index_p=0; + for(int i=0;itask_num;i++) + { + t=&s->task[i]; + for(int j=0;jitem_num;j++) + { + if(index_p==index) + { + if(min) *min=t->range[j].min; + if(max) *max=t->range[j].max; + return index_p; + } + index_p++; + } + } + return index_p; +} + + +// ȡindex +static int get_data(const uint8_t *data,int index) +{ + data+=16; + return data[index*2]|(data[index*2+1]<<8); +} + +// ȡindexǷɹ1ʧܣ0ɹ +static int get_ack(const uint8_t *data,int index) +{ + if(data[index/8]&(1<<(index%8))) + return 1; + else + return 0; +} + + +//-- 쳣,1 +//-- 쳣,2 +//-- Ӵ쳣,3 +//-- ˿ֵ쳣,4 +//-- оƬ쳣,5 +//-- 7 +//-- ·8 + +#define TASK_RETURN(task) {\ + if(task==0) return 6; \ + else index+=1;\ +}// Ҳ + +uint8_t coder_judge(const uint8_t *data) +{ + int temp,temp2; + int index=0; + const scheme_task_def *task=0; + + // + task=find_task_next(index,0); + TASK_RETURN(task); + { + if(get_ack(data,0)) + { + // ϵ󣬼쳣 + return 1; + } + } + + // ϵ + task=find_task_next(index,1); + TASK_RETURN(task); + { + temp=get_data(data,0); + if(temprange[0].min) + { + // ѹ޷쳣 + return 1; + } + temp=get_data(data,1); + if((temp>39000)||(temp<1)){ + // ʧܣ + } + } + + // + task=find_task_next(index,4); + TASK_RETURN(task); + temp=get_data(data,5); + temp2=get_data(data,6); + if((temp<10)&&(temp2<20)) + { + // Ӵ쳣 + return 3; + } + else if(((temp>task->range[0].max)&&(temp<1500))|| + ((temp2>task->range[0].max)&&(temp2<1500))) + { + // + return 7; + }else if((temp>1500)&&(temp2>1500)) + { + // · + return 8; + } + + + // uid + task=find_task_next(index,5); + TASK_RETURN(task); + if(get_ack(data,task->taskindex)) + { + // оƬ + return 5; + } + + // ˿ + task=find_task_next(index,6); + TASK_RETURN(task); + temp=get_data(data,7); + if((temprange[0].min)||(temp>task->range[0].max)) + { + // ˿ + return 4; + } + + // + + + return 0; +} + + + diff --git a/source/coder/coder_judge.h b/source/coder/coder_judge.h new file mode 100644 index 0000000..c2504c2 --- /dev/null +++ b/source/coder/coder_judge.h @@ -0,0 +1,16 @@ +#ifndef coder_judge_h__ +#define coder_judge_h__ + +#include "stdint.h" + + + +uint8_t coder_judge(const uint8_t *data); + + + + + + +#endif + diff --git a/source/coder/coder_lib.c b/source/coder/coder_lib.c index 393b691..b4d1f1f 100644 --- a/source/coder/coder_lib.c +++ b/source/coder/coder_lib.c @@ -129,7 +129,8 @@ int coder_uid_to_save(const char *uid_code,uint8_t *save_code) ymd|=coder_strint_to_byte(&uid_code[8],2); save_code[2]=ymd>>8; save_code[3]=ymd&0xff; - feature=uid_code[10]*10000; + // 文档 YM-UID设计V1.2 - 2023.xlsx 规定*10000,实际是*100000 + feature=uid_code[10]*100000; feature+=coder_strint_to_byte(&uid_code[11],3)*100; feature+=coder_strint_to_byte(&uid_code[14],2); save_code[4]=feature>>16; @@ -174,8 +175,8 @@ int coder_save_to_uid(const uint8_t *save_code,char *uid_code) ret|=coder_int_to_strint(ymd>>9,&uid_code[2],2); ret|=coder_int_to_strint((ymd>>5)&0x0f,&uid_code[6],2); ret|=coder_int_to_strint((ymd)&0x1f,&uid_code[8],2); - uid_code[10]=feature/10000; - ret|=coder_int_to_strint(feature%10000/100,&uid_code[11],3); + uid_code[10]=feature/100000; + ret|=coder_int_to_strint(feature%100000/100,&uid_code[11],3); ret|=coder_int_to_strint(feature%100,&uid_code[14],2); return ret; } diff --git a/source/dev/dev_flash.h b/source/dev/dev_flash.h index 3867314..511940f 100644 --- a/source/dev/dev_flash.h +++ b/source/dev/dev_flash.h @@ -85,9 +85,9 @@ const sys_param_def *sys_param(void); __packed typedef struct{ - uint32_t max; - uint32_t min; - uint32_t err; + uint32_t max; + uint32_t min; + uint32_t err; }scheme_range_def; @@ -95,9 +95,11 @@ typedef struct{ __packed typedef struct { - uint32_t item_num; - uint32_t err; - scheme_range_def range[16]; + uint32_t taskid; + uint32_t taskindex; + uint32_t item_num; + uint32_t err; + scheme_range_def range[16]; }scheme_task_def; // 方案参数 diff --git a/source/main/compiler_info.h b/source/main/compiler_info.h index c53d27a..aa788c4 100644 --- a/source/main/compiler_info.h +++ b/source/main/compiler_info.h @@ -6,7 +6,7 @@ -#define BUILD_DATE "2023-07-04 09:17:01" +#define BUILD_DATE "2023-07-06 19:01:21" #define SOFT_VERSION "0.10" diff --git a/source/task/tran_for_coder2.c b/source/task/tran_for_coder2.c index 8dcd71c..c6de619 100644 --- a/source/task/tran_for_coder2.c +++ b/source/task/tran_for_coder2.c @@ -11,6 +11,7 @@ #include "coder_lib.h" #include "PSDGenerate.h" #include "mystring.h" +#include "coder_judge.h" // 这个文件解析跟赋码仪相关的命令 @@ -93,6 +94,8 @@ static void write_uid_end(ucport_def *u,port_mcu *src,void *data,int ack,char *e emit tran_send_signal(w->u.p,0x82,arr_temp(a)); tran_set_busy(w->u.p,0); g_self.step=0; + // 把命令字改为0x82用于接收主机应答 + w->u.cmd=0x82; } } @@ -123,6 +126,14 @@ static void write_del(ucport_def *u) } +static int write_uid_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *err_str) +{ + DBG_LOG("recv write_uid end signal."); + return 0; +} + + + static ucport_def *write_uid(tran_def *t, uint8_t cmd,array_def *data) { if(arr_length(data)<140+4+1){ @@ -134,6 +145,7 @@ static ucport_def *write_uid(tran_def *t, uint8_t cmd,array_def *data) u->u.p=t; u->u.del=write_del; u->u.doend=write_uid_end; + u->u.dolater=write_uid_dolater; u->addrs_num=arr_get(data,0); memcpy(u->year,arr_data(data)+1,4); DBG_LOG("coder, year=%s",u->year); @@ -329,7 +341,13 @@ static void check_end(ucport_def *u,port_mcu *src,void *data,int ack,char *err_s ack_d[3]=(errcode>>8)&0xff; ack_d[4]=(errcode>>16)&0xff; ack_d[5]=(errcode>>24)&0xff; - if(ack_d[1]==0) ack_d[1]=ack_d[2]; + if(ack_d[1]==0){ + // 先判断主要错误,如果没有主要错误,则填充为子错误 + ack_d[1]=coder_judge(arr_data(data)); + if(ack_d[1]==0){ + ack_d[1]=ack_d[2]; + } + } }else{ } @@ -342,6 +360,8 @@ static void check_end(ucport_def *u,port_mcu *src,void *data,int ack,char *err_s arr_appends(a,w->ack,(6)*10); emit tran_send_signal(w->u.p,0x81,arr_temp(a)); tran_set_busy(w->u.p,0); + // 把命令字改为0x81用于接收主机应答 + w->u.cmd=0x81; g_self.step=1; } } @@ -372,6 +392,11 @@ static void check_del(ucport_def *u) free(u); } +static int check_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *err_str) +{ + DBG_LOG("recv check end signal."); + return 0; +} static ucport_def *check(tran_def *t, uint8_t cmd,array_def *data) @@ -384,6 +409,7 @@ static ucport_def *check(tran_def *t, uint8_t cmd,array_def *data) u->u.p=t; u->u.del=check_del; u->u.doend=check_end; + u->u.dolater=check_dolater; u->addrs_num=arr_get(data,0); u->type=arr_get(data,0); // 默认失败