Vai al contenuto
PLC Forum


Comunicazione Rs485 Con Inverter Aurora Da Plc Wago (Codesys) - Calcolo Crc


Supertony

Messaggi consigliati

Buongiorno,

sto scrivendo un datalogger su un plc Codesys; ho già comunicato con l'inverter (un PVI3) spedendo 10 bytes di comando (02 4E 05 00 00 00 00 00 BC DD) e ottenendo i corretti 8 bytes di risposta, i 2 dati di CRC che avevo inviato (BC e DD) erano però già "pronti" da un esempio trovato in Internet.

Come si esegue il calcolo del CRC? ho provato a seguire l'indicazione presente nell'ultima pagina della documentazione che descrive il protocollo, tuttavia il CRC che ottengo non corrisponde a quello (corretto) dell'esempio. Qualcuno ha qualche ulteriore informazione?

Questo è quanto viene descritto:




The algorithm to compute the checksum to validate the RS485 transmission is the CRC polynomial

standardized by CCITT:

Bn=N^16+N^12+N^5+Bn-1

Where N^16 means that N is elevated to the sixteenth power of 2 (i.e. it is shifted left of 16 bit)

and where the symbol ‘+’ represents the XOR bit by bit.

Practically, if New is the byte to process , Tmp is a swap byte and BccLo and BccHi are the low

and high parts of the validation word, the following algorithm must be followed:[/size][/font]


B. For each byte to transmit or receive repeat the following steps:

1. New = New XOR BccLo

2. Tmp=New << 4

3. New=Tmp XOR New

4. Tmp=New >> 5

5. BccLo=BccHi

6. BccHi= New XOR Tmp

7. Tmp= New << 3

8. BccLo= BccLo XOR Tmp

9. Tmp= New >> 4

10. BccLo= BccLo Xor Tmp[/size][/font]


C. Negate bit by bit BccLo e BccHi : CRC_L=~BccLo CRC_H=~BccHi[/size][/font]


Modificato: da Supertony
Link al commento
Condividi su altri siti

  • 9 years later...

Buongiorno, rispondo a questo vecchio post non sapendo se è stata da te trovata la soluzione. Io mi sono imbattuto nella stessa problematica, ho risolto con successo.

Ti lascio la mia funzione in VB.net che restituisce il due byte contenenti CRC per inverter AURORA. 

 

    Private Function CRCaurora(data As Byte(), offset As Integer, count As Integer) As Byte()
        Dim BccLo As Byte = &HFF
        Dim BccHi As Byte = &HFF
        Dim Nuovo, Temp As Byte

        For i As Integer = offset To (offset + count - 1)
            Nuovo = data(i + offset) Xor BccLo
            Temp = Nuovo << 4
            Nuovo = Temp Xor Nuovo
            Temp = Nuovo >> 5
            BccLo = BccHi
            BccHi = Nuovo Xor Temp
            Temp = Nuovo << 3
            BccLo = BccLo Xor Temp
            Temp = Nuovo >> 4
            BccLo = BccLo Xor Temp
        Next

        Return New Byte(1) {Not (BccLo), Not (BccHi)}

    End Function

spero possa aiutarti o aiutare a chi ne avesse bisogno.

 

Link al commento
Condividi su altri siti

  • Livio Orsini locked this discussione
Ospite
Questa discussione è chiusa alle risposte.
×
×
  • Crea nuovo/a...