Compare commits

...

4 Commits

Author SHA1 Message Date
9e4b73b1de status 2025-11-01 18:52:19 +08:00
f6698a74a0 555 2025-11-01 17:43:36 +08:00
0f97436911 cc 2025-11-01 17:38:31 +08:00
32c14c2e7b dd 2025-11-01 17:33:26 +08:00
18 changed files with 664 additions and 171 deletions

View File

@ -23,6 +23,14 @@ class ArtifactBll:
return self.dal.get_top_artifact(5, "ArtifactID asc")
def get_artifacting_task(self) -> ArtifactInfoModel:
"""获取正在进行的官片任务数据"""
loc_item= self.dal.get_top_artifact(1,"","Status=2")
if loc_item:
return loc_item[0]
else:
return None
class PDRecordBll:
def __init__(self):
"""初始化数据访问层,创建数据库连接"""
@ -39,8 +47,10 @@ if __name__ == "__main__":
artifact_dal = ArtifactBll()
artifacts = artifact_dal.get_artifact_task()
print("\n打印artifacts数据:")
for i, artifact in enumerate(artifacts):
artifact_id = artifact.ArtifactID
# 如果是数据类对象,转换为字典输出
print(artifact.MouldCode)
if hasattr(artifact, "__dataclass_fields__"):

View File

@ -69,6 +69,7 @@ class ArtifactDal(BaseDal):
artifact.BetonVolume=row["BetonVolume"]
artifact.BetonTaskID=row["BetonTaskID"]
artifact.Status=row["Status"]
artifact.BeginTime=row["BeginTime"]
artifacts.append(artifact)
return artifacts
@ -92,6 +93,7 @@ class ArtifactDal(BaseDal):
print(f"根据ID获取构件任务失败: {e}")
return None
def insert_artifact(self, artifact_data: dict) -> Optional[int]:
"""插入一条构件任务记录"""
try:

View File

@ -1,7 +1,6 @@
# config/settings.py
import os
class Settings:
def __init__(self):
# 项目根目录
@ -49,7 +48,13 @@ class Settings:
self.visual_check_interval = 1.0 # 视觉检查间隔(秒)
self.alignment_check_interval = 0.5 # 对齐检查间隔(秒)
self.max_error_count = 3 # 最大错误计数
self.lower_feeding_interval = 1.0 # 下料轮询间隔(秒)
# RFID配置
self.rfid_host = '192.168.1.190'
self.rfid_port = 6000
#是否在线生产
self.is_online_control = True # 是否API在线

View File

@ -1,12 +1,26 @@
from re import U
from hardware import transmitter
from view.main_window import MainWindow
import threading
from .camera_controller import CameraController
from .bottom_control_controller import BottomControlController
from hardware.transmitter import TransmitterController
from hardware.relay import RelayController
class MainController:
def __init__(self):
# 主界面
self.main_window = MainWindow()
# 定时器
self.timer = threading.Timer(5.0, self._onTimer)
self.timer.start() # 每5秒触发一次
self.timer2=threading.Timer(1.0, self._onTimer2)
self.timer2.start() # 每秒触发一次
self.angle=10
self.max_angle=60
self.min_angle=10
self.is_add=True
# 初始化子界面
self._initSubViews()
@ -16,8 +30,54 @@ class MainController:
# self.__connectSignals()
def _onTimer(self):
# 定时任务逻辑
loc_tra=TransmitterController(RelayController())
upper_weight=loc_tra.read_data(1)
lower_weight=loc_tra.read_data(2)
if upper_weight is None:
upper_weight=0
if lower_weight is None:
lower_weight=0
self.main_window.hopper_widget.setUpperHopperWeight(upper_weight)
self.main_window.hopper_widget.setLowerHopperWeight(lower_weight)
# 重新启动定时器以实现重复执行
self.timer = threading.Timer(5.0, self._onTimer)
self.timer.start()
pass
def _onTimer2(self):
print(str(self.angle))
# 定时任务逻辑
if self.is_add:
self.angle+=1
else:
self.angle-=1
if self.angle>self.max_angle:
self.is_add=False
self.angle=self.max_angle
if self.angle<=self.min_angle:
self.is_add=True
self.angle=10
self.main_window.hopper_widget.setLowerHopperOpeningAngle(self.angle)
# 重新启动定时器以实现重复执行
self.timer2 = threading.Timer(1.0, self._onTimer2)
self.timer2.start()
pass
def showMainWindow(self):
self.main_window.show()
self.main_window.dispatch_task_widget.set_task_time("task1","15:44 PM")
self.main_window.dispatch_task_widget.set_task_time("task2","17:37 PM")
self.main_window.segment_task_widget.set_task_time("task1","15:38 PM")
self.main_window.segment_task_widget.set_task_time("task2","17:24 PM")
def _initSubControllers(self):
# 振捣视频控制

View File

@ -1,12 +1,18 @@
# core/state.py
class SystemState:
from PySide6.QtCore import Signal, QObject
import threading
from enum import IntEnum
class SystemState(QObject):
"""状态中以_开头的属性会发送信号通知,不需要的不要加_开头"""
state_updated=Signal(str,object)
def __init__(self):
super().__init__()
# 系统运行状态
self.running = False
# 下料控制相关
self.upper_door_position = 'default' # default(在搅拌楼下接料), over_lower(在下料斗上方), returning(返回中)
self.lower_feeding_stage = 0 # 0:未下料, 1:第一阶段, 2:第二阶段, 3:第三阶段, 4:等待模具车对齐
self._upper_door_position = 'default' # default(在搅拌楼下接料), over_lower(在下料斗上方), returning(返回中)
self._lower_feeding_stage = 0 # 0:未下料, 1:第一阶段, 2:第二阶段, 3:第三阶段, 4:等待模具车对齐
self.lower_feeding_cycle = 0 # 下料斗下料循环次数
self.upper_feeding_count = 0 # 上料斗已下料次数
self.upper_feeding_max = 2 #上料斗最大下料次数
@ -26,3 +32,46 @@ class SystemState:
self.door_opening_large = False # 夹角
self.vehicle_aligned = False # 模具车是否对齐
self.last_angle = None # 上次检测角度
#当前RFID的内容格式为 模块编号,分块号,尺寸规格,方量
self.rfid_current=None
#当前生产的管片
self.current_artifact=None
#当前生产状态
self.feed_status=FeedStatus.FNone
# 记录需要监听的属性名(筛选掉不需要发信号的内部变量)
#是否破拱
self._upper_is_arch_=False
self._lower_is_arch_=False
self.lock = threading.RLock()
self._watched_props = [k for k in self.__dict__ if k.startswith('_')]
def __setattr__(self, name, value):
super().__setattr__(name, value)
if name in self._watched_props:
with self.lock:
public_name = name.lstrip('_')
self.state_updated.emit(public_name, value)
class FeedStatus(IntEnum):
#初始值
FNone = 0
# 检查模车(模车到位)
FCheckM = 1
#RFID检测或匹配
FRFID=2,
# 开始(管片待生产任务)
FStart = 3
# 检查盖板(盖板到位)
FCheckGB = 4
#下料1
FFeed1 = 5
# 下料2
FFeed2 = 6
# 下料3
FFeed3 = 7
#完成(管片生产完成)
FFinished = 11

View File

@ -7,6 +7,7 @@ from core.state import SystemState
from hardware.relay import RelayController
from hardware.inverter import InverterController
from hardware.transmitter import TransmitterController
from hardware.RFID.rfid_service import rfid_service
from vision.camera import CameraController
from vision.detector import VisionDetector
from feeding.controller import FeedingController
@ -37,14 +38,22 @@ class FeedingControlSystem:
self.transmitter_controller,
self.vision_detector,
self.camera_controller,
self.rfid_controller,
self.state,
settings
)
# 初始化RFID控制器
self.rfid_controller = rfid_service(
host=settings.rfid_host,
port=settings.rfid_port
)
# 线程管理
self.monitor_thread = None
self.visual_control_thread = None
self.alignment_check_thread = None
self.lower_feeding_thread = None
def initialize(self):
"""初始化系统"""
@ -68,6 +77,9 @@ class FeedingControlSystem:
if not self.vision_detector.load_models():
raise Exception("视觉模型加载失败")
if not self.check_device_connectivity():
raise Exception("设备连接失败")
# 启动系统监控
self.start_monitoring()
@ -77,6 +89,10 @@ class FeedingControlSystem:
# 启动对齐检查
self.start_alignment_check()
# 启动下料轮询线程
self.start_lower_feeding()
print("控制系统初始化完成")
def start_monitoring(self):
@ -131,7 +147,7 @@ class FeedingControlSystem:
"""对齐检查循环"""
while self.state.running:
try:
if self.state.lower_feeding_stage == 4: # 等待对齐阶段
if self.state._lower_feeding_stage == 4: # 等待对齐阶段
current_frame = self.camera_controller.capture_frame()
if current_frame is not None:
self.state.vehicle_aligned = self.vision_detector.detect_vehicle_alignment(current_frame)
@ -146,7 +162,54 @@ class FeedingControlSystem:
def start_lower_feeding(self):
"""启动下料流程"""
self.feeding_controller.start_feeding()
self.lower_feeding_thread = threading.Thread(
target=self._start_lower_feeding,
daemon=True
)
self.lower_feeding_thread.start()
def _start_lower_feeding(self):
"""启动下料流程"""
while self.state.running:
self.feeding_controller.start_feeding()
time.sleep(self.settings.lower_feeding_interval)
def check_device_connectivity(self) -> bool:
"""检查关键设备连接状态"""
try:
# 检查网络继电器连接
test_response = self.relay_controller.send_command(self.relay_controller.read_status_command)
if not test_response:
print("网络继电器连接失败")
return False
# 检查变频器连接
if not self.relay_controller.modbus_client.connect():
print("无法连接到网络继电器Modbus服务")
return False
# 尝试读取变频器一个寄存器(测试连接)
test_result = self.relay_controller.modbus_client.read_holding_registers(
address=0x00,
count=1,
slave=self.inverter_controller.config['slave_id']
)
if isinstance(test_result, Exception):
print("变频器连接测试失败")
return False
# 检查下料斗变送器连接
test_weight = self.transmitter_controller.read_data(2)
if test_weight is None:
print("下料斗变送器连接失败")
return False
self.relay_controller.modbus_client.close()
return True
except Exception as e:
print(f"设备连接检查失败: {e}")
return False
def stop(self):
"""停止系统"""
@ -160,6 +223,8 @@ class FeedingControlSystem:
self.visual_control_thread.join()
if self.alignment_check_thread:
self.alignment_check_thread.join()
if self.lower_feeding_thread:
self.lower_feeding_thread.join()
# 释放摄像头资源
self.camera_controller.release()

Binary file not shown.

Binary file not shown.

Binary file not shown.

260
doc/md/Arch.md Normal file
View File

@ -0,0 +1,260 @@
## 子系统关系图示例
### 1. 系统上下文图System Context Diagram
```mermaid
graph TD
subgraph 外部实体
User[用户]
CustomerSystem[客户系统]
SupplierSystem[供应商系统]
PaymentGateway[支付网关]
end
subgraph 核心系统
MainSystem[主系统]
subgraph 子系统A[子系统A - 订单管理]
OrderService[订单服务]
InventoryService[库存服务]
PricingService[定价服务]
end
subgraph 子系统B[子系统B - 用户管理]
AuthService[认证服务]
ProfileService[用户档案服务]
PermissionService[权限服务]
end
subgraph 子系统C[子系统C - 数据分析]
ReportService[报表服务]
AnalyticsService[分析服务]
DashboardService[仪表盘服务]
end
subgraph 子系统D[子系统D - 通知中心]
EmailService[邮件服务]
SMSGateway[短信网关]
PushService[推送服务]
end
end
subgraph 数据存储
DB[(数据库)]
Cache[(缓存)]
LogStorage[(日志存储)]
end
%% 外部实体连接
User --> MainSystem
CustomerSystem <--> MainSystem
SupplierSystem <--> MainSystem
PaymentGateway <--> MainSystem
%% 主系统与子系统连接
MainSystem --> OrderService
MainSystem --> AuthService
MainSystem --> ReportService
MainSystem --> EmailService
%% 子系统内部连接
OrderService --> InventoryService
OrderService --> PricingService
AuthService --> ProfileService
AuthService --> PermissionService
ReportService --> AnalyticsService
ReportService --> DashboardService
EmailService --> SMSGateway
EmailService --> PushService
%% 子系统与数据存储连接
OrderService --> DB
InventoryService --> DB
ProfileService --> DB
PermissionService --> DB
AnalyticsService --> DB
PricingService --> Cache
AuthService --> Cache
EmailService --> LogStorage
SMSGateway --> LogStorage
PushService --> LogStorage
```
### 2. 子系统交互流程图
```mermaid
sequenceDiagram
participant Client as 客户端
participant Main as 主系统
participant Order as 订单子系统
participant User as 用户子系统
participant Payment as 支付子系统
participant Notify as 通知子系统
participant DB as 数据库
Client->>Main: 请求创建订单
Main->>User: 验证用户身份和权限
User->>DB: 查询用户信息
DB-->>User: 返回用户数据
User-->>Main: 验证通过
Main->>Order: 创建订单请求
Order->>DB: 查询库存
DB-->>Order: 返回库存状态
alt 库存充足
Order->>DB: 锁定库存
Order->>Payment: 发起支付请求
Payment->>DB: 创建支付记录
DB-->>Payment: 支付记录创建成功
Payment-->>Order: 支付已发起
Order->>DB: 更新订单状态为"等待支付"
Order-->>Main: 订单创建成功
Main->>Notify: 发送订单确认通知
Notify-->>Client: 推送订单确认消息
else 库存不足
Order-->>Main: 库存不足
Main-->>Client: 返回错误信息
end
```
### 3. 子系统依赖关系图
```mermaid
graph LR
subgraph 基础服务层
ConfigSvc[配置服务]
LogSvc[日志服务]
SecuritySvc[安全服务]
CommonLib[公共库]
end
subgraph 核心业务层
UserMgmt[用户管理子系统]
ProductMgmt[产品管理子系统]
OrderMgmt[订单管理子系统]
PaymentMgmt[支付管理子系统]
end
subgraph 应用服务层
API_Gateway[API网关]
MobileApp[移动应用服务]
WebPortal[Web门户服务]
ReportSvc[报表服务]
end
subgraph 集成层
ExternalAPI[外部API集成]
MessageQueue[消息队列]
EventBus[事件总线]
end
%% 依赖关系
UserMgmt --> ConfigSvc
UserMgmt --> LogSvc
UserMgmt --> SecuritySvc
UserMgmt --> CommonLib
ProductMgmt --> ConfigSvc
ProductMgmt --> LogSvc
ProductMgmt --> CommonLib
OrderMgmt --> UserMgmt
OrderMgmt --> ProductMgmt
OrderMgmt --> LogSvc
OrderMgmt --> ConfigSvc
OrderMgmt --> CommonLib
PaymentMgmt --> OrderMgmt
PaymentMgmt --> LogSvc
PaymentMgmt --> SecuritySvc
PaymentMgmt --> ConfigSvc
API_Gateway --> UserMgmt
API_Gateway --> ProductMgmt
API_Gateway --> OrderMgmt
API_Gateway --> PaymentMgmt
API_Gateway --> SecuritySvc
MobileApp --> API_Gateway
WebPortal --> API_Gateway
ReportSvc --> UserMgmt
ReportSvc --> OrderMgmt
ReportSvc --> ProductMgmt
UserMgmt --> ExternalAPI
PaymentMgmt --> ExternalAPI
OrderMgmt --> MessageQueue
PaymentMgmt --> MessageQueue
UserMgmt --> EventBus
OrderMgmt --> EventBus
ProductMgmt --> EventBus
PaymentMgmt --> EventBus
```
### 4. C4模型系统上下文图
```mermaid
graph TD
subgraph 系统边界
System[企业资源规划系统]
subgraph 功能模块
HR[人力资源管理]
Finance[财务管理]
Inventory[库存管理]
Sales[销售管理]
Production[生产管理]
end
System --> HR
System --> Finance
System --> Inventory
System --> Sales
System --> Production
end
%% 系统间关系
HR <--> Finance: 薪资数据
Sales <--> Finance: 订单数据
Sales <--> Inventory: 库存查询
Production <--> Inventory: 物料需求
Production <--> Finance: 成本核算
%% 外部系统
ExtCRM[外部CRM系统] <--> Sales: 客户数据
ExtSupplier[供应商系统] <--> Inventory: 采购数据
ExtBank[银行系统] <--> Finance: 支付结算
%% 用户
HR_User[HR人员] --> HR
Finance_User[财务人员] --> Finance
Inventory_User[仓库人员] --> Inventory
Sales_User[销售人员] --> Sales
Prod_User[生产人员] --> Production
```
### 说明
以上子系统关系图展示了不同类型的系统间关系表示方法:
1. **系统上下文图**:展示了系统的整体架构,包括核心子系统、外部实体和数据存储之间的关系。适合高层次架构设计。
2. **子系统交互流程图**:使用时序图展示子系统之间的交互过程和消息传递顺序,适合描述业务流程中的系统协作。
3. **子系统依赖关系图**:展示了子系统之间的依赖关系,包括基础服务、核心业务、应用服务和集成层的层次结构。
4. **C4模型系统上下文图**遵循C4模型方法论展示了企业级系统中的子系统边界和它们之间的关系。
### Mermaid图表类型选择建议
对于展示子系统之间的关系推荐使用以下Mermaid图表类型
- **graph TD/LR**:适用于系统上下文图、依赖关系图等静态关系展示
- **sequenceDiagram**:适用于展示子系统间的交互流程和消息传递
- **flowchart**:适用于展示更复杂的业务流程和子系统协作
- **classDiagram**:如果需要展示子系统的类结构和它们之间的关系
选择图表类型时,应根据具体需求考虑:是需要展示静态结构关系,还是动态交互过程;是需要高层次概览,还是详细的交互细节。

View File

@ -1,19 +1,22 @@
# feeding/controller.py
import time
from feeding.process import FeedingProcess
from busisness.blls import ArtifactBll
class FeedingController:
def __init__(self, relay_controller, inverter_controller,
transmitter_controller, vision_detector,
camera_controller, state, settings):
camera_controller, rfid_controller,state, settings):
self.relay_controller = relay_controller
self.inverter_controller = inverter_controller
self.transmitter_controller = transmitter_controller
self.vision_detector = vision_detector
self.camera_controller = camera_controller
self.rfid_controller = rfid_controller
self.state = state
self.settings = settings
self.artifact_bll = ArtifactBll()
# 初始化下料流程
self.process = FeedingProcess(
@ -22,21 +25,28 @@ class FeedingController:
camera_controller, state, settings
)
def start_feeding(self):
#获取当前的管片任务
#API读取生产任务 --》RFID读取模具配对检测--数据库入库》生产-》同步到数据库
#API读取生产任务--》未读到--》RFID读取模具-数据库入库》生产 --》同步到数据库
#从数据库获取当前的管片任务
"""启动下料流程"""
self.process.start_feeding()
def check_upper_material_request(self):
"""检查是否需要要料"""
current_weight = self.transmitter_controller.read_data(1)
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:
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 current_weight < (self.settings.single_batch_weight + self.settings.min_required_weight):
@ -50,6 +60,8 @@ class FeedingController:
请求搅拌楼下料
"""
print("发送要料请求至搅拌楼...")
# self.settings.
self.process.return_upper_door_to_default()
# 这里需要与同事对接具体的通信方式
# 可能是Modbus写寄存器、TCP通信、HTTP请求等
@ -60,31 +72,35 @@ class FeedingController:
current_time = time.time()
# 检查下料斗破拱(只有在下料过程中才检查)
if self.state.lower_feeding_stage in [1, 2, 3]: # 在所有下料阶段检查
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
# 检查上料斗破拱(在上料斗向下料斗下料时检查)
if (self.state.upper_door_position == 'over_lower' and
self.state.lower_feeding_stage in [0, 1, 2, 3, 4]): # 在任何阶段都可能需要上料斗破拱
if (self.state._upper_door_position == 'over_lower' and
self.state._lower_feeding_stage in [0, 1, 2, 3, 4]): # 在任何阶段都可能需要上料斗破拱
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:
print("上料斗可能堵塞,启动破拱")
self.state._upper_is_arch_=True
self.relay_controller.control(self.relay_controller.BREAK_ARCH_UPPER, 'open')
time.sleep(2)
self.relay_controller.control(self.relay_controller.BREAK_ARCH_UPPER, 'close')
self.state._upper_is_arch_=False
self.state.last_upper_weight = upper_weight

View File

@ -1,75 +1,105 @@
from enum import IntEnum
from core.state import FeedStatus
from service.mould_service import MouldService
from busisness.blls import ArtifactBll
from busisness.models import ArtifactInfoModel
class FeedingProcess:
def __init__(self, relay_controller, inverter_controller,
transmitter_controller, vision_detector,
camera_controller, state, settings):
self.relay_controller = relay_controller
self.artifact_bll = ArtifactBll()
self.inverter_controller = inverter_controller
self.transmitter_controller = transmitter_controller
self.vision_detector = vision_detector
self.camera_controller = camera_controller
self.state = state
self.state.feed_status = FeedStatus.FNone
self.settings = settings
def start_feeding(self):
"""开始分步下料"""
if self.state.lower_feeding_stage != 0:
print("下料已在进行中")
"""开始生产管片"""
if self.state.feed_status == FeedStatus.FNone:
self.state.feed_status = FeedStatus.FCheckM
return
elif self.state.feed_status == FeedStatus.FCheckM:
self.state._lower_feeding_stage = 4
self.wait_for_vehicle_alignment()
self.state.feed_status = FeedStatus.FStart
print("生产已检查模车")
return
elif self.state.feed_status == FeedStatus.FStart:
print("生产已开始")
time.sleep(2)
loc_modules = MouldService.get_not_pour_artifacts()
if loc_modules:
# 取第一个未浇筑的管片
loc_module = loc_modules[0]
self.state.current_artifact = loc_module
else:
#未读取到AIP接口数据.
self.state.current_artifact = None
return
elif self.state.feed_status == FeedStatus.FRFID:
print("生产已检查RFID")
#RFID格式模具编号,分块号,尺寸规格,方量
rfid_info =''
loc_MouldCode='SHZB1-4'
loc_SizeSpecification='6600*1200'
loc_BlockNumber='B1'
loc.BetonVolume=1.56
if self.state.current_artifact:
#检测是否和RFID识别的管理一致
self.state.feed_status = FeedStatus.FCheckGB
else:
#以RFID为准
loc_module= ArtifactInfoModel()
loc_module.MouldCode=loc_MouldCode
loc_module.SizeSpecification=loc_SizeSpecification
loc_module.BlockNumber=loc_BlockNumber
loc_module.BetonVolume=loc.BetonVolume
self.state.current_artifact = loc_module
#确认是否保存到数据库
self.state.feed_status = FeedStatus.FCheckGB
return
elif self.state.feed_status == FeedStatus.FCheckGB:
print("生产已检查盖板")
time.sleep(10)
self.state.feed_status = FeedStatus.FFeed
return
elif self.state.feed_status == FeedStatus.FFeed:
self._start_feeding_stage()
print("生产已下料")
return
elif self.state.feed_status == FeedStatus.FFinished:
print("生产已完成")
self.state.feed_status = FeedStatus.FCheckM
return
# 检查关键设备是否可连接
if not self._check_device_connectivity():
print("关键设备连接失败,无法开始下料")
def _start_feeding_stage(self):
"""启动指定下料阶段"""
"""开始分步下料"""
if self.state._lower_feeding_stage != 0:
print("下料已在进行中")
return
print("开始分步下料过程")
# 重置计数器
#下料斗下料循环次数
self.state.lower_feeding_cycle = 0
#上料斗已下料次数
self.state.upper_feeding_count = 0
#上料斗最大下料次数
self.state.upper_feeding_max = 2
# 第一次上料
self.transfer_material_from_upper_to_lower()
# 等待模具车对齐并开始第一轮下料
self.state.lower_feeding_stage = 4
self.wait_for_vehicle_alignment()
def _check_device_connectivity(self):
"""检查关键设备连接状态"""
try:
# 检查网络继电器连接
test_response = self.relay_controller.send_command(self.relay_controller.read_status_command)
if not test_response:
print("网络继电器连接失败")
return False
# 检查变频器连接
if not self.relay_controller.modbus_client.connect():
print("无法连接到网络继电器Modbus服务")
return False
# 尝试读取变频器一个寄存器(测试连接)
test_result = self.relay_controller.modbus_client.read_holding_registers(
address=0x00,
count=1,
slave=self.inverter_controller.config['slave_id']
)
if isinstance(test_result, Exception):
print("变频器连接测试失败")
return False
# 检查下料斗变送器连接
test_weight = self.transmitter_controller.read_data(2)
if test_weight is None:
print("下料斗变送器连接失败")
return False
self.relay_controller.modbus_client.close()
return True
except Exception as e:
print(f"设备连接检查失败: {e}")
return False
# self.state._lower_feeding_stage = 4
# self.wait_for_vehicle_alignment()
def transfer_material_from_upper_to_lower(self):
"""上料斗向下料斗下料"""
@ -81,7 +111,7 @@ class FeedingProcess:
# 如果无法读取重量,直接报错
if initial_upper_weight is None:
raise Exception("无法读取上料斗重量传感器数据,下料操作终止")
# 单次下料重量(kg),self.settings.single_batch_weight
target_upper_weight = initial_upper_weight - self.settings.single_batch_weight
target_upper_weight = max(target_upper_weight, 0) # 确保不低于0
@ -136,14 +166,14 @@ class FeedingProcess:
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.feeding_stage_one()
self.state._lower_feeding_stage = 1
# self.feeding_stage_one()
break
time.sleep(self.settings.alignment_check_interval)
@ -168,7 +198,7 @@ class FeedingProcess:
target_weight = initial_weight + self.settings.single_batch_weight
while self.state.lower_feeding_stage == 1:
while self.state._lower_feeding_stage == 1:
current_weight = self.transmitter_controller.read_data(2)
if current_weight is None:
self.state.lower_weight_error_count += 1
@ -180,7 +210,7 @@ class FeedingProcess:
self.state.lower_weight_error_count = 0
if (current_weight is not None and current_weight >= target_weight) or (time.time() - start_time) > 30:
self.state.lower_feeding_stage = 2
self.state._lower_feeding_stage = 2
self.feeding_stage_two()
break
time.sleep(2)
@ -205,7 +235,7 @@ class FeedingProcess:
target_weight = initial_weight + self.settings.single_batch_weight
while self.state.lower_feeding_stage == 2:
while self.state._lower_feeding_stage == 2:
current_weight = self.transmitter_controller.read_data(2)
if current_weight is None:
self.state.lower_weight_error_count += 1
@ -217,7 +247,7 @@ class FeedingProcess:
self.state.lower_weight_error_count = 0
if (current_weight is not None and current_weight >= target_weight) or (time.time() - start_time) > 30:
self.state.lower_feeding_stage = 3
self.state._lower_feeding_stage = 3
self.feeding_stage_three()
break
time.sleep(2)
@ -242,7 +272,7 @@ class FeedingProcess:
target_weight = initial_weight + self.settings.single_batch_weight
while self.state.lower_feeding_stage == 3:
while self.state._lower_feeding_stage == 3:
current_weight = self.transmitter_controller.read_data(2)
if current_weight is None:
self.state.lower_weight_error_count += 1
@ -254,7 +284,7 @@ class FeedingProcess:
self.state.lower_weight_error_count = 0
if (current_weight is not None and current_weight >= target_weight) or (time.time() - start_time) > 30:
self.state.lower_feeding_stage = 4
self.state._lower_feeding_stage = 4
self.finish_current_batch()
break
time.sleep(2)
@ -288,19 +318,19 @@ 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()
# self.return_upper_door_to_default()
def return_upper_door_to_default(self):
"""上料斗回到默认位置(搅拌楼下接料位置)"""
print("上料斗回到默认位置")
self.relay_controller.control(self.relay_controller.DOOR_UPPER, 'close')
self.state.upper_door_position = 'default'
self.state._upper_door_position = 'default'

View File

@ -1,6 +1,6 @@
# Resource object code (Python 3)
# Created by: object code
# Created by: The Resource Compiler for Qt version 6.9.1
# Created by: The Resource Compiler for Qt version 6.7.2
# WARNING! All changes made in this file will be lost!
from PySide6 import QtCore
@ -14370,139 +14370,139 @@ qt_resource_struct = b"\
\x00\x00\x00\x10\x00\x02\x00\x00\x00C\x00\x00\x00\x03\
\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x05\xb8\x00\x00\x00\x00\x00\x01\x00\x02\xdd\x16\
\x00\x00\x01\x9a\x0e\xb7\xa7\x1a\
\x00\x00\x01\x9a>\xc4\x05p\
\x00\x00\x04\x02\x00\x00\x00\x00\x00\x01\x00\x01\xfb\xa6\
\x00\x00\x01\x9a\x0e\xd9\xfc'\
\x00\x00\x01\x9a>\xc4\x05s\
\x00\x00\x05(\x00\x00\x00\x00\x00\x01\x00\x02\xbc.\
\x00\x00\x01\x99\xce\xd7\xa8\xae\
\x00\x00\x01\x9a\x14\xe2\x1b\xbe\
\x00\x00\x01\x04\x00\x00\x00\x00\x00\x01\x00\x00+8\
\x00\x00\x01\x9a\x0e\xd9\xfb\xd4\
\x00\x00\x01\x9a>\xc4\x05s\
\x00\x00\x00T\x00\x00\x00\x00\x00\x01\x00\x00\x11r\
\x00\x00\x01\x9a\x0e\xae\xf8\x03\
\x00\x00\x01\x9a>\xc4\x05v\
\x00\x00\x05\xd0\x00\x00\x00\x00\x00\x01\x00\x02\xddk\
\x00\x00\x01\x9a\x0e\xae\xf7/\
\x00\x00\x01\x9a>\xc4\x05x\
\x00\x00\x02\xa6\x00\x00\x00\x00\x00\x01\x00\x01\x08\xf0\
\x00\x00\x01\x9a\x0e\xae\xf7r\
\x00\x00\x01\x9a>\xc4\x05x\
\x00\x00\x00:\x00\x00\x00\x00\x00\x01\x00\x00\x01\x05\
\x00\x00\x01\x9a\x0e\xae\xf7\xbe\
\x00\x00\x01\x9a>\xc4\x05u\
\x00\x00\x02\xd8\x00\x00\x00\x00\x00\x01\x00\x01\x1d/\
\x00\x00\x01\x99\xcf3\xa2(\
\x00\x00\x01\x9a\x14\xe2\x1b\xbb\
\x00\x00\x01\xda\x00\x00\x00\x00\x00\x01\x00\x00\x84\x83\
\x00\x00\x01\x9a\x0e\xc0\xa6q\
\x00\x00\x01\x9a>\xc4\x05\x81\
\x00\x00\x03\x8e\x00\x00\x00\x00\x00\x01\x00\x01N/\
\x00\x00\x01\x9a\x0e\xd9\xfb\x89\
\x00\x00\x01\x9a>\xc4\x05r\
\x00\x00\x04\x84\x00\x00\x00\x00\x00\x01\x00\x02\x92\xa4\
\x00\x00\x01\x9a\x0e\xd9\xfb7\
\x00\x00\x01\x9a>\xc4\x05r\
\x00\x00\x01$\x00\x00\x00\x00\x00\x01\x00\x00-\x82\
\x00\x00\x01\x9a9\x80\xc6W\
\x00\x00\x01\x9a\x14\xe2\x1b\xb9\
\x00\x00\x02x\x00\x00\x00\x00\x00\x01\x00\x00\xf5\xe3\
\x00\x00\x01\x9a\x0e\xa81d\
\x00\x00\x01\x9a>\xc4\x05\x83\
\x00\x00\x01L\x00\x00\x00\x00\x00\x01\x00\x00c\xfb\
\x00\x00\x01\x9a\x0e\xd0\xb4\x80\
\x00\x00\x01\x9a>\xc4\x05|\
\x00\x00\x02\x92\x00\x00\x00\x00\x00\x01\x00\x01\x02\xaa\
\x00\x00\x01\x9a\x0e\xd0\xb4:\
\x00\x00\x01\x9a>\xc4\x05|\
\x00\x00\x03\x02\x00\x00\x00\x00\x00\x01\x00\x01%\xbb\
\x00\x00\x01\x9a\x0e\xc9\xc8\x0c\
\x00\x00\x01\x9a>\xc4\x05\x85\
\x00\x00\x05p\x00\x00\x00\x00\x00\x01\x00\x02\xc7\x9f\
\x00\x00\x01\x9a\x0e\xaa\xa4,\
\x00\x00\x01\x9a>\xc4\x05~\
\x00\x00\x03\xae\x00\x00\x00\x00\x00\x01\x00\x01Q\xcb\
\x00\x00\x01\x9a\x0e\xcb\xad\x88\
\x00\x00\x01\x9a>\xc4\x05\x86\
\x00\x00\x00\x22\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
\x00\x00\x01\x9a\x0e\xaaO\xd7\
\x00\x00\x01\x9a>\xc4\x05~\
\x00\x00\x04\xc0\x00\x00\x00\x00\x00\x01\x00\x02\x96\x82\
\x00\x00\x01\x9a\x0e\xa9_\xc4\
\x00\x00\x01\x9a>\xc4\x05w\
\x00\x00\x00\x88\x00\x00\x00\x00\x00\x01\x00\x00 \x01\
\x00\x00\x01\x99\xce\xd7\xa8_\
\x00\x00\x01\x9a\x14\xe2\x1b\xbe\
\x00\x00\x06\x9a\x00\x00\x00\x00\x00\x01\x00\x03Yo\
\x00\x00\x01\x9a\x0e\xe2\xd5g\
\x00\x00\x01\x9a>\xc4\x05}\
\x00\x00\x04\xa4\x00\x00\x00\x00\x00\x01\x00\x02\x94\xf7\
\x00\x00\x01\x9a\x0e\xa9_\x80\
\x00\x00\x01\x9a>\xc4\x05v\
\x00\x00\x03^\x00\x00\x00\x00\x00\x01\x00\x010\x95\
\x00\x00\x01\x9a\x0e\xa7}\xcf\
\x00\x00\x01\x9a>\xc4\x05\x82\
\x00\x00\x00\xe8\x00\x00\x00\x00\x00\x01\x00\x00((\
\x00\x00\x01\x9a\x0e\xc7\xde>\
\x00\x00\x01\x9a>\xc4\x05w\
\x00\x00\x06l\x00\x00\x00\x00\x00\x01\x00\x036\xa7\
\x00\x00\x01\x9a\x0e\xa7}\xcf\
\x00\x00\x01\x9a>\xc4\x05\x80\
\x00\x00\x02\x18\x00\x00\x00\x00\x00\x01\x00\x00\xe1c\
\x00\x00\x01\x9a\x0e\xdb\xdc\x97\
\x00\x00\x01\x9a>\xc4\x05h\
\x00\x00\x02`\x00\x00\x00\x00\x00\x01\x00\x00\xf4\xe4\
\x00\x00\x01\x9a\x0e\xe5\x12\x1a\
\x00\x00\x01\x9a>\xc4\x05~\
\x00\x00\x03\xc4\x00\x00\x00\x00\x00\x01\x00\x01\xa8}\
\x00\x00\x01\x9a\x0e\xaaP)\
\x00\x00\x01\x9a>\xc4\x05\x7f\
\x00\x00\x03>\x00\x00\x00\x00\x00\x01\x00\x01/\xe2\
\x00\x00\x01\x9a\x0e\xbbQ\x1a\
\x00\x00\x01\x9a>\xc4\x05k\
\x00\x00\x01\xf8\x00\x00\x00\x00\x00\x01\x00\x00\xe0\xd7\
\x00\x00\x01\x9a\x0e\xbbu\x89\
\x00\x00\x01\x9a>\xc4\x05l\
\x00\x00\x01\x80\x00\x00\x00\x00\x00\x01\x00\x00z\x9d\
\x00\x00\x01\x9a\x0e\xb6\xd1U\
\x00\x00\x01\x9a>\xc4\x05l\
\x00\x00\x05\xea\x00\x00\x00\x00\x00\x01\x00\x02\xeb\xec\
\x00\x00\x01\x9a\x0e\xb6\xd1\x06\
\x00\x00\x01\x9a>\xc4\x05m\
\x00\x00\x06T\x00\x00\x00\x00\x00\x01\x00\x032L\
\x00\x00\x01\x9a\x0e\xba\x93\xd3\
\x00\x00\x01\x9a>\xc4\x05\x86\
\x00\x00\x06\x86\x00\x00\x00\x00\x00\x01\x00\x03?\x19\
\x00\x00\x01\x9a\x0e\xd1\xf67\
\x00\x00\x01\x9a>\xc4\x05{\
\x00\x00\x04h\x00\x00\x00\x00\x00\x01\x00\x02\x8a\xb0\
\x00\x00\x01\x9a\x0e\xf3\x1c\xc8\
\x00\x00\x01\x9a>\xc4\x05\x84\
\x00\x00\x05>\x00\x00\x00\x00\x00\x01\x00\x02\xbc\xd1\
\x00\x00\x01\x9a\x0e\xf3\x1c\xc8\
\x00\x00\x01\x9a>\xc4\x05\x85\
\x00\x00\x05\x0c\x00\x00\x00\x00\x00\x01\x00\x02\xb9\x8e\
\x00\x00\x01\x9a\x0e\xa9\x0f\xa1\
\x00\x00\x01\x9a>\xc4\x05t\
\x00\x00\x00\xcc\x00\x00\x00\x00\x00\x01\x00\x00#\xb3\
\x00\x00\x01\x9a\x0e\xa9\x10'\
\x00\x00\x01\x9a>\xc4\x05t\
\x00\x00\x00\x9e\x00\x00\x00\x00\x00\x01\x00\x00!\x14\
\x00\x00\x01\x99\xce\xd7\xa8\x13\
\x00\x00\x01\x9a\x14\xe2\x1b\xbb\
\x00\x00\x06\xb2\x00\x00\x00\x00\x00\x01\x00\x03_2\
\x00\x00\x01\x9a\x0e\xd1\xf5\xe8\
\x00\x00\x01\x9a>\xc4\x05{\
\x00\x00\x01`\x00\x00\x00\x00\x00\x01\x00\x00rC\
\x00\x00\x01\x9a\x0e\xf3\x1c\xc8\
\x00\x00\x01\x9a>\xc4\x05\x84\
\x00\x00\x064\x00\x00\x00\x00\x00\x01\x00\x03)\xfc\
\x00\x00\x01\x9a\x0e\xf3\x1c\xc8\
\x00\x00\x01\x9a>\xc4\x05\x83\
\x00\x00\x05\xa6\x00\x00\x00\x00\x00\x01\x00\x02\xd7\xf5\
\x00\x00\x01\x99\xcf3\xa2a\
\x00\x00\x01\x9a\x14\xe2\x1b\xbe\
\x00\x00\x01\xa0\x00\x00\x00\x00\x00\x01\x00\x00{\x07\
\x00\x00\x01\x9a\x0e\xf3\x1c\xc8\
\x00\x00\x01\x9a>\xc4\x05\x82\
\x00\x00\x03\x1e\x00\x00\x00\x00\x00\x01\x00\x01&\xcb\
\x00\x00\x01\x9a\x0e\xf3\x1c\xc8\
\x00\x00\x01\x9a>\xc4\x05\x82\
\x00\x00\x04\xdc\x00\x00\x00\x00\x00\x01\x00\x02\x98\x0d\
\x00\x00\x01\x9a(\xb98\xf0\
\x00\x00\x01\x9a>\xc4\x05\x7f\
\x00\x00\x06\x0a\x00\x00\x00\x00\x00\x01\x00\x02\xecg\
\x00\x00\x01\x9a\x0e\xc1\x05\xa4\
\x00\x00\x01\x9a>\xc4\x05x\
\x00\x00\x01\xc0\x00\x00\x00\x00\x00\x01\x00\x00\x84.\
\x00\x00\x01\x9a\x0e\xca\xd4$\
\x00\x00\x01\x9a>\xc4\x05i\
\x00\x00\x04\xf2\x00\x00\x00\x00\x00\x01\x00\x02\x9c\x95\
\x00\x00\x01\x9a\x0e\xb8\xbf\x88\
\x00\x00\x01\x9a>\xc4\x05q\
\x00\x00\x04L\x00\x00\x00\x00\x00\x01\x00\x02h\xd9\
\x00\x00\x01\x9a\x0e\xca\xd3\xd1\
\x00\x00\x01\x9a>\xc4\x05j\
\x00\x00\x03\xd6\x00\x00\x00\x00\x00\x01\x00\x01\xaa\x0a\
\x00\x00\x01\x9a\x0e\xa8\x0b\x03\
\x00\x00\x01\x9a>\xc4\x05\x82\
\x00\x00\x00n\x00\x00\x00\x00\x00\x01\x00\x00\x1d\x5c\
\x00\x00\x01\x9a\x0e\xb8.\xab\
\x00\x00\x01\x9a>\xc4\x05\x85\
\x00\x00\x05\x88\x00\x00\x00\x00\x00\x01\x00\x02\xc8\xac\
\x00\x00\x01\x9a\x0e\xb2\xe6>\
\x00\x00\x01\x9a>\xc4\x05\x80\
\x00\x00\x02\xea\x00\x00\x00\x00\x00\x01\x00\x01\x22\x08\
\x00\x00\x01\x9a\x0e\xd2W\x91\
\x00\x00\x01\x9a>\xc4\x05t\
\x00\x00\x06 \x00\x00\x00\x00\x00\x01\x00\x03&\x04\
\x00\x00\x01\x9a\x0e\xd8\xa4\xd1\
\x00\x00\x01\x9a>\xc4\x05q\
\x00\x00\x020\x00\x00\x00\x00\x00\x01\x00\x00\xea\x99\
\x00\x00\x01\x9a\x0e\xe2\x9c0\
\x00\x00\x01\x9a>\xc4\x05}\
\x00\x00\x05Z\x00\x00\x00\x00\x00\x01\x00\x02\xc5\x8e\
\x00\x00\x01\x99\xce\xd7\xa7\xc6\
\x00\x00\x01\x9a\x14\xe2\x1b\xbe\
\x00\x00\x04\x22\x00\x00\x00\x00\x00\x01\x00\x01\xffL\
\x00\x00\x01\x9a\x0e\xcf\x14o\
\x00\x00\x01\x9a>\xc4\x05y\
\x00\x00\x01:\x00\x00\x00\x00\x00\x01\x00\x00.\xdc\
\x00\x00\x01\x9a\x0e\xcf\x13\xdd\
\x00\x00\x01\x9a>\xc4\x05z\
\x00\x00\x03\xf0\x00\x00\x00\x00\x00\x01\x00\x01\xabj\
\x00\x00\x01\x9a\x0e\xcf\x14#\
\x00\x00\x01\x9a>\xc4\x05z\
\x00\x00\x03v\x00\x00\x00\x00\x00\x01\x00\x01I\x0f\
\x00\x00\x01\x9a\x0e\xa8\x9d\xc0\
\x00\x00\x01\x9a>\xc4\x05|\
\x00\x00\x02H\x00\x00\x00\x00\x00\x01\x00\x00\xf4\x8f\
\x00\x00\x01\x9a\x0e\xb7\xa7\xa9\
\x00\x00\x01\x9a>\xc4\x05n\
\x00\x00\x02\xc0\x00\x00\x00\x00\x00\x01\x00\x01\x1c\xda\
\x00\x00\x01\x9a\x0e\xb7\xa7\xff\
\x00\x00\x01\x9a>\xc4\x05n\
\x00\x00\x044\x00\x00\x00\x00\x00\x01\x00\x02h\x84\
\x00\x00\x01\x9a\x0e\xb7\xa6\xd1\
\x00\x00\x01\x9a>\xc4\x05p\
\x00\x00\x00\xb4\x00\x00\x00\x00\x00\x01\x00\x00#^\
\x00\x00\x01\x9a\x0e\xb7\xa7c\
\x00\x00\x01\x9a>\xc4\x05o\
"
def qInitResources():

View File

@ -3,7 +3,7 @@ from typing import Optional, Dict, Any
import time
import threading
import requests
from models import LoginResponse
from busisness.models import LoginResponse
from config.ini_manager import ini_manager

View File

@ -1,14 +1,9 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
RFID
"""
import sys
import os
import time
# 添加项目根目录到Python路径
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))
from hardware.RFID.rfid_service import rfid_service
@ -72,25 +67,25 @@ def test_rfid_functions():
# 测试数据接收功能 (注意:这会启动一个后台线程)
# print("\n5. 测试数据接收功能 (启动接收线程5秒后停止):")
try:
rfid._callback = test_data_callback
rfid._data_buffer = []
rfid._data_buffer.append('SHR2B2-12,B2,6600 * 1500,1.910')
rfid._data_buffer.append('SHR2B2-12,B2,6600 * 1500,1.910')
rfid._data_buffer.append('SHR2B2-12,B2,6600 * 1500,1.910')
rfid._data_buffer.append('SHR2B2-12,B2,6600 * 1500,1.910')
rfid._data_buffer.append('SHR2B2-12,B2,6600 * 1500,1.910')
rfid._data_buffer.append('SHR2B2-12,B2,6600 * 1500,1.910')
rfid._data_buffer.append('THR B1-12,B1,6600 * 1500,1.900')
rfid._data_buffer.append('THR B1-12,B1,6600 * 1500,1.900')
rfid._data_buffer.append('THR B1-12,B1,6600 * 1500,1.900')
rfid._data_buffer.append('THR B1-12,B1,6600 * 1500,1.900')
rfid._data_buffer.append('THR B1-12,B1,6600 * 1500,1.900')
rfid._data_buffer.append('THR B1-12,B1,6600 * 1500,1.900')
rfid._data_buffer.append('THR B1-12,B1,6600 * 1500,1.900')
rfid._data_buffer.append('THR B1-12,B1,6600 * 1500,1.900')
rfid._data_buffer.append('THR B1-12,B1,6600 * 1500,1.900')
rfid._process_collected_data()
# rfid.start_receiver(callback=test_data_callback)
# rfid._callback = test_data_callback
# rfid._data_buffer = []
# rfid._data_buffer.append('SHR2B2-12,B2,6600 * 1500,1.910')
# rfid._data_buffer.append('SHR2B2-12,B2,6600 * 1500,1.910')
# rfid._data_buffer.append('SHR2B2-12,B2,6600 * 1500,1.910')
# rfid._data_buffer.append('SHR2B2-12,B2,6600 * 1500,1.910')
# rfid._data_buffer.append('SHR2B2-12,B2,6600 * 1500,1.910')
# rfid._data_buffer.append('SHR2B2-12,B2,6600 * 1500,1.910')
# rfid._data_buffer.append('THR B1-12,B1,6600 * 1500,1.900')
# rfid._data_buffer.append('THR B1-12,B1,6600 * 1500,1.900')
# rfid._data_buffer.append('THR B1-12,B1,6600 * 1500,1.900')
# rfid._data_buffer.append('THR B1-12,B1,6600 * 1500,1.900')
# rfid._data_buffer.append('THR B1-12,B1,6600 * 1500,1.900')
# rfid._data_buffer.append('THR B1-12,B1,6600 * 1500,1.900')
# rfid._data_buffer.append('THR B1-12,B1,6600 * 1500,1.900')
# rfid._data_buffer.append('THR B1-12,B1,6600 * 1500,1.900')
# rfid._data_buffer.append('THR B1-12,B1,6600 * 1500,1.900')
# rfid._process_collected_data()
rfid.start_receiver(callback=test_data_callback)
# print("接收线程已启动,等待接收数据...")
# 等待5秒模拟接收过程
time.sleep(60*60)

View File

@ -334,6 +334,7 @@ class HopperWidget(QWidget):
angle : 传入多少度 (单位°)
"""
self.lower_extra_label.setText(f"开: {angle}°")
self.lower_clamp_widget.set_angle(angle)
# ------------------------------
# 设置上料斗状态0=绿1=黄2=红)