1. 개요
ModBus-TCP는 산업용 필드버스 분야에서 자주 사용되는 통신 프로토콜이다.
TCP/IP 네트워크 상에서 상위장치와 하위장치간의 인터페이스를 위하여 고안된 방법이다.
ModBus-TCP 통신규격에는 마스터(Client)와 슬레이브(Server)의 역할이 나누어져 있다.
슬레이브(Server)는 마스터(Client)가 요청하는 데이터에 대해 응답해준다.
마스터(Client)와 슬레이브(Server)간의 정상적인 Data 통신을 하기 위해서는
ModBus-TCP 프레임구조에 맞는 데이터 패킷을 전송해야 한다.
ModBus-TCP 프레임 구조는 범용 ModBus(RTU, ASCII) 프레임 구조와 상당히 비슷하다.
2. 프레임 구조

ModBus-TCP는, ModBus RTU의 프레임에서 CRC를 제외하고 앞에 6byte의 헤더를 추가한 것이다.
주로 이더넷 환경에서 사용되기 때문에, 즉 하위 레벨에서 오류 체크를 다 해주기 때문에 CRC는 필요없다.
6byte의 추가 헤더에는 트랜잭션 ID가 포함되는데, 이건 요청 프레임과 응답 프레임을 서로 매칭하는
용도로 사용된다. 매칭이 가능하다는 것은 비동기 통신이 가능하다는 것이다.
즉, 하나의 요청에 대한 응답을 완전히 받은 후 이어서 다음 요청을 진행하는 것처럼 순차적으로
통신하는 것이 아니라, 요청과 응답 스레드를 분리하여 요청은 요청대로 그냥 막 송신하고,
응답은 응답대로 계속 읽어서, 최종적으로 서로 같은 트랜잭션 아이디를 찾아 매칭하여 어느
Address에 어떤 값이 있는지를 결정할 수 있다는 것이다.
프레임 구조를 표로 나타내면 다음과 같다.
| 이름 | 길이 | 설명 |
| 트랜잭션 ID | 2 byte | 송신 프레임과 수신 프레임을 매칭하는데 사용(비동기 통신 가능) |
| 프로토콜 ID | 2 byte | 그냥 0으로 고정하여 표기.(0 = ModBus TCP) |
| 메시지 길이 | 2 byte | 이 다음에 오는 Address ~ Data의 총 길이 |
| Address | 1 byte | 장치 주소(Slave Address 또는 Station Address) |
| Function | 1 byte | Function 코드 |
| Data | n byte | Function 코드에 대한 데이터 |
3. ModBus 요청 프레임
데이터 순번(0, 1) - ModBus 프로토콜 (2, 3) - ModBus RTU 길이(4, 5) - 국번(6) - Function Code(7) -
ModBus Address(8, 9) - 제어 명령(10, 11) - CRC(12)
4. Function Code[LS산전 기준]
- 0x01 - 읽기 코일 상태 (Read Coils)
- 기능 : 디지털 출력(코일) 상태를 읽는다.
- 설명 : 여러 개의 코일을 읽을 때 사용하며, 코일은 1비트로 표현된다.
- 0x02 - 읽기 디지털 입력 상태 (Read Discrete Inputs)
- 기능 : 디지털 입력 상태를 읽는다.
- 설명 : 여러 개의 디지털 입력을 읽을 때 사용하며, 각 입력은 1비트로 표현된다.
- 0x03 - 읽기 홀딩 레지스터 (Read Holding Registers)
- 기능 : 16비트 워드(홀딩 레지스터) 값을 읽는다.
- 설명 : 주로 설정값이나 데이터를 읽을 때 사용된다.
- 0x04 - 읽기 입력 레지스터 (Read Input Registers)
- 기능 : 입력 레지스터 값을 읽는다.
- 설명 : PLC의 입력값(센서 값 등)을 읽을 때 사용된다.
- 0x05 - 쓰기 단일 코일 (Write Single Coil)
- 기능 : 단일 디지털 출력을 제어한다.
- 설명 : 1개의 코일(디지털 출력)을 ON 또는 OFF로 설정한다.
- 0x06 - 쓰기 단일 레지스터 (Write Single Register)
- 기능 : 단일 16비트 레지스터 값을 설정한다.
- 설명 : PLC에서 특정 레지스터의 값을 설정할 때 사용된다.
- 0x0F - 쓰기 다중 코일 (Write Multiple Coils)
- 기능 : 여러 개의 디지털 출력을 제어한다.
- 설명 : 여러 개의 코일을 한 번에 ON/OFF설정할 때 사용된다.
- 0x08 - 예외 상태 (Diagnostic)
- 기능 : 진단 정보를 읽는다.
- 설명 : PLC의 상태를 확인하고 진단하는데 사용된다.
- 0x10 - 쓰기 다중 레지스터 (Write Multiple Registers)
- 기능 : 여러 개의 16비트 레지스터 값을 설정한다.
- 설명 : 여러 개의 레지스터를 한 번에 설정할 때 사용된다.
- 0x11 - 읽기/쓰기에 대한 특수 명령 (Report Slave ID)
- 기능 : ModBus 장치의 식별 정보를 읽어온다.
- 설명 : Slave Id와 같은 장치 정보를 읽어온다, 장치의 상태나 구성 정보를 확인할 때 유용하다.