Beckhoff KL6031 Volkszähler eHZ auslesen

upupa_epops

Level-1
Beiträge
3
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen!
Ich durchstöbere seit geraumer Zeit dieses Forum im Speziellen und das Internet im Allgemeinen. Beiträge gab es bereits einige, aber eine Lösung habe ich jedoch nicht gefunden ... .
Gerne möchte ich einen Smartmeter mittels IR Lesekopf auslesen. Meine Hardware besteht aus einer Beckhoff Steuerung (CX9020), einer Klemme KL6031 und einem Lesekopf "Volkszähler".

Ich spreche die Klemme über "SerialLineControl" an
1723798084701.png
und die Klemme lebt:
1723797581012.png

Nun gilt es, die Daten zu ermitteln (Über "ReveiveData"?). Und hier fangen meine Probleme an. Da ich an dieser Stelle nicht einmal Halbwissen habe, bräuchte ich Unterstützung rund um "Präfix", "Suffix" "Pointer to ...". Was trägt man für die Fragezeichen ein?

1723798258716.png

Zunächst würden mir die folgende Werte reichen (Siehe "Iskra_MT681_Protokoll_Register"):
1.8.0 Positive Gesamtwirkenergie (A+)
2.8.0 Negative Gesamtwirkenergie (A-)
16.7.0 Aktuelle Momentanwirkleistung (P)

Für eine Erklärung und einen funktionierenden Lösungsansatz wäre ich sehr, sehr dankbar! Viele Grüße, Jörg
 

Anhänge

Wo kommt der fbReceiveData her? Ist das ein genereller Kommunikationsbaustein von Beckhoff? Dann ist mit Präfix vermutlich ein eindeutiges Startzeichen des Empfangsdatensatz gemeint und mit Suffix das entsprechende Endezeichen (bei beidem natürlich auch mehrere Zeichen möglich).

Der Prefix wäre einfach, eine Variable anlegen:
PrefixVar: Array[1..8] OF BYTE;

Im Codeteil Werte beschreiben:
PrefixVar[1] := 16#1b;
PrefixVar[2] := 16#1b;
PrefixVar[3] := 16#1b;
PrefixVar[4] := 16#1b;
PrefixVar[5] := 16#01;
PrefixVar[6] := 16#01;
PrefixVar[7] := 16#01;
PrefixVar[8] := 16#01;

bei pPrefix kommet dann ADR(PrefixVar) drauf,
bei LenPrefix dann die 8.

Der Suffix wird schwieriger weil am Ende das CRC übetragen wird.

Möglicherweise funktioniert es irgendwie mit 1b,1b,1b,1b,1a


Ich weiß nicht, ob du mit den 22 Bytes pro Zyklus von der Klemme zur CPU hin kommst, bei den Zählern kann man oft zwischen reduziertem Datensatz und komplexerem wählen. Bei reduziertem gibt es dann weniger Daten und auch Kommastellen fallen dann gerne weg. Bei dem komplexeren Datensatz kommen viele Bytes zusammen, die dann in der 22 Byte Stückelung von der Klemme zur CPU gebracht werden wollen.
Mein Zahler liefert da knapp 500 Bytes auf einmal, da bräuchtest du schon mal 23 Zyklen bis die übertragen sind.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Oberschefe!
Vielen Dank für dein Feedback! Zur Klemme: Ich denke, die Konfiguration ist korrekt (Siehe Anhang). Es werden mir zyklisch Werte angezeigt.
Und tatsächlich: Die Sache mit dem Suffix ist verzwickt. Im Array würde ich jetzt jede Menge Werte erwarten. Allerdings sind nur die ersten beiden Elemente beschrieben: Das erste ist immer der letzte Wert eines Zyklus. Der zweite Wert ist konstant 57.

Mein aktueller Code sieht nun so aus:

PROGRAM Lesekopf
VAR
fbKL6Control : SerialLineControl;
bError_COM : BOOL;
udErrorId_COM : UDINT;

fbReceiveData : ReceiveData;
bReset : BOOL;
bDataReceived : BOOL;
bBusy : BOOL;
bError : Tc2_SerialCom.ComError_t;
bRxTimeout : BOOL;
udLenReceiveData : UDINT;

bNewDataReceived : BOOL;

// arrPrefix : ARRAY[0..7] OF BYTE := [16#1B, 16#1B, 16#1B, 16#1B, 16#01, 16#01, 16#01, 16#01];
arrPrefix : ARRAY[0..7] OF BYTE;
// arrSuffix : ARRAY[0..5] OF BYTE := [16#C9, 16#C9, 16#C9, 16#C9, 16#CB, 16#FF];
arrSuffix : ARRAY[0..5] OF BYTE;
arrReceiveData : ARRAY[0..600] OF BYTE := [256(0)];
END_VAR

===================================

fbKL6Control(
Mode := SERIALLINEMODE_KL6_22B_STANDARD,
pComIn := ADR(KL6031_In),
pComOut := ADR(KL6031_Out),
SizeComIn := SIZEOF(KL6031_In),
TxBuffer := TxBuffer,
RxBuffer := RxBuffer,
Error => bError_COM,
ErrorID => udErrorId_COM);

arrPrefix[0] := 16#1B;
arrPrefix[1] := 16#1B;
arrPrefix[2] := 16#1B;
arrPrefix[3] := 16#1B;
arrPrefix[4] := 16#01;
arrPrefix[5] := 16#01;
arrPrefix[6] := 16#01;
arrPrefix[7] := 16#01;

arrSuffix[0] := 16#C9; // entspricht 201 <= Sind diese Einträge logisch (Vergleiche Screenshot "Daten")?
arrSuffix[1] := 16#C9; // entspricht 201
arrSuffix[2] := 16#C9; // entspricht 201
arrSuffix[3] := 16#C9; // entspricht 201
arrSuffix[4] := 16#CB; // entspricht 203
arrSuffix[5] := 16#FF; // entspricht 255

fbReceiveData(
pPrefix := ADR(arrPrefix),
LenPrefix := 8,
pSuffix := ADR(arrSuffix),
LenSuffix := 6,
pReceiveData := ADR(arrReceiveData),
SizeReceiveData := SIZEOF(arrReceiveData),
Timeout := T#1S,
Reset := bReset,
RXbuffer := RxBuffer,
DataReceived => bDataReceived,
busy => bBusy,
Error => bError,
RxTimeout => bRxTimeout,
LenReceiveData => udLenReceiveData);

bNewDataReceived := FALSE;

// Daten aufbereiten, wenn empfangen
IF fbReceiveData.DataReceived THEN
bNewDataReceived := TRUE;
END_IF

// Auswertung
// .......

Die nächsten 3 Wochen werde ich nicht online sein! Viele Grüße!
 

Anhänge

  • KL6031 01.jpg
    KL6031 01.jpg
    99,5 KB · Aufrufe: 8
  • KL6031 02.jpg
    KL6031 02.jpg
    117,4 KB · Aufrufe: 8
  • Daten.jpg
    Daten.jpg
    80,4 KB · Aufrufe: 8
Du bekommst normalerweise weit mehr als die 22 Bytes an Daten. Aber das sollte die Aufgabe des ersten FBs sein, diese Zyklus für Zyklus von der Klemme entgegenzunehmen und in den Puffer zu übertragen.
 
Juchu! Es funktioniert.
Der Fehler lag ganz, ganz vorne: Der IR Lesekopf gibt TTL aus und ich musste nur einen Pegelwandler von TTL nach RS232 zwischenschalten.
Die Interpretation des SML- Protokolls war dann reine Fleißarbeit.
 
Zurück
Oben