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):

View File

@ -5,11 +5,12 @@ from busisness.blls import ArtifactBll
from busisness.models import ArtifactInfoModel
import time
from datetime import datetime
from config.settings import app_set_config
class FeedingProcess:
def __init__(self, relay_controller, inverter_controller,
transmitter_controller, vision_detector,
camera_controller, state, settings):
camera_controller, state):
self.relay_controller = relay_controller
self.artifact_bll = ArtifactBll()
self.mould_service = MouldService()
@ -18,50 +19,60 @@ class FeedingProcess:
self.vision_detector = vision_detector
self.camera_controller = camera_controller
self.state = state
self.state.feed_status = FeedStatus.FNone
self.state._feed_status = FeedStatus.FCheckM
#标志位用,是否是第一次运行
self.is_first_flag=True
self.settings = settings
def start_feeding(self):
loc_state=self.state
loc_state._upper_weight=self.transmitter_controller.read_data(1)
loc_state._lower_weight=self.transmitter_controller.read_data(2)
"""开始生产管片"""
if loc_state.feed_status == FeedStatus.FNone:
loc_state.feed_status = FeedStatus.FCheckM
if loc_state._feed_status == FeedStatus.FNone:
# loc_state._feed_status = FeedStatus.FCheckM
return
elif loc_state.feed_status == FeedStatus.FCheckM:
elif loc_state._feed_status == FeedStatus.FCheckM:
"""开始生产管片"""
loc_state._lower_feeding_stage = 4
loc_state.lower_feeding_stage = 4
if self.settings.debug_feeding:
loc_state.feed_status = FeedStatus.FApiCheck
# if app_set_config.debug_feeding:
# loc_state._feed_status = FeedStatus.FApiCheck
if self.state.vehicle_aligned:
loc_state.feed_status = FeedStatus.FCheckGB
loc_state._feed_status = FeedStatus.FApiCheck
print("检查模车")
return
elif loc_state.feed_status == FeedStatus.FApiCheck:
elif loc_state._feed_status == FeedStatus.FApiCheck:
print("生产已开始")
time.sleep(2)
# time.sleep(2)
loc_modules = self.mould_service.get_not_pour_artifacts()
if loc_modules:
# 取第一个未浇筑的管片
#后续放入队列处理
loc_module = loc_modules[0]
#API
loc_module.Source = 1
loc_module.BeginTime=datetime.now()
self.artifact_bll.insert_artifact_task(loc_module)
self.state.current_artifact = loc_module
loc_state.current_artifact = loc_module
loc_state._mould_need_weight=loc_module.BetonVolume*self.state.density
print(f"已获取到未浇筑的管片:{loc_module.MouldCode}")
# self.artifact_bll.finish_artifact_task(loc_state.current_artifact.ArtifactID,1.92)
self.state.feed_status = FeedStatus.FCheckGB
loc_state._feed_status = FeedStatus.FCheckGB
else:
#未读取到AIP接口数据.
self.state.current_artifact = None
print("未获取到未浇筑的管片")
loc_artifacting_task=self.artifact_bll.get_artifacting_task()
if loc_artifacting_task:
loc_state.current_artifact = loc_artifacting_task
loc_state._mould_need_weight=loc_artifacting_task.BetonVolume*self.state.density
loc_state._feed_status = FeedStatus.FCheckGB
else:
self.state.current_artifact = None
return
elif loc_state.feed_status == FeedStatus.FRFID:
elif loc_state._feed_status == FeedStatus.FRFID:
print("生产已检查RFID")
#RFID格式模具编号,分块号,尺寸规格,方量
rfid_info =''
@ -71,7 +82,7 @@ class FeedingProcess:
loc.BetonVolume=1.56
if self.state.current_artifact:
#检测是否和RFID识别的管理一致
self.state.feed_status = FeedStatus.FCheckGB
loc_state._feed_status = FeedStatus.FCheckGB
else:
#以RFID为准
loc_module= ArtifactInfoModel()
@ -82,23 +93,23 @@ class FeedingProcess:
self.state.current_artifact = loc_module
#确认是否保存到数据库
self.state.feed_status = FeedStatus.FCheckGB
loc_state._feed_status = FeedStatus.FCheckGB
return
elif loc_state.feed_status == FeedStatus.FCheckGB:
elif loc_state._feed_status == FeedStatus.FCheckGB:
print("检查盖板对齐,")
time.sleep(10)
loc_state.feed_status = FeedStatus.FUpperToLower
# time.sleep(5)
loc_state._feed_status = FeedStatus.FUpperToLower
#计算本次生产需要的总重量
print(f"本次生产需要的总重量:{self.state._mould_need_weight}")
return
elif loc_state.feed_status == FeedStatus.FUpperToLower:
elif loc_state._feed_status == FeedStatus.FUpperToLower:
print("上料斗向下料斗转移")
#上料斗重量
loc_state.initial_upper_weight=self.transmitter_controller.read_data(1)
loc_state.initial_upper_weight=loc_state._upper_weight
#下料斗重量
loc_state.initial_lower_weight=self.transmitter_controller.read_data(2)
loc_state.initial_lower_weight=loc_state._lower_weight
#需要的总重量
loc_state._mould_need_weight=loc_state.current_artifact.BetonVolume*loc_state.density
# loc_state._mould_need_weight=loc_state.current_artifact.BetonVolume*loc_state.density
if loc_state._mould_need_weight > loc_state.initial_upper_weight + loc_state.initial_lower_weight:
# 等待上料斗重量增加(多久不够报警可能出现F块不足的情况)
print('重量不够,需要增加')
@ -114,40 +125,46 @@ class FeedingProcess:
# 最后一块F块前面多要0.25,0.3F块直接下料先多下0.3后续)
# loc_FWeight=0.3*loc_state.density
# loc_feed_weight=loc_state.need_total_weight-loc_state.initial_lower_weight-loc_FWeight
self.transfer_material_from_upper_to_lower(loc_state.initial_upper_weight,loc_state.initial_lower_weight)
self.transfer_material_from_upper_to_lower(loc_state,loc_state.initial_upper_weight,loc_state.initial_lower_weight)
#完成了上料斗重量转移才进入下料斗
loc_state.feed_status = FeedStatus.FFeed1
#测试返回
# loc_state._feed_status = FeedStatus.FFeed1
loc_state._feed_status = FeedStatus.FNone
# time.sleep(10)
return
elif loc_state.feed_status == FeedStatus.FFeed1:
elif loc_state._feed_status == FeedStatus.FFeed1:
#下料
# self._start_feeding_stage()
self.feeding_stage_one(loc_state)
print("下料1")
return
elif loc_state.feed_status == FeedStatus.FFeed2:
elif loc_state._feed_status == FeedStatus.FFeed2:
#上料
# self._start_feeding_stage()
self.feeding_stage_two(loc_state)
print("下料2")
return
elif loc_state.feed_status == FeedStatus.FFeed3:
elif loc_state._feed_status == FeedStatus.FFeed3:
#下料
# self._start_feeding_stage()
self.feeding_stage_three(loc_state)
print("下料3")
return
elif loc_state.feed_status == FeedStatus.FFinished:
elif loc_state._feed_status == FeedStatus.FFinished:
"""完成当前批次下料"""
print("当前批次下料完成,关闭出砼门")
if loc_state.overflow_detected=="浇筑满":
self.inverter_controller.control('stop')
self.relay_controller.control(self.relay_controller.DOOR_LOWER_1, 'close')
self.relay_controller.control(self.relay_controller.DOOR_LOWER_2, 'close')
loc_state._mould_vibrate_status=0
self.relay_controller.control(self.relay_controller.DOOR_LOWER_OPEN, 'close')
self.relay_controller.control_upper_close()
#更新数据库状态
self.artifact_bll.finish_artifact_task(loc_state.current_artifact.ArtifactID,loc_state._mould_finish_weight/loc_state.density)
loc_state.feed_status = FeedStatus.FCheckM
loc_state._feed_status = FeedStatus.FCheckM
return
def _start_feeding_stage(self):
@ -156,34 +173,35 @@ class FeedingProcess:
print("开始分步下料过程")
self.transfer_material_from_upper_to_lower()
def transfer_material_from_upper_to_lower(self,initial_upper_weight,initial_lower_weight):
def transfer_material_from_upper_to_lower(self,loc_state,initial_upper_weight,initial_lower_weight):
"""target_upper_weight转移后剩下的上料斗重量"""
# 如果低于单次,全部卸掉
_max_lower_weight=self.settings.max_lower_volume*self.state.density
if (initial_lower_weight+feed_weight>_max_lower_weight):
feed_weight=_max_lower_weight-initial_lower_weight
_max_lower_weight=app_set_config.max_lower_volume*self.state.density
# if (initial_lower_weight+feed_weight>_max_lower_weight):
feed_weight=_max_lower_weight-initial_lower_weight
target_upper_weight=initial_upper_weight-feed_weight
target_upper_weight = max(target_upper_weight, 0)
# 确保下料斗出砼门关闭
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_lower_close()
# 打开上料斗出砼门
self.relay_controller.control(self.relay_controller.DOOR_LOWER_1, 'open')
self.relay_controller.control(self.relay_controller.DOOR_UPPER_OPEN, 'open')
# 等待物料流入下料斗,基于上料斗重量变化控制
import time
start_time = time.time()
# timeout = 30 # 30秒超时
while self.state.running:
while loc_state.running:
current_upper_weight = self.transmitter_controller.read_data(1)
# 如果无法读取重量,继续尝试
if current_upper_weight is None:
print("无法读取上料斗重量,继续尝试...")
time.sleep(1)
continue
loc_state._upper_weight=current_upper_weight
print(f"上料斗当前重量: {current_upper_weight:.2f}kg")
# 如果达到目标重量,则关闭上料斗出砼门
@ -198,35 +216,40 @@ class FeedingProcess:
print("重量变化过小,可能存在堵塞")
time.sleep(1)
# 关闭上料斗出砼门
self.relay_controller.control(self.relay_controller.DOOR_LOWER_1, 'close')
self.relay_controller.control_upper_close()
#测试用
print("上料斗下料完成")
def wait_for_vehicle_alignment(self):
"""等待模具车对齐"""
print("等待模具车对齐...")
self.state._lower_feeding_stage = 4
self.state.lower_feeding_stage = 4
import time
while self.state._lower_feeding_stage == 4 and self.state.running:
while self.state.lower_feeding_stage == 4 and self.state.running:
if self.state.vehicle_aligned:
print("模具车已对齐,开始下料")
self.state._lower_feeding_stage = 1
self.state.lower_feeding_stage = 1
# self.feeding_stage_one()
break
time.sleep(self.settings.alignment_check_interval)
time.sleep(app_set_config.alignment_check_interval)
def feeding_stage_one(self,loc_state):
"""第一阶段下料:下料斗向模具车下料(低速)"""
print("开始第一阶段下料:下料斗低速下料")
if self.is_first_flag:
self.inverter_controller.set_frequency(self.settings.frequencies[0])
self.inverter_controller.control('start')
# self.inverter_controller.set_frequency(app_set_config.frequencies[0])
# self.inverter_controller.control('start')
loc_state._mould_frequency=app_set_config.frequencies[0]
loc_state._mould_vibrate_status=1
# 确保上料斗出砼门关闭
self.relay_controller.control(self.relay_controller.DOOR_LOWER_1, 'close')
# self.relay_controller.control(self.relay_controller.DOOR_UPPER_CLOSE, 'close')
# 打开下料斗出砼门
self.relay_controller.control(self.relay_controller.DOOR_LOWER_2, 'open')
loc_cur_weight = self.transmitter_controller.read_data(2)
self.relay_controller.control(self.relay_controller.DOOR_LOWER_OPEN, 'open')
loc_cur_weight = loc_state._lower_weight
if loc_cur_weight is None:
#报警处理
print("无法获取初始重量,取消下料")
@ -238,7 +261,7 @@ class FeedingProcess:
start_time = time.time()
current_weight = self.transmitter_controller.read_data(2)
current_weight = loc_state._lower_weight
if current_weight is None:
#报警处理
print("无法获取当前重量,取消下料")
@ -246,25 +269,28 @@ class FeedingProcess:
return
loc_state._mould_finish_weight=loc_state.initial_lower_weight-current_weight
target_weight = loc_state._mould_need_weight/3
if (current_weight is not None and loc_state._mould_finish_weight >= target_weight) or (time.time() - start_time) > 30:
loc_state.feed_status = FeedStatus.FFeed2
loc_state._lower_feeding_stage = 2
# or (time.time() - start_time) > 30
if (current_weight is not None and loc_state._mould_finish_weight >= target_weight):
loc_state._feed_status = FeedStatus.FFeed2
loc_state.lower_feeding_stage = 2
self.is_first_flag=True
return
else:
time.sleep(1)
def feeding_stage_two(self):
def feeding_stage_two(self,loc_state):
"""第二阶段下料:下料斗向模具车下料(中速)"""
if self.is_first_flag:
print("开始第二阶段下料:下料斗中速下料")
self.inverter_controller.set_frequency(self.settings.frequencies[1])
# self.inverter_controller.set_frequency(app_set_config.frequencies[1])
# self.inverter_controller.control('start')
# 保持下料斗出砼门打开
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_1, 'close')
self.relay_controller.control_upper_close()
loc_state._mould_frequency=app_set_config.frequencies[1]
loc_state._mould_vibrate_status=1
# loc_cur_weight = self.transmitter_controller.read_data(2)
# if loc_cur_weight is None:
# #报警处理
@ -275,7 +301,7 @@ class FeedingProcess:
self.is_first_flag=False
start_time = time.time()
current_weight = self.transmitter_controller.read_data(2)
current_weight = loc_state._lower_weight
if current_weight is None:
#报警处理
print("无法获取当前重量,取消下料")
@ -283,26 +309,29 @@ class FeedingProcess:
return
loc_state._mould_finish_weight=loc_state.initial_lower_weight-current_weight
target_weight = (loc_state._mould_need_weight/3)*2
if (current_weight is not None and loc_state._mould_finish_weight >= target_weight) or (time.time() - start_time) > 30:
loc_state.feed_status = FeedStatus.FFeed3
loc_state._lower_feeding_stage = 3
# or (time.time() - start_time) > 30
if (current_weight is not None and loc_state._mould_finish_weight >= target_weight):
loc_state._feed_status = FeedStatus.FFeed3
loc_state.lower_feeding_stage = 3
self.is_first_flag=True
return
else:
time.sleep(1)
def feeding_stage_three(self):
def feeding_stage_three(self,loc_state):
"""第三阶段下料:下料斗向模具车下料(高速)"""
if self.is_first_flag:
print("开始第三阶段下料:下料斗高速下料")
self.inverter_controller.set_frequency(self.settings.frequencies[2])
# self.inverter_controller.set_frequency(app_set_config.frequencies[2])
loc_state._mould_frequency=app_set_config.frequencies[2]
# 保持下料斗出砼门打开
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_1, 'close')
self.relay_controller.control_upper_close()
self.is_first_flag=False
current_weight = self.transmitter_controller.read_data(2)
current_weight = loc_state._lower_weight
if current_weight is None:
#报警处理
print("无法获取当前重量,取消下料")
@ -312,8 +341,8 @@ class FeedingProcess:
target_weight = loc_state._mould_need_weight
if (current_weight is not None and loc_state._mould_finish_weight >= target_weight):
loc_state.feed_status = FeedStatus.FFinished
loc_state._lower_feeding_stage = 5
loc_state._feed_status = FeedStatus.FFinished
loc_state.lower_feeding_stage = 5
self.is_first_flag=True
return
else:
@ -348,13 +377,13 @@ class FeedingProcess:
# 继续等待当前模具车对齐(不需要重新等待对齐,因为是同一辆模具车)
print("第二次上料完成,继续三阶段下料")
self.state._lower_feeding_stage = 1 # 直接进入第一阶段下料
self.state.lower_feeding_stage = 1 # 直接进入第一阶段下料
self.feeding_stage_one() # 开始第二轮第一阶段下料
def finish_feeding_process(self):
"""完成整个下料流程"""
print("整个下料流程完成")
self.state._lower_feeding_stage = 0
self.state.lower_feeding_stage = 0
self.state.lower_feeding_cycle = 0
self.state.upper_feeding_count = 0
# self.return_upper_door_to_default()