> 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/deployment/ko/self-hosted/enterprise/deployment-manager/plc-relay.md).

# PLC Relay

PLC Relay는 PLC 태그를 읽고 쓰기 위한 HTTP API를 제공하는 엣지 컨테이너 서비스입니다. 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)도 필요합니다.

### 시뮬레이션 모드

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

## 태그 구성

태그는 API를 통해 액세스할 수 있는 PLC 데이터 지점을 정의합니다. 각 태그에는 이름, 데이터 형식, 쓰기 가능 여부 플래그, 그리고 선택적 설명이 있습니다.

### 데이터 형식

| 유형     | 설명            | 범위                              |
| ------ | ------------- | ------------------------------- |
| `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 프로그램과 일치하며 대소문자를 구분합니다.

| 스타일          | 예시                            |
| ------------ | ----------------------------- |
| 단순           | `TagName`                     |
| 프로그램 범위      | `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" %}
데이터 블록 형식: `DB{n}.DB[XWD]{byte}[.{bit}]`

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

| 주소              | 유형                 | 설명                    |
| --------------- | ------------------ | --------------------- |
| `DB1.DBX0.0`    | BOOL               | 데이터 블록 1의 바이트 0의 비트 0 |
| `DB1.DBW0`      | INT                | DB1의 16비트 워드          |
| `DB1.DBD0`      | DINT 또는 REAL       | DB1의 32비트 더블 워드       |
| `M0.0`          | BOOL               | 메르커 비트                |
| `I0.0` / `Q0.0` | BOOL               | 프로세스 입력/출력 비트         |
| `MW0` / `MD0`   | INT / DINT 또는 REAL | 메르커 워드 / 더블 워드        |

S7-1200/1500의 경우: TIA Portal에서 PUT/GET을 활성화하고 액세스하는 DB에서 최적화 블록 액세스를 비활성화하세요.
{% endtab %}
{% endtabs %}

## 웹 대시보드 및 REST API

PLC Relay에는 태그 값을 실시간으로 모니터링할 수 있는 기본 제공 웹 대시보드가 포함되어 있습니다. 서비스가 실행되면 다음에서 액세스할 수 있습니다. `http://<device-ip>:8007`.

대시보드에는 다음 위치에서 대화형 Swagger 문서도 제공됩니다. `/docs` 그리고 다음 위치에 시각적 구성 빌더가 있습니다. `/static/config-builder.html`.

### API 엔드포인트

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

## 연결 모니터링

디바이스 페이지에는 현재 연결 상태, 활성 프로토콜, 최신 태그 값이 표시된 PLC Relay 상태 카드가 실시간으로 나타납니다. 릴레이가 PLC에 도달할 수 없으면 카드에 연결 불가 배너가 표시됩니다.

릴레이가 연결을 잃었을 때 알림을 받으려면 기기의 "Device Alerts" 탭에서 "PLC Disconnected" 경고를 추가하세요. 참조: [디바이스 경고 설정](/deployment/ko/self-hosted/enterprise/deployment-manager/setting-up/set-up-device-alerts.md).

## 문제 해결

| 증상                             | 해결 방법                                                                                    |
| ------------------------------ | ---------------------------------------------------------------------------------------- |
| "PLC에 연결되지 않음" (Allen-Bradley) | PLC 주소 형식(IP/Slot)을 확인하고, 포트 44818에 접근 가능한지 확인하세요                                        |
| "PLC에 연결되지 않음" (Modbus)        | IP/포트(기본값 502)를 확인하고 Unit ID가 장치와 일치하는지 확인하세요                                            |
| "PLC에 연결되지 않음" (Siemens S7)    | IP/포트(기본값 102), rack, slot 값을 확인하세요. S7-1200/1500의 경우 PUT/GET을 활성화하고 최적화 블록 액세스를 비활성화하세요 |
| "함수가 거부됨" (Siemens S7)         | TIA Portal에서 PUT/GET이 비활성화되어 있거나 대상 DB에서 최적화 블록 액세스가 활성화되어 있습니다                          |
| REAL 값이 깨진 값으로 읽힘 (Modbus)     | 반대쪽 Word Order(big vs. little)를 시도하세요                                                    |
| 검증 결과 NOT\_FOUND로 표시됨          | 정확한 태그 이름(대소문자 구분)을 PLC 프로그램에서 확인하세요                                                     |
