Einzelnen Beitrag anzeigen

SvB

Registriert seit: 21. Okt 2004
Ort: Eckenroth
426 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#9

Re: BDV001 Protokoll und CheckSum

  Alt 18. Jan 2008, 14:15
Alles OK. Es funktioniert jetzt auch in meiner Anwendung.

Ganz so einfach ist das ganze dann aber doch nicht, das Protokoll (von 1984 glaube ich) doch etwas umständlich ist. Heute würde ich das etwas anders machen.

Hier mal der Code, mit dem ich das gesamte "DataFile" für Filetype 11 zusammenbaue.

Delphi-Quellcode:
procedure EncodeBDVMoney(Value: Real);
var
  cDigits: String;
  lData: array[0..7] of Byte;
  n: Byte;
  CheckSum: Byte;
begin
  // Hier wird der Preis als 5 Digits übergeben
  FMessageList := FMessageList + AcceptBlockChar; //3Dh

  lData[0] := 129; // 1000 0001 - Low Nibble 0001 = Receiving Pripheral ident, 001 = VMC
                       // - High Nibble 1000 = Transmitting Pripheral ident, 1000 = Master
  lData[1] := 10; // 0000 1010 - Datafile length in Bytes
  lData[2] := 11; // 0000 1011 - Filetype Identification Number = Filetype 11

  // Wenn z.B. 20 Cent (€ 0,20) eingeworfen sind, dann soll das herauskommen 00020
  cDigits := StrRight( '00000' + IntToStr(Round(Value * 100)), 5);

  lData[3] := (StrToInt(cDigits[4]) shl 4) or StrToInt(cDigits[5]); // Digit 2 + Digit 1
  lData[4] := (StrToInt(cDigits[2]) shl 4) or StrToInt(cDigits[3]); // Digit 4 + Digit 3

  // ExactChangeFlag + Dezimal Point Position
  if FExactChangeFlag then begin
    lData[5] := (11 shl 4) or StrToInt(cDigits[1]); // 11 = 1011 + Digit 5
  end else begin
    lData[5] := (3 shl 4) or StrToInt(cDigits[1]);; // 3 = 0011 + Digit 5
  end;

  // immer fest auf 5 Cent
  lData[6] := 5; // 0000 0101 Lowest Coin Real Currency Value BCD Digits 1 + 0
  lData[7] := 0; // 0000 0000 Lowest Coin Real Currency Value BCD Digits 3 + 2

  CheckSum := CalcChecksum(@lData[0], 8);

  // PID = Peripheral Identifier = $20
  for n := 0 to 7 do begin
    FMessageList := FMessageList + chr( PID + (lData[n] and 15)); // + Low Nibble - Fh
    FMessageList := FMessageList + chr( PID + ((lData[n] and 240) shr 4)); // + High Nibble - F0f
  end;

  FMessageList := FMessageList + chr(PID + (CheckSum and 15));
  FMessageList := FMessageList + chr(PID + 0);
  FMessageList := FMessageList + chr(PID + 0);
  FMessageList := FMessageList + chr(PID + ((CheckSum and 240) shr 4));

  FMessageList := FMessageList + DataSyncChar; //39h
end;
Nochmals vielen Dank an Dich Muetze1. Ich habe zwar Deine Funktion noch nicht ganz verstanden, aber das versuche ich noch mal, wenn ich etwas klarer im Kopf bin. Heute mache ich da jetzt nichts mehr dran, am Montag geht es damit weiter.

Grüße
Sven
  Mit Zitat antworten Zitat