본문 바로가기

(개인Project)_개발/PLC-PC 연결

[Program][보족] Keyence KV 자동 IO 구성 읽기 시도 (5가지 방법, 1가지 결론)

반응형

이 글이 나한테 해당되는 얘기인지 먼저 확인해보세요

이런 상황이 하나라도 해당된다면, 이 글이 도움이 될 겁니다.

  • Keyence KV Series PLC에 연결해서 IO 카드 구성을 자동으로 읽어오고 싶다
  • KV Studio 없이 어떤 슬롯에 어떤 카드가 꽂혀 있는지 알 방법이 필요하다
  • SLMP로 Keyence에 붙었는데, Mitsubishi처럼 유닛 정보까지 읽히는지 확인하고 싶다
  • Keyence KV에 붙어서 쓸 수 있는 통신 방법이 뭐뭐 있는지 정리된 자료가 필요하다

Mitsubishi iQ-R에서 SD260이 됐습니다.

PLC에 직접 물어보면 어떤 슬롯에 어떤 카드가 꽂혀 있는지 알 수 있다는 게 확인됐고, PLCLink SetupFlow에 자동 읽기 기능으로 붙였습니다.

연결만 하면 IO 슬롯 주소가 자동으로 채워지는 흐름이었어요.

그래서 자연스럽게 Keyence KV도 같은 방식으로 될 거라 생각했습니다.

안 됐습니다.

그냥 안 된 게 아니라, 방법을 하나씩 다 써가면서 안 됐습니다.

이 글은 그 과정을 기록한 겁니다.

결론이 "전자동은 불가능하다"이기 때문에, 어떻게 보면 실패 기록입니다.

그런데 같은 삽질을 반복하지 않으려면 어떤 방법을 왜 포기했는지가 오히려 더 중요할 수 있어서 정리해둡니다.


Keyence KV 유닛 구성이 왜 필요한가

▲ Keyence KV-8000 CPU + 확장 슬롯 구조. 슬롯마다 다른 IO 카드가 꽂히고, 주소 체계가 달라집니다.

 

Keyence KV Series도 베이스 유닛에 IO 카드를 꽂는 방식입니다.

KV-8000 CPU에 디지털 입출력, 아날로그, 통신 카드 등을 슬롯에 자유롭게 조합할 수 있어요.

문제는 Mitsubishi와 마찬가지로 슬롯 구성이 현장마다 다르다는 겁니다.

어떤 설비는 슬롯 0에 32점 디지털 입력 카드, 슬롯 1에 32점 출력 카드가 꽂혀 있고, 다른 설비는 순서가 다릅니다.

X/Y 주소 범위가 당연히 달라집니다.

PLCLink에서 IO Monitor를 제대로 쓰려면 "지금 이 PLC에 어떤 카드가 어떤 슬롯에 꽂혀 있는지"를 알아야 합니다.

사람이 매번 KV Studio를 열어서 확인하고 입력하는 대신, 연결 시 자동으로 읽어오는 게 목표였습니다.

그래서 방법을 찾기 시작했습니다.


▲ SLMP 배치 읽기로 CR 영역을 스캔한 결과. 유닛 정보에 해당하는 주소를 찾지 못했습니다.

방법 1 — SLMP로 직접 읽기

Mitsubishi에서 SD260을 읽은 것처럼, Keyence에도 시스템 정보를 담고 있는 레지스터 영역이 있을 거라 생각했습니다.

SLMP 배치 읽기로 CR(컨트롤 릴레이, Keyence KV의 내부 시스템 영역) 구간을 스캔해봤습니다.

CR 영역은 Keyence KV가 내부 시스템 상태를 저장해두는 공간입니다.

Mitsubishi의 SD 레지스터와 비슷한 개념이에요.

여기에 슬롯 정보가 있을 거라 가정하고 훑었습니다.

값들이 읽히긴 했습니다.

그런데 어떤 값이 어떤 슬롯을 의미하는지 해석할 방법이 없었습니다.

Mitsubishi는 SD260+i의 상위 바이트가 슬롯 번호라는 규칙이 문서에 명확히 나와 있었는데, Keyence는 그런 수준의 문서가 공개되어 있지 않았습니다.

읽히는 값이 있어도 의미를 모르면 쓸 수 없습니다.

이 방향은 보류했습니다.


방법 2 — KV Native Protocol

Keyence KV에는 SLMP 외에 KV Studio가 내부적으로 사용하는 전용 통신 프로토콜이 있습니다.

KV Studio가 PLC에서 유닛 구성을 읽어오는 것처럼, 같은 프로토콜로 직접 접근하면 되지 않을까 생각했습니다.

실제로 KV Native Protocol의 명령어 구조를 분석해서 유닛 정보를 요청하는 패킷을 만들어 보냈습니다.

# KV Native Protocol 유닛 정보 요청
응답: 에러 또는 빈 데이터

응답이 왔는데 유닛 구성 관련 데이터가 아니었습니다.

KV Studio가 어떤 명령어로 유닛 정보를 읽는지 정확히 알려면 패킷 캡처 수준의 분석이 필요합니다.

비공개 프로토콜이라 공식 문서도 없고, 리버스 엔지니어링 방향은 현실적이지 않다고 판단했습니다.

이 방법도 넘어갔습니다.


방법 3 — Modbus TCP

Keyence KV는 Modbus TCP도 지원합니다.

Modbus는 산업 표준 통신 방식이라 접근하기 쉽고, 별도 설정 없이 기본 포트(502)로 붙을 수 있었습니다.

그런데 Modbus의 특성상 접근할 수 있는 메모리 영역이 정해져 있습니다.

디지털 입출력, 일부 내부 릴레이, 데이터 레지스터 정도입니다.

유닛 구성 같은 시스템 정보는 Modbus로 접근이 안 됩니다.

데이터를 읽고 쓰는 용도로는 쓸 수 있겠지만, 슬롯 구성을 읽어오는 것과는 방향이 다릅니다.

이쪽도 정리하고 넘어갔습니다.


방법 4 — OPC-UA

OPC-UA는 더 풍부한 데이터 모델을 지원하는 표준입니다. 디바이스 구성 정보까지 노드(node) 형태로 노출할 수 있는 구조라, 이쪽으로 접근하면 유닛 정보도 읽힐 수 있다고 생각했습니다.

Keyence KV-8000에서 OPC-UA를 활성화하고 서버에 붙었습니다. 노드 목록을 읽어봤습니다.

데이터 레지스터, 릴레이 같은 일반 메모리 영역은 노드로 올라와 있었습니다. 그런데 하드웨어 구성, 슬롯 정보 같은 내용은 노드에 없었습니다. OPC-UA 서버 구현이 메모리 접근 수준에서 멈춰 있는 구조였습니다.

설정도 복잡하고, 결과도 기대에 못 미쳤습니다. 넘어갔습니다.


방법 5 — CR4001~ 릴레이 읽기

▲ KV Native Protocol 명령어 구조. KV Studio가 내부적으로 쓰는 전용 프로토콜입니다.

 

4가지 방법이 막힌 상태에서 Keyence 매뉴얼을 다시 훑었습니다.

CR 영역의 상세 주소 목록을 보다가 CR4001 근처에 슬롯 관련 정보가 있다는 내용을 찾았습니다.

Keyence KV의 CR4001~ 릴레이는 각 슬롯에 유닛이 장착되어 있는지 여부를 비트로 나타냅니다.

슬롯 0에 카드가 꽂혀 있으면 해당 비트가 ON, 없으면 OFF입니다.

# CR4001~ 읽기 결과 예시 (슬롯 0~3에 카드 있음)
CR4001 = 1  # 슬롯 0 → 카드 있음
CR4002 = 1  # 슬롯 1 → 카드 있음
CR4003 = 1  # 슬롯 2 → 카드 있음
CR4004 = 1  # 슬롯 3 → 카드 있음
CR4005 = 0  # 슬롯 4 → 없음, 이후 스캔 중단

읽혔습니다.

그리고 실제 KV Studio에서 보이는 슬롯 구성과 일치했습니다.


전자동이 아닌 이유

▲ Mitsubishi SD260 전자동 vs Keyence CR4001 반자동 비교. CR4001로는 카드 존재 여부만 알 수 있습니다.

 

여기까지 오면 됐다 싶겠지만, CR4001로는 "슬롯에 카드가 꽂혀 있다/없다"만 알 수 있습니다.

Mitsubishi SD260과 비교하면 차이가 명확합니다.

정보 Mitsubishi SD260 Keyence CR4001~
카드 존재 여부
카드 종류 (입력/출력/아날로그)
IO 점수 (32점/64점 등)
X/Y 시작 주소 자동 계산 ❌ (추정만 가능)

카드가 꽂혀 있다는 건 알아도, 그게 32점짜리인지 64점짜리인지, 입력인지 출력인지는 CR4001~만으로는 알 수 없습니다. X/Y 시작 주소를 정확하게 자동으로 계산할 수 없다는 뜻입니다.

그래서 "전자동"은 포기했습니다. Keyence KV에서는 외부 통신만으로 유닛 구성을 완전하게 읽어오는 방법이 현재로서는 없습니다.


PLCLink에서 채택한 방식 — 반자동

▲ PLCLink Keyence 반자동 SetupFlow. CR4001로 슬롯 존재 감지 후 사용자가 카드 종류를 선택합니다.

 

대신 반자동 방식을 채택했습니다.

  1. CR4001~을 읽어서 카드가 꽂힌 슬롯을 자동으로 감지합니다
  2. 감지된 슬롯 수만큼 입력 필드가 자동으로 생성됩니다
  3. 사용자는 각 슬롯에 어떤 카드인지만 선택하면 됩니다

빈 슬롯까지 전부 손으로 입력하는 것보다는 훨씬 낫습니다.

적어도 "몇 번 슬롯에 카드가 있다"는 건 자동으로 알아오니까요.

사용자가 입력해야 하는 범위가 줄어들었습니다.

완전한 자동화는 아니지만, 현재 SLMP로 접근 가능한 정보 범위 안에서 최선이었습니다.


정리

5가지 방법을 써본 결과입니다.

방법 결과 이유
SLMP CR 영역 스캔 값은 읽히지만 해석 불가, 비공개
KV Native Protocol 비공개 프로토콜, 리버스 엔지니어링 필요
Modbus TCP 접근 범위가 일반 메모리로 제한됨
OPC-UA 서버 구현이 메모리 접근 수준에서 멈춤
CR4001~ 릴레이 읽기 🔶 반자동 슬롯 존재 여부만 확인 가능

Keyence KV는 KV Studio 같은 전용 툴을 통해서만 유닛 구성을 완전하게 읽을 수 있는 구조입니다.

외부 접근은 의도적으로 제한되어 있다고 봐도 될 것 같습니다.

같은 목적으로 Mitsubishi iQ-R에서 SD260이 됐던 것과 비교하면 차이가 납니다.

iQ-R은 관련 정보를 공개 레지스터에 그대로 올려두는 방식이고, Keyence는 전용 툴 종속성이 더 강한 설계입니다.

좋고 나쁨의 문제는 아니지만, 외부에서 자동화 도구를 만들려고 할 때 느끼는 차이는 분명히 있습니다.

전자동이 안 된다는 결론이지만, 어떤 방법을 왜 써봤고 왜 안 됐는지는 기록해두는 게 낫다고 생각했습니다.

같은 방법을 다시 시도하는 시간을 아낄 수 있으면 됩니다.

반응형