지나가던 개발(zigae)

Modbus rtu rs485 / CRC Check

2019년 5월 21일 • ☕️ 4 min read

외경 측정기

MODBUS RTU RS485 (CRC16 for node)

Modbus RTU frame format

start slave addr comand code data content CRC Check end
10ms 텀으로 구분 8bit 범위 0~247 8bit 03H, 10H n*8bit 하단에서 설명 16bit 참조 10ms 텀을 주고 구분
위와 같은 데이터 포맷을 가진다.

Request

요청 필드 명 예제 값(16진수)
Slave addr 01
Command code 03
start addr high byte 00
start addr low byte 06
Variable number byte 00
Variable low number byte 08
CRC16 -
CRC16 -

참고 문서 를 확인해보면 Command code 0x03 은 측정기에서 값을 받아 올 수 있는 코드이고, 주소 0x06~0x07, 0x08~0x09은 각각 X, Y의 외경 값을 가진다. start addr high, low byte 는 16진수 주소를 둘(반?)으로 나눈 값이고, Variable high, low number byte 는 총 몇 바이트를 읽을건지 명시한다. 즉 위 패킷은 0x06 ~ 0x09 까지 총 8byte 를 읽는다. 요약하면 위와 같은 요청은 X, Y 의 외경값 응답을 기대 할 수 있다.


Respone

응답 받을 데이터의 범위를 20~40 이라고 가정
응답 필드 명 예제 값(16진수)
Slave addr 01
Command code 03
addr 0x06 high byte 18
addr 0x06 low byte 14
addr 0x07 high byte 1E
addr 0x07 low byte 19
addr 0x08 high byte 23
addr 0x08 low byte 1F
addr 0x09 high byte 28
addr 0x09 low byte 24
CRC16 -
CRC16 -

CRC


Cyclic Redundancy Check 의 준말이며, 데이터를 전송할 때 전송된 데이터에 오류가 있는지를 확인하기 위한 체크값을 결정하는 방법 중 하나이다. n 비트의 주어진 정보가 있을때, 이를 k 비트 만큼 자리를 올리고 미리 약속한 k 비트의 키 값으로 나누면 r 비트의 나머지가 남게 된다. 송신측에서는 원래의 정보 비트를 k 비트 자리 올린 것에 r 비트의 나머지를 더해서 n+r 비트의 데이터를 만들어 보낸다. 수신측에서는 수신된 n+r 비트의 데이터를 키 값으로 나누어 보고 나머지가 정확히 0 이 되는지를 검사하면 된다.


CRC16


위에서 k 가 16 비트이면 CRC-16, 32비트이면 CRC-32 가 된다. 키(제수)) 값으로는 아래를 참고하자.


CRC16 의 종류

CRC16 참고자료 를 보면 다양한 crc 종류가 있다.

CRC16-IBM 을 알아보자

Modbus, USB, ANSI 등.. 에 이용된다.

아마 IBM 의 룰을 따르지 않을까 생각

CRC-16-IBM(modbus) 에서는 X16 + x15 + x2 + 1 즉 0x8005 를 키(제수)로 이용한다. master 와 server 는 꼭 같은 키를 이용해야한다.

계산 방법은 이곳 을 참조

최종 결과 (serial + crc)