MODBUS RTU / TCP

Modbus RTU · TCP 장비 연동 프로그램 개발

Modbus(모드버스)는 장비 안의 값을 레지스터 번호로 읽고 쓰는 산업용 통신 규약으로, 제조사가 달라도 같은 방식으로 데이터를 가져올 수 있습니다. 시리얼(RS-485 등) 선로에서는 Modbus RTU를, 이더넷에서는 Modbus TCP를 주로 씁니다.

program1472는 장비 매뉴얼의 레지스터 맵을 바탕으로 필요한 값만 골라 주기적으로 읽고, 데이터형과 배율을 바로잡아 DB·대시보드·다른 시스템으로 넘기는 프로그램을 만듭니다.

최종 수정

이런 현장에 필요합니다

  • 제조사가 다른 인버터·전력량계·온도조절기 값을 한곳에서 보고 싶다
  • 장비 매뉴얼에 레지스터 표는 있는데 어떻게 읽어야 할지 모르겠다
  • 읽어 온 값이 엄청 큰 수나 음수로 나와 쓸 수가 없다
  • RS-485 장비를 사무실 네트워크에서 보고 싶다
  • 장비 설정값을 원격에서 바꾸고 싶다

Modbus RTU · TCP 연동 주요 기능

아래는 대표 구성이며, 실제 범위는 현장 업무에 맞춰 필요한 기능만 골라 정합니다.

레지스터 맵 기반 설정

  • 엑셀로 정리한 레지스터 맵을 불러와 태그로 등록
  • 태그별 주소·기능코드·데이터형·배율·단위 지정
  • 장비가 늘어도 코드 수정 없이 맵만 추가

마스터·슬레이브 양방향

  • 장비를 읽어 오는 마스터(클라이언트) 구현
  • 다른 시스템이 우리 프로그램을 읽어 가는 슬레이브(서버) 구현
  • 국번(Unit ID)별 장비 관리

RTU↔TCP 게이트웨이

  • RS-485 장비 값을 이더넷 Modbus TCP로 제공
  • 여러 RTU 선로를 하나의 서버로 통합

데이터형 변환

  • UINT16·INT16·INT32·FLOAT32·비트 처리
  • 워드 순서(워드 스왑) 옵션
  • 배율·오프셋 적용

수집·저장·전송

  • 주기 수집과 값이 바뀔 때만 기록하는 방식 선택
  • DB 저장과 MQTT·REST API 전송
  • 통신 실패 시 마지막 정상값과 통신 상태를 함께 기록

쓰기 명령 보호

  • 설정값 변경은 권한이 있는 사용자만
  • 쓰기 전 확인 절차와 변경 이력 기록

Modbus 종류별 차이

Modbus RTU · ASCII · TCP 비교
항목Modbus RTUModbus ASCIIModbus TCP
물리 계층RS-485·RS-232 등 시리얼시리얼이더넷(TCP, 기본 포트 502)
프레임바이너리ASCII 문자MBAP 헤더 + PDU
오류 검출CRC-16LRCTCP 계층에 맡김(별도 CRC 없음)
장비 주소슬레이브 ID 1~2471~247Unit ID(게이트웨이 경유 시 사용)

자주 쓰는 기능코드

Modbus 주요 기능코드
기능코드대상동작
01 / 02Coil / Discrete Input비트 읽기
03 / 04Holding Register / Input Register16비트 워드 읽기
05 / 06Coil / Holding Register단일 쓰기
15 / 16Coils / Holding Registers다중 쓰기

한 번에 읽을 수 있는 개수에도 제한이 있어(레지스터 읽기는 요청당 최대 125개) 많은 값을 읽을 때는 나눠서 요청합니다.

현장에서 자주 막히는 지점

  • 매뉴얼의 ‘40001’은 Holding Register 영역의 1번째라는 표기이고, 실제 통신에서 보내는 주소는 0입니다(40100이면 99). 매뉴얼마다 0부터 세는지 1부터 세는지가 달라 가장 흔한 혼동입니다.
  • 32비트 정수·실수는 레지스터 2개를 합쳐 만들며, 장비마다 워드 순서가 달라 순서를 잘못 잡으면 값이 엉뚱하게 나옵니다.
  • 온도 253이 실제로는 25.3℃인 것처럼 배율(×0.1 등)을 적용해야 하는 값이 많습니다.
  • 부호 있는 값(INT16)을 부호 없는 값으로 읽으면 −1이 65535로 보입니다.
  • 폴링 주기를 장비 응답 속도보다 짧게 잡으면 타임아웃이 쌓이므로, 장비 수와 응답 시간을 보고 주기를 정합니다.

진행 방식

  1. 장비 모델별 레지스터 맵(매뉴얼)을 받아 읽을 값과 데이터형을 표로 정리합니다.
  2. 실제 장비 한 대로 읽기 시험을 해 주소·워드 순서·배율을 확정한 뒤 전체로 넓힙니다.
  3. 쓰기 기능이 필요하면 범위와 승인 절차를 먼저 정한 뒤 구현합니다.

전체 진행 단계 자세히 보기

Modbus RTU · TCP 연동 관련 자주 묻는 질문

레지스터 맵만 있으면 개발할 수 있나요?

네, 레지스터 맵(주소·데이터형·단위가 적힌 표)이 있으면 대부분 개발할 수 있습니다. 맵에 없는 값은 제조사 문의나 시험 통신으로 확인합니다.

제조사가 다른 장비를 섞어서 연동할 수 있나요?

Modbus를 지원하는 장비라면 인버터·전력량계·온도조절기처럼 종류와 제조사가 달라도 한 프로그램에서 함께 수집할 수 있습니다. 같은 선로에서는 국번만 겹치지 않으면 됩니다.

읽어 온 값이 엄청 큰 수로 나옵니다.

대부분 워드 순서, 부호(INT16/UINT16) 해석, 배율 적용 가운데 하나의 문제입니다. 장비 매뉴얼의 데이터형 표기와 장비에 표시되는 값을 비교해 바로잡습니다.

RTU 장비를 네트워크로 보고 싶습니다.

RTU↔TCP 게이트웨이(하드웨어 또는 소프트웨어)를 두면 RS-485 장비를 이더넷의 Modbus TCP 장비처럼 읽을 수 있습니다.

장비 설정을 원격으로 바꿀 수 있나요?

기능코드 06·16으로 쓰기가 가능한 장비라면 구현할 수 있습니다. 잘못된 값이 설비에 바로 반영될 수 있으므로 권한 제한과 확인 절차를 반드시 함께 둡니다.

관련 기술 가이드

장비 모델명만 알려 주셔도 시작할 수 있습니다

연동하려는 장비의 모델명이나 지금 쓰는 기록지 사진을 보내 주시면, 연동 가능 여부와 시작하기 좋은 범위를 먼저 알려 드립니다.

문의하기