PDA

View Full Version : Calculating CRC for Modbus RTU



tekart
- 17th January 2010, 01:01
Hi, I'm working on a SCADA industrial control system that communicates via Modbus RTU. I'm using a 16F648A with a MAX232 serial driver. The hardware all works fine, but I can't figure out how to calculate the CRC. Apparently Modbus has a specific CRC format, and I found a routine in another forum that claimed to work in PBpro but it isn't.

Here's what I'm using:

CRC=$FFFF ' initialize value
For X = 0 to 11 ' number of bytes to process
CRC = CRC ^ dataCRC[X] ' read through data array
For Z = 1 to 8
IF CRC.Bit0 = 1 Then ' check bits
CRC = $A001 ^ (CRC >> 1)
Else
CRC = CRC >> 1
EndIF
Next Z
Next X
Return

The host is sending:
Tx:0F 03 00 00 00 04 45 27
and my code is returning:
Rx:0F 03 08 13 24 13 88 13 5B 00 01 38 6B
- the last 2 bytes should be the correct CRC but my host simulator is rejecting it.

FYI, the software Modbus host simulator I'm running is Modbus Poll from http://www.modbustools.com/
Nice tool!

Anyone been down this road before?

Kamikaze47
- 20th January 2010, 18:55
do you have the bytes in the correct order?

if not, try changing it to: FOR X=11 TO 0 STEP -1

Darrel Taylor
- 20th January 2010, 20:34
There are only 11 bytes in the packet.
Change it to ...

For X = 0 to 10

Then you should get $0FD2 for the CRC.
<br>

tekart
- 20th January 2010, 21:02
I changed the loop to 10 and got a CRC of 0F D2,
but the Modbus Poll simulator still shows a CRC error.

I am processing the bytes in the CRC calculation code in the same order that I am transmitting them - seem reasonable to me.

Darrel Taylor
- 20th January 2010, 21:07
According to this page ...
http://www.lammertbies.nl/comm/info/crc-calculation.html

0FD2 is the correct CRC for CRC-16 (Modbus) using [0F 03 08 13 24 13 88 13 5B 00 01].
enterd as hex.

Could the simulator be using a different CRC polynomial?
<br>

Darrel Taylor
- 20th January 2010, 21:12
Also,

If I enter [0F 03 00 00 00 04] as sent from the host above, it shows 0x2745 for the CRC, which is the same thing the host sent.

So that has to be the right algorithm.
<br>

tekart
- 20th January 2010, 21:23
FYI - here's a screen shot of my Modbus Poll simulator screen and setup:

http://www.arttec.net/ModBusPoll-screenshot.jpg

Hope the image shows OK

tekart
- 20th January 2010, 21:24
Also,

If I enter [0F 03 00 00 00 04] as sent from the host above, it shows 0x2745 for the CRC, which is the same thing the host sent.

So that has to be the right algorithm.
<br>


So maybe it's my data formatting - or something???

tekart
- 20th January 2010, 21:34
Also,

If I enter [0F 03 00 00 00 04] as sent from the host above, it shows 0x2745 for the CRC, which is the same thing the host sent.

So that has to be the right algorithm.
<br>

Hey Darrel,
You gave me the final clue - it was a byte order issue I needed to reply with the bytes reversed: D2 0F. Your result above clued me in!

Thanks much - see screen shot showing no errors.

Guy

Darrel Taylor
- 20th January 2010, 22:42
He He,

You gotta watch out for those "Little Endians" ...
They'll shoot you in the butt with an arrow if your not looking. :D

Glad I could help,