Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 19 von 19

Thema: EL3403-0010, alle Daten gleichzeitig?

  1. #11
    Registriert seit
    19.10.2009
    Beiträge
    194
    Danke
    8
    Erhielt 50 Danke für 44 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    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.

  2. #12
    Registriert seit
    19.04.2010
    Beiträge
    96
    Danke
    12
    Erhielt 3 Danke für 3 Beiträge

    Standard

    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...
    Geändert von Mattin81 (22.07.2010 um 15:03 Uhr)

  3. #13
    Registriert seit
    24.02.2009
    Beiträge
    1.242
    Danke
    23
    Erhielt 276 Danke für 235 Beiträge

    Standard

    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

  4. #14
    Registriert seit
    19.04.2010
    Beiträge
    96
    Danke
    12
    Erhielt 3 Danke für 3 Beiträge

    Standard

    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?

  5. #15
    Registriert seit
    19.10.2009
    Beiträge
    194
    Danke
    8
    Erhielt 50 Danke für 44 Beiträge

    Standard

    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

  6. Folgender Benutzer sagt Danke zu witkatz für den nützlichen Beitrag:

    Mattin81 (23.07.2010)

  7. #16
    Registriert seit
    19.04.2010
    Beiträge
    96
    Danke
    12
    Erhielt 3 Danke für 3 Beiträge

    Standard

    Jetzt hab ichs verstanden. Werde das direkt mal in die Tat um zu setzen versuchen

    Vielen Dank für deine Geduld!

  8. #17
    Registriert seit
    19.04.2010
    Beiträge
    96
    Danke
    12
    Erhielt 3 Danke für 3 Beiträge

    Standard

    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!

  9. #18
    Registriert seit
    22.06.2010
    Beiträge
    6
    Danke
    0
    Erhielt 2 Danke für 2 Beiträge

    Ausrufezeichen

    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.

  10. #19
    Registriert seit
    19.04.2010
    Beiträge
    96
    Danke
    12
    Erhielt 3 Danke für 3 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    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
    Geändert von Mattin81 (26.07.2010 um 11:22 Uhr)

Ähnliche Themen

  1. Antworten: 2
    Letzter Beitrag: 15.02.2011, 19:38
  2. falsche Werte Leistungsmessklemme EL3403-0010
    Von Mattin81 im Forum CODESYS und IEC61131
    Antworten: 5
    Letzter Beitrag: 22.06.2010, 13:23
  3. Antworten: 1
    Letzter Beitrag: 21.05.2010, 09:09
  4. EL3403 Leistungsmessklemme
    Von Pusher im Forum CODESYS und IEC61131
    Antworten: 4
    Letzter Beitrag: 01.04.2009, 10:01
  5. Antworten: 9
    Letzter Beitrag: 07.11.2007, 11:54

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •