-
Modbus ProtocolIT/IOT 2024. 11. 3. 08:38728x90반응형
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 프로토콜을 따로 만든 이유가 궁금하다.
728x90'IT > IOT' 카테고리의 다른 글
PLC 통신 사양 (PROTOCOL)-2 (0) 2024.11.04 PLC 통신 사양 (PROTOCOL)-1 (2) 2024.11.04 LS일렉트릭 XBM-DN32H2 - 5 (8) 2024.10.28 LS일렉트릭 XBM-DN32H2 - 4 (0) 2024.10.28 LS일렉트릭 XBM-DN32H2 - 3 (0) 2024.10.28