연구노트/통신 설계

[MAX485] Modbus RTU에 대해 || 프레임 구조부터 완전 정리

ipmes 2026. 6. 19. 10:00


Modbus RTU에 대해

프레임 구조부터 완전 정리


 

 

앞서 설명한 RS-485는 신호를 안정적으로 전달하기 위한 전기적 통신 규격입니다.

하지만 실제 산업 장비 간 통신에서는 단순히 신호만 전달하는 것이 아니라,

어떤 장치에 어떤 데이터를 요청할 것인가에 대한 규칙도 필요합니다.

이러한 데이터 통신 규칙을 정의한 대표적인 산업용 프로토콜이 바로 Modbus RTU입니다.

Modbus 란?

Modbus는 1979년 Modicon에서 자사 PLC 간 데이터 교환을 위해 개발한 산업용 직렬 통신 프로토콜입니다. 이후 Modicon은 Schneider Electric에 인수되었으며, 현재까지도 산업 자동화 분야에서 널리 사용되고 있습니다.

초기에는 PLC 중심의 통신 방식으로 사용되었지만, 프로토콜 구조가 직관적이고 구현 난이도가 낮아 센서, 계측 장비, 인버터, HMI 등 다양한 산업용 장비로 빠르게 확장되었습니다.

Modbus는 현장 장비의 상태를 수집하거나 제어 장비와 데이터를 주고받는 용도로 많이 사용됩니다.

특히 개방형 프로토콜이라는 특징 덕분에 제조사에 관계없이 여러 장비를 하나의 네트워크로 구성할 수 있으며, 별도의 라이선스 비용 없이 사용할 수 있어 산업 현장에서 높은 활용도를 가지고 있습니다.

그 중 Modbus RTU에 대해

Modbus에는 ASCII, RTU, TCP 등 여러 방식이 존재하지만,

이번 내용에서는 널리 사용되는 Modbus RTU에 대해서 설명하겠습니다.

통신은 하나의 Master 장치가 통신을 시작하고, 특정 주소를 가진 Slave만 응답하는 방식인 Master-Slave 구조를 기반으로 동작합니다.

또한 데이터는 바이너리 형태로 전송되기 때문에 데이터 크기가 작고 효율적인 통신이 가능하다는 특징을 가지고 있습니다.

프레임(Frame) 구조

Slave Address
Function Code
Data
CRC
1 Byte
1 Byte
N x 1 Byte
2 Bytes

장치 간에 데이터를 주고받을 때도 어디서부터 어디까지가 하나의 메시지인가 를 서로 약속해야 합니다.

이를 프레임(Frame) 이라고 하며, 수신 대상 주소, 메시지 내용, 오류 검출 코드 등을 하나로 묶은 구조 입니다.

1. Slave Address (국번)

Slave Address는 통신 대상 장치의 고유 주소 값입니다.

Modbus RTU는 멀티드롭 구조이기 때문에 여러 장치가 하나의 통신 버스를 공유하게 됩니다.

따라서 Master는 특정 Slave를 선택하기 위해 주소를 함께 전송합니다.

각 Slave는 서로 다른 고유 주소를 가져야 하며, Slave는 자신에게 해당하는 주소가 포함된 프레임만 처리하고 응답하게 됩니다.

2. Function Code

Function Code는 Master가 Slave에게 어떤 동작을 요청하는지 나타내는 명령 코드입니다.

데이터를 읽을 것인지, 쓸 것인지, 단일 값인지, 다수 값인지에 따라 코드가 달라집니다.

아래 표는 Function Code 중 몇가지만 소개 하였습니다.

형태
메모리
이름
Function Code
Bit
Coil
Read Coil
01 (0x01)
Read Discrete Inputs
02 (0x02)
Write Single Coil
05 (0x05)
Write Multiple Coils
15 (0x0F)
Word
Register
Read Holding Registers
03 (0x03)
Read Input Register
04 (0x04)
Write Single Register
06 (0x06)
Write Multiple Registers
16 (0x10)

3. DATA 영역

Data 영역에는 실제 통신에 필요한 데이터가 포함됩니다.

예를 들어 읽기 시작 주소, 읽을 데이터 개수, 기록할 값 등이 이 영역에 저장됩니다.

또한 Function Code에 따라 Data 영역의 구조는 달라질 수 있습니다.

대표적으로 Data 영역은 아래와 같은 형태로 구성될 수 있습니다.

Adress
Number of Data
Data Size
Data
2 Bytes
2 Bytes
1 Byte
n Bytes
  • Address : 읽거나 쓸 데이터의 시작 위치입니다. 레지스터 또는 코일의 시작 주소를 지정합니다.
  • Number of Data : 처리할 데이터의 개수입니다. 몇 개의 레지스터 또는 코일을 읽거나 쓸 것인지를 나타냅니다.
  • Data Size : 뒤에 오는 Data 필드의 바이트 수입니다. 수신 측이 Data 영역의 끝을 정확히 파악할 수 있도록 크기를 미리 알려주는 역할을 합니다.
  • Data : 실제로 전달하려는 값입니다. 쓰기 명령일 경우 이 필드에 전송할 데이터가 담기며, 크기는 Number of Data에 따라 가변적으로 달라집니다.

4. CRC(Cyclic Redundancy Check)

CRC는 데이터 전송 중 발생할 수 있는 오류를 검출하기 위한 영역입니다.

송신 측은 전송할 데이터를 기준으로 CRC 값을 계산하여 프레임 마지막에 추가하고,

수신 측은 동일한 방식으로 CRC를 다시 계산하여 비교합니다.

만약 CRC 값이 서로 다르다면 데이터가 전송 과정에서 손상되었다고 판단하게 됩니다.

이러한 CRC 오류 검출 기능 덕분에 Modbus RTU는 산업 환경에서도 신뢰성 있는 통신이 가능합니다.

*CRC계산 순서

예를 들어 다음과 같은 MODBUS RTU 요청 데이터가 있다고 가정하여 해당 데이터를 기준으로 CRC를 계산합니다.

01 03 00 00 00 0A

1. CRC는 항상 CRC = 0xFFFF 으로 초기값을 설정합니다.

2. 첫 번째 Byte 0x01 과 CRC를 XOR 합니다

*FFFF XOR 0001 = FFFE

3. 이 때 결괏값의 최하위비트(LSB)가 1이면 오른쪽으로 1bit Shift 하고 CRC를 0xA001과 XOR,

0이면 오른쪽 1bit Shift 만 수행하는 것을 8회 반복합니다.

*1Byte 가 8bit 이기 때문에 8회 반복합니다.

4. 첫 번째 바이트 처리가 끝나면 다음 데이터인 03, 00, 00, 00, 0A 순서대로 동일한 계산을 반복합니다.

5. 최종결과로 C5 CD 가 나와 실제 전송하는 데이터는 01 03 00 00 00 0A C5 CD 가 됩니다.

레지스터란?

Modbus 통신에서 레지스터란 슬레이브 장치 내부에 데이터를 저장하는 메모리 공간을 의미합니다. Master는 이 레지스터의 주소를 지정하여 데이터를 읽거나 쓰는 방식으로 슬레이브 장치를 제어하거나 상태를 확인합니다.

앞서 설명한 프레임의 Address 필드가 바로 이 레지스터의 위치를 가리키는 값입니다.

이름
데이터크기
접근권한
주소영역
용도 설명
코일
(Coil)
1bit
읽기/쓰기
0xxxx
릴레이 ON/OFF, 모터 기동/정지처럼 단순한 스위칭 제어
이산 입력
(Discrete Input)
1bit
읽기
1xxxx
센서 신호나 버튼 상태처럼 외부에서 들어오는 신호
입력 레지스터 (Input Register)
16bit
읽기
3xxxx
온도, 전류, 전압과 같이 장치가 측정한 실시간 값
홀딩 레지스터 (Holding Register)
16bit
읽기/쓰기
4xxxx
인버터의 주파수 설정값, 장치 동작 파라미터 등

이러한 레지스터 주소는 두 가지 방식으로 표기됩니다.

  • 5자리 십진수 표기 : 40001, 40002처럼 레지스터 종류를 앞자리로 구분하는 방식으로, 사람이 읽기 쉽도록 표기할 때 사용합니다.
  • 16진수 주소 : 실제 통신 프레임의 Address 필드에는 0x0000, 0x0001처럼 0부터 시작하는 주소를 사용합니다.

즉, 40001번 레지스터는 실제 프레임에서 0x0000으로 전송됩니다.

이 차이를 혼동하지 않도록 주의해야 합니다.

통신 예제

실제 통신이 어떻게 이루어지는지 예제로 프레임을 알아 보겠습니다.

MasterSlave ( Request )
Slave ID
Function
Address
Number of Data
CRC
01
03
02 58
00 01
04 61

위 프레임은 Master가 국번 1번인 Slave에게 0x0258에 있는 데이터 1개를 읽어달라는 요청을 한 프레임입니다.

SlaveMaster ( Response )
Slave ID
Function
Data Size(Byte)
Data
CRC
01
03
02
13 88
B5 12

요청을 받은 Slave는 해당 주소에서 값을 읽어 응답 프레임으로 돌려줍니다.

요청된 프레임에 따라 Slave가 0x1388 이라는 데이터 즉, 5000이라는 값을 돌려주어 통신의 흐름을 확인 할 수 있는 예제입니다.

마무리

이번 글에서는 Modbus RTU의 프레임 구성 그리고 요청과 응답 프레임 예제를 통해 장치 간 데이터가 어떤 흐름으로 전달되는지 확인해보았습니다.

지금까지의 내용은 실제 RS-485 통신 시스템을 이해하고 구현하기 위해 필요한 기초 이론에 해당합니다.

다음 글에서는 이러한 내용을 바탕으로, RS-485 통신에서 UART 신호와 차동 신호를 변환하는 핵심인 MAX485의 구조와 동작 방식에 대해 알아보겠습니다.

 

 




TEL (062-226-1777, 010-9891-7244), E-mail (ipmes@ipmes.co.kr)

임베디드 시스템 | PCB 설계 제작 | 펌웨어 개발 | 신호처리 | 응용프로그램

 

#IPMES, #아이피엠이에스, #연구노트, #임베디드, #PCB제작, #펌웨어개발,

#하드웨어개발, #소프트웨어개발, #회로설계,

#광주PCB, #광주시제품, #광주시제품개발, #광주OEM, #광주광역시PCB,

#광주임베디드, #광주음성처리, #광주신호처리, #광주광역시임베디드,

#광주회로설계, #광주아트웍, #PCB샘플링

#ModbusRTU, #Modbus, #모드버스, #산업통신

#통신프로토콜, #프레임구조, #모드버스통신예제