界面优化,监控逻辑优化
This commit is contained in:
@ -1,3 +1,4 @@
|
||||
import threading
|
||||
import time
|
||||
import os
|
||||
import paramiko
|
||||
@ -9,27 +10,19 @@ from codes.common import clibs
|
||||
|
||||
|
||||
class DoBrakeTest(QThread):
|
||||
output = Signal(str, str)
|
||||
|
||||
def __init__(self, dir_path, tool, /):
|
||||
super().__init__()
|
||||
self.dir_path = dir_path
|
||||
self.tool = tool
|
||||
self.idx = 4
|
||||
|
||||
def logger(self, level, module, content, color="black", error="", flag="both"):
|
||||
flag = "cursor" if level.upper() == "DEBUG" else "both"
|
||||
clibs.logger(level, module, content, color, flag, signal=self.output)
|
||||
if level.upper() == "ERROR":
|
||||
raise Exception(f"{error} | {content}")
|
||||
self.logger = clibs.logger
|
||||
|
||||
def initialization(self, data_dirs, data_files):
|
||||
@clibs.handle_exception
|
||||
def check_files():
|
||||
msg = "初始路径下不允许有文件夹,只能存在如下五个文件,且文件为关闭状态,确认后重新运行!<br>"
|
||||
msg += "1. configs.xlsx<br>2. reach33/reach66/reach100_xxxx.xlsx<br>3. xxxx.zip"
|
||||
if len(data_dirs) != 0 or len(data_files) != 5:
|
||||
self.logger("ERROR", "do_brake", msg, "red", "InitFileError")
|
||||
self.logger("ERROR", "do_brake", msg, "red")
|
||||
|
||||
config_file, reach33_file, reach66_file, reach100_file, prj_file, result_dirs = None, None, None, None, None, []
|
||||
for data_file in data_files:
|
||||
@ -45,7 +38,7 @@ class DoBrakeTest(QThread):
|
||||
elif filename.endswith(".zip"):
|
||||
prj_file = data_file
|
||||
else:
|
||||
self.logger("ERROR", "do_brake", msg, "red", "InitFileError")
|
||||
self.logger("ERROR", "do_brake", msg, "red")
|
||||
|
||||
if config_file and reach33_file and reach66_file and reach100_file and prj_file:
|
||||
os.mkdir(f"{self.dir_path}/j1")
|
||||
@ -64,9 +57,8 @@ class DoBrakeTest(QThread):
|
||||
|
||||
return config_file, prj_file, result_dirs
|
||||
else:
|
||||
self.logger("ERROR", "do_brake", msg, "red", "InitFileError")
|
||||
self.logger("ERROR", "do_brake", msg, "red")
|
||||
|
||||
@clibs.handle_exception
|
||||
def get_configs():
|
||||
robot_type = None
|
||||
msg_id = clibs.c_hr.execution("controller.get_params")
|
||||
@ -82,7 +74,7 @@ class DoBrakeTest(QThread):
|
||||
with open(local_file, mode="r", encoding="utf-8") as f_config:
|
||||
configs = json.load(f_config)
|
||||
except Exception as Err:
|
||||
self.logger("ERROR", "do_brake", f"无法打开 {local_file}<br>{Err}", "red", "OpenFileError")
|
||||
self.logger("ERROR", "do_brake", f"无法打开 {local_file}<br>{Err}", "red")
|
||||
|
||||
# 最大角速度,额定电流,减速比,额定转速
|
||||
version = configs["VERSION"]
|
||||
@ -97,7 +89,6 @@ class DoBrakeTest(QThread):
|
||||
self.logger("INFO", "do_brake", "数据目录合规性检查结束,未发现问题......", "green")
|
||||
return _config_file, _prj_file, _result_dirs, _avs
|
||||
|
||||
@clibs.handle_exception
|
||||
def gen_result_file(self, axis, end_time, reach, load, speed, speed_max, rounds):
|
||||
d_vel, d_trq, d_stop, threshold = [], [], [], 0.95
|
||||
s_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(end_time-clibs.INTERVAL*12))
|
||||
@ -133,7 +124,7 @@ class DoBrakeTest(QThread):
|
||||
return "retry"
|
||||
else:
|
||||
clibs.count = 0
|
||||
self.logger("WARNING", "do_brake",f"尝试三次后仍无法获取正确数据,本次数据无效,继续执行...", "red")
|
||||
self.logger("WARNING", "do_brake", f"尝试三次后仍无法获取正确数据,本次数据无效,继续执行...", "red")
|
||||
|
||||
df1 = pandas.DataFrame.from_dict({"hw_joint_vel_feedback": d_vel})
|
||||
df2 = pandas.DataFrame.from_dict({"device_servo_trq_feedback": d_trq})
|
||||
@ -143,7 +134,6 @@ class DoBrakeTest(QThread):
|
||||
df.to_csv(filename, sep="\t", index=False)
|
||||
|
||||
@staticmethod
|
||||
@clibs.handle_exception
|
||||
def change_curve_state(stat):
|
||||
if not stat:
|
||||
display_pdo_params = []
|
||||
@ -153,7 +143,6 @@ class DoBrakeTest(QThread):
|
||||
clibs.c_hr.execution("diagnosis.open", open=stat, display_open=stat)
|
||||
clibs.c_hr.execution("diagnosis.set_params", display_pdo_params=display_pdo_params)
|
||||
|
||||
@clibs.handle_exception
|
||||
def run_rl(self, config_file, prj_file, result_dirs, avs):
|
||||
count, total, speed_target = 0, 63, 0
|
||||
prj_name = ".".join(prj_file.split("/")[-1].split(".")[:-1])
|
||||
@ -172,7 +161,7 @@ class DoBrakeTest(QThread):
|
||||
elif pon == "negative":
|
||||
clibs.c_md.write_pon(0)
|
||||
else:
|
||||
self.logger("ERROR", "do_brake", "configs.xlsx 中 Target 页面 B5 单元格填写不正确,检查后重新运行...", "red", "DirectionError")
|
||||
self.logger("ERROR", "do_brake", "configs.xlsx 中 Target 页面 B5 单元格填写不正确,检查后重新运行...", "red")
|
||||
|
||||
self.change_curve_state(True)
|
||||
for condition in result_dirs:
|
||||
@ -194,7 +183,7 @@ class DoBrakeTest(QThread):
|
||||
continue
|
||||
|
||||
clibs.c_md.write_axis(axis)
|
||||
self.logger("INFO", "brake", "-" * 90, "purple", flag="signal")
|
||||
self.logger("INFO", "brake", "-" * 90, "purple")
|
||||
speed_max = 0
|
||||
for rounds in range(1, 4):
|
||||
count += 1
|
||||
@ -207,7 +196,7 @@ class DoBrakeTest(QThread):
|
||||
# 1. 触发软急停,并解除,目的是让可能正在运行着的机器停下来,切手动模式并下电
|
||||
clibs.c_md.r_soft_estop(0)
|
||||
clibs.c_md.r_soft_estop(1)
|
||||
clibs.c_ec.setdo_value(io_name, "true")
|
||||
clibs.c_ec.sr_string(f"setdo:{io_name},true")
|
||||
clibs.c_md.r_reset_estop()
|
||||
clibs.c_md.r_clear_alarm()
|
||||
clibs.c_md.write_act(0)
|
||||
@ -251,7 +240,7 @@ class DoBrakeTest(QThread):
|
||||
else:
|
||||
time.sleep(1)
|
||||
if (time.time() - t_start) > 15:
|
||||
self.logger("ERROR", "do_brake", "15s 内未收到机器人的运行信号,需要确认 RL 程序编写正确并正常执行...", "red", "ReadySignalTimeoutError")
|
||||
self.logger("ERROR", "do_brake", "15s 内未收到机器人的运行信号,需要确认 RL 程序编写正确并正常执行...", "red")
|
||||
# 4. 找出最大速度,传递给RL程序,最后清除相关记录
|
||||
time.sleep(5) # 消除前 5s 的不稳定数据
|
||||
start_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time()))
|
||||
@ -261,7 +250,6 @@ class DoBrakeTest(QThread):
|
||||
|
||||
# 找出最大速度
|
||||
@clibs.db_lock
|
||||
@clibs.handle_exception
|
||||
def get_speed_max():
|
||||
_speed_max = 0
|
||||
clibs.cursor.execute(f"SELECT content FROM logs WHERE timestamp BETWEEN '{start_time}' AND '{end_time}' AND content LIKE '%diagnosis.result%' ORDER BY id ASC")
|
||||
@ -292,7 +280,7 @@ class DoBrakeTest(QThread):
|
||||
break
|
||||
|
||||
while 1:
|
||||
clibs.c_ec.setdo_value(io_name, "true")
|
||||
clibs.c_ec.sr_string(f"setdo:{io_name},true")
|
||||
clibs.c_md.r_reset_estop()
|
||||
clibs.c_md.r_clear_alarm()
|
||||
clibs.c_md.write_act(0)
|
||||
@ -310,7 +298,7 @@ class DoBrakeTest(QThread):
|
||||
else:
|
||||
time.sleep(2)
|
||||
if time.time() - t_start > 60:
|
||||
self.logger("ERROR", "do_brake", "60s 内程序未能正常执行,需检查...", "red", "RlProgramStartTimeout")
|
||||
self.logger("ERROR", "do_brake", "60s 内程序未能正常执行,需检查...", "red")
|
||||
|
||||
for i in range(16):
|
||||
if clibs.c_md.read_ready_to_go() == 1:
|
||||
@ -319,15 +307,14 @@ class DoBrakeTest(QThread):
|
||||
else:
|
||||
time.sleep(1)
|
||||
else:
|
||||
self.logger("ERROR", "do_brake", "16s 内未收到机器人的运行信号,需要确认 RL 程序配置正确并正常执行...", "red", "ReadySignalTimeoutError")
|
||||
self.logger("ERROR", "do_brake", "16s 内未收到机器人的运行信号,需要确认 RL 程序配置正确并正常执行...", "red")
|
||||
|
||||
@clibs.handle_exception
|
||||
def exec_brake():
|
||||
flag, start, data, record = True, time.time(), None, None
|
||||
while flag:
|
||||
time.sleep(0.05)
|
||||
if time.time() - start > 20:
|
||||
self.logger("ERROR", "do_brake", "20s 内未触发急停,需排查......", "red", "BrakeTimeoutError")
|
||||
self.logger("ERROR", "do_brake", "20s 内未触发急停,需排查......", "red")
|
||||
|
||||
try:
|
||||
clibs.lock.acquire(True)
|
||||
@ -344,7 +331,7 @@ class DoBrakeTest(QThread):
|
||||
speed_moment = clibs.RADIAN * sum(item["value"]) / len(item["value"])
|
||||
if abs(speed_moment) > speed_max - 2:
|
||||
if (pon == "positive" and speed_moment > 0) or (pon == "negative" and speed_moment < 0):
|
||||
clibs.c_ec.setdo_value(io_name, "false")
|
||||
clibs.c_ec.sr_string(f"setdo:{io_name},false")
|
||||
time.sleep(clibs.INTERVAL*2) # wait speed goes down to 0
|
||||
flag = False
|
||||
break
|
||||
@ -364,14 +351,16 @@ class DoBrakeTest(QThread):
|
||||
msg = f"<br>{self.tool.removeprefix('tool')}%负载的制动性能测试执行完毕,如需采集其他负载,须切换负载类型,并更换其他负载,重新执行"
|
||||
self.logger("INFO", "do_brake", msg, "green")
|
||||
|
||||
@clibs.handle_exception
|
||||
def processing(self):
|
||||
time_start = time.time()
|
||||
clibs.running[self.idx] = 1
|
||||
if clibs.status["hmi"] != 1 or clibs.status["md"] != 1 or clibs.status["ec"] != 1:
|
||||
self.logger("ERROR", "do_brake", "processing: 需要在网络设置中连接HMI,Modbus通信以及外部通信!", "red", "NetworkError")
|
||||
self.logger("ERROR", "do_brake", "processing: 需要在网络设置中连接HMI,Modbus通信以及外部通信!", "red")
|
||||
t = threading.Thread(target=clibs.running_detection, args=(self.idx, ))
|
||||
t.daemon = True
|
||||
t.start()
|
||||
|
||||
data_dirs, data_files = clibs.traversal_files(self.dir_path, self.output)
|
||||
data_dirs, data_files = clibs.traversal_files(self.dir_path)
|
||||
config_file, prj_file, result_dirs, avs = self.initialization(data_dirs, data_files)
|
||||
clibs.c_pd.push_prj_to_server(prj_file)
|
||||
self.run_rl(config_file, prj_file, result_dirs, avs)
|
||||
|
@ -8,27 +8,19 @@ from codes.common import clibs
|
||||
|
||||
|
||||
class DoCurrentTest(QThread):
|
||||
output = Signal(str, str)
|
||||
|
||||
def __init__(self, dir_path, tool, /):
|
||||
super().__init__()
|
||||
self.dir_path = dir_path
|
||||
self.tool = tool
|
||||
self.idx = 5
|
||||
|
||||
def logger(self, level, module, content, color="black", error="", flag="both"):
|
||||
flag = "cursor" if level.upper() == "DEBUG" else "both"
|
||||
clibs.logger(level, module, content, color, flag, signal=self.output)
|
||||
if level.upper() == "ERROR":
|
||||
raise Exception(f"{error} | {content}")
|
||||
self.logger = clibs.logger
|
||||
|
||||
def initialization(self, data_dirs, data_files):
|
||||
@clibs.handle_exception
|
||||
def check_files():
|
||||
msg = "初始路径下不允许有文件夹,初始路径下只能存在如下两个文件,且文件为关闭状态,确认后重新运行!<br>"
|
||||
msg += "1. T_电机电流.xlsx<br>2. xxxx.zip"
|
||||
if len(data_dirs) != 0 or len(data_files) != 2:
|
||||
self.logger("ERROR", "do_current", msg, "red", "InitFileError")
|
||||
self.logger("ERROR", "do_current", msg, "red")
|
||||
|
||||
prj_file, count = None, 0
|
||||
for data_file in data_files:
|
||||
@ -39,10 +31,10 @@ class DoCurrentTest(QThread):
|
||||
count += 1
|
||||
prj_file = data_file
|
||||
else:
|
||||
self.logger("ERROR", "do_current", msg, "red", "InitFileError")
|
||||
self.logger("ERROR", "do_current", msg, "red")
|
||||
|
||||
if count != 2:
|
||||
self.logger("ERROR", "do_current", msg, "red", "InitFileError")
|
||||
self.logger("ERROR", "do_current", msg, "red")
|
||||
|
||||
if self.tool == "tool100":
|
||||
os.mkdir(f"{self.dir_path}/single")
|
||||
@ -52,11 +44,10 @@ class DoCurrentTest(QThread):
|
||||
elif self.tool == "inertia":
|
||||
os.mkdir(f"{self.dir_path}/inertia")
|
||||
else:
|
||||
self.logger("ERROR", "do_current", "负载选择错误,电机电流测试只能选择 tool100/inertia 规格!", "red", "LoadSelectError")
|
||||
self.logger("ERROR", "do_current", "负载选择错误,电机电流测试只能选择 tool100/inertia 规格!", "red")
|
||||
|
||||
return prj_file
|
||||
|
||||
@clibs.handle_exception
|
||||
def get_configs():
|
||||
robot_type = None
|
||||
msg_id = clibs.c_hr.execution("controller.get_params")
|
||||
@ -74,7 +65,6 @@ class DoCurrentTest(QThread):
|
||||
self.logger("INFO", "do_current", "数据目录合规性检查结束,未发现问题......", "green")
|
||||
return _prj_file
|
||||
|
||||
@clibs.handle_exception
|
||||
def single_axis_proc(self, records, number):
|
||||
text = "single" if number < 6 else "hold"
|
||||
number = number if number < 6 else number - 6
|
||||
@ -100,7 +90,6 @@ class DoCurrentTest(QThread):
|
||||
filename = f"{self.dir_path}/single/j{number + 1}_{text}_{time.time()}.data"
|
||||
df.to_csv(filename, sep="\t", index=False)
|
||||
|
||||
@clibs.handle_exception
|
||||
def scenario_proc(self, records, number, scenario_time):
|
||||
d_vel, d_trq, d_sensor, d_trans = [[], [], [], [], [], []], [[], [], [], [], [], []], [[], [], [], [], [], []], [[], [], [], [], [], []]
|
||||
for record in records:
|
||||
@ -126,9 +115,7 @@ class DoCurrentTest(QThread):
|
||||
filename = f"{self.dir_path}/s_{number-11}/j{axis+1}_s_{number-11}_{scenario_time}_{time.time()}.data"
|
||||
df.to_csv(filename, sep="\t", index=False)
|
||||
|
||||
@clibs.handle_exception
|
||||
def gen_result_file(self, number, start_time, end_time, scenario_time):
|
||||
@clibs.handle_exception
|
||||
def get_records():
|
||||
s_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(start_time))
|
||||
e_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(end_time+clibs.INTERVAL))
|
||||
@ -152,14 +139,12 @@ class DoCurrentTest(QThread):
|
||||
t.start()
|
||||
|
||||
@staticmethod
|
||||
@clibs.handle_exception
|
||||
def change_curve_state(stat):
|
||||
curves = ["hw_joint_vel_feedback", "device_servo_trq_feedback", "hw_sensor_trq_feedback", "hw_estimate_trans_trq_res"]
|
||||
display_pdo_params = [] if not stat else [{"name": curve, "channel": chl} for curve in curves for chl in range(6)]
|
||||
clibs.c_hr.execution("diagnosis.open", open=stat, display_open=stat)
|
||||
clibs.c_hr.execution("diagnosis.set_params", display_pdo_params=display_pdo_params)
|
||||
|
||||
@clibs.handle_exception
|
||||
def run_rl(self, prj_file):
|
||||
prj_name = ".".join(prj_file.split("/")[-1].split(".")[:-1])
|
||||
c_regular = [
|
||||
@ -235,7 +220,7 @@ class DoCurrentTest(QThread):
|
||||
else:
|
||||
time.sleep(1)
|
||||
if (time.time() - t_start) > 15:
|
||||
self.logger("ERROR", "do_current", "15s 内未收到机器人的运行信号,需要确认RL程序和工具通信是否正常执行...", "red", "ReadySignalTimeoutError")
|
||||
self.logger("ERROR", "do_current", "15s 内未收到机器人的运行信号,需要确认RL程序和工具通信是否正常执行...", "red")
|
||||
|
||||
# 4. 执行采集
|
||||
time.sleep(10) # 消除前 10s 的不稳定数据
|
||||
@ -256,7 +241,7 @@ class DoCurrentTest(QThread):
|
||||
else:
|
||||
time.sleep(1)
|
||||
if (time.time()-t_start) > 180:
|
||||
self.logger("ERROR", "do_current", f"180s 内未收到场景{number - 11}的周期时间,需要确认RL程序和工具通信交互是否正常执行...", "red", "GetScenarioTimeError")
|
||||
self.logger("ERROR", "do_current", f"180s 内未收到场景{number - 11}的周期时间,需要确认RL程序和工具通信交互是否正常执行...", "red")
|
||||
time.sleep(20)
|
||||
|
||||
# 5.停止程序运行,保留数据并处理输出
|
||||
@ -271,14 +256,13 @@ class DoCurrentTest(QThread):
|
||||
elif self.tool == "inertia":
|
||||
self.logger("INFO", "do_current", "惯量负载电机电流采集完毕,如需采集单轴/场景/保持电机电流,须切换负载类型,并更换偏置负载,重新执行", "green")
|
||||
|
||||
@clibs.handle_exception
|
||||
def processing(self):
|
||||
time_start = time.time()
|
||||
clibs.running[self.idx] = 1
|
||||
if clibs.status["hmi"] != 1 or clibs.status["md"] != 1:
|
||||
self.logger("ERROR", "do_current", "processing: 需要在网络设置中连接HMI以及Modbus通信!", "red", "NetworkError")
|
||||
self.logger("ERROR", "do_current", "processing: 需要在网络设置中连接HMI以及Modbus通信!", "red")
|
||||
|
||||
data_dirs, data_files = clibs.traversal_files(self.dir_path, self.output)
|
||||
data_dirs, data_files = clibs.traversal_files(self.dir_path)
|
||||
prj_file = self.initialization(data_dirs, data_files)
|
||||
clibs.c_pd.push_prj_to_server(prj_file)
|
||||
self.run_rl(prj_file)
|
||||
|
Reference in New Issue
Block a user