[네트워크] Modbus 프로토콜

yjseo·2024년 10월 23일

2월에 노션에 적어가면서 공부했던건데 이제야 글씀😰

Modbus 프로토콜

Modbus
Modbus는 1997년 Modicon 에서 제조 공장이나 놀이 공원의 기계들을 자동화하고 제어하기 위해 사용되는 PCL(Programmable Logic Controller)와의 통신에 사용할 목적으로 만들어졌다.
장비 제어와 모니터링에 필요한 기능들을 수행할 수 있기 때문에 사실상 표준 프로토콜의 지위를 얻게 되었고, 현재까지 산업용 전자 장치들을 서로 연결하는 목적으로 널리 사용된다.

Modbus 특징

  • 마스터/슬레이브 기반 프로토콜
    • 시리얼 통신에서는 마스터로 설정된 장비만이 슬레이브로 정보 요청 가능
    • 이더넷 통신에서는 네트워크 상의 어떤 노드도 정보를 요청할 수 있음
  • 네트워크 상에 연결된 모든 장비들이 요청을 받을 수 있지만 정해진 장비만 답을 하는 구조
  • RTU, ASCII, TCP 통신을 지원, 프레임 별로 형식이 다름

장점

  • 산업용 통신 프로토콜로 개발됨
  • 프로토콜이 공개되어 있고 무료
  • 설치와 유지 보수 용이
  • 비트 단위 or 워드 단위로 정보 조작 용이

단점

  • 70년대 PLC에 사용에 맞춰 자료형이 제한됨
  • 마스터의 요청 없이 슬레이브에서 예외처리를 전달할 수 없음
  • 하나의 데이터 링크에 247개로 기기 연결이 제한됨

Modbus 통신의 종류

1. Modbus Serial

하나의 Master 모듈과 다수의 Slave 모듈로 구성
일반적으로 PLC가 Master가 되고 주변 장치가 Slave가 됨

Serial 통신 모드

  • unicast 모드: 마스터 모듈이 단일 슬레이브 모듈에 커맨드를 보내서 응답을 받는 방식
  • broadcast 모드: 마스터 모듈이 모든 슬레이브 모듈에 커맨드를 보내는 방식

Modbus Serial 통신의 대표적인 규격

  • Modbus on RS232
    • 근거리 1 : 1 장비간 통신 방식
    • 전이중 통신 방식
    • 최대 통신 거리 15M
    • 최대 통신 속도: 20kbps
  • Modbus on RS422
    • 1 : N 장비의 통신 방식
    • 전이중 통신 방식
    • 최대 통신 거리 1.2KM
    • 최대 통신 속도: 100Mbps
  • Modbus on RS485: 여러 장비들을 하나의 망으로 묶을 수 있으며, 하나의 master에서 여러 개의 slave들과 통신 가능
    • N : N 장비간 통신 방식
    • 반이중 통신 방식
    • 최대 통신 거리: 1.2KM
    • 최대 통신 속도: 100Mbps

Modbus Serial 전송 방법

  • Modbus RTU (Remote Terminal Unit): ASCII 데이터 전송
  • Modbus ASCII (American Standard Code for Information Interchange): 이진 데이터 전송

에러 체크 방식

  • CRC 에러 체크: Modbus RTU에 적용
  • LRC 에러 체크: Modbus ASCII 방식에 적용

Serial Modbus 프로토콜 프레임 구성 요소

  • Discrete input: 디지털 입력
  • Coils: 디지털 출력
  • input registers: 아날로그 입력 및 내부 메모리 용
  • Holding registers: 래치 메모리 용
  • Modbus 메모리 맵 : modbus 프로토콜에서 사용되는 장치의 데이터 구조
코일/레지스터용도함수읽기 주소
1~9999읽기/쓰기 코일1, 5, 150x0000~0x270E
10001~19999읽기 전용 코일20x0000~0x270E
30001~39999읽기 전용 레지스터40x0000~0x270E
40001~49999읽기/쓰기 레지스터3, 6, 160x0000~0x270E

Modbus RTU 프로토콜 패킷 분석

startAddressFunctionDataCRC CheckEnd
> 3.5 char8bits8bitsN * 8bits16bits> 3.5 char
  • Address: 디바이스 장치 구분 1 ~ 247
  • Function code: master에서 slave로 어떤 동작을 할지 지정
  • Data: Function code에 따라 달라짐
  • CRC: 순환 중복 체크섬

2. Modbus Plus

시스템과 시스템 간 Modbus PLUS 통신을 사용, 고속(1Mbps)으로 P2P 기능 (각 장치가 마스터가 되기도 하고 슬레이브가 되기도 함) 전용의 슈나이더 칩을 이용한 프로토콜

3. Modbus TCP/IP - Ethernet 기반의 TCP 통신

TCP: 전송 제어 프로토콜
IP: 인터넷 프로토콜
-> TCP/IP: 인터넷 전송 프로토콜

TCP/IP를 이용하여 Modbus 정보를 보냄
해당 데이터는 TCP로 전달
여기서 추가 정보가 첨부되어 IP로 전달
IP는 데이터를 패킷 (or 데이터그램)에 넣어 전송

TCP는 연결 기반 프로토콜이므로 데이터를 전송하기 전에 연결을 설정해야 함
마스터(or Modbus TCP의 클라이언트)는 슬레이브(or 서버)와 연결을 설정
서버는 클라이언트로부터 들어오는 연결을 기다림
연결이 설정되면 서버는 클라이언트가 연결을 닫을 때까지 클라이언트 쿼리에 응답

TCP/IP 래퍼를 사용하여 전송
직렬 회선 대신 네트워크를 통해 전송되는 Modbus RTU 메시지
서버는 IP 주소를 대신 사용하므로 SlaveID가 없음

Modbus RTU 메시지로 시작하여 처음부터 SlaveID를 제거하고 끝에서 CRC를 제거하면 PUD(Protocol Data Unit)가 생성

Modbus 패킷 구조

  • MBAP Header
    • Transcation ID: Request, Response Transaction ID(Pair) 응답 없이 여러 개의 Request를 날리는 경우 식별 위함
    • Protocol ID: Modbus는 0x0000으로 고정
    • Length: Unit ID 필드 ~ Data 필드까지의 길이(byte 수), 상위 바이트 0x00 고정, 모든 메시지는 256 byte보다 작음
    • Unit ID: TCP/IP가 아닌 다른 통신 선로로 연결되어 있는 Slave로 구분, gateway를 통해 통신을 할 때 Device Address로 사용함, 보통은 IP 주소로 디바이스 지정 → 0xFF로 고정
  • Funciton Code
    • Bit: I/O 핀의 Input, Output data
    • Word: ADC, PWM 같은 값이 큰 데이터
  • Data: Bit, Word에 따라 달라지지만 기본적으로 주소, 길이, 데이터 크기, 데이터 값을 포함함, 실제 프로토콜의 경우 시작 메모리 번지수 (2byte), 시작 번지부터 읽을 비트 혹은 byte의 수 (2byte)

Modbus TCP vs Modbus RTU

프레임 형식:
Modbus 프레임은 PDU(Protocol Data Unit)을 캡슐화하는 ADU(Application Data Unit)으로 구성

ADU = Address + PDU + Error check
PDU = Function code + Data

function code

형태메모리이름Function Code디바이스
비트(bit)CoilRead Discrete Inputs02 (0x02)INPUT, OUTPUT
Read Coil01 (0x01)
Write Single Coil05 (0x05)
Write Multiple Coil15 (0x0F)
워드 (16 bit)RegisterRead Input Register04 (0x04)ADC, PWM
Read Holding Registers03 (0x03)
Write Single Register06 (0x06)
Write Multiple Registers16 (0x10)

01 Read Coils: 원격 장치에서 코일의 연속 상태를 1 ~ 2000 까지 판독하는 데 사용
02 Read Discrete Inputs: 원격 장치에 있는 불연속적인 입력의 연속된 상태를 1에서 2000까지 읽는 데 사용
03 Read Holding Registers: 원격 장치에 있는 레지스터의 연속 블록의 내용을 읽는 데 사용
04 Read Input Registers: 원격 디바이스의 연속 입력 레지스터를 1에서 125까지 읽는 데 사용
05 Write Single Coil: 원격 장치의 ON 또는 OFF에 단일 출력을 쓰는 데 사용
06 Write Single Register: 원격 장치에 단일 홀딩 레지스터를 쓰는 데 사용
15 Write Multiple Coils: 원격 장치에서 코일 시퀀스를 ON 또는 OFF로 강제 적용하는 데 사용
16 Write Multiple registers: 원격 장치의 연속 레지스터 블록(1~123 레지스터)을 쓰는 데 사용


+Modbus는 왜 만들어졌을까?

주로 RS485 스택, TCP 스택 위에 올라감
(RS485 위에서 동작, TCP 위에서 동작)
RS485 에서 동작하도록 만들어진 뒤에 TCP 에서도 동작할 수 있도록 확장
ModBus 프로토콜은 RS485에 최적화 되어 있음
RS485 는 시리얼 통신 중 하나
A <———> B
A와 B가 통신하려면 유선 이든 무선 이든 어떤 물리적인 경로가 있어야 함
물리적인 경로도 약속이 필요(일종의 프로토콜)
시리얼 통신: 한 번에 한 비트만 보낸다
설정해야 할 것
1. bps
초당 비트 수, 통신 속도의 단위, 1초 간에 송신 또는 수신할 수 있는 비트의 수
2. 데이터 길이 8
3. 패리티 N, E, O
전송 과정에서 1비트 오류를 검출하기 위한 것, 1의 개수가 짝수나 홀수가 되게 함
4. 정지 비트
RS232
RS422
RS485 - 멀티 드롭 가능(여러 대의 단말기들을 한 개의 통신 회선에 연결)
제어용 PC에서 어떤 특정한 단말기에게만 요청을 할 수 없음
반드시 어떤 단말기에게 데이터를 요청하는 것 인지에 대한 데이터를 포함해야 함
ModBus 프로토콜

RS485는 하나의 선을 이용하여 통신함 → 마스터-슬레이브 방식일 수 밖에 없음
여러 개의 노드들이 동시에 데이터를 보내면 데이터가 손실됨
→ 마스터와 슬레이브를 둬서 동시에 데이터를 보내지 못하도록 함

참고
https://developer-depot.tistory.com/entry/시리얼-modbus-모드버스-통신-방식-설명
https://www.simplymodbus.ca/index.html
https://jcdgods.tistory.com/483
https://www.youtube.com/watch?v=ImVbnyqAqX4
https://badayak.com/entry/MODBUS-RTU-프로토콜-쉽게-이해하기
https://kuwhawha.tistory.com/286
https://devdockr.tistory.com/2102

profile
저 뭐해먹고 살아요..🥺

0개의 댓글