CRC 16 modbus

Forum poświęcone programowaniu w Javie

CRC 16 modbus

Postprzez werbe » 16 lut 2012, o 18:42

Witam,

Czy ktoś mógłby mi pomóc i wskazać błąd. Poniżej przedstawi=
am dwie
alternatywne metody liczące CRC 16 dla modbus: getCRC i getCRC_2.
Ogólnie wartości CRC przez nie zwracana są OK, np: dla 0103044C005641
dostaje 1333, dla 0103075C0002 dostaje 056D i są to wartości
prawidłowe.
Ale przykładowo dla 0103043E947AC0 dostaje w getCRC 2BF7, w getCRC_2
94B7 i nie są to wartości prawidłowe bo powinienem dostać: 9507.

public static byte[] getCRC(byte[] values) {
int crc =3D 0x0ffff;
byte lastbit;

for (int i =3D 0; i < values.length; i++) {
byte thisbyte =3D values[i];
crc =3D crc ^ thisbyte;
for (int shift =3D 1; shift <=3D 8; shift++) {
lastbit =3D (byte)(crc & 0x0001);
crc =3D (crc >>1) & 0x07fff;

if (lastbit =3D=3D 1) {
crc =3D crc ^ 0x0A001;
}
}
}

byte[] CRC =3D new byte[2];
CRC[0] =3D (byte) (crc & 0xff);
CRC[1] =3D (byte) ((crc >>8) & 0xff);


return CRC;
}


public static byte[] getCRC_2(byte[] values) {
int crc;

crc =3D 0x0FFFF;
for (int i =3D 0; i < values.length; i++) {
crc =3D crc ^ values[i];

for (int n =3D 0; n < 8; n++) {
if ((crc & 0x01) !=3D 0)
crc =3D (crc >>1) ^ 0x0A001;
else
crc =3D crc >>1;
}
}

byte[] CRC =3D new byte[2];
CRC[0] =3D (byte) (crc & 0x0ff);
CRC[1] =3D (byte) ((crc >>8) & 0x0ff);

return CRC;
}

Co jest nie tak? Z góry wielkie dzięki za pomoc.

Pozdrawiam
Kamil
werbe
 
Posty: 2
Dołączył(a): 14 cze 2012, o 19:22

Re: CRC 16 modbus

Postprzez sebastianbiay » 16 lut 2012, o 18:51

On 2012-02-16 19:42, werbe wrote:
[ciach]


Sprawdź tą (za jakośc kodu nie odpowiadam ;):

int crc( String _bytes )
{
int crcresult=0xffff;
int size=_bytes.length();
int i=0,j;
while(0!=size--)
{
crcresult^=(int) _bytes.charAt(i++);
for(j=0;j<8;j++) {
if((crcresult&1)==1) {
crcresult=(crcresult>>1)^0xa001;
} else crcresult>>=1;
}
}
return crcresult&0xffff;
}
sebastianbiay
 
Posty: 432
Dołączył(a): 14 cze 2012, o 11:34

Re: CRC 16 modbus

Postprzez bogusawszczepanowski » 16 lut 2012, o 20:52

Dnia 16-02-2012 o 19:42:25 werbe <kamil.sobczyk@gmail.com>napisa=C5ł(=
a):

Witam,

Czy kto=C5ś m=C3łg=C5łby mi pom=C3łc i wskazańć b=C5łń=

ąd. Poni=C5źej przedstawiam dwie
alternatywne metody liczńące CRC 16 dla modbus: getCRC i getCRC_2.=


Og=C3łlnie warto=C5ści CRC przez nie zwracana sńą OK, np: dla =

0103044C005641
dostaje 1333, dla 0103075C0002 dostaje 056D i sńą to warto=C5ści=


prawid=C5łowe.
Ale przyk=C5ładowo dla 0103043E947AC0 dostaje w getCRC 2BF7, w getCR=

C_2
94B7 i nie sńą to warto=C5ści prawid=C5łowe bo powinienem dost=

ańć: 9507.

Zmienne w Javie sńą signed.

private static int makeUnsigned(byte b)
{
return b < 0 ? b + 256 : b;
}

public static byte[] getCRC_2(byte[] values)
{
int crc =3D 0x0FFFF;
for (int i =3D 0; i < values.length; i++) {
int val =3D makeUnsigned(values[i]);
crc =3D (crc ^ val);

for (int n =3D 0; n < 8; n++) {
boolean lastbit =3D (crc & 0x01) !=3D 0;
crc =3D (crc >>1);
if (lastbit) {
crc =3D (crc ^ 0x0A001);
}
}
}

byte[] CRC =3D new byte[2];
CRC[0] =3D (byte)(crc & 0x0ff);
CRC[1] =3D (byte)((crc >>8) & 0x0ff);

return CRC;
}


-- =

Bogu=C5ś
bogusawszczepanowski
 
Posty: 11
Dołączył(a): 14 cze 2012, o 13:01

Re: CRC 16 modbus

Postprzez werbe » 16 lut 2012, o 21:34

On 16 Lut, 21:52, Bogusław Szczepanowski <no...@invalid.net>wrote:
Dnia 16-02-2012 o 19:42:25 werbe <kamil.sobc...@gmail.com>napisał(a):

Witam,


Czy ktoś mógłby mi pomóc i wskazać błąd. Poniżej przeds=

tawiam dwie
>alternatywne metody liczące CRC 16 dla modbus: getCRC i getCRC_2.
Ogólnie wartości CRC przez nie zwracana są OK, np: dla 0103044C00=

5641
>dostaje 1333, dla 0103075C0002 dostaje 056D i są to wartości
prawidłowe.
Ale przykładowo dla 0103043E947AC0 dostaje w getCRC 2BF7, w getCRC_2
94B7 i nie są to wartości prawidłowe bo powinienem dostać: 9507=

.
Zmienne w Javie są signed.

=A0 =A0 =A0private static int makeUnsigned(byte b)
=A0 =A0 =A0{
=A0 =A0 =A0 =A0 =A0return b < 0 ? b + 256 : b;
=A0 =A0 =A0}

=A0 =A0 =A0public static byte[] getCRC_2(byte[] values)
=A0 =A0 =A0{
=A0 =A0 =A0 =A0 =A0int crc =3D 0x0FFFF;
=A0 =A0 =A0 =A0 =A0for (int i =3D 0; i < values.length; i++) {
=A0 =A0 =A0 =A0 =A0 =A0 =A0int val =3D makeUnsigned(values[i]);
=A0 =A0 =A0 =A0 =A0 =A0 =A0crc =3D (crc ^ val);

=A0 =A0 =A0 =A0 =A0 =A0 =A0for (int n =3D 0; n < 8; n++) {
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0boolean lastbit =3D (crc & 0x01) !=3D =

0;
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0crc =3D (crc >>1);
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0if (lastbit) {
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0crc =3D (crc =A0^ 0x0A001);
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0}
=A0 =A0 =A0 =A0 =A0 =A0 =A0}
=A0 =A0 =A0 =A0 =A0}

=A0 =A0 =A0 =A0 =A0byte[] CRC =3D new byte[2];
=A0 =A0 =A0 =A0 =A0CRC[0] =3D (byte)(crc & 0x0ff);
=A0 =A0 =A0 =A0 =A0CRC[1] =3D (byte)((crc >>8) & 0x0ff);

=A0 =A0 =A0 =A0 =A0return CRC;
=A0 =A0 =A0}

--
Boguś


No fakt! Jak miałem w values same dodatnie wartości to wszystko
działało. Jak pojawiła się jakaś ujemna wartość to się wszy=
stko
chrzaniło.

WIELKIE dzięki za pomoc!

Kamil
werbe
 
Posty: 2
Dołączył(a): 14 cze 2012, o 19:22


Powrót do Java

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 0 gości

cron