Modbus RTU 및 CRC 계산 검증하기 (CRC calculation)

펌웨어를 개발하다보면 CRC 계산을 해야되는 경우가 종종 있습니다.

필자가 즐겨쓰는 CRC 계산 사이트를 소개하고 값을 입력해보며 설명 해보겠습니다.

https://www.lammertbies.nl/comm/info/crc-calculation?crc=8005&method=hex




위의 그림은 해당사이트의 CRC 계산 데이터를 입력하는 창입니다.

저는 주로 modbus rtu 데이터를 검증할때 사용하며 위에서 3번째에 있는 CRC16(Modbus)가 모드버스 CRC 값이 됩니다.


[사용방법]

Input type을 ASCII와 HEX중 선택하고, 그 위 입력창에 계산을 원하는 데이터를 모두 입력후 Calculate CRC 버튼을 누르면 위 박스 데이터에 패킷 형태에 맞게 CRC가 자동계산됩니다.


예제 데이터를 입력해보며 같이 확인해 보겠습니다.

필자의 경우 modbus rtu 데이터 패킷을 master에 아래와 같이 보내려고 합니다.

이때 CRC값을 데이터끝에 2byte로 보내야 하는데 이럴때 이 계산기가 유용하게 사용됩니다.

펌웨어를 통해 내가 계산한 CRC값과 검증이 필요할때도 사용하면 유용합니다.

자~!! 데이터를 한번 보낸다고 가정하고 CRC를 계산해보겠습니다. 


Read temperature data of Modbus RTU (Master to Slave)

Modbus

Slave ID

Function

Code

Start Protocol Address

Quantity

of Registers

CRC16

Hi

Lo

Hi

Lo

Lo

Hi

C0

03

9C

40

00

02

??

??

1 byte

1 byte

1 byte

1 byte

1 byte

1 byte

1 byte

1 byte

Data Description. (모든값은 HEX 데이터 입니다.)

Master와 Slave의 통신내용을 대화로 풀면 아래와 같이 되겠습니다.


[마스터가 먼저 아래와 같이 대화를 요청합니다]

Slave ID C0야. 

펑션코드 03이니까 난 니가 가지고 있는 데이터를 읽을거야.

데이터시트에 Slave 니가 적어논것처럼 온도값을 가지고 있는 레지스터가 9C 40번 부터 9C 41번 이렇게 2개라고 했으니까 읽기시작하는 주소는 9C 40이고, 거기서부터 2개의 레지스터를 읽을거야.

그리고 내 검증값은 ?? ?? 야. 니가 계산해보고 데이터형태가 맞으면 응답줘~


자 이제 ?? ?? 값을 알기위해 사이트에서 계산을 해보도록 하겠습니다.

참고로 CRC 계산에 사용되는 데이터는 Slave ID부터 Quantity of Registers까지 데이터를 계산하는 것입니다.

쉽게말해 패킷 처음부터 CRC16데이터 전까지의 데이터를 가지고 CRC를 계산합니다.


입력타입을 HEX로 지정하고 위의 패킷 데이터를 그림과 같이 입력한 후 계산버튼을 누르면 위와 같이 계산값이 바뀌게 됩니다.

?? ?? 에 해당하는 값이CRC-16 (Modbus) 0x5EFB 라는 것을 알게되었습니다.

여기서 중요한것은 사이트에서 계산되는 5E가 MSB(Hi, 상위비트), FB가(Lo, 하위비트)라는 것입니다.

다시 한번 데이터시트의 Modbus RTU 데이터 형태를 봐봅시다.
다른 데이터들은 Hi가 먼저 그 다음이 Lo 데이터가 오는데 CRC16만 Lo가 먼저이고
그 다음이 Hi 데이터가 옵니다.
Slave장비에 따라 간혹 Hi가 먼저 Lo가 그 다음으로 오는 제품도 있으니 데이터시트를 꼭 확인한 후 이 부분을 잘 체크하고 전송되도록 프로그래밍 합니다.

그럼 이제 입력값의 ?? ??칸을 채워보겠습니다.
사이트를 통해 얻어진 CRC-16 (Modbus) 0x5EFB에서 상위비트가 5E, 하위비트가 FB이므로
패킷을 전송시는 아래와 같이 상위비트와 하위비트를 바꿔서 전송해야 합니다.

Read temperature data of Modbus RTU (Master to Slave)

Modbus

Slave ID

Function

Code

Start Protocol Address

Quantity

of Registers

CRC16

Hi

Lo

Hi

Lo

Lo

Hi

C0

03

9C

40

00

02

FB

5E

1 byte

1 byte

1 byte

1 byte

1 byte

1 byte

1 byte

1 byte

이렇게 CRC가 계산되어 Slave에게 전송되게 됩니다.

그럼 Slave측도 해당 패킷을 파싱한 후 자신이 계산한 CRC값과 보내온 CRC값이 동일하면

온도 데이터를 Master측으로 전송하게 됩니다.


오늘은 CRC계산과 검증방법에 대해 위와 같이 기록을 남기며, Modbus RTU에 대한

통신방법 및 예제를 통한 자세한 설명은 새로운 포스팅으로 통해 기록하도록 하겠습니다.

감사합니다.
















댓글

  1. 485통신에 문외한이라 이것저것 검색해도 전문용어로만 설명된 글들만 보여서 더 혼란스러웠는데, 한번만 읽어봐도 알기쉽게 잘 설명해주셔서 큰 도움이 되었습니다. 정말 감사합니다.

    답글삭제
    답글
    1. 도움이 되셨다니 다행입니다.
      더 많은 자료 올리도록 하겠습니다.
      감사합니다.

      삭제

댓글 쓰기

이 블로그의 인기 게시물

Converting 0~5V to 0~3.3V, 전압을 0~ 3.3V로 변경하는 회로 (자동계산 엑셀파일 첨부함)

Temperature and humidity transmitter & filter cap production story (SCHT-SF7-4P, SCHT-SF7-SP, SCHT-M30)