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) ──────────│ │
│ │ │