basically done

This commit is contained in:
gitea 2025-01-17 13:20:49 +08:00
parent 26f01635df
commit ea05c9bd41
23 changed files with 70 additions and 240170 deletions

View File

@ -6,8 +6,8 @@ VSVersionInfo(
ffi=FixedFileInfo( ffi=FixedFileInfo(
# filevers and prodvers should be always a tuple with four items: (1, 2, 3, 4) # filevers and prodvers should be always a tuple with four items: (1, 2, 3, 4)
# Set not needed items to zero 0. # Set not needed items to zero 0.
filevers=(0, 2, 1, 1), filevers=(0, 3, 0, 0),
prodvers=(0, 2, 1, 1), prodvers=(0, 3, 0, 0),
# Contains a bitmask that specifies the valid bits 'flags'r # Contains a bitmask that specifies the valid bits 'flags'r
mask=0x3f, mask=0x3f,
# Contains a bitmask that specifies the Boolean attributes of the file. # Contains a bitmask that specifies the Boolean attributes of the file.
@ -31,12 +31,12 @@ VSVersionInfo(
'040904b0', '040904b0',
[StringStruct('CompanyName', 'Rokae - https://www.rokae.com/'), [StringStruct('CompanyName', 'Rokae - https://www.rokae.com/'),
StringStruct('FileDescription', 'All in one automatic toolbox'), StringStruct('FileDescription', 'All in one automatic toolbox'),
StringStruct('FileVersion', '0.2.1.1 (2024-12-16)'), StringStruct('FileVersion', '0.3.0.0 (2025-01-17)'),
StringStruct('InternalName', 'AIO.exe'), StringStruct('InternalName', 'AIO.exe'),
StringStruct('LegalCopyright', '© 2024-2024 Manford Fan'), StringStruct('LegalCopyright', '© 2024-2025 Manford Fan'),
StringStruct('OriginalFilename', 'AIO.exe'), StringStruct('OriginalFilename', 'AIO.exe'),
StringStruct('ProductName', 'AIO'), StringStruct('ProductName', 'AIO'),
StringStruct('ProductVersion', '0.2.1.1 (2024-12-16)')]) StringStruct('ProductVersion', '0.3.0.0 (2025-01-17)')])
]), ]),
VarFileInfo([VarStruct('Translation', [1033, 1200])]) VarFileInfo([VarStruct('Translation', [1033, 1200])])
] ]

View File

@ -1 +1 @@
0.2.1.1@12/16/2024 0.3.0.0@01/17/2025

View File

@ -1,6 +1,3 @@
# from tkinter import colorchooser
# from tkinter import font
import time import time
import customtkinter as ctk import customtkinter as ctk
from tkinter import messagebox from tkinter import messagebox
@ -45,10 +42,12 @@ class App:
self.frame_left = ctk.CTkFrame(self.root, width=80, corner_radius=0, fg_color="#E9E9E9") self.frame_left = ctk.CTkFrame(self.root, width=80, corner_radius=0, fg_color="#E9E9E9")
# ------- # -------
self.tabview_top = ctk.CTkTabview(self.root, width=900, height=180, fg_color="#E9E9E9", segmented_button_selected_color="#008B8B", segmented_button_selected_hover_color="#2F4F4F", border_width=2, anchor="w", command=self.__switch_tab_top) self.tabview_top = ctk.CTkTabview(self.root, width=900, height=180, fg_color="#E9E9E9", segmented_button_selected_color="#008B8B", segmented_button_selected_hover_color="#2F4F4F", border_width=2, anchor="w", command=self.__switch_tab_top)
self.tabview_top._segmented_button.configure(font=ctk.CTkFont(family="Consolas", size=18, weight="bold"))
self.tabview_top.add("数据处理") self.tabview_top.add("数据处理")
self.tabview_top.add("自动测试") self.tabview_top.add("自动测试")
# ------- # -------
self.tabview_bottom = ctk.CTkTabview(self.root, fg_color="#E9E9E9", segmented_button_selected_color="#008B8B", segmented_button_selected_hover_color="#2F4F4F", border_width=2, anchor="w", command=self.__switch_tab_bottom) self.tabview_bottom = ctk.CTkTabview(self.root, fg_color="#E9E9E9", segmented_button_selected_color="#008B8B", segmented_button_selected_hover_color="#2F4F4F", border_width=2, anchor="w", command=self.__switch_tab_bottom)
self.tabview_bottom._segmented_button.configure(font=ctk.CTkFont(family="Consolas", size=18, weight="bold"))
self.tabview_bottom.add("输出") self.tabview_bottom.add("输出")
self.tabview_bottom.add("日志") self.tabview_bottom.add("日志")
# ------- # -------
@ -78,7 +77,6 @@ class App:
self.label_ip_at = ctk.CTkLabel(self.tabview_top.tab("自动测试"), anchor="e", text="IP", font=self.f_common) self.label_ip_at = ctk.CTkLabel(self.tabview_top.tab("自动测试"), anchor="e", text="IP", font=self.f_common)
self.entry_ip_at = ctk.CTkEntry(self.tabview_top.tab("自动测试"), width=160, textvariable=self.entry_ip_atv, font=self.f_entry, text_color="#818181") self.entry_ip_at = ctk.CTkEntry(self.tabview_top.tab("自动测试"), width=160, textvariable=self.entry_ip_atv, font=self.f_entry, text_color="#818181")
self.btn_conn = ctk.CTkButton(self.tabview_top.tab("自动测试"), text="连接", width=60, font=self.f_segbtn, fg_color="#979DA2", corner_radius=0, cursor="hand2") self.btn_conn = ctk.CTkButton(self.tabview_top.tab("自动测试"), text="连接", width=60, font=self.f_segbtn, fg_color="#979DA2", corner_radius=0, cursor="hand2")
# self.progressbar_at = ctk.CTkProgressBar(self.tabview_top.tab("自动测试"), width=160, mode="indeterminate")
self.label_path_at = ctk.CTkLabel(self.tabview_top.tab("自动测试"), width=50, anchor="e", text="Path", font=self.f_common) self.label_path_at = ctk.CTkLabel(self.tabview_top.tab("自动测试"), width=50, anchor="e", text="Path", font=self.f_common)
self.entry_path_at = ctk.CTkEntry(self.tabview_top.tab("自动测试"), width=80, state="disabled", textvariable=self.entry_path_atv, font=self.f_entry, text_color="#818181") self.entry_path_at = ctk.CTkEntry(self.tabview_top.tab("自动测试"), width=80, state="disabled", textvariable=self.entry_path_atv, font=self.f_entry, text_color="#818181")
self.frame_top = ctk.CTkFrame(self.tabview_top.tab("自动测试"), width=120, height=10, fg_color="#E9E9E9") self.frame_top = ctk.CTkFrame(self.tabview_top.tab("自动测试"), width=120, height=10, fg_color="#E9E9E9")
@ -107,6 +105,10 @@ class App:
self.popupmenu_kw.add_command(label="剪切", accelerator="Ctrl+X", font=self.f_treeview, command=lambda: self.__cut(self.entry_keyword)) self.popupmenu_kw.add_command(label="剪切", accelerator="Ctrl+X", font=self.f_treeview, command=lambda: self.__cut(self.entry_keyword))
self.popupmenu_kw.add_command(label="粘贴", accelerator="Ctrl+V", font=self.f_treeview, command=lambda: self.__paste(self.entry_keyword)) self.popupmenu_kw.add_command(label="粘贴", accelerator="Ctrl+V", font=self.f_treeview, command=lambda: self.__paste(self.entry_keyword))
self.popupmenu_kw.add_command(label="全选", accelerator="Ctrl+A", font=self.f_treeview, command=lambda: self.__select(self.entry_keyword)) self.popupmenu_kw.add_command(label="全选", accelerator="Ctrl+A", font=self.f_treeview, command=lambda: self.__select(self.entry_keyword))
self.popupmenu_output = tk.Menu(self.text_output, tearoff=False)
self.popupmenu_output.add_command(label="复制", accelerator="Ctrl+C", font=self.f_treeview, command=lambda: self.__copy(self.text_output))
self.popupmenu_output.add_command(label="剪切", accelerator="Ctrl+X", font=self.f_treeview, command=lambda: self.__cut(self.text_output))
self.popupmenu_output.add_command(label="粘贴", accelerator="Ctrl+V", font=self.f_treeview, command=lambda: self.__paste(self.text_output))
# ======================================================================== # ========================================================================
with open(f"{clibs.PREFIX}/files/version/vers", mode="r", encoding="utf-8") as f: with open(f"{clibs.PREFIX}/files/version/vers", mode="r", encoding="utf-8") as f:
local_vers = f.read().strip() local_vers = f.read().strip()
@ -267,7 +269,7 @@ class App:
self.__set_geometry(toplevel, 400, 50) self.__set_geometry(toplevel, 400, 50)
self.root.attributes("-disabled", 1) self.root.attributes("-disabled", 1)
toplevel.protocol("WM_DELETE_WINDOW", print) toplevel.protocol("WM_DELETE_WINDOW", print)
# toplevel.resizable(False, False) toplevel.resizable(False, False)
toplevel.iconbitmap(f"{clibs.PREFIX}/media/icon.ico") toplevel.iconbitmap(f"{clibs.PREFIX}/media/icon.ico")
toplevel.transient(self.root) toplevel.transient(self.root)
@ -559,8 +561,8 @@ class App:
... ...
@staticmethod @staticmethod
def __goto_update(): def __goto_update(event):
webbrowser.open("www.baidu.com") webbrowser.open("http://10.2.23.150:10008/aio.zip")
def __auth_and_vercheck(self): def __auth_and_vercheck(self):
url_vers = "http://10.2.23.150:10008/version" url_vers = "http://10.2.23.150:10008/version"
@ -640,8 +642,7 @@ class App:
if self.tabview_bottom.get() == "日志": if self.tabview_bottom.get() == "日志":
self.__get_realtime_log() self.__get_realtime_log()
@staticmethod def __cut(self, widget):
def __cut(widget):
try: try:
selected = widget.selection_get() selected = widget.selection_get()
all_text = widget.get() all_text = widget.get()
@ -651,7 +652,8 @@ class App:
index_end = index_start + len(selected) index_end = index_start + len(selected)
widget.delete(index_start, index_end) widget.delete(index_start, index_end)
except Exception: except Exception:
... self.__copy(widget)
widget.delete(ctk.SEL_FIRST, ctk.SEL_LAST)
@staticmethod @staticmethod
def __paste(widget): def __paste(widget):
@ -678,7 +680,6 @@ class App:
@staticmethod @staticmethod
def __select(widget): def __select(widget):
widget.select_range(0, "end") widget.select_range(0, "end")
# self.entry_keyword.select_range(0, "end")
def __draw(self): def __draw(self):
def select_path(event): def select_path(event):
@ -962,6 +963,9 @@ class App:
def show_popupmenu_ip(event): def show_popupmenu_ip(event):
self.popupmenu_ip.post(event.x_root, event.y_root) self.popupmenu_ip.post(event.x_root, event.y_root)
def show_popupmenu_output(event):
self.popupmenu_output.post(event.x_root, event.y_root)
def conn_change(event): def conn_change(event):
def conn_or_disconn(): def conn_or_disconn():
if self.btn_conn.cget("fg_color") == "#979DA2": if self.btn_conn.cget("fg_color") == "#979DA2":
@ -1041,7 +1045,6 @@ class App:
self.label_ip_at.grid(row=0, column=1, padx=(0, 10), pady=10, sticky="e") self.label_ip_at.grid(row=0, column=1, padx=(0, 10), pady=10, sticky="e")
self.entry_ip_at.grid(row=0, column=2, padx=(0, 10), pady=10) self.entry_ip_at.grid(row=0, column=2, padx=(0, 10), pady=10)
self.btn_conn.grid(row=0, column=3, padx=(0, 10), pady=10) self.btn_conn.grid(row=0, column=3, padx=(0, 10), pady=10)
# self.progressbar_at.grid(row=0, column=4, padx=(0, 10), pady=10, sticky="e")
self.label_path_at.grid(row=1, column=1, padx=(0, 10), pady=(0, 10), sticky="e") self.label_path_at.grid(row=1, column=1, padx=(0, 10), pady=(0, 10), sticky="e")
self.entry_path_at.grid(row=1, column=2, columnspan=3, padx=(0, 10), pady=(0, 10), sticky="we") self.entry_path_at.grid(row=1, column=2, columnspan=3, padx=(0, 10), pady=(0, 10), sticky="we")
self.frame_top.grid(row=2, column=0, columnspan=5, padx=0, pady=0, sticky="we") self.frame_top.grid(row=2, column=0, columnspan=5, padx=0, pady=0, sticky="we")
@ -1049,8 +1052,6 @@ class App:
self.btn_trig_estop.grid(row=0, column=1, padx=(0, 10), pady=0) 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.btn_reset_estop.grid(row=0, column=2, padx=(0, 10), pady=0)
# self.progressbar_at.start()
# self.progressbar_at.configure(progress_color="red", fg_color="gray")
self.entry_path_at.bind("<Button-1>", select_path) self.entry_path_at.bind("<Button-1>", select_path)
self.entry_ip_at.bind("<Button-3>", show_popupmenu_ip, add="+") self.entry_ip_at.bind("<Button-3>", show_popupmenu_ip, add="+")
self.btn_conn.bind("<Button-1>", conn_change) self.btn_conn.bind("<Button-1>", conn_change)
@ -1059,6 +1060,7 @@ class App:
self.tabview_bottom.tab("输出").grid_rowconfigure(0, weight=1) self.tabview_bottom.tab("输出").grid_rowconfigure(0, weight=1)
self.tabview_bottom.tab("输出").grid_columnconfigure(0, weight=1) self.tabview_bottom.tab("输出").grid_columnconfigure(0, weight=1)
self.text_output.grid(row=0, column=0, sticky="news") self.text_output.grid(row=0, column=0, sticky="news")
self.text_output.bind("<Button-3>", show_popupmenu_output, add="+")
# ======================================================================== # ========================================================================
self.tabview_bottom.tab("日志").grid_rowconfigure(0, weight=1) self.tabview_bottom.tab("日志").grid_rowconfigure(0, weight=1)
self.tabview_bottom.tab("日志").grid_columnconfigure(6, weight=1) self.tabview_bottom.tab("日志").grid_columnconfigure(6, weight=1)
@ -1085,16 +1087,11 @@ class App:
self.btn_find.bind("<Button-1>", find_log) self.btn_find.bind("<Button-1>", find_log)
self.entry_keyword.bind("<Return>", find_log) self.entry_keyword.bind("<Return>", find_log)
self.entry_keyword.bind("<Button-3>", show_popupmenu_kw, add="+") self.entry_keyword.bind("<Button-3>", show_popupmenu_kw, add="+")
# ======================================================================== # ========================================================================
self.frame_status.rowconfigure(0, weight=1) self.frame_status.rowconfigure(0, weight=1)
self.frame_status.columnconfigure([0, 1], weight=1) self.frame_status.columnconfigure([0, 1], weight=1)
self.label_vers.grid(row=0, column=0, sticky="news") self.label_vers.grid(row=0, column=0, sticky="news")
self.label_tips.grid(row=0, column=1, sticky="news") self.label_tips.grid(row=0, column=1, sticky="news")
# ========================================================================
# widgets = [self.om_sub_dp, self.om_vel_dp, self.om_trq_dp, self.om_trqh_dp, self.om_estop_dp, self.om_sensor_dp]
# for widgets in widgets:
# widgets.configure(state="disabled")
self.om_sub_dp.configure(state="disabled") self.om_sub_dp.configure(state="disabled")
self.om_trqh_dp.configure(state="disabled") self.om_trqh_dp.configure(state="disabled")
self.om_sensor_dp.configure(state="disabled") self.om_sensor_dp.configure(state="disabled")

View File

@ -1,67 +0,0 @@
from sys import argv
from commons import clibs
tab_name = clibs.tab_names['at']
logger = clibs.log_prod
def trigger_estop(md, w2t):
md.trigger_estop()
w2t("触发急停成功,可点击机器状态验证。", 0, 0, 'green', tab_name)
def reset_estop(md, w2t):
md.reset_estop()
w2t("恢复急停成功,可点击机器状态验证。", 0, 0, 'green', tab_name)
def get_state(hr, w2t):
# 获取机器状态
_response = clibs.execution('state.get_state', hr, w2t, tab_name)
stat_desc = {'engine': '上电状态', 'operate': '操作模式', 'rc_state': '控制器状态', 'robot_action': '机器人动作', 'safety_mode': '安全模式', 'servo_mode': '伺服工作模式', 'task_space': '工作任务空间'}
for component, state in _response['data'].items():
w2t(f"{stat_desc[component]}: {state}", tab_name=tab_name)
# 获取设备伺服信息
_response = clibs.execution('device.get_params', hr, w2t, tab_name)
dev_desc = {0: '伺服版本', 1: '伺服参数', 2: '安全板固件', 3: '控制器', 4: '通讯总线', 5: '解释器', 6: '运动控制', 8: '力控版本', 9: '末端固件', 10: '机型文件', 11: '环境包'}
dev_vers = {}
for device in _response['data']['devices']:
dev_vers[device['type']] = device['version']
for i in sorted(dev_desc.keys()):
w2t(f"{dev_desc[i]}: {dev_vers[i]}", tab_name=tab_name)
# 设置示教器模式
_response = clibs.execution('state.set_tp_mode', hr, w2t, tab_name, tp_mode='without')
def warning_info(hr, w2t):
for postfix in ['', '.2', '.3', '.4', '.5', '.6', '.7', '.8', '.9', '.10']:
log_name = clibs.log_data_hmi + postfix
try:
with open(log_name, 'r', encoding='utf-8') as f_log:
for line in f_log:
if 'alarm' in line:
w2t(line.strip(), tab_name=tab_name)
except FileNotFoundError:
pass
def main(hr, md, func, w2t):
if hr is None:
w2t("无法连接机器人检查是否已经使用Robot Assist软件连接机器重试中...", 0, 49, 'red', tab_name)
# func: get_state/
match func:
case 'trigger_estop':
trigger_estop(md, w2t)
case 'reset_estop':
reset_estop(md, w2t)
case 'get_state':
get_state(hr, w2t)
case 'warning_info':
warning_info(hr, w2t)
if __name__ == '__main__':
main(*argv[1:])

View File

@ -75,8 +75,11 @@ def initialization(path, sub, data_dirs, data_files, hr, w2t):
clibs.insert_logdb("INFO", "do_brake", f"get_configs: 各关节角速度 {avs}") clibs.insert_logdb("INFO", "do_brake", f"get_configs: 各关节角速度 {avs}")
return avs return avs
clibs.c_hr.set_socket_params(True, str(clibs.external_port), "\r", 1) try:
clibs.c_ec = openapi.ExternalCommunication(clibs.ip_addr, clibs.external_port) clibs.c_hr.set_socket_params(True, str(clibs.external_port), "\r", 1)
clibs.c_ec = openapi.ExternalCommunication(clibs.ip_addr, clibs.external_port)
except Exception:
w2t(f"{clibs.ip_addr}:{clibs.socket_port} 或者 {clibs.ip_addr}:{clibs.external_port} 不可达,需检查网络连接!\n", color="red", desc="NetworkError")
_config_file, _prj_file, _result_dirs = check_files() _config_file, _prj_file, _result_dirs = check_files()
_avs = get_configs() _avs = get_configs()

View File

@ -11,7 +11,7 @@ from common import clibs
def check_files(rawdata_dirs, result_files, w2t): def check_files(rawdata_dirs, result_files, w2t):
msg_wrong = "需要有四个文件和若干个数据文件夹,可参考如下确认:\n" msg_wrong = "需要有四个文件和若干个数据文件夹,可参考如下确认:\n"
msg_wrong += "1. reach33_XXXXXXX.xlsx\n2. reach66_XXXXXXX.xlsx\n3. reach100_XXXXXXX.xlsx\n4. *.cfg\n" msg_wrong += "1. reach33_XXXXXXX.xlsx\n2. reach66_XXXXXXX.xlsx\n3. reach100_XXXXXXX.xlsx\n4. *.cfg\n"
msg_wrong += "- reach33_load33_speed33\nreach33_load33_speed66\n......\nreach100_load100_speed66\nreach100_load100_speed100\n" msg_wrong += "- reach33_load33_speed33\n- reach33_load33_speed66\n...\n- reach100_load100_speed66\n- reach100_load100_speed100\n"
if len(result_files) != 4 or len(rawdata_dirs) == 0: if len(result_files) != 4 or len(rawdata_dirs) == 0:
w2t(msg_wrong, "red", "InitFileError") w2t(msg_wrong, "red", "InitFileError")
@ -167,31 +167,14 @@ def single_file_process(data_file, wb, count, av, rr, vel, trq, estop, w2t):
def data_process(result_file, rawdata_dirs, av, rr, vel, trq, estop, w2t): def data_process(result_file, rawdata_dirs, av, rr, vel, trq, estop, w2t):
filename = result_file.split("/")[-1] filename = result_file.split("/")[-1]
w2t(f"正在打开文件 {filename},这可能需要一些时间......\n", "blue")
clibs.stop = True wb = openpyxl.load_workbook(result_file)
w2t(f"正在打开文件 {filename} 需要 1min 左右......\n", "blue")
t_excel = clibs.GetThreadResult(openpyxl.load_workbook, args=(result_file, ))
t_excel.daemon = True
t_excel.start()
t_progress = threading.Thread(target=clibs.tl_prg, args=("Processing......", ))
t_progress.daemon = True
t_progress.start()
wb = t_excel.get_result()
prefix = filename.split('_')[0] prefix = filename.split('_')[0]
for rawdata_dir in rawdata_dirs: for rawdata_dir in rawdata_dirs:
if rawdata_dir.split("/")[-1].split('_')[0] == prefix: if rawdata_dir.split("/")[-1].split('_')[0] == prefix:
now_doing_msg(rawdata_dir, 'start', w2t) now_doing_msg(rawdata_dir, 'start', w2t)
_, data_files = clibs.traversal_files(rawdata_dir, w2t) _, data_files = clibs.traversal_files(rawdata_dir, w2t)
# 数据文件串行处理模式---------------------------------
# count = 1
# for data_file in data_files:
# now_doing_msg(data_file, 'start', w2t)
# single_file_process(data_file, wb_result, count, av, rr, vel, trq, estop, w2t)
# count += 1
# now_doing_msg(data_file, 'done', w2t)
# ---------------------------------------------------
# 数据文件并行处理模式---------------------------------
threads = [ threads = [
threading.Thread(target=single_file_process, args=(data_files[0], wb, 1, av, rr, vel, trq, estop, w2t)), threading.Thread(target=single_file_process, args=(data_files[0], wb, 1, av, rr, vel, trq, estop, w2t)),
threading.Thread(target=single_file_process, args=(data_files[1], wb, 2, av, rr, vel, trq, estop, w2t)), threading.Thread(target=single_file_process, args=(data_files[1], wb, 2, av, rr, vel, trq, estop, w2t)),
@ -199,17 +182,11 @@ def data_process(result_file, rawdata_dirs, av, rr, vel, trq, estop, w2t):
] ]
[t.start() for t in threads] [t.start() for t in threads]
[t.join() for t in threads] [t.join() for t in threads]
# ---------------------------------------------------
now_doing_msg(rawdata_dir, 'done', w2t) now_doing_msg(rawdata_dir, 'done', w2t)
w2t(f"正在保存文件 {filename} 需要 1min 左右......\n\n", "blue") w2t(f"正在保存文件 {filename},这可能需要一些时间......\n\n", "blue")
t_excel = threading.Thread(target=wb.save, args=(result_file, )) wb.save(result_file)
t_excel.daemon = True
t_excel.start()
t_excel.join()
wb.close() wb.close()
clibs.stop = False
t_progress.join()
def main(): def main():
@ -224,8 +201,13 @@ def main():
config_file, result_files = check_files(rawdata_dirs, result_files, w2t) config_file, result_files = check_files(rawdata_dirs, result_files, w2t)
av, rr = get_configs(config_file, w2t) av, rr = get_configs(config_file, w2t)
clibs.stop = True
t_progress = threading.Thread(target=clibs.tl_prg, args=("Processing......", ))
t_progress.daemon = True
t_progress.start()
for result_file in result_files: for result_file in result_files:
data_process(result_file, rawdata_dirs, av, rr, vel, trq, estop, w2t) data_process(result_file, rawdata_dirs, av, rr, vel, trq, estop, w2t)
clibs.stop = False
w2t("-"*60 + "\n全部处理完毕\n") w2t("-"*60 + "\n全部处理完毕\n")
time_end = time.time() time_end = time.time()

View File

@ -14,12 +14,12 @@ def initialization(path, w2t, insert_logdb):
for data_file in data_files: for data_file in data_files:
filename = data_file.split("/")[-1] filename = data_file.split("/")[-1]
if re.match(".*\\.cfg", filename): if re.match(".*\\.cfg", filename):
config_file = filename config_file = data_file
count += 1 count += 1
elif filename == "T_电机电流.xlsx": elif filename == "T_电机电流.xlsx":
count += 1 count += 1
else: else:
if not re.match("j[1-7].*\\.data", filename): if not re.match("^j[1-7].*\\.data$", filename):
msg = f"不合规 {data_file}\n" msg = f"不合规 {data_file}\n"
msg += "所有数据文件必须以 j[1-7]_ 开头,以 .data 结尾比如j1_abcdef.data请检查整改后重新运行\n" msg += "所有数据文件必须以 j[1-7]_ 开头,以 .data 结尾比如j1_abcdef.data请检查整改后重新运行\n"
w2t(msg, "red", "FilenameIllegal") w2t(msg, "red", "FilenameIllegal")
@ -129,15 +129,12 @@ def current_cycle(data_files, vel, trq, trqh, sensor, rrs, rcs, params, w2t, ins
elif re.match("j[1-7]_.*\\.data", filename): elif re.match("j[1-7]_.*\\.data", filename):
single.append(data_file) single.append(data_file)
clibs.stop = True clibs.stop, filename = True, result.split("/")[-1]
w2t(f"正在打开文件 {result},需要 10s 左右......\n")
t_excel = clibs.GetThreadResult(openpyxl.load_workbook, args=(result, ))
t_excel.daemon = True
t_excel.start()
t_progress = threading.Thread(target=clibs.tl_prg, args=("Processing......", )) t_progress = threading.Thread(target=clibs.tl_prg, args=("Processing......", ))
t_progress.daemon = True t_progress.daemon = True
t_progress.start() t_progress.start()
wb = t_excel.get_result() w2t(f"正在打开文件 {filename},这可能需要一些时间......\n")
wb = openpyxl.load_workbook(result)
ws = wb["统计"] ws = wb["统计"]
for idx in range(len(params)): for idx in range(len(params)):
@ -156,15 +153,10 @@ def current_cycle(data_files, vel, trq, trqh, sensor, rrs, rcs, params, w2t, ins
else: else:
p_scenario(wb, scenario, vel, trq, sensor, rrs, dur_time, w2t) p_scenario(wb, scenario, vel, trq, sensor, rrs, dur_time, w2t)
clibs.stop = True w2t(f"正在保存文件 {filename},这可能需要一些时间......\n")
w2t(f"正在保存文件 {result},需要 10s 左右......\n") wb.save(result)
t_excel = threading.Thread(target=wb.save, args=(result, ))
t_excel.daemon = True
t_excel.start()
t_excel.join()
wb.close() wb.close()
clibs.stop = False clibs.stop = False
t_progress.join()
def find_point(data_file, df, flag, row_s, row_e, threshold, step, end_point, skip_scale, axis, seq, w2t, insert_logdb): def find_point(data_file, df, flag, row_s, row_e, threshold, step, end_point, skip_scale, axis, seq, w2t, insert_logdb):
@ -384,27 +376,32 @@ def get_configs(config_file, w2t, insert_logdb):
# 最大角速度,额定电流,减速比,额定转速 # 最大角速度,额定电流,减速比,额定转速
version = configs["VERSION"] version = configs["VERSION"]
rcs = [abs(_) for _ in configs["MOTOR"]["RATED_TORQUE"]] # 电机额定电流rc for rated current m_rts = configs["MOTOR"]["RATED_TORQUE"] # 电机额定转矩rt for rated torque
m_max_rcs = [] # 电机最大电流 m_max_ts = configs["MOTOR"]["PEAK_TORQUE"] # 电机峰值转矩
m_hold_rcs = [] # 电机堵转电流 m_stall_ts = configs["MOTOR"]["STALL_TORQUE"] # 电机堵转转矩
m_rts = [] # 电机额定转矩rt for rated torque m_tcs = [1, 1, 1, 1, 1, 1] # 电机转矩常数tc for torque constant
m_max_rts = [] # 电机峰值转矩
m_r_rpms = [] # 电机额定转速 m_rcs, m_max_cs, m_stall_cs = [], [], []
m_max_rpms = [] # 电机最大转速 for i in range(len(m_tcs)):
m_tcs = [] # 电机转矩常数tc for torque constant m_rcs.append(m_rts[i]/m_tcs[i]) # 电机额定电流rc for rated current
rrs = [abs(_) for _ in configs["TRANSMISSION"]["REDUCTION_RATIO_NUMERATOR"]] # 减速比rr for reduction ratio m_max_cs.append(m_max_ts[i]/m_tcs[i]) # 电机最大电流
r_max_sst = [] # 减速器最大启停转矩sst for start and stop torque m_stall_cs.append(m_stall_ts[i]/m_tcs[i]) # 电机堵转电流
r_max_t = [] # 减速器瞬时最大转矩
sc = [] # 采样周期sc for sample cycle m_r_rpms = configs["MOTOR"]["RATED_SPEED"] # 电机额定转速
r_rts = [] # 减速器额定转矩 m_max_rpms = configs["MOTOR"]["MAX_SPEED"] # 电机最大转速
r_r_rpms = [] # 减速器额定转速 r_rrs = [abs(_) for _ in configs["TRANSMISSION"]["REDUCTION_RATIO_NUMERATOR"]] # 减速比rr for reduction ratio
r_life_cycle = [] # 减速器L10寿命 r_max_sst = configs["TRANSMISSION"]["MAX_TORQUE_FOR_START_AND_STOP"] # 减速器最大启停转矩sst for start and stop torque
r_avg_t = [] # 减速器平均负载转矩允许最大值 r_max_t = configs["TRANSMISSION"]["MAX_PEAK_TORQUE"] # 减速器瞬时最大转矩
sc = [0.001, 0.001, 0.001, 0.001, 0.001, 0.001] # 采样周期sc for sample cycle
r_rts = [1, 1, 1, 1, 1, 1] # 减速器额定转矩
r_r_rpms = [1, 1, 1, 1, 1, 1] # 减速器额定转速
r_life_cycle = [10000, 10000, 10000, 10000, 10000, 10000] # 减速器L10寿命
r_avg_t = configs["TRANSMISSION"]["MAX_AVERAGE_TORQUE"] # 减速器平均负载转矩允许最大值
insert_logdb("INFO", "current", f"get_configs: 机型文件版本 {config_file}_{version}") insert_logdb("INFO", "current", f"get_configs: 机型文件版本 {config_file}_{version}")
insert_logdb("INFO", "current", f"get_configs: 减速比 {rrs}") insert_logdb("INFO", "current", f"get_configs: 减速比 {r_rrs}")
insert_logdb("INFO", "current", f"get_configs: 额定电流 {rcs}") insert_logdb("INFO", "current", f"get_configs: 额定电流 {m_rcs}")
return rcs, m_max_rcs, m_hold_rcs, m_rts, m_max_rts, m_r_rpms, m_max_rpms, m_tcs, rrs, r_max_sst, r_max_t, sc, r_rts, r_r_rpms, r_life_cycle, r_avg_t return m_rcs, m_max_cs, m_stall_cs, m_rts, m_max_ts, m_r_rpms, m_max_rpms, m_tcs, r_rrs, r_max_sst, r_max_t, sc, r_rts, r_r_rpms, r_life_cycle, r_avg_t
def main(): def main():
@ -420,7 +417,7 @@ def main():
insert_logdb("INFO", "current", "current: 参数初始化成功") insert_logdb("INFO", "current", "current: 参数初始化成功")
data_files, config_file = initialization(path, w2t, insert_logdb) data_files, config_file = initialization(path, w2t, insert_logdb)
params = get_configs(f"{path}/{config_file}", w2t, insert_logdb) params = get_configs(config_file, w2t, insert_logdb)
rcs, rrs = params[0], params[8] rcs, rrs = params[0], params[8]
if sub == "max": if sub == "max":
current_max(data_files, rcs, trq, w2t, insert_logdb) current_max(data_files, rcs, trq, w2t, insert_logdb)

View File

@ -31,7 +31,7 @@
打包时,只需要修改 clibs.py 中的 PREFIX 即可,调试时再修改回来 打包时,只需要修改 clibs.py 中的 PREFIX 即可,调试时再修改回来
``` ```
pyinstaller --noconfirm --onedir --windowed --optimize 2 --contents-directory . --upx-dir "D:/Syncthing/common/A_Program/upx-4.2.4-win64/" --add-data "../.venv/Lib/site-packages/customtkinter;customtkinter/" --add-data "../assets:assets" --version-file ../assets/files/version/file_version_info.txt -i ../assets/media/icon.ico ../code/aio.py -p ../code/data_process/brake.py -p ../code/data_process/iso.py -p ../code/data_process/current.py -p ../code/data_process/wavelogger.py -p ../code/commons/clibs.py pyinstaller --noconfirm --onedir --windowed --optimize 2 --contents-directory . --upx-dir "D:/Syncthing/common/A_Program/upx-4.2.4-win64/" --add-data "../.venv/Lib/site-packages/customtkinter;customtkinter/" --add-data "../assets:assets" --version-file ../assets/files/version/file_version_info.txt -i ../assets/media/icon.ico ../code/aio.py -p ../code/data_process/brake.py -p ../code/data_process/iso.py -p ../code/data_process/current.py -p ../code/data_process/wavelogger.py -p ../code/commons/clibs.py -p ../code/commons/openapi.py -p ../code/automatic_test/do_current.py -p ../code/automatic_test/do_brake.py --exclude-module=scipy --exclude-module=matplotlib
``` ```
### 2. tabview 组件字体修改 ### 2. tabview 组件字体修改