From 7f815ac63e9d8db446c58e65ff393dfe7aa72c53 Mon Sep 17 00:00:00 2001 From: gitea Date: Sat, 18 Jan 2025 12:33:29 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BA=86=E5=88=B6=E5=8A=A8?= =?UTF-8?q?=E5=92=8C=E7=94=B5=E6=9C=BA=E7=94=B5=E6=B5=81=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../电机电流/NB4h_R580_3G/NB4h_R580_3G.zip | Bin 26346 -> 24730 bytes assets/files/projects/NB4h_R580_3G.zip | Bin 25224 -> 24730 bytes assets/files/projects/autotest.xml | 210 ++++-------------- code/aio.py | 118 ++++++---- code/automatic_test/do_brake.py | 46 ++-- code/automatic_test/do_current.py | 15 +- code/common/clibs.py | 4 +- 7 files changed, 147 insertions(+), 246 deletions(-) diff --git a/assets/files/examples/自动测试/电机电流/NB4h_R580_3G/NB4h_R580_3G.zip b/assets/files/examples/自动测试/电机电流/NB4h_R580_3G/NB4h_R580_3G.zip index ef5993e0a55600b5feef7ee2022fd900afa42aca..59cb029a1fb396c563da99542e75d53ac62ae3b0 100644 GIT binary patch delta 5193 zcmai&2UHVX(}0uE2|+1Rk`O?e^bP@}!wZO@^bl(3C`d<|h9XV6t29xh7ZuRZM3Al^ zT>+_zh%`m2fYd+4_j}8CzH|P~-ZMLQC-?5m&bjmKUG4*Cw}N4p^~uPYLDV1+C$#%jZII=uVD~#Lon0l?i6&b zex%a!F1`#t9wqtkLfR=GS^1sS?z`9=BWV+Kc1ve!wr~sN#)B*!UrBwJl#wYGJ?*(R z9p~>D6@#u$I`+OLlVyDq6^i$7^)8Gj;b|+vXqzJ~!m6V+b%K0t`@TmS^{)!+Gxc^M zK@tVgKqy+K++}ma-6(4s7StrBURrP}K^vcGfG<`o(b=NNp|7cr%gFe8fZ8NinG1sm z_+fb?>>kc$-7?glNvo|F)W`j_M{3-fIfq#+u-0wG^l^L+N?R}9E;}9H+>UsRuB~WH zvyXhvS+pHxfYD&_<>fHTe-pGJsxUQjRucZlUU*@0Kq)2a7uiQ{U|OI734X>Z;4ty_ zES@I$Z8Rj=xg{l?zI?KvD*YnwqzC`Yc*VgN@b9k0U0d{pkxz;QJ*23#Aun@I-TBGG zQOGbm)HE|iL+{D`#=8Y^`Vf4xV?_fkAF;!_HY@g+Apkqp*3G8JF%vnry}eDhuUGX* zS6enTMxKXRGd5$>xZ6lU8H-czyEfawJ%}I76Fu+nDfL&t%$ma0Nyk)HMxMo+w^{diF@>w3%mi(X*u^4C+f z#?)WtGT})4+|MnA{lkN}9#shK*;di>*)G!S8(DZYW-{!2RI5sJWr@W!4FdH>6McZs zJ6pt90L>FtqEZB0P?GBz_aVHAMTKF=*ue0j3;e>Y7P{ETgV{bB%WVGrN*|TV4i$|g z9HcP1H@cb+t9a+5$@N;F4ZbgBJX2yk%sev)U3j;ZK~(kHhT@>ZkD6akYM-eca`czE zx(0287Yn>B6lp_W^d(@uVfvHRuLSV==qCO7I&U9a<$b6Q?;RRoF7dgb5lh3n;RljA zR*pA3X49nhQS~WPKlilGr5Ixz-M-F?6Qq49s2TLKRP2YH^xDQ1*fK1hQCAO94?3|^ z4yCyv@90|j@LLGFSB0~&pLQg-g33^N$fp|UO7=H)e(v<^jFDRk+}-<0dsP^Zm?;@a zWb#AH7>-_Id&H7>XBV-ScSN9s#k&egd&Tt81kz9^$i5CvE@I&|G2*M%B(q7<^4gQy?)=zjr_O{E)qugCAG*{)#)2BbsH_Nbr_Od znIuHLaN(_0{cB2Fof_)KqVE0Bdm+SAD9V#wUbRM#t0|+t!@i|oZZ_SsbTjcQE zPrUSA9KCIG2-kF0^EdA-c* zkglsd=5d)6zou!$)NPHL73UVPaf8Ze9HkMHk~I zB_S>$E>w??+|*ywpuV5d`mow^ugO0sH}0wO(Y}OF%QqH;+l*5^lfcm(> zgtx+Ixi^cdTIlk2OGSTb9rzk`^QjyC;bVN;pMpo1yc23vhKBa(!p8CYO~~bKSi;?{ zc5sRQ6VWEKfYzJ=VPpyfNjvsA4;U&S;erVew>U0`ZOi~vK##gwO>i7re`gW<#a0LF$H?)$+T&`SX{LC1!#pnI{ z&ZZ9|tWEvC4Gtr=HfO7t%)7LH({ZGJq9xCud8tZf#B^sDnWFu&X4H+MVmQXS43lG& zi%>Ma4_ljjvNC#2_-RcIA!#&=eyLuwx#@`NvOX2{UnPYe1o~Gc0;;JMNyTTKdf`M8 zCTUc_qz)vslhiQ>6{DazDN9jsUZr$kfEh`UXQ(0B5LOvK{J!XB9{+t {`fpa$hT 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 z�-`3jw4IYY7# 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 diff --git a/assets/files/projects/NB4h_R580_3G.zip b/assets/files/projects/NB4h_R580_3G.zip index 3ef67a6d3899ff9cc1c7783e33d5b0be66f90bfc..59cb029a1fb396c563da99542e75d53ac62ae3b0 100644 GIT binary patch delta 5251 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 - + @@ -37,7 +37,7 @@ - + @@ -57,7 +57,7 @@ - + @@ -77,7 +77,7 @@ - + @@ -97,7 +97,7 @@ - + @@ -117,7 +117,7 @@ - + @@ -137,7 +137,7 @@ - + @@ -157,7 +157,7 @@ - + @@ -177,7 +177,7 @@ - + @@ -197,7 +197,7 @@ - + @@ -217,7 +217,7 @@ - + @@ -237,7 +237,7 @@ - + @@ -257,7 +257,7 @@ - + @@ -277,7 +277,7 @@ - + @@ -297,7 +297,7 @@ - + @@ -317,7 +317,7 @@ - + @@ -337,7 +337,7 @@ - + @@ -357,7 +357,7 @@ - + @@ -377,7 +377,7 @@ - + @@ -397,87 +397,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -497,7 +417,7 @@ - + @@ -517,7 +437,7 @@ - + @@ -537,7 +457,7 @@ - + @@ -557,7 +477,7 @@ - + @@ -577,7 +497,7 @@ - + @@ -597,7 +517,7 @@ - + @@ -617,7 +537,7 @@ - + @@ -637,7 +557,7 @@ - + @@ -657,7 +577,7 @@ - + @@ -677,7 +597,7 @@ - + @@ -697,7 +617,7 @@ - + @@ -717,7 +637,7 @@ - + @@ -737,7 +657,7 @@ - + @@ -757,7 +677,7 @@ - + @@ -777,7 +697,7 @@ - + @@ -797,7 +717,7 @@ - + @@ -817,7 +737,7 @@ - + @@ -837,7 +757,7 @@ - + @@ -857,35 +777,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -905,7 +797,7 @@ - + @@ -925,27 +817,7 @@ - - - - - - - - - - - - - - - - - - - - - + diff --git a/code/aio.py b/code/aio.py index 80815f1..2c78cee 100644 --- a/code/aio.py +++ b/code/aio.py @@ -224,9 +224,7 @@ class App: for idx in sorted(infos.keys()): for k, v in infos[idx].items(): self.__w2t(f"{k}: {v}\n") - t = threading.Thread(target=get_robot_info) - t.daemon = True - t.start() + self.__thread_it(get_robot_info) def __trig_estop(self): def trig_estop(): @@ -234,9 +232,9 @@ class App: self.text_output.delete("1.0", "end") self.__w2t("触发软急停信号已发送...\n") clibs.c_md.r_soft_estop(0) - t = threading.Thread(target=trig_estop) - t.daemon = True - t.start() + clibs.running = False + raise Exception("StopProcRunning") + self.__thread_it(trig_estop) def __reset_estop(self): def reset_estop(): @@ -245,15 +243,14 @@ class App: self.__w2t("解除软急停信号已发送...\n") clibs.c_md.r_soft_estop(1) clibs.c_md.r_clear_alarm() - t = threading.Thread(target=reset_estop) - t.daemon = True - t.start() + self.__thread_it(reset_estop) - def __thread_it(self, func, *args): + @staticmethod + def __thread_it(func, *args): """ 将函数打包进线程,必须使用 lambda """ - self.myThread = threading.Thread(target=func, args=args) - self.myThread.daemon = True # 主线程退出就直接让子线程跟随退出,不论是否运行完成。 - self.myThread.start() + t = threading.Thread(target=func, args=args) + t.daemon = True # 主线程退出就直接让子线程跟随退出,不论是否运行完成。 + t.start() def __set_geometry(self, widget, width, height): x = self.root.winfo_x() @@ -327,7 +324,8 @@ class App: def init_op(): if self.__is_running("开始") == "running": - return + return "running" + self.text_output.delete("1.0", ctk.END) self.tabview_bottom.set("输出") clibs.tl_prg = self.__toplevel_progress @@ -341,7 +339,9 @@ class App: self.__get_realtime_log() def exec_function(): - init_op() + if init_op() == "running": + return + if self.tabview_top.get() == "数据处理": clibs.running = True clibs.data_dp = get_data_dp() @@ -368,37 +368,44 @@ class App: self.entry_ip_atv.set("192.168.0.160") self.entry_path_atv.set("数据文件夹路径") self.entry_path_atv.set("数据文件夹路径") + try: + clibs.c_hr.close() + clibs.c_md.close() + except Exception: + ... - if self.__is_running("重置") == "running": - return + def do_reset(): + if self.__is_running("重置") == "running": + return - if clibs.db_state == "readwrite": - res = messagebox.askyesno(title="状态重置", message="这将清空本次所有的输出以及日志记录,且不可恢复,请确认!", default=messagebox.NO, icon=messagebox.WARNING) - if res: - self.text_output.delete("1.0", ctk.END) - try: - clibs.lock.acquire(True) - clibs.cursor.execute("delete from logs") - clibs.cursor.execute("delete from sqlite_sequence") # 主键归零 - except Exception: - self.__w2t("主键归零操作失败", "red") - finally: - clibs.lock.release() + if clibs.db_state == "readwrite": + res = messagebox.askyesno(title="状态重置", message="这将清空本次所有的输出以及日志记录,且不可恢复,请确认!", default=messagebox.NO, icon=messagebox.WARNING) + if res: + self.text_output.delete("1.0", ctk.END) + try: + clibs.lock.acquire(True) + clibs.cursor.execute("delete from logs") + clibs.cursor.execute("delete from sqlite_sequence") # 主键归零 + except Exception: + ... + finally: + clibs.lock.release() - self.treeview_logs.delete(*self.treeview_logs.get_children()) - self.label_pages_logs.set("-.-.-.-.-.-") - reset_methods() - elif clibs.db_state == "readonly": - res = messagebox.askyesno(title="状态重置", message="这将清空本次所有的输出以及恢复本次的日志记录,请确认!", default=messagebox.NO, icon=messagebox.INFO) - if res: - self.text_output.delete("1.0", ctk.END) - clibs.cursor.close() - clibs.conn.close() - clibs.conn = self.conn - clibs.cursor = self.cursor - clibs.db_state = "readwrite" - self.__get_realtime_log() - reset_methods() + self.treeview_logs.delete(*self.treeview_logs.get_children()) + self.label_pages_logs.set("-.-.-.-.-.-") + reset_methods() + elif clibs.db_state == "readonly": + res = messagebox.askyesno(title="状态重置", message="这将清空本次所有的输出以及恢复本次的日志记录,请确认!", default=messagebox.NO, icon=messagebox.INFO) + if res: + self.text_output.delete("1.0", ctk.END) + clibs.cursor.close() + clibs.conn.close() + clibs.conn = self.conn + clibs.cursor = self.cursor + clibs.db_state = "readwrite" + self.__get_realtime_log() + reset_methods() + self.__thread_it(do_reset) @clibs.db_lock def __get_realtime_log(self): @@ -995,9 +1002,21 @@ class App: ... finally: self.btn_conn.configure(state="normal", fg_color="#979DA2") - t = threading.Thread(target=conn_or_disconn) - t.daemon = True - t.start() + self.__thread_it(conn_or_disconn) + + def pending_a_while(event): + def pending(): + self.btn_start.configure(state="disabled") + time.sleep(2) + self.btn_start.configure(state="normal") + self.__thread_it(pending) + + def change_sub_at(event): + def detect_change(): + if self.om_main_at.get() == "current": + self.om_sub_at.set("tool100") + self.root.after(200, detect_change) + # ======================================================================== self.root.rowconfigure(0, weight=1) self.root.rowconfigure(1, weight=99) @@ -1013,6 +1032,7 @@ class App: self.label_logo.grid(row=0, column=0, sticky="new", padx=20, pady=(20, 40)) self.btn_start.grid(row=1, column=0, sticky="new", padx=15, pady=1, ipady=4) self.btn_reset_state.grid(row=2, column=0, sticky="new", padx=15, pady=(0, 1), ipady=4) + self.btn_start.bind("", pending_a_while) # ======================================================================== # self.tabview_top.tab("数据处理").grid_rowconfigure([0, 1], weight=1) self.tabview_top.tab("数据处理").grid_columnconfigure(11, weight=1) @@ -1052,6 +1072,8 @@ class App: self.btn_trig_estop.grid(row=0, column=1, padx=(0, 10), pady=0) self.btn_reset_estop.grid(row=0, column=2, padx=(0, 10), pady=0) + # self.om_main_at.bind("<>", change_sub_at) + self.om_main_at.bind("", change_sub_at) self.entry_path_at.bind("", select_path) self.entry_ip_at.bind("", show_popupmenu_ip, add="+") self.btn_conn.bind("", conn_change) @@ -1102,9 +1124,7 @@ class App: def show(self): if self.server_vers: # if True: - t = threading.Thread(target=self.__detect_network) - t.daemon = True - t.start() + self.__thread_it(self.__detect_network) self.root.mainloop() diff --git a/code/automatic_test/do_brake.py b/code/automatic_test/do_brake.py index ed25197..052735e 100644 --- a/code/automatic_test/do_brake.py +++ b/code/automatic_test/do_brake.py @@ -1,3 +1,4 @@ +import random import time import os import paramiko @@ -111,10 +112,15 @@ def gen_result_file(path, axis, t_end, reach, load, speed, speed_target, rounds, d_stop.extend(d_item) idx = d_stop.index(0) - av_estop = sum(d_vel[idx - 20:idx])/20 * clibs.RADIAN + av_estop = abs(sum(d_vel[idx - 20:idx])/20 * clibs.RADIAN) if av_estop / speed_target < threshold: w2t(f"[av_estop: {av_estop:.2f} | shouldbe: {speed_target:.2f}] 本次触发 ESTOP 时未采集到指定百分比的最大速度,即将重试!\n", "#8A2BE2") - return False + clibs.count += 1 + if clibs.count < 3: + return "retry" + else: + clibs.count = 0 + w2t(f"尝试三次后仍无法获取正确数据,本次数据无效,继续执行...\n", "red") df1 = pandas.DataFrame.from_dict({"hw_joint_vel_feedback": d_vel}) df2 = pandas.DataFrame.from_dict({"device_servo_trq_feedback": d_trq}) @@ -122,14 +128,18 @@ def gen_result_file(path, axis, t_end, reach, load, speed, speed_target, rounds, df = pandas.concat([df1, df2, df3], axis=1) filename = f"{path}/j{axis}/reach{reach}_load{load}_speed{speed}/reach{reach}_load{load}_speed{speed}_{rounds}.data" df.to_csv(filename, sep="\t", index=False) - return True + + +def change_curve_state(hr, stat_1, stat_2): + display_pdo_params = [{"name": name, "channel": chl} for name in ["hw_joint_vel_feedback", "device_servo_trq_feedback"] for chl in range(6)] + display_pdo_params.append({"name": "device_safety_estop", "channel": 0}) + hr.execution("diagnosis.open", open=stat_1, display_open=stat_2, overrun=True, turn_area=True, delay_motion=False) + hr.execution("diagnosis.set_params", display_pdo_params=display_pdo_params, frequency=50, version="1.4.1") def run_rl(path, sub, hr, md, config_file, prj_file, result_dirs, avs, w2t): count, total, speed_target = 0, 63, 0 prj_name = prj_file.split("/")[-1].split(".")[0] - display_pdo_params = [{"name": name, "channel": chl} for name in ["hw_joint_vel_feedback", "device_servo_trq_feedback"] for chl in range(6)] - display_pdo_params.append({"name": "device_safety_estop", "channel": 0}) wb = openpyxl.load_workbook(config_file, read_only=True) ws = wb["Target"] write_diagnosis = float(ws.cell(row=2, column=2).value) @@ -147,8 +157,6 @@ def run_rl(path, sub, hr, md, config_file, prj_file, result_dirs, avs, w2t): else: w2t("configs.xlsx 中 Target 页面 B5 单元格填写不正确,检查后重新运行...", "red", "DirectionError") - hr.execution("diagnosis.open", open=True, display_open=True, overrun=True, turn_area=True, delay_motion=False) - hr.execution("diagnosis.set_params", display_pdo_params=display_pdo_params, frequency=50, version="1.4.1") for condition in result_dirs: reach = condition.split("_")[0].removeprefix("reach") load = condition.split("_")[1].removeprefix("load") @@ -226,12 +234,13 @@ def run_rl(path, sub, hr, md, config_file, prj_file, result_dirs, avs, w2t): if (time.time() - t_start) > 20: w2t("20s 内未收到机器人的运行信号,需要确认 RL 程序编写正确并正常执行...", "red", "ReadySignalTimeoutError") # 4. 找出最大速度,传递给RL程序,最后清除相关记录 - time.sleep(10) # 消除前 10s 的不稳定数据 + time.sleep(5) # 消除前 5s 的不稳定数据 + change_curve_state(hr, True, True) start_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time())) time.sleep(get_init_speed) # 指定时间后获取实际【正|负】方向的最大速度,可通过configs.xlsx配置 end_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time())) hr.execution("rl_task.stop", tasks=["brake"]) - time.sleep(5) # 确保数据都拿到 + change_curve_state(hr, False, False) # 找出最大速度 @clibs.db_lock @@ -284,12 +293,13 @@ def run_rl(path, sub, hr, md, config_file, prj_file, result_dirs, avs, w2t): else: w2t("3s 内未收到机器人的运行信号,需要确认 RL 程序配置正确并正常执行...", "red", "ReadySignalTimeoutError") - time.sleep(10) # 排除从其他位姿到零点位姿,再到轴极限位姿的时间 + time.sleep(5+random.randint(1, 5)) # 排除从其他位姿到零点位姿,再到轴极限位姿的时间 def exec_brake(): flag, start, data, record = True, time.time(), None, None + change_curve_state(hr, True, True) while flag: - time.sleep(0.1) + time.sleep(0.05) if time.time() - start > 20: w2t("20s 内未触发急停,需排查......", "red", "BrakeTimeoutError") @@ -306,24 +316,22 @@ def run_rl(path, sub, hr, md, config_file, prj_file, result_dirs, avs, w2t): continue speed_moment = clibs.RADIAN * sum(item["value"]) / len(item["value"]) - if (pon == "positive" and speed_moment > 0) or (pon == "negative" and speed_moment < 0): - if abs(speed_moment) > speed_target * 0.95: + if abs(speed_moment) > speed_target * 0.95: + if (pon == "positive" and speed_moment > 0) or (pon == "negative" and speed_moment < 0): clibs.c_ec.setdo_value(io_name, "false") - time.sleep(3) + time.sleep(2) + change_curve_state(hr, False, False) flag = False - break return time.time() t_end = exec_brake() # 6. 保留数据并处理输出 ret = gen_result_file(path, axis, t_end, reach, load, speed, speed_target, rounds, w2t) - if ret: + if ret != "retry": + clibs.count = 0 break - else: w2t(f"\n{sub.removeprefix("tool")}%负载的制动性能测试执行完毕,如需采集其他负载,须切换负载类型,并更换其他负载,重新执行。\n", "green") - hr.execution("diagnosis.open", open=False, display_open=False, overrun=True, turn_area=True, delay_motion=False) - hr.execution("diagnosis.set_params", display_pdo_params=[], frequency=50, version="1.4.1") def main(): diff --git a/code/automatic_test/do_current.py b/code/automatic_test/do_current.py index c29595d..4cbd504 100644 --- a/code/automatic_test/do_current.py +++ b/code/automatic_test/do_current.py @@ -121,9 +121,14 @@ def gen_result_file(path, number, start_time, end_time, scenario_time): p.start() +def change_curve_state(hr, stat_1, stat_2): + display_pdo_params = [{"name": name, "channel": chl} for name in ["hw_joint_vel_feedback", "device_servo_trq_feedback", "hw_sensor_trq_feedback"] for chl in range(6)] + hr.execution("diagnosis.open", open=stat_1, display_open=stat_2, overrun=True, turn_area=True, delay_motion=False) + hr.execution("diagnosis.set_params", display_pdo_params=display_pdo_params, frequency=50, version="1.4.1") + + def run_rl(path, prj_file, hr, md, sub, w2t): prj_name = prj_file.split("/")[-1].split(".")[0] - display_pdo_params = [{"name": name, "channel": chl} for name in ["hw_joint_vel_feedback", "device_servo_trq_feedback", "hw_sensor_trq_feedback"] for chl in range(6)] c_regular = [ "scenario(0, j1_p, j1_n, p_speed, p_tool, i_tool)", "scenario(0, j2_p, j2_n, p_speed, p_tool, i_tool)", @@ -155,8 +160,6 @@ def run_rl(path, prj_file, hr, md, sub, w2t): conditions, disc = c_inertia, disc_inertia # 打开诊断曲线,触发软急停,并解除,目的是让可能正在运行着的机器停下来 - hr.execution("diagnosis.open", open=True, display_open=True, overrun=True, turn_area=True, delay_motion=False) - hr.execution("diagnosis.set_params", display_pdo_params=display_pdo_params, frequency=50, version="1.4.1") md.r_soft_estop(0) md.r_soft_estop(1) md.r_clear_alarm() @@ -200,6 +203,7 @@ def run_rl(path, prj_file, hr, md, sub, w2t): # 4. 执行采集 time.sleep(10) # 消除前 10s 的不稳定数据 + change_curve_state(hr, True, True) start_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time())) single_time, stall_time, scenario_time = 40, 10, 0 if number < 6: # 单轴 @@ -222,15 +226,14 @@ def run_rl(path, prj_file, hr, md, sub, w2t): # 5.停止程序运行,保留数据并处理输出 end_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time())) hr.execution("rl_task.stop", tasks=["current"]) - time.sleep(5) # 确保数据都拿到 + time.sleep(2) # 确保数据都拿到 + change_curve_state(hr, False, False) gen_result_file(path, number, start_time, end_time, scenario_time) else: if sub == "tool100": w2t("单轴和场景电机电流采集完毕,如需采集惯量负载,须切换负载类型,并更换惯量负载,重新执行。\n", "green") elif sub == "inertia": w2t("惯量负载电机电流采集完毕,如需采集单轴/场景/保持电机电流,须切换负载类型,并更换偏置负载,重新执行。\n", "green") - hr.execution("diagnosis.open", open=False, display_open=False, overrun=True, turn_area=True, delay_motion=False) - hr.execution("diagnosis.set_params", display_pdo_params=[], frequency=50, version="1.4.1") def main(): diff --git a/code/common/clibs.py b/code/common/clibs.py index 61173bc..7d3bd57 100644 --- a/code/common/clibs.py +++ b/code/common/clibs.py @@ -107,9 +107,7 @@ conn, cursor, w2t, tl_prg, f_records, stop, running = None, None, None, None, No ip_addr = "192.168.0.160" ssh_port, socket_port, xService_port, external_port, modbus_port, upgrade_port = 22, 5050, 6666, 8080, 502, 4567 username, password = "luoshi", "luoshi2019" -interval = 0.5 # interval after actions being triggered, such as modbus/socket/external communication operations -RADIAN = 57.3 # 180 / 3.1415926 -MAX_FRAME_SIZE = 1024 +interval, RADIAN, MAX_FRAME_SIZE, count = 0.5, 57.3, 1024, 0 c_md, c_hr, c_ec, c_pd = None, None, None, None lock = threading.Lock()