Step 7 S5Timer ist nach dem Laden nicht sofort ansprechbar

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.:cool:
 
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
Zuletzt bearbeitet:
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.
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 [COLOR="#0000FF"]:= 1[/COLOR];
END_VAR

    ...

    // Berechnung Huebe und S5TIME Umwandlung
[COLOR="#0000FF"]    IF Huebe_pro_Min < 1 OR Huebe_pro_Min > 50
    THEN Huebe_pro_Min := 1;
    END_IF;[/COLOR]

    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);
    [COLOR="#0000FF"]Zeit_Merker := NOT Zeit_Merker_Inv;[/COLOR]

    //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
 
Zurück
Oben