ich weiß nicht, ob das noch aktuell ist. Probier' mal das:
Funktion mit dem Namen fcVaillantChecksum erstellen, Rückgabewert BYTE.
Deklarationsteil:
Code:
FUNCTION fcVaillantChecksum : BYTE VAR_INPUT pab:POINTER TO BYTE; END_VAR VAR iNrBytes:INT; diAdr:POINTER TO BYTE; i:INT; END_VAR
Code:
fcVaillantChecksum := 0; iNrBytes :=BYTE_TO_INT(pab^)-1; FOR i:=0 TO iNrBytes -1 DO IF (fcVaillantChecksum AND 16#80) = 16#80 THEN fcVaillantChecksum:=SHL(fcVaillantChecksum,1) OR 1; fcVaillantChecksum:=fcVaillantChecksum XOR 16#18; ELSE fcVaillantChecksum:=SHL(fcVaillantChecksum,1); END_IF; diAdr:=pab; diAdr := diAdr +INT_TO_DINT(i); fcVaillantChecksum:=fcVaillantChecksum XOR diAdr^; END_FOR
Die Anforderung muss in einem Array of Byte stehen, gefüllt mit allem bis auf CRC. Die Funktion bekommt die Adresse des ersten Bytes des Arrays übergeben und liefert dann das CRC:
Code:
abSend[X]:=fcVaillantChecksum(ADR(abSend[0]));


Einen Kommentar schreiben: