
이 글이 나한테 해당되는 얘기인지 먼저 확인해보세요
이런 상황이 하나라도 해당된다면, 이 글이 도움이 될 겁니다.
- Mitsubishi iQ-R Series PLC에 연결은 됐는데, IO 카드 주소를 일일이 GX Works3 열어서 확인하고 있다
- X/Y 시작 주소가 슬롯마다 다른데 왜 그런지, 어떻게 계산하는지 모르겠다
- PLC에 어떤 IO 카드가 꽂혀 있는지 코드로 자동으로 알 수 있는지 궁금하다
- 현장에 노트북이 없거나 GX Works3 라이선스가 없을 때 슬롯 구성을 확인할 방법이 필요하다
처음에는 사용자가 직접 주소를 입력하게 만들었습니다.
PLCLink를 만들 때 IO Monitor 화면의 초기 설계가 그랬습니다. "슬롯 1의 X 시작 주소가 뭔지 아세요? 입력해주세요." 현장 엔지니어가 GX Works3을 열고, 하드웨어 구성 화면을 찾고, 슬롯별 주소를 메모해서 입력하는 흐름이었어요.
만들고 나서 생각했습니다. 이거, 쓰기 불편하다.
PLC에 이미 연결이 됐는데, 굳이 사람이 중간에 끼어서 정보를 옮겨야 하는 구조가 맞는 건지. PLC 쪽에서 직접 읽어올 수 있는 방법이 있지 않을까, 거기서 SD260 레지스터를 찾게 됐습니다.
슬롯 주소가 왜 제각각인가

iQ-R Series는 베이스 유닛(base unit)에 IO 카드를 꽂는 구조입니다.
디지털 입력 카드, 디지털 출력 카드, 아날로그 카드 등을 슬롯에 원하는 순서로 꽂을 수 있어요.
문제는 X/Y 주소가 고정이 아니라는 겁니다.
슬롯 0에 꽂힌 카드는 X0000부터 시작하고, 슬롯 1에 꽂힌 카드는 X0010부터 시작합니다.
슬롯 번호가 올라갈수록 주소도 올라갑니다.
그런데 어떤 슬롯에 몇 점짜리 카드를 꽂느냐에 따라 그 다음 슬롯의 시작 주소가 달라집니다.
16점 카드를 꽂으면 다음 슬롯 시작 주소가 +0x10 올라가고, 32점 카드면 +0x20 올라갑니다.
결국 PLC마다, 현장마다 슬롯 구성이 다르면 주소도 전부 달라집니다.
코드로 자동화하려면 이 정보를 어디선가 읽어와야 했습니다.
0x0E00 커맨드는 왜 안 됐나

Mitsubishi 문서에 유닛 구성 정보를 읽는 커맨드가 있습니다.
0x0E00이라는 커맨드인데, 이걸 사용하면 베이스 유닛에 꽂힌 카드 정보를 한 번에 가져올 수 있다고 나와 있었습니다.
# 0x0E00 커맨드 전송 결과
응답 에러코드: 0xC059
→ "지원하지 않는 커맨드"
안 됐습니다. Q Series도, iQ-R도 둘 다 0xC059 에러가 났습니다.
문서에 있다고 해서 다 되는 건 아니었어요.
이쪽은 막힌 거라 다른 방법을 찾아야 했습니다.
SD260이 뭔가

Mitsubishi iQ-R Series에는 특수 데이터 레지스터(SD)라는 영역이 있습니다.
CPU가 내부적으로 시스템 정보를 저장해두는 공간입니다.
SD0는 CPU 기종 코드, SD10은 스캔 타임, 이런 식으로 용도가 정해져 있습니다.
SD260 이후 영역에 IO 유닛 정보가 들어있다는 내용을 매뉴얼에서 찾았습니다.
각 슬롯의 IO 번호(io_no)가 저장되어 있다고 되어 있었어요.
직접 읽어봤습니다.
# SD260~SD275 읽기 결과 (iQ-R, 슬롯 4개 구성)
SD260 = 0x0100 # 슬롯 0 → io_no = 0x01
SD261 = 0x0200 # 슬롯 1 → io_no = 0x02
SD262 = 0x0300 # 슬롯 2 → io_no = 0x03
SD263 = 0x0400 # 슬롯 3 → io_no = 0x04
SD264 = 0x0000 # 이후 슬롯 없음
...
읽혔습니다.
그리고 값의 패턴이 보였습니다.
상위 바이트가 슬롯 번호였다

SD260+i 값의 상위 바이트가 io_no, 즉 IO 번호였습니다.
그리고 iQ-R에서 X/Y 시작 주소는 io_no에 16을 곱한 값입니다.
# 공식
io_no = (SD[260 + i] >> 8) & 0xFF
x_start = io_no * 16
풀어서 설명하면 이렇습니다.
SD261 = 0x0200
→ 상위 바이트: 0x02 = 2
→ io_no = 2
→ X 시작 주소 = 2 × 16 = 32 = 0x0020
슬롯 1번 카드의 X 시작 주소가 X0020이라는 뜻입니다.
이 값이 GX Works3 하드웨어 구성 화면에서 확인한 실제 주소와 일치하는지 바로 검증해봤습니다.
GX Works3와 대조해봤다

GX Works3에서 하드웨어 구성을 열면 슬롯별로 X/Y 시작 주소가 표시됩니다.
SD260으로 계산한 값과 화면에서 읽은 값을 직접 비교했습니다.
슬롯 0: SD260 계산 → X0000 GX Works3 → X0000 ✅
슬롯 1: SD261 계산 → X0020 GX Works3 → X0020 ✅
슬롯 2: SD262 계산 → X0030 GX Works3 → X0030 ✅
슬롯 3: SD263 계산 → X0040 GX Works3 → X0040 ✅
전부 일치했습니다.
GX Works3 없이도, PLC에 직접 물어보면 슬롯 구성을 알 수 있다는 게 확인된 순간이었습니다.
코드로는 이렇게 썼다
async def read_unit_config(plc_client) -> list[dict]:
"""iQ-R Series 유닛 구성 자동 읽기"""
results = []
# SD260~SD275 읽기 (최대 16슬롯)
sd_values = await plc_client.read_words("SD", 260, 16)
for i, val in enumerate(sd_values):
if val == 0:
break # 슬롯 없음
io_no = (val >> 8) & 0xFF
x_start = io_no * 16
results.append({
"slot": i,
"io_no": io_no,
"x_start": x_start,
"y_start": x_start, # Y도 같은 번호 기준
})
return results
슬롯이 없는 위치는 SD값이 0으로 나오기 때문에 거기서 끊습니다.
실제로 꽂혀있는 카드 수만큼만 결과가 나옵니다.
Q Series에서는 안 됐다

같은 코드를 Q Series에서도 돌려봤습니다.
# Q Series SD260~ 결과
total_slots: 0
io_addresses: [{'io_no': 20}, {'io_no': 32}, {'io_no': 32} ...]
읽히긴 했는데 값이 이상합니다. total_slots가 0인데 io_no가 계속 나오고, 32가 반복됩니다.
Q Series에서 SD260 영역은 iQ-R과 다른 용도로 쓰이거나 아예 미사용 영역입니다.
Q Series는 이 방법으로는 안 됩니다.
별도 방법이 필요합니다만, 현재로서는 Q Series에서 코드로 유닛 구성을 자동 읽는 검증된 방법을 찾지 못했습니다.
추후 확인되면 따로 정리하겠습니다.
PLCLink에 붙인 결과
이 내용이 PLCLink SetupFlow에 들어갔습니다.
Mitsubishi iQ-R를 선택하고 PLC IP를 입력하면, 연결과 동시에 SD260을 읽어서 슬롯 구성을 자동으로 가져옵니다.
사용자는 슬롯 주소를 직접 입력할 필요가 없습니다.
IO Monitor 화면을 열면 카드별로 분리된 채로 주소가 이미 채워져 있습니다.
설비마다 슬롯 구성이 다른 현장에서는 이 기능이 꽤 실용적입니다.
PLC가 다르면 IO 주소가 전부 달라지는데, 연결하는 것만으로 자동으로 맞춰지니까요.
정리
| 항목 | iQ-R Series | Q Series |
|---|---|---|
| SD260~ 읽기 | 정상, 슬롯 정보 포함 | 읽히지만 의미 다름 |
| 0x0E00 커맨드 | 미지원 (0xC059) | 미지원 (0xC059) |
| X/Y 시작 주소 계산 | (SD[260+i] >> 8) × 16 |
미확인 |
| GX Works3 없이 구성 확인 | 가능 ✅ | 불가 ❌ |
iQ-R에서 SD260을 쓰는 방법은 공식 매뉴얼에 나오긴 하는데, 직접 읽어서 실측 검증한 내용이 많지 않습니다.
특히 한국어로는 거의 없어서 삽질을 좀 했는데, 적어두면 누군가에게 도움이 되겠다 싶었습니다.
다음 글에서는 같은 맥락으로 Keyence KV 유닛 구성 자동 읽기 — 5가지 방법을 다 써봤다를 정리합니다.
결론부터 말하면, Keyence는 이보다 훨씬 복잡합니다.
'(개인Project)_개발 > PLC-PC 연결' 카테고리의 다른 글
| [Program][보족] 설정을 마쳤는데 화면은 그대로였다 (커스텀 훅을 두 곳에서 쓰면 생기는 일) (1) | 2026.05.15 |
|---|---|
| [Program][보족] Keyence KV 자동 IO 구성 읽기 시도 (5가지 방법, 1가지 결론) (0) | 2026.05.14 |
| [Program][Phase1.5] PLC 껐다 켜도 데이터 남기는 방법 (SQLite 전환으로 이력 관리 시작) (0) | 2026.05.12 |
| [Program][보족] Mitsubishi MC Protocol로 Keyence PLC 연결하기 ( 주의할 것들) (0) | 2026.05.02 |
| [Program][보족] 등록한 포인트가 새로고침하면 사라지는 버그 (원인과 해결 한 줄) (0) | 2026.05.01 |