vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Zippen wie die Profis!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2025
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

Allgemeine Diskussionen
Re: CRC 
Autor: Wöllmi
Datum: 19.11.02 07:22

Hi,

wie schon geschrieben. Es gibt verschiedene Vorschriften um CRC's zu bilden.

Folgendes Bsp. Berechnet die CRC16 für das MODBUS Protokol aus einem ASCII
Befehlskommando für den RTU Mode. (Also eine ganz spezielle Vorgabe)
Dabei ist nicht nur der Algorithmus sondern auch die Folge der Byts für die CRC16
Ausgabe zu beachten HighByte und LowByte.

Es gibt wohl eine ganz schöne Menge derartiger Vorschriften. Man sollte also immer
herausfinden was z.B. der Kommunikationspartner vorschreibt.

Für VB sind solche Routinen schon eine kleine Herausforderung (Rechenzeit).
Schöne Anwendung für echte DLL's

Function fkt_sGetCRC16b(sCmdBasis As String) As String
         '
         '----------------------------------------------------------------
          'Datum: 13.06.2002
         '----------------------------------------------------------------
         '
         'Berechnung der CRC16
         'test: sCmdBasis "020100130025" = 02h 01h 00h 13h 00h 25h => 270Ch 
         ' => 0C 27
         'test: sCmdBasis "020105CD6BB20E1B" = 02h 01h 05h CDh 6Bh B2h 0Eh 1Bh 
         ' => FF04h => 04 FF
         '
         Dim lngCRC16 As Long      ' Ergebnispuffer
         Dim iIdx2 As Integer      ' Laufvariable Kommandozähler
         Dim iIdx1 As Integer      ' Laufvariable BitShiftRight
         Dim bPNXor As Boolean     ' Identifikation 0/1 an LSB vor dem Shiften
         Dim lngCmdSel As Long     ' separiertes Kommado für Durchlauf
         Dim lngCRCSel As Long     ' separierter Anteil des Zwischenergebnisses 
         ' für Durchlauf
 
         'Variable zur Identifikation 0/1 Bit vorbelegen
         bPNXor = False
 
         '1. Ergebniswert vorbelegen
         lngCRC16 = &HFFFF
 
         '6. Für alle CMD Bytes die Prozedur wiederholen
         '   2 Stellen sind ein Kommandozeichen im Kommandostring!
         For iIdx2 = 0 To Len(sCmdBasis) / 2 - 1
             'akt. Kommando selektieren
             lngCmdSel = CLng("&h" & Mid(sCmdBasis, iIdx2 * 2 + 1, 2))
             lngCRCSel = lngCRC16 And &HFF
             '2. XOR
             lngCRC16 = (lngCRC16 And &HFF00) Or (lngCRCSel Xor lngCmdSel)
             'Wortkorrektur
             lngCRC16 = lngCRC16 And &HFFFF&
 
             '8 * Bitweise nach Rechts schieben!
             For iIdx1 = 0 To 7
                 'Wortkorrektur
                 lngCRC16 = lngCRC16 And &HFFFF&
                 '3. Bittest LSB
                 If (lngCRC16 And &H1&) = &H1 Then
                    bPNXor = True
                 Else
                    bPNXor = False
                 End If
                 '4. SHR 1
                 lngCRC16 = fkt_lngShiftRight32(lngCRC16, 1) And &H7FFF&
                 '5. Korrektur
                 If bPNXor Then
                    lngCRC16 = lngCRC16 Xor &HA001&
                 End If
             Next iIdx1  'nächstes Bit
         Next iIdx2 'nächstes Kommando
 
         'Ergebis umformen
         fkt_sGetCRC16b = fkt_sFillString(Hex(lngCRC16), "0", 4, True)
End Function
Function fkt_lngShiftRight32(ByVal value As Long, ByVal Shift As Long) As Long
         '
         '----------------------------------------------------------------
         'Datum: 13.06.2002
         'Quelle: www.vbcode.com
         '----------------------------------------------------------------
         '
         'Schiebeoperation um 1 Bit nach rechts  (Für Long-Werte)
         '
         Select Case Shift
               Case 0&:  fkt_lngShiftRight32 = value
               Case 1&:  fkt_lngShiftRight32 = (value And &HFFFFFFFE) \ &H2&
               Case 2&:  fkt_lngShiftRight32 = (value And &HFFFFFFFC) \ &H4&
               Case 3&:  fkt_lngShiftRight32 = (value And &HFFFFFFF8) \ &H8&
               Case 4&:  fkt_lngShiftRight32 = (value And &HFFFFFFF0) \ &H10&
               Case 5&:  fkt_lngShiftRight32 = (value And &HFFFFFFE0) \ &H20&
               Case 6&:  fkt_lngShiftRight32 = (value And &HFFFFFFC0) \ &H40&
               Case 7&:  fkt_lngShiftRight32 = (value And &HFFFFFF80) \ &H80&
               Case 8&:  fkt_lngShiftRight32 = (value And &HFFFFFF00) \ &H100&
               Case 9&:  fkt_lngShiftRight32 = (value And &HFFFFFE00) \ &H200&
               Case 10&: fkt_lngShiftRight32 = (value And &HFFFFFC00) \ &H400&
               Case 11&: fkt_lngShiftRight32 = (value And &HFFFFF800) \ &H800&
               Case 12&: fkt_lngShiftRight32 = (value And &HFFFFF000) \ &H1000&
               Case 13&: fkt_lngShiftRight32 = (value And &HFFFFE000) \ &H2000&
               Case 14&: fkt_lngShiftRight32 = (value And &HFFFFC000) \ &H4000&
               Case 15&: fkt_lngShiftRight32 = (value And &HFFFF8000) \ &H8000&
               Case 16&: fkt_lngShiftRight32 = (value And &HFFFF0000) \ &H10000
               Case 17&: fkt_lngShiftRight32 = (value And &HFFFE0000) \ &H20000
               Case 18&: fkt_lngShiftRight32 = (value And &HFFFC0000) \ &H40000
               Case 19&: fkt_lngShiftRight32 = (value And &HFFF80000) \ &H80000
               Case 20&: fkt_lngShiftRight32 = (value And &HFFF00000) \ &H100000
               Case 21&: fkt_lngShiftRight32 = (value And &HFFE00000) \ &H200000
               Case 22&: fkt_lngShiftRight32 = (value And &HFFC00000) \ &H400000
               Case 23&: fkt_lngShiftRight32 = (value And &HFF800000) \ &H800000
               Case 24&: fkt_lngShiftRight32 = (value And &HFF000000) \ _
                 &H1000000
               Case 25&: fkt_lngShiftRight32 = (value And &HFE000000) \ _
               &H2000000
               Case 26&: fkt_lngShiftRight32 = (value And &HFC000000) \ _
               &H4000000
               Case 27&: fkt_lngShiftRight32 = (value And &HF8000000) \ _
               &H8000000
               Case 28&: fkt_lngShiftRight32 = (value And &HF0000000) \ _
               &H10000000
               Case 29&: fkt_lngShiftRight32 = (value And &HE0000000) \ _
               &H20000000
               Case 30&: fkt_lngShiftRight32 = (value And &HC0000000) \ _
               &H40000000
               Case 31&: fkt_lngShiftRight32 = CBool(value And &H80000000)
         End Select
End Function
Soll lediglich als Bsp. dienen, wird von mir erfolgreich eingesetzt

Tschaui
Woellmi

alle Nachrichten anzeigenGesamtübersicht  |  Zum Thema  |  Suchen

 ThemaViews  AutorDatum
CRC1.590Methos18.11.02 14:17
Re: CRC1.302David M18.11.02 14:35
Re: CRC1.306dbayer18.11.02 14:40
Re: CRC1.380Wöllmi19.11.02 07:22
Re: CRC1.346E719.11.02 18:30
Re: CRC1.491unbekannt19.11.02 19:52
Re: CRC1.305E720.11.02 17:44
Re: CRC1.309dbayer19.11.02 20:10
Re: CRC1.325Methos20.11.02 09:53
Re: CRC1.455Wöllmi20.11.02 21:43
Wenn es jemanden interessiert, so macht es VBEx32.DLL ....1.375unbekannt20.11.02 22:01
Re: CRC1.283Methos21.11.02 07:29

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2025 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel