
1. 모드버스(Modbus) 프로토콜이란?
모드버스(Modbus)는 산업 자동화 시스템에서 널리 사용되는 직렬 통신 프로토콜(Serial Communication Protocol)입니다. 1979년 Modicon(현재 Schneider Electric)에서 PLC(Programmable Logic Controller) 간의 데이터 교환을 위해 개발했습니다. 현재는 다양한 산업 장비(센서, 모터 드라이버, 계측기, HMI, SCADA 시스템)에서 활용되고 있습니다.
모드버스는 간단하고 신뢰성이 높은 통신이 가능하며, 개방형 프로토콜(Open Protocol)로 누구나 자유롭게 사용할 수 있어 산업 현장에서 표준으로 자리 잡았습니다.
2. Modbus의 Master와 Slave
모드버스는 기본적으로 마스터-슬레이브(Master-Slave) 구조를 따릅니다. 즉, 하나의 마스터(Master) 장치가 데이터를 요청하고, 슬레이브(Slave) 장치가 응답하는 방식으로 작동합니다.
2.1. Master (마스터)
마스터 장치는 통신을 주도하는 장치로, 보통 PLC(Programmable Logic Controller), HMI(Human-Machine Interface), PC 등이 사용됩니다. 마스터는 슬레이브에게 데이터를 요청하고 응답을 받아 분석합니다.
- 네트워크에서 하나의 마스터만 존재합니다.
- 여러 개의 슬레이브와 통신할 수 있습니다.
- 요청(Request)만 보낼 수 있으며, 응답(Response)은 슬레이브만 할 수 있습니다.
2.2. Slave (슬레이브)
슬레이브 장치는 데이터를 제공하는 장치로, 보통 센서, 모터 드라이버, 계측기, 리모트 I/O 모듈 등이 포함됩니다.
- 네트워크에서 여러 개의 슬레이브가 존재할 수 있습니다.
- 마스터의 요청이 있을 때만 응답합니다.
- 개별적으로 동작하지 않으며, 반드시 마스터의 명령을 받아야 합니다.
3. 기본 작동 방식
모드버스는 다음과 같은 흐름으로 동작합니다.
- 마스터 → 슬레이브 요청(Request)
- 마스터는 특정 슬레이브에게 데이터를 읽거나 쓰라는 요청을 보냅니다.
- 요청 메시지에는 슬레이브 ID, 기능 코드(Function Code), 데이터 값, CRC 검증 코드가 포함됩니다.
- 슬레이브 → 마스터 응답(Response)
- 슬레이브는 요청을 처리한 후, 요청에 대한 응답을 마스터에게 보냅니다.
- 응답 메시지에도 동일한 구조(슬레이브 ID, 기능 코드, 데이터 값, CRC)가 포함됩니다.
- 오류 발생 시 에러 코드 반환
- 슬레이브가 요청을 처리할 수 없거나 오류가 발생하면, 예외 응답(Exception Response)을 반환합니다.
- 예외 응답에는 에러 코드(Error Code)가 포함됩니다.
4. Modbus 프로토콜 종류 및 구조
(Modbus RTU | Modbus ASCII | ModBus TCP/IP)
모드버스(Modbus)는 산업 자동화 및 제어 시스템에서 장비 간 데이터 교환을 위한 마스터-슬레이브(Master-Slave) 구조의 통신 프로토콜입니다. 모드버스는 다양한 물리적 통신 방식과 데이터 표현 방식에 따라 Modbus RTU, Modbus ASCII, Modbus TCP/IP로 나뉩니다. 각각의 방식은 사용 환경과 목적에 따라 선택됩니다.
4.1. Modbus RTU (Remote Terminal Unit)
🔹 통신 방식:
- RS-232 또는 RS-485 직렬(Serial) 통신을 사용
- 바이너리(Binary) 형식으로 데이터 전송
- 하나의 마스터가 다수의 슬레이브(최대 247개)와 통신 가능
🔹 특징:
✅ 빠른 전송 속도
- 데이터가 바이너리(Binary) 형식으로 전송되므로 ASCII보다 전송 효율이 높고 속도가 빠름.
- 일반적으로 9600~115200bps 속도로 동작.
✅ RS-485를 사용하면 다중 장치 통신 가능
- RS-232는 포인트-투-포인트(Point-to-Point) 방식으로 1:1 통신만 가능하지만,
- RS-485는 멀티드롭(Multi-drop) 방식을 지원하여 하나의 마스터가 여러 슬레이브(최대 247개)와 통신 가능.
✅ 산업 자동화 및 임베디드 시스템에서 널리 사용됨
- PLC, HMI, 센서, 모터 드라이버, 원격 I/O 모듈 등에서 사용.
🔹 단점:
❌ ASCII보다 사람이 해석하기 어려움
- 데이터가 바이너리 형식으로 인코딩되어 있어 사람이 직접 읽기 어려움.
❌ 네트워크 거리가 제한적
- RS-232는 15m, RS-485는 최대 1.2km까지 통신 가능하지만, 네트워크 확장이 어렵고 간섭에 취약할 수 있음.
4.2. Modbus ASCII (American Standard Code for Information Interchange)
🔹 통신 방식:
- RS-232 또는 RS-485 직렬(Serial) 통신을 사용
- 데이터가 ASCII(텍스트) 형식으로 전송됨
- 사람이 직접 읽을 수 있는 문자(16진수 ASCII 코드)로 표현
🔹 특징:
✅ 사람이 읽고 해석하기 쉬움
- Modbus RTU와 다르게 각 바이트를 ASCII 문자(16진수)로 변환하여 전송하므로 사람이 직접 확인 가능.
- 예) 01 03 00 0A 00 01 85 DB (RTU) → :0103000A0001F6\r\n (ASCII)
✅ 통신 신뢰성이 높음
- ASCII 형식은 시작 문자(:)와 종료 문자(CR/LF, \r\n)를 포함하여 오류 감지가 쉽고 데이터가 손상될 가능성이 적음.
✅ 전송 중 데이터 오류 감지가 용이함
- 오류 감지를 위한 LRC(Longitudinal Redundancy Check) 체크섬을 사용하여 데이터 무결성을 보장함.
🔹 단점:
❌ RTU보다 전송 속도가 느림
- ASCII 형식은 각 바이트를 두 개의 문자로 변환하여 전송하기 때문에 데이터 전송 효율이 낮음.
- 같은 데이터를 전송할 때 RTU보다 약 2배 정도 많은 데이터 양을 필요로 함.
❌ 산업 현장에서 사용 빈도가 낮음
- Modbus RTU에 비해 속도가 느려서 빠른 응답이 필요한 환경에서는 잘 사용되지 않음.
📌 사용 예시:
- 사람이 직접 명령을 입력하고 확인해야 하는 환경
- 디버깅 및 테스트용 환경
4.3. Modbus TCP/IP
🔹 통신 방식:
- Ethernet (TCP/IP) 네트워크 기반 통신 방식
- 인터넷 및 로컬 네트워크(LAN)를 활용하여 IP 주소 기반의 통신을 수행
- 메시지는 TCP/IP 프레임을 통해 전달됨
🔹 특징:
✅ 빠른 속도 및 네트워크 확장 용이
- 기존 RS-232/RS-485 기반의 직렬 통신보다 훨씬 높은 속도를 제공.
- IP 주소 기반이므로 네트워크 확장이 쉬움 (인터넷, WAN, 클라우드 지원).
✅ 여러 개의 마스터(Multi-Master) 지원 가능
- Modbus RTU 및 ASCII는 마스터가 하나여야 하지만,
- Modbus TCP/IP는 여러 개의 마스터가 동시에 슬레이브와 통신할 수 있음.
✅ 표준 이더넷 네트워크 사용 가능
- 기존의 산업용 이더넷 장비(스위치, 라우터, 서버 등)와 호환 가능.
- 네트워크를 활용하여 장거리 통신이 가능함.
🔹 단점:
❌ TCP/IP 프로토콜의 오버헤드(Overhead) 발생
- RTU나 ASCII보다 전송 데이터 크기가 커서 네트워크 부하(Network Load)가 증가할 수 있음.
- 하지만 산업 환경에서는 보통 큰 문제가 되지 않음.
❌ 네트워크 보안 이슈
- TCP/IP 기반이므로 해킹 및 보안 위협에 노출될 수 있음.
- 따라서 VPN, TLS 암호화, 방화벽 등의 보안 장치가 필요함.
📌 사용 예시:
- SCADA 시스템, 원격 모니터링 및 IoT(산업용 사물 인터넷, IIoT) 시스템
- 클라우드 및 서버 기반 데이터 수집
- Ethernet 기반 장비 간 통신
4.4. Modbus RTU, ASCII, TCP/IP 비교
✅ Modbus RTU는 변조 방식(Encoding Method)
- Modbus RTU는 직렬 통신(Serial Communication) 방식에서 사용되는 데이터 변조(Encoding) 방식입니다.
- RS-232, RS-485 등의 물리적 인터페이스를 사용하여 데이터를 전송합니다.
- 데이터는 바이너리(Binary) 형식으로 변조되어 전송되며, 오류 검출을 위해 CRC-16이 포함됩니다.
- 직접적인 장치 간 통신(Point-to-Point 또는 Multi-Drop) 방식으로 동작합니다.
📌 즉, RTU는 Modbus 데이터를 직렬 통신에서 사용할 수 있도록 변조하는 방식이며, 기본적인 데이터 전송 프로토콜이 아닙니다.
📌 Modbus ASCII도 Modbus RTU와 동일하게 데이터 변조 방식이지만 데이터 표현 방식만 다르다
✅ Modbus TCP는 게이트웨이 프로토콜까지 확장
- Modbus TCP는 TCP/IP 네트워크를 기반으로 동작하는 프로토콜입니다.
- 기본적으로 Modbus RTU의 데이터 구조를 그대로 유지하지만, 이를 TCP/IP 패킷에 캡슐화(Encapsulation)하여 전송합니다.
- 이더넷 기반의 네트워크 프로토콜이며, IP 주소를 이용해 장치를 식별합니다.
- 게이트웨이(Gateway)를 통해 Modbus RTU와 Modbus TCP 간 변환이 가능합니다.
📌 즉, Modbus TCP는 단순한 변조 방식이 아니라, 상위 계층의 네트워크 프로토콜까지 연결되도록 확장된 구조입니다.
항목 | Modbus RTU | Modbus TCP |
전송 방식 | 직렬(Serial) 통신 | 네트워크(TCP/IP) 통신 |
사용 인터페이스 | RS-232, RS-485 | Ethernet (LAN, WAN) |
데이터 변조 방식 | 바이너리(Binary) | TCP/IP 패킷 캡슐화(Encapsulation) |
오류 검출 방식 | CRC-16 | TCP/IP 자체 오류 검출 (Checksum) |
장치 주소 지정 | Slave ID | IP 주소 + Unit ID |
네트워크 확장성 | 제한적 (최대 1.2km, 247개 슬레이브) | 무제한 (인터넷, 클라우드 연결 가능) |
마스터-슬레이브 구조 | 단일 마스터 (Master-Slave) | 다중 마스터 지원 (Client-Server) |
📌 RTU는 물리적인 변조 방식(Encoding), TCP는 네트워크 게이트웨이까지 포함된 확장된 프로토콜입니다.
5. Standard Modbus에 데이터가 저장되는 방식
모드버스 프로토콜에서는 데이터를 특정한 메모리 영역에 저장하며, 이를 통해 슬레이브 장치의 데이터를 읽거나 쓸 수 있습니다. 모드버스에서 사용하는 데이터 저장 방식은 다음과 같습니다.
데이터 | 유형주소 | 범위설명 |
코일 (Coils) | 00001–09999 | 1비트 단위 (ON/OFF) |
불리언 입력 (Discrete Inputs) | 10001–19999 | 입력 전용 1비트 데이터 |
홀딩 레지스터 (Holding Registers) | 40001–49999 | 16비트(2바이트) 읽기/쓰기 |
입력 레지스터 (Input Registers) | 30001–39999 | 16비트(2바이트) 읽기 전용 |
6. Modbus 메세지 구조
6.1. Slave ID(Address)
슬레이브 ID는 네트워크 내에서 슬레이브 장치를 식별하는 고유한 번호입니다. 일반적으로 1~247 사이의 값을 가지며, 마스터는 특정 슬레이브를 호출할 때 해당 ID를 사용합니다.
6.2. Function Code
Function Code는 Modbus 프로토콜에서 마스터(Master)가 슬레이브(Slave)에게 수행할 작업을 지시하는 명령 코드입니다.
각 Function Code는 특정한 기능(예: 데이터 읽기, 데이터 쓰기, 진단 등)을 수행하는 역할을 합니다.
✅ Modbus 프레임에서 Function Code는 항상 두 번째 바이트(1 Byte) 위치에 존재하며, 요청(Request)과 응답(Response) 모두 포함됩니다.
✅ Function Code에 따라 데이터 필드의 형식이 달라집니다.
📍 Function Code의 종류
📌 Function Code는 크게 Bit(1비트) 데이터와 16비트 레지스터 데이터, 진단/기타 기능으로 분류됩니다.
구분 | Function 명 | 코드 (Hex) | 설명 |
Bit(1비트) 데이터 | Read Discrete Inputs | 02 | 디지털 입력(Discrete Input) 읽기 |
Read Coils | 01 | 코일(Coils) 상태 읽기 | |
Write Single Coil | 05 | 코일 한 개 설정 | |
Write Multiple Coils | 0F | 여러 개의 코일 설정 | |
16비트 레지스터 데이터 | Read Input Registers | 04 | 입력 레지스터(Input Register) 읽기 |
Read Holding Registers | 03 | 홀딩 레지스터(Holding Register) 읽기 | |
Write Single Holding Register | 06 | 홀딩 레지스터 한 개 쓰기 | |
Write Multiple Registers | 10 | 여러 개의 홀딩 레지스터 쓰기 | |
Read/Write Multiple Registers | 17 | 동시에 읽고 쓰기 | |
파일/버퍼 접근 | Read File Record | 14 | 파일 레코드 읽기 |
Write File Record | 15 | 파일 레코드 쓰기 | |
Read FIFO Queue | 18 | FIFO 큐 읽기 | |
진단/기타 기능 | Read Exception Status | 07 | 예외 상태 읽기 |
Diagnostic | 08 | 장치 진단 기능 수행 | |
Get Com Event Counter | 0B | 통신 이벤트 카운터 가져오기 | |
Get Com Event Log | 0C | 통신 이벤트 로그 가져오기 | |
Report Slave ID | 11 | 슬레이브 ID 보고 | |
Read Device Identification | 2B | 장치 정보 읽기 |
📌 즉, Function Code는 요청 메시지가 어떤 작업을 수행해야 하는지를 결정하는 가장 중요한 요소입니다.
✅ 자주 쓰는 Function Code
Function Code | 설명 |
01 | 코일 상태 읽기 (Read Coils) |
02 | 입력 상태 읽기 (Read Discrete Inputs) |
03 | 홀딩 레지스터 읽기 (Read Holding Registers) |
04 | 입력 레지스터 읽기 (Read Input Registers) |
05 | 단일 코일 설정 (Write Single Coil) |
06 | 단일 레지스터 설정 (Write Single Register) |
16 | 여러 레지스터 쓰기 (Write Multiple Registers) |
6.3. CRC (Cyclic Redundancy Check)
모드버스 RTU는 오류 검출을 위해 CRC-16 체크섬을 사용합니다. CRC는 메시지가 손상되었는지 확인하는 역할을 하며, 송신자가 계산하여 패킷 끝에 추가하고, 수신자가 동일한 연산을 수행하여 비교합니다.
CRC 계산 방식은 다음과 같습니다.
- 모든 데이터를 특정 알고리즘으로 변환하여 16비트 CRC 값을 생성합니다.
- 메시지에 CRC 값을 추가하여 전송합니다.
- 수신 측에서 다시 CRC를 계산하여 비교합니다.
- 일치하면 데이터가 정상적으로 수신된 것으로 간주합니다.
🔹 Modbus RTU 메시지 구조
Modbus RTU Message는 Slave ID, Function Code, Data, CRC로 구성됩니다.
- Slave ID (1 Byte)
- 통신하는 슬레이브 장치를 식별하는 고유한 ID (1~247 범위)
- Function Code (1 Byte)
- 마스터가 슬레이브에게 수행할 동작을 지정하는 코드
- 예: 01 (코일 읽기), 03 (홀딩 레지스터 읽기), 06 (단일 레지스터 쓰기)
- Data (N Bytes)
- Function Code에 따라 필요한 데이터
- 예를 들어, 레지스터 값을 요청할 경우 시작 주소 및 개수 포함 (ex: WCNT)
- CRC (2 Bytes, Cyclic Redundancy Check)
- 오류 검출을 위한 16비트 CRC-16 체크섬
📌 Modbus RTU는 직렬 통신(RS-232/RS-485)에서 사용되며, CRC로 데이터 오류를 검출합니다.
➕➕ Modbus에서 WCNT (Word Count)란?
WCNT (Word Count)는 Modbus 프로토콜에서 전송되는 데이터의 워드(Word) 개수를 의미합니다.Modbus에서 1 워드(Word)는 16비트(2 바이트)로 정의됩니다.📌 즉, WCNT는 읽거나 쓰려는 16비트 단위 데이터의 개수를 나타냅니다.
🔹 Modbus TCP/IP 메시지 구조
Modbus TCP/IP Message는 MBAP Header + Modbus PDU로 구성됩니다.
여기서 중요한 차이점은 CRC가 없고 MBAP Header가 추가된다는 점입니다.
✅ MBAP (Modbus Application Protocol) Header
MBAP 헤더는 Modbus TCP/IP 통신에서 Modbus 메시지를 구분하는 역할을 합니다.
총 7 바이트(7 Bytes) 길이로 구성됩니다.
- Transaction ID (2 Bytes)
- 클라이언트(마스터)와 서버(슬레이브) 간의 요청을 구분하는 고유한 ID
- 동일한 요청에 대한 응답을 올바르게 매칭하기 위해 사용됨
- Protocol ID (2 Bytes)
- Modbus TCP의 경우 항상 00 00 (즉, Modbus 프로토콜)
- Length (2 Bytes)
- 이후 데이터의 전체 길이를 나타냄
- Unit ID (1 Byte)
- 기존의 Slave ID와 유사한 역할을 하지만, 네트워크 환경에서 장치를 식별하는 데 사용됨
- 게이트웨이(Modbus RTU-TCP 변환기)를 통해 RTU 장치를 연결할 때 사용됨
📌 즉, MBAP 헤더는 Modbus RTU와 달리 TCP/IP 환경에서 패킷을 식별하고 관리하는 데 필요합니다.
'Computer Science > CS 지식' 카테고리의 다른 글
교류 전력과 역률(Power Factor) (0) | 2025.03.10 |
---|---|
[Modbus] Modscan & Modsim 으로 TCP 통신하기 (0) | 2025.03.09 |
LoRa (Long Range)와 LoRaWAN(Long Range Wide Area Network) (1) | 2025.03.05 |
시리얼 통신(Serial Communication) (0) | 2025.03.05 |
[IoT] MQTT 개념 및 환경 구축 (내부 네트워크) (0) | 2025.02.24 |