workflow-flowchart.md 15 KB

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