# OMRON 目检放行软件通信流程（FINS + TCP扫码枪）

## 1. 系统通信结构

```text
PLC <--FINS--> C# 上位机 <--TCP--> 扫码枪1
                               <--TCP--> 扫码枪2
```

* PLC 与上位机：

  * 通信协议：OMRON FINS
  * 上位机读取 PLC 点位
  * 上位机写入 PLC 点位

* 上位机与扫码枪：

  * 通信协议：TCP Socket
  * 发送触发命令：`T`
  * 接收扫码结果字符串

---

# 2. PLC 通信点位定义

## 2.1 PLC -> 上位机（上位机读取）

| 地址    | 名称            | 类型   | 说明              |
| ----- | ------------- | ---- | --------------- |
| D1001 | PcbArrived    | Bool | PCB已到位，请求上位机处理  |
| D1002 | PlcReset      | Bool | PLC请求上位机清状态/复位  |
| D1003 | PlcAckRelease | Bool | PLC已接收到放行信号（可选） |

预留：

| 地址范围          | 说明               |
| ------------- | ---------------- |
| D1004 ~ D1010 | PLC -> 上位机扩展信号预留 |

---

## 2.2 上位机 -> PLC（上位机写入）

| 地址    | 名称            | 类型   | 说明           |
| ----- | ------------- | ---- | ------------ |
| D1051 | PcBusy        | Bool | 上位机正在处理当前PCB |
| D1052 | ReleasePermit | Bool | 放行脉冲信号       |

---

## 2.3 结果寄存器（上位机写入）

| 地址    | 名称         | 类型  | 说明       |
| ----- | ---------- | --- | -------- |
| D1100 | ResultCode | Int | 本次最终结果代码 |

### ResultCode 定义

| 数值 | 含义   |
| -- | ---- |
| 0  | Idle |
| 1  | 处理中  |
| 10 | 正常放行 |
| 20 | NG放行 |
| 90 | 系统故障 |

---

# 3. TCP 扫码枪通信

## 3.1 扫码枪1

### 发送

```text
T
```

### 接收

```text
二维码/条码字符串
```

---

## 3.2 扫码枪2

### 发送

```text
T
```

### 接收

```text
二维码/条码字符串
```

---

# 4. 工序流程图

```mermaid
flowchart TD

    A[PLC写入 D1001=PcbArrived=1]
    --> B[C#上位机通过FINS读取到位信号]

    B --> C[上位机写入 D1051=PcBusy=1]
    B --> D[上位机写入 D1100=1 处理中]

    D --> E[TCP发送 T 到扫码枪1]
    D --> F[TCP发送 T 到扫码枪2]

    E --> G[扫码枪1返回扫码结果]
    F --> H[扫码枪2返回扫码结果]

    G --> I[上位机汇总扫码结果]
    H --> I

    I --> J{扫码结果判定}

    J -->|成功| K[写入 D1100=10 正常放行]
    J -->|失败| L[写入 D1100=20 NG放行]
    J -->|异常| M[写入 D1100=90 系统故障]

    K --> N[写入 D1052=ReleasePermit=1]
    L --> N

    N --> O[PLC收到放行信号]

    O --> P{是否启用确认信号}

    P -->|启用| Q[PLC写入 D1003=PlcAckRelease=1]
    P -->|不启用| R[进入复位流程]

    Q --> R

    R --> S[PLC写入 D1002=PlcReset=1]

    S --> T[上位机执行复位]

    T --> U[写入 D1051=0]
    U --> V[写入 D1052=0]
    V --> W[写入 D1100=0 Idle]

```
