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

Ergebnis 1 bis 10 von 10

Thema: Rampenfunktion schreiben

  1. #1
    Registriert seit
    19.07.2008
    Ort
    Aachen
    Beiträge
    270
    Danke
    2
    Erhielt 21 Danke für 20 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Leute,

    ich möchte (ohne den Einsatz der oscat.lib) eine Rampenfunktion erstellen.

    Diese soll einen Integer-Wert in einer bestimmten Zeit (Einstellbar, Typ TIME) von 0 bis auf einen definierten Endwert linear erhöhen.

    Hat jemand nen Ansatz?
    Zitieren Zitieren Rampenfunktion schreiben  

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

    Standard

    Hmmm sollte doch eigentlich die Funktion für eine Gerade ausreichen oder?

    y=mx+n
    y: dein Integer-Wert
    x: die Zeit (z.B. in ms)
    m: Anstieg (m=ymax/xmax)
    n: ist der Offset

    Die time variable kannst du mit time_to_dword in einen Zahlenwert für die Millisekunden konvertieren um damit zu rechnen. T#1m => 60000

  3. #3
    Majestic_1987 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    19.07.2008
    Ort
    Aachen
    Beiträge
    270
    Danke
    2
    Erhielt 21 Danke für 20 Beiträge

    Standard

    Ja, genau diese Time_to_Dint hab ich grad auch gefunden xD

    Dennoch danke

  4. #4
    Majestic_1987 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    19.07.2008
    Ort
    Aachen
    Beiträge
    270
    Danke
    2
    Erhielt 21 Danke für 20 Beiträge

    Standard

    Also ich habs jetz hinbekommen, das ich einmal die Rampe rauf und einmal die Rampe runter laufen lassen kann.

    ABER danach springt der Ausgangswert mit Signalwechsel von 0 auf Maximalwert oder zurück.

    Scheint daran zu liegen, dass der Ausgangswert der Timer (ET) auf seinem letzten Wert stehen bleibt. Wie kann ich den zurücksetzen?

    Code:
    (*Wenn Switch gesetzt inkrementiere Wert in Dimmerklemme über Zeitraum Dimm_Up_Time*)
                        IF Switch = TRUE THEN
    
                            Timer1(IN:=Switch,PT:=Dimm_Up_Time);                    (*Starte Timer*)
    
                            Slope := Max_Value_Periperal/TIME_TO_REAL(Dimm_Up_Time);                    (*Steigung der Rampe errechnen*)
    
                            In_Scenes[Scene_Nr].Q_Dimm := REAL_TO_INT(Slope * TIME_TO_DINT(Timer1.ET));    (*Geradengleichung für Rampe*)
    
                        (*Wenn Ausgang rückgesetzt dekrementiere Wert in Dimmerklemme über Zeitraum Dimm_Down_Time*)
                        ELSIF Switch = FALSE AND Timer1.Q THEN
    
                            Timer2(IN:=Timer1.Q,PT:=Dimm_Down_Time);                                        (*Starte Timer*)
    
                            Slope2 := (Max_Value_Periperal/TIME_TO_REAL(Dimm_Down_Time));                (*neg. Steigung der Rampe errechnen*)
    
                            In_Scenes[Scene_Nr].Q_Dimm := Max_Value_Periperal - REAL_TO_INT(Slope2 * TIME_TO_DINT(Timer2.ET));    (*Geradengleichung für Rampe*)
    
                        END_IF

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

    Standard

    Ich denke mal du musst die Timer wieder zurücksetzen wenn sie abgelaufen sind, also IN:=false dann sollten auch ET wieder auf 0 stehen.

  6. #6
    Registriert seit
    12.02.2008
    Ort
    Westfalen (Dort wo's Schwarzbrot gibt)
    Beiträge
    417
    Danke
    8
    Erhielt 87 Danke für 72 Beiträge

    Standard

    Du rufst den 1. Timer nur auf, wenn Switch=True.
    D.h. der In-Parameter Deines Timers ist immer True.

    Beim 2. Timer genauso, nur dort ist der Eingangswert immer FALSE.

    Beide Timer haben am Eingang also immer den gleichen Wert.

    Es würde schon reichen, wenn Du beide Timer ausserhalb Deiner
    IF-ELSE Anweisung setzen würdest.

  7. #7
    Majestic_1987 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    19.07.2008
    Ort
    Aachen
    Beiträge
    270
    Danke
    2
    Erhielt 21 Danke für 20 Beiträge

    Standard

    Da müssen sie aber rein, denn in abhängigkeit verschiedener Zustände sollen diese Timer entweder funktionieren oder nicht. Geht quasi um verschiedene Betriebsmodi.

    Bin der Lösung auf der Spur

  8. #8
    Majestic_1987 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    19.07.2008
    Ort
    Aachen
    Beiträge
    270
    Danke
    2
    Erhielt 21 Danke für 20 Beiträge

    Standard

    Ich komme einfach nich auf nen Grünen zweig.

    Ich möchte, wenn "Dimm" = TRUE ist
    bei der positiven Flanke an "Start"
    Timer1 Starten

    Aus dessen Laufzeit errechnet sich mein Integer-Wert bis max 32767.

    Wenn dann wieder eine positive Flanke an "Start" kommt soll
    Timer2 Starten

    Aus dessen Laufzeit wird die Rampe von 32767 auf 0 errechnet.

    Kommt nun wieder eine positive Flanke an "Start" soll das ganze oben wieder los gehen.

    Irgendwo hakts!

  9. #9
    Registriert seit
    07.03.2004
    Beiträge
    4.369
    Danke
    946
    Erhielt 1.158 Danke für 831 Beiträge

    Standard

    Zitat Zitat von Majestic_1987 Beitrag anzeigen
    ...
    Ich möchte, wenn "Dimm" = TRUE ist
    bei der positiven Flanke an "Start"
    Timer1 Starten

    Aus dessen Laufzeit errechnet sich mein Integer-Wert bis max 32767.

    Wenn dann wieder eine positive Flanke an "Start" kommt soll
    Timer2 Starten

    Aus dessen Laufzeit wird die Rampe von 32767 auf 0 errechnet.

    Kommt nun wieder eine positive Flanke an "Start" soll das ganze oben wieder los gehen.
    ...
    Ich hab mich mal an diesen Ablauf gehalten. Bin mir aber nicht sicher ob Du das wirklich wolltest. In Deinem Code hast es anders Kommentiert.

    Code:
    FUNCTION_BLOCK FB_RAMP
    VAR_INPUT
      DIMM  : BOOL;
      PT    : TIME;
      VALUE : INT;
    END_VAR
    VAR_OUTPUT
      OUT : INT;
    END_VAR
    VAR
      TON_UP   : TON;
      TON_DOWN : TON;
      DIMM_OLD : BOOL;
      UP       : BOOL;
      DOWN     : BOOL;
    END_VAR
    Code:
    (* Geht es hoch oder runter? *)
    IF DIMM AND NOT DIMM_OLD THEN
      UP := TRUE;
      IF TON_UP.Q THEN
        DOWN := TRUE;
      END_IF
    END_IF
    
    (* Timer *)
    TON_UP(IN:=UP, PT:=PT);
    TON_DOWN(IN:=DOWN, PT:=PT);
    
    (* Berechnung des Ausgabewerts *)
    OUT := REAL_TO_INT((TIME_TO_REAL(TON_UP.ET) - TIME_TO_REAL(TON_DOWN.ET)) / TIME_TO_REAL(PT) * INT_TO_REAL(VALUE));
    
    IF TON_DOWN.Q THEN (* Rücksetzen der Werte *)
      UP   := FALSE;
      DOWN := FALSE;
      OUT  := 0;
    END_IF
    
    DIMM_OLD := DIMM; (* Information zur Flankenauswertung *)
    If you open your Mind too much, your Brain will fall out.

  10. #10
    Majestic_1987 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    19.07.2008
    Ort
    Aachen
    Beiträge
    270
    Danke
    2
    Erhielt 21 Danke für 20 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Perfekt...das funzt.

    Jetz werde ich mir das mal ansehen und versuchen, nachzuvollziehen, wie man darauf kommt xD

Ähnliche Themen

  1. Rampenfunktion erstellen
    Von Felse im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 29.09.2009, 18:37
  2. FU MM420 von Siemens / Rampenfunktion
    Von Paul1987 im Forum Simatic
    Antworten: 11
    Letzter Beitrag: 09.04.2009, 21:14
  3. LOGO -. Rampenfunktion
    Von Lumpi737 im Forum Sonstige Steuerungen
    Antworten: 8
    Letzter Beitrag: 16.09.2007, 12:48
  4. Generator einer Rampenfunktion
    Von vladi im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 02.04.2007, 21:18
  5. Rampenfunktion in AWL
    Von Andy Latte im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 31.07.2006, 17:00

Lesezeichen

Berechtigungen

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