Elsner Wetterstation an KL 6021

master

Level-1
Beiträge
74
Reaktionspunkte
4
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

versuche die Daten von einer Elsner Wetterstation P02 über RS485 und die KL6021 in einen CX9010 zu bekommen.
Habe es nun soweit geschaft, daß zumindestens Daten reinkommen. Verwende zur Kommunikation mit der Klemme den Baustein "SerialLineControl" aus der Bekhoff Com Lib im 1ms Task.
Dieser händelt dann die Daten über einen ComBuffer an den Baustein "ReceiveData", der in einem 10ms Task läuft.
Über den pPrefix Eingang gebe ich im das Startzeichen vor und der Baustein legt die 40Byte dann in einem Array ab.
Das Stratzeichen (Byte1) sowie das Vorzeichen (Byte2) für die AT werden gefunden, aber die restlichen Bytes sind teilweise um 1 oder 2 Bytes verschoben.
Welche Bausteine verwendet Ihr zur Auswertung der 40Bytes?
Wie kann man eine Kontrolle der Quersumme der 40Byte Daten Programmtechnisch durchführen?

Hat jemand eine Elsner P02 an einem Beckhoff CX hängen?
Für den Wago 750/841 gibts ja die Bausteine mit denen es Funktioniert.

Gruß
Markus
 
Hallo Master

Ich verwende den Baustein "ReceiveData" ohne Prefix und ohne Suffix.

Das Problem ist, dass Du von Elsener die Werte als ASCII - Wert bekommst und die zuerst in eine Dezimalzahl umrechnen musst.

Die Daten lese ich folgendermassen aus:

IF byDaten[1] = 87 THEN
pruefsummeGerechnet := 0;
FOR zaehler:=1 TO 35 DO
pruefsummeGerechnet := pruefsummeGerechnet + byDaten[zaehler];
END_FOR;
pruefsumeEmpfangen := 0;
pruefsumeEmpfangen := byDaten[39]-48;
pruefsumeEmpfangen := pruefsumeEmpfangen + ((byDaten[38]-48 )*10);
pruefsumeEmpfangen := pruefsumeEmpfangen + ((byDaten[37]-48 )*100);
pruefsumeEmpfangen := pruefsumeEmpfangen + ((byDaten[36]-48 ) *1000);

(* Überprüfung der Checksummen *)
IF pruefsummeGerechnet <> pruefsumeEmpfangen THEN
bError := TRUE; (* Prüfsumme falsch *)
ELSE
bError := FALSE; (* Prüfsumme falsch *)
END_IF


(* Aussentemperatur *)
rAussentemperatur := 0;
IF byDaten[6] > 0 THEN (* zehntel *)
rAussentemperatur := byDaten[6] -48;
rAussentemperatur := rAussentemperatur / 10;
END_IF

IF byDaten[4] > 0 THEN (* einer *)
rAussentemperatur := rAussentemperatur + (byDaten[4] -48);
END_IF

IF byDaten[3] > 0 THEN (*zehner *)
rAussentemperatur := rAussentemperatur + ((byDaten[3] -48) *10);
END_IF

(* Ist die Temperatur nich im Plusbereich muss das ganze noch mit -1 multipliziert werden *)
IF byDaten[2] <> 43 THEN
rAussentemperatur := rAussentemperatur * -1;
END_IF


Gruss

Samba
 
Zurück
Oben