From 6331944fab4c13cc19201ce5625c5aa91f671cd5 Mon Sep 17 00:00:00 2001 From: ranchuan Date: Fri, 20 Oct 2023 16:31:11 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=86=E6=9E=90=E5=B7=A5=E5=85=B7=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E5=AF=BC=E5=87=BA=E6=95=B0=E6=8D=AE=E5=92=8C=E5=88=86?= =?UTF-8?q?=E6=9E=90=E7=BB=93=E6=9E=9Chtml=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ReadMe.txt | 4 +++ analysis/.gitignore | 4 ++- analysis/analysis.py | 15 +++++--- analysis/build_html.py | 66 ++++++++++++++++++++++++++++++++++++ analysis/scheme_data.py | 40 +++++++++++++++++++--- updata/creat_jqslave_boot.py | 52 ++++++++++++++++++++++++++++ 6 files changed, 172 insertions(+), 9 deletions(-) create mode 100644 analysis/build_html.py create mode 100644 updata/creat_jqslave_boot.py diff --git a/ReadMe.txt b/ReadMe.txt index e97ca1e..d995d56 100644 --- a/ReadMe.txt +++ b/ReadMe.txt @@ -82,3 +82,7 @@ 2023.10.19 分析工具在后台线程中下载检测数据 解决特定情况下导出方案文件名日期不对的问题 +2023.10.20 + 分析工具添加导出数据和分析结果html文件 + + diff --git a/analysis/.gitignore b/analysis/.gitignore index 94a2dd1..8b86c5c 100644 --- a/analysis/.gitignore +++ b/analysis/.gitignore @@ -1 +1,3 @@ -*.json \ No newline at end of file +*.json +*.zip +*.rar \ No newline at end of file diff --git a/analysis/analysis.py b/analysis/analysis.py index 68b1e06..9263cad 100644 --- a/analysis/analysis.py +++ b/analysis/analysis.py @@ -16,6 +16,7 @@ import scheme_data import numpy as np import threading import os +import build_html plt.rcParams['font.sans-serif']=['SimHei'] @@ -49,6 +50,7 @@ class QFigure(QObject): self.__ax.grid(visible=True,which="major",axis="y") self.__canvas.draw() def save(self,path:str,perfix:str): + path=os.path.join(path,"pic") if not os.path.exists(path): os.makedirs(path) name=os.path.join(path,perfix+self._title) @@ -103,7 +105,7 @@ class Analysis(QWidget): self.__import_but = QPushButton("导入方案",self) self.__import_but.clicked.connect(self.import_but_clicked) self.__import_but.setGeometry(QRect(0,0,100,27)) - self.__export_but = QPushButton("导出方案") + self.__export_but = QPushButton("导出数据") self.__export_but.clicked.connect(self.export_but_clicked) self.__scroll=QScrollArea(self) @@ -138,8 +140,8 @@ class Analysis(QWidget): self.__layout.addRow(figure.canvas(),tplayout.layout()) figure.draw(range(len(data)),data,lable="原始值",limit_max=limit_max,limit_min=limit_min) figure.draw(dat_count,y,lable="权重") - figure.save(self._save_path,str(self._item_index)+".") - self.__items.append((figure,tplayout)) + # figure.save(self._save_path,str(self._item_index)+".") + self.__items.append((figure,tplayout,self._item_index)) self._item_index+=1 def calc_item_end_slot(self,data:list): print("calc_item end.") @@ -214,11 +216,16 @@ class Analysis(QWidget): print("data recv end.") def export_but_clicked(self): ret_limit=[] + ret_values=[] for i,t in zip(self.__items,self.titles): max=i[1].item_value(t+":LimitMax") min=i[1].item_value(t+":LimitMin") ret_limit.append((max,min)) - self.sch_data.export_scheme(ret_limit) + ret_values.append(i[1].values()) + i[0].save(self._save_path,str(i[2])+".") + self.sch_data.export_scheme(self._save_path,ret_limit) + self.sch_data.export_check_data(self._save_path) + build_html.html_build(self._save_path,self.titles,ret_values) # 运行程序 if __name__ == '__main__': app = QApplication(sys.argv) diff --git a/analysis/build_html.py b/analysis/build_html.py new file mode 100644 index 0000000..3b4e209 --- /dev/null +++ b/analysis/build_html.py @@ -0,0 +1,66 @@ + +import os + + + + +_HTML_BASE=""" + + + + + + + 检测数据分析 + + + +
+ + {items} +
+
+ + + +""" + +_HTML_ITEM=""" + + + {pic_name} + + + {params} + + +""" + +_HTML_PARAM=""" +

{name}:{value}

+""" + + + + +def html_build(path:str,pic_names:list,params:list): + h_item="" + index=0 + for pic,par in zip(pic_names,params): + h_param="" + h_param+=_HTML_PARAM.format(name="任务序号",value=index) + for i in par: + h_param+=_HTML_PARAM.format(name=i[0],value=i[1]) + pic_name='.'.join([str(index),pic,'png']) + h_item+=_HTML_ITEM.format(pic_name=pic_name,params=h_param) + index+=1 + html=_HTML_BASE.format(items=h_item) + if not os.path.exists(path): + os.makedirs(path) + save_name=os.path.join(path,"home.html") + with open(save_name,"w+",encoding="utf-8") as f: + f.write(html) + + +# if __name__=="__main__": +# html_add_item("30.充能时间.png",None) \ No newline at end of file diff --git a/analysis/scheme_data.py b/analysis/scheme_data.py index 2d7a956..74706fa 100644 --- a/analysis/scheme_data.py +++ b/analysis/scheme_data.py @@ -252,24 +252,53 @@ class sch_data(object): data_list.append(t) db,cur=_connect_sql() if(db!=None): - cmd="""SELECT id,create_time,addr,err_code,valuez FROM check_result_detail + cmd="""SELECT id,create_time,addr,err_code,run,valuez FROM check_result_detail where create_time > %s and create_time < %s and result_id in (select pk from check_result where plan_id =%s) ;""" cur.execute(cmd,(self.date_start,self.date_end,scheme_id)) check_data=cur.fetchall() for row in check_data: if(row[3]==0): - s=row[4].split(',') + s=row[5].split(',') for i in range(len(s)): data_list[i].append(int(s[i])) + self._check_data=check_data + self._titles=title return title,data_list,len(check_data) - def export_scheme(self,ret_limit): + def export_check_data(self,path:str): + if(self._check_data==None): + return + if(self._titles==None): + return + if not os.path.exists(path): + os.makedirs(path) + save_name=self.scheme_name.split('/')[-1].split('.')[0] + save_name=os.path.join(path,save_name) + with open(save_name+".csv","w+") as f: + title_list=["时间","错误码","执行结果"] + title_list+=self._titles + title_list.append('\n') + s=','.join(title_list) + f.write(s) + for row in self._check_data: + time=row[1].strftime("%Y-%m-%d %H:%M:%S") + err=str(row[3]) + run="=\""+row[4]+"\"" + data=row[5] + s=','.join([time,err,run,data,'\n']) + f.write(s) + print("export check data end.") + + + def export_scheme(self,path:str,ret_limit): + if not os.path.exists(path): + os.makedirs(path) name=self.scheme_name info=_get_info() date=info[0] id=info[1] - save_name=info[2] + save_name=name.split('/')[-1].split('.')[0] quest=quest_text("请输入要导出的文件名",save_name) ack,save_name=quest.show() if(ack!=True): @@ -287,11 +316,14 @@ class sch_data(object): json_obj["PlanID"],sid=_reflush_scheme_id(json_obj["PlanID"]) # 刷新方案id号之后更新日期 date=_get_info()[0] + # 保存到指定路径下 + save_name=os.path.join(path,save_name) save_name=save_name+"_"+date+"{d:02d}".format(d=sid) json_obj["PlanBrief"]=save_name json_str=json.dumps(json_obj, sort_keys=True, indent=4, separators=(',', ': '),ensure_ascii=False) save_f=open(save_name+".json",'+wb') save_f.write(json_str.encode("utf-8")) save_f.close() + print("scheme export end.") if __name__ == "__main__": _main() diff --git a/updata/creat_jqslave_boot.py b/updata/creat_jqslave_boot.py new file mode 100644 index 0000000..a33d384 --- /dev/null +++ b/updata/creat_jqslave_boot.py @@ -0,0 +1,52 @@ +import shutil +import sys +import os +import json + +import prottcp + +BOOT_PATH ="file/JQ_JCXB_V54.bin" +APP_PATH ="file/jqcoder_slave_20230912--1.bin" +SCHEME_PATH = "file/JQ硬件EX工厂注码090701--2.json" +OUT_PATH = "file/coder_jqslave_boot.bin" + +# 创建离线下载器的镜像 + + +# 填充指定个数的byte +def arr_byte_copy(byte:int,num:int): + t=bytearray() + for i in range(num): + t.append(byte) + return t +# int转数组 +def arr_from_int(num:int): + return bytearray([num&0xff,(num>>8)&0xff,(num>>16)&0xff,(num>>24)&0xff]) + + +def creat(): + boot=BOOT_PATH + app=APP_PATH + scheme=SCHEME_PATH + d=bytearray() + with open(boot,"rb") as f: + d+=f.read() + d+=arr_byte_copy(0xff,0x2400-len(d)) + with open(app,"rb") as f: + d+=f.read() + d+=arr_byte_copy(0xff,0xf400-len(d)) + with open(scheme,"rb") as f: + json_obj=json.loads(f.read()) + d+=prottcp.scheme_to_byte(json_obj) + d+=arr_byte_copy(0xff,0xfc00-len(d)) + d+=arr_from_int(0x669955aa) + with open(OUT_PATH,"wb+") as f: + f.write(d) + print(OUT_PATH+" create boot file success.") + + + +if __name__ == "__main__": + creat() + +