This commit is contained in:
2025-11-21 14:55:52 +08:00
parent e3ecd0550f
commit 26ed8df502
36 changed files with 908 additions and 433 deletions

View File

@ -3,12 +3,13 @@ import time
from core.state import FeedStatus
from feeding.process import FeedingProcess
from busisness.blls import ArtifactBll
from config.settings import app_set_config
class FeedingController:
def __init__(self, relay_controller, inverter_controller,
transmitter_controller, vision_detector,
camera_controller, rfid_controller,state, settings):
camera_controller, rfid_controller,state):
self.relay_controller = relay_controller
self.inverter_controller = inverter_controller
self.transmitter_controller = transmitter_controller
@ -16,14 +17,13 @@ class FeedingController:
self.camera_controller = camera_controller
self.rfid_controller = rfid_controller
self.state = state
self.settings = settings
self.artifact_bll = ArtifactBll()
# 初始化下料流程
self.process = FeedingProcess(
relay_controller, inverter_controller,
transmitter_controller, vision_detector,
camera_controller, state, settings
camera_controller, state
)
@ -42,19 +42,21 @@ class FeedingController:
if current_weight is None:
self.state.upper_weight_error_count += 1
print(f"上料斗重量读取失败,错误计数: {self.state.upper_weight_error_count}")
if self.state.upper_weight_error_count >= self.settings.max_error_count:
if self.state.upper_weight_error_count >= app_set_config.max_error_count:
print("警告:上料斗传感器连续读取失败,请检查连接")
return False
#需要搅拌楼通知下完料后移到上料斗上方
if self.state._upper_door_position != 'over_lower':
self.state._upper_door_position = 'over_lower'
self.state.upper_weight_error_count = 0
# 判断是否需要要料:当前重量 < 目标重量 + 缓冲重量
if self.state.feed_status != FeedStatus.FUpperToLower:
if current_weight < (self.settings.min_required_weight):
if self.state._feed_status != FeedStatus.FUpperToLower:
if current_weight < (app_set_config.min_required_weight):
print("上料斗重量不足,通知搅拌楼要料")
self.request_material_from_mixing_building() # 请求搅拌楼下料
return True
else:
if self.state._upper_door_position != 'over_lower':
self.state._upper_door_position = 'over_lower'
return False
def request_material_from_mixing_building(self):
@ -62,7 +64,7 @@ class FeedingController:
请求搅拌楼下料
"""
print("发送要料请求至搅拌楼...")
# self.settings.
#
self.process.return_upper_door_to_default()
@ -73,35 +75,35 @@ class FeedingController:
def check_arch_blocking(self):
"""检查是否需要破拱"""
current_time = time.time()
# 检查下料斗破拱(只有在下料过程中才检查)
if self.state._lower_feeding_stage in [1, 2, 3]: # 在所有下料阶段检查
lower_weight = self.transmitter_controller.read_data(2)
if lower_weight is not None:
# 检查重量变化是否过慢小于0.1kg变化且时间超过10秒
if (abs(lower_weight - self.state.last_lower_weight) < 0.1) and \
(current_time - self.state.last_weight_time) > 10:
print("下料斗可能堵塞,启动破拱")
self.state._lower_is_arch_=True
self.relay_controller.control(self.relay_controller.BREAK_ARCH_LOWER, 'open')
time.sleep(2)
self.relay_controller.control(self.relay_controller.BREAK_ARCH_LOWER, 'close')
self.state._lower_is_arch_=False
# if self.state.lower_feeding_stage in [1, 2, 3]: # 在所有下料阶段检查
# lower_weight = self.transmitter_controller.read_data(2)
# if lower_weight is not None:
# # 检查重量变化是否过慢小于0.1kg变化且时间超过10秒
# if (abs(lower_weight - self.state.last_lower_weight) < 0.1) and \
# (current_time - self.state.last_weight_time) > 10:
# print("下料斗可能堵塞,启动破拱")
# self.state._lower_is_arch_=True
# self.relay_controller.control(self.relay_controller.BREAK_ARCH_LOWER, 'open')
# time.sleep(2)
# self.relay_controller.control(self.relay_controller.BREAK_ARCH_LOWER, 'close')
# self.state._lower_is_arch_=False
self.state.last_lower_weight = lower_weight
# self.state.last_lower_weight = lower_weight
# 检查上料斗破拱(在上料斗向下料斗下料时检查)
if (self.state._upper_door_position == 'over_lower' and
self.state._lower_feeding_stage in [0, 1, 2, 3, 4]): # 在任何阶段都可能需要上料斗破拱
if self.state._feed_status == FeedStatus.FUpperToLower: # 在任何阶段都可能需要上料斗破拱
print('上料斗振动线程启用中...')
upper_weight = self.transmitter_controller.read_data(1)
if upper_weight is not None:
# 检查重量变化是否过慢小于0.1kg变化且时间超过10秒
if (abs(upper_weight - self.state.last_upper_weight) < 0.1) and \
(current_time - self.state.last_weight_time) > 10:
# 检查重量变化是否过慢小于0.1kg变化且时间超过10秒,觉得有点小。改成
if (abs(upper_weight - self.state.last_upper_weight) < 100) and \
(current_time - self.state.last_weight_time) > 5:
print("上料斗可能堵塞,启动破拱")
self.state._upper_is_arch_=True
self.relay_controller.control(self.relay_controller.BREAK_ARCH_UPPER, 'open')
time.sleep(2)
time.sleep(5)
self.relay_controller.control(self.relay_controller.BREAK_ARCH_UPPER, 'close')
self.state._upper_is_arch_=False
@ -124,6 +126,7 @@ class FeedingController:
print("无法获取当前角度,跳过本次调整")
return
self.state.last_angle = current_angle
self.state._lower_angle=current_angle
print(f"当前角度: {current_angle:.2f}°, 溢料状态: {overflow}, 溢料返回: {self.state.overflow_detected}")
return
if self.state.overflow_detected!="浇筑满":
@ -135,17 +138,17 @@ class FeedingController:
# 状态机控制逻辑
if self.state.angle_control_mode == "normal":
# 正常模式大于self.settings.angle_threshold=60度
if overflow and current_angle > self.settings.angle_threshold:
# 正常模式大于app_set_config.angle_threshold=60度
if overflow and current_angle > app_set_config.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:
# 保持正常开门 30
# self.relay_controller.control(self.relay_controller.DOOR_LOWER_OPEN, 'open')
if current_angle >app_set_config.target_angle:
# 角度已降至目标范围,关闭出砼门
self.relay_controller.control(self.relay_controller.DOOR_LOWER_OPEN, 'close')
self.relay_controller.control(self.relay_controller.DOOR_LOWER_CLOSE, 'open')
@ -155,7 +158,7 @@ class FeedingController:
elif self.state.angle_control_mode == "reducing":
# 角度减小模式
if current_angle <= self.settings.target_angle + self.settings.angle_tolerance:
if current_angle <= app_set_config.target_angle + app_set_config.angle_tolerance:
# 角度已达到目标范围
if overflow:
# 仍有堆料,进入维持模式
@ -196,9 +199,7 @@ class FeedingController:
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')
self.relay_controller.control_lower_close()
def pulse_control_door_for_maintaining(self):