통신/Modbus

Modbus Protocol

귀뚜래미 2022. 8. 24. 22:46
728x90

Modbus란?

Modbus는 시리얼 통신 프로토콜이다. 네트워크 상에서 장치 간 정보 송수신을 위해 고안된 통신 방법이다.

 

 

프로토콜 구조

 

범용 Modbus(RTU, ASCII) 프레임 구조
Modbus TCP 프레임 구조(프레임 형식의 프로토콜을 이용해 Slave의 메모리에 접근, 해당 주소의 데이터의 값을 읽어오거나 원하는 값으로 쓸 수 있다.)

 

 

Modbus의 Master와 Slave

Modbus에는 Modbus Master(Client, 데이터를 요청), Modbus Slave(Server, Master가 요청한 데이터를 제공)의 역할이 나누어진다.

Master에는 산업용 기기 또는 PC와 같은 상위 기기가 존재한다.

Slave에는 TCPPORT나 PLC등이 위치한다.

 

- 표준 Modbus 네트워크에서는 1개의 Master최대 247개의 Slave를 연결 가능

- 각각의 Slave 주소는 1 ~ 247

- Master는 Slave에게 데이터를 Write 할 수도 있음

 

 

기본 작동 방식

Modbus는 장치 간 시리얼(직렬) 회선을 개입시켜 송신된다.

 

데이터는 bit라는 1과 0으로 구성된 데이터로 전송된다. 각 비트는 전압으로 전송된다. 0은 양의 전압, 1은 음의 전압으로 전송된다.

 

 

16진법

 

10진수(DEC)    16진수(HEX)    8진수(OCT)    2진수(BIN)

문제 해결 시 전송되는 실제 원시 데이터를 보기 위해 16진법을 읽을 수 있어야 한다.

1과 0으로 구성된 긴 문자열은 읽기 어렵기 때문에 비트가 결합되어 16진수로 표시된다. 4비트의 각 블록은 0에서 F까지의 16개 문자 중 하나로 표시된다.

16진법

8비트의 각 블록(byte)00에서 FF까지의 256개 문자 쌍 중 하나로 표시된다.

 

 

Standard Modbus에 데이터가 저장되는 방식

데이터는 Slave 장치의 4가지 다른 테이블에 저장된다. 2개의 테이블은 이산형 값(coils)이 저장되고 2개의 테이블에는 숫자 값(registers)이 저장된다. coil과 register에는 각각 읽기 전용 테이블과 읽기-쓰기 테이블이 있다.

 

- 각 테이블에는 9999개의 값이 있다.

- 각 코일과 접점은 1비트이며 0000270E 사이의 데이터 주소가 할당된다.

- 각 레지스터는 1word = 16bits = 2bytes이며 데이터 주소도 0000에서 270E 사이로 구성된다.

- 코일, 레지스터 번호는 실제 메시지에 나타나지 않으므로 위치 이름으로 생각할 수 있다.

- 데이터 주소는 메시지에 사용된다.

 

예를 들어 첫번째 홀딩 레지스터 번호가 40001일 경우 여기엔 데이터 주소 0000이 있다.

두 값의 차이는 오프셋이다.

각 테이블마다 오프셋이 다르다.(1, 10001, 30001, 40001)

 

 

Slave ID란?

네트워크의 각 Slave에는 1부터 247까지의 고유한 장치 주소가 할당된다. 마스터가 데이터를 요청할 때 보내는 첫번재 바이트는 Slave Address이다. 이러한 방식으로 각 Slave는 첫번째 바이트 이후에 메시지를 무시할지 여부를 알 수 있다.

 

 

Function Code란?

마스터가 보낸 두번째 바이트는 function code이다. 이 번호는 Slave에게 액세스할 테이블과 테이블을 읽거나 쓸지 여부를 알려준다.

 

 

CRC란?

CRC는 Cyclic Redundancy Check의 약자이다. 오류 감지를 위해 모든 Modbus 메시지 끝에 2바이트가 추가된다. 메시지의 모든 바이트는 CRC를 계산하는 데 사용된다. 또한 수신 장치는 CRC를 계산해 송신 장치의 CRC와 비교한다. 메시지의 한 비트라도 잘못 수신되면 CRC가 달라지고 오류가 발생한다.

CRC 계산기.xls
0.14MB

 

 

Modbus의 명령 및 응답 형식

 

 

Modbus RTU

데이터 형식

2진수 Binary (base2):                 10101110       2 characters 0 and 1

16진수 Hexadecimal (base 16):  AE                16 characters 0 through F

 

메시지 구분

Modbus RTU에서 바이트는 구분자를 위한 메시지 사이에 3-1/2 정도의 문자 공간을 두고 공백 없이 연속적으로 전송 된다. 이를 통해 소프트웨어는 새 메시지가 언제 시작되는지 알 수 있다.

바이트 사이의 지연은 Modbus RTU가 새 메시지의 시작으로 해석하도록 한다. 이로 인해 모뎀에선 Modbus RTU가 제대로 작동하지 않는다.

 

바이트 크기

Modbus RTU에서 각 바이트는 시작 비트와 정지 비트로 프레임된 8개의 이진 문자의 문자열로 전송되어 각 바이트를 10비트로 만든다.

 

데이터 바이트 분할

Modbus RTU의 데이터 바이트 범위는 00에서 FF 사이의 모든 문자가 될 수 있다.

 

확장 레지스터 주소

아날로그 출력 홀딩 레지스터의 범위는 40001 ~ 49999이므로, 9999 이상의 레지스터가 있을 수 없음을 의미한다.

레지스터 40001 ~ 49999는 데이터 주소로 0000 ~ 270E에 해당한다. 나머지 데이터 주소 270F에서 FFFF를 이용하면 6배 이상의 레지스터를 사용할 수 있으며, 총 65536개 이다. 이것은 40001부터 105536까지의 레지스터 번호에 해당한다.

많은 modbus 소프트웨어 드라이버(마스터 PC용)는 40001에서 49999까지의 제한으로 작성되었으며 슬레이브 장치의 확장 레지스터에 액세스할 수 없다. 그리고 많은 슬레이브 장치들은 확장 레지스터를 사용하는 지도를 지원하지 않는다. 그러나 다른 한편으로 일부 슬레이브 장치는 이러한 레지스터를 지원하고 일부 마스터 소프트웨어는 특히 사용자 지정 소프트웨어가 작성된 경우 액세스할 수 있다.

 

정보출처1 : https://www.simplymodbus.ca/FAQ.htm

 

About Modbus | Simply Modbus Software

 

www.simplymodbus.ca

정보출처2 : http://comfilewiki.co.kr/ko/doku.php?id=tcpport:modbus-tcp_%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C%EC%9D%B4%EB%9E%80:index#%EB%B2%94%EC%9A%A9_modbus_rtu_ascii_%ED%94%84%EB%A0%88%EC%9E%84_%EA%B5%AC%EC%A1%B0 

 

tcpport:modbus-tcp_프로토콜이란:index [Comfile Technology's Online Documentation]

MODBUS-TCP란 MODBUS-TCP는 산업용 필드버스 분야에서 자주 사용되는 통신 프로토콜 입니다. TCP/IP 네트워크 상에서 상위장치와 하위장치간의 인터페이스를 위하여 고안된 통신방법입니다. MODBUS-TCP 통

comfilewiki.co.kr

 

728x90