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

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

Thema: Störungen gezielt loggen?

  1. #11
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.792
    Danke
    398
    Erhielt 2.416 Danke für 2.012 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Guten Morgen zurück ...

    Ich habe mir zu deinem Problem gerade auch mal ein paar Gedanken gemacht.
    Ich würde die "Stör-Eingänge" wahrscheinlich als ARRAY of BOOL an den Baustein übergeben (und dann halt dem entsprechend von außen dann vorher zuweisen - das macht zwar auch arbeit, etwas eleganteres fällt mir da im Augenblick aber nicht ein).
    Auf diesem Weg könntest du dann eine Auswertung in einer Schleife machen.
    Wenn du den gleichen Ontime 50 mal benutzen willst, so mußt du mit 50 verschiedenen Instanzen des Bausteins arbeiten. Das macht deinen Programmcode betsimmt nicht schlanker - deshalb von mir der Vorschlag, das was der Baustein macht selber zu erstellen. M.E. ist das nicht soviel Arbeit. Du mußt dir dann halt nur für jeden Fehler merken, ob er gerade aktiv ist, wenn er aktiv ist, wann er begonnen hat und natürlich, wie lange er vorher schon mal aktiv war. Hier kannst du dir dann die Dauer dann auch schon gleich in Sekunden (oder ähnlich) ausrechnen.

    Bubblesort (dazu gibt es hier auch im Forum Einiges) kannst du natürlich unterschiedlich betreiben. Es sind dann halt nur unterschiedliche Durchläufe bzw. Programm-Abschnitte.

    Gruß
    LL

  2. #12
    Registriert seit
    11.12.2009
    Beiträge
    2.120
    Danke
    388
    Erhielt 390 Danke für 271 Beiträge

    Standard

    Zitat Zitat von McNugget Beitrag anzeigen
    Guten Morgen.

    @Matze: So wie Du es vorschlägst, hat es nicht mehr die Funktion, die ich bräuchte. Aber Recht hast Du, ich habe es hakelig gemacht.

    Ich muss loggen, wenn Eingang_Anlage_Run FALSE wird UND ein beliebiger Störmeldeeingang TRUE wird.

    (Sprich: welche Störmeldung führte zum Stillstand.)
    Hallo,

    so wie es geschrieben ist reicht aber wirklich der Negierte Eingang. Teste es mal. Weil du hast dir die Funktion gebaut:

    Wenn der Eingang von 1 auf 0 Wechselt wird ein Merker TRUE, wenn der Merker wieder kommt wird er False... genau das macht das Negieren doch auch...

    Das erfassen des erstens machste ja mit dem Zustand Run.

    Ich schreib dir nen Programmbeispiel:

    MfG

    Marcel
    Angehängte Grafiken Angehängte Grafiken

  3. Folgender Benutzer sagt Danke zu Matze001 für den nützlichen Beitrag:

    McNugget (29.12.2009)

  4. #13
    McNugget ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    27.09.2008
    Beiträge
    201
    Danke
    21
    Erhielt 11 Danke für 10 Beiträge

    Standard

    @Matze: Jep. Du hast recht. Blind vor Bäumen.



    So, nun habe ich ein Struct gebaut.

    TYPE Stoerungen_arr :
    STRUCT


    Stoerkanal: STRING;
    Dauer: TIME;
    Zyklen: UDINT;

    END_STRUCT
    END_TYPE
    Dieses will ich nun folgendermassen füllen.

    FUNCTION_BLOCK Stoerbit_Array
    VAR_INPUT

    reset: BOOL;
    END_VAR

    VAR_OUTPUT

    END_VAR

    VAR


    I: INT;
    SStoer: BOOL;
    Stoerung:BOOL;

    Stoermerker: BOOL;
    i_Stoerung: INT;
    Ontime_A:ONTIME;
    Merker_Ereignis_1: BOOL;
    Seconds: UDINT;
    cycles: UDINT;
    Ontime_ZEit: TIME;
    END_VAR

    b_stoerbits[1] := X25_01 OR TEST_X25_01 ;
    b_stoerbits[2] := X25_02 OR TEST_X25_02 ;
    b_stoerbits[3] := X25_03 OR TEST_X25_03 ;
    b_stoerbits[4] := X25_04 OR TEST_X25_04 ;
    b_stoerbits[5] := X25_05 OR TEST_X25_05 ;
    b_stoerbits[6] := X25_06 ;
    b_stoerbits[7] := X25_07 ;
    b_stoerbits[8] := X25_08 ;
    b_stoerbits[9] := X25_09 ;
    b_stoerbits[10] := X25_10 ;
    b_stoerbits[11] := X25_11 ;
    b_stoerbits[12] := FALSE ;
    b_stoerbits[13] := FALSE ;
    b_stoerbits[14] := FALSE ;
    b_stoerbits[15] := X25_15 ;
    b_stoerbits[16] := X25_16 ;
    b_stoerbits[17] := X25_17 ;
    b_stoerbits[18] := X25_18 ;
    b_stoerbits[19] := X25_19 ;
    b_stoerbits[20] := X25_20 ;
    b_stoerbits[21] := X25_21 ;
    b_stoerbits[22] := X25_22 ;
    b_stoerbits[23] := X25_23 ;
    b_stoerbits[24] := X25_24 ;
    b_stoerbits[25] := X25_25 ;
    b_stoerbits[26] := X25_26 ;
    b_stoerbits[27] := X25_27 ;
    b_stoerbits[28] := X25_28 ;
    b_stoerbits[29] := X25_29 ;
    b_stoerbits[30] := X25_30 ;
    b_stoerbits[31] := X25_31 ;
    b_stoerbits[32] := X25_32 ;
    b_stoerbits[33] := X25_33 ;
    b_stoerbits[34] := X25_34 ;
    b_stoerbits[35] := X25_35 ;
    b_stoerbits[36] := X25_36 ;
    b_stoerbits[37] := X25_37 ;
    b_stoerbits[38] := X25_38 ;
    b_stoerbits[39] := X25_39 ;
    b_stoerbits[40] := X25_40 ;
    b_stoerbits[41] := X25_41 ;
    b_stoerbits[42] := X25_42 ;
    b_stoerbits[43] := X25_43 ;
    b_stoerbits[44] := X25_44 ;
    b_stoerbits[45] := X25_45 ;
    b_stoerbits[46] := X25_46 ;
    b_stoerbits[47] := X25_47 ;
    b_stoerbits[48] := X25_48 ;
    b_stoerbits[49] := X25_49 ;
    b_stoerbits[50] := X25_50 ;
    b_stoerbits[51] := X25_51 ;
    b_stoerbits[52] := X25_52 ;
    b_stoerbits[53] := X25_53 ;
    b_stoerbits[54] := X25_54 ;
    b_stoerbits[55] := X25_55 ;




    FOR I:=0 TO 55 DO
    SStoer:=b_Stoerbits[i];
    IF SSToer AND X25_14 THEN
    i_Stoerung:=i;
    Merker_Ereignis_1;
    ONTIME_A(IN:=Merker_Ereignis_1, seconds:=Seconds, cycles:=cycles, rst:=reset);
    Ontime_Zeit := SECOND_TO_TIME(Seconds);

    IF X25_14 AND Merker_Ereignis_1 THEN
    Daten[i].Dauer:=Daten[i].Dauer + Ontime_Zeit;
    Ontime_A.RST := TRUE;
    Daten[i].Zyklen:= Daten[i].Zyklen + 1;
    Merker_Ereignis_1 :=0;
    END_IF


    END_IF

    END_FOR
    Habe der Bequemlichkeit halber wieder mit ONTIME gearbeitet (den werde ich auch noch knacken und nur das nutzen, was ich brauche..) Diesen rufe ich zum loggen auf und nachdem die Einschaltbedingun wegfällt, soll erst die Zeit weggeschrieben /addiert. werden und dann soll ONTIME zurückgesetzt werden.

    "Selbstverständlich" läuft das nicht so, wie ich es will.

    Es muss doch möglich sein, die neue Zeit des aktuellen Stillstandes der Zeit in der Struct zuzuaddieren. Gleiches mit der Anzahl der Störzyklen.

    Mir reicht es, jeweils die Störung zu loggen, die für den Stillstand verantwortlich war. (also immer die erste. Wenn weitere in der Störzeit hinzukommen, ist mir das egal.


    Hat jemand einen Tip für mich?


    ST und Arrays hassen mich und ich hasse sie dafür !!!
    RACHÄÄÄÄÄÄ...
    (nicht ganz ernst gemeint.. aber es immt mir etwas den Frust..)
    Geändert von McNugget (29.12.2009 um 15:18 Uhr)
    Gruss

    McNugget

  5. #14
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.792
    Danke
    398
    Erhielt 2.416 Danke für 2.012 Beiträge

    Standard

    ... ist schon lustig ... ... du machst den selben Fehler gerne wieder ...
    Code:
    FOR I:=0 TO 55 DO
       SStoer:=b_Stoerbits[i];
            IF SSToer AND X25_14  THEN
               i_Stoerung:=i;
               Merker_Ereignis_1 := true ;
           exit ;
       end_if ;
    end_for ;
    
        ONTIME_A(IN:=Merker_Ereignis_1, seconds:=Seconds, cycles:=cycles, rst:=reset);
        Ontime_Zeit := SECOND_TO_TIME(Seconds);
    
            IF X25_14 AND Merker_Ereignis_1 THEN
               Daten[i_Stoerung].Dauer:=Daten[i_Stoerung].Dauer + Ontime_Zeit;
                Ontime_A.RST := TRUE;
                Daten[i_Stoerung].Zyklen:= Daten[i_Stoerung].Zyklen + 1;
                Merker_Ereignis_1 :=false;
            END_IF
    ... das hätte schon eher Chancen zu funktionieren ... richtig zufrieden bin ich damit allerdings auch nicht.

    Was ist "X25_14" ?

    Nach meiner Meinung -unabhängig ob es nur ein Ereignis gleichzeitig geben kann- würde ich das Script immer versuchen, so aufzubauen, dass es mit mehreren gleichzeitigen Ereignissen auch arbeiten kann (so etwas soll es ja auch geben ...).

    Wenn du mit ARRAY's arbeitest, dann stell dir doch einfach mal einen Setzkasten vor - in diesem Fall einen ein-dimensionalen ...

    Für die Arbeitsweise des FB's :
    Ein IN-Parameter müßte m.E. die Betriebsart sein - merken mußt du dir dann (quasi als Flanke) welches die letzte ausgewertete Betriebsart war. Dann kann der FB seine Entscheidungen fast selbst treffen.

    Gruß
    LL

  6. #15
    McNugget ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    27.09.2008
    Beiträge
    201
    Danke
    21
    Erhielt 11 Danke für 10 Beiträge

    Standard

    Doppelpost. Nicht beachten.
    Geändert von McNugget (29.12.2009 um 16:28 Uhr)
    Gruss

    McNugget

  7. #16
    McNugget ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    27.09.2008
    Beiträge
    201
    Danke
    21
    Erhielt 11 Danke für 10 Beiträge

    Standard

    AARGH.. Klar.. Ontime-Aufruf aus der Schleife raus...

    Sorry... (leider fehlt hier der Smiley, der sich vor die Stirnschlägt...)

    Ähh, was machst Du mit dem Exit? Was bezweckt es da und auf welche IF-Bedingung bezieht es sich?


    Cool.

    Gerade war ich auch auf [i_Stoerung] gekommen. so weit war ich schon mal.

    Konnte nicht sauber testen, da ein Schlosser Teile der Anlage abgeschaltet hatte und ich es nicht bemerkt habe, ---> räumliche Distanz >100m.

    X25_12 bis X25_14 sind Statusmeldungen die KEINE Störungen sind. Irgendwer hat die da mal mit in die Klemmleiste mit reinverdrahtet.

    Ich habe es so übernommen aber in meinen beiden Arrays sollen die IMMER als FALSE dastehen. Daher her die exotische Zuweisung.
    (finde es selber "unglücklich".)

    Wie gesagt, ich fange ja erst an mit dem Thema, daher bin ich ja schon mal glücklich, wenn ich erst mal eine Prozedur habe, die mir nur die erste Störung wegloggt.

    Klar, die anderen würde mich auch interessieren, aber die wichtigste ist immer die, die für Stillstand sorgt.

    Später werde ich auch noch Störungen loggen wollen, die das Einschalten der Anlage verhindert haben.

    Wenn ich diese Infos dann auswerte, kann ich Aussagen über die Qualität/Störanfälligkeit der Anlagenteile machen.
    Gruss

    McNugget

  8. #17
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.792
    Danke
    398
    Erhielt 2.416 Danke für 2.012 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von McNugget Beitrag anzeigen
    Ähh, was machst Du mit dem Exit? Was bezweckt es da und auf welche IF-Bedingung bezieht es sich?
    Der Exit bezieht sich auf die Schleife - du hast den ersten Eintrag gefunden und kannst diese dann abbrechen. Das macht der Exit.

    Den Durchlauf der Schleife solltest du nur ermöglichen, wenn noch kein Fehler erkannt wurde. Alles andere bringt nur Fehl-Auswertungen - du willst ja auch nur nach einem Fehler suchen, wenn du noch nichts hast ...

    Gruß
    LL

  9. Folgender Benutzer sagt Danke zu Larry Laffer für den nützlichen Beitrag:

    McNugget (29.12.2009)

Ähnliche Themen

  1. Graph 7 gezielt Störmeldungen absetzen
    Von epy im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 27.06.2010, 19:11
  2. Gezielt nach Bausteinen suchen...
    Von petzi im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 17.06.2009, 13:24
  3. Aktionen auf HMI Loggen
    Von Rdata im Forum HMI
    Antworten: 4
    Letzter Beitrag: 04.03.2009, 10:06
  4. Daten Loggen
    Von thomasgull im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 23.08.2007, 08:43

Lesezeichen

Berechtigungen

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