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

Seite 3 von 3 ErsteErste 123
Ergebnis 21 bis 24 von 24

Thema: S5Timer ist nach dem Laden nicht sofort ansprechbar

  1. #21
    blubbb ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    14.05.2013
    Beiträge
    19
    Danke
    4
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Die Variable "Zeit_umgewandelt" hat anfangs keinen Wert dieser wird später durch WinCC in den dementsprechenden DB geschrieben.

    Durch die eingebaute Verknüpfung das Zeit_umgewandelt > 0 sein muss wird der SET Kontakt des Timers garnicht erst gesetzt falls er keine Wert hat.

    Bitte verbessert mich wenn ich da falsch liege ansonst stelle ich morgen das ganze Programm rein.

  2. #22
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.191
    Danke
    923
    Erhielt 3.292 Danke für 2.661 Beiträge

    Standard

    Also nochmal mit Deinen Worten: wenn die Variable "Zeit_umgewandelt" vor dem Laden Deines geänderten Programmbausteins einen Wert von WinCC hatte, dann sollte sie den Wert auch nach dem Laden noch haben. Wenn sie den Wert verliert, dann ist an Deinem Programm was faul.

    Wenn "Zeit_Merker" für den SET Kontakt beim Laden Deines Programmbausteins schon gesetzt ist, dann wird nach dem Laden der Timer noch mindestens einmal mit gesetztem "Zeit_Merker" aufgerufen, bevor Deine Prüfung den "Zeit_Merker" für den SET Kontakt rücksetzt. Es sei denn, "Zeit_Merker" wird auch auf magische Weise durch das Baustein-Laden rückgesetzt.

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  3. #23
    blubbb ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    14.05.2013
    Beiträge
    19
    Danke
    4
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Die Variable "Zeit_umgewandelt" hat vor dem Laden keinen Wert nach dem Laden auch nicht! Erst wenn ich über WinCC flex diese Variable in den dementsprechenden DB schreibe hat "Zeit_umgewandelt" einen Wert.
    "Zeit_Merker" wird nur durch diese Bedingung im oberen Code gesetzt somit muss der Wert größer 0 sein sonst läuft der Timer nicht! Ich denke dadurch enstand das Problem da der Timer mit dem Wert T#0s laufen musste.

    Das Programm :
    Code:
    FUNCTION_BLOCK FB20
    
    VAR_INPUT
        //Eingangsvariablen
        Starttaster:BOOL;
        Zeitbaustein_Nocke:TIMER;
        Huebe_Zaehler:COUNTER;
    END_VAR
    
    VAR_OUTPUT
        //Ausgangsvariablen
        Nockensensor:BOOL;
        Winkel_Aktuell:WORD;
        Huebe_Aktuell:WORD;
    END_VAR
    
    VAR_TEMP
        // temporäre Variablen
        
    END_VAR
    
    VAR
        Zeit1_1:S5TIME;
        Zeit_Merker:BOOL;
        Zeit_Merker_Inv:BOOL;
        Winkel_intern:INT;
        Zaehler1:WORD;
        Signal_Start_Takt:BOOL;
        Pos_Signal_Start_Takt:BOOL;
        Flankenmerker:BOOL;
        Zeit_umgewandelt:S5TIME;
        Zeit_Ergebniss:INT;
        Huebe_pro_Min:INT;
    END_VAR
    
        // Anweisungsteil
        //
        //Zuweisung Winkel intern nach aussen
        Winkel_Aktuell  :=   INT_TO_WORD (Winkel_intern);    
        
        // Berechnung Huebe und S5TIME Umwandlung
        Zeit_Ergebniss       := (1000/Huebe_pro_Min)-10;  //360Grad durch 60Sekunden = 6Grad/Sek => Schrittweite der Aufaddierung = 6 => 6 durch 6 = 1000ms als Takt fuer 1Umdrehung/Min - 10ms für Zykluszeitdifferenz
        Zeit_umgewandelt     := TIM_S5TI(IN := DINT_TO_TIME (INT_TO_DINT(REAL_TO_INT(ROUND (INT_TO_REAL(Zeit_Ergebniss)))))); 
        
        //Zeitbaustein und Taktsignalerzeugung
        Zeit1_1:= S_PEXT(T_NO:=Zeitbaustein_Nocke, S:=Zeit_Merker, TV:=Zeit_umgewandelt, Q=>Zeit_Merker_Inv);
        
        IF     Zeit_Merker_Inv =TRUE AND Zeit_Merker=TRUE AND (Zeit_Ergebniss > 0)
        THEN   Zeit_Merker    :=FALSE;
        
        ELSIF  Zeit_Merker_Inv =FALSE AND (Zeit_Ergebniss > 0)
        THEN   Zeit_Merker    :=TRUE;
            
        END_IF;
        
        //Signalerzeugung / Freigabe
        IF      Starttaster=TRUE & Zeit_Merker=TRUE
        THEN    Signal_Start_Takt:=TRUE;
        ELSE    Signal_Start_Takt:=FALSE;
        END_IF;   
        
        //Bildung der positiven Flanke von der Signalerzeugung /Freigabe
        Pos_Signal_Start_Takt  := Signal_Start_Takt=TRUE AND NOT Flankenmerker=TRUE;
        Flankenmerker          := Signal_Start_Takt=TRUE;
        
        //Addieren der Schrittweite für den Winkel
        IF    Pos_Signal_Start_Takt  =TRUE
        THEN  Winkel_intern         :=Winkel_intern + 6;
        END_IF;
        
        
        //Begrenzung Winkel auf 360°
        IF      Winkel_intern   >= 360
        THEN    Winkel_intern   :=0;
        END_IF;
        
        //Signal Nockensensor 348°- 12°
        IF      (Winkel_intern  >=348  &   Winkel_intern  <=360) OR (Winkel_intern >=0  &  Winkel_intern  <=12)
        THEN     Nockensensor   :=TRUE;
        ELSE     Nockensensor   :=FALSE;
        END_IF;
        
        //Zaehler aktuelle Umdrehenungen der Welle/Nockenimpulse
        Zaehler1       :=S_CU (C_NO:=Huebe_Zaehler,CU:=Nockensensor,R:=Starttaster=FALSE);
        Huebe_Aktuell  := INT_TO_WORD (BCD_TO_INT(Zaehler1));
        ;
        END_FUNCTION_BLOCK
    Der Aufruf:
    Unbenannt.JPG
    Geändert von blubbb (02.10.2013 um 08:09 Uhr) Grund: Ergänzung

  4. #24
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.191
    Danke
    923
    Erhielt 3.292 Danke für 2.661 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von blubbb Beitrag anzeigen
    Die Variable "Zeit_umgewandelt" hat vor dem Laden keinen Wert nach dem Laden auch nicht! Erst wenn ich über WinCC flex diese Variable in den dementsprechenden DB schreibe hat "Zeit_umgewandelt" einen Wert.
    Zitat Zitat von blubbb Beitrag anzeigen
    Code:
        // Berechnung Huebe und S5TIME Umwandlung
        Zeit_Ergebniss       := (1000/Huebe_pro_Min)-10;
        Zeit_umgewandelt     := TIM_S5TI(IN := DINT_TO_TIME (INT_TO_DINT(REAL_TO_INT(ROUND (INT_TO_REAL(Zeit_Ergebniss))))));
    Nach 5 Tagen gibt's endlich den Programmcode ...
    Sorry, jetzt muß ich Dich erstmal runterputzen ... doch weil grad' so schönes Wetter ist, bekommst Du die milde Variante ohne finale Exekution ...

    Nur eine Frage: Hast Du diesen Programmcode selber geschrieben?
    Wirfst Du eigentlich auch mal einen Blick in Dein problematisches Programm wenn wir Dir hier Fragen dazu stellen???
    Gehe zurück "auf Start" und lese das Thema nochmal ...

    [---------- ich habe fertig ----------]


    Egal wer wann in die Variable "Zeit_umgewandelt" schreiben würde - das hätte in Deinem Programm überhaupt keinen Effekt, weil es in jedem Zyklus den Wert in der Variable "Zeit_umgewandelt" überschreibt!


    Wie stellst Du sicher, daß der Wert in der Instanz-Variablen "Huebe_pro_Min" niemals 0 ist bzw. ganz genau: nur im zulässigen Bereich 1 bis 50 ist?
    Schreibt Dein WinCCflex direkt in die Instanz-Variable "Huebe_pro_Min" oder hast Du noch einen anderen Programmteil, der diese Variable von außen beschreibt?

    Wie kann "Huebe_pro_Min" eigentlich seinen Wert verlieren, nachdem ihm einmal ein Wert zugewiesen wurde?
    Mit "Laden des Programms" meinst Du wohl anscheinend nicht nur den FB20 sondern Du lädst auch den Instanz-DB DB200 (oder das komplette Programm) - das würde nämlich erklären, wieso in "Huebe_pro_Min" nach dem Laden plötzlich wieder ein unzulässiger Wert ist.

    - sorge für einen vernünftigen Aktualwert (= Anfangswert) im Offline-InstanzDB, d.h. initialisiere diese Variable in der Deklaration
    - prüfe VOR der Verwendung von "Huebe_pro_Min" ob der Wert im Bereich 1 bis 50 ist. Wenn nicht dann schreibe einen geeigneten Wert hinein
    - willst Du das Laufen des Timers von weiteren Bedingungen abhängig machen, dann müsstest Du die Zuweisung an "Zeit_Merker" VOR dem Timeraufruf machen. Bei nur der negierten Zuweisung vom S-PEXT-Ausgang ("Zeit_Merker_Inv") ist es günstiger NACH dem Timeraufruf.

    Code:
    VAR
        ...
        Huebe_pro_Min : INT := 1;
    END_VAR
    
        ...
    
        // Berechnung Huebe und S5TIME Umwandlung
        IF Huebe_pro_Min < 1 OR Huebe_pro_Min > 50
        THEN Huebe_pro_Min := 1;
        END_IF;
    
        Zeit_Ergebniss       := (1000/Huebe_pro_Min)-10;
        Zeit_umgewandelt     := TIM_S5TI(IN := DINT_TO_TIME (INT_TO_DINT(REAL_TO_INT(ROUND (INT_TO_REAL(Zeit_Ergebniss))))));
    
        //Zeitbaustein und Taktsignalerzeugung
        Zeit1_1:= S_PEXT(T_NO:=Zeitbaustein_Nocke, S:=Zeit_Merker, TV:=Zeit_umgewandelt, Q=>Zeit_Merker_Inv);
        Zeit_Merker := NOT Zeit_Merker_Inv;
    
        //Signalerzeugung / Freigabe
        ...

    PS:
    MW105 ist nicht "schön" und nicht üblich
    Benutzt Du auch irgendwo ein MW104 oder MW106? (MW105 überschneidet sich mit MW104 und MW106)

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

Ähnliche Themen

  1. Step 7 Datenbaustein nicht über Symbolname ansprechbar
    Von TimeOUT im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 18.07.2013, 12:40
  2. Wago ist nach kurzer Zeit nicht mehr erreichbar
    Von erdbeerschaeler im Forum CODESYS und IEC61131
    Antworten: 2
    Letzter Beitrag: 08.08.2011, 15:37
  3. Pointer stimmt nach dem Speichern nicht mehr
    Von matziane im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 16.07.2010, 14:14
  4. Antworten: 0
    Letzter Beitrag: 24.05.2010, 14:06
  5. S5Timer wird nicht korrekt bearbeitet
    Von raffi67 im Forum Simatic
    Antworten: 9
    Letzter Beitrag: 13.12.2006, 19:27

Stichworte

Lesezeichen

Berechtigungen

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