
2월에 노션에 적어가면서 공부했던건데 이제야 글씀😰
Modbus
Modbus는 1997년 Modicon 에서 제조 공장이나 놀이 공원의 기계들을 자동화하고 제어하기 위해 사용되는 PCL(Programmable Logic Controller)와의 통신에 사용할 목적으로 만들어졌다.
장비 제어와 모니터링에 필요한 기능들을 수행할 수 있기 때문에 사실상 표준 프로토콜의 지위를 얻게 되었고, 현재까지 산업용 전자 장치들을 서로 연결하는 목적으로 널리 사용된다.
하나의 Master 모듈과 다수의 Slave 모듈로 구성
일반적으로 PLC가 Master가 되고 주변 장치가 Slave가 됨
| 코일/레지스터 | 용도 | 함수 | 읽기 주소 |
|---|---|---|---|
| 1~9999 | 읽기/쓰기 코일 | 1, 5, 15 | 0x0000~0x270E |
| 10001~19999 | 읽기 전용 코일 | 2 | 0x0000~0x270E |
| 30001~39999 | 읽기 전용 레지스터 | 4 | 0x0000~0x270E |
| 40001~49999 | 읽기/쓰기 레지스터 | 3, 6, 16 | 0x0000~0x270E |
| start | Address | Function | Data | CRC Check | End |
|---|---|---|---|---|---|
| > 3.5 char | 8bits | 8bits | N * 8bits | 16bits | > 3.5 char |
시스템과 시스템 간 Modbus PLUS 통신을 사용, 고속(1Mbps)으로 P2P 기능 (각 장치가 마스터가 되기도 하고 슬레이브가 되기도 함) 전용의 슈나이더 칩을 이용한 프로토콜
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 프레임은 PDU(Protocol Data Unit)을 캡슐화하는 ADU(Application Data Unit)으로 구성
ADU = Address + PDU + Error check
PDU = Function code + Data
| 형태 | 메모리 | 이름 | Function Code | 디바이스 |
|---|---|---|---|---|
| 비트(bit) | Coil | Read Discrete Inputs | 02 (0x02) | INPUT, OUTPUT |
| Read Coil | 01 (0x01) | |||
| Write Single Coil | 05 (0x05) | |||
| Write Multiple Coil | 15 (0x0F) | |||
| 워드 (16 bit) | Register | Read Input Register | 04 (0x04) | ADC, PWM |
| Read Holding Registers | 03 (0x03) | |||
| Write Single Register | 06 (0x06) | |||
| Write Multiple Registers | 16 (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 레지스터)을 쓰는 데 사용
주로 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