feature/weight_show #2

Merged
fujinliang merged 6 commits from feature/weight_show into bugfix/ui_sensor_reset 2025-09-30 15:52:18 +08:00
6 changed files with 4505 additions and 796 deletions
Showing only changes of commit 537cbaab9d - Show all commits

1
.gitignore vendored
View File

@ -273,3 +273,4 @@ PySide2_Fluent_Widgets.egg-info/
/Trace/__pycache__ /Trace/__pycache__
/Util/__pycache__ /Util/__pycache__
/view/__pycache__ /view/__pycache__
/log/log.log

3
.idea/.gitignore generated vendored
View File

@ -1,3 +0,0 @@
# Default ignored files
/shelf/
/workspace.xml

12
.idea/ailai.iml generated
View File

@ -1,12 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
<component name="PyDocumentationSettings">
<option name="format" value="PLAIN" />
<option name="myDocStringFormat" value="Plain" />
</component>
</module>

View File

@ -1,6 +0,0 @@
<component name="InspectionProjectProfileManager">
<settings>
<option name="USE_PROJECT_PROFILE" value="false" />
<version value="1.0" />
</settings>
</component>

4
.idea/misc.xml generated
View File

@ -1,4 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" project-jdk-name="ailai" project-jdk-type="Python SDK" />
</project>

8
.idea/modules.xml generated
View File

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/ailai.iml" filepath="$PROJECT_DIR$/.idea/ailai.iml" />
</modules>
</component>
</project>

6
.idea/vcs.xml generated
View File

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="" vcs="Git" />
</component>
</project>

View File

@ -268,7 +268,7 @@ class Feeding(QObject):
# --- 新增: 用于码垛模式的投料点索引 --- # --- 新增: 用于码垛模式的投料点索引 ---
self.current_drop_index = 0 self.current_drop_index = 0
self.drop_manager = DropPositionManager() # self.drop_manager = DropPositionManager()
pass pass
def close_feed(self): def close_feed(self):

View File

@ -75,7 +75,7 @@ class FeedPosition:
self.position = position self.position = position
class FeedLine: class FeedLine:
def __init__(self, id, name, feed_positions:list,remain_count:int): def __init__(self, id, name, feed_positions:list,remain_count:int,drop_manage:DropPositionManager):
self.feed_positions = copy.deepcopy(feed_positions) self.feed_positions = copy.deepcopy(feed_positions)
self.feeding2end_pos_index = 0 self.feeding2end_pos_index = 0
@ -83,7 +83,7 @@ class FeedLine:
self.start2take_pos_index = 0 self.start2take_pos_index = 0
self.name = name self.name = name
self.id = id self.id = id
self.drop_manager = DropPositionManager() self.drop_manager = drop_manage
# 初始化各个阶段的位置列表 # 初始化各个阶段的位置列表
self.feeding_to_end = [] self.feeding_to_end = []
@ -479,7 +479,7 @@ class Feeding(QObject):
self.next_position() self.next_position()
return return
#初始点无论如何先打开夹爪 #初始点无论如何先打开夹爪
self.relay_controller.close(clamp=True) if self.relay_controller.close(clamp=True):
#重新抓去信号料带 #重新抓去信号料带
self.take_sensor_signal=False self.take_sensor_signal=False
self.relay_controller.sensor2_ready=True self.relay_controller.sensor2_ready=True
@ -507,6 +507,9 @@ class Feeding(QObject):
# self.take_photo_sigal.emit() # self.take_photo_sigal.emit()
self.next_position() self.next_position()
self.log_signal.emit(logging.INFO, Constant.str_sys_runing2) self.log_signal.emit(logging.INFO, Constant.str_sys_runing2)
else:
self.log_signal.emit(logging.ERROR, Constant.str_clamp_open_error)
time.sleep(2)
# self.feedStatus = FeedStatus.FTake # self.feedStatus = FeedStatus.FTake
elif self.feedStatus == FeedStatus.FTake: elif self.feedStatus == FeedStatus.FTake:
@ -534,8 +537,11 @@ class Feeding(QObject):
# 移动到下一个抓取点 # 移动到下一个抓取点
# 更新丢包点: 如果需要根据放置情况调整下次抓取 # 更新丢包点: 如果需要根据放置情况调整下次抓取
self.relay_controller.open(clamp=True) if self.relay_controller.open(clamp=True):
self.next_position(self.is_reverse) self.next_position(self.is_reverse)
else:
self.log_signal.emit(logging.ERROR, Constant.str_clamp_close_error)
time.sleep(2)
#self.feedConfig.feedLine.set_drop_position(real_position)#我想在这里读取我的一个ini文件值里面有很多个drop点每一次索引递增的点 #self.feedConfig.feedLine.set_drop_position(real_position)#我想在这里读取我的一个ini文件值里面有很多个drop点每一次索引递增的点

View File

@ -8,7 +8,7 @@ import Constant
class DropPositionManager: class DropPositionManager:
def __init__(self, config_path=Constant.dropLine_set_file): def __init__(self, config_path):
self.config_path = config_path self.config_path = config_path
self.config = configparser.ConfigParser() self.config = configparser.ConfigParser()
self._load_config() self._load_config()
@ -167,10 +167,13 @@ class DropPositionManager:
return None return None
#region 前端UI编辑码垛点位调用方法
def load_path_points(self,lineid: int) ->Optional[LineModel]: def load_path_points(self,lineid: int) ->Optional[LineModel]:
"""根据lineid加载所有码垛的路径信息""" """根据lineid加载所有码垛的路径信息"""
#默认码垛的lineid从10开始 #默认码垛的lineid从10开始
if self.config_path==Constant.dropLine_set_file_35:
_lineid=lineid+11
else:
_lineid=lineid+10 _lineid=lineid+10
line_model = LineModel(_lineid) line_model = LineModel(_lineid)
line_model.line_category = 2 line_model.line_category = 2
@ -255,10 +258,13 @@ class DropPositionManager:
def save_path_points(self, line_model: LineModel): def save_path_points(self, line_model: LineModel):
"""根据lineid保存所有码垛的路径信息""" """根据lineid保存所有码垛的路径信息"""
#默认码垛的lineid从10开始,保存的时候减一 #默认码垛的lineid从10开始,保存的时候减一
if self.config_path==Constant.dropLine_set_file_35:
_lineid=line_model.id-11
else:
_lineid=line_model.id-10 _lineid=line_model.id-10
if _lineid<=0: if _lineid<=0:
return return
self.config.read(Constant.dropLine_set_file, encoding='utf-8') self.config.read(self.config_path, encoding='utf-8')
# 查找主表 DropLineX # 查找主表 DropLineX
main_section = f"{Constant.dropLine_set_section}{_lineid}" main_section = f"{Constant.dropLine_set_section}{_lineid}"
if not self.config.has_section(main_section): if not self.config.has_section(main_section):
@ -267,7 +273,7 @@ class DropPositionManager:
self.config.set(main_section, "id", str(_lineid)) self.config.set(main_section, "id", str(_lineid))
_current_reset_index=1 _current_reset_index=1
_current_mid_index=1 _current_mid_index=1
_current_drop_section_val=self._current_drop_section[main_section] _current_drop_section_val=self._get_max_drop_section()
# 保存每个DropPoints # 保存每个DropPoints
for i, pos in enumerate(line_model.positions): for i, pos in enumerate(line_model.positions):
if pos.lineId == _lineid or pos.lineId == line_model.id: if pos.lineId == _lineid or pos.lineId == line_model.id:
@ -300,49 +306,25 @@ class DropPositionManager:
#保存数据 #保存数据
pos.save_position_model(self.config) pos.save_position_model(self.config)
with open(Constant.dropLine_set_file, 'w', encoding='utf-8') as f: with open(self.config_path, 'w', encoding='utf-8') as f:
self.config.write(f) self.config.write(f)
def del_drop_point(self,section): def del_drop_point(self,section):
self.config.read(Constant.dropLine_set_file, encoding = 'utf-8') self.config.read(self.config_path, encoding = 'utf-8')
self.config.remove_section(section) self.config.remove_section(section)
with open(Constant.dropLine_set_file, 'w', encoding='utf-8') as f: with open(self.config_path, 'w', encoding='utf-8') as f:
self.config.write(f) self.config.write(f)
def _get_point_debug_info(manager, pos, model): def _get_max_drop_section(self):
config = manager.config """获取最大的DropPoints序号"""
for sec in config.sections(): max_section = 1
if sec.startswith("DropPoints"): for section in self.config.sections():
try: if section.startswith("DropPoints"):
x, y, z = config.getfloat(sec, "x"), config.getfloat(sec, "y"), config.getfloat(sec, "z") num_part = int(section.replace("DropPoints", "0"))
if abs(x - pos.X) < 0.001 and abs(y - pos.Y) < 0.001 and abs(z - pos.Z) < 0.001: if num_part > max_section:
point_id = config.getint(sec, "id") max_section = num_part
return f"📌 DropPoints{point_id} | id={point_id}" return max_section
except: pass #endregion
elif sec.startswith("DropMidPoint"):
try:
parts = sec.split('-')
if len(parts) != 2: continue
point_id = int(''.join(filter(str.isdigit, parts[0])))
level = int(parts[1])
x, y, z = config.getfloat(sec, "x"), config.getfloat(sec, "y"), config.getfloat(sec, "z")
if abs(x - pos.X) < 0.001 and abs(y - pos.Y) < 0.001 and abs(z - pos.Z) < 0.001:
return f"📍 DropMidPoint{point_id}-{level} | id={point_id}, level={level}"
except: pass
elif sec.startswith("ResetPoint"):
try:
parts = sec.split('-')
if len(parts) != 2: continue
point_id = int(''.join(filter(str.isdigit, parts[0])))
level = int(parts[1])
x, y, z = config.getfloat(sec, "x"), config.getfloat(sec, "y"), config.getfloat(sec, "z")
if abs(x - pos.X) < 0.001 and abs(y - pos.Y) < 0.001 and abs(z - pos.Z) < 0.001:
return f"🔙 ResetPoint{point_id}-{level} | id={point_id}, level={level}"
except: pass
return "❓ 未知点位"
# 测试 # 测试
if __name__ == "__main__": if __name__ == "__main__":
# manager = DropPositionManager("drop.ini") # manager = DropPositionManager("drop.ini")

Binary file not shown.

View File

@ -22,6 +22,7 @@ dropLine_set_section = 'DropLine'
position_set_section = 'Position' position_set_section = 'Position'
feedLine_set_file = f'.{os.sep}Config{os.sep}FeedLine.ini' feedLine_set_file = f'.{os.sep}Config{os.sep}FeedLine.ini'
dropLine_set_file = f'.{os.sep}Config{os.sep}drop.ini' dropLine_set_file = f'.{os.sep}Config{os.sep}drop.ini'
dropLine_set_file_35 = f'.{os.sep}Config{os.sep}drop-35.ini'
MAX_Position_num = 40 MAX_Position_num = 40
MAX_Line_num = 10 MAX_Line_num = 10
set_ini = 'Seting.ini' set_ini = 'Seting.ini'
@ -104,7 +105,8 @@ str_tcp_connect_no_reply = '无回复'
str_tcp_connect_error = 'tcp连接错误' str_tcp_connect_error = 'tcp连接错误'
str_tcp_reconnect = '重连中' str_tcp_reconnect = '重连中'
str_sys_json_error = 'json解析错误' str_sys_json_error = 'json解析错误'
str_clamp_open_error = '夹爪打开失败'
str_clamp_close_error = '夹爪关闭失败'
str_sys_runing = '运行到这里了!' str_sys_runing = '运行到这里了!'
str_sys_runing1 = '运行到这里2 ' str_sys_runing1 = '运行到这里2 '

View File

@ -36,6 +36,7 @@ class RelayController(QObject):
self.sensor_stable_duration = 1.0 # 传感器状态稳定检测时间(秒) self.sensor_stable_duration = 1.0 # 传感器状态稳定检测时间(秒)
self.sensor_max_attempts = 3 # 连续检测次数达到此值判定有效 self.sensor_max_attempts = 3 # 连续检测次数达到此值判定有效
self.sensor1_debounce_time = 1.0 # 传感器1防抖时间 self.sensor1_debounce_time = 1.0 # 传感器1防抖时间
self.sensor2_debounce_time = 3.0 # 袋尾检测3秒有效信号
# ===================== 网络与设备映射 ===================== # ===================== 网络与设备映射 =====================
self.host = host self.host = host
@ -113,6 +114,7 @@ class RelayController(QObject):
self.sensor2_ready = False #默认不打开 self.sensor2_ready = False #默认不打开
self.motor_stopped_by_sensor2 = True self.motor_stopped_by_sensor2 = True
self.is_drop_35=False #是否是35码
# ===================== 基础通信方法 ===================== # ===================== 基础通信方法 =====================
def send_command(self, command_hex, retry_count=2, source='unknown'): def send_command(self, command_hex, retry_count=2, source='unknown'):
@ -127,7 +129,7 @@ class RelayController(QObject):
sock.connect((self.host, self.port)) sock.connect((self.host, self.port))
sock.send(byte_data) sock.send(byte_data)
response = sock.recv(1024) response = sock.recv(1024)
hex_response = binascii.hexlify(response).decode('utf-8') # hex_response = binascii.hexlify(response).decode('utf-8')
#if source == 'sensor': #if source == 'sensor':
#print(f"[传感器响应] {hex_response}") #print(f"[传感器响应] {hex_response}")
#elif source == 'device': #elif source == 'device':
@ -136,13 +138,14 @@ class RelayController(QObject):
#print(f"[通信响应] {hex_response}") #print(f"[通信响应] {hex_response}")
return response return response
except Exception as e: except Exception as e:
print(f"网络继电器通信错误 ({source}): {e}, 尝试重连... ({attempt + 1}/{retry_count})") # print(f"网络继电器通信错误 ({source}): {e}, 尝试重连... ({attempt + 1}/{retry_count})")
self.log_signal.emit(logging.INFO,f"网络继电器通信错误 ({source}): {e}, 尝试重连... ({attempt + 1}/{retry_count})")
time.sleep(5) time.sleep(5)
self.trigger_alarm() self.trigger_alarm()
return None return None
def trigger_alarm(self): def trigger_alarm(self):
print("警告:网络继电器连续多次通信失败,请检查设备连接!") self.log_signal.emit(logging.ERROR,"警告:网络继电器连续多次通信失败,请检查设备连接!")
# ===================== 状态读取方法 ===================== # ===================== 状态读取方法 =====================
def get_all_device_status(self, command_type='devices'): def get_all_device_status(self, command_type='devices'):
@ -186,6 +189,7 @@ class RelayController(QObject):
if response and len(response) >= 10: if response and len(response) >= 10:
hex_response = binascii.hexlify(response).decode('utf-8') hex_response = binascii.hexlify(response).decode('utf-8')
# print(f"[原始响应][{command_type}] {hex_response}") # print(f"[原始响应][{command_type}] {hex_response}")
# 假设传感器数据从第 9 字节开始,长度为 2 字节 # 假设传感器数据从第 9 字节开始,长度为 2 字节
@ -247,7 +251,63 @@ class RelayController(QObject):
time.sleep(self.sensor2_loop_delay) time.sleep(self.sensor2_loop_delay)
return False return False
def is_valid_sensor(self,sensor_name):
"""
检查传感器状态是否有效
参数:
sensor_name: 传感器名称
返回:
True: 传感器状态有效
False: 传感器状态无效
"""
responses = self.get_all_sensor_responses('sensors')
response = responses.get(sensor_name)
if not response:
print(f"[警告] 无法获取 {sensor_name} 的响应,尝试重试...")
return False
else:
temp_status_code = self.parse_status_code(response)
if temp_status_code in self.required_codes_1:
return True
else:
return False
def is_valid_sensor_signal_stable(self, sensor_name, detection_duration=3.0, stability_duration=2.5, check_interval=0.1):
"""
检测在指定时间窗口内是否存在持续稳定的有效信号
参数:
sensor_name: 传感器名称
detection_duration: 总检测时间窗口(秒)默认为3秒
stability_duration: 信号需要持续稳定的时间(秒)默认为2.5秒
check_interval: 检测间隔(秒)默认为0.1秒
返回:
True: 在时间窗口内检测到持续稳定的有效信号
False: 未检测到持续稳定的有效信号
"""
stable_start_time = None # 记录首次检测到有效信号的时间
start_time = time.time()
if not self.is_valid_sensor(sensor_name):
return False # 传感器状态无效,返回
else:
stable_start_time = time.time() # 首次检测到有效信号
time.sleep(check_interval)
while time.time() - start_time < detection_duration:
temp_is_valid = self.is_valid_sensor(sensor_name)
if temp_is_valid:
if time.time() - stable_start_time >= stability_duration:
return True # 信号持续稳定达到要求时间
else:
stable_start_time = None # 信号不稳定,重置计时
time.sleep(check_interval)
return False
def is_valid_sensor2_status_lost(self, sensor_name): def is_valid_sensor2_status_lost(self, sensor_name):
"""
检查传感器2是否丢失信号
"""
stable_count = 0 stable_count = 0
_try_nums=5 # 尝试次数 _try_nums=5 # 尝试次数
for _ in range(_try_nums): for _ in range(_try_nums):
@ -269,49 +329,104 @@ class RelayController(QObject):
return False return False
# ===================== 动作控制方法 ===================== # ===================== 动作控制方法 =====================
def open(self, conveyor1=False, pusher=False, conveyor2=False, clamp=False, pusher1=False, conveyor2_reverse=False): def open(self, conveyor1=False, pusher=False, conveyor2=False, clamp=False, pusher1=False, conveyor2_reverse=False)->bool:
if Constant.DebugPosition: """将if改成elif,一次只能打开一个设备否则会造成延时sleep时间不一致问题。并返回成功核验"""
return loc_ret=False
loc_reponse=None
loc_send_command=None
status = self.get_all_device_status() status = self.get_all_device_status()
if conveyor1 and not status.get(self.CONVEYOR1, False):
self.send_command(self.valve_commands[self.CONVEYOR1]['open'])
time.sleep(self.delay_conveyor)
if pusher and not status.get(self.PUSHER, False):
self.send_command(self.valve_commands[self.PUSHER]['open'])
time.sleep(self.delay_pusher)
if conveyor2 and not status.get(self.CONVEYOR2, False):
self.send_command(self.valve_commands[self.CONVEYOR2]['open'])
time.sleep(self.delay_conveyor)
if clamp and not status.get(self.CLAMP, False):
self.send_command(self.valve_commands[self.CLAMP]['open'])
time.sleep(self.delay_clamp)
if pusher1 and not status.get(self.PUSHER1, False):
self.send_command(self.valve_commands[self.PUSHER1]['open'])
time.sleep(self.delay_pusher)
if conveyor2_reverse:
self.send_command(self.valve_commands[self.CONVEYOR2_REVERSE]['open'])
time.sleep(self.delay_conveyor)
def close(self, conveyor1=False, pusher=False, conveyor2=False, clamp=False, pusher1=False, conveyor2_reverse=False):
if conveyor1: if conveyor1:
self.send_command(self.valve_commands[self.CONVEYOR1]['close']) if not status.get(self.CONVEYOR1, False):
loc_send_command=self.valve_commands[self.CONVEYOR1]['open']
loc_reponse=self.send_command(loc_send_command)
time.sleep(self.delay_conveyor)
else:
loc_ret=True
elif pusher:
if not status.get(self.PUSHER, False):
loc_send_command=self.valve_commands[self.PUSHER]['open']
loc_reponse=self.send_command(loc_send_command)
time.sleep(self.delay_pusher)
else:
loc_ret=True
elif conveyor2:
if not status.get(self.CONVEYOR2, False):
loc_send_command=self.valve_commands[self.CONVEYOR2]['open']
loc_reponse=self.send_command(loc_send_command)
time.sleep(self.delay_conveyor)
else:
loc_ret=True
elif clamp:
if not status.get(self.CLAMP, False):
loc_send_command=self.valve_commands[self.CLAMP]['open']
loc_reponse=self.send_command(loc_send_command)
time.sleep(self.delay_clamp)
else:
loc_ret=True
elif pusher1:
if not status.get(self.PUSHER1, False):
loc_send_command=self.valve_commands[self.PUSHER1]['open']
loc_reponse=self.send_command(loc_send_command)
time.sleep(self.delay_pusher)
else:
loc_ret=True
elif conveyor2_reverse:
if not status.get(self.CONVEYOR2_REVERSE, False):
loc_send_command=self.valve_commands[self.CONVEYOR2_REVERSE]['open']
loc_reponse=self.send_command(loc_send_command)
time.sleep(self.delay_conveyor)
else:
loc_ret=True
if loc_reponse and len(loc_reponse) >= 10:
lol_hex_response = binascii.hexlify(response).decode('utf-8')
if lol_hex_response == loc_send_command:
loc_ret=True
if Constant.DebugPosition:
loc_ret=True
return loc_ret
def close(self, conveyor1=False, pusher=False, conveyor2=False, clamp=False, pusher1=False, conveyor2_reverse=False)->bool:
loc_ret=False
loc_reponse=None
loc_send_command=None
if conveyor1:
loc_send_command=self.valve_commands[self.CONVEYOR1]['close']
loc_reponse=self.send_command(loc_send_command)
time.sleep(self.delay_conveyor) time.sleep(self.delay_conveyor)
if pusher: if pusher:
self.send_command(self.valve_commands[self.PUSHER]['close']) loc_send_command=self.valve_commands[self.PUSHER]['close']
loc_reponse=self.send_command(loc_send_command)
time.sleep(self.delay_pusher) time.sleep(self.delay_pusher)
if conveyor2: if conveyor2:
self.send_command(self.valve_commands[self.CONVEYOR2]['close']) loc_send_command=self.valve_commands[self.CONVEYOR2]['close']
loc_reponse=self.send_command(loc_send_command)
time.sleep(self.delay_conveyor) time.sleep(self.delay_conveyor)
if clamp: if clamp:
self.send_command(self.valve_commands[self.CLAMP]['close']) loc_send_command=self.valve_commands[self.CLAMP]['close']
loc_reponse=self.send_command(loc_send_command)
time.sleep(self.delay_clamp) time.sleep(self.delay_clamp)
if pusher1: if pusher1:
self.send_command(self.valve_commands[self.PUSHER1]['close']) loc_send_command=self.valve_commands[self.PUSHER1]['close']
loc_reponse=self.send_command(loc_send_command)
time.sleep(self.delay_pusher) time.sleep(self.delay_pusher)
if conveyor2_reverse: if conveyor2_reverse:
self.send_command(self.valve_commands[self.CONVEYOR2_REVERSE]['close']) loc_send_command=self.valve_commands[self.CONVEYOR2_REVERSE]['close']
loc_reponse=self.send_command(loc_send_command)
time.sleep(self.delay_conveyor) time.sleep(self.delay_conveyor)
if loc_reponse and len(loc_reponse) >= 10:
lol_hex_response = binascii.hexlify(response).decode('utf-8')
if lol_hex_response == loc_send_command:
loc_ret=True
if Constant.DebugPosition:
loc_ret=True
return loc_ret
# ===================== 传感器处理线程 ===================== # ===================== 传感器处理线程 =====================
def handle_sensor1(self): def handle_sensor1(self):
while self._running: while self._running:
@ -356,6 +471,7 @@ class RelayController(QObject):
time.sleep(self.sensor1_loop_delay) time.sleep(self.sensor1_loop_delay)
except Exception as e: except Exception as e:
print(f"SENSOR1 处理错误: {e}") print(f"SENSOR1 处理错误: {e}")
self.log_signal.emit(logging.ERROR,f"SENSOR1 处理错误: {e}")
self.sensor1_triggered = False self.sensor1_triggered = False
time.sleep(self.sensor1_error_delay) time.sleep(self.sensor1_error_delay)
@ -363,6 +479,14 @@ class RelayController(QObject):
_is_pause_close=True _is_pause_close=True
#是否料袋尾部(有信号--》无信号) #是否料袋尾部(有信号--》无信号)
_is_signal=False _is_signal=False
#正发转用
_is_reverse_2=False
#是否反转后正转信号消息
_is_signal_2=False
#是否首次正转信号
_is_first_signal_2=False
while self._running: while self._running:
if self._ispause: if self._ispause:
#暂停 #暂停
@ -376,9 +500,66 @@ class RelayController(QObject):
continue continue
#开启线程 #开启线程
_is_pause_close=True _is_pause_close=True
if self.is_drop_35:
#region 35kg 正反转打平
try: try:
if _is_signal or self.is_valid_sensor_status_1(self.SENSOR2): if _is_signal_2 or self.is_valid_sensor_status_1(self.SENSOR2):
#反转要加个防抖动时间
if _is_reverse_2:
print('回退后检查到sensor2 35KG信号正转')
self.open(conveyor2=True)
_is_reverse_2=False
_is_signal_2=True
elif _is_signal_2 and self.is_valid_sensor2_status_lost(self.SENSOR2):
print('检查到sensor2正转35KG信号消失')
self.close(conveyor2=True)
#滚筒关闭标志
self.motor_stopped_by_sensor2 = True
# 发送信号通知机器人取走物品
self.take_robot_signal.emit()
_is_signal_2=False
#停止后即使有信号了也不能转直到self.sensor2_ready=True
# _is_first_signal=False
self.sensor2_ready=False #打开滚洞标识
elif not _is_first_signal_2:
print('检查到正转sensor2 35KG信号')
#检测到信号5秒
time.sleep(6)
self.open(conveyor2_reverse=True)
_is_reverse_2=True
_is_first_signal_2=True
time.sleep(0.1)
continue
elif self.sensor2_ready:
#sensor2_ready:通过Feeding:FPhoto处控制是否启动
if self.motor_stopped_by_sensor2:
print('开滚筒')
self.open(conveyor2=True)
self.motor_stopped_by_sensor2 = False
_is_first_signal=False
# _is_reverse=False
# _is_first_signal=False
# _is_signal=False
if _is_reverse_2:
time.sleep(0.1)
else:
time.sleep(2)
except Exception as e:
print(f"SENSOR3 处理错误: {e}")
self.log_signal.emit(logging.ERROR,f"SENSOR3 处理错误: {e}")
time.sleep(self.sensor2_error_delay)
#endregion
else:
try:
if self.sensor2_ready:
#sensor2_ready:通过Feeding:FPhoto处控制是否启动,到了,先启动
if self.motor_stopped_by_sensor2:
print('开滚筒')
self.open(conveyor2=True)
self.motor_stopped_by_sensor2 = False
elif _is_signal or self.is_valid_sensor_signal_stable(self.SENSOR2,detection_duration=3,stability_duration=2.5,check_interval=0.5):
#检测到信号,如果之前是没有信号,关闭滚筒 #检测到信号,如果之前是没有信号,关闭滚筒
print('检查到sensor2信号') print('检查到sensor2信号')
if _is_signal and self.is_valid_sensor2_status_lost(self.SENSOR2): if _is_signal and self.is_valid_sensor2_status_lost(self.SENSOR2):
@ -394,16 +575,85 @@ class RelayController(QObject):
_is_signal=True _is_signal=True
# time.sleep(0.1) # time.sleep(0.1)
continue continue
time.sleep(2)
except Exception as e:
print(f"SENSOR2 处理错误: {e}")
self.log_signal.emit(logging.ERROR,f"SENSOR2 处理错误: {e}")
time.sleep(self.sensor2_error_delay)
def handle_sensor3(self):
"""
正转--》反转--》正转
"""
_is_pause_close=True
#是否反转
_is_reverse=False
#是否反转后正转信号消息
_is_signal=False
#是否首次正转信号
_is_first_signal=False
#是否料袋尾部(有信号--》无信号)
while self._running:
if self._ispause:
#暂停
if _is_pause_close:
self.close(conveyor2=True)
self.motor_stopped_by_sensor2 = True
# self.sensor2_ready = True #初始值
_is_pause_close=False
time.sleep(self.sensor2_error_delay)
continue
#开启线程
_is_pause_close=True
#滚动次数
try:
if _is_signal or self.is_valid_sensor_status_1(self.SENSOR2):
#反转要加个防抖动时间
if _is_reverse:
print('回退后检查到sensor2信号正转')
self.open(conveyor2=True)
_is_reverse=False
_is_signal=True
elif _is_signal and self.is_valid_sensor2_status_lost(self.SENSOR2):
print('检查到sensor2正转信号消失')
self.close(conveyor2=True)
#滚筒关闭标志
self.motor_stopped_by_sensor2 = True
# 发送信号通知机器人取走物品
self.take_robot_signal.emit()
_is_signal=False
#停止后即使有信号了也不能转直到self.sensor2_ready=True
# _is_first_signal=False
self.sensor2_ready=False #打开滚洞标识
elif not _is_first_signal:
print('检查到正转sensor2信号')
#检测到信号5秒
time.sleep(6)
self.open(conveyor2_reverse=True)
_is_reverse=True
_is_first_signal=True
time.sleep(0.1)
continue
elif self.sensor2_ready: elif self.sensor2_ready:
#sensor2_ready:通过Feeding:FPhoto处控制是否启动 #sensor2_ready:通过Feeding:FPhoto处控制是否启动
if self.motor_stopped_by_sensor2: if self.motor_stopped_by_sensor2:
print('开滚筒') print('开滚筒')
self.open(conveyor2=True) self.open(conveyor2=True)
self.motor_stopped_by_sensor2 = False self.motor_stopped_by_sensor2 = False
_is_first_signal=False
# _is_reverse=False
# _is_first_signal=False
# _is_signal=False
if _is_reverse:
time.sleep(0.1)
else:
time.sleep(2) time.sleep(2)
except Exception as e: except Exception as e:
print(f"SENSOR2 处理错误: {e}") print(f"SENSOR3 处理错误: {e}")
self.log_signal.emit(logging.ERROR,f"SENSOR3 处理错误: {e}")
time.sleep(self.sensor2_error_delay) time.sleep(self.sensor2_error_delay)
def pause_start_sensor(self,is_pause): def pause_start_sensor(self,is_pause):
@ -413,6 +663,14 @@ class RelayController(QObject):
""" """
self._ispause = is_pause self._ispause = is_pause
def set_drop_35(self,is_drop_35):
"""
设置是否是35码
is_drop_35:True是False否
"""
self.is_drop_35=is_drop_35
def stop_sensor(self,sensor1_thread,sensor2_thread): def stop_sensor(self,sensor1_thread,sensor2_thread):
if not self._running: if not self._running:
print("线程未在运行") print("线程未在运行")

View File

@ -21,12 +21,12 @@ photo_z1 = 1.0
photo_u1 = 12.0 photo_u1 = 12.0
photo_v1 = 0.0 photo_v1 = 0.0
photo_w1 = 1.0 photo_w1 = 1.0
photo_x2 = 7.0 photo_x2 = 0.0
photo_y2 = 50.0 photo_y2 = 0.0
photo_z2 = 1.0 photo_z2 = 0.0
photo_u2 = 12.0 photo_u2 = 0.0
photo_v2 = 0.0 photo_v2 = 0.0
photo_w2 = 1.0 photo_w2 = 0.0
photo_x3 = 7.0 photo_x3 = 7.0
photo_y3 = 50.0 photo_y3 = 50.0
photo_z3 = 1.0 photo_z3 = 1.0
@ -48,7 +48,7 @@ photo_w5 = 1.0
linecount = 2 linecount = 2
remain_linename = 1 remain_linename = 1
remain_dropweight_kg = 50 remain_dropweight_kg = 50
remain_count = 10 remain_count = 18
maduo_count = 30 maduo_count = 30
io_take_addr = 8 io_take_addr = 8
io_zip_addr = 11 io_zip_addr = 11

View File

@ -51,9 +51,18 @@ class Logger(QObject):
handler = TimedRotatingFileHandler(file_path, when='D', interval=1, backupCount=30,encoding='utf-8') handler = TimedRotatingFileHandler(file_path, when='D', interval=1, backupCount=30,encoding='utf-8')
handler.suffix = "%Y-%m-%d" handler.suffix = "%Y-%m-%d"
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s', datefmt='%Y-%m-%d %H:%M:%S') formatter = logging.Formatter('%(asctime)s - %(levelname)s- %(message)s', datefmt='%Y-%m-%d %H:%M:%S')
handler.setFormatter(formatter) handler.setFormatter(formatter)
self.logger_file_info.addHandler(handler) self.logger_file_info.addHandler(handler)
# 添加错误专用日志文件
error_handler = TimedRotatingFileHandler(
file_path.replace('.log', '_error.log'),
when='D', interval=1, backupCount=30, encoding='utf-8')
error_handler.suffix = "%Y-%m-%d"
error_handler.setLevel(logging.ERROR) # 只处理错误级别
error_handler.setFormatter(formatter)
self.logger_file_info.addHandler(error_handler)
def _process_logs(self): def _process_logs(self):
while True: while True:

17234
log/log.log

File diff suppressed because it is too large Load Diff

358
main.py
View File

@ -59,7 +59,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
self.setupUi(self) self.setupUi(self)
#传感器继电器加入变量 #传感器继电器加入变量
self.relay_controller = RelayController() self.relay_controller = RelayController()
self.drop_position_manager = DropPositionManager() self.drop_position_manager = DropPositionManager(Constant.dropLine_set_file)
self.sensor_thread = None self.sensor_thread = None
self.sensor2_thread = None self.sensor2_thread = None
self.last_status_printed = None self.last_status_printed = None
@ -242,7 +242,10 @@ class MainWindow(QMainWindow, Ui_MainWindow):
line_model.save_line_model(config_reader) line_model.save_line_model(config_reader)
config_reader.write(open(Constant.feedLine_set_file, 'w', encoding='utf-8')) config_reader.write(open(Constant.feedLine_set_file, 'w', encoding='utf-8'))
elif section.startswith(Constant.dropLine_set_section): elif section.startswith(Constant.dropLine_set_section):
self.drop_position_manager.save_path_points(line_model) loc_dropline_file=Constant.dropLine_set_file
if section.endswith('-35'):
loc_dropline_file=Constant.dropLine_set_file_35
DropPositionManager(loc_dropline_file).save_path_points(line_model)
self.init_FeedLine() self.init_FeedLine()
break break
self.init_table_lines_data() self.init_table_lines_data()
@ -335,7 +338,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
def show_lines_pos_data(self,line_index): def show_lines_pos_data(self,line_index):
if self.selected_line_section!='' and self.selected_line_section != self.tableWidget_lines.item(line_index,0).text(): if self.selected_line_section!='' and self.selected_line_section != self.tableWidget_lines.item(line_index,0).text():
if self.table_position_changed or self.table_line_changed: if self.table_position_changed or self.table_line_changed:
msgBox = QMessageBox() msgBox = QMessageBox(self)
msgBox.setText("已修改的数据,是否保存?") msgBox.setText("已修改的数据,是否保存?")
msgBox.setStandardButtons(QMessageBox.Yes | QMessageBox.No) msgBox.setStandardButtons(QMessageBox.Yes | QMessageBox.No)
result = msgBox.exec() result = msgBox.exec()
@ -408,7 +411,10 @@ class MainWindow(QMainWindow, Ui_MainWindow):
self.tableWidget_line_positions.removeRow(self.tableWidget_line_positions.currentRow()) self.tableWidget_line_positions.removeRow(self.tableWidget_line_positions.currentRow())
if self.selected_line_section.startswith(Constant.dropLine_set_section): if self.selected_line_section.startswith(Constant.dropLine_set_section):
self.drop_position_manager.del_drop_point(section) loc_dropline_file=Constant.dropLine_set_file
if self.selected_line_section.endswith('-35'):
loc_dropline_file=Constant.dropLine_set_file_35
DropPositionManager(loc_dropline_file).del_drop_point(section)
else: else:
config_writer = configparser.ConfigParser() config_writer = configparser.ConfigParser()
config_writer.read(Constant.feedLine_set_file, encoding = 'utf-8') config_writer.read(Constant.feedLine_set_file, encoding = 'utf-8')
@ -448,7 +454,6 @@ class MainWindow(QMainWindow, Ui_MainWindow):
self.set_positionModel_to_tabel(row_i+1,position_model) self.set_positionModel_to_tabel(row_i+1,position_model)
self.table_line_changed = True self.table_line_changed = True
def tabel_move_position(self,row_i): def tabel_move_position(self,row_i):
if self.tableWidget_line_positions.currentRow()==-1: if self.tableWidget_line_positions.currentRow()==-1:
QMessageBox.information(self, "提示", Constant.str_sys_set_position_error) QMessageBox.information(self, "提示", Constant.str_sys_set_position_error)
@ -566,11 +571,13 @@ class MainWindow(QMainWindow, Ui_MainWindow):
pass pass
def init_log(self): def init_log(self):
"""初始化日志显示到界面上"""
log.log_info_signal.connect(self.log_info_message) log.log_info_signal.connect(self.log_info_message)
log.log_error_signal.connect(self.log_error_message) log.log_error_signal.connect(self.log_error_message)
log.log_warning_signal.connect(self.log_warning_message) log.log_warning_signal.connect(self.log_warning_message)
log.init_log(self.textEdit_log_info, self.textEdit_log_error, Constant.log_file_path) log.init_log(self.textEdit_log_info, self.textEdit_log_error, Constant.log_file_path)
log.log_message(logging.INFO, Constant.str_sys_start) log.log_message(logging.INFO, Constant.str_sys_start)
def log_info_message(self,message): def log_info_message(self,message):
now = datetime.now() now = datetime.now()
formatted_time = now.strftime("%Y-%m-%d %H:%M:%S") formatted_time = now.strftime("%Y-%m-%d %H:%M:%S")
@ -752,6 +759,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
# self.camera_img.update_camera_image.connect(self.updateUI_label_detection) # self.camera_img.update_camera_image.connect(self.updateUI_label_detection)
self.feeding.log_signal.connect(self.log_message) self.feeding.log_signal.connect(self.log_message)
self.feeding.stack_finish_signal.connect(self.stack_finish) self.feeding.stack_finish_signal.connect(self.stack_finish)
self.relay_controller.log_signal.connect(self.log_message)
# self.camera_img=CameraImg(self.feeding) # self.camera_img=CameraImg(self.feeding)
# self.camera_img.update_camera_image.connect(self.updateUI_label_detection) # self.camera_img.update_camera_image.connect(self.updateUI_label_detection)
@ -778,112 +786,6 @@ class MainWindow(QMainWindow, Ui_MainWindow):
else: else:
return Error_Code.SYS_NETERROR return Error_Code.SYS_NETERROR
def init_seting_frame(self):
rows = len(self.feedLine_dict.keys()) + 1
self.tableWidget_feedSeting.setRowCount(rows)
self.tableWidget_feedSeting.setColumnCount(20+2*6)
# 设置第一重表头的合并 (三列一组)
self.tableWidget_feedSeting_addtional_col_num = 2
self.tableWidget_feedSeting.setSpan(0, 0 + self.tableWidget_feedSeting_addtional_col_num, 1, 6) # 合并前3列
self.tableWidget_feedSeting.setSpan(0, 6 + self.tableWidget_feedSeting_addtional_col_num, 1, 6) # 合并后3列
self.tableWidget_feedSeting.setSpan(0, 12 + self.tableWidget_feedSeting_addtional_col_num, 1, 6) # 合并后3列
self.tableWidget_feedSeting.setSpan(0, 18 + self.tableWidget_feedSeting_addtional_col_num, 1, 6) # 合并后3列
self.tableWidget_feedSeting.setSpan(0, 24 + self.tableWidget_feedSeting_addtional_col_num, 1, 6) # 合并后3列
self.tableWidget_feedSeting.itemChanged.connect(self.send_tabelFeedSet_itemChanged)
btn_safe = QPushButton("获取安全位置")
widget_safe = QWidget()
layout_safe = QHBoxLayout()
layout_safe.addWidget(btn_safe)
# 调整布局的间距,使之更紧凑
layout_safe.setContentsMargins(0, 0, 0, 0)
# 将布局设置到 QWidget 容器中
widget_safe.setLayout(layout_safe)
btn_bk1 = QPushButton("获取破袋位置1")
widget_bk1 = QWidget()
layout_bk1 = QHBoxLayout()
layout_bk1.addWidget(btn_bk1)
# 调整布局的间距,使之更紧凑
layout_bk1.setContentsMargins(0, 0, 0, 0)
# 将布局设置到 QWidget 容器中
widget_bk1.setLayout(layout_bk1)
btn_bk2 = QPushButton("获取破袋位置2")
widget_bk2 = QWidget()
layout_bk2 = QHBoxLayout()
layout_bk2.addWidget(btn_bk2)
# 调整布局的间距,使之更紧凑
layout_bk2.setContentsMargins(0, 0, 0, 0)
# 将布局设置到 QWidget 容器中
widget_bk2.setLayout(layout_bk2)
btn_shake = QPushButton("获取摇晃位置")
widget_shake = QWidget()
layout_shake = QHBoxLayout()
layout_shake.addWidget(btn_shake)
layout_shake.setContentsMargins(0, 0, 0, 0)
widget_shake.setLayout(layout_shake)
btn_dropbag = QPushButton("获取丢袋位置")
widget_dropbag = QWidget()
layout_dropbag = QHBoxLayout()
layout_dropbag.addWidget(btn_dropbag)
# 调整布局的间距,使之更紧凑
layout_dropbag.setContentsMargins(0, 0, 0, 0)
# 将布局设置到 QWidget 容器中
widget_dropbag.setLayout(layout_dropbag)
btn_safe.clicked.connect(self.send_get_safe_position_button_click)
btn_bk1.clicked.connect(self.send_get_broken1_position_button_click)
btn_bk2.clicked.connect(self.send_get_broken2_position_button_click)
btn_shake.clicked.connect(self.send_get_shake_position_button_click)
btn_dropbag.clicked.connect(self.send_get_dropbag_position_button_click)
# 添加第一重表头项
self.tableWidget_feedSeting.setCellWidget(0, 0 + self.tableWidget_feedSeting_addtional_col_num, widget_safe)
self.tableWidget_feedSeting.setCellWidget(0, 6 + self.tableWidget_feedSeting_addtional_col_num, widget_bk1)
self.tableWidget_feedSeting.setCellWidget(0, 12 + self.tableWidget_feedSeting_addtional_col_num, widget_bk2)
self.tableWidget_feedSeting.setCellWidget(0, 18 + self.tableWidget_feedSeting_addtional_col_num, widget_shake)
self.tableWidget_feedSeting.setCellWidget(0, 24 + self.tableWidget_feedSeting_addtional_col_num, widget_dropbag)
self.tableWidget_feedSeting.setSelectionBehavior(QTableWidget.SelectRows)
self.tableWidget_feedSeting.setAutoScroll(True)
# 添加第二重表头
self.tableWidget_feedSeting.setHorizontalHeaderLabels(
['header', '线名', 'X1', 'Y1', 'Z1', 'U1', 'V1', 'W1', 'X2', 'Y2', 'Z2', 'U2', 'V2', 'W2', 'X3', 'Y3', 'Z3',
'U3', 'V3', 'W3', 'X4', 'Y4', 'Z4', 'U4', 'V4', 'W4', 'X5', 'Y5', 'Z5', 'U5', 'V5', 'W5'])
self.tableWidget_feedSeting.hideColumn(0)
# 填充数据行
for row, (feed_line_key, feed_line) in enumerate(self.feedLine_dict.items()):
self.tableWidget_feedSeting.setItem(row + 1, 0, QTableWidgetItem(feed_line_key))
self.tableWidget_feedSeting.setItem(row + 1, 1, QTableWidgetItem(feed_line.name))
self.set_position_to_tabel(row + 1, 0, feed_line.safe_position)
self.set_position_to_tabel(row + 1, 1, feed_line.broken1_position)
self.set_position_to_tabel(row + 1, 2, feed_line.broken2_position)
self.set_position_to_tabel(row + 1, 3, feed_line.broken2_position)
self.set_position_to_tabel(row + 1, 4, feed_line.drop_bag_position)
# 禁用自动表头
self.tableWidget_feedSeting.verticalHeader().setVisible(True)
self.pushButton_tableFeedSet_addRow.clicked.connect(self.send_tabelFeedSet_addRow)
self.pushButton_tableFeedSet_deleRow.clicked.connect(self.send_tabelFeedSet_delRow)
self.pushButton_tableFeedSet_save.clicked.connect(self.send_tabelFeedSet_save)
def init_FeedLine(self): def init_FeedLine(self):
# line_count = self.configReader.get('Robot_Feed', 'LineCount', fallback=0) # line_count = self.configReader.get('Robot_Feed', 'LineCount', fallback=0)
configReader = configparser.ConfigParser() configReader = configparser.ConfigParser()
@ -895,10 +797,13 @@ class MainWindow(QMainWindow, Ui_MainWindow):
feed_line.read_line_model(config_reader=configReader,index=i) feed_line.read_line_model(config_reader=configReader,index=i)
self.feedLine_dict[f'{Constant.feedLine_set_section}{i}'] = feed_line self.feedLine_dict[f'{Constant.feedLine_set_section}{i}'] = feed_line
#加载所有码垛的路径信息 #加载所有码垛的路径信息
for i in range(1,Constant.MAX_Line_num): # for i in range(1,Constant.MAX_Line_num):
line_model = self.drop_position_manager.load_path_points(i) line_model = DropPositionManager(Constant.dropLine_set_file).load_path_points(1)
if line_model: if line_model:
self.feedLine_dict[f'{Constant.dropLine_set_section}{i}'] = line_model self.feedLine_dict[f'{Constant.dropLine_set_section}-50'] = line_model
line_model = DropPositionManager(Constant.dropLine_set_file_35).load_path_points(1)
if line_model:
self.feedLine_dict[f'{Constant.dropLine_set_section}-35'] = line_model
# self.updateUI_Select_Line() # self.updateUI_Select_Line()
# 9/29 初始化线名选择框 和 重量选择框 # 9/29 初始化线名选择框 和 重量选择框
@ -977,15 +882,13 @@ class MainWindow(QMainWindow, Ui_MainWindow):
pass pass
def check_continue(self): def check_continue(self):
if self.remain_Count!=0: if self.remain_Count!=0:
for key in self.feedLine_dict.keys(): for key in self.feedLine_dict.keys():
feed_line = self.feedLine_dict[key] feed_line = self.feedLine_dict[key]
if f'FeedLine{self.remain_lineName}' == key: if f'FeedLine{self.remain_lineName}' == key:
#提示 #提示
remain_messageBox = QMessageBox() remain_messageBox = QMessageBox(self)
remain_messageBox.setIcon(QMessageBox.Icon.Warning) remain_messageBox.setIcon(QMessageBox.Icon.Warning)
remain_messageBox.setText(f'还有{self.remain_Count}袋未投料,是否继续?') # 这里返回多少袋没有投料 remain_messageBox.setText(f'还有{self.remain_Count}袋未投料,是否继续?') # 这里返回多少袋没有投料
# remain_messageBox.setStandardButtons(QMessageBox.StandardButton.Ok | QMessageBox.StandardButton.Cancel) # remain_messageBox.setStandardButtons(QMessageBox.StandardButton.Ok | QMessageBox.StandardButton.Cancel)
@ -1019,7 +922,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
self.send_start_tool_command() self.send_start_tool_command()
log.log_message(logging.INFO, Constant.str_sys_start_tool) log.log_message(logging.INFO, Constant.str_sys_start_tool)
msg_box_person = QMessageBox() msg_box_person = QMessageBox(self)
msg_box_person.setIcon(QMessageBox.Icon.Information) msg_box_person.setIcon(QMessageBox.Icon.Information)
msg_box_person.setText("是否确认生产区域安全继续生产?") msg_box_person.setText("是否确认生产区域安全继续生产?")
msg_box_person.setWindowTitle("提示") msg_box_person.setWindowTitle("提示")
@ -1058,8 +961,24 @@ class MainWindow(QMainWindow, Ui_MainWindow):
return return
self.label_button_status.setText("运行中...") self.label_button_status.setText("运行中...")
self.drop_position_manager=DropPositionManager(Constant.dropLine_set_file_35)
self.relay_controller.set_drop_35(True)
#注意码垛数和码垛总数
# num=25 #先默认30包码垛 # num=25 #先默认30包码垛
self.command_quene.put(FeedCommand(FeedingConfig(num, FeedLine(self.feedLine_dict[line_head].id,self.feedLine_dict[line_head].name,self.feedLine_dict[line_head].positions,self.remain_Count), self.feeding.robotClient.photo_locs[:],self.remain_Count))) self.command_quene.put(
FeedCommand(
FeedingConfig(num,
FeedLine(
self.feedLine_dict[line_head].id,
self.feedLine_dict[line_head].name,
self.feedLine_dict[line_head].positions,
self.remain_Count,
self.drop_position_manager
)
, self.feeding.robotClient.photo_locs[:],self.remain_Count
)
)
)
# self.stackedWidget_num.setCurrentIndex(1) # self.stackedWidget_num.setCurrentIndex(1)
self.set_run_status_button(True) self.set_run_status_button(True)
self.feeding.pause = False self.feeding.pause = False
@ -1268,97 +1187,6 @@ class MainWindow(QMainWindow, Ui_MainWindow):
log.log_message(logging.INFO, Constant.str_sys_setSpeed + str(self.robotClient.debug_speed)+'|'+str(self.robotClient.feed_speed)) log.log_message(logging.INFO, Constant.str_sys_setSpeed + str(self.robotClient.debug_speed)+'|'+str(self.robotClient.feed_speed))
pass pass
def send_get_safe_position_button_click(self):
real_position = self.robotClient.status_model.getRealPosition()
row_i = self.tableWidget_feedSeting.currentRow()
head = self.tableWidget_feedSeting.item(row_i, 0).text()
self.feedLine_dict[head].safe_position.init_position(real_position.X, real_position.Y, real_position.Z,
real_position.U, real_position.V, real_position.W)
self.set_position_to_tabel(row_i, 0, real_position)
def send_get_broken1_position_button_click(self):
real_position = self.robotClient.status_model.getRealPosition()
row_i = self.tableWidget_feedSeting.currentRow()
head = self.tableWidget_feedSeting.item(row_i, 0).text()
self.feedLine_dict[head].broken1_position.init_position(real_position.X, real_position.Y, real_position.Z,
real_position.U, real_position.V, real_position.W)
self.set_position_to_tabel(row_i, 1, real_position)
def send_get_broken2_position_button_click(self):
real_position = self.robotClient.status_model.getRealPosition()
row_i = self.tableWidget_feedSeting.currentRow()
head = self.tableWidget_feedSeting.item(row_i, 0).text()
self.feedLine_dict[head].broken2_position.init_position(real_position.X, real_position.Y, real_position.Z,
real_position.U, real_position.V, real_position.W)
self.set_position_to_tabel(row_i, 2, real_position)
def send_get_shake_position_button_click(self):
real_position = self.robotClient.status_model.getRealPosition()
row_i = self.tableWidget_feedSeting.currentRow()
head = self.tableWidget_feedSeting.item(row_i, 0).text()
self.feedLine_dict[head].shake_position.init_position(real_position.X, real_position.Y, real_position.Z,
real_position.U, real_position.V, real_position.W)
self.set_position_to_tabel(row_i, 3, real_position)
def send_get_dropbag_position_button_click(self):
real_position = self.robotClient.status_model.getRealPosition()
row_i = self.tableWidget_feedSeting.currentRow()
head = self.tableWidget_feedSeting.item(row_i, 0).text()
self.feedLine_dict[head].drop_bag_position.init_position(real_position.X, real_position.Y, real_position.Z,
real_position.U, real_position.V, real_position.W)
self.set_position_to_tabel(row_i, 4, real_position)
def send_get_zipbag_position_button_click(self):
real_position = self.robotClient.status_model.getRealPosition()
row_i = self.tableWidget_feedSeting.currentRow()
head = self.tableWidget_feedSeting.item(row_i, 0).text()
self.feedLine_dict[head].zip_bag_position.init_position(real_position.X, real_position.Y, real_position.Z,
real_position.U, real_position.V, real_position.W)
self.set_position_to_tabel(row_i, 6, real_position)
def send_tabelFeedSet_addRow(self):
for i in range(1, 20):
head = f'{Constant.feedLine_set_section}{i}'
if head not in self.feedLine_dict:
row_position = self.tableWidget_feedSeting.rowCount() # 当前行数
self.tableWidget_feedSeting.insertRow(row_position)
safe_position = Real_Position()
break_1_position = Real_Position()
break_2_position = Real_Position()
shake_position = Real_Position()
drop_bag_position = Real_Position()
self.feedLine_dict[head] = FeedLine('新建', safe_position, break_1_position, break_2_position,shake_position,drop_bag_position)
self.tableWidget_feedSeting.setItem(self.tableWidget_feedSeting.rowCount() - 1, 0,
QTableWidgetItem(head))
self.tableWidget_feedSeting.setItem(self.tableWidget_feedSeting.rowCount() - 1, 1,
QTableWidgetItem('新建'))
self.set_position_to_tabel(self.tableWidget_feedSeting.rowCount() - 1, 0, safe_position)
self.set_position_to_tabel(self.tableWidget_feedSeting.rowCount() - 1, 1, break_1_position)
self.set_position_to_tabel(self.tableWidget_feedSeting.rowCount() - 1, 2, break_2_position)
self.set_position_to_tabel(self.tableWidget_feedSeting.rowCount() - 1, 3, shake_position)
self.set_position_to_tabel(self.tableWidget_feedSeting.rowCount() - 1, 4, drop_bag_position)
break
def send_tabelFeedSet_delRow(self):
selectRow = self.tableWidget_feedSeting.currentRow()
if selectRow >= 0:
for feed_line_key, feed_line in self.feedLine_dict.items():
if feed_line_key == self.tableWidget_feedSeting.item(selectRow, 0).text():
self.feedLine_dict.pop(feed_line_key)
self.tableWidget_feedSeting.removeRow(selectRow)
break
else:
QMessageBox.information(self, "提示", "请选择要删除的行")
def send_tabelFeedSet_save(self):
count = len(self.feedLine_dict.keys())
self.configReader.read(Constant.set_ini)
self.configReader.set('Robot_Feed', 'LineCount', str(count))
writeFeedLine_to_ini(self.feedLine_dict, Constant.feedLine_set_file)
pass
def send_stopFeed_button_click(self): def send_stopFeed_button_click(self):
# 清空状态 # 清空状态
self.feeding.feedStatus = FeedStatus.FNone self.feeding.feedStatus = FeedStatus.FNone
@ -1387,7 +1215,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
def send_emergency_alarm_command(self): def send_emergency_alarm_command(self):
"""停止当前工作,需要启动""" """停止当前工作,需要启动"""
msg_box_person = QMessageBox() msg_box_person = QMessageBox(self)
msg_box_person.setIcon(QMessageBox.Icon.Question) msg_box_person.setIcon(QMessageBox.Icon.Question)
msg_box_person.setText("您确定要停止当前工作吗?") msg_box_person.setText("您确定要停止当前工作吗?")
msg_box_person.setWindowTitle("提示") msg_box_person.setWindowTitle("提示")
@ -1468,9 +1296,15 @@ class MainWindow(QMainWindow, Ui_MainWindow):
position_origin.status = 1 position_origin.status = 1
return_positions.insert(0,position_origin) return_positions.insert(0,position_origin)
if self.feedLine_dict.keys().__contains__(line_head): if self.feedLine_dict.keys().__contains__(line_head):
self.feeding.feedConfig= FeedingConfig(0, FeedLine(self.feedLine_dict[line_head].id, self.feedLine_dict[line_head].name, self.feeding.feedConfig= FeedingConfig(
return_positions,self.remain_Count), 0,
self.feeding.robotClient.photo_locs[:],self.remain_Count) FeedLine(
self.feedLine_dict[line_head].id,
self.feedLine_dict[line_head].name,
return_positions,
self.remain_Count
)
,self.feeding.robotClient.photo_locs[:],self.remain_Count,None)
else: else:
log.log_message(logging.ERROR, Constant.str_feed_reset_no_line_error) log.log_message(logging.ERROR, Constant.str_feed_reset_no_line_error)
return return
@ -1488,78 +1322,6 @@ class MainWindow(QMainWindow, Ui_MainWindow):
self.send_clear_auto_command() self.send_clear_auto_command()
self.send_emergency_alarm_command() self.send_emergency_alarm_command()
def send_tabelFeedSet_itemChanged(self, item):
row = item.row()
column = item.column()
value = item.text()
head = self.tableWidget_feedSeting.item(row, 0).text()
if column == 1:
self.feedLine_dict[head].name = value
elif column == (0 + self.tableWidget_feedSeting_addtional_col_num):
self.feedLine_dict[head].safe_position.X = float(value)
elif column == (1 + self.tableWidget_feedSeting_addtional_col_num):
self.feedLine_dict[head].safe_position.Y = float(value)
elif column == (2 + self.tableWidget_feedSeting_addtional_col_num):
self.feedLine_dict[head].safe_position.Z = float(value)
elif column == (3 + self.tableWidget_feedSeting_addtional_col_num):
self.feedLine_dict[head].safe_position.U = float(value)
elif column == (4 + self.tableWidget_feedSeting_addtional_col_num):
self.feedLine_dict[head].safe_position.V = float(value)
elif column == (5 + self.tableWidget_feedSeting_addtional_col_num):
self.feedLine_dict[head].safe_position.W = float(value)
# elif column == 7:
elif column == (6 + self.tableWidget_feedSeting_addtional_col_num):
self.feedLine_dict[head].broken1_position.X = float(value)
elif column == (7 + self.tableWidget_feedSeting_addtional_col_num):
self.feedLine_dict[head].broken1_position.Y = float(value)
elif column == (8 + self.tableWidget_feedSeting_addtional_col_num):
self.feedLine_dict[head].broken1_position.Z = float(value)
elif column == (9 + self.tableWidget_feedSeting_addtional_col_num):
self.feedLine_dict[head].broken1_position.U = float(value)
elif column == (10 + self.tableWidget_feedSeting_addtional_col_num):
self.feedLine_dict[head].broken1_position.V = float(value)
elif column == (11 + self.tableWidget_feedSeting_addtional_col_num):
self.feedLine_dict[head].broken1_position.W = float(value)
elif column == (12 + self.tableWidget_feedSeting_addtional_col_num):
self.feedLine_dict[head].broken2_position.X = float(value)
elif column == (13 + self.tableWidget_feedSeting_addtional_col_num):
self.feedLine_dict[head].broken2_position.Y = float(value)
elif column == (14 + self.tableWidget_feedSeting_addtional_col_num):
self.feedLine_dict[head].broken2_position.Z = float(value)
elif column == (15 + self.tableWidget_feedSeting_addtional_col_num):
self.feedLine_dict[head].broken2_position.U = float(value)
elif column == (16 + self.tableWidget_feedSeting_addtional_col_num):
self.feedLine_dict[head].broken2_position.V = float(value)
elif column == (17 + self.tableWidget_feedSeting_addtional_col_num):
self.feedLine_dict[head].broken2_position.W = float(value)
elif column == (18 + self.tableWidget_feedSeting_addtional_col_num):
self.feedLine_dict[head].shake_position.X = float(value)
elif column == (19 + self.tableWidget_feedSeting_addtional_col_num):
self.feedLine_dict[head].shake_position.Y = float(value)
elif column == (20 + self.tableWidget_feedSeting_addtional_col_num):
self.feedLine_dict[head].shake_position.Z = float(value)
elif column == (21 + self.tableWidget_feedSeting_addtional_col_num):
self.feedLine_dict[head].shake_position.U = float(value)
elif column == (22 + self.tableWidget_feedSeting_addtional_col_num):
self.feedLine_dict[head].shake_position.V = float(value)
elif column == (23 + self.tableWidget_feedSeting_addtional_col_num):
self.feedLine_dict[head].shake_position.W = float(value)
elif column == (24 + self.tableWidget_feedSeting_addtional_col_num):
self.feedLine_dict[head].drop_bag_position.X = float(value)
elif column == (25 + self.tableWidget_feedSeting_addtional_col_num):
self.feedLine_dict[head].drop_bag_position.Y = float(value)
elif column == (26 + self.tableWidget_feedSeting_addtional_col_num):
self.feedLine_dict[head].drop_bag_position.Z = float(value)
elif column == (27 + self.tableWidget_feedSeting_addtional_col_num):
self.feedLine_dict[head].drop_bag_position.U = float(value)
elif column == (28 + self.tableWidget_feedSeting_addtional_col_num):
self.feedLine_dict[head].drop_bag_position.V = float(value)
elif column == (29 + self.tableWidget_feedSeting_addtional_col_num):
self.feedLine_dict[head].drop_bag_position.W = float(value)
def run(self): def run(self):
# 主线程的逻辑就是 feeding.run() 接口和错误状态处理 # 主线程的逻辑就是 feeding.run() 接口和错误状态处理
while self.thread_signal: while self.thread_signal:
@ -1581,7 +1343,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
self.feeding.feedConfig = command.feed_config self.feeding.feedConfig = command.feed_config
# 开启传感器线程检测相关 # 开启传感器线程检测相关
self.relay_controller.pause_start_sensor(False) self.relay_controller.pause_start_sensor(False)
self.feeding.feedStatus = FeedStatus.FStart # ✅ 投料开始,会触发传感器线程启动 self.feeding.feedStatus = FeedStatus.FStart
command.status = Status.Runing command.status = Status.Runing
self.record_remain_num() self.record_remain_num()
@ -1677,7 +1439,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
# self.send_pause_command(True) # self.send_pause_command(True)
# self.feeding.pause = True # self.feeding.pause = True
# self.relay_controller.pause_start_sensor(True) # self.relay_controller.pause_start_sensor(True)
msg_box_finish = QMessageBox() msg_box_finish = QMessageBox(self)
msg_box_finish.setIcon(QMessageBox.Icon.Warning) msg_box_finish.setIcon(QMessageBox.Icon.Warning)
msg_box_finish.setText("码垛完成,请移走拖板") msg_box_finish.setText("码垛完成,请移走拖板")
msg_box_finish.setWindowTitle("提示") msg_box_finish.setWindowTitle("提示")
@ -1839,8 +1601,6 @@ class MainWindow(QMainWindow, Ui_MainWindow):
self.label_status_toolIndex.setText(str(self.robotClient.status_model.toolCoord)) self.label_status_toolIndex.setText(str(self.robotClient.status_model.toolCoord))
self.label_status_speed.setText(str(self.robotClient.status_model.curSpeed_n)) self.label_status_speed.setText(str(self.robotClient.status_model.curSpeed_n))
def updateUI_Position(self): def updateUI_Position(self):
self.horizontalSlider_J1.setValue(self.status_address.axis_0) self.horizontalSlider_J1.setValue(self.status_address.axis_0)
self.horizontalSlider_J2.setValue(self.status_address.axis_1) self.horizontalSlider_J2.setValue(self.status_address.axis_1)
@ -1862,19 +1622,6 @@ class MainWindow(QMainWindow, Ui_MainWindow):
self.horizontalSlider_J5.setValue(self.status_address.axis_4) self.horizontalSlider_J5.setValue(self.status_address.axis_4)
self.horizontalSlider_J6.setValue(self.status_address.axis_5) self.horizontalSlider_J6.setValue(self.status_address.axis_5)
def set_position_to_tabel(self, row_i, position_j, real_Position: Real_Position):
self.tableWidget_feedSeting.setItem(row_i, position_j * 6 + self.tableWidget_feedSeting_addtional_col_num,
QTableWidgetItem(str(real_Position.X)))
self.tableWidget_feedSeting.setItem(row_i, position_j * 6 + 1 + self.tableWidget_feedSeting_addtional_col_num,
QTableWidgetItem(str(real_Position.Y)))
self.tableWidget_feedSeting.setItem(row_i, position_j * 6 + 2 + self.tableWidget_feedSeting_addtional_col_num,
QTableWidgetItem(str(real_Position.Z)))
self.tableWidget_feedSeting.setItem(row_i, position_j * 6 + 3 + self.tableWidget_feedSeting_addtional_col_num,
QTableWidgetItem(str(real_Position.U)))
self.tableWidget_feedSeting.setItem(row_i, position_j * 6 + 4 + self.tableWidget_feedSeting_addtional_col_num,
QTableWidgetItem(str(real_Position.V)))
self.tableWidget_feedSeting.setItem(row_i, position_j * 6 + 5 + self.tableWidget_feedSeting_addtional_col_num,
QTableWidgetItem(str(real_Position.W)))
def updateUI_frame_sign(self,sign:FeedStatus): def updateUI_frame_sign(self,sign:FeedStatus):
# print("start") # print("start")
if sign == FeedStatus.FNone: if sign == FeedStatus.FNone:
@ -1941,8 +1688,6 @@ class MainWindow(QMainWindow, Ui_MainWindow):
except Exception as e: except Exception as e:
print(e) print(e)
def set_run_status_button(self, isRuning: bool): def set_run_status_button(self, isRuning: bool):
self.pushButton_pauseFeed.setText("暂停") self.pushButton_pauseFeed.setText("暂停")
##self.pushButton_startFeed.setEnabled(False) ##self.pushButton_startFeed.setEnabled(False)
@ -2207,6 +1952,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
log.log_message(logging.INFO, f'设置拍照点5:{x5},{y5},{z5}') log.log_message(logging.INFO, f'设置拍照点5:{x5},{y5},{z5}')
except: except:
self.show_infomessage_box("设置拍照点5失败") self.show_infomessage_box("设置拍照点5失败")
def set_origin_button_click(self): def set_origin_button_click(self):
try: try:
x = float(self.lineEdit_origin_x.text()) x = float(self.lineEdit_origin_x.text())
@ -2231,8 +1977,6 @@ class MainWindow(QMainWindow, Ui_MainWindow):
log.log_message(logging.ERROR, f'设置原点失败') log.log_message(logging.ERROR, f'设置原点失败')
self.show_infomessage_box("设置原点失败") self.show_infomessage_box("设置原点失败")
def updateUI_Photo_Set(self): def updateUI_Photo_Set(self):
self.lineEdit_x1.setText(str(self.robotClient.photo_locs[0][0])) self.lineEdit_x1.setText(str(self.robotClient.photo_locs[0][0]))
self.lineEdit_y1.setText(str(self.robotClient.photo_locs[0][1])) self.lineEdit_y1.setText(str(self.robotClient.photo_locs[0][1]))