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

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 13

Thema: Frage zu Flankenauswertung von Tastern

  1. #1
    Registriert seit
    07.05.2016
    Beiträge
    186
    Danke
    45
    Erhielt 1 Danke für 1 Beitrag

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Guten Tag,

    ich erstelle gerade ein kleines Programm in SCL.

    Das Programm soll das Drücken eines Tasters erkennen.

    Ich habe bereits die Softwäremäßige-Lösung des Problems gesehen,
    bei der der "Peglel" des Einganges, an dem der Taster angeschlossen wird
    mittels einer IF-Abfrage überwacht und ausgewertet wird.

    Dies ist aber keine saubere Lösung, da der Zustand durch "Polling" abgefragt wird.
    Und es kann theoretisch passieren, dass der Taster gedrückt wird, bevor die IF-Bedingung greift.

    In FUB verwendet man einen Flip-Flop für diese Aufgabe aber auch hier ist es ja so, dass die Funktionen zyklisch abgearbeitet werden.
    Und auch hier kann es theoretisch passieren, dass man eine Flanke verpasst.

    Andererseits ist die Zykluszeit sehr kurz (ms), sodass man die Flanke schon abfangen kann.

    Bei der µController Programmierung habe ich Interrupts verwendet,
    eie macht ihr das bei der SPS?
    Zitieren Zitieren Frage zu Flankenauswertung von Tastern  

  2. #2
    Registriert seit
    22.11.2006
    Ort
    CH
    Beiträge
    3.620
    Danke
    777
    Erhielt 647 Danke für 493 Beiträge

    Standard

    Du kannst ja wenn du einen Eingang hast der einen Prozessalarm auslösen kann damit die Flankenauswertung machen. Aber üblicherweise ist die normale Flankenauswertung im OB1 Zyklus mehr als ausreichend um eine von einem Menschen gedrückte Taste erkennen zu können.

    Damit die If Abfrage nicht zuschlägt, müsste der Tastenimpuls kürzer als die Zykluszeit sein und dazu noch ausserhalb eines Zykluswechsels passieren.

    mfG René

  3. #3
    Registriert seit
    23.07.2009
    Ort
    Österreich
    Beiträge
    2.351
    Danke
    452
    Erhielt 692 Danke für 517 Beiträge

    Standard

    Zitat Zitat von Neurorancer Beitrag anzeigen
    Dies ist aber keine saubere Lösung, da der Zustand durch "Polling" abgefragt wird.
    Polling heißt nicht automatisch dass es unsauber ist.

    Zitat Zitat von Neurorancer Beitrag anzeigen
    Und es kann theoretisch passieren, dass der Taster gedrückt wird, bevor die IF-Bedingung greift.

    In FUB verwendet man einen Flip-Flop für diese Aufgabe aber auch hier ist es ja so, dass die Funktionen zyklisch abgearbeitet werden.
    Und auch hier kann es theoretisch passieren, dass man eine Flanke verpasst.
    Nur wenn das Ereignis (also der Tastendruck) kürzer dauert als 1 Zyklus oder der Eingangs-Filterzeit.
    Was für die 90% (sicher nicht für einen manuellen Taster) der Signale nicht eintritt.

    Grundsätzlich ist dir aber schon klar wir die SPS arbeitet, oder?
    Stichwort "Prozessabbild der Ein/Ausgänge" bzw. "Zustände der Ein/Ausgänge ändern sich während dem Zyklus nicht"

    Zitat Zitat von Neurorancer Beitrag anzeigen
    Bei der µController Programmierung habe ich Interrupts verwendet,
    Nun, man könnte. Aber wozu?

    Der Vorteil am Polling und am zyklischem Programmablauf ist ja dass es einfacher und besser nachvollziehbar arbeitet.
    Wenn du >1000E/As hast, dann hättest du auch hunderte Interrupts die gleichzeitig feuern...
    Geändert von RONIN (22.06.2016 um 15:14 Uhr)
    If at first you don't succeed, you're not Van Damme!
    ... or maybe using TIA!

  4. #4
    Neurorancer ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    07.05.2016
    Beiträge
    186
    Danke
    45
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Vielen Dank für die Information!

  5. #5
    Neurorancer ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    07.05.2016
    Beiträge
    186
    Danke
    45
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Ich habe jetzt versucht ein Programm zur Flankenauswertung zu erstellen,
    leider hackt es hier noch. Ich glaube es liegt daran, dass ich den Umgang mit den Variablen in Step7 nicht ganz verstanden habe.

    Könnt Ihr bitte schauen was ich verkehrt mache?

    Ich habe drei Variablen:
    "taster_1" ist der Eingang der SPS %I136.0 Typ: bool
    "status_taster_1" ist %MB1
    "taster_1_gedr" ist %MB2

    Zum Ablauf: Wenn "taster_1" gedrückt wird, wird die Variable "status_taster_1" gesetzt.
    Beim nächsten Zyklus wird geprüft ob "taster_1" rückgesetzt ist und "status_taster_1" gesetzt ist.
    Dann wird eine weitere Variable aktiv: "taster_1_gedr"=1 und "status_taster_1" wrd zurückgesetzt.

    Somit kann ich anhand der Variablen "status_taster_1" erkennen ob die Taster gedrückt wurden ist.

    Code:
    //Tastendruck erkennen
    IF "taster_1" = TRUE THEN
        "status_taster_1" := 1;
    ELSIF "taster_1" = FALSE AND "status_taster_1" = 1 THEN
        "status_taster_1" := 0;
        "taster_1_gedr" := 1;
    END_IF;

    Code:
    IF "taster_1_gedr" = 1 THEN
        "out_1" := 1;
        //#umdrehungszahl := #umdrehungszahl + 1000;
        "var_umdrehungszahl" :=  "var_umdrehungszahl" + INT#2000;
        "taster_1_gedr" := 0;
    END_IF;
    Das funktioniert nur ein mal. Beim nächsten Klicken wird die Geschwindigkeit nicht erhöht.
    Mir ist aufgefallen, dass beim drücken und halten des Tasters die Geschwindigkeit auf 255 von 2000
    zurückgeht beim loslassen aber wieder 2000 wird.

    Das ist komisch.

    Ich vermute es liegt an der Art wie ich die Variablen verwende. Ich würde gerne temporäre Variablen verwenden,
    das Problem ist, dass diese beim jedem Zyklus mit dem Anfangswert überschrieben werden.
    Übrigens: Die Startwerte der von mir verwendeter Variablen habe ich in OB100 festgelegt.

  6. #6
    Neurorancer ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    07.05.2016
    Beiträge
    186
    Danke
    45
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Das liegt an den Variablen.

    Habe "taster_1_gedr" auf %MB5 umgestellt und bei jedem Drücken ändert sich die Umdrehungszahl. Erstmal kleines Stückchen schneller und dann zweimal langsamer.
    Und das wiederholt sich. Das sieht nach einem Überlauf aus.
    Ich muss temporäre Variablen verwenden, aber wie stelle ich deren Wert ein, ohne dass sie jedes mal auf den Anfangswert zurückgehen?
    Siehe #umdrehungszahl im Code

    Code:
    //Senden eines Wertes an SDS5000
    
    
    //#umdrehungszahl := 1000;
    
    
    //Tastendruck erkennen
    IF "taster_1" = TRUE THEN
        "status_taster_1" := 1;
    ELSIF "taster_1" = FALSE AND "status_taster_1" = 1 THEN
        "status_taster_1" := 0;
        "taster_1_gedr" := 1;
    END_IF;
    
    
    
    
    IF "taster_1_gedr" = 1 THEN
        "out_1" := 1;
        //#umdrehungszahl := #umdrehungszahl + 1000;
        "var_umdrehungszahl" :=  "var_umdrehungszahl" + INT#2000;
        "taster_1_gedr" := 0;
    END_IF;
    
    
    //"n_soll" := #umdrehungszahl;
    "n_soll" := "var_umdrehungszahl";
    "n_ist" := "n_ist_holen_aus_sdsd5000";

  7. #7
    Registriert seit
    22.11.2006
    Ort
    CH
    Beiträge
    3.620
    Danke
    777
    Erhielt 647 Danke für 493 Beiträge

    Standard

    Sicher nicht temp. Und der Rest ist ebenfalls etwas krude. Würde es dir was ausmachen schnell im forum nach Flanke scl zu suchen?


    Sent from my iPhone using Tapatalk

  8. #8
    Registriert seit
    27.06.2009
    Ort
    am Nordharz
    Beiträge
    3.717
    Danke
    443
    Erhielt 919 Danke für 740 Beiträge

    Standard

    Zitat Zitat von Neurorancer Beitrag anzeigen
    Ich habe jetzt versucht ein Programm zur Flankenauswertung zu erstellen,
    leider hackt es hier noch. Ich glaube es liegt daran, dass ich den Umgang mit den Variablen in Step7 nicht ganz verstanden habe.

    Könnt Ihr bitte schauen was ich verkehrt mache?

    Ich habe drei Variablen:
    "taster_1" ist der Eingang der SPS %I136.0 Typ: bool
    "status_taster_1" ist %MB1
    "taster_1_gedr" ist %MB2

    Zum Ablauf: Wenn "taster_1" gedrückt wird, wird die Variable "status_taster_1" gesetzt.
    Beim nächsten Zyklus wird geprüft ob "taster_1" rückgesetzt ist und "status_taster_1" gesetzt ist.
    Dann wird eine weitere Variable aktiv: "taster_1_gedr"=1 und "status_taster_1" wrd zurückgesetzt.

    Somit kann ich anhand der Variablen "status_taster_1" erkennen ob die Taster gedrückt wurden ist.
    ...
    Warum muss man das Fahrrad unbedingt neu erfinden?


    Flanken ermittelt man normalerweise dadurch, dass man den Zustand des aktuellen mit dem Zustand im letzten Zyklus vergleicht.
    Bei boolschen Signalen (z.B. Taster):
    Letzter Zyklus 0 UND dieser 1 = positive Flanke = Taster wurde gedrückt
    Letzter Zyklus 1 UND dieser 0 = negative Flanke = Taster wurde losgelassen
    (Beides 0 oder beides 1 = Zustand hat sich gegenüber letztem Zyklus nicht verändert)
    Nach diesem Vergleich wird der aktuelle Zustand als Zustand letzter Zyklus (#TasterOld = statisch) gespeichert. Die detektierte Flanke selbst (#TasterFP und/oder #TasterFN) kann temporär sein, da sie in jedem Zyklus neu bestimmt wird.

    Als Code:
    Code:
    #TasterFP  := #Taster    AND Not #TasterOld        // Taster (neu) gedrückt
    #TasterFN  := #TasterOld AND Not #Taster           // Taster (neu) losgelassen
    #TasterOld := #Taster;                             // Zustand für Vergleich im nächsten Zyklus speichern
    
    IF #TasterFP THEN
       ...;
    END_IF;
    #TasterOld, #TasterFP bzw. #TasterFN sind dann logischerweise auch als Bool deklariert und nicht als Byte.


    Hier gibt's noch 'ne schöne FAQ zu dem Thema Flankenauswertung, wenn auch (@Harald, noch?) ohne SCL.



    PS: Boolsche Variablen müssen für eine Bedingung nicht mit einem Vergleich geprüft werden, der als Ergebnis TRUE oder FALSE ausgibt, da diese Variablen selber schon TRUE oder FALSE als Ergebnis enthalten.

  9. #9
    Registriert seit
    22.11.2006
    Ort
    CH
    Beiträge
    3.620
    Danke
    777
    Erhielt 647 Danke für 493 Beiträge

    Standard

    Wenn man nach SCL Flanke im Siemens bereich des SPS Forums sucht. Dann kommt der link schon an vierter Stelle. Sogar mit sinnvollem Namen.
    Flanke in SCL

    2. Beitrag z.B. wäre schon die korrekte Anwendung.

    Der rest ist auch interessant.

    Im

  10. #10
    Neurorancer ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    07.05.2016
    Beiträge
    186
    Danke
    45
    Erhielt 1 Danke für 1 Beitrag

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Ich bleibe lieber bei meinem Programm,
    das funktioniert mittlerweile.
    Das Problem war die Variable "var_umdrehungszahl"
    habe diese temporär gemacht mit einem Vordefinierten Wert und
    jetzt klappt alles.

    Ich muss mich mehr mit den Variablen auseinander setzen.

Ähnliche Themen

  1. Step 7 Mehrfachbelegung von Tastern
    Von blacky001 im Forum Simatic
    Antworten: 24
    Letzter Beitrag: 09.11.2014, 17:53
  2. Verkettung von Not-Aus-Tastern
    Von fup_safety im Forum Maschinensicherheit - Normen und Richtlinien
    Antworten: 18
    Letzter Beitrag: 28.02.2014, 08:58
  3. Antworten: 22
    Letzter Beitrag: 21.09.2012, 13:08
  4. Analogausgang ansteuern mit 2 Tastern
    Von Detto im Forum Simatic
    Antworten: 30
    Letzter Beitrag: 16.11.2011, 13:27
  5. Siemens Logo: aus 2 Tastern soll 1 Schalter werden
    Von ogkoenig im Forum Sonstige Steuerungen
    Antworten: 11
    Letzter Beitrag: 12.09.2008, 09:42

Lesezeichen

Berechtigungen

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