From 70e6c269fe2e020cc52bb732683225de27045d37 Mon Sep 17 00:00:00 2001 From: gitea Date: Fri, 12 Jul 2024 10:46:59 +0800 Subject: [PATCH 1/9] =?UTF-8?q?v0.1.9.1(2024/07/12)=201.=20[APIs:=20do=5Fb?= =?UTF-8?q?rake.py]=20=20=20=20-=20=E4=BF=AE=E6=94=B9=E6=AD=A3=E8=B4=9F?= =?UTF-8?q?=E6=96=B9=E5=90=91=E6=8B=8D=E6=80=A5=E5=81=9C=E7=9A=84=E9=80=BB?= =?UTF-8?q?=E8=BE=91=EF=BC=8C=E5=9F=BA=E6=9C=AC=E5=8E=9F=E7=90=86=E4=B8=BA?= =?UTF-8?q?=EF=BC=9A=E8=BF=90=E8=A1=8C=E4=B9=8B=E5=89=8D=E5=8F=91=E9=80=81?= =?UTF-8?q?=E6=AD=A3=E8=B4=9F=E6=96=B9=E5=90=91=E4=BF=A1=E5=8F=B7pon?= =?UTF-8?q?=E7=BB=99RL=EF=BC=8CRL=E6=A0=B9=E6=8D=AE=E4=BF=A1=E5=8F=B7?= =?UTF-8?q?=E4=BB=A5=E5=8F=8A=E9=80=9F=E5=BA=A6=E6=AD=A3=E8=B4=9F=E5=8F=B7?= =?UTF-8?q?=E8=BF=90=E4=BD=9C=20=20=20=20-=20=E7=94=B1=E4=BA=8E=E4=B8=8A?= =?UTF-8?q?=E8=BF=B0=E4=BF=AE=E6=94=B9=EF=BC=8C=E6=AD=A3=E8=B4=9F=E6=96=B9?= =?UTF-8?q?=E5=90=91=E6=80=A5=E5=81=9C=E5=87=86=E7=A1=AE=E7=8E=87=E5=8F=AF?= =?UTF-8?q?=E8=BE=BE100%=202.=20[APIs:=20aio.py]=20=20=20=20-=20=E4=BF=AE?= =?UTF-8?q?=E6=94=B9write2textbox=E7=9A=84=E8=BE=93=E5=87=BA=E9=80=BB?= =?UTF-8?q?=E8=BE=91=EF=BC=8C=E5=AE=9E=E7=8E=B0=E6=9B=B4=E5=8A=A0=E7=81=B5?= =?UTF-8?q?=E6=B4=BB=E7=9A=84=E8=87=AA=E5=AE=9A=E4=B9=89=E8=BE=93=E5=87=BA?= =?UTF-8?q?=EF=BC=8C=E5=90=8C=E6=97=B6=E4=BF=AE=E6=94=B9=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E9=83=A8=E5=88=86=203.=20[APIs:=20openapi.py]=20=20=20=20-=20m?= =?UTF-8?q?odbus=E7=B1=BB=E6=96=B0=E5=A2=9E=E6=8C=87=E7=A4=BA=E6=94=BF?= =?UTF-8?q?=E5=BA=9C=E6=96=B9=E5=90=91=E6=80=A5=E5=81=9C=E7=9A=84=E4=BF=A1?= =?UTF-8?q?=E5=8F=B7pon=EF=BC=8C=E5=B0=86modbus=E7=B1=BB=E5=85=A5=E5=8F=82?= =?UTF-8?q?=E4=B8=AD=E7=9A=84tab=5Fname=E5=88=A0=E9=99=A4=EF=BC=8C?= =?UTF-8?q?=E5=B9=B6=E4=BF=AE=E6=94=B9tab=5Fname=E7=9A=84=E5=80=BC?= =?UTF-8?q?=E4=B8=BA'openapi'=20=20=20=20-=20socket=E7=B1=BB=E7=A7=8D?= =?UTF-8?q?=E4=BF=AE=E6=94=B9tab=5Fname=E7=9A=84=E5=80=BC=E4=B8=BA'openapi?= =?UTF-8?q?'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- aio/README.md | 15 ++++++++-- aio/assets/autotest.xml | 41 ++++++++++++++++++++++------ aio/assets/file_version_info.txt | 8 +++--- aio/assets/target.zip | Bin 26139 -> 26230 bytes aio/assets/vers | 2 +- aio/code/aio.py | 32 ++++++++++++++-------- aio/code/automatic_test/do_brake.py | 27 ++++++++++++------ aio/code/automatic_test/openapi.py | 17 ++++++++---- 8 files changed, 103 insertions(+), 39 deletions(-) diff --git a/aio/README.md b/aio/README.md index f5b9072..4f9b309 100644 --- a/aio/README.md +++ b/aio/README.md @@ -132,13 +132,14 @@ pyinstaller --noconfirm --onedir --windowed --add-data "C:/Users/Administrator/A > **需要注意的点** -1. 使用之前需要手动修改点位信息,确保所有点位不会发生撞击之后,再进行自动化测试 +1. 使用之前需要手动修改!!负载信息!!点位信息!!,确保所有点位不会发生撞击之后,再进行自动化测试 2. 工程文件不能手动重命名,需要重命名存档,可以导入HMI,然后另存为 3. 务必正确填写configs.xlsx中的Target页面,A1单元格可以选择正负方向急停,但不完全保证100%,大概有95%左右的准确度 4. 由于xCore系统问题,运行过程中可能会出现机器人宕机问题,如果遇到,可以手动重启控制柜,重新运行 5. 运行过程中,如果是因为机器问题无法达到额定百分比速度,会在日志输出框提示,注意观察 6. 运行自动化程序之前,确保机器处于正常状态,无故障,未触发急停 7. 需要额外硬件接线,详细参考configs.xlsx中急停接线图sheet页 +8. 注意观察二轴100%臂展时,是否可以获取到正确的数据 #### 6) 电机电流自动化测试 @@ -450,4 +451,14 @@ v0.1.8.2(2024/07/08) v0.1.9.0(2024/07/10) 1. 完成了制动性能的自动化采集 2. 完善了modbus浮点数读写相关的功能 -3. 修改了target.zip工程,该工程目前适配电机电流和制动性能 \ No newline at end of file +3. 修改了target.zip工程,该工程目前适配电机电流和制动性能 + +v0.1.9.1(2024/07/12) +1. [APIs: do_brake.py] + - 修改正负方向拍急停的逻辑,基本原理为:运行之前发送正负方向信号pon给RL,RL根据信号以及速度正负号运作 + - 由于上述修改,正负方向急停准确率可达100% +2. [APIs: aio.py] + - 修改write2textbox的输出逻辑,实现更加灵活的自定义输出,同时修改相关部分 +3. [APIs: openapi.py] + - modbus类新增指示政府方向急停的信号pon,将modbus类入参中的tab_name删除,并修改tab_name的值为'openapi' + - socket类种修改tab_name的值为'openapi' \ No newline at end of file diff --git a/aio/assets/autotest.xml b/aio/assets/autotest.xml index 51aa397..e201e65 100644 --- a/aio/assets/autotest.xml +++ b/aio/assets/autotest.xml @@ -943,6 +943,7 @@ + @@ -950,7 +951,7 @@ - + @@ -961,7 +962,8 @@ - + + @@ -969,7 +971,7 @@ - + @@ -980,7 +982,8 @@ - + + @@ -988,7 +991,7 @@ - + @@ -999,7 +1002,8 @@ - + + @@ -1007,7 +1011,7 @@ - + @@ -1019,6 +1023,7 @@ + @@ -1026,7 +1031,7 @@ - + @@ -1038,5 +1043,25 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/aio/assets/file_version_info.txt b/aio/assets/file_version_info.txt index c21b6b5..ca423d4 100644 --- a/aio/assets/file_version_info.txt +++ b/aio/assets/file_version_info.txt @@ -6,8 +6,8 @@ VSVersionInfo( ffi=FixedFileInfo( # filevers and prodvers should be always a tuple with four items: (1, 2, 3, 4) # Set not needed items to zero 0. - filevers=(0, 1, 9, 0), - prodvers=(0, 1, 9, 0), + filevers=(0, 1, 9, 1), + prodvers=(0, 1, 9, 1), # Contains a bitmask that specifies the valid bits 'flags'r mask=0x3f, # Contains a bitmask that specifies the Boolean attributes of the file. @@ -31,12 +31,12 @@ VSVersionInfo( '040904b0', [StringStruct('CompanyName', 'Rokae - https://www.rokae.com/'), StringStruct('FileDescription', 'All in one automatic toolbox'), - StringStruct('FileVersion', '0.1.9.0 (2024-07-10)'), + StringStruct('FileVersion', '0.1.9.1 (2024-07-12)'), StringStruct('InternalName', 'AIO.exe'), StringStruct('LegalCopyright', '© 2024-2024 Manford Fan'), StringStruct('OriginalFilename', 'AIO.exe'), StringStruct('ProductName', 'AIO'), - StringStruct('ProductVersion', '0.1.9.0 (2024-07-10)')]) + StringStruct('ProductVersion', '0.1.9.1 (2024-07-12)')]) ]), VarFileInfo([VarStruct('Translation', [1033, 1200])]) ] diff --git a/aio/assets/target.zip b/aio/assets/target.zip index 651d577bb36baeb507b96914b35e0c138c559be4..2c9fdb777fe8303dc6a7e87ec4b61cecdf3d822f 100644 GIT binary patch delta 7189 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 diff --git a/aio/assets/vers b/aio/assets/vers index 47cff81..282634a 100644 --- a/aio/assets/vers +++ b/aio/assets/vers @@ -1 +1 @@ -0.1.9.0 @ 07/10/2024 \ No newline at end of file +0.1.9.1 @ 07/12/2024 \ No newline at end of file diff --git a/aio/code/aio.py b/aio/code/aio.py index 165966c..adfeca2 100644 --- a/aio/code/aio.py +++ b/aio/code/aio.py @@ -43,8 +43,7 @@ class App(customtkinter.CTk): self.my_font = customtkinter.CTkFont(family="Consolas", size=16, weight="bold") self.w_param = 84 self.hr = None - self.md_at = None - self.md_dp = None + self.md = None # ===================================================================== # configure window self.title("AIO - All in one automatic toolbox") @@ -71,7 +70,7 @@ class App(customtkinter.CTk): btns_func['log']['btn'].configure(command=lambda: self.thread_it(self.func_log_callback)) btns_func['end']['btn'].configure(command=lambda: self.thread_it(self.func_end_callback)) # create version info - self.label_version = customtkinter.CTkLabel(self.frame_func, justify='left', text="Vers: 0.1.9.0\nDate: 07/10/2024", font=self.my_font, text_color="#4F4F4F") + self.label_version = customtkinter.CTkLabel(self.frame_func, justify='left', text="Vers: 0.1.9.1\nDate: 07/12/2024", font=self.my_font, text_color="#4F4F4F") self.frame_func.rowconfigure(6, weight=1) self.label_version.grid(row=6, column=0, padx=20, pady=20, sticky='s') # ===================================================================== @@ -175,7 +174,7 @@ class App(customtkinter.CTk): else: for _func in _btn_funcs: if _btn_funcs[_func] == value: - btn_functions.main(self.hr, self.md_at, _func, self.write2textbox) + btn_functions.main(self.hr, self.md, _func, self.write2textbox) break self.seg_button.configure(state='normal') @@ -185,8 +184,7 @@ class App(customtkinter.CTk): with open(f"{current_path}/../assets/templates/heartbeat", "w", encoding='utf-8') as f_hb: f_hb.write('0') self.hr = openapi.HmiRequest(self.write2textbox) - self.md_at = openapi.ModbusRequest(self, 'Automatic Test') - self.md_dp = openapi.ModbusRequest(self, 'Data Process') + self.md = openapi.ModbusRequest(self.write2textbox) while True: with open(f'{current_path}/../assets/templates/heartbeat', 'r', encoding='utf-8') as f_hb: @@ -194,7 +192,6 @@ class App(customtkinter.CTk): pb_color = 'green' if c_state == '1' else 'red' self.progressbar.configure(progress_color=pb_color) if c_state == '0': - # self.textbox.delete(index1='1.0', index2='end') self.hr.t_bool = False sleep(3) del self.hr @@ -203,7 +200,6 @@ class App(customtkinter.CTk): def tabview_click(self): self.initialization() - # self.textbox.delete(index1='1.0', index2='end') tab_name = self.tabview.get() if tab_name == 'Data Process': @@ -351,7 +347,21 @@ class App(customtkinter.CTk): self.textbox.insert(index='end', text=text + '\n', tags=color) self.textbox.update() self.textbox.see('end') - + elif tab_name == 'openapi' and tab_name_cur == 'Automatic Test': + if wait != 0: + self.textbox.insert(index='end', text=text, tags=color) + self.textbox.update() + self.textbox.see('end') + elif exitcode != 0: + self.textbox.insert(index='end', text=text + '\n', tags=color) + self.textbox.update() + self.textbox.see('end') + raise Exception(f"Error code: {exitcode}") + else: + self.textbox.insert(index='end', text=text + '\n', tags=color) + self.textbox.update() + self.textbox.see('end') + def is_float(self, flag, *args): for item in args: try: @@ -459,10 +469,10 @@ class App(customtkinter.CTk): func_dict[flag](path=args[0], w2t=self.write2textbox) elif flag == 5: self.pre_warning() - func_dict[flag](path=args[0], hr=self.hr, md=self.md_at, loadsel=args[1], w2t=self.write2textbox) + func_dict[flag](path=args[0], hr=self.hr, md=self.md, loadsel=args[1], w2t=self.write2textbox) elif flag == 6: self.pre_warning() - func_dict[flag](path=args[0], hr=self.hr, md=self.md_at, loadsel=args[1], w2t=self.write2textbox) + func_dict[flag](path=args[0], hr=self.hr, md=self.md, loadsel=args[1], w2t=self.write2textbox) else: tkinter.messagebox.showerror(title="参数错误", message="请检查对应参数是否填写正确!", ) diff --git a/aio/code/automatic_test/do_brake.py b/aio/code/automatic_test/do_brake.py index 6b94f6b..171310b 100644 --- a/aio/code/automatic_test/do_brake.py +++ b/aio/code/automatic_test/do_brake.py @@ -168,6 +168,13 @@ def run_rl(path, loadsel, hr, md, config_file, prj_file, result_dirs, w2t): ] wb = load_workbook(config_file, read_only=True) ws = wb['Target'] + if ws.cell(row=1, column=1).value == 'positive': + md.write_pon(True) + elif ws.cell(row=1, column=1).value == 'negative': + md.write_pon(False) + else: + w2t("configs.xlsx中Target页面A1单元格填写不正确,检查后重新运行...", 0, 111, 'red', 'Automatic Test') + for condition in result_dirs: _reach = condition.split('_')[0].removeprefix('reach') _load = condition.split('_')[1].removeprefix('load') @@ -196,17 +203,17 @@ def run_rl(path, loadsel, hr, md, config_file, prj_file, result_dirs, w2t): ssh.set_missing_host_key_policy(AutoAddPolicy()) ssh.connect('192.168.0.160', 22, username='luoshi', password='luoshi2019') if ws.cell(row=1, column=1).value == 'positive': - _rl_cmd = f"brake_E(j{axis}_{_reach}_n, j{axis}_{_reach}_p, p_speed, p_tool)" - elif ws.cell(row=1, column=1).value == 'negative': _rl_cmd = f"brake_E(j{axis}_{_reach}_p, j{axis}_{_reach}_n, p_speed, p_tool)" + elif ws.cell(row=1, column=1).value == 'negative': + _rl_cmd = f"brake_E(j{axis}_{_reach}_n, j{axis}_{_reach}_p, p_speed, p_tool)" else: w2t("configs.xlsx中Target页面A1单元格填写不正确,检查后重新运行...", 0, 111, 'red', 'Automatic Test') _rl_speed = f"VelSet {_speed}" cmd = 'cd /home/luoshi/bin/controller/; ' cmd += 'sudo sed -i "/brake_E/d" projects/target/_build/brake/main.mod; ' cmd += f'sudo sed -i "/DONOTDELETE/i {_rl_cmd}" projects/target/_build/brake/main.mod; ' - cmd += f'sudo sed -i "/VelSet/d" projects/target/_build/brake/main.mod; ' - cmd += f'sudo sed -i "/MoveAbsJ/i {_rl_speed}" projects/target/_build/brake/main.mod; ' + cmd += 'sudo sed -i "/VelSet/d" projects/target/_build/brake/main.mod; ' + cmd += f'sudo sed -i "/MoveAbsJ/i {_rl_speed}" projects/target/_build/brake/main.mod' stdin, stdout, stderr = ssh.exec_command(cmd, get_pty=True) stdin.write('luoshi2019' + '\n') stdin.flush() @@ -233,7 +240,7 @@ def run_rl(path, loadsel, hr, md, config_file, prj_file, result_dirs, w2t): if count == 1: _response = execution('diagnosis.open', hr, w2t, open=True, display_open=True) _response = execution('diagnosis.set_params', hr, w2t, display_pdo_params=display_pdo_params) - sleep(8) # 前八秒获取实际最大速度 + sleep(10) # 前10秒获取实际最大速度 md.trigger_estop() _response = execution('diagnosis.open', hr, w2t, open=False, display_open=False) @@ -277,7 +284,7 @@ def run_rl(path, loadsel, hr, md, config_file, prj_file, result_dirs, w2t): _response = execution('diagnosis.open', hr, w2t, open=True, display_open=True) _response = execution('diagnosis.set_params', hr, w2t, display_pdo_params=display_pdo_params) - # sleep(randint(3, 6)) + sleep(randint(3, 6)) md.write_probe(True) _t_start = time() while True: @@ -288,8 +295,12 @@ def run_rl(path, loadsel, hr, md, config_file, prj_file, result_dirs, w2t): sleep(1) # 保证所有数据均已返回 break else: - if (time() - _t_start) // 60 > 1: - w2t(f"规定时间内未找到合适的点触发急停,需要确认RL/Python程序编写正确并正常执行...", 0, 111, 'red', 'Automatic Test') + if (time() - _t_start) > 30: + w2t(f"30s内未触发急停,该条数据无效,需要确认RL/Python程序编写正确并正常执行,或者判别是否是机器本体问题...", 0, 0, 'red', 'Automatic Test') + md.write_probe(False) + _response = execution('diagnosis.open', hr, w2t, open=False, display_open=False) + sleep(1) # 保证所有数据均已返回 + break else: sleep(1) diff --git a/aio/code/automatic_test/openapi.py b/aio/code/automatic_test/openapi.py index 703e9c7..f688694 100644 --- a/aio/code/automatic_test/openapi.py +++ b/aio/code/automatic_test/openapi.py @@ -1,4 +1,4 @@ -from json import load, dumps, loads +from json import load, dumps from socket import socket, setdefaulttimeout, AF_INET, SOCK_STREAM from threading import Thread import selectors @@ -14,10 +14,10 @@ current_path = dirname(__file__) class ModbusRequest(object): - def __init__(self, w2t, tab_name): + def __init__(self, w2t): super().__init__() self.w2t = w2t - self.tab_name = tab_name + self.tab_name = 'openapi' self.host = '192.168.0.160' self.port = 502 self.c = ModbusTcpClient(self.host, self.port) @@ -167,6 +167,13 @@ class ModbusRequest(object): self.w2t(f"{Err}") self.w2t("无法写入速度探测信号,连接Modbus失败,需要确认网络是否通畅,或是未正确导入寄存器文件...", 0, 100, 'red', self.tab_name) + def write_pon(self, pon): # positive or negative + try: + self.c.write_register(41011, pon) + except Exception as Err: + self.w2t(f"{Err}") + self.w2t("无法写入正负方向信号,连接Modbus失败,需要确认网络是否通畅,或是未正确导入寄存器文件...", 0, 100, 'red', self.tab_name) + class HmiRequest(object): def __init__(self, w2t): @@ -182,7 +189,7 @@ class HmiRequest(object): self.flag_xs = 0 self.response_xs = '' self.t_bool = True - self.tab_name = 'Automatic Test' + self.tab_name = 'openapi' self.pkg_size = 0 self.broke = 0 self.half = 0 @@ -219,7 +226,7 @@ class HmiRequest(object): self.w2t("Connection success", 0, 0, 'green', tab_name=self.tab_name) with open(f"{current_path}/../../assets/templates/heartbeat", "w", encoding='utf-8') as f_hb: f_hb.write('1') - md = ModbusRequest(self.w2t, self.tab_name) + md = ModbusRequest(self.w2t) md.reset_estop() md.clear_alarm() md.write_act(False) From dee07b77bbc7f52f3e948a4a1c2424d8ad947ab5 Mon Sep 17 00:00:00 2001 From: gitea Date: Fri, 12 Jul 2024 10:48:50 +0800 Subject: [PATCH 2/9] =?UTF-8?q?v0.1.9.1(2024/07/12)=201.=20[APIs:=20do=5Fb?= =?UTF-8?q?rake.py]=20=20=20=20-=20=E4=BF=AE=E6=94=B9=E6=AD=A3=E8=B4=9F?= =?UTF-8?q?=E6=96=B9=E5=90=91=E6=8B=8D=E6=80=A5=E5=81=9C=E7=9A=84=E9=80=BB?= =?UTF-8?q?=E8=BE=91=EF=BC=8C=E5=9F=BA=E6=9C=AC=E5=8E=9F=E7=90=86=E4=B8=BA?= =?UTF-8?q?=EF=BC=9A=E8=BF=90=E8=A1=8C=E4=B9=8B=E5=89=8D=E5=8F=91=E9=80=81?= =?UTF-8?q?=E6=AD=A3=E8=B4=9F=E6=96=B9=E5=90=91=E4=BF=A1=E5=8F=B7pon?= =?UTF-8?q?=E7=BB=99RL=EF=BC=8CRL=E6=A0=B9=E6=8D=AE=E4=BF=A1=E5=8F=B7?= =?UTF-8?q?=E4=BB=A5=E5=8F=8A=E9=80=9F=E5=BA=A6=E6=AD=A3=E8=B4=9F=E5=8F=B7?= =?UTF-8?q?=E8=BF=90=E4=BD=9C=20=20=20=20-=20=E7=94=B1=E4=BA=8E=E4=B8=8A?= =?UTF-8?q?=E8=BF=B0=E4=BF=AE=E6=94=B9=EF=BC=8C=E6=AD=A3=E8=B4=9F=E6=96=B9?= =?UTF-8?q?=E5=90=91=E6=80=A5=E5=81=9C=E5=87=86=E7=A1=AE=E7=8E=87=E5=8F=AF?= =?UTF-8?q?=E8=BE=BE100%=202.=20[APIs:=20aio.py]=20=20=20=20-=20=E4=BF=AE?= =?UTF-8?q?=E6=94=B9write2textbox=E7=9A=84=E8=BE=93=E5=87=BA=E9=80=BB?= =?UTF-8?q?=E8=BE=91=EF=BC=8C=E5=AE=9E=E7=8E=B0=E6=9B=B4=E5=8A=A0=E7=81=B5?= =?UTF-8?q?=E6=B4=BB=E7=9A=84=E8=87=AA=E5=AE=9A=E4=B9=89=E8=BE=93=E5=87=BA?= =?UTF-8?q?=EF=BC=8C=E5=90=8C=E6=97=B6=E4=BF=AE=E6=94=B9=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E9=83=A8=E5=88=86=203.=20[APIs:=20openapi.py]=20=20=20=20-=20m?= =?UTF-8?q?odbus=E7=B1=BB=E6=96=B0=E5=A2=9E=E6=8C=87=E7=A4=BA=E6=94=BF?= =?UTF-8?q?=E5=BA=9C=E6=96=B9=E5=90=91=E6=80=A5=E5=81=9C=E7=9A=84=E4=BF=A1?= =?UTF-8?q?=E5=8F=B7pon=EF=BC=8C=E5=B0=86modbus=E7=B1=BB=E5=85=A5=E5=8F=82?= =?UTF-8?q?=E4=B8=AD=E7=9A=84tab=5Fname=E5=88=A0=E9=99=A4=EF=BC=8C?= =?UTF-8?q?=E5=B9=B6=E4=BF=AE=E6=94=B9tab=5Fname=E7=9A=84=E5=80=BC?= =?UTF-8?q?=E4=B8=BA'openapi'=20=20=20=20-=20socket=E7=B1=BB=E7=A7=8D?= =?UTF-8?q?=E4=BF=AE=E6=94=B9tab=5Fname=E7=9A=84=E5=80=BC=E4=B8=BA'openapi?= =?UTF-8?q?'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- aio/README.md | 15 ++++++++-- aio/assets/autotest.xml | 41 ++++++++++++++++++++++------ aio/assets/file_version_info.txt | 8 +++--- aio/assets/target.zip | Bin 26139 -> 26230 bytes aio/assets/vers | 2 +- aio/code/aio.py | 32 ++++++++++++++-------- aio/code/automatic_test/do_brake.py | 27 ++++++++++++------ aio/code/automatic_test/openapi.py | 17 ++++++++---- 8 files changed, 103 insertions(+), 39 deletions(-) diff --git a/aio/README.md b/aio/README.md index f5b9072..ba2820e 100644 --- a/aio/README.md +++ b/aio/README.md @@ -132,13 +132,14 @@ pyinstaller --noconfirm --onedir --windowed --add-data "C:/Users/Administrator/A > **需要注意的点** -1. 使用之前需要手动修改点位信息,确保所有点位不会发生撞击之后,再进行自动化测试 +1. 使用之前需要手动修改!!负载信息!!点位信息!!,确保所有点位不会发生撞击之后,再进行自动化测试 2. 工程文件不能手动重命名,需要重命名存档,可以导入HMI,然后另存为 3. 务必正确填写configs.xlsx中的Target页面,A1单元格可以选择正负方向急停,但不完全保证100%,大概有95%左右的准确度 4. 由于xCore系统问题,运行过程中可能会出现机器人宕机问题,如果遇到,可以手动重启控制柜,重新运行 5. 运行过程中,如果是因为机器问题无法达到额定百分比速度,会在日志输出框提示,注意观察 6. 运行自动化程序之前,确保机器处于正常状态,无故障,未触发急停 7. 需要额外硬件接线,详细参考configs.xlsx中急停接线图sheet页 +8. 注意观察二轴100%臂展时,是否可以获取到正确的数据 #### 6) 电机电流自动化测试 @@ -450,4 +451,14 @@ v0.1.8.2(2024/07/08) v0.1.9.0(2024/07/10) 1. 完成了制动性能的自动化采集 2. 完善了modbus浮点数读写相关的功能 -3. 修改了target.zip工程,该工程目前适配电机电流和制动性能 \ No newline at end of file +3. 修改了target.zip工程,该工程目前适配电机电流和制动性能 + +v0.1.9.1(2024/07/12) +1. [APIs: do_brake.py] + - 修改正负方向拍急停的逻辑,基本原理为:运行之前发送正负方向信号pon给RL,RL根据信号以及速度正负号运作 + - 由于上述修改,正负方向急停准确率可达100% +2. [APIs: aio.py] + - 修改write2textbox的输出逻辑,实现更加灵活的自定义输出,同时修改相关部分 +3. [APIs: openapi.py] + - modbus类新增指示政府方向急停的信号pon,将modbus类入参中的tab_name删除,并修改tab_name的值为'openapi' + - socket类种修改tab_name的值为'openapi' diff --git a/aio/assets/autotest.xml b/aio/assets/autotest.xml index 51aa397..e201e65 100644 --- a/aio/assets/autotest.xml +++ b/aio/assets/autotest.xml @@ -943,6 +943,7 @@ + @@ -950,7 +951,7 @@ - + @@ -961,7 +962,8 @@ - + + @@ -969,7 +971,7 @@ - + @@ -980,7 +982,8 @@ - + + @@ -988,7 +991,7 @@ - + @@ -999,7 +1002,8 @@ - + + @@ -1007,7 +1011,7 @@ - + @@ -1019,6 +1023,7 @@ + @@ -1026,7 +1031,7 @@ - + @@ -1038,5 +1043,25 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/aio/assets/file_version_info.txt b/aio/assets/file_version_info.txt index c21b6b5..ca423d4 100644 --- a/aio/assets/file_version_info.txt +++ b/aio/assets/file_version_info.txt @@ -6,8 +6,8 @@ VSVersionInfo( ffi=FixedFileInfo( # filevers and prodvers should be always a tuple with four items: (1, 2, 3, 4) # Set not needed items to zero 0. - filevers=(0, 1, 9, 0), - prodvers=(0, 1, 9, 0), + filevers=(0, 1, 9, 1), + prodvers=(0, 1, 9, 1), # Contains a bitmask that specifies the valid bits 'flags'r mask=0x3f, # Contains a bitmask that specifies the Boolean attributes of the file. @@ -31,12 +31,12 @@ VSVersionInfo( '040904b0', [StringStruct('CompanyName', 'Rokae - https://www.rokae.com/'), StringStruct('FileDescription', 'All in one automatic toolbox'), - StringStruct('FileVersion', '0.1.9.0 (2024-07-10)'), + StringStruct('FileVersion', '0.1.9.1 (2024-07-12)'), StringStruct('InternalName', 'AIO.exe'), StringStruct('LegalCopyright', '© 2024-2024 Manford Fan'), StringStruct('OriginalFilename', 'AIO.exe'), StringStruct('ProductName', 'AIO'), - StringStruct('ProductVersion', '0.1.9.0 (2024-07-10)')]) + StringStruct('ProductVersion', '0.1.9.1 (2024-07-12)')]) ]), VarFileInfo([VarStruct('Translation', [1033, 1200])]) ] diff --git a/aio/assets/target.zip b/aio/assets/target.zip index 651d577bb36baeb507b96914b35e0c138c559be4..2c9fdb777fe8303dc6a7e87ec4b61cecdf3d822f 100644 GIT binary patch delta 7189 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 diff --git a/aio/assets/vers b/aio/assets/vers index 47cff81..282634a 100644 --- a/aio/assets/vers +++ b/aio/assets/vers @@ -1 +1 @@ -0.1.9.0 @ 07/10/2024 \ No newline at end of file +0.1.9.1 @ 07/12/2024 \ No newline at end of file diff --git a/aio/code/aio.py b/aio/code/aio.py index 165966c..adfeca2 100644 --- a/aio/code/aio.py +++ b/aio/code/aio.py @@ -43,8 +43,7 @@ class App(customtkinter.CTk): self.my_font = customtkinter.CTkFont(family="Consolas", size=16, weight="bold") self.w_param = 84 self.hr = None - self.md_at = None - self.md_dp = None + self.md = None # ===================================================================== # configure window self.title("AIO - All in one automatic toolbox") @@ -71,7 +70,7 @@ class App(customtkinter.CTk): btns_func['log']['btn'].configure(command=lambda: self.thread_it(self.func_log_callback)) btns_func['end']['btn'].configure(command=lambda: self.thread_it(self.func_end_callback)) # create version info - self.label_version = customtkinter.CTkLabel(self.frame_func, justify='left', text="Vers: 0.1.9.0\nDate: 07/10/2024", font=self.my_font, text_color="#4F4F4F") + self.label_version = customtkinter.CTkLabel(self.frame_func, justify='left', text="Vers: 0.1.9.1\nDate: 07/12/2024", font=self.my_font, text_color="#4F4F4F") self.frame_func.rowconfigure(6, weight=1) self.label_version.grid(row=6, column=0, padx=20, pady=20, sticky='s') # ===================================================================== @@ -175,7 +174,7 @@ class App(customtkinter.CTk): else: for _func in _btn_funcs: if _btn_funcs[_func] == value: - btn_functions.main(self.hr, self.md_at, _func, self.write2textbox) + btn_functions.main(self.hr, self.md, _func, self.write2textbox) break self.seg_button.configure(state='normal') @@ -185,8 +184,7 @@ class App(customtkinter.CTk): with open(f"{current_path}/../assets/templates/heartbeat", "w", encoding='utf-8') as f_hb: f_hb.write('0') self.hr = openapi.HmiRequest(self.write2textbox) - self.md_at = openapi.ModbusRequest(self, 'Automatic Test') - self.md_dp = openapi.ModbusRequest(self, 'Data Process') + self.md = openapi.ModbusRequest(self.write2textbox) while True: with open(f'{current_path}/../assets/templates/heartbeat', 'r', encoding='utf-8') as f_hb: @@ -194,7 +192,6 @@ class App(customtkinter.CTk): pb_color = 'green' if c_state == '1' else 'red' self.progressbar.configure(progress_color=pb_color) if c_state == '0': - # self.textbox.delete(index1='1.0', index2='end') self.hr.t_bool = False sleep(3) del self.hr @@ -203,7 +200,6 @@ class App(customtkinter.CTk): def tabview_click(self): self.initialization() - # self.textbox.delete(index1='1.0', index2='end') tab_name = self.tabview.get() if tab_name == 'Data Process': @@ -351,7 +347,21 @@ class App(customtkinter.CTk): self.textbox.insert(index='end', text=text + '\n', tags=color) self.textbox.update() self.textbox.see('end') - + elif tab_name == 'openapi' and tab_name_cur == 'Automatic Test': + if wait != 0: + self.textbox.insert(index='end', text=text, tags=color) + self.textbox.update() + self.textbox.see('end') + elif exitcode != 0: + self.textbox.insert(index='end', text=text + '\n', tags=color) + self.textbox.update() + self.textbox.see('end') + raise Exception(f"Error code: {exitcode}") + else: + self.textbox.insert(index='end', text=text + '\n', tags=color) + self.textbox.update() + self.textbox.see('end') + def is_float(self, flag, *args): for item in args: try: @@ -459,10 +469,10 @@ class App(customtkinter.CTk): func_dict[flag](path=args[0], w2t=self.write2textbox) elif flag == 5: self.pre_warning() - func_dict[flag](path=args[0], hr=self.hr, md=self.md_at, loadsel=args[1], w2t=self.write2textbox) + func_dict[flag](path=args[0], hr=self.hr, md=self.md, loadsel=args[1], w2t=self.write2textbox) elif flag == 6: self.pre_warning() - func_dict[flag](path=args[0], hr=self.hr, md=self.md_at, loadsel=args[1], w2t=self.write2textbox) + func_dict[flag](path=args[0], hr=self.hr, md=self.md, loadsel=args[1], w2t=self.write2textbox) else: tkinter.messagebox.showerror(title="参数错误", message="请检查对应参数是否填写正确!", ) diff --git a/aio/code/automatic_test/do_brake.py b/aio/code/automatic_test/do_brake.py index 6b94f6b..171310b 100644 --- a/aio/code/automatic_test/do_brake.py +++ b/aio/code/automatic_test/do_brake.py @@ -168,6 +168,13 @@ def run_rl(path, loadsel, hr, md, config_file, prj_file, result_dirs, w2t): ] wb = load_workbook(config_file, read_only=True) ws = wb['Target'] + if ws.cell(row=1, column=1).value == 'positive': + md.write_pon(True) + elif ws.cell(row=1, column=1).value == 'negative': + md.write_pon(False) + else: + w2t("configs.xlsx中Target页面A1单元格填写不正确,检查后重新运行...", 0, 111, 'red', 'Automatic Test') + for condition in result_dirs: _reach = condition.split('_')[0].removeprefix('reach') _load = condition.split('_')[1].removeprefix('load') @@ -196,17 +203,17 @@ def run_rl(path, loadsel, hr, md, config_file, prj_file, result_dirs, w2t): ssh.set_missing_host_key_policy(AutoAddPolicy()) ssh.connect('192.168.0.160', 22, username='luoshi', password='luoshi2019') if ws.cell(row=1, column=1).value == 'positive': - _rl_cmd = f"brake_E(j{axis}_{_reach}_n, j{axis}_{_reach}_p, p_speed, p_tool)" - elif ws.cell(row=1, column=1).value == 'negative': _rl_cmd = f"brake_E(j{axis}_{_reach}_p, j{axis}_{_reach}_n, p_speed, p_tool)" + elif ws.cell(row=1, column=1).value == 'negative': + _rl_cmd = f"brake_E(j{axis}_{_reach}_n, j{axis}_{_reach}_p, p_speed, p_tool)" else: w2t("configs.xlsx中Target页面A1单元格填写不正确,检查后重新运行...", 0, 111, 'red', 'Automatic Test') _rl_speed = f"VelSet {_speed}" cmd = 'cd /home/luoshi/bin/controller/; ' cmd += 'sudo sed -i "/brake_E/d" projects/target/_build/brake/main.mod; ' cmd += f'sudo sed -i "/DONOTDELETE/i {_rl_cmd}" projects/target/_build/brake/main.mod; ' - cmd += f'sudo sed -i "/VelSet/d" projects/target/_build/brake/main.mod; ' - cmd += f'sudo sed -i "/MoveAbsJ/i {_rl_speed}" projects/target/_build/brake/main.mod; ' + cmd += 'sudo sed -i "/VelSet/d" projects/target/_build/brake/main.mod; ' + cmd += f'sudo sed -i "/MoveAbsJ/i {_rl_speed}" projects/target/_build/brake/main.mod' stdin, stdout, stderr = ssh.exec_command(cmd, get_pty=True) stdin.write('luoshi2019' + '\n') stdin.flush() @@ -233,7 +240,7 @@ def run_rl(path, loadsel, hr, md, config_file, prj_file, result_dirs, w2t): if count == 1: _response = execution('diagnosis.open', hr, w2t, open=True, display_open=True) _response = execution('diagnosis.set_params', hr, w2t, display_pdo_params=display_pdo_params) - sleep(8) # 前八秒获取实际最大速度 + sleep(10) # 前10秒获取实际最大速度 md.trigger_estop() _response = execution('diagnosis.open', hr, w2t, open=False, display_open=False) @@ -277,7 +284,7 @@ def run_rl(path, loadsel, hr, md, config_file, prj_file, result_dirs, w2t): _response = execution('diagnosis.open', hr, w2t, open=True, display_open=True) _response = execution('diagnosis.set_params', hr, w2t, display_pdo_params=display_pdo_params) - # sleep(randint(3, 6)) + sleep(randint(3, 6)) md.write_probe(True) _t_start = time() while True: @@ -288,8 +295,12 @@ def run_rl(path, loadsel, hr, md, config_file, prj_file, result_dirs, w2t): sleep(1) # 保证所有数据均已返回 break else: - if (time() - _t_start) // 60 > 1: - w2t(f"规定时间内未找到合适的点触发急停,需要确认RL/Python程序编写正确并正常执行...", 0, 111, 'red', 'Automatic Test') + if (time() - _t_start) > 30: + w2t(f"30s内未触发急停,该条数据无效,需要确认RL/Python程序编写正确并正常执行,或者判别是否是机器本体问题...", 0, 0, 'red', 'Automatic Test') + md.write_probe(False) + _response = execution('diagnosis.open', hr, w2t, open=False, display_open=False) + sleep(1) # 保证所有数据均已返回 + break else: sleep(1) diff --git a/aio/code/automatic_test/openapi.py b/aio/code/automatic_test/openapi.py index 703e9c7..f688694 100644 --- a/aio/code/automatic_test/openapi.py +++ b/aio/code/automatic_test/openapi.py @@ -1,4 +1,4 @@ -from json import load, dumps, loads +from json import load, dumps from socket import socket, setdefaulttimeout, AF_INET, SOCK_STREAM from threading import Thread import selectors @@ -14,10 +14,10 @@ current_path = dirname(__file__) class ModbusRequest(object): - def __init__(self, w2t, tab_name): + def __init__(self, w2t): super().__init__() self.w2t = w2t - self.tab_name = tab_name + self.tab_name = 'openapi' self.host = '192.168.0.160' self.port = 502 self.c = ModbusTcpClient(self.host, self.port) @@ -167,6 +167,13 @@ class ModbusRequest(object): self.w2t(f"{Err}") self.w2t("无法写入速度探测信号,连接Modbus失败,需要确认网络是否通畅,或是未正确导入寄存器文件...", 0, 100, 'red', self.tab_name) + def write_pon(self, pon): # positive or negative + try: + self.c.write_register(41011, pon) + except Exception as Err: + self.w2t(f"{Err}") + self.w2t("无法写入正负方向信号,连接Modbus失败,需要确认网络是否通畅,或是未正确导入寄存器文件...", 0, 100, 'red', self.tab_name) + class HmiRequest(object): def __init__(self, w2t): @@ -182,7 +189,7 @@ class HmiRequest(object): self.flag_xs = 0 self.response_xs = '' self.t_bool = True - self.tab_name = 'Automatic Test' + self.tab_name = 'openapi' self.pkg_size = 0 self.broke = 0 self.half = 0 @@ -219,7 +226,7 @@ class HmiRequest(object): self.w2t("Connection success", 0, 0, 'green', tab_name=self.tab_name) with open(f"{current_path}/../../assets/templates/heartbeat", "w", encoding='utf-8') as f_hb: f_hb.write('1') - md = ModbusRequest(self.w2t, self.tab_name) + md = ModbusRequest(self.w2t) md.reset_estop() md.clear_alarm() md.write_act(False) From a66a55bcd3f6fda39077cd4996cdc729550d21d6 Mon Sep 17 00:00:00 2001 From: gitea Date: Sat, 13 Jul 2024 11:36:35 +0800 Subject: [PATCH 3/9] =?UTF-8?q?v0.1.9.2(2024/07/13)=201.=20[APIs:=20do=5Fb?= =?UTF-8?q?rake.py]=20=20=20=20-=20=E4=BF=AE=E6=94=B9ready=5Fto=5Fgo?= =?UTF-8?q?=E4=BF=A1=E5=8F=B7=E7=9A=84=E6=8E=A5=E6=94=B6=E9=80=BB=E8=BE=91?= =?UTF-8?q?=EF=BC=8C=E9=80=82=E9=85=8D=E5=A4=A7=E8=B4=9F=E8=BD=BD=E6=9C=BA?= =?UTF-8?q?=E5=9E=8B=202.=20[APIs:=20do=5Fcurrent.py]=20=20=20=20-=20?= =?UTF-8?q?=E4=BF=AE=E6=94=B9ready=5Fto=5Fgo=E4=BF=A1=E5=8F=B7=E7=9A=84?= =?UTF-8?q?=E6=8E=A5=E6=94=B6=E9=80=BB=E8=BE=91=EF=BC=8C=E9=80=82=E9=85=8D?= =?UTF-8?q?=E5=A4=A7=E8=B4=9F=E8=BD=BD=E6=9C=BA=E5=9E=8B=20=20=20=20-=20?= =?UTF-8?q?=E8=B0=83=E6=95=B4=E5=8D=95=E8=BD=B4=E6=B5=8B=E8=AF=95=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E4=B8=BA35s=EF=BC=8C=E9=80=82=E9=85=8D=E5=A4=A7?= =?UTF-8?q?=E8=B4=9F=E8=BD=BD=E6=9C=BA=E5=9E=8B=EF=BC=8C=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E5=A0=B5=E8=BD=AC=E7=94=B5=E6=B5=81=E6=8C=81=E7=BB=AD=E6=97=B6?= =?UTF-8?q?=E9=97=B415s=EF=BC=8C=E9=80=82=E5=BD=93=E5=87=8F=E5=B0=91?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E6=97=B6=E9=97=B4=20=20=20=20-=20=E5=B0=86ac?= =?UTF-8?q?t=E4=BF=A1=E5=8F=B7=E7=BD=AE=E4=B8=BAFalse=E7=9A=84=E5=8A=A8?= =?UTF-8?q?=E4=BD=9C=E6=94=BE=E5=9C=A8=E5=88=9D=E5=A7=8B=E5=8C=96=EF=BC=8C?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=A8=8B=E5=BA=8F=E5=81=A5=E5=A3=AE=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- aio/README.md | 13 ++++++++++++- aio/code/automatic_test/do_brake.py | 11 ++++++----- aio/code/automatic_test/do_current.py | 20 ++++++++++++-------- 3 files changed, 30 insertions(+), 14 deletions(-) diff --git a/aio/README.md b/aio/README.md index ba2820e..2e2c652 100644 --- a/aio/README.md +++ b/aio/README.md @@ -132,7 +132,7 @@ pyinstaller --noconfirm --onedir --windowed --add-data "C:/Users/Administrator/A > **需要注意的点** -1. 使用之前需要手动修改!!负载信息!!点位信息!!,确保所有点位不会发生撞击之后,再进行自动化测试 +1. 【重要】使用之前需要手动修改!!负载信息!!点位信息!!,确保所有点位不会发生撞击,确保所有程序正常运行之后,导出工程,再进行自动化测试 2. 工程文件不能手动重命名,需要重命名存档,可以导入HMI,然后另存为 3. 务必正确填写configs.xlsx中的Target页面,A1单元格可以选择正负方向急停,但不完全保证100%,大概有95%左右的准确度 4. 由于xCore系统问题,运行过程中可能会出现机器人宕机问题,如果遇到,可以手动重启控制柜,重新运行 @@ -140,6 +140,8 @@ pyinstaller --noconfirm --onedir --windowed --add-data "C:/Users/Administrator/A 6. 运行自动化程序之前,确保机器处于正常状态,无故障,未触发急停 7. 需要额外硬件接线,详细参考configs.xlsx中急停接线图sheet页 8. 注意观察二轴100%臂展时,是否可以获取到正确的数据 +9. 将autotest.xml导入到寄存器,并新建一个modbus,命名为autotest +10. 针对五轴机型,六轴数据可以填写1-5轴任意一轴的点位信息 #### 6) 电机电流自动化测试 @@ -462,3 +464,12 @@ v0.1.9.1(2024/07/12) 3. [APIs: openapi.py] - modbus类新增指示政府方向急停的信号pon,将modbus类入参中的tab_name删除,并修改tab_name的值为'openapi' - socket类种修改tab_name的值为'openapi' + +v0.1.9.2(2024/07/13) +1. [APIs: do_brake.py] + - 修改ready_to_go信号的接收逻辑,适配大负载机型 +2. [APIs: do_current.py] + - 修改ready_to_go信号的接收逻辑,适配大负载机型 + - 调整单轴测试时间为35s,适配大负载机型,调整堵转电流持续时间15s,适当减少测试时间 + - 将act信号置为False的动作放在初始化,增加程序健壮性 + diff --git a/aio/code/automatic_test/do_brake.py b/aio/code/automatic_test/do_brake.py index 171310b..b937264 100644 --- a/aio/code/automatic_test/do_brake.py +++ b/aio/code/automatic_test/do_brake.py @@ -227,15 +227,16 @@ def run_rl(path, loadsel, hr, md, config_file, prj_file, result_dirs, w2t): _response = execution('state.switch_auto', hr, w2t) _response = execution('state.switch_motor_on', hr, w2t) _response = execution('rl_task.run', hr, w2t, tasks=['brake', 'stop0_related']) - for i in range(3): + _t_start = time() + while True: if md.read_ready_to_go() == 1: md.write_act(True) break else: - sleep(1) - else: - w2t("未收到机器人的运行信号,需要确认RL程序编写正确并正常执行...", 0, 111, 'red', 'Automatic Test') - + if (time() - _t_start) // 20 > 1: + w2t("20s内未收到机器人的运行信号,需要确认RL程序编写正确并正常执行...", 0, 111, 'red', 'Automatic Test') + else: + sleep(1) # 4. 第一次打开诊断曲线,并执行采集8s,之后触发软急停,关闭曲线采集,找出最大速度,传递给RL程序,最后清除相关记录 if count == 1: _response = execution('diagnosis.open', hr, w2t, open=True, display_open=True) diff --git a/aio/code/automatic_test/do_current.py b/aio/code/automatic_test/do_current.py index 8c81968..f57caf9 100644 --- a/aio/code/automatic_test/do_current.py +++ b/aio/code/automatic_test/do_current.py @@ -308,6 +308,8 @@ def run_rl(path, hr, md, loadsel, w2t): _response = execution('diagnosis.open', hr, w2t, open=False, display_open=False) md.trigger_estop() md.reset_estop() + md.write_act(False) + sleep(1) # 让曲线彻底关闭 _response = execution('state.switch_manual', hr, w2t) _response = execution('state.switch_motor_off', hr, w2t) @@ -334,19 +336,19 @@ def run_rl(path, hr, md, loadsel, w2t): # 4. 开始运行程序,单轴运行15s _response = execution('rl_task.run', hr, w2t, tasks=['current']) - for i in range(3): + _t_start = time() + while True: if md.read_ready_to_go() == 1: md.write_act(True) - sleep(1) - md.write_act(False) break else: - sleep(1) - else: - w2t("未收到机器人的运行信号,需要确认RL程序编写正确并正常执行...", 0, 111, 'red', 'Automatic Test') + if (time() - _t_start) // 20 > 1: + w2t("20s内未收到机器人的运行信号,需要确认RL程序编写正确并正常执行...", 0, 111, 'red', 'Automatic Test') + else: + sleep(1) # 5. 打开诊断曲线,并执行采集 - sleep(7) # 保证程序已经运行起来,其实主要是为了保持电流的采集而设定 + sleep(10) # 保证程序已经运行起来,其实主要是为了保持电流的采集而设定 _response = execution('diagnosis.open', hr, w2t, open=True, display_open=True) display_pdo_params = [ {"name": "hw_joint_vel_feedback", "channel": 0}, @@ -365,7 +367,9 @@ def run_rl(path, hr, md, loadsel, w2t): ] _response = execution('diagnosis.set_params', hr, w2t, display_pdo_params=display_pdo_params) scenario_time = 0 - if number < 6 or number > 8: + if number < 6: + sleep(35) + elif number > 8: sleep(15) else: _t_start = time() From d76ee3d223f21e93594f6e05e50458f84fdf3ecb Mon Sep 17 00:00:00 2001 From: gitea Date: Sat, 13 Jul 2024 13:40:04 +0800 Subject: [PATCH 4/9] =?UTF-8?q?1.=20[APIs:=20do=5Fbrake.py]=20=20=20=20-?= =?UTF-8?q?=20=E4=BF=AE=E6=94=B9ready=5Fto=5Fgo=E4=BF=A1=E5=8F=B7=E7=9A=84?= =?UTF-8?q?=E6=8E=A5=E6=94=B6=E9=80=BB=E8=BE=91=EF=BC=8C=E9=80=82=E9=85=8D?= =?UTF-8?q?=E5=A4=A7=E8=B4=9F=E8=BD=BD=E6=9C=BA=E5=9E=8B=202.=20[APIs:=20d?= =?UTF-8?q?o=5Fcurrent.py]=20=20=20=20-=20=E4=BF=AE=E6=94=B9ready=5Fto=5Fg?= =?UTF-8?q?o=E4=BF=A1=E5=8F=B7=E7=9A=84=E6=8E=A5=E6=94=B6=E9=80=BB?= =?UTF-8?q?=E8=BE=91=EF=BC=8C=E9=80=82=E9=85=8D=E5=A4=A7=E8=B4=9F=E8=BD=BD?= =?UTF-8?q?=E6=9C=BA=E5=9E=8B=20=20=20=20-=20=E8=B0=83=E6=95=B4=E5=8D=95?= =?UTF-8?q?=E8=BD=B4=E6=B5=8B=E8=AF=95=E6=97=B6=E9=97=B4=E4=B8=BA35s?= =?UTF-8?q?=EF=BC=8C=E9=80=82=E9=85=8D=E5=A4=A7=E8=B4=9F=E8=BD=BD=E6=9C=BA?= =?UTF-8?q?=E5=9E=8B=EF=BC=8C=E8=B0=83=E6=95=B4=E5=A0=B5=E8=BD=AC=E7=94=B5?= =?UTF-8?q?=E6=B5=81=E6=8C=81=E7=BB=AD=E6=97=B6=E9=97=B415s=EF=BC=8C?= =?UTF-8?q?=E9=80=82=E5=BD=93=E5=87=8F=E5=B0=91=E6=B5=8B=E8=AF=95=E6=97=B6?= =?UTF-8?q?=E9=97=B4=20=20=20=20-=20=E5=B0=86act=E4=BF=A1=E5=8F=B7?= =?UTF-8?q?=E7=BD=AE=E4=B8=BAFalse=E7=9A=84=E5=8A=A8=E4=BD=9C=E6=94=BE?= =?UTF-8?q?=E5=9C=A8=E5=88=9D=E5=A7=8B=E5=8C=96=EF=BC=8C=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E5=81=A5=E5=A3=AE=E6=80=A7=20=20=20=20-=20?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=89=80=E6=9C=89=E8=BE=93=E5=87=BA=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E7=9A=84=E5=91=BD=E5=90=8D=EF=BC=8C=E5=9C=A8=E6=89=A9?= =?UTF-8?q?=E5=B1=95=E5=90=8D=E4=B9=8B=E5=89=8D=E5=8A=A0=E5=85=A5=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E6=88=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- aio/README.md | 2 ++ aio/assets/file_version_info.txt | 8 ++++---- aio/assets/vers | 2 +- aio/code/automatic_test/do_current.py | 18 +++++++++--------- aio/code/data_process/current.py | 6 ++++-- 5 files changed, 20 insertions(+), 16 deletions(-) diff --git a/aio/README.md b/aio/README.md index 2e2c652..47d4631 100644 --- a/aio/README.md +++ b/aio/README.md @@ -472,4 +472,6 @@ v0.1.9.2(2024/07/13) - 修改ready_to_go信号的接收逻辑,适配大负载机型 - 调整单轴测试时间为35s,适配大负载机型,调整堵转电流持续时间15s,适当减少测试时间 - 将act信号置为False的动作放在初始化,增加程序健壮性 + - 修改所有输出文件的命名,在扩展名之前加入时间戳 +3. [current: current.py]: 在find_point函数种,当无法找到正确点位时,继续执行,而不是直接终止执行 diff --git a/aio/assets/file_version_info.txt b/aio/assets/file_version_info.txt index ca423d4..5f58e11 100644 --- a/aio/assets/file_version_info.txt +++ b/aio/assets/file_version_info.txt @@ -6,8 +6,8 @@ VSVersionInfo( ffi=FixedFileInfo( # filevers and prodvers should be always a tuple with four items: (1, 2, 3, 4) # Set not needed items to zero 0. - filevers=(0, 1, 9, 1), - prodvers=(0, 1, 9, 1), + filevers=(0, 1, 9, 2), + prodvers=(0, 1, 9, 2), # Contains a bitmask that specifies the valid bits 'flags'r mask=0x3f, # Contains a bitmask that specifies the Boolean attributes of the file. @@ -31,12 +31,12 @@ VSVersionInfo( '040904b0', [StringStruct('CompanyName', 'Rokae - https://www.rokae.com/'), StringStruct('FileDescription', 'All in one automatic toolbox'), - StringStruct('FileVersion', '0.1.9.1 (2024-07-12)'), + StringStruct('FileVersion', '0.1.9.2 (2024-07-13)'), StringStruct('InternalName', 'AIO.exe'), StringStruct('LegalCopyright', '© 2024-2024 Manford Fan'), StringStruct('OriginalFilename', 'AIO.exe'), StringStruct('ProductName', 'AIO'), - StringStruct('ProductVersion', '0.1.9.1 (2024-07-12)')]) + StringStruct('ProductVersion', '0.1.9.2 (2024-07-13)')]) ]), VarFileInfo([VarStruct('Translation', [1033, 1200])]) ] diff --git a/aio/assets/vers b/aio/assets/vers index 282634a..ea80ca6 100644 --- a/aio/assets/vers +++ b/aio/assets/vers @@ -1 +1 @@ -0.1.9.1 @ 07/12/2024 \ No newline at end of file +0.1.9.2 @ 07/13/2024 \ No newline at end of file diff --git a/aio/code/automatic_test/do_current.py b/aio/code/automatic_test/do_current.py index f57caf9..583f7ae 100644 --- a/aio/code/automatic_test/do_current.py +++ b/aio/code/automatic_test/do_current.py @@ -129,7 +129,7 @@ def data_proc_regular(path, filename, channel, scenario_time): df1 = pandas.DataFrame.from_dict(_d2d_vel) df2 = pandas.DataFrame.from_dict(_d2d_trq) df = pandas.concat([df1, df2], axis=1) - _filename = f'{path}\\single\\j{channel+1}_single.data' + _filename = f'{path}\\single\\j{channel+1}_single_{time()}.data' df.to_csv(_filename, sep='\t', index=False) elif channel in list(range(6, 9)): with open(filename, 'r', encoding='utf-8') as f_obj: @@ -178,37 +178,37 @@ def data_proc_regular(path, filename, channel, scenario_time): df_01 = pandas.DataFrame.from_dict(_d2d_vel_0) df_02 = pandas.DataFrame.from_dict(_d2d_trq_0) df = pandas.concat([df_01, df_02], axis=1) - _filename = f'{path}\\s_{channel-5}\\j1_s_{channel-5}_{scenario_time}.data' + _filename = f'{path}\\s_{channel-5}\\j1_s_{channel-5}_{scenario_time}_{time()}.data' df.to_csv(_filename, sep='\t', index=False) df_01 = pandas.DataFrame.from_dict(_d2d_vel_1) df_02 = pandas.DataFrame.from_dict(_d2d_trq_1) df = pandas.concat([df_01, df_02], axis=1) - _filename = f'{path}\\s_{channel-5}\\j2_s_{channel-5}_{scenario_time}.data' + _filename = f'{path}\\s_{channel-5}\\j2_s_{channel-5}_{scenario_time}_{time()}.data' df.to_csv(_filename, sep='\t', index=False) df_01 = pandas.DataFrame.from_dict(_d2d_vel_2) df_02 = pandas.DataFrame.from_dict(_d2d_trq_2) df = pandas.concat([df_01, df_02], axis=1) - _filename = f'{path}\\s_{channel-5}\\j3_s_{channel-5}_{scenario_time}.data' + _filename = f'{path}\\s_{channel-5}\\j3_s_{channel-5}_{scenario_time}_{time()}.data' df.to_csv(_filename, sep='\t', index=False) df_01 = pandas.DataFrame.from_dict(_d2d_vel_3) df_02 = pandas.DataFrame.from_dict(_d2d_trq_3) df = pandas.concat([df_01, df_02], axis=1) - _filename = f'{path}\\s_{channel-5}\\j4_s_{channel-5}_{scenario_time}.data' + _filename = f'{path}\\s_{channel-5}\\j4_s_{channel-5}_{scenario_time}_{time()}.data' df.to_csv(_filename, sep='\t', index=False) df_01 = pandas.DataFrame.from_dict(_d2d_vel_4) df_02 = pandas.DataFrame.from_dict(_d2d_trq_4) df = pandas.concat([df_01, df_02], axis=1) - _filename = f'{path}\\s_{channel-5}\\j5_s_{channel-5}_{scenario_time}.data' + _filename = f'{path}\\s_{channel-5}\\j5_s_{channel-5}_{scenario_time}_{time()}.data' df.to_csv(_filename, sep='\t', index=False) df_01 = pandas.DataFrame.from_dict(_d2d_vel_5) df_02 = pandas.DataFrame.from_dict(_d2d_trq_5) df = pandas.concat([df_01, df_02], axis=1) - _filename = f'{path}\\s_{channel-5}\\j6_s_{channel-5}_{scenario_time}.data' + _filename = f'{path}\\s_{channel-5}\\j6_s_{channel-5}_{scenario_time}_{time()}.data' df.to_csv(_filename, sep='\t', index=False) elif channel in list(range(9, 15)): with open(filename, 'r', encoding='utf-8') as f_obj: @@ -227,7 +227,7 @@ def data_proc_regular(path, filename, channel, scenario_time): df1 = pandas.DataFrame.from_dict(_d2d_vel) df2 = pandas.DataFrame.from_dict(_d2d_trq) df = pandas.concat([df1, df2], axis=1) - _filename = f'{path}\\single\\j{channel-8}_hold.data' + _filename = f'{path}\\single\\j{channel-8}_hold_{time()}.data' df.to_csv(_filename, sep='\t', index=False) @@ -248,7 +248,7 @@ def data_proc_inertia(path, filename, channel): df1 = pandas.DataFrame.from_dict(_d2d_vel) df2 = pandas.DataFrame.from_dict(_d2d_trq) df = pandas.concat([df1, df2], axis=1) - _filename = f'{path}\\inertia\\j{channel+4}_inertia.data' + _filename = f'{path}\\inertia\\j{channel+4}_inertia_{time()}.data' df.to_csv(_filename, sep='\t', index=False) diff --git a/aio/code/data_process/current.py b/aio/code/data_process/current.py index 0fd3234..b7cd024 100644 --- a/aio/code/data_process/current.py +++ b/aio/code/data_process/current.py @@ -223,7 +223,8 @@ def find_point(data_file, pos, flag, df, _row_s, _row_e, w2t, exitcode, threshol else: return _row_s, _row_e else: - w2t(f"[{pos}] {data_file}数据有误,需要检查,无法找到第{exitcode}个有效点...", 0, exitcode, 'red') + # w2t(f"[{pos}] {data_file}数据有误,需要检查,无法找到第{exitcode}个有效点...", 0, exitcode, 'red') + w2t(f"[{pos}] {data_file}数据有误,需要检查,无法找到第{exitcode}个有效点...", 0, 0, 'red') elif flag == 'gt': while _row_e > end_point: speed_avg = df.iloc[_row_s:_row_e, 0].abs().mean() @@ -234,7 +235,8 @@ def find_point(data_file, pos, flag, df, _row_s, _row_e, w2t, exitcode, threshol else: return _row_s, _row_e else: - w2t(f"[{pos}] {data_file}数据有误,需要检查,无法找到有效起始点或结束点...", 0, exitcode, 'red') + # w2t(f"[{pos}] {data_file}数据有误,需要检查,无法找到有效起始点或结束点...", 0, exitcode, 'red') + w2t(f"[{pos}] {data_file}数据有误,需要检查,无法找到有效起始点或结束点...", 0, 0, 'red') def p_single(wb, single, vel, trq, rpms, w2t): From 718db9ec45508848fcee66c09ba8cfb45ce84fa6 Mon Sep 17 00:00:00 2001 From: gitea Date: Sat, 13 Jul 2024 13:43:51 +0800 Subject: [PATCH 5/9] change version --- aio/code/aio.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aio/code/aio.py b/aio/code/aio.py index adfeca2..094f2b2 100644 --- a/aio/code/aio.py +++ b/aio/code/aio.py @@ -70,7 +70,7 @@ class App(customtkinter.CTk): btns_func['log']['btn'].configure(command=lambda: self.thread_it(self.func_log_callback)) btns_func['end']['btn'].configure(command=lambda: self.thread_it(self.func_end_callback)) # create version info - self.label_version = customtkinter.CTkLabel(self.frame_func, justify='left', text="Vers: 0.1.9.1\nDate: 07/12/2024", font=self.my_font, text_color="#4F4F4F") + self.label_version = customtkinter.CTkLabel(self.frame_func, justify='left', text="Vers: 0.1.9.2\nDate: 07/13/2024", font=self.my_font, text_color="#4F4F4F") self.frame_func.rowconfigure(6, weight=1) self.label_version.grid(row=6, column=0, padx=20, pady=20, sticky='s') # ===================================================================== From d35858e14eb174cd2f4f90b57b058a0ccc3466cc Mon Sep 17 00:00:00 2001 From: gitea Date: Sat, 13 Jul 2024 15:40:13 +0800 Subject: [PATCH 6/9] =?UTF-8?q?v0.1.9.2(2024/07/13)=201.=20[APIs:=20do=5Fc?= =?UTF-8?q?urrent.py]=20=20=20=20-=20=E5=88=A0=E9=99=A4=E5=A4=9A=E4=BD=99?= =?UTF-8?q?=E7=9A=84=E6=97=B6=E5=BA=8F=E7=9F=AB=E6=AD=A3=E8=AF=AD=E5=8F=A5?= =?UTF-8?q?=E2=80=94=E2=80=94item['value'].reverse()=EF=BC=8C=E4=BD=BF?= =?UTF-8?q?=E8=BE=93=E5=87=BA=E7=9A=84=E6=9B=B2=E7=BA=BF=E4=B8=BA=E5=B9=B3?= =?UTF-8?q?=E6=BB=91=E7=9A=84=E8=87=AA=E7=84=B6=E9=A1=BA=E5=BA=8F=202.=20[?= =?UTF-8?q?current:=20current.py]=20=20=20=20-=20max=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E8=AE=A1=E7=AE=97=E9=80=BB=E8=BE=91=E7=9F=AB=E6=AD=A3=EF=BC=8C?= =?UTF-8?q?=E5=BA=94=E8=AF=A5=E6=98=AF=E5=8F=96=E7=BB=9D=E5=AF=B9=E5=80=BC?= =?UTF-8?q?=E7=9A=84=E6=9C=80=E5=A4=A7=E5=80=BC=20=20=20=20-=20=E6=95=B4?= =?UTF-8?q?=E4=BD=93=E6=A2=B3=E7=90=86=E4=BA=86trq/trqh=E7=9A=84=E4=BC=A0?= =?UTF-8?q?=E9=80=92=E8=B7=AF=E5=BE=84=EF=BC=8C=E7=8E=B0=E5=B7=B2=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3=E5=AE=8C=E6=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- aio/README.md | 6 +++++- aio/code/automatic_test/do_current.py | 2 -- aio/code/data_process/current.py | 20 +++++++++----------- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/aio/README.md b/aio/README.md index 47d4631..c367c30 100644 --- a/aio/README.md +++ b/aio/README.md @@ -473,5 +473,9 @@ v0.1.9.2(2024/07/13) - 调整单轴测试时间为35s,适配大负载机型,调整堵转电流持续时间15s,适当减少测试时间 - 将act信号置为False的动作放在初始化,增加程序健壮性 - 修改所有输出文件的命名,在扩展名之前加入时间戳 -3. [current: current.py]: 在find_point函数种,当无法找到正确点位时,继续执行,而不是直接终止执行 + - 删除多余的时序矫正语句——item['value'].reverse(),使输出的曲线为平滑的自然顺序 +3. [current: current.py] + - 在find_point函数种,当无法找到正确点位时,继续执行,而不是直接终止执行 + - max功能计算逻辑矫正,应该是取绝对值的最大值 + - 整体梳理了trq/trqh的传递路径,现已修正完毕 diff --git a/aio/code/automatic_test/do_current.py b/aio/code/automatic_test/do_current.py index 583f7ae..245fe0f 100644 --- a/aio/code/automatic_test/do_current.py +++ b/aio/code/automatic_test/do_current.py @@ -120,10 +120,8 @@ def data_proc_regular(path, filename, channel, scenario_time): for item in data: item['value'].reverse() if item.get('channel', None) == channel and item.get('name', None) == 'hw_joint_vel_feedback': - item['value'].reverse() _d2d_vel['hw_joint_vel_feedback'].extend(item['value']) elif item.get('channel', None) == channel and item.get('name', None) == 'device_servo_trq_feedback': - item['value'].reverse() _d2d_trq['device_servo_trq_feedback'].extend(item['value']) df1 = pandas.DataFrame.from_dict(_d2d_vel) diff --git a/aio/code/data_process/current.py b/aio/code/data_process/current.py index b7cd024..cef7a6b 100644 --- a/aio/code/data_process/current.py +++ b/aio/code/data_process/current.py @@ -79,7 +79,7 @@ def initialization(path, sub, w2t): return data_files -def current_max(data_files, rcs, trqh, w2t): +def current_max(data_files, rcs, trq, w2t): current = {1: [], 2: [], 3: [], 4: [], 5: [], 6: [], 7: []} for data_file in data_files: if data_file.endswith('.data'): @@ -93,8 +93,8 @@ def current_max(data_files, rcs, trqh, w2t): axis = int(data_file.split('\\')[-1].split('_')[0].removeprefix('j')) rca = rcs[axis-1] - col = df.columns.values[trqh-1] - c_max = df[col].max() + col = df.columns.values[trq-1] + c_max = df[col].abs().max() scale = 1 if data_file.endswith('.csv') else 1000 _ = abs(c_max/scale*rca) @@ -118,7 +118,7 @@ def current_max(data_files, rcs, trqh, w2t): return current -def current_avg(data_files, rcs, trqh, w2t): +def current_avg(data_files, rcs, trq, w2t): current = {1: [], 2: [], 3: [], 4: [], 5: [], 6: [], 7: []} for data_file in data_files: if data_file.endswith('.data'): @@ -132,7 +132,7 @@ def current_avg(data_files, rcs, trqh, w2t): axis = int(data_file.split('\\')[-1].split('_')[0].removeprefix('j')) rca = rcs[axis-1] - col = df.columns.values[trqh - 1] + col = df.columns.values[trq-1] c_std = df[col].std() c_avg = df[col].mean() @@ -223,8 +223,7 @@ def find_point(data_file, pos, flag, df, _row_s, _row_e, w2t, exitcode, threshol else: return _row_s, _row_e else: - # w2t(f"[{pos}] {data_file}数据有误,需要检查,无法找到第{exitcode}个有效点...", 0, exitcode, 'red') - w2t(f"[{pos}] {data_file}数据有误,需要检查,无法找到第{exitcode}个有效点...", 0, 0, 'red') + w2t(f"[{pos}] {data_file}数据有误,需要检查,无法找到第{exitcode}个有效点...", 0, exitcode, 'red') elif flag == 'gt': while _row_e > end_point: speed_avg = df.iloc[_row_s:_row_e, 0].abs().mean() @@ -235,8 +234,7 @@ def find_point(data_file, pos, flag, df, _row_s, _row_e, w2t, exitcode, threshol else: return _row_s, _row_e else: - # w2t(f"[{pos}] {data_file}数据有误,需要检查,无法找到有效起始点或结束点...", 0, exitcode, 'red') - w2t(f"[{pos}] {data_file}数据有误,需要检查,无法找到有效起始点或结束点...", 0, 0, 'red') + w2t(f"[{pos}] {data_file}数据有误,需要检查,无法找到有效起始点或结束点...", 0, exitcode, 'red') def p_single(wb, single, vel, trq, rpms, w2t): @@ -395,9 +393,9 @@ def main(path, sub, dur, vel, trq, trqh, w2t): data_files = initialization(path, sub, w2t) rpms, rcs = get_configs(path + '\\configs.xlsx', w2t) if sub == 'max': - current_max(data_files, rcs, trqh, w2t) + current_max(data_files, rcs, trq, w2t) elif sub == 'avg': - current_avg(data_files, rcs, trqh, w2t) + current_avg(data_files, rcs, trq, w2t) elif sub == 'cycle': current_cycle(dur, data_files, rcs, vel, trq, trqh, rpms, w2t) else: From 485dffdd0b235a7787646bea260a4bb5ff1dd744 Mon Sep 17 00:00:00 2001 From: gitea Date: Sat, 13 Jul 2024 16:43:56 +0800 Subject: [PATCH 7/9] =?UTF-8?q?=20=20=20-=20=E5=87=8F=E9=80=9F=E6=AF=94rr?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E6=BA=90=E4=BF=AE=E6=94=B9=E4=B8=BAconfigs.x?= =?UTF-8?q?lsx=204.=20=E5=9C=A8current=E5=B7=A5=E7=A8=8Bmain=E5=87=BD?= =?UTF-8?q?=E6=95=B0=E5=A2=9E=E5=8A=A0=20VelSet=20100=E8=AF=AD=E5=8F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- aio/README.md | 1 + aio/assets/configs.xlsx | Bin 226161 -> 226189 bytes aio/assets/target.zip | Bin 26230 -> 26247 bytes aio/code/data_process/current.py | 27 +++++++++++++++++---------- 4 files changed, 18 insertions(+), 10 deletions(-) diff --git a/aio/README.md b/aio/README.md index c367c30..60b6375 100644 --- a/aio/README.md +++ b/aio/README.md @@ -478,4 +478,5 @@ v0.1.9.2(2024/07/13) - 在find_point函数种,当无法找到正确点位时,继续执行,而不是直接终止执行 - max功能计算逻辑矫正,应该是取绝对值的最大值 - 整体梳理了trq/trqh的传递路径,现已修正完毕 + - 减速比rr数据源修改为configs.xlsx diff --git a/aio/assets/configs.xlsx b/aio/assets/configs.xlsx index e591d4c42a4a4389b655ecc44c26f0988e96652c..23e3fd2b910f41ccd9bd708d89ff5386c895109c 100644 GIT binary patch delta 3987 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 K&;43mgZ>A=wN%Fd delta 3980 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 Date: Sat, 13 Jul 2024 16:45:01 +0800 Subject: [PATCH 8/9] =?UTF-8?q?=20=20=20-=20=E5=87=8F=E9=80=9F=E6=AF=94rr?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E6=BA=90=E4=BF=AE=E6=94=B9=E4=B8=BAconfigs.x?= =?UTF-8?q?lsx=204.=20=E5=9C=A8current=E5=B7=A5=E7=A8=8Bmain=E5=87=BD?= =?UTF-8?q?=E6=95=B0=E5=A2=9E=E5=8A=A0=20VelSet=20100=E8=AF=AD=E5=8F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- aio/README.md | 3 ++- aio/assets/configs.xlsx | Bin 226161 -> 226189 bytes aio/assets/target.zip | Bin 26230 -> 26247 bytes aio/code/data_process/current.py | 27 +++++++++++++++++---------- 4 files changed, 19 insertions(+), 11 deletions(-) diff --git a/aio/README.md b/aio/README.md index c367c30..b5e70d6 100644 --- a/aio/README.md +++ b/aio/README.md @@ -478,4 +478,5 @@ v0.1.9.2(2024/07/13) - 在find_point函数种,当无法找到正确点位时,继续执行,而不是直接终止执行 - max功能计算逻辑矫正,应该是取绝对值的最大值 - 整体梳理了trq/trqh的传递路径,现已修正完毕 - + - 减速比rr数据源修改为configs.xlsx +4. 在current工程main函数增加 VelSet 100语句 diff --git a/aio/assets/configs.xlsx b/aio/assets/configs.xlsx index e591d4c42a4a4389b655ecc44c26f0988e96652c..23e3fd2b910f41ccd9bd708d89ff5386c895109c 100644 GIT binary patch delta 3987 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 K&;43mgZ>A=wN%Fd delta 3980 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 Date: Sat, 13 Jul 2024 16:51:18 +0800 Subject: [PATCH 9/9] delete template sheet --- aio/assets/configs.xlsx | Bin 226189 -> 224778 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/aio/assets/configs.xlsx b/aio/assets/configs.xlsx index 23e3fd2b910f41ccd9bd708d89ff5386c895109c..e59ffbb9cb652c1aa13e9dbb8c630b831bc4d68c 100644 GIT binary patch delta 4588 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 YxTY%Fy