본문 바로가기

통신

[정보] Modbus Tcp/IP

◈ 정의

MODBUS-TCP는 산업용 필드버스 분야에서 자주 사용되는 통신 프로토콜 입니다

TCP/IP 네트워크 상에서 상위장치와 하위장치간의 인터페이스를 위하여 고안된 통신방법입니다




MODBUS-TCP 통신규격에는 마스터(Client)와 슬레이브(Server)의 역할이 나누어져 있습니다. 슬레이브(Server)는 마스터(Client)가 요청하는 데이터에 대해 응답을 해줍니다. 주로 마스터(Client)에는 산업용터치 HMI 기기, 또는 PC 와 같은 상위 기기가 위치합니다. 그리고 슬레이브(Server)에는 TCPPORT PLC 등이 위치합니다.

슬레이브(Server)는 상위기기에서 요청하는 동작만을 하는 수동적인 위치에 있습니다. 반면 마스터(Client)쪽에서는 원하는 데이터를 읽어오거나, 원하는 데이터를 기입하는 등 적극적으로 슬레이브(Server) 기기를 다루어 주어야 합니다. 

 

프로토콜 개요

마스터(Client)와 슬레이브(Server)간의 정상적인 Data 통신을 하기위해서는 MODBUS-TCP 프레임구조에 맞는 데이터 페킷을 전송해야 합니다. MODBUS-TCP 프레임구조는 범용MODBUS(RTU, ASCII) 프레임구조와 상당히 비슷합니다

MODBUS(RTU, ASCII) 프레임구조와 상당히 비슷합니다.


범용 MODBUS(RTU, ASCII ) 프레임 구조


MODBUS-TCP는 위의 같은 프레임형식의 프로토콜을 이용하여 슬래이브(Server)의 메모리에 접근하여 해당 어드레스의 데이터의 값을 읽어오거나 원하는 값으로 쓸수 있습니다. 


MBAP Header

MODBUS-TCP MBAP(Modbus Application Protocol)를 선두로 Function code, Data로 순으로 이루어져 있습니다. MBAP는 총 7 Byte이고 아래와 같은 내용의 Byte값을 나타냅니다.


1) Transaction ID [2Bytes] : 마스터(Client)가 최초 0x0000값 부터 통신시작 시 1씩 증가시키며 슬래이브(Server)는 그 값을 그대로 복사해서 사용합니다. 쿼리및 응답에 대해 한쌍으로 작업이 이루어 졌는지를 확인하는 부분입니다.

2) Protocol ID [2Bytes] : 프로토콜의 ID를 나타내며 MODBUS-TCP 0x0000의 고정값을 사용합니다.

3) Length [2Bytes] : Length 필드위치에서 프레임 마지막까지의 길이를 나타냅니다. Unit ID ~ Data끝까지의 Byte의 수를 나타냅니다.

4) Unit ID [1 Byte] : TPC/IP가 아닌 다른 통신선로의 연결되어있는 Slave를 구분하는 정보입니다. Tcpport 0x01로 고정입니다.


 Function Code

Function Code Modbus 프로토콜에서 제공하는 명령어 집합코드 입니다. Function Code를 이용하여 슬레이브 Memory(Coil, Register )에 값을 읽어오거나 쓸수있는 서비스입니다. 실제로 Function Code코드 1~127사이의 값을 사용하고있지만 TCPPORT에서는 1, 2, 4, 5, 6, 15, 16 값을 지원합니다. 그 이유는 실질적으로 사용되는 서비스이기 때문입니다.



MODBUS 데이터 모델은 입력과 출력 그리고 비트 단위 접근과 워드 단위 접근을 기준으로 총 4가지 형태로 나누어집니다. 데이터 모델은 제조사마다 각기 다를수있습니다. 예를 들어 데이더 종류별로 데이터 블록을 각각 지정하여 4개의 데이터 블록으로 사용하거나 비트영역, 워드영역을 나누어 두게의 데이터 블록을 사용할 수 있습니다.



메모리

데이터모델

접근형태

읽기/쓰기

설명

Coil

Discrete Input

비트

읽기

상위장치에서 메모리 읽기 가능

Coil

Coils

비트

읽기/쓰기

상위장치에서 메모리 읽고, 쓰기 가능

Register

Input Registers

16비트 워드

읽기

상위장치에서 메모리 읽기 가능

Register

Holding Resisters

16비트 워드

읽기/쓰기

상위장치에서 메모리 읽고, 쓰기 가능


TCPPORT 16비트 워드영역(Resisters)과 비트영역(Coils)으로 두게의 데이터 메모리로 나누어져 있습니다. 여기서 말하는 메모리는 Slave(server)장비의 메모리를 말하며 Master(Client)는 위의 평션코드를 이용하여 Slave(server)장비의 메모리를 읽거나 원하는 값으로 변경할 수 있습니다.


위의 그림 처럼 해당 Function Code에 따라 어떤 메모리를 접근할 것인지, 어떤 작업수행(Read, Write)을 행할 것인지가 나누어져 있습니다. 

 

Data

Data Function Code에 따라 그 구조가 조금식 달라집니다. Data는 기본적으로 Start Address, Length, Byte Count, Data의 형태를 가지고 있습니다.


1) Start Address [2Bytes] : 접근하려는 메모리의 시작번지를 나타냅니다. 2Byte로 표현되면 상위 Byte 우선순입니다. ( 0x4001번지 접근 시 0x40 0x01)

2) Length [2Bytes] : 시작번지부터 값을 읽거나 쓸 길이를 나타냅니다.

3) Byte Count [1Bytes] : Request, Response에따른 메모리 Data byte 수를 나타냅니다. , 읽어거나 쓸려는 메모리 데이터의 Byte의 개수를 말합니다.

4) DATA [N Byte] : Request, Response에 따른 메모리 Data의 값 나타냅니다. , 읽어거나 쓸려는 메모리 값입니다.

Function Code에 따른 Data 구조는 다음 링크에서 확인하실 수 있습니다. (링크: Funtion Code DATA 구조 및 디바이스 제어)



'통신' 카테고리의 다른 글

[정보] MQTT  (0) 2018.07.04
[정보] PLC(Programmable Logic Controller)  (0) 2018.07.03
[정보] TCP 통신과 UDP 통신 차이  (0) 2018.07.03
시리얼 포트란?  (0) 2018.07.03
[프로토콜] 통신프로토콜 종류  (0) 2018.07.02