Modbus Protocol
- Modicon이라는 회사에서 만든 직렬 통신 프로토콜이다.
- 공장 자동화에 사용되는 PLC(Programmable Logic Controller)의 통신을 위해 만들어졌다.
용어
프로토콜
- 사람이 소통하려면 소통하고자 하는 사람끼리 정한 규칙(문법, 맞춤법 등)을 지켜야 한다.
- 마찬가지로 기계끼리 통신하려면 물리적인 규약이 필요하다.
- 위와 같은 통신 규약을 프로토콜(Protocol)이라고 부른다.
통신 방식
- 직렬 통신
- 병렬 통신
이중 통신(Duplex)
- 두 지점 사이에서 정보를 주고 받는 전자 통신을 칭한다.
- 전송로를 아끼기 위해 여러 종류의 전송 방식이 사용된다.
- 전이중 통신(Full Duplex)
- 반이중 통신(Half Duplex)
- 단방향 통신(SImplex)
- 참고
통신 주소
- 하드웨어의 Data Sheet를 볼 때 주소를 두 가지로 표현된다면 잘 구분해야 한다.
- Register Address
- Protocol Address
모드버스 종류
- Modbus RTU
- Modbus ASCII
- Modbus TCP/IP
모드버스 RTU 프로토콜의 구성 요소
- bitrate(bps, bit per second)
- 데이터 길이
- 패리티 비트(Parity bit)
- 정지 비트(Stop bit)
- 흐름 제어(Flow Control)
대표적 시리얼 통신
RS 232
- 1:1 통신만 지원한다.
- 외부 영향을 많이 받는다.
- 심플한 기계가 바로 옆에 있을 때 주로 사용한다.
RS 422
- 전이중 통신
- 매우 좋지만 4가닥의 선이 필요하므로 가격이 비싸다.
RS 485
- 가장 많이 사용하는 방식이다.
- 결선에 따라 전이중 통신, 반이중 통신 모두 가능하다.
- 멀티 드롭 방식
패킷의 구조
- 요구하는 기능마다 필요한 데이터가 다르기 때문에, Function Code에 따라 구성이 다르다.
| Slave ID | Function Code | Address | Number of Data | Data Size | Data | CRC |
| 1 Byte | 1 Byte | 2 Bytes | 2 Bytes | 1 Byte | n Bytes | 2 Bytes |
| Function Code | Register Type | 기능 |
| 1 | Read Coil | 1비트 읽기 |
| 2 | Read Discrete Input | 1비트 읽기 |
| 3 | Read Holding Registers | 여러 워드 읽기 |
| 4 | Read Input Registers | 여러 워드 읽기 |
| 5 | Write Single Coil | 1비트 쓰기 |
| 6 | Write Single Holding Register | 1워드 쓰기 |
| 15 | Write Multiple Coils | 여러 비트 쓰기 |
| 16 | Write Multiple Holding Registers | 여러 워드 쓰기 |
예제
패킷 예제 1
- Master(Poll)가 Slave에게 주소 0x0부터 3개의 데이터 읽기를 요청하는 예제
| Slave ID | Function | Address | Number of Data | CRC |
| 01 | 03 | 00 00 | 00 03 | 05 CB |
| Slave ID | Function | Data Size(Byte) | Data | CRC |
| 01 | 03 | 06 | 00 01 00 02 00 03 | FD 74 |
패킷 예제 2
- Master가 Slave에게 주소 0x0부터 3개의 데이터 쓰기를 요청하는 예제
- 여러개의 데이터를 변경하므로 0x16 Function Code를 사용한다.
| Slave ID | Function | Address | Number of Data | Data Size(Byte) | Data | CRC |
| 01 | 10 | 00 00 | 00 03 | 06 | 00 04 00 05 00 06 | 87 43 |
| Slave ID | Function | Address | Number of Data | CRC |
| 01 | 10 | 00 00 | 00 03 | 80 08 |
CRC
- 시리얼 통신의 불안정함을 보완하기 위해 등장했다.
- 2바이트로 구성된다.
알고리즘
- 공식 라이브러리의 알고리즘은 다음과 같다.
CRC 2바이트를 모두 1로 초기화한다. (0xffff)
반복적으로 update_crc_16 함수를 호출하여 CRC 값을 변경한다.
/*
* uint16_t update_crc_16( uint16_t crc, unsigned char c );
*
* The functin update_crc_16() calculates a new CRC-16 value based n the
* previus value f the CRC and the next byte f data t be checked.
*/
uint16_t update_crc_16( uint16_t crc, unsigned char c ) {
uint16_t tmp;
uint16_t shrt_c;
shrt_c = 0x00ff & (uint16_t) c;
if ( ! crc_tab16_init ) init_crc16_tab();
tmp = crc ^ shrt_c;
crc = (crc >> 8) ^ crc_tab16[ tmp & 0xff ];
return crc;
} /* update_crc_16 */
crc는 직전의 CRC 값이다.
입력으로 준 값을 하나씩 c에 넣으며 반복적으로 계산한다.
shrt_c는 수신한 값의 1바이트이다. 이를 CRC 값과 ^(xr) 연산하여 나온 값의 1바이트를 crc_tab16 테이블에서 찾아서 CRC 값의 상위 8바이트와 ^ 연산한 값을 새로운 CRC 값으로 설정한다.
init_crc16_tab()의 코드는 프로그램에서 한 번만 실행되며, crc_tab16 테이블을 만들어 성능을 높인다.
static vid init_crc16_tab( vid ) {
uint16_t i;
uint16_t j;
uint16_t crc;
uint16_t c;
fr (i=0; i<256; i++) {
crc = 0;
c = i;
fr (j=0; j<8; j++) {
if ( (crc ^ c) & 0x0001 ) crc = ( crc >> 1 ) ^ CRC_PLY_16;
else crc = crc >> 1;
c = c >> 1;
}
crc_tab16[i] = crc;
}
crc_tab16_init = true;
} /* init_crc16_tab */
모드버스 TCP/IP
패킷의 구조
- TCP/IP 계층에서 오류 검증을 하므로, 따로 CRC 코드를 사용할 필요가 없다.
| Transaction ID | Protocol ID | Length | Unit ID | Function Code | Address | Number of Data | Data Size | Data |
| 2 Bytes | 2 Bytes | 2 Bytes | 1 Byte | 1 Byte | 2 Bytes | 2 Bytes | 1 Byte | n Bytes |
패킷 예제
- 1부터 10까지의 데이터를 전송하는 모드버스 TCP/IP 패킷
| Transaction ID | Protocol ID | Length | Unit ID | Function Code | Address | Number of Data | Data Size | Data |
| 00 00 | 00 00 | 00 06 | 01 | 03 | 00 00 | 00 0A | - | - |
| Transaction ID | Protocol ID | Length | Unit ID | Function Code | Address | Number of Data | Data Size | Data |
| 00 00 | 00 00 | 00 17 | 01 | 03 | - | - | 14 | 00 01 00 02 00 03 00 04 00 05 00 06 00 07 00 08 00 09 00 0a |
모드버스 RTU Over TCP/IP
- 모드버스 TCP/IP 프로토콜과는 달리 모드버스 RTU 프로토콜의 구성을 그대로 사용한다.
- 괜히 프로토콜을 따로 만드는 것보단 이 방식이 더 범용성 높고 좋은 것 같은데, 굳이 위의 모드버스 TCP/IP 프로토콜을 따로 만든 이유가 궁금하다.
'IT > IOT' 카테고리의 다른 글
| PLC 통신 사양 (PROTOCOL)-2 (0) | 2024.11.04 |
|---|---|
| PLC 통신 사양 (PROTOCOL)-1 (2) | 2024.11.04 |
| LS일렉트릭 XBM-DN32H2 - 5 (9) | 2024.10.28 |
| LS일렉트릭 XBM-DN32H2 - 4 (0) | 2024.10.28 |
| LS일렉트릭 XBM-DN32H2 - 3 (0) | 2024.10.28 |