미쓰비시 Q06UDV PLC를 Node-RED로 읽고 쓰기: RS-485 MC 프로토콜 MQTT 연동 전과정

미쓰비시 PLC의 값을 외부에서 읽고 쓰려면 보통 전용 SCADA나 별도 미들웨어를 붙입니다. 그런데 실제로 필요한 것이 "D 디바이스 몇 개를 주기적으로 서버로 보내고, 가끔 설정값 하나를 바꾸는 것"뿐이라면 그 구성은 지나치게 무겁습니다. 라이선스 비용도 들고, 나중에 담당자가 바뀌면 아무도 손대지 못하는 구조가 되기 쉽습니다.
이 글에서는 Q06UDV PLC를 RS-485 두 가닥만으로 EASY-LINK PRO에 연결해, MQTT로 양방향 통신하는 방법을 처음부터 끝까지 다룹니다. PLC 프로그램(래더)은 한 줄도 수정하지 않습니다. 통신 파라미터 설정만 바꿉니다.
왜 MQTT를 쓰는가
PLC 데이터를 밖으로 빼는 방법은 여러 가지입니다. 각각의 성격이 다릅니다.
| 방식 | 방향 | 방화벽 | 여러 곳에 동시 전달 | 비고 |
|---|---|---|---|---|
| OPC UA | 양방향 | 서버 포트 개방 필요 | 가능 | 표준적이지만 구성이 무겁다 |
| HTTP API 폴링 | 주로 단방향 | 아웃바운드만 | 어려움 | 주기가 짧아지면 부하가 커진다 |
| DB 직접 저장 | 단방향 | DB 포트 개방 | 어려움 | 실시간 제어에는 부적합 |
| MQTT | 양방향 | 아웃바운드만 | 쉬움 | 경량, 다대다 구독 |
MQTT의 장점은 게이트웨이가 브로커에 접속하러 나가는 구조라는 점입니다. 현장 쪽에 인바운드 포트를 열지 않아도 되므로 포트포워딩이나 고정 IP가 필요 없습니다. 또 한 번 발행한 값을 대시보드·데이터베이스·알림 시스템이 각자 구독해 가져갈 수 있어, 수신처가 늘어나도 PLC 쪽 부하는 그대로입니다.
이 구성으로 할 수 있는 것
- PLC의 D(FLOAT) · ZR(WORD) · M(BIT) · L(BIT) 디바이스를 MQTT로 발행
- 외부에서 MQTT로 구독·전송해 같은 디바이스에 값 쓰기
- Node-RED에서 수집 값을 가공하거나 대시보드로 표시
- 읽기 주기 500ms까지 단축 (예제 설정 기준)
사전 준비
| 구분 | 내용 |
|---|---|
| PLC | 미쓰비시 Q06UDV |
| 통신 모듈 | QJ71C24N (CH2 사용) |
| 게이트웨이 | EASY-LINK PRO |
| 배선 | RS-485 2가닥 |
| 소프트웨어 | GX Works2, Node-RED, MQTT 브로커 |
MQTT 브로커가 아직 없으시다면 윈도우에 Mosquitto 브로커를 설치하는 방법을 먼저 보시면 됩니다. 브로커 없이는 이 구성이 동작하지 않습니다.
시작 전에 정해 두면 좋은 것
설정에 들어가기 전에 아래 세 가지를 종이에 적어 두시면 작업이 훨씬 빨라집니다. 나중에 장비가 늘어났을 때 특히 차이가 큽니다.
- 어떤 디바이스를 읽을 것인가 — 주소와 개수를 미리 정합니다. 필요 없는 영역까지 넓게 읽으면 주기만 느려집니다.
- 토픽 이름 규칙 —
공장/라인/장비/항목처럼 계층으로 잡아 두면 구독 측에서 와일드카드로 묶기 쉽습니다. 나중에 바꾸려면 구독하는 쪽을 전부 고쳐야 하니 처음에 정하는 편이 낫습니다. - 읽기 주기 — 온도처럼 느리게 변하는 값과 카운터처럼 빠른 값을 같은 주기로 읽을 필요는 없습니다.
Step 1. PLC 파라미터 설정 (QJ71C24N)

QJ71C24N의 CH2를 RS-485로 사용하도록 설정합니다.
여기서 지정한 통신 속도(Baudrate)와 국번(Station No.)은 뒤에서 EASY-LINK 쪽에 똑같이 넣어야 합니다. 이 두 값이 어긋나면 배선이 정상이어도 통신이 전혀 열리지 않습니다. 현장에서 "선은 맞게 물렸는데 값이 안 온다"고 하는 경우, 대부분 여기가 원인입니다.
RS-485는 여러 장비가 한 쌍의 선을 나눠 쓰는 방식입니다. 그래서 같은 라인에 붙은 장비끼리 국번이 겹치면 안 되고, 통신 속도는 모두 같아야 합니다. 이 두 규칙만 지켜도 초기 트러블의 상당 부분이 사라집니다.
Step 2. EASY-LINK MQTT 설정

발행(Pub)과 구독(Sub) 토픽을 디바이스별로 하나씩 나눠 잡습니다.
| 토픽 | 대상 디바이스 | 데이터 타입 |
|---|---|---|
| PubTopic1 / SubTopic1 | D | FLOAT |
| PubTopic1 / SubTopic2 | ZR | WORD |
| PubTopic1 / SubTopic3 | M | BIT |
| PubTopic1 / SubTopic4 | L | BIT |
읽기와 쓰기를 같은 토픽에 섞지 않는 것이 핵심입니다. 섞으면 게이트웨이가 발행한 값을 자기가 다시 구독해 PLC에 되쓰는 순환이 생깁니다. 처음에는 잘 동작하는 것처럼 보이다가 값이 미묘하게 튀기 시작하는데, 원인을 찾기가 상당히 까다롭습니다.

각 항목이 하는 일은 다음과 같습니다.
- Protocol —
MS MC3C를 선택합니다. 미쓰비시 시리얼 MC 프로토콜입니다. - RTU SLAVEID — PLC에 설정한 국번과 일치시킵니다.
- RTU BAUDRATE — Step 1에서 QJ71C24N에 설정한 속도와 일치시킵니다.
- DATA TYPE — WORD / FLOAT / DWORD 중 선택합니다. PLC가 실제로 담고 있는 형식과 맞지 않으면 숫자가 엉뚱하게 나옵니다.
- ADDRESS — 읽어올 디바이스를 지정합니다.
- ENDIAN — 미쓰비시는 기본 설정 그대로 두면 됩니다.
- 시작 주소 / 읽을 개수 — 선두 번호부터 몇 개를 연속으로 읽을지 정합니다.
데이터 타입을 왜 신경 써야 하는가
PLC 안에서 값은 16비트 단위(WORD)로 저장됩니다. 소수점이 있는 값(FLOAT)은 WORD 두 개를 이어 붙여 표현하고, 32비트 정수(DWORD)도 마찬가지입니다.
따라서 FLOAT로 저장된 값을 WORD로 읽으면 앞쪽 절반만 읽고 그것을 정수로 해석하게 됩니다. 화면에는 오류 없이 숫자가 나오지만 실제 값과는 전혀 다릅니다. "값이 오긴 오는데 이상하다"면 거의 이 경우입니다.
읽을 개수를 셀 때도 주의하셔야 합니다. FLOAT 10개를 읽으려면 WORD 기준으로는 20개 영역이 필요합니다.
발행 주기 설정
MQTT 발행 간격을 입력하고 저장합니다. 예제에서는 고속 읽기·쓰기를 위해 500ms로 설정했습니다.
간격을 무작정 줄이지 마십시오. 읽을 개수가 많은데 간격까지 짧으면 한 주기 안에 통신이 끝나지 않아 응답이 밀립니다. 밀린 응답이 쌓이면 값이 실제보다 늦게 반영되는데, 겉으로는 정상처럼 보여 발견이 늦습니다.
처음에는 1000ms로 시작해 안정적으로 도는 것을 확인한 뒤 줄여 나가는 편이 안전합니다. 그리고 정말 500ms가 필요한 값인지 먼저 따져 보십시오. 온도나 압력은 1초도 충분히 빠릅니다.
Step 3. Node-RED 설정

Node-RED에서 MQTT in 노드로 PubTopic을 구독하면 PLC 값이 들어옵니다. 반대로 MQTT out 노드로 SubTopic에 발행하면 PLC에 값이 써집니다.
브로커 주소와 토픽 문자열은 Step 2에서 설정한 것과 대소문자까지 정확히 일치해야 합니다. MQTT 토픽은 대소문자를 구분하며, 틀려도 오류가 나지 않고 그냥 아무 메시지도 오지 않습니다.
Node-RED를 쓰면 값을 그대로 보는 데서 끝나지 않고 다음과 같은 처리를 붙일 수 있습니다.
- 값이 임계치를 넘으면 메일이나 메신저로 알림
- 여러 PLC의 값을 합쳐 하나의 화면에 표시
- 일정 주기로 데이터베이스에 적재
- 조건에 따라 자동으로 설정값 변경
동작 영상
잘 안 될 때 확인할 것
- 아무 값도 안 들어온다 — Baudrate와 국번이 PLC·EASY-LINK 양쪽에서 같은지 먼저 봅니다. 가장 흔한 원인입니다. 그다음 RS-485 극성(+/−)이 바뀌지 않았는지 확인합니다.
- 값이 이상한 숫자로 나온다 — DATA TYPE 불일치입니다. FLOAT로 저장된 값을 WORD로 읽으면 이렇게 됩니다.
- 읽기는 되는데 쓰기가 안 된다 — PLC 파라미터에서 RUN 중 쓰기 허가가 체크되어 있는지 확인합니다.
- 값이 계속 원래대로 돌아간다 — PLC 프로그램이 해당 디바이스를 매 스캔 덮어쓰고 있는 경우입니다. 쓰기 전용 디바이스를 따로 두고 래더에서 그 값을 받아 처리하도록 바꾸는 편이 낫습니다.
- 간헐적으로 끊긴다 — RS-485 종단 저항이 빠졌거나, 통신선이 인버터·전력선과 나란히 지나가며 노이즈를 받고 있을 수 있습니다.
- 브로커 연결이 자주 끊긴다 — 같은 클라이언트 ID를 쓰는 장비가 둘 이상이면 서로를 밀어냅니다. 장비마다 다른 ID를 쓰십시오.
자주 묻는 질문
PLC 프로그램을 정말 안 고쳐도 됩니까? 읽기만 한다면 그렇습니다. 쓰기의 경우 PLC가 그 디바이스를 매 스캔 덮어쓰지 않아야 하므로, 쓰기용 영역을 따로 비워 두는 정도의 설계는 필요합니다.
PLC가 여러 대여도 됩니까? RS-485는 한 라인에 여러 국번을 붙일 수 있습니다. 다만 모두 순차적으로 읽으므로 대수가 늘면 한 바퀴 도는 시간도 늘어납니다.
인터넷이 끊기면 값은 어떻게 됩니까? 쓰기 명령은 큐로 처리되어 복구 후 전달됩니다. 다만 발행하지 못한 과거 값을 모두 보관하는 것은 아니므로, 이력이 중요하다면 현장에 저장 기능이 있는 EASY-LOGGER 구성을 고려하십시오.
용어 정리
- MC 프로토콜 — 미쓰비시 PLC의 전용 통신 규격. 시리얼용(MC3C)과 이더넷용(MC3E)이 있습니다.
- 디바이스(D, ZR, M, L) — 미쓰비시 PLC의 메모리 영역 이름. D·ZR은 수치를, M·L은 비트(ON/OFF)를 담습니다.
- 발행(Publish) / 구독(Subscribe) — MQTT에서 값을 내보내는 쪽과 받는 쪽. 서로를 직접 알 필요 없이 브로커를 통해 주고받습니다.
- 브로커(Broker) — MQTT 메시지를 중계하는 서버. 발행자와 구독자 사이에 반드시 하나 있어야 합니다.
도입을 검토하신다면
이 글의 구성은 EASY-LINK 시리즈만 있으면 그대로 재현할 수 있습니다. 현장 조건에 맞는 모델 선정이나 프로토콜 적용 가능 여부가 궁금하시면 문의해 주세요. 사용 중인 PLC 기종과 수집하려는 데이터만 알려주시면 구성안을 잡아 드립니다.
- 제품 라인업 살펴보기 — EASY-LOGGER · EASY-LINK · EASY-RELAY · EASY-TEMP
- 도입 문의
- 기술 블로그 전체 글