# ZLAC8015D V4 RS485 슬레이브 ID 운용 가이드

ZLTECH ZLAC8015D V4 듀얼 드라이버의 RS485(Modbus RTU) 슬레이브 ID를 확인/변경하기 위한 파이썬 스크립트 모음.
프로토콜 세부 사항은 동봉된 `ZLAC8015D V4 Series RS485 Communication Version 1.06` 매뉴얼 기준.

## 사전 준비

```bash
python3 -m venv .venv
./.venv/bin/pip install -r requirements.txt   # pymodbus + pyserial
```

- 통신 라이브러리로 `pymodbus`(ModbusSerialClient, RTU) 사용
- RS485-USB 어댑터로 드라이버와 연결 (A/B 라인, GND 공통)
- 기본 통신 설정: Baud rate 115200, 8 data bit, No parity, Stop bit 1
- 드라이버 출고 시 기본 슬레이브 ID는 **1**
- 실제 하드웨어 운용 테스트는 우분투 환경에서 진행 예정 (개발/문법 검증은 macOS에서 완료)

## 파일 구성

| 파일 | 역할 |
|---|---|
| `zltech_modbus.py` | pymodbus 기반 통신 공용 함수 (read/write register) |
| `zltech_scan_ids.py` | 버스에 연결된 슬레이브 ID 스캔 |
| `zltech_set_id.py` | 슬레이브 ID 변경 (EEPROM 저장 포함) |
| `requirements.txt` | 의존 패키지 (pymodbus, pyserial) |

## 1. 슬레이브 ID 확인 (스캔)

```bash
./.venv/bin/python zltech_scan_ids.py --port /dev/tty.usbserial-XXXX --range 1 16
```

- `--port`: 시리얼 포트 (Ubuntu: `/dev/ttyUSB0` 등, macOS: `/dev/tty.usbserial-XXXX`, Windows: `COM5` 등)
- `--baud`: 기본값 115200
- `--range START END`: 스캔할 ID 범위 (기본 1~16)

응답한 ID 목록이 출력됨.

## 2. 슬레이브 ID 변경 (1과 2로 설정)

⚠️ **두 드라이버 모두 기본 ID가 1**이라, 동시에 버스에 연결하면 응답이 충돌합니다.
**반드시 한 번에 하나씩만 연결**한 상태로 진행하세요.

### 순서

1. 드라이버 A만 연결 → 기본값 그대로 ID 1 유지 (변경 불필요)
2. 드라이버 A 전원 off, 분리
3. 드라이버 B만 연결 → ID를 2로 변경

   ```bash
   ./.venv/bin/python zltech_set_id.py --port /dev/tty.usbserial-XXXX --old-id 1 --new-id 2
   ```

4. 드라이버 B 전원을 껐다 켜서(파워사이클) 변경 사항 완전 반영
5. 이제 드라이버 A(ID 1), B(ID 2)를 같은 버스에 함께 연결

6. 확인:

   ```bash
   ./.venv/bin/python zltech_scan_ids.py --port /dev/tty.usbserial-XXXX --range 1 2
   ```

   ID 1, 2 모두 응답하면 성공.

## 참고: 레지스터 주소

| 주소 | 이름 | 범위 | 비고 |
|---|---|---|---|
| `0x2001` | RS485 Custom Drive Node Number | 1~127 | 기본값 1 |
| `0x2002` | RS485 custom communication baud rate | 1~6 (128000~9600bps) | 기본값 2 (115200bps) |
| `0x2010` | RW 속성 파라미터 EEPROM 저장 | 0/1 | 1 = 저장 |

자세한 레지스터 목록은 동봉 매뉴얼의 "Address Directionary" 섹션 참고.
