diff --git a/busisness/blls.py b/busisness/blls.py index 7cb7ada..432cd84 100644 --- a/busisness/blls.py +++ b/busisness/blls.py @@ -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__"): diff --git a/busisness/dals.py b/busisness/dals.py index 352dcc2..28ff0c9 100644 --- a/busisness/dals.py +++ b/busisness/dals.py @@ -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: diff --git a/config/settings.py b/config/settings.py index 6ee5883..2a3d256 100644 --- a/config/settings.py +++ b/config/settings.py @@ -1,12 +1,11 @@ # config/settings.py import os - class Settings: def __init__(self): # 项目根目录 self.project_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) - + # 网络继电器配置 self.relay_host = '192.168.0.18' self.relay_port = 50000 @@ -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在线 + diff --git a/controller/main_controller.py b/controller/main_controller.py index 321a1cd..6c0f506 100644 --- a/controller/main_controller.py +++ b/controller/main_controller.py @@ -1,23 +1,83 @@ +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() # 初始化子控制器 self._initSubControllers() - + # 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): # 振捣视频控制 diff --git a/core/state.py b/core/state.py index cdf3d83..e8a59bf 100644 --- a/core/state.py +++ b/core/state.py @@ -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 \ No newline at end of file diff --git a/core/system.py b/core/system.py index 8361a5d..4148c71 100644 --- a/core/system.py +++ b/core/system.py @@ -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() diff --git a/db/three.db-shm b/db/three.db-shm index 6199341..f84e849 100644 Binary files a/db/three.db-shm and b/db/three.db-shm differ diff --git a/db/three.db-wal b/db/three.db-wal index 08e8bfd..c18bfcb 100644 Binary files a/db/three.db-wal and b/db/three.db-wal differ diff --git a/doc/md/Arch.md b/doc/md/Arch.md new file mode 100644 index 0000000..8f537bd --- /dev/null +++ b/doc/md/Arch.md @@ -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**:如果需要展示子系统的类结构和它们之间的关系 + +选择图表类型时,应根据具体需求考虑:是需要展示静态结构关系,还是动态交互过程;是需要高层次概览,还是详细的交互细节。 \ No newline at end of file diff --git a/feeding/controller.py b/feeding/controller.py index 4e31f9a..1b1e299 100644 --- a/feeding/controller.py +++ b/feeding/controller.py @@ -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 diff --git a/feeding/process.py b/feeding/process.py index b8718e7..d0d78f0 100644 --- a/feeding/process.py +++ b/feeding/process.py @@ -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 - # 检查关键设备是否可连接 - if not self._check_device_connectivity(): - print("关键设备连接失败,无法开始下料") + #确认是否保存到数据库 + 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 + + 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,12 +111,12 @@ 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 print(f"上料斗初始重量: {initial_upper_weight:.2f}kg, 目标重量: {target_upper_weight:.2f}kg") - + # 确保下料斗出砼门关闭 self.relay_controller.control(self.relay_controller.DOOR_LOWER_2, 'close') # 打开上料斗出砼门 @@ -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' diff --git a/hardware/__pycache__/relay.cpython-39.pyc b/hardware/__pycache__/relay.cpython-39.pyc index 174afd4..3bd4bf5 100644 Binary files a/hardware/__pycache__/relay.cpython-39.pyc and b/hardware/__pycache__/relay.cpython-39.pyc differ diff --git a/hardware/relay.py b/hardware/relay.py index 0b323f9..049942e 100644 --- a/hardware/relay.py +++ b/hardware/relay.py @@ -17,7 +17,7 @@ class RelayController: self.host = host self.port = port self.modbus_client = ModbusTcpClient(host, port=port) - + # 继电器命令(原始Socket) self.relay_commands = { self.DOOR_UPPER: {'open': '00000000000601050000FF00', 'close': '000000000006010500000000'}, diff --git a/resources/resources_rc.py b/resources/resources_rc.py index 37fbfeb..b661162 100644 --- a/resources/resources_rc.py +++ b/resources/resources_rc.py @@ -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(): diff --git a/service/api_http_client.py b/service/api_http_client.py index d935f3d..150cd1a 100644 --- a/service/api_http_client.py +++ b/service/api_http_client.py @@ -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 diff --git a/tests/test_rfid.py b/tests/test_rfid.py index afea353..75ef5eb 100644 --- a/tests/test_rfid.py +++ b/tests/test_rfid.py @@ -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) diff --git a/view/widgets/hopper_widget.py b/view/widgets/hopper_widget.py index c1a4064..557094f 100644 --- a/view/widgets/hopper_widget.py +++ b/view/widgets/hopper_widget.py @@ -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=红)