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

Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 23

Thema: Ereignisse mit einer Struktur aufzeichnen

  1. #11
    Registriert seit
    25.11.2010
    Ort
    OWL
    Beiträge
    745
    Danke
    27
    Erhielt 164 Danke für 142 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Du musst den FB_R_TRIG vor die IF-Abfrage setzen, sonst wird er bei "inverter1.bool_STS_error_SCU = FALSE" nicht aufgerufen und kann also gar nicht mitkriegen,, dass die Variable wieder FALSE geworden ist.

  2. Folgender Benutzer sagt Danke zu StructuredTrash für den nützlichen Beitrag:

    bone666 (29.02.2016)

  3. #12
    Registriert seit
    01.09.2015
    Beiträge
    72
    Danke
    10
    Erhielt 3 Danke für 3 Beiträge

    Standard

    Top Danke

  4. #13
    Registriert seit
    13.12.2011
    Beiträge
    1.402
    Danke
    146
    Erhielt 158 Danke für 149 Beiträge

    Standard

    Was auch logisch ist, schmeiß die IF-Anweisung weg und alles wird gut
    Noch kurz die Erklärung dazu. Dein Flankenbaustein wird nur aufgerufen wenn die besagte IF-Bedingung erfüllt ist, was bedeutet, dass er die Variable nur im TRUE Zustand sieht und somit, außer beim ersten Mal, nie eine positive Flanke hat und somit Q nie wieder TRUE wird.

    Gruß

    Oliver

    Nachtrag: Sorry, doppelte Antwort, hatte übersehen das es schon eine zweite Seite bei diesem Thread gab.

  5. #14
    Registriert seit
    01.09.2015
    Beiträge
    72
    Danke
    10
    Erhielt 3 Danke für 3 Beiträge

    Standard

    Guten Morgen,

    es funktioniert nun so wie ich es mir vorstelle, jedoch habe ich wahrscheinlich viel zu viel Code benutzt. Vielleicht hat ja jemand eine Idee wie ich es schlanker gestalten könnte.

    Code:
    FB_R_TRIG[1](CLK:=inverter1.bool_STS_error_SCU);
            IF inverter1.bool_STS_error_SCU = TRUE THEN    
            bool_report[1]:=FB_R_TRIG[1].Q;
                IF bool_report[1]= TRUE THEN
                    report_collection[n].timestamp:=SYSTEMTIME_TO_STRING(FB_Systemtime.systemTime);//stri_timestamp;
                    report_collection[n].inverter:='1';
                    report_collection[n].report:='error: SCU';                                  
                    n:=n+1;            
                END_IF        
            END_IF
    Von diesen Blöcken habe ich noch 131 andere, also noch bis FB_R_TRIG[132]... ingesamt fast 1,5k Zeilen Code. Wahrscheinlich geht díes jedoch noch schmaler

    MfG

    Bone

  6. #15
    Registriert seit
    13.12.2011
    Beiträge
    1.402
    Danke
    146
    Erhielt 158 Danke für 149 Beiträge

    Standard

    Soweit Du alles von FB_R_TRIG[1] bis FB_R_TRIG[132] auf einmal ausführst und das mit der Zykluszeit hinkommt, könntest Du das Ganze auch in einer FOR-Schleife ausführen, dann bräuchtest Du das Geraffel nur einmal und ersetzt die feste Zahl durch eine Variable.
    Und dann kannst Du auch die Äußere IF-Anweisung weglassen, die macht, meiner Meinung nach, keinen Sinn.

    Gruß

    Oliver

  7. #16
    Registriert seit
    01.09.2015
    Beiträge
    72
    Danke
    10
    Erhielt 3 Danke für 3 Beiträge

    Standard

    Ich besetzte aber jeden FB_R_TRIG[n] mit einer anderen CLK Variablen. Also z.B. so
    Code:
    FB_R_TRIG[1](CLK:=inverter1.bool_STS_error_SCU);
    ..blabla..
    FB_R_TRIG[1](CLK:=inverter1.bool_STS_error_output_overcurrent_peak);
    ..blabla..
    FB_R_TRIG[3](CLK:=inverter1.bool_STS_error_output_overcurrent_rms);
    usw.
    Damit funktioniert das ja nicht. Oder? Also mit der FOR-Schleife?

  8. #17
    Registriert seit
    19.03.2015
    Beiträge
    60
    Danke
    18
    Erhielt 2 Danke für 2 Beiträge

    Standard

    Du könntest alle deine Fehler zu einem Fehler (z.B. ErrorGeneral) zusammenführen und diesen dann abfragen

    Somit hast du das ganze 1x und alle Fehler werden abgefragt.

    Edit: Also kurz gesagt so:

    Code:
    if error_1 or error_2 or error_3 ...... then 
    error_general = true;
    end_if
    fals du die fehler nicht selber setzen und rücksetzten kannst sondern sie als Eingänge bekommst dann so und passt.

    Code:
    if error_1 or error_2 or error_3 ...... then 
    error_general = true;
    else
    error_general = false;
    end_if
    Geändert von Hamsi (01.03.2016 um 12:33 Uhr)

  9. #18
    Registriert seit
    01.09.2015
    Beiträge
    72
    Danke
    10
    Erhielt 3 Danke für 3 Beiträge

    Standard

    Eine generelle Fehlermeldung habe ich schon implementiert, ähnlich deinem Vorschlag. Ich will jedoch jeden Fehler auflisten, sodass man später gucken kann was, wann, wo aufgetreten ist.

  10. #19
    Registriert seit
    13.12.2011
    Beiträge
    1.402
    Danke
    146
    Erhielt 158 Danke für 149 Beiträge

    Standard

    Zitat Zitat von bone666 Beitrag anzeigen
    Ich besetzte aber jeden FB_R_TRIG[n] mit einer anderen CLK Variablen. Also z.B. so
    Code:
    FB_R_TRIG[1](CLK:=inverter1.bool_STS_error_SCU);
    ..blabla..
    FB_R_TRIG[1](CLK:=inverter1.bool_STS_error_output_overcurrent_peak);
    ..blabla..
    FB_R_TRIG[3](CLK:=inverter1.bool_STS_error_output_overcurrent_rms);
    usw.
    Damit funktioniert das ja nicht. Oder? Also mit der FOR-Schleife?
    Ganz so einfach sicher nicht, aber auch dafür gebe es eine Lösung. Wenn ich das richtig sehe hast Du mehrere Umrichter die jeweils mehrere Fehler schmeißen können. Soweit es pro Umrichter nicht zu viele Fehler sind und das Ganze wieder unübersichtlich wird könnte das Folgende funktionieren (Ob das jetzt schön ist mögen andere entscheiden):

    1. Nicht mehr Inverter1, inverter2, usw. verwenden, sondern ein Array Inverter[1] - Inverter[n]
    2. Das Trigger Array wird zweidimensional (Anzahl Umrichter, Anzahl Fehler/Umrichter)
    3. Die For-Schleife läuft über die Anzahl der Umrichter und nicht die Anzahl der Fehler
    4. Jeweiligen Trigger FB für jeden Fehler aufrufen mit FB_R_TRIG[FOR-Zähler, Fehlertypnummer]
    5. Trigger auswerten und Fehlermeldung schreiben

    Fertig!
    Sollten es sehr viele Fehler pro Umrichter sein könnte man das auch noch über eine FOR-Schleife machen oder man macht wieder eine FOR-Schleife über alle Fehler und setzt in der Schleife einen Zähler.

  11. #20
    Registriert seit
    01.09.2015
    Beiträge
    72
    Danke
    10
    Erhielt 3 Danke für 3 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Stimmt Oliver, es sind mehrere Umrichter, welche zum jetzigen Stand 33 verschiedene Fehler melden können. Ich muss gestehen, dass ich aus deinen Ausführungen noch nicht so schlau werde. Ich führe es mir jedoch mal zur Gemüte.
    Sehe ich es richtig, dass meine Fehler dann im Grunde auch zu einem Array gewandelt werden müssen Fehler[1..n]?
    Was meinst du mit Trigger Array?

Ähnliche Themen

  1. Step 7 Erweiterung einer Struktur mit 3 REAL Variablen
    Von lion1702 im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 14.10.2014, 17:39
  2. Retaindaten in einer Struktur
    Von SY50 im Forum CODESYS und IEC61131
    Antworten: 3
    Letzter Beitrag: 15.09.2014, 08:05
  3. Antworten: 5
    Letzter Beitrag: 10.07.2012, 12:45
  4. Elemente einer Struktur initialisieren
    Von Tigerente1974 im Forum Programmierstrategien
    Antworten: 5
    Letzter Beitrag: 20.01.2012, 07:18
  5. Länge einer Struktur im DB ermitteln
    Von Knut333 im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 22.01.2009, 18:04

Lesezeichen

Berechtigungen

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