# OP060 工位自动模式工作流程图 ## 当前配置 - `submit_mode: auto` - `device.type: modbus_tcp` - `complete_condition.type: count` ## 流程图 ``` ┌─────────────────────────────────────────────────────────────────┐ │ 系统启动 │ │ · 加载 station.yaml 配置 │ │ · 连接 MES TCP 服务器 (192.168.110.99:3000) │ │ · 创建 ModbusTcpDriver 连接 PLC (192.168.0.6:502) │ │ · 加载 debug_rules.json 持续规则 │ │ · 启动心跳定时器 (60s) │ └──────────────────────┬──────────────────────────────────────────┘ ▼ ┌──────────────────────────────────────────────────────────────────┐ │ 步骤0: scan_product (扫描工件码) │ │ ───────────────────────────────────────── │ │ 前置条件: state == IDLE 或 ERROR │ │ 触发方式: 用户扫码枪扫描 / 手动输入 │ │ 执行逻辑: │ │ · 读取工件码,36位码取前20位 │ │ · 保存到 context.productSn │ │ · 状态变更: IDLE → SCANNING │ │ 同步步骤,成功后立即进入下一步 │ └──────────────────────┬──────────────────────────────────────────┘ ▼ ┌──────────────────────────────────────────────────────────────────┐ │ 步骤1: check_quality (质量检查) │ │ ───────────────────────────────────────── │ │ 前置条件: productSn 不为空 │ │ 执行逻辑: │ │ · 状态变更: SCANNING → CHECKING │ │ · 发送 AQDW 报文到 MES 服务器 │ │ · 等待服务器响应 (异步) │ │ │ │ 服务器响应处理: │ │ · UD → 质量通过,设 qualityPassed=true │ │ · OK → 已加工过,不允许重复 │ │ · NG/QD/NE/LK... → 质量不合格,流程中断 │ │ │ │ 通过后显示: "可以加工,等待设备启动" │ └──────────────────────┬──────────────────────────────────────────┘ ▼ ┌──────────────────────────────────────────────────────────────────┐ │ 步骤2: wait_device_start (等待设备启动) │ │ ───────────────────────────────────────── │ │ 前置条件: qualityPassed == true │ │ 执行逻辑: │ │ · 状态变更: CHECKING → WAITING │ │ · 启动轮询线程 (WaitStart-OP060A, 间隔200ms) │ │ · 轮询检查: │ │ 1. 先检查 context.deviceStarted (支持调试面板控制) │ │ 2. 再检查 driver.isDeviceStarted() (读PLC信号) │ │ · 超时: 5分钟 │ │ │ │ ⚠ 注意: 此步骤只是"等待"PLC启动信号 │ │ 并不主动给PLC发送就绪信号(signalReady) │ │ │ │ 调试模式: 手动设置 deviceStarted=true 可跳过 │ └──────────────────────┬──────────────────────────────────────────┘ ▼ ┌──────────────────────────────────────────────────────────────────┐ │ 步骤3: wait_device_complete (等待设备完成) │ │ ───────────────────────────────────────── │ │ 前置条件: qualityPassed == true │ │ 执行逻辑: │ │ · 状态保持: WAITING │ │ · 启动轮询线程 (DevicePoll-OP060A, 间隔500ms) │ │ · 完成条件判断 (type=count): │ │ ┌─────────────────────────────────────────────┐ │ │ │ 读取 finishedCount (Modbus地址66) │ │ │ │ 读取 presetCount (Modbus地址4534) │ │ │ │ 判断: presetCount > 0 && finished >= preset │ │ │ │ │ │ │ │ ConditionInterceptor 拦截: │ │ │ │ 如果有持续规则,Modbus读取失败后 │ │ │ │ 用规则值替换 (如 finishedCount: 0→10) │ │ │ └─────────────────────────────────────────────┘ │ │ · 完成后读取: │ │ - finishedCount → context │ │ - qualifiedCount (Modbus地址68) → context │ │ · 设置 workStarted = true (作为upload_result前置条件) │ │ · 超时: 5分钟 │ │ │ │ 调试模式: 锁定 presetCount=10, finishedCount=10 可自动满足 │ └──────────────────────┬──────────────────────────────────────────┘ ▼ ┌──────────────────────────────────────────────────────────────────┐ │ 步骤4: upload_result (上传结果) │ │ ───────────────────────────────────────── │ │ 前置条件 (自动模式+有设备): │ │ · qualityPassed == true │ │ · workStarted == true (由wait_device_complete设置) │ │ · resultUploaded == false │ │ 执行逻辑: │ │ · 状态变更: WAITING → UPLOADING │ │ · 发送 MQDW 报文到 MES 服务器 │ │ (包含: 工位号、工艺号、工件码、结果OK/NG、时间) │ │ · 等待服务器响应 (异步) │ │ │ │ 服务器响应处理: │ │ · OK → resultUploaded=true, 提交成功 │ │ · 其他 → 提交失败,提示重试 │ │ │ │ ⚠ 自动模式: OK/NG按钮始终禁用 │ │ 手动模式: 等待用户点击OK/NG后触发 │ └──────────────────────┬──────────────────────────────────────────┘ ▼ ┌──────────────────────────────────────────────────────────────────┐ │ 步骤5: reset_station (重置工位) │ │ ───────────────────────────────────────── │ │ 前置条件: 无 (任何状态都可执行) │ │ 执行逻辑: │ │ · 调用 context.reset() 清空所有状态: │ │ productSn=null, qualityPassed=false, │ │ workStarted=false, resultUploaded=false, │ │ deviceStarted=false, finishedCount=0, presetCount=0... │ │ · 状态变更: UPLOADING → IDLE │ │ · 显示: "请扫描工件码" │ │ 同步步骤 │ └──────────────────────┬──────────────────────────────────────────┘ ▼ ┌──────────────────────────────────────────────────────────────────┐ │ 流程完成 │ │ · 状态变更: IDLE → COMPLETED → IDLE │ │ · 再次 context.reset() │ │ · 显示: "结果已提交,请扫下一件" │ │ · 步骤索引重置为0,等待下一次扫码 │ │ │ │ ⚠ 持续规则(ConditionInterceptor)不会被reset清除 │ │ 下一轮流程中拦截器仍然生效 │ └──────────────────────┬──────────────────────────────────────────┘ │ └──────→ 回到步骤0,等待扫码 ``` ## 关键变量流转 ``` 步骤 | productSn | qualityPassed | deviceStarted | workStarted | resultUploaded ─────────────────────── | --------- | ------------- | ------------- | ----------- | -------------- scan_product 完成后 | ✅ 有值 | false | false | false | false check_quality 通过后 | ✅ 有值 | ✅ true | false | false | false wait_device_start 完成后| ✅ 有值 | ✅ true | ✅ true | false | false wait_device_complete后 | ✅ 有值 | ✅ true | ✅ true | ✅ true | false upload_result 成功后 | ✅ 有值 | ✅ true | ✅ true | ✅ true | ✅ true reset_station 后 | null | false | false | false | false ``` ## 通信时序 ``` 客户端 MES服务器 PLC (Modbus) │ │ │ │──── 心跳 AXTW (每60s) ───────→│ │ │ │ │ │──── AQDW (质量查询) ─────────→│ │ │←─── AQDW 响应 (UD=可加工) ────│ │ │ │ │ │ │ 轮询 isDeviceStarted() │ │ │ ←────────────────────────│ │ │ │ │ │ 轮询 finishedCount │ │ │ ←────────────────────────│ │ │ 轮询 presetCount │ │ │ ←────────────────────────│ │ │ 轮询 qualifiedCount │ │ │ ←────────────────────────│ │ │ │ │──── MQDW (结果上传) ─────────→│ │ │←─── MQDW 响应 (OK) ──────────│ │ │ │ │ ```