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를 계산합니다.
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에 대한
통신방법 및 예제를 통한 자세한 설명은 새로운 포스팅으로 통해 기록하도록 하겠습니다.
감사합니다.
485통신에 문외한이라 이것저것 검색해도 전문용어로만 설명된 글들만 보여서 더 혼란스러웠는데, 한번만 읽어봐도 알기쉽게 잘 설명해주셔서 큰 도움이 되었습니다. 정말 감사합니다.
답글삭제도움이 되셨다니 다행입니다.
삭제더 많은 자료 올리도록 하겠습니다.
감사합니다.