Supertony Inserito: 3 maggio 2013 Segnala Share Inserito: 3 maggio 2013 (modificato) 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: 3 maggio 2013 da Supertony Link al commento Condividi su altri siti More sharing options...
l.zuccarini Inserita: 1 settembre 2022 Segnala Share Inserita: 1 settembre 2022 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 More sharing options...
Livio Orsini Inserita: 1 settembre 2022 Segnala Share Inserita: 1 settembre 2022 Buona iniziativa, però meglio chiudere questa vecchia discussione per evitare eventualia ccodamenti. Link al commento Condividi su altri siti More sharing options...
Messaggi consigliati