diff --git a/Fedding.py b/Fedding.py index ebcc302..d2e2ace 100644 --- a/Fedding.py +++ b/Fedding.py @@ -455,12 +455,17 @@ class FeedingControlSystem: if not self._check_device_connectivity(): print("关键设备连接失败,无法开始下料") return - # 先进行上料斗向下料斗下料 print("开始分步下料过程") + # 重置计数器 + self.lower_feeding_cycle = 0 # 用于记录三阶段下料次数 + self.upper_feeding_count = 0 # 用于记录上料次数 + + # 第一次上料(总共需要上料2次) self.transfer_material_from_upper_to_lower() + + # 等待模具车对齐并开始第一轮下料 self.lower_feeding_stage = 4 # 从等待模具车对齐开始 - self.upper_feeding_count = 0 self.wait_for_vehicle_alignment() def _check_device_connectivity(self): @@ -501,20 +506,76 @@ class FeedingControlSystem: return False def transfer_material_from_upper_to_lower(self): - """上料斗向下料斗下料""" + """上料斗向下料斗下料(基于上料斗重量传感器控制)""" print(f"上料斗向下料斗下料 (第 {self.upper_feeding_count + 1} 次)") + # 记录下料前的重量 + initial_upper_weight = self.read_transmitter_data_via_relay(1) + + # 如果无法读取重量,直接报错 + if initial_upper_weight is None: + raise Exception("无法读取上料斗重量传感器数据,下料操作终止") + + target_upper_weight = initial_upper_weight - self.single_batch_weight + target_upper_weight = max(target_upper_weight, 0) # 确保不低于0 + + print(f"上料斗初始重量: {initial_upper_weight:.2f}kg, 目标重量: {target_upper_weight:.2f}kg") + # 确保下料斗出砼门关闭 self.control_relay(self.DOOR_LOWER_2, 'close') # 打开上料斗出砼门 self.control_relay(self.DOOR_LOWER_1, 'open') - # 等待物料流入下料斗(根据实际情况调整时间) - time.sleep(3) + # 等待物料流入下料斗,基于上料斗重量变化控制 + start_time = time.time() + timeout = 30 # 30秒超时 + + while time.time() - start_time < timeout: + current_upper_weight = self.read_transmitter_data_via_relay(1) + + # 如果无法读取重量,继续尝试 + if current_upper_weight is None: + print("无法读取上料斗重量,继续尝试...") + time.sleep(1) + continue + + print(f"上料斗当前重量: {current_upper_weight:.2f}kg") + + # 如果达到目标重量,则关闭上料斗出砼门 + if current_upper_weight <= target_upper_weight + 50: # 允许50kg的误差范围 + print(f"达到目标重量,当前重量: {current_upper_weight:.2f}kg") + break + elif time.time() - start_time > 25: # 如果25秒后重量变化过小 + weight_change = initial_upper_weight - current_upper_weight + if weight_change < 100: # 如果重量变化小于100kg + print("重量变化过小,可能存在堵塞,交由监控系统处理...") + # 不再在这里直接处理破拱,而是依靠监控系统处理 + break + + time.sleep(1) # 关闭上料斗出砼门 self.control_relay(self.DOOR_LOWER_1, 'close') + # 验证下料结果 + final_upper_weight = self.read_transmitter_data_via_relay(1) + if final_upper_weight is not None: + actual_transferred = initial_upper_weight - final_upper_weight + print(f"实际下料重量: {actual_transferred:.2f}kg") + + # 增加上料计数 + self.upper_feeding_count += 1 + print("上料斗下料完成") + + # 关闭上料斗出砼门 + self.control_relay(self.DOOR_LOWER_1, 'close') + + # 验证下料结果 + final_upper_weight = self.read_transmitter_data_via_relay(1) + if final_upper_weight is not None: + actual_transferred = initial_upper_weight - final_upper_weight + print(f"实际下料重量: {actual_transferred:.2f}kg") + # 增加上料计数 self.upper_feeding_count += 1 print("上料斗下料完成") @@ -532,11 +593,9 @@ class FeedingControlSystem: break time.sleep(self.alignment_check_interval) - def feeding_stage_one(self): """第一阶段下料:下料斗向模具车下料(低速)""" print("开始第一阶段下料:下料斗低速下料") - self.lower_feeding_cycle = 1 self.set_inverter_frequency_via_relay(self.frequencies[0]) self.control_inverter_via_relay('start') @@ -549,7 +608,7 @@ class FeedingControlSystem: initial_weight = self.read_transmitter_data_via_relay(2) if initial_weight is None: print("无法获取初始重量,取消下料") - self.finish_current_batch() + self.finish_feeding_process() # 直接结束整个流程,而不是当前批次 return target_weight = initial_weight + self.single_batch_weight @@ -560,7 +619,7 @@ class FeedingControlSystem: self.lower_weight_error_count += 1 if self.lower_weight_error_count >= self.max_error_count: print("下料斗传感器连续读取失败,停止下料") - self.finish_current_batch() + self.finish_feeding_process() # 直接结束整个流程 return else: self.lower_weight_error_count = 0 @@ -574,7 +633,6 @@ class FeedingControlSystem: def feeding_stage_two(self): """第二阶段下料:下料斗向模具车下料(中速)""" print("开始第二阶段下料:下料斗中速下料") - self.lower_feeding_cycle = 2 self.set_inverter_frequency_via_relay(self.frequencies[1]) # 保持下料斗出砼门打开 @@ -586,7 +644,7 @@ class FeedingControlSystem: initial_weight = self.read_transmitter_data_via_relay(2) if initial_weight is None: print("无法获取初始重量,取消下料") - self.finish_current_batch() + self.finish_feeding_process() # 直接结束整个流程 return target_weight = initial_weight + self.single_batch_weight @@ -597,7 +655,7 @@ class FeedingControlSystem: self.lower_weight_error_count += 1 if self.lower_weight_error_count >= self.max_error_count: print("下料斗传感器连续读取失败,停止下料") - self.finish_current_batch() + self.finish_feeding_process() # 直接结束整个流程 return else: self.lower_weight_error_count = 0 @@ -611,7 +669,6 @@ class FeedingControlSystem: def feeding_stage_three(self): """第三阶段下料:下料斗向模具车下料(高速)""" print("开始第三阶段下料:下料斗高速下料") - self.lower_feeding_cycle = 3 self.set_inverter_frequency_via_relay(self.frequencies[2]) # 保持下料斗出砼门打开 @@ -623,7 +680,7 @@ class FeedingControlSystem: initial_weight = self.read_transmitter_data_via_relay(2) if initial_weight is None: print("无法获取初始重量,取消下料") - self.finish_current_batch() + self.finish_feeding_process() # 直接结束整个流程 return target_weight = initial_weight + self.single_batch_weight @@ -634,7 +691,7 @@ class FeedingControlSystem: self.lower_weight_error_count += 1 if self.lower_weight_error_count >= self.max_error_count: print("下料斗传感器连续读取失败,停止下料") - self.finish_current_batch() + self.finish_feeding_process() # 直接结束整个流程 return else: self.lower_weight_error_count = 0 @@ -651,26 +708,42 @@ class FeedingControlSystem: self.control_inverter_via_relay('stop') self.control_relay(self.DOOR_LOWER_1, 'close') self.control_relay(self.DOOR_LOWER_2, 'close') - self.upper_feeding_count = 0 - # 检查上料斗剩余重量 - upper_weight = self.read_transmitter_data_via_relay(1) - if upper_weight is not None and upper_weight < (self.single_batch_weight + self.min_required_weight): - print("上料斗剩余重量不足,需要返回搅拌楼要料") - self.lower_feeding_stage = 3 # 等待上料 - self.return_upper_door() # 返回上料斗 - self.request_material_from_mixing_building() # 请求要料 - else: - print("上料斗仍有足够物料,等待下一个模具车") - self.lower_feeding_stage = 4 # 等待模具车对齐 - self.wait_for_vehicle_alignment() + + # 增加三阶段下料轮次计数 + self.lower_feeding_cycle += 1 + + # 检查是否完成两轮三阶段下料(总共5吨) + if self.lower_feeding_cycle >= 2: + # 完成整个5吨下料任务 + print("完成两轮三阶段下料,5吨下料任务完成") + self.finish_feeding_process() + return + + # 如果只完成一轮三阶段下料,进行第二次上料 + print("第一轮三阶段下料完成,准备第二次上料") + # 上料斗第二次向下料斗下料 + try: + self.transfer_material_from_upper_to_lower() + except Exception as e: + print(f"第二次上料失败: {e}") + print("停止下料流程") + self.finish_feeding_process() # 出现严重错误时结束整个流程 + return + + # 继续等待当前模具车对齐(不需要重新等待对齐,因为是同一辆模具车) + print("第二次上料完成,继续三阶段下料") + self.lower_feeding_stage = 1 # 直接进入第一阶段下料 + self.feeding_stage_one() # 开始第二轮第一阶段下料 + def finish_feeding_process(self): """完成整个下料流程""" print("整个下料流程完成") self.lower_feeding_stage = 0 + self.lower_feeding_cycle = 0 self.upper_feeding_count = 0 - self.return_upper_door_to_default() # 上料斗回到默认位置 + self.return_upper_door_to_default() def handle_overflow_control(self, overflow_detected, door_opening_large): """处理溢料控制""" @@ -690,7 +763,7 @@ class FeedingControlSystem: current_time = time.time() # 检查下料斗破拱(只有在下料过程中才检查) - if self.lower_feeding_stage in [1, 2]: + if self.lower_feeding_stage in [1, 2, 3]: # 在所有下料阶段检查 lower_weight = self.read_transmitter_data_via_relay(2) if lower_weight is not None: # 检查重量变化是否过慢(小于0.1kg变化且时间超过10秒) @@ -703,10 +776,9 @@ class FeedingControlSystem: self.last_lower_weight = lower_weight - # 检查上料斗破拱(只有在上料斗给下料斗下料时才检查) + # 检查上料斗破拱(在上料斗向下料斗下料时检查) if (self.upper_door_position == 'over_lower' and - self.lower_feeding_stage in [1, 2] and - self.is_lower_door_open()): + self.lower_feeding_stage in [0, 1, 2, 3, 4]): # 在任何阶段都可能需要上料斗破拱 upper_weight = self.read_transmitter_data_via_relay(1) if upper_weight is not None: # 检查重量变化是否过慢(小于0.1kg变化且时间超过10秒)