본문 바로가기
Study/ETC & TIP

MODBUS 프로토콜

by Answer Choi 2019. 8. 21.
반응형

MODBUS 프로토콜은 산업용 프로토콜로 PLC통신등에 주로 사용되는 표준이 되는 프로토콜입니다.

 

주로 사용하는 방식은 RTU방식과 ASCII방식이 주로 사용되고, 요즘에는 TCP방식도 나와있습니다.

 

프레임의 구성은 Application Data Unit인 ADU와 Protocol Data Unit인 PDU로 구성되어 있습니다.

 

즉, ADU=Address+PDU+CRC이고, PDU는 Function code+Data입니다.

 

각각의 프레임 구조를 보면 아래와 같습니다.

 

1. 프레임 구조

 

첫번째는 MODBUS RTU방식입니다.

 

RTU방식은 빠르고 간단하여 가장 많이 쓰입니다.

MODBUS RTU FORMAT

RTU방식의 경우 시작과 끝에 3.5공백문자시간으로 구분됩니다.

 

다음으로 국번 8bit, Function 8bit, data n byte, CRC 16bit 입니다.

 

CRC의 경우 CRC-16을 사용하는데 검색하시면 구하는 함수는 쉽게 구하실 수 있습니다.

 

Online CRC Calculator(crccalc.com)

참고로 Poly는 0x8005, init value는 0xFFFF입니다.

 

MODBUS RTU의 PDU 예를 들면 0x01 0x05 0x00 0x00 0x00 0x01 0x0C 0x0A 입니다.(CRC의 경우 LSB입니다,)

 

 

두번째로 MODBUS-ASCII방식입니다.

MODBUS-ASCII

ASCII방식은 시작문자는 콜론(:)으로하고, 끝문자는 CR/LF로 끝납니다.

 

중간에 들어가는 PDU는 RTU와 같고 CRC대신 LRC를 사용합니다.

 

LRC는  modulo-256방식을 사용합니다.

 

예를들어 패킷이 247, 3, 19, 137, 0, 10일때 바이트를 하나씩 더해 256이 넘으면 빼주고, 다 더해서 나온 수를 256에서 빼줍니다.

 

그럼 96이 되는데 이게 LRC가 됩니다.

 

위 예에서 최종 패킷은 247 3 19 137 0 10 96이 됩니다.

 

세번째는 MODBUS-TCP 방식 입니다.

 

MODBUS-TCP

MODEBUS TCP의 경우 PDU앞에 MBAP라는 헤더가 있습니다.

 

MBAP는 Modbus Application Protocol의 약자입니다.

 

Transaction identifier는 요청 or 응답을 한쌍으로 구분하기 위한 번호

 

Protocol identifier는 Modbus TCP의 경우 0

 

Length field는 Length field이후 부터 프레임 끝까지의 길이

 

Unit identifier는 Slave의 address입니다.

 

 

2. Function Code

 

Modbus의 Function code는 목적에 따라 정해져 있습니다.

 

Modbus function code

위 그림처럼 많은 코드가 지정되어 있지만 가장 많이 사용되는 것은 굵게 표시된 코드들입니다.

 

그리고 참고로 이름에 따라 입출력과 bit가 정해져 있습니다.

 

Coils : 읽기, 쓰기 가능, 1bit(on/off)

 

Discrete inputs : 읽기 가능, 1bit(on/off)

 

Input Registers : 읽기 가능, 16bits(0~65,535)

 

Holding Registers : 읽기, 쓰기 가능, 16bits(0~65,535)

 

굵은 글씨중 Function code 2번과 4번빼고는 출력이라 생각하시면 됩니다.

 

 

3. 요청 / 응답 예

 

첫번째 예로 function code 4번을 사용하여 0번레지스터부터 9번레지스터까지 읽어오는 예입니다.

 

Function code 04
Function 04의  TX Packet(Modbus RTU)

TX 패킷을 보면 차례대로 주소, function, 시작 레지스터 주소, 개수, 그리고 CRC로 이루어져 있습니다.

 

CRC만 LSB이고 나머지는 MSB입니다.

 

Function 04의 RX Packet(Modbus RTU)

RX 패킷도 마찬가지로 주소, function이 나오고 길이정보가 나옵니다. 그뒤에는 2byte씩 레지스터 값이 나옵니다.

 

마지막 2byte는 CRC입니다.

 

Function 4번은 16bit이기때문에 16bit씩 응답이 옵니다.

 

 

두번째 예는 function code 5번을 사용하여 1번코일을 set해보겠습니다.

 

Function code 05

 

 

Function 05의 TX/RX Packet

Function 05의 APU는 Coil주소와 SET Flag인 0xFF00만 지정해 주면 됩니다.

 

Coil 출력이 성공적으로 되었다면 응답도 똑같은 Packet으로 전달됩니다.

 

 

 

만약 CRC가 잘못되면 어떤 응답이 올까요?

 

CRC 오류

CRC를 잘못보내게 되면 응답으로 function 부분에 0x80이 더 더해서 오게 됩니다.

 

그리고 바로 뒤에 Exception Code가 오는데 이 code는 01~0B까지 있습니다.

 

Exception Code

코드별 의미는 위 표와 같습니다.

 

CRC가 잘못되어 데이터가 이상하다고 응답이 왔네요.

 

보낼때도 CRC를 제대로 보내야 하지만, 받을때도 CRC를 체크하시는 것이 좋습니다.

 

 

 

반응형

인기글