
Keyence KV에서 MC Protocol 쓸 때 주소가 달라지는 이유
PLCLink를 만들면서 처음에는 Mitsubishi Q/R 시리즈만 생각하고 통신 로직을 짰습니다.
그런데 실제 현장에서는 Keyence KV 시리즈도 써야 하는 상황이 생겼고, 연결해보니 주소 체계가 다르다는 걸 알게 됐습니다.
이 글은 Keyence KV 시리즈가 뭔지부터, MC Protocol을 선택한 이유, 그리고 실제로 연결했을 때 주소 계산이 어떻게 달라지는지까지 정리한 내용입니다.
Keyence KV 시리즈가 뭔가
Keyence(키엔스)는 일본의 자동화 장비 제조사입니다.
센서, 비전 시스템, PLC 등 다양한 제품을 만들고 있고, 국내 제조 현장에서도 자주 볼 수 있습니다.
KV 시리즈는 Keyence의 PLC 라인업입니다.
KV-8000, KV-7500 같은 CPU 유닛에 I/O 확장 모듈을 붙여서 쓰는 구조입니다.
프로그래밍은 KV Studio라는 전용 소프트웨어를 사용합니다.
Mitsubishi(미쓰비시)와 비교하면 이런 차이가 있습니다.
| 항목 | Mitsubishi Q/R | Keyence KV |
|---|---|---|
| 프로그래밍 툴 | GX Works | KV Studio |
| 기본 프로그래밍 언어 | 래더(Ladder) | 래더(Ladder) |
| 통신 방식 | MC Protocol(SLMP) 기본 | MC Protocol(SLMP) 지원 |
| 변수 방식 | 디바이스 주소 중심 | 심볼(Symbol) 변수 지원 |
| Y/X 주소 표기 | 16진수 연속 | 그룹 × 16 + 비트 위치 |
마지막 줄 Y/X 주소 표기 방식의 차이가 이번 에로사항의 핵심입니다.
왜 MC Protocol을 선택했나
PLC와 외부 PC가 통신하는 방식은 여러 가지가 있습니다.
- MC Protocol (SLMP) — Mitsubishi가 만든 통신 규격. Keyence, LS, 기타 제조사도 지원.
- Modbus TCP — 산업 표준 통신. 지원 폭이 넓지만 읽을 수 있는 영역이 제한됨.
- OPC-UA — 더 풍부한 데이터 모델을 지원하는 표준. 하지만 설정이 복잡하고 지원 여부가 제조사마다 다름.
- 제조사 전용 API — 가장 기능이 많지만 제조사마다 다르고 라이선스가 필요한 경우도 있음.

PLCLink에서 MC Protocol SLMP를 첫 번째 선택으로 잡은 이유는 하나입니다.
여러 제조사가 지원하는 공용 통신 방식 중 가장 접근하기 쉬웠습니다.
Mitsubishi Q/R이 기본이고, Keyence KV도 지원한다고 문서에 나와 있었습니다.
별도 라이선스나 전용 드라이버 없이 TCP 소켓 통신으로 직접 구현할 수 있다는 점도 선택 이유였습니다.
"지원한다"는 말이 "완전히 동일하게 동작한다"는 뜻은 아니었지만, 그건 직접 연결해보고 나서 알게 됐습니다.
Keyence KV의 Y/X 주소 — 계산이 다르다
문제 상황
KV Studio에서 Y3920으로 표시되는 신호를 읽으려고 했습니다.
SLMP에서 Y 디바이스 코드는 0x9D입니다.
Mitsubishi 방식으로는 주소를 0x3920 = 14624로 넣으면 됩니다.
이렇게 요청을 보냈습니다. 응답도 정상으로 왔습니다.
그런데 값이 항상 0이었습니다.
PLC에서는 분명히 신호가 ON인데.
원인
Keyence KV의 Y/X 주소 표기 방식이 Mitsubishi와 다릅니다.
Mitsubishi 방식:
Y3920
→ 16진수 주소를 그대로 사용
→ SLMP 주소: 0x3920 = 14624
Keyence KV 방식:
Y3920
마지막 자리 "0" = 비트 위치 (0~F, 16진수, 0~15번 비트)
앞 자리 "392" = 그룹 번호 (10진수)
SLMP 주소 = 그룹 번호(10진수) × 16 + 비트 위치(16진수)
= 392 × 16 + 0
= 6272
같은 Y3920이라도 Mitsubishi는 14624번지를, Keyence는 6272번지를 읽어야 합니다.
주소 몇 가지를 비교해보면 이렇습니다.

| KV Studio 표시 | Mitsubishi SLMP | Keyence KV SLMP |
|---|---|---|
| Y3920 | 14624 (0x3920) | 6272 (392×16+0) |
| Y3921 | 14625 (0x3921) | 6272 (392×16+1) — 같은 그룹! |
| Y3930 | 14640 (0x3930) | 6275 (392×16+3) |
Y3920과 Y3921은 Keyence 기준으로 같은 그룹(392번) 안의 0번, 1번 비트입니다.
Mitsubishi 방식으로 읽으면 두 신호가 완전히 다른 번지를 가리키게 됩니다.
KV Studio에서 주소 표시 방식 확인하는 법
KV Studio에는 주소 표시 방식을 바꿀 수 있는 설정이 있습니다.
KV Studio → Tools → Option → "Display in XYM" 체크 여부에 따라 달라집니다.
- XYM 체크 ON: Y/X 표기 사용 (Y3920 형태) — 기본값
- XYM 체크 OFF: R 표기 사용 (R 번호는 10진수 직접 주소)
R 표기로 보면 그 번호가 그대로 SLMP 주소의 기반이 됩니다.
Y3920을 R 표기로 바꿨을 때 나오는 번호를 기준으로 계산하면 혼동을 줄일 수 있습니다.
어떻게 발견했나 — 전수 스캔 과정
처음에는 폴링 로직 문제라고 생각했습니다. 비동기 코드를 몇 번 다시 봤지만 문제가 없었습니다.
그 다음에는 주소가 틀렸나 의심했습니다.
하지만 KV Studio에 표시된 그대로 넣고 있었으니 틀릴 이유가 없다고 생각했습니다.

결국 /api/debug/scan-full이라는 디버그 엔드포인트를 만들었습니다.
디바이스 코드 전체(0x00~0xFF)와 주소 범위를 전수 스캔해서 어느 조합에서 값이 나오는지 찾는 방식이었습니다.
스캔 결과에서 0x9D(Y 디바이스 코드) + 주소 6272에서 값이 나왔습니다.
6272를 역산해보니:
6272 ÷ 16 = 392 ... 0
→ 그룹 번호 392, 비트 위치 0
→ KV Studio 표기: Y3920
주소 체계 자체가 다르다는 걸 이렇게 확인했습니다.
값이 0으로 나오는 건 "연결은 됐는데 틀린 주소를 보고 있다"는 뜻이었습니다.
D(데이터 레지스터)는 차이 없다
Y/X와 달리 D(데이터 레지스터, 숫자값을 저장하는 영역)는 Mitsubishi와 동일하게 10진수를 그대로 씁니다.
D100을 읽으려면 Mitsubishi도 Keyence도 주소 100으로 요청하면 됩니다.
이 부분은 동일합니다.
헷갈리는 부분은 Y/X에 한정된 문제입니다.
PLCLink에서 해결한 방법

설정 화면에서 PLC Maker를 선택하면 주소 변환이 자동으로 적용됩니다.
입력: Y3920
Keyence KV 선택 시 → SLMP 주소 6272 자동 변환
Mitsubishi 선택 시 → SLMP 주소 14624 (0x3920)
변환 공식은 이렇습니다.
# Keyence KV Y/X 주소 변환
def kv_address(address_str: int) -> int:
group = address_str // 10 # 앞 자리 (10진수 그룹 번호)
bit = address_str % 10 # 마지막 자리 (비트 위치)
return group * 16 + bit
편집 패널에서 변환 결과를 미리 보여주기 때문에 직접 계산할 필요 없이 확인하고 쓸 수 있습니다.
Keyence KV SLMP 사용 체크리스트
Keyence KV에서 MC Protocol SLMP를 쓸 때 확인해야 할 것들입니다.
- KV Studio에서 통신 유닛(EtherNet/IP 또는 KV-EtherNet) 설정 완료
- SLMP 포트 번호 확인 (기본값: 8500 / 변경 가능)
- Y/X 주소 → SLMP 주소 변환 적용:
그룹번호(10진) × 16 + 비트위치 - D(데이터 레지스터) 주소: 10진수 직접 사용 (Mitsubishi와 동일)
- KV Studio Option → "Display in XYM" 설정 확인
MC Protocol SLMP 자체는 지원하지만, 세부 구현이 Mitsubishi와 다릅니다. "응답은 오는데 값이 이상하다"는 현상이 나오면 주소 변환을 먼저 확인해보세요.
TMI — 더 알고 싶다면
Q. Keyence KV는 Modbus도 지원하나요?
KV 시리즈에 따라 다릅니다. KV-8000 기준으로 Modbus TCP를 지원하는 유닛이 있습니다. 다만 Modbus는 읽을 수 있는 영역(코일, 레지스터)이 정해져 있고, MC Protocol처럼 Y/X/M/D 같은 디바이스를 직접 지정해서 읽는 방식이 아닙니다. PLCLink는 현재 MC Protocol 기반으로 구현되어 있어서 Modbus 대응은 별도 작업이 필요합니다.
Q. OPC-UA는 어떤가요?
KV-8000은 OPC-UA 서버 기능을 지원합니다. 변수를 직접 노출할 수 있어서 심볼(Symbol) 변수를 그대로 읽을 수 있다는 장점이 있습니다. 다만 실제로 PLCLink에서 테스트했을 때 설정 복잡도와 스캔타임 영향 측면에서 추가 검증이 필요한 상태입니다. Phase 1 이후 보족에서 다룰 예정입니다.
Q. KV Studio에서 주소를 확인하는 가장 빠른 방법은?
Monitor 모드에서 신호를 클릭하면 실제 디바이스 주소가 표시됩니다. 혹은 Tools → Cross Reference로 해당 심볼의 주소를 찾을 수 있습니다. R 표기로 변환해서 보면 SLMP 주소 계산이 더 직관적입니다.
Q. Mitsubishi iQ-R 시리즈와 Q 시리즈도 주소 체계가 같나요?
iQ-R과 Q 시리즈 모두 Y/X를 16진수 그대로 씁니다. Keyence처럼 그룹×16 방식이 아닙니다. PLCLink에서도 Mitsubishi는 이 방식 하나로 통일해서 처리합니다.
'(개인Project)_개발 > PLC-PC 연결' 카테고리의 다른 글
| [Program][보족] PLC 슬롯 주소를 코드로 읽어오는 방법 (iQ-R SD260 레지스터 실험 기록) (0) | 2026.05.13 |
|---|---|
| [Program][Phase1.5] PLC 껐다 켜도 데이터 남기는 방법 (SQLite 전환으로 이력 관리 시작) (0) | 2026.05.12 |
| [Program][보족] 등록한 포인트가 새로고침하면 사라지는 버그 (원인과 해결 한 줄) (0) | 2026.05.01 |
| [Program][보족] GitHub 몰라도 괜찮다 (PLCLink 다운받는 법 단계별 정리) (0) | 2026.04.30 |
| [Program][Phase_0] HMI 없어도 브라우저로 PLC IO 본다 (PLCLink Phase 0 구현기) (0) | 2026.04.29 |