From b07f221bb6b1b8f1b11103c897b02d54e93f4598 Mon Sep 17 00:00:00 2001 From: gitea Date: Fri, 28 Mar 2025 13:43:25 +0800 Subject: [PATCH] basically done again --- aio.py | 51 +- assets/files/projects/autotest.xml | 842 --------------------- assets/files/projects/configs.xlsx | Bin 227620 -> 227406 bytes assets/files/protocols/ec/io_state.txt | 1 + assets/files/protocols/ec/set_do.txt | 1 - assets/files/protocols/ec/setdo.txt | 1 + assets/files/version/file_version_info.txt | 8 +- assets/files/version/local_vers | 2 +- assets/files/version/server_vers | 2 +- codes/autotest/do_brake.py | 19 +- codes/common/clibs.py | 13 +- codes/common/openapi.py | 20 +- codes/durable/factory_test.py | 3 +- codes/ui/main_window.py | 15 +- readme.md | 2 +- test.py | 119 --- ui/login.ui | 249 ------ ui/main.ui | 15 +- ui/reset.ui | 271 ------- 19 files changed, 74 insertions(+), 1560 deletions(-) delete mode 100644 assets/files/projects/autotest.xml create mode 100644 assets/files/protocols/ec/io_state.txt delete mode 100644 assets/files/protocols/ec/set_do.txt create mode 100644 assets/files/protocols/ec/setdo.txt delete mode 100644 test.py delete mode 100644 ui/login.ui delete mode 100644 ui/reset.ui diff --git a/aio.py b/aio.py index 9ceec6a..fff4f0b 100644 --- a/aio.py +++ b/aio.py @@ -14,7 +14,7 @@ from matplotlib.widgets import Slider matplotlib.use('QtAgg') from PySide6.QtCore import Qt, QThread, Signal, QObject, QTimer -from PySide6.QtGui import QTextCursor, QFont, QPixmap, QColor, QBrush +from PySide6.QtGui import QTextCursor, QFont, QPixmap, QColor, QBrush, QIcon from PySide6.QtWidgets import QMessageBox, QCheckBox, QSplashScreen, QApplication, QFrame, QLabel, QTreeWidgetItem, QFileDialog, QHeaderView, QDialog, QVBoxLayout, QPlainTextEdit import codes.common.clibs as clibs @@ -25,12 +25,6 @@ from codes.autotest import do_current, do_brake from codes.durable import factory_test -class MultiWindows: - login_window = None - reset_window = None - main_window = None - - class ContentDialog(QDialog): def __init__(self, content, parent=None): super().__init__(parent) @@ -111,6 +105,7 @@ class MainWindow(main_window.Ui_MainWindow): header.setSectionResizeMode(i, QHeaderView.ResizeMode.ResizeToContents) # ========================= clibs ========================= self.setup_statusbar() + self.setWindowIcon(QIcon(f"{clibs.PREFIX}/media/icon.ico")) # ========================= styleSheet ========================= tws = [self.tw_funcs, self.tw_docs] for tw in tws: @@ -199,6 +194,7 @@ class MainWindow(main_window.Ui_MainWindow): QMessageBox.warning(self, "停止运行", "运行过程中不建议停止运行,可能会损坏文件,如果确实需要停止运行,可以直接关闭窗口!") def prog_reset(self): + self.tw_docs.setCurrentIndex(0) self.pte_output.clear() def file_browser(self): @@ -296,6 +292,7 @@ class MainWindow(main_window.Ui_MainWindow): item = QTreeWidgetItem(self.treew_log) for i in range(self.treew_log.columnCount()): item.setText(i, str(record[i])) + item.setTextAlignment(i, Qt.AlignmentFlag.AlignLeft | Qt.AlignmentFlag.AlignVCenter) self.treew_log.addTopLevelItem(item) color_map = {"DEBUG": QColor(220, 220, 220), "INFO": QColor(144, 238, 144), "WARNING": QColor(255, 240, 210), "ERROR": QColor(255, 220, 220)} brush = QBrush(color_map[record[2].upper()]) @@ -319,11 +316,11 @@ class MainWindow(main_window.Ui_MainWindow): @clibs.db_lock def do_pre(): if self.is_searching is False: - first_id = self.treew_log.topLevelItem(0).text(0) - end = int(first_id)-1 if int(first_id)-1 > 0 else None - start = int(first_id)-100 if int(first_id)-100 > 0 else 0 + first_id = int(self.treew_log.topLevelItem(0).text(0)) + end = first_id-1 if first_id-1 > 0 else None if end is None: return + start = end-100 if end-100 > 0 else 1 clibs.cursor.execute(f"SELECT * FROM logs WHERE id BETWEEN {start} AND {end}") records = clibs.cursor.fetchall() @@ -400,7 +397,7 @@ class MainWindow(main_window.Ui_MainWindow): line_number = self.treew_log.topLevelItemCount() last_id = int(self.treew_log.topLevelItem(line_number-1).text(0)) start = last_id + 1 if last_id % 100 == 0 else last_id - last_id % 100 + 1 - end = int(last_id) + 100 + end = int(start) + 100 if int(start) <= len_records: clibs.cursor.execute(f"select * from logs where id between {start} and {end}") records = clibs.cursor.fetchall() @@ -677,7 +674,7 @@ class MainWindow(main_window.Ui_MainWindow): clibs.search_records = clibs.cursor.fetchall() len_records = len(clibs.search_records) pages_all = len_records // 100 if len_records % 100 == 0 else len_records // 100 + 1 - remainder = len_records % 100 + remainder = len_records % 100 if len_records % 100 != 0 else 100 records = clibs.search_records[-1 * remainder:] return pages_all, records @@ -739,7 +736,7 @@ class MainWindow(main_window.Ui_MainWindow): def md_conn(self): if clibs.status["hmi"] == 0: - QMessageBox.warning(self, "告警", "操作Modbus连接之前,需要先打开HMI连接!") + QMessageBox.warning(self, "告警", "操作 Modbus 连接之前,需要先打开 HMI 连接!") return self.btn_md_conn.setDisabled(True) @@ -751,7 +748,7 @@ class MainWindow(main_window.Ui_MainWindow): def ec_conn(self): if clibs.status["hmi"] == 0: - QMessageBox.warning(self, "告警", "操作外部通信连接之前,需要先打开HMI连接!") + QMessageBox.warning(self, "告警", "操作 EC 连接之前,需要先打开 HMI 连接!") return self.btn_ec_conn.setDisabled(True) @@ -792,7 +789,7 @@ class MainWindow(main_window.Ui_MainWindow): clibs.c_hr.logger("DEBUG", "aio", f"hmi: xService请求发送成功 {cmd_json}") if clibs.status["hmi"] == 0: - QMessageBox.critical(self, "错误", "使用该功能之前,需要先打开HMI连接!") + QMessageBox.critical(self, "错误", "使用该功能之前,需要先打开 HMI 连接!") return if self.pte_hmi_send.toPlainText() == "": return @@ -847,7 +844,7 @@ class MainWindow(main_window.Ui_MainWindow): def ec_send(self): if clibs.status["ec"] == 0: - QMessageBox.critical(self, "错误", "使用该功能之前,需要先打开MD连接!") + QMessageBox.critical(self, "错误", "使用该功能之前,需要先打开 EC 连接!") return if self.pte_ec_send.toPlainText() == "": return @@ -866,7 +863,7 @@ class MainWindow(main_window.Ui_MainWindow): cmd = self.cb_hmi_cmd.currentText() self.pte_hmi_send.clear() self.pte_him_recv.clear() - with open(f"assets/files/protocols/hmi/{cmd}.json", mode="r", encoding="utf-8") as f_hmi: + with open(f"{clibs.PREFIX}/files/protocols/hmi/{cmd}.json", mode="r", encoding="utf-8") as f_hmi: hmi_dict = json.load(f_hmi) t = datetime.datetime.now().strftime("%Y-%m-%dT%H:%M:%S.%f") hmi_dict["id"] = "@".join([cmd, t]) @@ -877,7 +874,7 @@ class MainWindow(main_window.Ui_MainWindow): self.pte_md_send.clear() self.pte_md_recv.clear() self.pte_md_send.appendPlainText(cmd) - with open(f"assets/files/protocols/md/{cmd}.txt", mode="r", encoding="utf-8") as f_md: + with open(f"{clibs.PREFIX}/files/protocols/md/{cmd}.txt", mode="r", encoding="utf-8") as f_md: c_send = f_md.read() self.pte_md_send.appendPlainText(c_send) @@ -885,16 +882,16 @@ class MainWindow(main_window.Ui_MainWindow): cmd = self.cb_ec_cmd.currentText() self.pte_ec_send.clear() self.pte_ec_recv.clear() - with open(f"assets/files/protocols/ec/{cmd}.txt", mode="r", encoding="utf-8") as f_md: + with open(f"{clibs.PREFIX}/files/protocols/ec/{cmd}.txt", mode="r", encoding="utf-8") as f_md: c_send = f_md.read() self.pte_ec_send.appendPlainText(c_send) def check_interval(self): try: interval = float(self.le_durable_interval.text()) - interval = 300 if interval < 300 else int(interval) + interval = clibs.CYCLE if interval < clibs.CYCLE else int(interval) except Exception: - interval = 300 + interval = clibs.CYCLE self.le_durable_interval.setText(str(interval)) def state_detection(self): @@ -934,11 +931,11 @@ class MainWindow(main_window.Ui_MainWindow): event.ignore() def setup_statusbar(self): - with open(f"assets/files/version/local_vers", mode="r", encoding="utf-8") as f_local: + with open(f"{clibs.PREFIX}/files/version/local_vers", mode="r", encoding="utf-8") as f_local: local_vers = f_local.read().strip() l_version, update = local_vers.split("@") vers_info = f" v{l_version} Update@{update}" - with open(f"assets/files/version/server_vers", mode="r", encoding="utf-8") as f_server: + with open(f"{clibs.PREFIX}/files/version/server_vers", mode="r", encoding="utf-8") as f_server: server_vers = f_server.read().strip() update_label = QLabel() @@ -946,11 +943,11 @@ class MainWindow(main_window.Ui_MainWindow): self.statusbar.addWidget(version_label, 0) self.statusbar.addPermanentWidget(update_label, 0) # 添加到右侧 if local_vers == server_vers: - update_label.setText(' 当前是最新版本,继续保持! ') + update_label.setText(f' 当前是最新版本,继续保持! ') elif local_vers > server_vers: pass elif local_vers < server_vers: - update_label.setText(f''' v{server_vers.split('@')[0]}已经发布,尽快更新至最新版本! ''') + update_label.setText(f''' v{server_vers.split('@')[0]}已经发布,尽快更新至最新版本! ''') version_label.setText(f' {vers_info}') update_label.setOpenExternalLinks(True) # 允许超链接在浏览器中打开 @@ -971,7 +968,7 @@ class InitWork(QThread): req = request.Request(url_vers, headers=headers) response = request.urlopen(req, timeout=clibs.INTERVAL * 10) server_vers = response.read().decode("utf-8").strip() - with open("assets/files/version/server_vers", mode="w", encoding="utf-8") as f_server: + with open(f"{clibs.PREFIX}/files/version/server_vers", mode="w", encoding="utf-8") as f_server: f_server.write(server_vers) self.completed.emit("true") except Exception as err: @@ -988,7 +985,7 @@ class SplashScreen(QApplication): super().__init__(argv) self.window = None - pixmap = QPixmap("./assets/media/splash.png") + pixmap = QPixmap(f"{clibs.PREFIX}/media/splash.png") self.splash = QSplashScreen(pixmap, Qt.WindowType.WindowStaysOnTopHint) scaled_pixmap = pixmap.scaled(800, 400, Qt.AspectRatioMode.KeepAspectRatio, Qt.TransformationMode.SmoothTransformation) self.splash.setPixmap(scaled_pixmap) diff --git a/assets/files/projects/autotest.xml b/assets/files/projects/autotest.xml deleted file mode 100644 index 483b9af..0000000 --- a/assets/files/projects/autotest.xml +++ /dev/null @@ -1,842 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/assets/files/projects/configs.xlsx b/assets/files/projects/configs.xlsx index 45205607916dbc90cc432b0e7820c17e562e3086..675b2f69a0c30ab8adb67fe84ee1073e92cb7a9e 100644 GIT binary patch delta 5425 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 S39k@r0U!>nV;|5%nEwM8HehN1 diff --git a/assets/files/protocols/ec/io_state.txt b/assets/files/protocols/ec/io_state.txt new file mode 100644 index 0000000..bf64c35 --- /dev/null +++ b/assets/files/protocols/ec/io_state.txt @@ -0,0 +1 @@ +io_state:DO4_0,DI4_1 \ No newline at end of file diff --git a/assets/files/protocols/ec/set_do.txt b/assets/files/protocols/ec/set_do.txt deleted file mode 100644 index e2e2db5..0000000 --- a/assets/files/protocols/ec/set_do.txt +++ /dev/null @@ -1 +0,0 @@ -set_do:DO4_0,true \ No newline at end of file diff --git a/assets/files/protocols/ec/setdo.txt b/assets/files/protocols/ec/setdo.txt new file mode 100644 index 0000000..bda6b77 --- /dev/null +++ b/assets/files/protocols/ec/setdo.txt @@ -0,0 +1 @@ +setdo:DO4_0,true \ No newline at end of file diff --git a/assets/files/version/file_version_info.txt b/assets/files/version/file_version_info.txt index aa27a6e..612df88 100644 --- a/assets/files/version/file_version_info.txt +++ b/assets/files/version/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, 3, 1, 6), - prodvers=(0, 3, 1, 6), + filevers=(0, 4, 0, 0), + prodvers=(0, 4, 0, 0), # 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.3.1.6 (2025-03-21)'), + StringStruct('FileVersion', '0.4.0.0 (2025-03-28)'), StringStruct('InternalName', 'AIO.exe'), StringStruct('LegalCopyright', '© 2024-2025 Manford Fan'), StringStruct('OriginalFilename', 'AIO.exe'), StringStruct('ProductName', 'AIO'), - StringStruct('ProductVersion', '0.3.1.6 (2025-03-21)')]) + StringStruct('ProductVersion', '0.4.0.0 (2025-03-28)')]) ]), VarFileInfo([VarStruct('Translation', [1033, 1200])]) ] diff --git a/assets/files/version/local_vers b/assets/files/version/local_vers index 245a459..ec3409f 100644 --- a/assets/files/version/local_vers +++ b/assets/files/version/local_vers @@ -1 +1 @@ -0.3.1.6@03/21/2025 \ No newline at end of file +0.4.0.0@03/27/2025 \ No newline at end of file diff --git a/assets/files/version/server_vers b/assets/files/version/server_vers index bd78cb6..ec3409f 100644 --- a/assets/files/version/server_vers +++ b/assets/files/version/server_vers @@ -1 +1 @@ -0.3.1.7@03/24/2025 \ No newline at end of file +0.4.0.0@03/27/2025 \ No newline at end of file diff --git a/codes/autotest/do_brake.py b/codes/autotest/do_brake.py index eeecf6d..4f3f8d0 100644 --- a/codes/autotest/do_brake.py +++ b/codes/autotest/do_brake.py @@ -159,13 +159,12 @@ class DoBrakeTest(QThread): prj_name = ".".join(prj_file.split("/")[-1].split(".")[:-1]) wb = openpyxl.load_workbook(config_file, read_only=True) ws = wb["Target"] - write_diagnosis = float(ws.cell(row=2, column=2).value) - get_init_speed = float(ws.cell(row=3, column=2).value) - single_brake = str(ws.cell(row=4, column=2).value) - pon = ws.cell(row=5, column=2).value - io_name = ws.cell(row=6, column=2).value.upper().strip() + get_init_speed = float(ws.cell(row=2, column=2).value) + single_brake = str(ws.cell(row=3, column=2).value).strip() + pon = ws.cell(row=4, column=2).value + io_name = ws.cell(row=5, column=2).value.upper().strip() wb.close() - msg = f"基本参数配置:write_diagnosis(废弃) = {write_diagnosis}, get_init_speed = {get_init_speed}, single_brake = {single_brake}, pon = {pon}" + msg = f"基本参数配置:get_init_speed = {get_init_speed}, single_brake = {single_brake}, pon = {pon}, IO = {io_name}" self.logger("INFO", "do_brake", msg) if pon == "positive": @@ -195,7 +194,7 @@ class DoBrakeTest(QThread): continue clibs.c_md.write_axis(axis) - self.logger("INFO", "brake-processing", "-" * 90, "purple", flag="signal") + self.logger("INFO", "brake", "-" * 90, "purple", flag="signal") speed_max = 0 for rounds in range(1, 4): count += 1 @@ -309,9 +308,9 @@ class DoBrakeTest(QThread): if clibs.c_md.w_program_state == 1: break else: - time.sleep(5) + time.sleep(2) if time.time() - t_start > 60: - self.logger("ERROR", "do_brake","60s 内程序未能正常执行,需检查...", "red", "RlProgramStartTimeout") + self.logger("ERROR", "do_brake", "60s 内程序未能正常执行,需检查...", "red", "RlProgramStartTimeout") for i in range(16): if clibs.c_md.read_ready_to_go() == 1: @@ -360,7 +359,7 @@ class DoBrakeTest(QThread): break else: - time.sleep(50) # why? + time.sleep(clibs.INTERVAL*2) self.change_curve_state(False) msg = f"
{self.tool.removeprefix('tool')}%负载的制动性能测试执行完毕,如需采集其他负载,须切换负载类型,并更换其他负载,重新执行" self.logger("INFO", "do_brake", msg, "green") diff --git a/codes/common/clibs.py b/codes/common/clibs.py index 6ef9471..fc690fe 100644 --- a/codes/common/clibs.py +++ b/codes/common/clibs.py @@ -81,23 +81,18 @@ def handle_exception(func): return wrapper -log_path = f"assets/logs" +PREFIX = "resources/assets" # for pyinstaller +# PREFIX = "assets" # for local testing +log_path = f"{PREFIX}/logs" lock = threading.Lock() running = [0, 0, 0, 0, 0, 0, 0] # 制动数据/转矩数据/激光数据/精度数据/制动自动化/转矩自动化/耐久数据采集 functions = ["制动数据处理", "转矩数据处理", "激光数据处理", "精度数据处理", "制动自动化测试", "转矩自动化测试", "耐久数据采集"] levels = ["DEBUG", "INFO", "WARNING", "ERROR"] ip_addr, ssh_port, socket_port, xService_port, external_port, modbus_port, upgrade_port = "", 22, 5050, 6666, 8080, 502, 4567 username, password = "luoshi", "luoshi2019" -INTERVAL, RADIAN, MAX_FRAME_SIZE, MAX_LOG_NUMBER = 1, 57.3, 1024, 10 +INTERVAL, RADIAN, MAX_FRAME_SIZE, MAX_LOG_NUMBER, CYCLE = 1, 57.3, 1024, 10, 300 c_md, c_hr, c_ec, c_pd, conn, cursor, search_records = None, None, None, None, None, None, None status = {"mysql": 0, "hmi": 0, "md": 0, "ec": 0} c_joint_vel, c_servo_trq, c_sensor_trq, c_estimate_trans_trq, c_safety_estop = 1, 2, 3, 4, 3 # 各个指标所在列 init_logdb() - -# ============== ↓↓↓DEBUG CODE↓↓↓ ============== -for i in range(100): - logger("DEBUG", "clibs", 'running123', flag="cursor") - logger("INFO", "aio", 'running234', flag="cursor") - logger("WARNING", "openapi", 'running345', flag="cursor") - logger("ERROR", "brake", 'running456', flag="cursor") diff --git a/codes/common/openapi.py b/codes/common/openapi.py index ff5259a..c6003b9 100644 --- a/codes/common/openapi.py +++ b/codes/common/openapi.py @@ -745,7 +745,7 @@ class HmiRequest(QThread): def execution(self, command, **kwargs): req = None try: - with open(f"assets/files/protocols/hmi/{command}.json", encoding="utf-8", mode="r") as f_json: + with open(f"{clibs.PREFIX}/files/protocols/hmi/{command}.json", encoding="utf-8", mode="r") as f_json: req = json.load(f_json) t = datetime.now().strftime("%Y-%m-%dT%H:%M:%S.%f") req["id"] = f"{command}@{t}" @@ -768,12 +768,14 @@ class HmiRequest(QThread): cmd = json.dumps(req, separators=(",", ":")) try: self.c.send(self.package(cmd)) + time.sleep(clibs.INTERVAL/4) self.logger("DEBUG", "openapi", f"hmi: 老协议请求发送成功 {cmd}") except Exception as err: self.logger("ERROR", "openapi", f"hmi: 老协议请求发送失败 {cmd},报错信息 {err}", "red", "CommandSendFailed") elif flag == 1: try: self.c_xs.send(self.package_xs(req)) + time.sleep(clibs.INTERVAL/4) self.logger("DEBUG", "openapi", f"hmi: xService请求发送成功 {req}") except Exception as Err: self.logger("ERROR", "openapi", f"hr: xService请求发送失败 {req} 报错信息 {Err}", "red", "CommandSendFailed") @@ -1804,9 +1806,9 @@ class ExternalCommunication(QThread): if clibs.status["ec"]: try: self.c.close() - self.logger("INFO", "openapi", f"ec: 关闭 EC 连接成功", "green") + self.logger("INFO", "openapi", f"ec: 关闭外部通信连接成功", "green") except Exception as err: - self.logger("ERROR", "openapi", f"ec: 关闭 EC 连接失败:{err}", "red", "EcCloseFailed") + self.logger("ERROR", "openapi", f"ec: 关闭外部通信连接失败:{err}", "red", "EcCloseFailed") def s_string(self, directive): order = "".join([directive, self.suffix]) @@ -2057,7 +2059,7 @@ class ExternalCommunication(QThread): self.s_string(directive) time.sleep(clibs.INTERVAL) result = self.r_string(directive).strip() - self.logger("INFO", "openapi", f"ec: 执行{description}指令是 {directive},返回值为 {result}{more_desc}") + self.logger("DEBUG", "openapi", f"ec: 执行{description}指令是 {directive},返回值为 {result}{more_desc}") return result @@ -2167,9 +2169,9 @@ class RobotInit(object): interactive_data = f"/home/luoshi/bin/controller/interactive_data/{robot_type}" config_files = [ - f"assets/files/projects/fieldbus_device.json", - f"assets/files/projects/registers.json", - f"assets/files/projects/registers.xml" + f"{clibs.PREFIX}/files/projects/fieldbus_device.json", + f"{clibs.PREFIX}/files/projects/registers.json", + f"{clibs.PREFIX}/files/projects/registers.xml" ] for config_file in config_files: filename = config_file.split("/")[-1] @@ -2197,10 +2199,10 @@ class RobotInit(object): os.remove(io_device_file_local_tmp) except: ... - clibs.c_hr.execution("io_device.load_cfg") - clibs.c_hr.execution("modbus.load_cfg") clibs.c_hr.execution("fieldbus_device.load_cfg") clibs.c_hr.execution("fieldbus_device.set_params", device_name="autotest", enable=True) + clibs.c_hr.execution("io_device.load_cfg") + clibs.c_hr.execution("modbus.load_cfg") def robot_init(self): pd = PreDos(clibs.ip_addr, clibs.ssh_port, clibs.username, clibs.password) diff --git a/codes/durable/factory_test.py b/codes/durable/factory_test.py index 8d7f461..7b0e435 100644 --- a/codes/durable/factory_test.py +++ b/codes/durable/factory_test.py @@ -19,7 +19,7 @@ class DoFactoryTest(QThread): def __init__(self, dir_path, interval, procs, /): super().__init__() self.dir_path = dir_path - self.interval = int(interval) if interval != "" else 300 + self.interval = int(interval) if interval != "" else clibs.CYCLE self.procs = procs self.idx = 6 self.curves = [] @@ -99,6 +99,7 @@ class DoFactoryTest(QThread): self.change_curve_state(False) clibs.c_md.r_soft_estop(0) clibs.c_md.r_soft_estop(1) + clibs.c_md.r_reset_estop() clibs.c_md.r_clear_alarm() clibs.c_md.write_act(False) time.sleep(1) # 让曲线彻底关闭 diff --git a/codes/ui/main_window.py b/codes/ui/main_window.py index b591b20..7b49c7b 100644 --- a/codes/ui/main_window.py +++ b/codes/ui/main_window.py @@ -38,9 +38,6 @@ class Ui_MainWindow(QMainWindow): font.setFamilies([u"Consolas"]) font.setPointSize(14) MainWindow.setFont(font) - icon = QIcon() - icon.addFile(u"../assets/media/icon.ico", QSize(), QIcon.Mode.Normal, QIcon.State.Off) - MainWindow.setWindowIcon(icon) MainWindow.setStyleSheet(u"background-color: rgb(233, 233, 233);") MainWindow.setDocumentMode(False) self.centralwidget = QWidget(MainWindow) @@ -290,7 +287,7 @@ class Ui_MainWindow(QMainWindow): self.sa_durable.setWidgetResizable(True) self.scrollAreaWidgetContents = QWidget() self.scrollAreaWidgetContents.setObjectName(u"scrollAreaWidgetContents") - self.scrollAreaWidgetContents.setGeometry(QRect(0, 0, 212, 78)) + self.scrollAreaWidgetContents.setGeometry(QRect(0, 0, 158, 78)) self.horizontalLayout_9 = QHBoxLayout(self.scrollAreaWidgetContents) self.horizontalLayout_9.setObjectName(u"horizontalLayout_9") self.verticalLayout_5 = QVBoxLayout() @@ -652,6 +649,7 @@ class Ui_MainWindow(QMainWindow): self.cb_ec_cmd.addItem("") self.cb_ec_cmd.addItem("") self.cb_ec_cmd.addItem("") + self.cb_ec_cmd.addItem("") self.cb_ec_cmd.setObjectName(u"cb_ec_cmd") self.cb_ec_cmd.setMinimumSize(QSize(240, 0)) self.cb_ec_cmd.setFont(font4) @@ -881,7 +879,7 @@ class Ui_MainWindow(QMainWindow): self.label.setText(QCoreApplication.translate("MainWindow", u"Rokae AIO", None)) self.btn_start.setText(QCoreApplication.translate("MainWindow", u"\u5f00\u59cb\u6267\u884c", None)) self.btn_stop.setText(QCoreApplication.translate("MainWindow", u"\u505c\u6b62\u6267\u884c", None)) - self.btn_reset.setText(QCoreApplication.translate("MainWindow", u"\u72b6\u6001\u91cd\u7f6e", None)) + self.btn_reset.setText(QCoreApplication.translate("MainWindow", u"\u8f93\u51fa\u91cd\u7f6e", None)) self.cb_data_func.setItemText(0, QCoreApplication.translate("MainWindow", u"\u5236\u52a8", None)) self.cb_data_func.setItemText(1, QCoreApplication.translate("MainWindow", u"\u8f6c\u77e9", None)) self.cb_data_func.setItemText(2, QCoreApplication.translate("MainWindow", u"\u6fc0\u5149", None)) @@ -951,12 +949,13 @@ class Ui_MainWindow(QMainWindow): self.label_18.setText("") self.cb_ec_cmd.setItemText(0, QCoreApplication.translate("MainWindow", u"motor_on", None)) self.cb_ec_cmd.setItemText(1, QCoreApplication.translate("MainWindow", u"motor_off", None)) - self.cb_ec_cmd.setItemText(2, QCoreApplication.translate("MainWindow", u"set_do", None)) + self.cb_ec_cmd.setItemText(2, QCoreApplication.translate("MainWindow", u"setdo", None)) self.cb_ec_cmd.setItemText(3, QCoreApplication.translate("MainWindow", u"switch_mode_auto", None)) self.cb_ec_cmd.setItemText(4, QCoreApplication.translate("MainWindow", u"switch_mode_manual", None)) self.cb_ec_cmd.setItemText(5, QCoreApplication.translate("MainWindow", u"operating_mode", None)) - self.cb_ec_cmd.setItemText(6, QCoreApplication.translate("MainWindow", u"motor_on_state", None)) - self.cb_ec_cmd.setItemText(7, QCoreApplication.translate("MainWindow", u"robot_running_state", None)) + self.cb_ec_cmd.setItemText(6, QCoreApplication.translate("MainWindow", u"io_state", None)) + self.cb_ec_cmd.setItemText(7, QCoreApplication.translate("MainWindow", u"motor_on_state", None)) + self.cb_ec_cmd.setItemText(8, QCoreApplication.translate("MainWindow", u"robot_running_state", None)) self.btn_ec_send.setText(QCoreApplication.translate("MainWindow", u"\u53d1\u9001", None)) self.pushButton.setText(QCoreApplication.translate("MainWindow", u"HMI", None)) diff --git a/readme.md b/readme.md index 689079b..24e49f8 100644 --- a/readme.md +++ b/readme.md @@ -103,7 +103,7 @@ 打包时,只需要修改 clibs.py 中的 PREFIX 即可,调试时再修改回来,第三方库依赖详见 `assets/files/version/requirements.txt` 文件 ``` -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/common/clibs.py -p ../code/commom/openapi.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/automatic_test/do_current.py -p ../code/automatic_test/do_brake.py -p ../code/durable_docs/factory_test.py -p ../code/durable_docs/create_plot.py --exclude-module=scipy +pyinstaller --noconfirm --onedir --windowed --optimize 2 --add-data "../assets:assets" --contents-directory=resources --clean --upx-dir "D:/Syncthing/common/A_Program/upx-4.2.4-win64/" --name=aio --version-file=../assets/files/version/file_version_info.txt --icon=../assets/media/icon.ico --exclude-module=scipy ../aio.py ``` ### 2. tabview 组件字体修改 diff --git a/test.py b/test.py deleted file mode 100644 index f701f83..0000000 --- a/test.py +++ /dev/null @@ -1,119 +0,0 @@ -def test(flag: int, **kwargs): - print(f"flag = {flag}") - print(f"kwargs = {kwargs}") - -test(11, a=1,b="b") - -import time - -# import common.openapi as openapi -# -# hr = openapi.HmiRequest("10.2.21.252", 5050, 6666) -# for _ in range(3): -# hr.execution("controller.heart") -# time.sleep(1) -# -# hr.close() - - - -# import pymysql -# -# conn = pymysql.connect(host='10.2.20.216', user='root', password='Rokae_123457', port=13306, charset='utf8') -# cursor = conn.cursor() -# cursor.execute("SET autocommit = 1;") -# cursor.execute("use fanmingfu;") -# cursor.execute("insert into 20250315153551_log (module, level, content) values (%s, %s, %s)", ("aioaaaaaa", "debug", "testing information")) -# logger("ERROR", "clibs", f"数据文件夹{dir_path}不存在,请确认后重试......\n", signal, "red", "PathNotExistError", idx) - -# level = "ERROR" -# module = "clibs" -# content = "{'data': {'name': 'xCore'}, 'id': 'controller.heart-1742374255.8898985'}" -# tb_name = "20250319162718_log" -# cursor.execute(f"INSERT INTO {tb_name} (level, module, content) VALUES (%s, %s, %s)", (level, module, content)) - -# conn.commit() -# ============================================ -# def tttt(flag, signal, cursor, **data): -# if flag == "signal": -# print(f"data = {data['signals']}") -# elif flag == "cursor": -# print(f"data = {data['cursors']}") -# elif flag == "both": -# print(f"data = {data}") -# print(f"data = {data['signals']}") -# print(f"data = {data['cursors']}") -# -# -# tttt("both", 1, 1, signals=123, cursors=456) - -# ============================================ - -# import sys -# from time import sleep -# from PySide6.QtCore import * -# from PySide6.QtGui import * -# from PySide6.QtWidgets import * -# -# -# class MyWindow(QMainWindow): -# range_number = Signal(int) -# -# def __init__(self) -> None: -# super().__init__() -# self.setWindowTitle("QThread学习") -# self.resize(800, 600) -# self.setup_ui() -# self.setup_thread() -# -# def setup_ui(self): -# self.mylistwidget = QListWidget(self) -# self.mylistwidget.resize(500, 500) -# self.mylistwidget.move(20, 20) -# -# self.additem_button = QPushButton(self) -# self.additem_button.resize(150, 30) -# self.additem_button.setText("填充QListWidget") -# self.additem_button.move(530, 20) -# -# def setup_thread(self): -# self.thread1 = QThread(self) # 创建一个线程 -# self.range_thread = WorkThread() # 实例化线程类 -# self.range_thread.moveToThread(self.thread1) # 将类移动到线程中运行 -# # 线程数据传回信号,用add_item函数处理 -# self.range_thread.range_requested.connect(self.add_item) -# self.additem_button.clicked.connect(self.start_thread) -# self.range_number.connect(self.range_thread.range_proc) -# # self.additem_button.clicked.connect(self.range_thread.range_proc) # 连接到线程类的函数 -# -# def start_thread(self): -# self.thread1.start() -# range_number = 30 -# self.range_number.emit(range_number) # 发射信号让线程接收需要range多少 -# -# def add_item(self, requested_number): # 线程传回参数 -# text = f"第{requested_number}项————Item" -# item = QListWidgetItem() -# item.setIcon(QPixmap()) -# item.setText(text) -# self.mylistwidget.addItem(item) -# -# -# class WorkThread(QObject): -# range_requested = Signal(int) # 括号里是传出的参数的类型 -# -# def __init__(self): -# super().__init__() -# -# def range_proc(self, number): # number即为从主线程接收的参数 -# print(number) -# for i in range(number): -# self.range_requested.emit(i) # 发射信号 -# sleep(0.5) -# -# -# if __name__ == "__main__": -# app = QApplication(sys.argv) -# window = MyWindow() -# window.show() -# app.exec() \ No newline at end of file diff --git a/ui/login.ui b/ui/login.ui deleted file mode 100644 index 2f976bc..0000000 --- a/ui/login.ui +++ /dev/null @@ -1,249 +0,0 @@ - - - Form - - - Qt::WindowModality::WindowModal - - - - 0 - 0 - 500 - 270 - - - - - 0 - 0 - - - - - 500 - 270 - - - - - 500 - 270 - - - - - Consolas - 14 - - - - 登录 - - - - ../assets/media/icon.ico../assets/media/icon.ico - - - - - 41 - 41 - 411 - 211 - - - - - 2 - - - - - 2 - - - - - - Consolas - 14 - - - - 用户名 - - - - - - - - Consolas - 14 - - - - - - - - - - 2 - - - - - - Consolas - 14 - - - - 密 码 - - - - - - - - Consolas - 14 - - - - QLineEdit::EchoMode::Password - - - - - - - - - - 0 - 0 - - - - - Consolas - 12 - - - - - - - - - - - 2 - - - - - - Consolas - 14 - - - - 登录 - - - - - - - - Consolas - 14 - - - - 重置 - - - - - - - - - - - - btn_login - clicked() - Form - user_login() - - - 85 - 130 - - - 34 - 112 - - - - - le_password - returnPressed() - Form - user_login() - - - 178 - 82 - - - 11 - 70 - - - - - le_username - returnPressed() - Form - user_login() - - - 169 - 42 - - - 10 - 33 - - - - - btn_reset - clicked() - Form - reset_password() - - - 311 - 138 - - - 367 - 113 - - - - - - user_login() - reset_password() - - diff --git a/ui/main.ui b/ui/main.ui index 5c4ed7d..5def571 100644 --- a/ui/main.ui +++ b/ui/main.ui @@ -34,10 +34,6 @@ Rokae AIO - - - ../assets/media/icon.ico../assets/media/icon.ico - background-color: rgb(233, 233, 233); @@ -184,7 +180,7 @@ - 状态重置 + 输出重置 false @@ -587,7 +583,7 @@ 0 0 - 212 + 158 78 @@ -1263,7 +1259,7 @@ - set_do + setdo @@ -1281,6 +1277,11 @@ operating_mode + + + io_state + + motor_on_state diff --git a/ui/reset.ui b/ui/reset.ui deleted file mode 100644 index 2f34e7d..0000000 --- a/ui/reset.ui +++ /dev/null @@ -1,271 +0,0 @@ - - - Form - - - Qt::WindowModality::WindowModal - - - - 0 - 0 - 500 - 270 - - - - - 0 - 0 - - - - - 500 - 270 - - - - - 500 - 270 - - - - - Consolas - 14 - - - - 重置密码 - - - - ../assets/media/icon.ico../assets/media/icon.ico - - - - - 40 - 27 - 411 - 211 - - - - - - - - - - Consolas - 14 - - - - 用户名 - - - - - - - - Consolas - 14 - - - - - - - - - - - - - Consolas - 14 - - - - 旧密码 - - - - - - - - Consolas - 14 - - - - QLineEdit::EchoMode::Password - - - - - - - - - - - - Consolas - 14 - - - - 新密码 - - - - - - - - Consolas - 14 - - - - QLineEdit::EchoMode::Password - - - - - - - - - - - - Consolas - 14 - - - - 确 认 - - - - - - - - Consolas - 14 - - - - QLineEdit::EchoMode::Password - - - - - - - - - - 0 - 0 - - - - - Consolas - 12 - - - - - - - - - - - - - - Consolas - 14 - - - - 确定 - - - - - - - - Consolas - 14 - - - - 取消 - - - - - - - - - - le_username - le_old_password - le_new_password_1 - le_new_password_2 - - - - - btn_reset - clicked() - Form - reset_password() - - - 85 - 175 - - - 22 - 149 - - - - - btn_cancel - clicked() - Form - reset_cancel() - - - 295 - 177 - - - 386 - 148 - - - - - - reset_password() - reset_cancel() - -