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

Seite 4 von 5 ErsteErste ... 2345 LetzteLetzte
Ergebnis 31 bis 40 von 41

Thema: Ausreisser erkennen.

  1. #31
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.727
    Danke
    398
    Erhielt 2.404 Danke für 2.002 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    "konfusiert ..." ?
    Nein ... ich wußte nur auf deinen letzten Beitrag nichts sinnvolles zu erwidern. Ein weiterer (als der schon dargestellte) Ansatz fällt mir nicht ein. Möglicherweise möchtest du das Ganze ja etwas erweitern / modifizieren - also die Schrittkette läuft weiter und zählt nur die Fehler. Wie wäre das ...?

    Gruß
    LL

  2. #32
    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

    Hallo Larry, vielen Dank, dass Du noch mal antwortest.


    Genau das wäre gut, weil dem alten System ähnlich.

    Jetzt, wo Du so fragst, muss ich auch zugeben, dass ich Dich falsch verstanden habe.

    Die Schrittkette soll im Prinzip nie stoppen, so lange die Anlage läuft, sondern bei Fehler einfach wieder im richtigen Moment einspringen.

    Es muss fehlertolerant sein, da es ja im besten Falle als "Frühwarnsystem laufen soll.

    Im alten System laufen vier Zähler pro Messbrücke.

    Wenn dazu noch eine Info abgelegt wird, bei welchen Mitnehmernummern Fehler aufgetreten sind, lässt sich auch z. B. eine Häufung bei einem bestimmten Mitnehmer feststellen, so dass auch dieser als defekt festgestellt werden kann.

    Wie könnte man diese Anforderungen un abdecken?

    Gruss

    McNugget
    Geändert von McNugget (01.12.2009 um 16:40 Uhr)

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

    Standard

    Hallo McNugget,

    hast du meinen Ansatz mit Mustererkennung nicht weiterverfolgt?
    Hier ein verfeinerter Algorithmus:
    Code:
    FUNCTION_BLOCK FB_EncoderWatchdog
    VAR
        State: BYTE;
        State_1: BYTE;
        State_Pattern: BYTE;
        State_Pattern_ROL: BYTE;
        loop: INT;
        tonSignalsLow: TON;
        tonSignalsHigh: TON;
        tonTimeOut: TON;
    END_VAR
    VAR_INPUT
        bMachineInRun: BOOL;
        S1: BOOL;
        S2: BOOL;
    END_VAR
    VAR_OUTPUT
        bDirR: BOOL;
        bDirL: BOOL;
        bErrS1High: BOOL;
        bErrS1Low: BOOL;
        bErrS2High: BOOL;
        bErrS2Low: BOOL;
        bErrSignalsLow: BOOL;
        bErrSignalsHigh: BOOL;
        bErrTimeOut: BOOL;
        bPhaseError: BOOL;
    END_VAR
    VAR CONSTANT
        Pattern_DirR: BYTE:= 2#01_11_10_00;
        Pattern_DirL: BYTE:= 2#10_11_01_00;
        Pattern_ErrS1High: BYTE:= 2#01_11_01_11;
        Pattern_ErrS1Low: BYTE:= 2#10_00_10_00;
        Pattern_ErrS2High: BYTE:= 2#11_10_11_10;
        Pattern_ErrS2Low: BYTE:= 2#01_00_01_00;
    END_VAR
    
    State:= 0;
    State.0:= S1;
    State.1:= S2;
    IF State <> State_1 THEN
        State_1:= State;
        State_Pattern:= SHL(State_Pattern, 2) OR State;
        tonTimeOut(IN:= FALSE);
    END_IF
    tonSignalsLow(IN:= bMachineInRun AND S1=FALSE AND S2=FALSE, PT:= t#1s, Q=> bErrSignalsLow);
    tonSignalsHigh(IN:= bMachineInRun AND S1=TRUE AND S2=TRUE, PT:= t#1s, Q=> bErrSignalsHigh);
    tonTimeOut(IN:= bMachineInRun, PT:= t#1s, Q=> bErrTimeOut);
    
    bDirR:= FALSE; bDirL:= FALSE;bErrS1High:= FALSE;bErrS1Low:= FALSE;
    bErrS2High:= FALSE;bErrS2Low:= FALSE;bPhaseError:= FALSE;
    FOR loop:= 0 TO 6 BY 2 DO
        State_Pattern_ROL:= ROL(State_Pattern, loop);
        IF State_Pattern_ROL = Pattern_DirR THEN (*clockwise rotation*)
            bDirR:= bMachineInRun;
        ELSIF State_Pattern_ROL = Pattern_DirL THEN (*counterclockwise rotation*)
            bDirL:= bMachineInRun;
        ELSIF (State_Pattern_ROL AND 2#00111111) = (Pattern_ErrS1High AND 2#00111111)
            OR (State_Pattern_ROL AND 2#11111100) = (Pattern_ErrS1High AND 2#11111100)
        THEN
            bErrS1High:= bMachineInRun;
        ELSIF (State_Pattern_ROL AND 2#00111111) = (Pattern_ErrS1Low AND 2#00111111)
            OR (State_Pattern_ROL AND 2#11111100) = (Pattern_ErrS1Low AND 2#11111100)
        THEN
            bErrS1Low:= bMachineInRun;
        ELSIF (State_Pattern_ROL AND 2#00111111) = (Pattern_ErrS2High AND 2#00111111)
            OR (State_Pattern_ROL AND 2#11111100) = (Pattern_ErrS2High AND 2#11111100)
        THEN
            bErrS2High:= bMachineInRun;
        ELSIF (State_Pattern_ROL AND 2#00111111) = (Pattern_ErrS2Low AND 2#00111111)
            OR (State_Pattern_ROL AND 2#11111100) = (Pattern_ErrS2Low AND 2#11111100)
        THEN
            bErrS2Low:= bMachineInRun;
        END_IF
    END_FOR
    IF NOT bDirR AND NOT bDirL AND NOT bErrS1High AND NOT bErrS1Low AND NOT bErrS2High AND NOT bErrS2Low THEN
        bPhaseError:= bMachineInRun;
    END_IF
    Wie gefällt dir das?

    Gruß,
    witkatz

  4. #34
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.727
    Danke
    398
    Erhielt 2.404 Danke für 2.002 Beiträge

    Standard

    Zitat Zitat von McNugget Beitrag anzeigen
    Wenn dazu noch eine Info abgelegt wird, bei welchen Mitnehmernummern Fehler aufgetreten sind, lässt sich auch z. B. eine Häufung bei einem bestimmten Mitnehmer feststellen, so dass auch dieser als defekt festgestellt werden kann.

    Wie könnte man diese Anforderungen un abdecken?
    Vielleicht dann in etwa so :
    Code:
    if Schritt = 0 and S1 then
       Schritt := 1 ;
    elsif Schritt = 0 and S2 then
       Fehler_1 := Fehler_1 + 1 ;
       Schritt := 1 ;
    end_if ;
     
    if Schritt = 1 and S2 then
       Schritt := 2 ;
    elsif Schritt = 1 and not S1 then
       Fehler_2 := Fehler_2 + 1 ;
       Schritt := 2 ;
    end_if ;
     
    if Schritt = 2 and not S1 then
       Schritt := 3 ;
    elsif Schritt = 2 and not S2 then
       Fehler_3 := Fehler_3 + 1 ;
       Schritt := 3 ;
    end_if ;
     
    if Schritt = 3 and not S2 then
       Schritt := 0 ;
    elsif Schritt = 3 and S1 then
       Fehler_4 := Fehler_4 + 1 ;
       Schritt := 0 ;
    end_if ;

  5. #35
    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

    Puh.

    Gleich zwei aufwendige Codeansätze in 5 Minuten. Bin platt..

    Ich muss das erst mal testen. (bin echt baff....)

    Tausend Dank.

    Das ist soo cool.

    Ich wäre echt froh, wenn ich mal Euch mal mit irgend was helfen könnte.
    Gruss

    McNugget

  6. #36
    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

    So, einige Tage sind vergangen, ich hatte ein wenig Zeit zu testen und da ich morgen in Urlaub fahre, möchte ich zumindest noch ein paar Rückmeldungen verteilen.

    Letztendlich habe ich den Code von Witkatz verwendet, da er sehr schöne Diagnose- und Erweiterungsmöglichkeiten für mich bietet.

    @Larry: Vielen Dank für den Code und die Mühen. Ich hoffe, ich schaffe es mal irgendwann zu einem Forentreffen zum persönlich Danke sagen. (auch für die anderen Threads in denen Du antwortest.) Dein Code ist für mich zum Erlernen von ST sehr wertvoll. Da kann ich jetzt immer mal wieder nachschlagen, wie man es machen könnte (speziell die Zähler).

    @Witkatz: Vielen Dank für den extrem ausgefeilten Code. Ich verstehe zwar bei weitem noch nicht alles, was Du dort mit den Bitpatterns machst, aber es funzt! Ich habe den Code mal um einige Zähler erweitert, um meine Bedingungen besser zu erfüllen.



    Nun gibt es noch weitere Fragen (wahrscheinlich kann ich die Antworten darauf aber wegen meines Urlaubs erst Mitte nächster Woche umsetzen):

    Wie kann ich Signalspitzen kleiner 15 ms rausfiltern?



    Ich habe versucht, den Code von Witkatz aus Antwort #4 in diesem Thread in den Encoder-Code zu integrieren, da die beiden Bausteine ja mit den gleichen EIngangssignalen arbeiten. Leider mit mässigem Erfolg.

    Der Mitnehmerzähler läuft nicht mehr komplett hoch sondern resettet sich immer wieder zwischendurch.

    Wie müsste der Code erweitert werden, um auch die in Beitrag #4 gelösten Bedingungen zu erfüllen?

    Sollte ich heute oder Morgen vormittag nichts lesen, kann ich erst nach meinem Urlaub (Mitte nächster Woche) testen und reagieren. Also bitte keinen Stress..

    Zur Demonstration (der kläglichen Versuche) habe ich mal als Textdateien den Code angefügt, der gut läuft, und den, der mistig ist.

    Sollten wir uns nicht mehr lesen wünsche ich Euch Mentoren einen schönen Urlaub von mir..
    Angehängte Dateien Angehängte Dateien
    Geändert von McNugget (07.12.2009 um 11:53 Uhr)
    Gruss

    McNugget

  7. #37
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.727
    Danke
    398
    Erhielt 2.404 Danke für 2.002 Beiträge

    Standard

    ^Hallo,
    egal, wann du es liest ... ob ich nächste Woche noch daran denke hier etwas zu schreiben will ich mal dahin gestellt sein lassen ...
    Also gleich erledigen ...

    Wenn du deine Signal-Eingänge entsprellen willst, so geht das mit TON's (du hast so welche schon eingesetzt). Diese legst du von der Ansprechzeit auf den von dir gewünschten Wert (also >= 15 ms) und du wertest dann nicht mehr die Eingänge direkt aus sondern die Ausgänge der TON's.

    Zu der Code-Kombination halte ich mich mal heraus (mir ist der Ciode für die Aufgabe ein bißchen zu kompliziert). Da wird dir aber Witkatz sicherlich weiter helfen.

    Also dann ...
    Gruß
    LL

  8. #38
    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

    @Larry: Mann, da war ich mal wieder blind. Klar: TON. Die baue ich gleich heute noch mal ein.

    Danke schön.
    Gruss

    McNugget

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

    Standard

    Zitat Zitat von McNugget Beitrag anzeigen
    Der Mitnehmerzähler läuft nicht mehr komplett hoch sondern resettet sich immer wieder zwischendurch.
    Der Mitnehmerzähler resettet sich nicht selbst, sondern von der globalen Variablen reset, oder? Kann es sein, dass reset zwischendurch gesetzt wird?

    Gruß,
    witkatz

  10. #40
    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


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Witkatz,

    bin gerade seit 6 Stunden vom Ski fahren zurück... War COOL!

    Nein, der reset wird nicht von aussen betätigt. Diesen nutze ich nur, um per Hand ans der Visu die Counter resetten zu können.

    Irgend eine Bedingung wird im "erweiterten" Code nicht sauber umgesetzt, und so kommt es zu "ausserplanmässigen" Resets.
    Gruss

    McNugget

Ähnliche Themen

  1. Verbindungsunterbrechung an HMI erkennen
    Von marcochriss im Forum HMI
    Antworten: 18
    Letzter Beitrag: 31.10.2010, 12:29
  2. Berührung TP erkennen
    Von Harry im Forum HMI
    Antworten: 8
    Letzter Beitrag: 05.08.2009, 12:34
  3. Spannungsausfall erkennen
    Von baalrok im Forum Simatic
    Antworten: 87
    Letzter Beitrag: 20.08.2008, 21:54
  4. Bildänderung erkennen
    Von costa im Forum PC- und Netzwerktechnik
    Antworten: 3
    Letzter Beitrag: 17.04.2007, 12:42
  5. Erkennen von Slaves
    Von Anonymous im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 14.07.2005, 15:54

Lesezeichen

Berechtigungen

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