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

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

Thema: IEC-Timer in mehreren FB instanzen

  1. #1
    Registriert seit
    29.01.2015
    Beiträge
    9
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Zusammen,

    Folgendes Szenario:
    Ich programmiere mit Step 7 v13.0+Sp1. Ich habe mir in SCL eine Statemachine geschrieben in der es auch einen Timeout gibt. Dafür habe ich einen IEC-Timer als TON benutzt. Der Speicher für den Timer wird im Instanz-DB des FBs im statischen Bereich angelegt.

    Nun zu meinem Problem:

    Ich rufe in meiner Funktion bei mir die Main(OB1) zwei Instanzen der State-Machine auf. Beide Statemachine haben ihren eigenen Instanz-DB. Trotzdem sind die Timer global voneinander abhängig. Also wir der Timer in der einen Instanz aktiv wird er das in der 2. automatisch auch.

    Ich fände es sehr praktisch wenn ich einen Timer in meinen Instanz-DB integrieren könnte, der nur zu dieser Instanz gehört.

    Ich sitze jetzt 2 Wochen an dir TIA Welt. Währe nett, wenn mir jemand helfen könnte. Danke im Vorraus
    Zitieren Zitieren IEC-Timer in mehreren FB instanzen  

  2. #2
    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 Smicon Beitrag anzeigen
    Ich rufe in meiner Funktion bei mir die Main(OB1) zwei Instanzen der State-Machine auf. Beide Statemachine haben ihren eigenen Instanz-DB. Trotzdem sind die Timer global voneinander abhängig. Also wir der Timer in der einen Instanz aktiv wird er das in der 2. automatisch auch.
    Da hat sich dann aber irgendein Fehler eingeschlichen.
    Woran merkst du dieses Verhalten denn? Zeig und doch mal den Aufruf der 2 Instanzen und vielleicht ein wenig Code der Statemachine.

    Zitat Zitat von Smicon Beitrag anzeigen
    Ich fände es sehr praktisch wenn ich einen Timer in meinen Instanz-DB integrieren könnte, der nur zu dieser Instanz gehört.
    Wenn alles korrekt ist, dann sollte dass auch so sein.
    If at first you don't succeed, you're not Van Damme!
    ... or maybe using TIA!

  3. #3
    Registriert seit
    12.03.2011
    Ort
    Erzgebirge
    Beiträge
    248
    Danke
    77
    Erhielt 29 Danke für 27 Beiträge

    Standard

    Wenn du es so gemacht hast, wie du es beschreibst, sollte es funktionieren.
    Kann es sein, das du im OB1 2x den gleichen Instanz-DB verwendest?

  4. #4
    Smicon ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    29.01.2015
    Beiträge
    9
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Erst mal danke für die schnellen Antworten. Wenn ich von einer Instanz den Timer Starte und ich parallel beide Instanz DBs live anschaue sehe ich, dass der Timer in beiden läuft. Beide Instanzen haben natürlich auch ihren eigenen Baustein.

    Hier der Programmcode:
    Code:
    FUNCTION_BLOCK "SK_State_Machine_Camera"
    { S7_Optimized_Access := 'FALSE' }
    VERSION : 0.1
    VAR_INPUT 
                            Request : Bool;
                           Busy : Bool;
                           IO : Bool;
                           NIO : Bool;
                           Reset : Bool;
       END_VAR
    
       VAR_OUTPUT 
                  Out_Request : Bool;
                    Out_IO : Bool;
                    Out_NIO : Bool;
                    Out_Error : Bool;
              Current_State : Int;
       END_VAR
    
       VAR 
                state : Int;
                timeout_active : Bool;
                IEC_Timer_0_Instance {OriginalPartName := 'TON'; LibVersion := '1.0'} : TON;
       END_VAR
    
       VAR_TEMP 
                Starting_Timeout : Bool;
                Test : Bool;
       END_VAR
    
       VAR CONSTANT 
                waiting_for_request : Int;
                send_request : Int := 1;
                camera_busy : Int := 2;
                timeout : Int := 3;
                camera_ready : Int := 4;
                Time_Timeout : Time := T#10S;
       END_VAR
    
    
    BEGIN
        
        //....................INIT......................................................................
        IF #Reset THEN
                #state := #waiting_for_request;
                #Starting_Timeout := false;
                #Out_Error := false;      
                #Out_IO := false;
                #Out_NIO := false;
                 #Out_Request := false;
        END_IF;
        
        //...............................................................................................
        //
        CASE #state OF
                //Step1.................................................................................    
                  #waiting_for_request:
                
                            IF #Request THEN
                                      #state := #send_request;  
                                      #Out_Request := true;   // Writing Request
                                      #Out_IO := false;       // take back old result
                                      #Out_NIO := false;      // take back old result
                    
                            END_IF;
                //Step2..................................................................................... 
                  #send_request:
                            #Starting_Timeout := TRUE;
                            IF #Busy THEN
                                      #state := #camera_busy;
                                      #Starting_Timeout := false;
                            END_IF;
                //Step3.....................................................................................     
                   #camera_busy:
                            #Starting_Timeout := true;
                            IF NOT #Busy THEN
                                      #state := #camera_ready;
                                      #Starting_Timeout := FALSE;
                            END_IF;
                //Step4.....................................................................................     
            #camera_ready:
                #Starting_Timeout := true;
                IF #IO THEN
                    #state := #waiting_for_request;
                    #Out_IO := true;                //send new result
                    #Starting_Timeout := false;
                END_IF;
                
                IF #NIO THEN
                    #state := #waiting_for_request;
                    #Out_NIO := true;               //send new result
                    #Starting_Timeout := false;
                END_IF;
                //step_Timeout.....................................................................................     
            #timeout:
                #Out_Error := true;
                //..........................................................................................     
                // ELSE  // Do nothing
                //..........................................................................................     
        END_CASE;
        
        IF #timeout_active THEN
          #state := #timeout;
        END_IF;
        
        #IEC_Timer_0_Instance(IN := #Starting_Timeout, //#Starting_Timeout
                              PT := #Time_Timeout,
                              Q => #timeout_active
                              );
        
        
        #Current_State := #state;
        
        
            
    END_FUNCTION_BLOCK
    Geändert von Smicon (30.01.2015 um 11:43 Uhr)

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

    Standard

    Hmm.. auf die Schnelle sehe ich nichts am Timeraufruf. Wie sieht der FB-Aufruf der beiden Instanzen aus?
    Schon mal versucht den Aufruf einer der Instanzen zu deaktivieren.
    Die Bedingung "StartTimeout" wird ja recht häufig gesetzt. Nicht dass da was Anderes beim Testen reinspielt und
    in beiden FBs eine der Bedingungen erfüllt wird.

    Bearbeite doch bitte noch mal deinen vorigen Beitrag.
    Pack einfach nochmal den Code aus der Quelle in die [ CODE] [ /CODE] - Klammen (Ohne Leerzeichen).
    Oder verwende das #-Zeichen in der Menüleiste.
    Dann kann man den Code besser lesen. Sieht z.B. so aus:
    Code:
    IF #NIO THEN
        #state := #waiting_for_request;
        #Out_NIO := true; //send new result
        #Starting_Timeout := false;
    END_IF;
    If at first you don't succeed, you're not Van Damme!
    ... or maybe using TIA!

  6. Folgender Benutzer sagt Danke zu RONIN für den nützlichen Beitrag:

    holgero (30.01.2015)

  7. #6
    Registriert seit
    12.03.2011
    Ort
    Erzgebirge
    Beiträge
    248
    Danke
    77
    Erhielt 29 Danke für 27 Beiträge

    Standard

    Ich habe mir deinen Programmcode nicht ganz nachverfolgt.
    Aber:
    die Variable #Starting_Timeout ist eine Temp-Variable
    und
    die Variable #Starting_Timeout wird immer nur bedingt gesetzt.

    In SPS-Zyklen, in welchen keine Bedingung erfüllt ist, enthällt die Variable der zweiten Instanz mit hoher Warscheinlichkeit den Inhalt der ersten Instanz (identische Stack-Adresse)!!

    Deklariere mal #Starting_Timeout als Statische Variable !
    Geändert von holgero (29.01.2015 um 17:56 Uhr)

  8. Folgende 2 Benutzer sagen Danke zu holgero für den nützlichen Beitrag:

    manseluk (30.01.2015),RONIN (29.01.2015)

  9. #7
    Smicon ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    29.01.2015
    Beiträge
    9
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Jaaaa, die Temp-Variable war das Problem. Jetzt funktioniertes . Entschuldigt noch mal wegen dem schlecht lesbaren Code. Ich hab mein bestes versucht konnte aber mit [ CODE] [ /CODE] nichts erreichen. Anders ausgedrückt ich hab nicht wirklich verstanden wie ich den Code ändern sollte, dass er ihn hier im Forum strukturiert anzeigt.

  10. #8
    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 Smicon Beitrag anzeigen
    Ich hab mein bestes versucht konnte aber mit [ CODE] [ /CODE] nichts erreichen.
    Damit ich die Code-Klammen nicht automatisch ersetzt werden hab ich ein Leerzeichen eingefügt, so wie ich jetzt ein "x" eingefügt habe.
    [x/CODE]

    [CODE]
    Dann kommt dein Code
    [/CODE]

    Es gibt im Beitragseditor in der Symbolleiste auch ein #-Zeichen. Das fügt auch die Code-Tags ein.
    Geändert von RONIN (30.01.2015 um 07:23 Uhr) Grund: noparse eingebaut ;-)
    If at first you don't succeed, you're not Van Damme!
    ... or maybe using TIA!

  11. #9
    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 RONIN Beitrag anzeigen
    Damit ich die Code-Klammen nicht automatisch ersetzt werden hab ich ein Leerzeichen eingefügt, so wie ich jetzt ein "x" eingefügt habe.
    Damit das nicht passiert, kannst Du mit den noparse-Tags arbeiten. Den Tip hat PN/DP neulich gegeben.

    Guckst Du:
    [code] ... [/code]

  12. Folgender Benutzer sagt Danke zu hucki für den nützlichen Beitrag:

    RONIN (30.01.2015)

  13. #10
    Smicon ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    29.01.2015
    Beiträge
    9
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Am Ende hab ichs doch gerafft. Mich wundert nur das der Compiler die Variablen über einen Haufen wirft. Normalerweise wird bei einem Funktionsaufruf die Variablen neu im Speicher angelegt und beim Verlassen gelöscht. Auf den Stack werden die Variablen nur geschoben, wenn ich in der Funktion wieder eine andere öffne. Beim Verlassen des Funktonsaufrufes in der Funktion wird diese dann wieder vom Stack gepoppt. Wieso kommen sich die temporären Variablen in die Quäre? Vielleicht kann jemand ein Beispiel machen.
    Geändert von Smicon (30.01.2015 um 11:54 Uhr)

Ähnliche Themen

  1. IEC Timer
    Von coglione im Forum Simatic
    Antworten: 11
    Letzter Beitrag: 23.11.2011, 12:40
  2. Aufruf von mehreren Instanzen eines FB's für SMS-Versand
    Von dietere im Forum Programmierstrategien
    Antworten: 2
    Letzter Beitrag: 13.11.2007, 23:11
  3. timer von mehreren Stellen aus triggern
    Von noeppkes im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 27.06.2007, 23:05
  4. IEC timer 2
    Von Anonymous im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 07.04.2005, 10:12
  5. IEC Timer
    Von Anonymous im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 07.04.2005, 08:17

Lesezeichen

Berechtigungen

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