feeding
This commit is contained in:
@ -1,5 +1,6 @@
|
||||
# feeding/controller.py
|
||||
import time
|
||||
from core.state import FeedStatus
|
||||
from feeding.process import FeedingProcess
|
||||
from busisness.blls import ArtifactBll
|
||||
|
||||
@ -49,10 +50,11 @@ class FeedingController:
|
||||
self.state._upper_door_position = 'over_lower'
|
||||
self.state.upper_weight_error_count = 0
|
||||
# 判断是否需要要料:当前重量 < 目标重量 + 缓冲重量
|
||||
if current_weight < (self.settings.single_batch_weight + self.settings.min_required_weight):
|
||||
print("上料斗重量不足,通知搅拌楼要料")
|
||||
self.request_material_from_mixing_building() # 请求搅拌楼下料
|
||||
return True
|
||||
if self.state.feed_status != FeedStatus.FUpperToLower:
|
||||
if current_weight < (self.settings.min_required_weight):
|
||||
print("上料斗重量不足,通知搅拌楼要料")
|
||||
self.request_material_from_mixing_building() # 请求搅拌楼下料
|
||||
return True
|
||||
return False
|
||||
|
||||
def request_material_from_mixing_building(self):
|
||||
@ -115,68 +117,89 @@ class FeedingController:
|
||||
视觉控制主逻辑
|
||||
"""
|
||||
# 检测是否溢料
|
||||
overflow = self.vision_detector.detect_overflow(current_frame)
|
||||
|
||||
# 获取当前角度
|
||||
self.state.overflow_detected = self.vision_detector.detect_overflow(current_frame)
|
||||
overflow=self.state.overflow_detected in ["大堆料", "小堆料"]
|
||||
current_angle = self.vision_detector.detect_angle(image=current_frame)
|
||||
|
||||
if current_angle is None:
|
||||
print("无法获取当前角度,跳过本次调整")
|
||||
return
|
||||
|
||||
print(f"当前角度: {current_angle:.2f}°, 溢料状态: {overflow}, 控制模式: {self.state.angle_control_mode}")
|
||||
|
||||
# 状态机控制逻辑
|
||||
if self.state.angle_control_mode == "normal":
|
||||
# 正常模式
|
||||
if overflow and current_angle > self.settings.angle_threshold:
|
||||
# 检测到堆料且角度过大,进入角度减小模式
|
||||
print("检测到堆料且角度过大,关闭出砼门开始减小角度")
|
||||
self.relay_controller.control(self.relay_controller.DOOR_LOWER_2, 'close')
|
||||
self.state.angle_control_mode = "reducing"
|
||||
else:
|
||||
# 保持正常开门
|
||||
self.relay_controller.control(self.relay_controller.DOOR_LOWER_2, 'open')
|
||||
|
||||
elif self.state.angle_control_mode == "reducing":
|
||||
# 角度减小模式
|
||||
if current_angle <= self.settings.target_angle + self.settings.angle_tolerance:
|
||||
# 角度已达到目标范围
|
||||
if overflow:
|
||||
# 仍有堆料,进入维持模式
|
||||
print(f"角度已降至{current_angle:.2f}°,仍有堆料,进入维持模式")
|
||||
self.state.angle_control_mode = "maintaining"
|
||||
self.relay_controller.control(self.relay_controller.DOOR_LOWER_2, 'open') # 先打开门
|
||||
else:
|
||||
# 无堆料,恢复正常模式
|
||||
print(f"角度已降至{current_angle:.2f}°,无堆料,恢复正常模式")
|
||||
self.relay_controller.control(self.relay_controller.DOOR_LOWER_2, 'open')
|
||||
self.state.angle_control_mode = "normal"
|
||||
|
||||
elif self.state.angle_control_mode == "maintaining":
|
||||
# 维持模式 - 使用脉冲控制
|
||||
if not overflow:
|
||||
# 堆料已消除,恢复正常模式
|
||||
print("堆料已消除,恢复正常模式")
|
||||
self.relay_controller.control(self.relay_controller.DOOR_LOWER_2, 'open')
|
||||
self.state.angle_control_mode = "normal"
|
||||
else:
|
||||
# 继续维持角度控制
|
||||
self.pulse_control_door_for_maintaining()
|
||||
|
||||
elif self.state.angle_control_mode == "recovery":
|
||||
# 恢复模式 - 逐步打开门
|
||||
if overflow:
|
||||
# 又出现堆料,回到角度减小模式
|
||||
print("恢复过程中又检测到堆料,回到角度减小模式")
|
||||
self.state.angle_control_mode = "maintaining"
|
||||
else:
|
||||
# 堆料已消除,恢复正常模式
|
||||
print("堆料已消除,恢复正常模式")
|
||||
self.relay_controller.control(self.relay_controller.DOOR_LOWER_2, 'open')
|
||||
self.state.angle_control_mode = "normal"
|
||||
|
||||
self.state.last_angle = current_angle
|
||||
print(f"当前角度: {current_angle:.2f}°, 溢料状态: {overflow}, 溢料返回: {self.state.overflow_detected}")
|
||||
return
|
||||
if self.state.overflow_detected!="浇筑满":
|
||||
if current_angle is None:
|
||||
print("无法获取当前角度,跳过本次调整")
|
||||
return
|
||||
|
||||
print(f"当前角度: {current_angle:.2f}°, 溢料状态: {overflow}, 控制模式: {self.state.angle_control_mode}")
|
||||
|
||||
# 状态机控制逻辑
|
||||
if self.state.angle_control_mode == "normal":
|
||||
# 正常模式大于self.settings.angle_threshold=60度
|
||||
if overflow and current_angle > self.settings.angle_threshold:
|
||||
# 检测到堆料且角度过大,进入角度减小模式
|
||||
print("检测到堆料且角度过大,关闭出砼门开始减小角度")
|
||||
self.relay_controller.control(self.relay_controller.DOOR_LOWER_OPEN, 'close')
|
||||
self.relay_controller.control(self.relay_controller.DOOR_LOWER_CLOSE, 'open')
|
||||
self.state.angle_control_mode = "reducing"
|
||||
else:
|
||||
# 保持正常开门
|
||||
self.relay_controller.control(self.relay_controller.DOOR_LOWER_OPEN, 'open')
|
||||
if current_angle >self.settings.target_angle:
|
||||
# 角度已降至目标范围,关闭出砼门
|
||||
self.relay_controller.control(self.relay_controller.DOOR_LOWER_OPEN, 'close')
|
||||
self.relay_controller.control(self.relay_controller.DOOR_LOWER_CLOSE, 'open')
|
||||
else:
|
||||
self.relay_controller.control(self.relay_controller.DOOR_LOWER_OPEN, 'open')
|
||||
self.relay_controller.control(self.relay_controller.DOOR_LOWER_CLOSE, 'close')
|
||||
|
||||
elif self.state.angle_control_mode == "reducing":
|
||||
# 角度减小模式
|
||||
if current_angle <= self.settings.target_angle + self.settings.angle_tolerance:
|
||||
# 角度已达到目标范围
|
||||
if overflow:
|
||||
# 仍有堆料,进入维持模式
|
||||
print(f"角度已降至{current_angle:.2f}°,仍有堆料,进入维持模式")
|
||||
self.state.angle_control_mode = "maintaining"
|
||||
self.relay_controller.control(self.relay_controller.DOOR_LOWER_OPEN, 'close')
|
||||
self.relay_controller.control(self.relay_controller.DOOR_LOWER_CLOSE, 'open') # 先打开门
|
||||
else:
|
||||
# 无堆料,恢复正常模式
|
||||
print(f"角度已降至{current_angle:.2f}°,无堆料,恢复正常模式")
|
||||
self.relay_controller.control(self.relay_controller.DOOR_LOWER_OPEN, 'open')
|
||||
self.relay_controller.control(self.relay_controller.DOOR_LOWER_CLOSE, 'close')
|
||||
self.state.angle_control_mode = "normal"
|
||||
|
||||
elif self.state.angle_control_mode == "maintaining":
|
||||
# 维持模式 - 使用脉冲控制
|
||||
if not overflow:
|
||||
# 堆料已消除,恢复正常模式
|
||||
print("堆料已消除,恢复正常模式")
|
||||
self.relay_controller.control(self.relay_controller.DOOR_LOWER_OPEN, 'open')
|
||||
self.relay_controller.control(self.relay_controller.DOOR_LOWER_CLOSE, 'close')
|
||||
self.state.angle_control_mode = "normal"
|
||||
else:
|
||||
# 继续维持角度控制
|
||||
self.pulse_control_door_for_maintaining()
|
||||
|
||||
elif self.state.angle_control_mode == "recovery":
|
||||
# 恢复模式 - 逐步打开门
|
||||
if overflow:
|
||||
# 又出现堆料,回到角度减小模式
|
||||
print("恢复过程中又检测到堆料,回到角度减小模式")
|
||||
self.state.angle_control_mode = "maintaining"
|
||||
else:
|
||||
# 堆料已消除,恢复正常模式
|
||||
print("堆料已消除,恢复正常模式")
|
||||
self.relay_controller.control(self.relay_controller.DOOR_LOWER_OPEN, 'open')
|
||||
self.relay_controller.control(self.relay_controller.DOOR_LOWER_CLOSE, 'close')
|
||||
self.state.angle_control_mode = "normal"
|
||||
else:
|
||||
self.relay_controller.control(self.relay_controller.DOOR_LOWER_OPEN, 'close')
|
||||
self.relay_controller.control(self.relay_controller.DOOR_LOWER_CLOSE, 'open')
|
||||
time.sleep(5)
|
||||
self.relay_controller.control(self.relay_controller.DOOR_LOWER_CLOSE, 'close')
|
||||
|
||||
|
||||
def pulse_control_door_for_maintaining(self):
|
||||
"""
|
||||
@ -185,8 +208,10 @@ class FeedingController:
|
||||
"""
|
||||
print("执行维持脉冲控制")
|
||||
# 关门1秒
|
||||
self.relay_controller.control(self.relay_controller.DOOR_LOWER_2, 'close')
|
||||
self.relay_controller.control(self.relay_controller.DOOR_LOWER_OPEN, 'close')
|
||||
self.relay_controller.control(self.relay_controller.DOOR_LOWER_CLOSE, 'open')
|
||||
time.sleep(1.0)
|
||||
# 开门1秒
|
||||
self.relay_controller.control(self.relay_controller.DOOR_LOWER_2, 'open')
|
||||
self.relay_controller.control(self.relay_controller.DOOR_LOWER_OPEN, 'open')
|
||||
self.relay_controller.control(self.relay_controller.DOOR_LOWER_CLOSE, 'close')
|
||||
time.sleep(1.0)
|
||||
|
||||
Reference in New Issue
Block a user