> For the complete documentation index, see [llms.txt](https://docs.roboflow.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.roboflow.com/roboflow/roboflow-ko/deploy/device-manager/plc-relay.md).

# PLC Relay

PLC Relay는 PLC 태그를 읽고 쓰기 위한 HTTP API를 제공하는 edge container 서비스입니다. 프로토콜을 선택하고, 연결 세부 정보를 입력하고, 태그를 정의하여 Deployment Manager UI에서 구성합니다.

{% hint style="info" %}
PLC Relay는 Enterprise 고객 전용으로 제공됩니다. [Roboflow 영업팀에 문의하세요](https://roboflow.com/sales) 자세히 알아보세요.
{% endhint %}

## 지원되는 프로토콜

PLC Relay 서비스를 추가하거나 편집할 때, 세 가지 프로토콜 중 하나를 선택합니다. 각 프로토콜에는 고유한 연결 설정과 태그 형식이 있습니다.

| 프로토콜                        | PLC                                  | 기본 포트 |
| --------------------------- | ------------------------------------ | ----- |
| Allen-Bradley (EtherNet/IP) | CompactLogix, ControlLogix, Micro800 | 44818 |
| Modbus TCP                  | 모든 Modbus TCP 장치                     | 502   |
| Siemens S7                  | S7-300, S7-400, S7-1200, S7-1500     | 102   |

{% hint style="warning" %}
프로토콜을 전환하면 구성된 모든 태그가 지워집니다. 태그 주소 형식은 프로토콜 간에 서로 호환되지 않기 때문입니다. UI는 변경 사항을 적용하기 전에 확인을 요청합니다.
{% endhint %}

## 연결 설정

### PLC 주소

주소 형식은 선택한 프로토콜에 따라 다릅니다:

* **Allen-Bradley:** IP 또는 호스트 이름이며, 뒤에 선택적으로 `/slot` (예: `192.168.1.100/0`) 또는 전체 CIP 라우팅 경로.
* **Modbus TCP:** IP 또는 호스트 이름이며, 선택적으로 `:port` (예: `192.168.1.100:502`). 또한 32비트 값에는 Unit ID(0-255)와 Word Order(big 또는 little)도 필요합니다.
* **Siemens S7:** IP 또는 호스트 이름이며, 선택적으로 `:port` (예: `192.168.1.100:102`). 또한 Rack(0-7)과 Slot(0-31)도 필요합니다.

### Simulation Mode

활성화하면 PLC Relay는 실제 PLC에 연결하는 대신 메모리 내 시뮬레이터를 사용합니다. 모든 API 작업은 정상적으로 작동하지만, 값은 메모리에 저장됩니다. 이는 하드웨어 없이 테스트할 때 유용합니다.

## 태그 구성

태그는 API를 통해 접근 가능한 PLC 데이터 포인트를 정의합니다. 각 tag에는 이름, 데이터 타입, 쓰기 가능 플래그, 그리고 선택적 설명이 있습니다.

### 데이터 타입

| 유형     | 설명            | 범위                               |
| ------ | ------------- | -------------------------------- |
| `BOOL` | 불리언           | `true` / `false`                 |
| `INT`  | 16비트 부호 있는 정수 | -32,768부터 32,767까지               |
| `DINT` | 32비트 부호 있는 정수 | -2,147,483,648부터 2,147,483,647까지 |
| `REAL` | 32비트 부동소수점    | IEEE 754                         |

### 태그 이름 형식

{% tabs %}
{% tab title="Allen-Bradley" %}
태그 이름은 PLC program과 일치하며 대소문자를 구분합니다.

| 스타일          | 예시                            |
| ------------ | ----------------------------- |
| 단순           | `TagName`                     |
| Program 범위   | `Program:MainProgram.TagName` |
| 배열 요소        | `TagName[0]`                  |
| UDT 멤버       | `MyUDT.Member`                |
| {% endtab %} |                               |

{% tab title="Modbus TCP" %}
형식: `{area}:{address}` 여기서 address는 음이 아닌 정수입니다.

| 영역           | 유형              | 접근 권한 | 예시            |
| ------------ | --------------- | ----- | ------------- |
| `코일`         | BOOL            | 쓰기 가능 | `coil:0`      |
| `디스크리트`      | BOOL            | 읽기 전용 | `discrete:5`  |
| `홀딩`         | INT, DINT, REAL | 쓰기 가능 | `holding:100` |
| `입력`         | INT, DINT, REAL | 읽기 전용 | `input:200`   |
| {% endtab %} |                 |       |               |

{% tab title="Siemens S7" %}
Data Block 형식: `DB{n}.DB[XWD]{byte}[.{bit}]`

영역 형식: `[MIQEA][WD]?{byte}[.{bit}]`

| 주소              | 유형                 | 설명                          |
| --------------- | ------------------ | --------------------------- |
| `DB1.DBX0.0`    | BOOL               | Data Block 1의 byte 0의 bit 0 |
| `DB1.DBW0`      | INT                | DB1의 16비트 워드                |
| `DB1.DBD0`      | DINT 또는 REAL       | DB1의 32비트 더블워드              |
| `M0.0`          | BOOL               | Merker bit                  |
| `I0.0` / `Q0.0` | BOOL               | 공정 입력/출력 bit                |
| `MW0` / `MD0`   | INT / DINT 또는 REAL | Merker 워드 / 더블워드            |

S7-1200/1500의 경우: TIA Portal에서 PUT/GET를 활성화하고 접근하는 DB들에서 optimized block access를 비활성화하세요.
{% endtab %}
{% endtabs %}

## Web Dashboard 및 REST API

PLC Relay에는 태그 값을 실시간으로 모니터링할 수 있는 내장 Web Dashboard가 포함되어 있습니다. 서비스가 실행되면 다음 주소에서 접근하세요 `http://<device-ip>:8007`.

Dashboard에는 다음에서 인터랙티브 Swagger documentation도 호스팅됩니다 `/docs` 및 다음에서 시각적 config builder도 제공합니다 `/static/config-builder.html`.

### API 엔드포인트

| 메서드  | 경로               | 설명                     |
| ---- | ---------------- | ---------------------- |
| GET  | `/healthz`       | 연결 및 검증 상태를 확인하는 상태 점검 |
| GET  | `/all_tags`      | 모든 tag의 현재 값을 읽기       |
| GET  | `/read?tag=name` | 이름으로 단일 tag 읽기         |
| POST | `/write`         | 단일 tag 쓰기              |
| POST | `/read_batch`    | 여러 tag를 한 번에 읽기        |
| POST | `/write_batch`   | 여러 tag를 한 번에 쓰기        |
| GET  | `/schema`        | 모든 tag 정의 가져오기         |
| POST | `/validate`      | PLC에 대해 tag 검증을 다시 실행  |

## 연결 모니터링

기기 페이지에는 현재 연결 상태, 활성 프로토콜, 최신 tag 값을 보여주는 실시간 PLC Relay 상태 카드가 표시됩니다. 릴레이가 PLC에 도달할 수 없으면 카드에 연결 불가 배너가 표시됩니다.

릴레이가 연결을 잃을 때 알림을 받으려면 기기의 "Device Alerts" 탭에서 "PLC Disconnected" alert를 추가하세요. 다음을 참조하세요 [Device Alerts 설정](/roboflow/roboflow-ko/deploy/device-manager/setting-up/set-up-device-alerts.md).

## 문제 해결

| 증상                                  | 수정                                                                                                   |
| ----------------------------------- | ---------------------------------------------------------------------------------------------------- |
| "PLC not connected" (Allen-Bradley) | PLC 주소 형식(IP/Slot)을 확인하고, 포트 44818에 접근 가능한지 확인하세요                                                    |
| "PLC not connected" (Modbus)        | IP/포트(기본값 502)를 확인하고 Unit ID가 장치와 일치하는지 확인하세요                                                        |
| "PLC not connected" (Siemens S7)    | IP/포트(기본값 102), rack, slot 값을 확인하세요. S7-1200/1500의 경우 PUT/GET를 활성화하고 optimized block access를 비활성화하세요 |
| "Function refused" (Siemens S7)     | TIA Portal에서 PUT/GET가 비활성화되어 있거나 대상 DB에서 optimized block access가 활성화되어 있습니다                          |
| REAL 값이 Modbus에서 이상한 값으로 읽힘         | 반대 Word Order(big vs. little)를 시도해 보세요                                                               |
| 검증 결과 NOT\_FOUND                    | 정확한 tag 이름(대소문자 구분)을 PLC program에서 확인하세요                                                             |
