EL3403-0010, alle Daten gleichzeitig?

Mattin81

Level-1
Beiträge
96
Reaktionspunkte
3
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

bei der EL3403 Leistungsmessklemme ist es ja möglich, wenn man in eine bestimmte Variable eine Zahl rein schreibt (0..5) dann bekommt man von der Klemme ja in der variant_value Variable den entsprechenden Wert zurück. Also zum Beispiel:

0 - Scheinleistung(VA)
1 - Blindleistung(VAR)
2 - Energie(kWh)
3 - cosPhi(°)
4 - Frequenz(Hz)
5 - Energie (-) (kWh)

so nun hängen ja alle Daten zu einem gewissen Zeitpunkt irgendwie zusammen. heißt, eine ms später kann ja die Scheinleistung schon eine andere sein.

Um es mal anders auszudrücken, ich finde es wichtig, dass alle Daten konsistent sind. Also die Spannung, Strom, Leistung usw. zu einen bestimmten Zeitpunkt gleichzeitig anzeigbar sind.

Ist das überhaupt möglich mit dieser Klemme oder kann ich die Daten nur nacheinander Abfragen?

Ich hoffe ihr habt mich verstanden und könnt mir vielleicht weiterhelfen :)

Vielen Dank schon mal und Gruß

Martin
 
Der Messzyklus dauert mindestens eine Periode. Also hast du nach dem Nulldurchgang-Toggle ca. 20ms um die konsistenten Werte der letzten Periode zu lesen.

Gruß,
witkatz
 
Nicht ganz so, die Werte sind keine Momentanwerte sondern werden aus dem Verlauf eines Messzyklus - also einer oder mehrerer Perioden errechnet. Nach jeder Periode stehen für 20ms die Werte des letzten Messzyklus an.
 
Okay. Das wäre ja nicht so kritisch, wenn ich denn in einem Messzyklus dann gleichzeitig auf alle Werte aus dem letzten Zyklus zugreifen könnte.

Aber das geht doch nicht oder? Da ich doch immer nur den eine Wert übergebe und dann einen anderen zurück bekomme. Ich kann ja nicht alle gleichzeitig abfragen, und mir in variablen abspeichern.

So dass ich sagen könnte: Alle werte des letzten Messzyklusses sind diese....
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du kannst nacheinander auf die Werte des letzten Zyklus zugreifen. Nach dem Nulldurchgang-Toggle startest du die Abfragerei und wenn du damit durch bist, hast du einen konsistenten Satz der Werte des letzten Messzyklus. Der Messzyklus beginnt beim Nulldurchgang und endet beim Nulldurchgang, die daraus errechneten Werte gehören zusammen.
 
Die Daten deiner Leistungsmessklemme werden zum beginn eines Zykluses in das Prozesseingangsabbild der SPS kopiert. Das ist einfach nur ein definierter Speicherbereich. Das heisst, alle Werte die während eines Zykluses in dein Programm einliest sind von stand des Zyklusanfangs. Damit ist die Konsistenz gewährt, weil Änderungen die während der Programmabarbeitung auftreten einfach ignoriert werden.
Wenn jetzt also die verschiedenen Parameter der Klemme ausließt sind sie alle vom gleichen Zeitpunkt (je nachdem wie die Klemme selber halt misst). Da ist es vollkommen egal ob du am Programmanfang die Wirkleistung ausließt und am Programmende die Scheinleistung.

Zyklusverlauf einer SPS

E - Klemmenwerte in das Prozesseingangsabbild kopieren
P - Programmcode ausführen
A - Variablenwerte aus Prozessausgangsabbild auf die Klemmen schreiben

[EE][PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP][AA]
 
Zuviel Werbung?
-> Hier kostenlos registrieren
verstehe grade nicht, was du mit Nulldurchgang-toggle meinst. sorry:confused:
Das ist in der Doku im Kapitel Grundlagen zur Fuktion beschrieben. Die Messung aller Größen findet netzsynchron statt. Eine 50Hz sinusförmige Wechselspannung hat 50 mal pro Sekunde einen positiven Nulldurgang. Diesen Nulldurchgang bekommst du in den Prozessdaten im Objekt 6000:10 TxPDO Toggle signalisiert, deswegen habe ich es Nulldurchgang-Toggle genannt.
 
Hi, irgendwie komm ich da immer noch nicht weiter. Ich häng immer noch ganz schön an der Leistungsklemme fest.

Also ich hab mir jetzt nen Funktionsblock geschrieben, in dem ich gerne die einzelnen Messwerte in ein Array schreiben möchte:

Code:
VAR_OUTPUT
L1:ARRAY[0..7]OF REAL;
END_VAR

FOR i :=2 TO 7 BY 1 DO
messgroesse1:=messgroesse1+1;
L1:=variant_value1;
END_FOR
IF i = 8 THEN
messgroesse1:=0;
END_IF
Ich möchte also die Messwerte in die Array-Bereiche 2-7 schreiben. Messgroesse ist der Wert, den ich ja an die Klemme schicken muss, variant_value ist der, den ich dann ja zurück bekomme.

Leider bekomme ich aber in die Array-Bereiche immer nur den Wert rein geschrieben, der bei Messgroesse 0 anliegt. Die anderen werden scheinen zu diesem Zeitpunkt auch still zu stehen (mit Einzelschritt überprüft).

Hoffe ihr habt mich verstanden und könnt mir da helfen.
Danke und Gruß Martin
 
Mit einer FOR-Schleife geht das nicht, weil die Schleife innerhalb eines SPS-Zyklus komplett abgearbeitet wird. Der Datenaustausch mit der Klemme findet aber nur einmal pro SPS-Zyklus statt - das hat MasterOhh schön beschrieben. In einem SPS-Zyklus kannst du eine Messgröße anwählen - im nächsten SPS-Zyklus auswerten und die nächste anwählen usw. Die Werte werden in einer Schrittkette ausgelesen, in ST eignet sich eine CASE Anweisung dazu.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich versteh grad gar nix mehr. MasterOhh hat doch geschrieben, dass die Daten ALLE am Anfang des Zyklus in das Prozessabbild geschrieben werden und ich sie dann auch innerhalb eines Zyklus abfragen kann. Er hat ja gesagt, wann ich das im programm mache ist vollkommen egal. Und die Daten sind dann konsistent aus dem Zyklus.


Also quasi so hab ich einen Funktionsblock:

Code:
CASE messgroesse1 OF
0: L1[2]:=variant_value1;    
1: L1[3]:=variant_value1;    
2: L1[4]:=variant_value1;    
3: L1[5]:=variant_value1;    
4: L1[6]:=variant_value1;    
5: L1[7]:=variant_value1;
END_CASE;
und im main:

Code:
        Leistungsmessung(L1=> , L2=> , L3=> );
        messgroesse1:=messgroesse1+1;
        Leistungsmessung(L1=> , L2=> , L3=> );
        messgroesse1:=messgroesse1+1;
        Leistungsmessung(L1=> , L2=> , L3=> );
        messgroesse1:=messgroesse1+1;
        Leistungsmessung(L1=> , L2=> , L3=> );
        messgroesse1:=messgroesse1+1;
        Leistungsmessung(L1=> , L2=> , L3=> );
        messgroesse1:=messgroesse1+1;
;
Dann schreibt er aber wieder 5 mal den gleichen Wert ins Array...
 
Zuletzt bearbeitet:
So wie ich das sehe scheint es hier einige Probleme mit Kommunikation zwischen SPS und Klemme an sich zu geben.
Ich kenne mich leider nicht mit EtherCAT aus, aber nach kurzem überfliegen des Datenblattes scheint es sehr verwand mit CANopen zu sein....

In CANopen werden alle Daten in den Prozessdaten Objekten (PDOs) übertragen. Diese gibt es auch in EtherCat. Nun weiss ich nicht wie du die Klemme im Systemmanager eingebunden hast.
Eigentlich sollte der System-Manager alle PDOs und die darin enthaltenen Parameter anzeigen. Die einzelnen Werte können dann mit Variablen deines Programms verknüpft werden. Das setzt aber vorraus das die PDOs richtig konfiguriert sind.
So funktioniert das bei CANopen wie gesagt...... Kann aber auch sein das es mit EtherCAT ganz anders läuft.

Mit dem Quelltext den du hier gepostet hast, kann ich jedenfalls nichts anfangen. Sorry
 
ich glaube auch, heute Nacht die Erleuchtung erhalten zu haben.;)

Es liegen zwar alle Daten jeden Zyklus an, ich kann aber nur pro Zyklus einmal etwas abfragen.

Somit wären für 5 Werte (scheinleistung, wirkleistung...) 5 Zyklen nötig. und damit wären die Daten nicht mehr konsistent.

Sehe ich das richtig?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das ist teilweise richtig. Pro SPS-Zyklus kannst du höchstens einen Wert aus diesen variablen-Messwerten abfragen. Die variablen Messwerte werden per Multiplexing übertragen - Anwahl per Index. Die Datenkonsistenz ist trotzdem gewährleistet, weil die Werte aus einem Messzyklus der Klemme stammen.

Geht bei dir das Verständnis der Zyklen: SPS-Zyklus und Messzyklus vielleicht durcheinander? Der Messzyklus ist netzsynchronisiert und dauert mindestens eine Periode also 20ms bei 50Hz Netzfrequenz. Der SPS-Zyklus synchronisiert den EtherCAT Datenaustausch mit der Klemme und hat mit dem Messzyklus nichts zu tun. Bei einer 1ms SPS-Task stehen etwas weniger als 20 SPS-Zyklen zur Verfügung zum Auslesen der konsistenten Messwerte eines Messzyklus zur Verfügung. (Irgendwie wiederhole ich mich, sorry)

Mein Vorschlag für die Schrittkette für Multiplex:
1. Nulldurchgangstoggle abwarten?
2. ersten Messwert per Index anwählen
3. Index von der Klemme angenommen?
4. Messwert speichern
5. War das der letzte Messwert? -> 1
6. nächsten Messwert per Index anwählen -> 3
 
Jetzt hab ichs verstanden. Werde das direkt mal in die Tat um zu setzen versuchen :rolleyes:

Vielen Dank für deine Geduld!
 
Ich bin echt zu blöd dazu!
Selbst im nächsten Zyklus bekomme ich immer noch die Daten aus dem 1. Zyklus obwohl ich den Index um einen erhöhe. Ist doch sch...!
Sorry, aber ich versteh einfach nicht warum!?? Ich bin definitiv im nächsten Zyklus. Hab einen Zykluscounter mit laufen.

Leistungsmessung(FB)
Code:
CASE messgroesse1 OF
    0: L1[2]:=variant_value1;
    1: L1[3]:=variant_value1;
    2: L1[4]:=variant_value1;
    3: L1[5]:=variant_value1;
    4: L1[6]:=variant_value1;
    5: L1[7]:=variant_value1;
ELSE
    messgroesse1:=0;
END_CASE;
messgroesse1:=messgroesse1+1;
MAIN(PRG)
Code:
IF start_var THEN
    Leistungsmessung(L1=> , L2=> , L3=> );
    IF messgroesse1 >=6 THEN
        start_var :=FALSE;
        messgroesse1:=0;
        messgroesse2:=0;
        messgroesse3:=0;
    END_IF
END_IF

Ich verzweifel echt noch da dran! :(
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hey,

wie Witkatz bereits erwähnt hatte, eignet sich am Besten eine CASE-Schleife dazu. Probier es mal so:

CASE state1 OF
1: usiIndexOut1 := 0;
usiIndexOut2 := 0;
usiIndexOut3 := 0;
state1 := 2;
2: (* Scheinleistung wird eingelesen *)
IF usiIndexIn1 = 0 AND usiIndexIn2 = 0 AND usiIndexIn3 = 0 THEN
rAppPowerCh1 := DINT_TO_REAL (diValueCh1) * 0.00001 * 10;
rAppPowerCh2 := DINT_TO_REAL (diValueCh2) * 0.00001 * 10;
rAppPowerCh3 := DINT_TO_REAL (diValueCh3) * 0.00001 * 10;
usiIndexOut1 := 1;
usiIndexOut2 := 1;
usiIndexOut3 := 1;
state1 := 3;
END_IF
3: (* Blindleistung wird eingelesen *)
IF usiIndexIn1 = 1 AND usiIndexIn2 = 1 AND usiIndexIn3 = 1 THEN
rIdlePowerCh1 := DINT_TO_REAL (diValueCh1) * 0.00001 * 10;
rIdlePowerCh2 := DINT_TO_REAL (diValueCh2) * 0.00001 * 10;
rIdlePowerCh3 := DINT_TO_REAL (diValueCh3) * 0.00001 * 10;
usiIndexOut1 := 2;
usiIndexOut2 := 2;
usiIndexOut3 := 2;
state1 := 4;
END_IF
4: (* Energie wird eingelesen *)
IF usiIndexIn1 = 2 AND usiIndexIn2 = 2 AND usiIndexIn3 = 2 THEN
rEnergyCh1 := DINT_TO_REAL (diValueCh1) * 0.000001 * 10;
rEnergyCh2 := DINT_TO_REAL (diValueCh2) * 0.000001 * 10;
rEnergyCh3 := DINT_TO_REAL (diValueCh3) * 0.000001 * 10;
usiIndexOut1 := 3;
usiIndexOut2 := 3;
usiIndexOut3 := 3;
state1 := 5;
END_IF
5: (* Phasenwinkel wird eingelesen *)
IF usiIndexIn1 = 3 AND usiIndexIn2 = 3 AND usiIndexIn3 = 3 THEN
rPhaseCh1 := DINT_TO_REAL (diValueCh1) * 0.001;
rPhaseCh2 := DINT_TO_REAL (diValueCh2) * 0.001;
rPhaseCh3 := DINT_TO_REAL (diValueCh3) * 0.001;
usiIndexOut1 := 4;
usiIndexOut2 := 4;
usiIndexOut3 := 4;
state1 := 6;
END_IF
6: (* Frequenz wird eingelesen *)
IF usiIndexIn1 = 4 AND usiIndexIn2 = 4 AND usiIndexIn3 = 4 THEN
rFrequenzCh1 := DINT_TO_REAL (diValueCh1) * 0.1;
rFrequenzCh2 := DINT_TO_REAL (diValueCh2) * 0.1;
rFrequenzCh3 := DINT_TO_REAL (diValueCh3) * 0.1;
usiIndexOut1 := 0;
usiIndexOut2 := 0;
usiIndexOut3 := 0;
state1 := 1;
END_IF
END_CASE

viel Erfolg.
 
Das funktioniert soweit schonmal super. Vielen Dank dafür!!!

Nur würd ich jetzt irgendwie auch gerne auf Konsistenz der Daten überprüfen bzw. sicher sein, dass sie auch Konsistenz sind.

Also muss ich die Messung doch bei Nulldurchgang starten (TxPDO_toggle = TRUE ODER FALSE) und sollte während der Messung dieser Wert nochmals true oder false werden weiß ich doch, dass die Daten inkonsistent sind.

Sehe ich das richtig? Also schaltet die TxPDO_toggle Variable bei Durchgang der Spannung von - auf + auf true und beim nächsten mal auf false?

Danke für Eure Hilfe und Gruß Martin
 
Zuletzt bearbeitet:
Zurück
Oben