본문 바로가기
제어/modbus 통신

Modbus(1) 모드버스란?

by su-bi 2023. 8. 13.

필드버스

필드버스 : PLC나 PC기반에서 사용되는 산업용 컴퓨터 네트워크 프로토콜 

ex > PROFIBUS, Modbus, Foundation Fieldbus, DeviceNet, CAN

 

이들중  제어 현장에서 많이 쓰이는 modbus에 대해 알아보자

 

 


Modbus

  • modbus 통신의 장점 : 산업용 어플리케이션에 적합, 개발 및 관리가 쉬움 , 비트/워드 단위로 정보 전달, 

 

  • Modbus 의 특징

- Master- Slave 구조로 여러 주변장비의 상태 점검 가능

- RTU, ASCII, TCP 통신을 지원하며 형식이 다름

- 빅에디안 사용

  • modbus TCP

 Modbus TCP 통신은 TCP/IP 네트워크 위에서 사용하는 통신 방식을 이용해 장거리 통신이 가능하고 기존의 RTU나 ASCII방식의 직렬 통신과의 호환성을 유지한다. 


modbus RTU

 Modbus RTU 통신은 시리얼 기반 통신으로 PC와 PLC사이 통신을 하고 타 장비들과도 통신이 가능하다. RTU 통신에는 RS-232, RS-422, RS-485 등이 있으며 RS-232는 초창기 개발된 방법으로 기본적인 통신 기능을 갖추고 있다. RS-422도 마찬가지로 RS-232보다 조금 발전한 모델이다. RS-485는 modbus 시리얼 통신에서 가장 많이 쓰이는 표준 인터페이스로 멀티 드롭기능을 지원하고 반이중 방식, 1:N통신이 가능하다.  RS-485는 현장에서도 잘 쓰이는 프로토콜이다. 

 

  • modbus RTU 패킷(master)

modbus RTU 마스터 패킷 구성

1. Slave ID(1byte) : 슬레이브 번호로 Master가 Slave로 데이터를 보낼때의 주소값이다. 1~247의 값을 가짐

2. Function(1byte) : Function code로 어떤 동작을 수행할지에 따라 번호가 달라진다. 

Function Code 요약

 

3.Start Address(2byte) 0~65535 : 몇 번지부터 검색할 것인지에 대한 정보

 

4.Data(2byte) : 몇개의 데이터를 요청할 것인지에 대한 정보 or 어떤 정보에 대한 data

 

5. CRC (n byte): Erorr 검출용으로 사용되는 데이터. modbus에는 CRC 공식이 1개이고 라이브러리고 계산이 가능하다.  TCP에서는 사용하지 않음. 

★ Modbus는 빅에디안으로 데이터를 주고 받지만 CRC만 리틀에디안으로 계산해야 함

 

 

6. Start, End (각각28bit)는 메세지와 메시지 사이에 28비트의 간격을 두고 전송하라는 뜻


  • modbus RTU 패킷(Slave)

modbus RTU 슬레이브 패킷 구성

A : slave ID

F : Function Code 

L : Data 길이

1~10 : 각번지에 저장정보

 

example) 

- 마스터  

03 10 00 00 00 03 06 0 04 00 05 00 09 95 15

해석 : 03번 슬레이브에게 Function code 10 을 00 00번치부터 3개(04 05 09) 의 데이터를 쓰겠다. 

 

01 04 00 00 00 0A 70 0D

해석 : 01번 슬레이브에게  Function code 4 를 0부터 A까지 데이터 개수 요청

 

- 슬레이브  

07 10 00 00 00 03 80 48

해석 : 07 번 슬레이브에게 Function code 10  0000번지부터 3개


  • modbus Memory Map

Modbus RTU 메모리 맵

 Modbus 메모리 맵을 보면 번호 구역에 따라 coil과 resister로 구성되어있는데 이는 modbus가 plc를 대상으로 만들어졌기 때문이다. 코일은 1bit의 값과 같고, 레지스터는 2byte의 word값으로 생각할 수 있다. 즉 코일은 ON/OFF, 레지스터는 16bit의 입출력값이다.

 

 MODBUS는 구역을 확실히 나누고 구역별로 특성을 지키기 위해 함수 번호를 만듬. 예를 들어 3,6,16번 함수는 40001~49999까지 정해져있기 때문에 40001번 레지스터 값을 읽는다고 3번함수에 40001번 주소로 지정하는것이 아니라 3번 함수의 0번 주소로 지정한다.

 

※ 주의 - 코일과 레지스터 번호의 시작이 0번일수도 1번 일수도 있으니 반드시 메뉴얼 참고