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

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

Thema: TIMER in Bibliotheksfähigen Bausteinen

  1. #1
    Registriert seit
    13.02.2008
    Beiträge
    5
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,

    ich hab ein Problem mit einem FC, den ich programmiert hab.
    Der FC soll in einem anderen FC aufgerufen werden.
    Ich hab alle Timer, Merker und Zähler in dem Baustein Symbolisch adressiert. wenn ich sie in dem zweiten FC, der später auch mehrmals aufgerufen werden soll wieder symbolisch adressieren will funktioniert das nicht.

    Ich hab die Timer in beiden FCs als als EIngangsvariable deklareiert. und den Datentyp TIMER gewählt.


    ich hoffe jemand von euch kann mir helfen. Danke im voraus.
    Zitieren Zitieren TIMER in Bibliotheksfähigen Bausteinen  

  2. #2
    Registriert seit
    27.04.2006
    Beiträge
    93
    Danke
    14
    Erhielt 2 Danke für 2 Beiträge

    Blinzeln

    Hallo,

    vielleicht verstehe ich dein Problem falsch, aber in bibliotheksfähigen Bausteinen darf man keine "symbolische Adressierung" benutzen, weil die Bausteine dadurch eben nicht mehr bibliotheksfähig sind!

    Ich habe mir vor einiger Zeit auch mal einen FC-Baustein in AWL zusammengestrickt, bei dem ich als Eingangsvariable einen x-beliebigen Timer (z.B. "T5") anlegen kann.

    Code:
    ...
    L #Timerwort   /Timerwort mit Zeitwert und Zeitbasis, Datentyp WORD
    ...
    SV #Timer_Nr   /Timer starten; Eingangsvariable vom Datentyp TIMER
    ...
    Gruß!
    - Jeder Fehler erscheint unglaublich dumm, wenn andere ihn begehen. -

  3. #3
    FrankLA ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    13.02.2008
    Beiträge
    5
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Mit Symbolisch meine ich Variablen in der Symboltabelle bezeichent. diese Tauchen dann ja beim aufrufen des Bausteins wieder als Ein- und Ausgänge des Bausteins auf (Ich programmiere im FUP) wo man sie dann im OB1 mit den absoluten Adressen (T1, T2, E0.0, A1.3...) deklariert. Ich will den FC aber nicht im OB1 aufrufen, sondern in einem anderen FC. In dem kann ich die Variablen wieder nicht absolut deklarieren, weil ich diesen Baustein dann mehrmals aufrufen möchte. Allerdings kann ich diese Eingangsvariablen des "UnterFCs" nicht Mit Variablen des FCs deklarieren. (Mit der absoluten Adresse funktioniert es.)

  4. #4
    Registriert seit
    03.12.2007
    Ort
    Landshut
    Beiträge
    25
    Danke
    12
    Erhielt 1 Danke für 1 Beitrag

    Standard

    kannst du uns mal den genauen aufbau und die funktion deines programms erklären? es fällt mir etwas schwer, mir darunter etwas vorzustellen.

    so verstehe ich es bis jetzt (korrigier mich, wenn ich falsch lieg):
    du hast einen fc (sagen wir fc1), den du mehrmals aufrufen möchtest. in diesem wird wieder ein anderer fc (sagen wir fc2) mehrmals aufgerufen. ein beliebiger timer wird an einen eingang von fc1 gelegt und und in diesem an den fc2 "durchgeschleust".

    wenn du einen timer innerhalb von mehrfach aufgerufenen bausteinen absolut vergibst (also direkt t1, t2, ...) funktioniert das nicht. ich habe leider noch nicht mit timern als ein- oder ausgängen gearbeitet. für so einen fall habe ich mir immer einen eigenen timer geschrieben.

  5. #5
    Registriert seit
    27.04.2006
    Beiträge
    93
    Danke
    14
    Erhielt 2 Danke für 2 Beiträge

    Standard

    Ich würde das auch so wie PsYchO_LoGiC verstehen.

    Ich habe zwar auch noch nicht so viel mit Timern gearbeitet, aber grundsätzlich nehme ich für "spezielle" eigene Bausteine nur AWL und eine allgemeingültige Adressierung mittels Pointer und Adressen etc., um den Baustein bibliotheksfähig zu halten. Hatte bis jetzt damit keine Probleme.

    Beschreib dein Programm doch mal genauer. Das macht die Sache vielleicht einfacher zu verstehen.
    - Jeder Fehler erscheint unglaublich dumm, wenn andere ihn begehen. -

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

    FrankLA (13.02.2008)

  7. #6
    Registriert seit
    08.11.2006
    Ort
    Uckermark
    Beiträge
    903
    Danke
    201
    Erhielt 256 Danke für 208 Beiträge

    Standard

    Zitat Zitat von PsYchO_LoGiC Beitrag anzeigen
    kannst du uns mal den genauen aufbau und die funktion deines programms erklären? es fällt mir etwas schwer, mir darunter etwas vorzustellen.

    so verstehe ich es bis jetzt (korrigier mich, wenn ich falsch lieg):
    du hast einen fc (sagen wir fc1), den du mehrmals aufrufen möchtest. in diesem wird wieder ein anderer fc (sagen wir fc2) mehrmals aufgerufen. ein beliebiger timer wird an einen eingang von fc1 gelegt und und in diesem an den fc2 "durchgeschleust".

    wenn du einen timer innerhalb von mehrfach aufgerufenen bausteinen absolut vergibst (also direkt t1, t2, ...) funktioniert das nicht. ich habe leider noch nicht mit timern als ein- oder ausgängen gearbeitet. für so einen fall habe ich mir immer einen eigenen timer geschrieben.
    FrankLA hat recht, das Durchreichen von Timern funktioniert so nicht.
    Ich habe das eben erst ausprobiert, da ich bislang noch nicht in die Verlegenheit gekommen bin sowas machen zu wollen.

    Edit:
    Wenn man Timer in mehrfach aufzurufenden Bausteinen verwenden will ist es besser mit FB´s zu arbeiten und die IEC-Timer SFB 4 bzw. SFB 5 als Multiinstanzen zu verwenden. Damit erspart man sich auch die Timer von "außen" dranlegen zu müssen.
    Geändert von OHGN (13.02.2008 um 16:21 Uhr) Grund: Ergänzung
    Neue Ideen begeistern jene am meisten, die auch mit den alten nichts anzufangen wussten.
    Karl Heinrich Waggerl (1897-1973)

  8. Folgender Benutzer sagt Danke zu OHGN für den nützlichen Beitrag:

    FrankLA (13.02.2008)

  9. #7
    FrankLA ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    13.02.2008
    Beiträge
    5
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Ihr habt mein Problem richtig erkannt.
    Ich bin allerdings kein Profi im SPS-programmieren und hab bisher noch nie mit FBs gearbeitet. könnt ihr mir grob erklären was für eine Funktion die SFBs 4 und 5 hab und wie man Timer selber programmiert?

  10. #8
    Registriert seit
    30.03.2005
    Beiträge
    2.096
    Danke
    0
    Erhielt 673 Danke für 541 Beiträge

    Standard

    Zitat Zitat von FrankLA Beitrag anzeigen
    ich hab ein Problem mit einem FC, den ich programmiert hab.
    Der FC soll in einem anderen FC aufgerufen werden.
    Ich hab alle Timer, Merker und Zähler in dem Baustein Symbolisch adressiert. wenn ich sie in dem zweiten FC, der später auch mehrmals aufgerufen werden soll wieder symbolisch adressieren will funktioniert das nicht.

    Ich hab die Timer in beiden FCs als als EIngangsvariable deklareiert. und den Datentyp TIMER gewählt.
    Es ist durchaus möglich, in einer Funktion FC100 eine IN-Variable vom Datentyp TIMER an eine weitere Funktion FC110 zu übergeben.

    Hier ist mal ein kurzes Programmbeispiel:

    Code:
    ORGANIZATION_BLOCK OB 1
    TITLE =Hauptprogramm
    //18
    AUTHOR : KAI
    FAMILY : SPSFORUM
    NAME : 'TIMER'
    VERSION : 1.0
     
    VAR_TEMP
      OB1_EV_CLASS : BYTE ; //Bits 0-3 = 1 (Coming event), Bits 4-7 = 1 (Event class 1)
      OB1_SCAN_1 : BYTE ;   //1 (Cold restart scan 1 of OB 1), 3 (Scan 2-n of OB 1)
      OB1_PRIORITY : BYTE ; //Priority of OB Execution
      OB1_OB_NUMBR : BYTE ; //1 (Organization block 1, OB1)
      OB1_RESERVED_1 : BYTE ;   //Reserved for system
      OB1_RESERVED_2 : BYTE ;   //Reserved for system
      OB1_PREV_CYCLE : INT ; //Cycle time of previous OB1 scan (milliseconds)
      OB1_MIN_CYCLE : INT ; //Minimum cycle time of OB1 (milliseconds)
      OB1_MAX_CYCLE : INT ; //Maximum cycle time of OB1 (milliseconds)
      OB1_DATE_TIME : DATE_AND_TIME ;   //Date and time OB1 started
    END_VAR
    BEGIN
    NETWORK
    TITLE =Timer
     
          U     E     10.0; 
          =     L     20.0; 
          BLD   103; 
          CALL FC   100 (
               IN_TIMER_EINGANG         := L     20.0,
               IN_TIMER_NUMMER          := T    100,
               IN_TIMER_WERT            := S5T#10S,
               OUT_TIMER_WERT           := MW   100,
               OUT_TIMER_AUSGANG        := A     10.0);
          NOP   0; 
     
    NETWORK
    TITLE =Timer
     
          U     E     10.1; 
          =     L     20.0; 
          BLD   103; 
          CALL FC   100 (
               IN_TIMER_EINGANG         := L     20.0,
               IN_TIMER_NUMMER          := T    120,
               IN_TIMER_WERT            := S5T#10S,
               OUT_TIMER_WERT           := MW   120,
               OUT_TIMER_AUSGANG        := A     10.1);
          NOP   0; 
     
    END_ORGANIZATION_BLOCK
    Code:
    FUNCTION FC 100 : VOID
    TITLE =Timer
    //18
    AUTHOR : KAI
    FAMILY : SPSFORUM
    NAME : 'TIMER'
    VERSION : 1.0
     
    VAR_INPUT
      IN_TIMER_EINGANG : BOOL ; 
      IN_TIMER_NUMMER : TIMER ; 
      IN_TIMER_WERT : S5TIME ;  
    END_VAR
    VAR_OUTPUT
      OUT_TIMER_WERT : S5TIME ; 
      OUT_TIMER_AUSGANG : BOOL ;    
    END_VAR
    VAR_TEMP
      TEMP_TIMER_NUMMER : WORD ;    
    END_VAR
    BEGIN
    NETWORK
    TITLE =Timer-Nummer
     
          L     P##IN_TIMER_NUMMER; 
          SRD   16; 
          T     #TEMP_TIMER_NUMMER; 
     
    NETWORK
    TITLE =Timer
     
          U     #IN_TIMER_EINGANG; 
          =     L      2.0; 
          BLD   103; 
          CALL FC   110 (
               IN_TIMER_EINGANG         := L      2.0,
               IN_TIMER_NUMMER          := #TEMP_TIMER_NUMMER,
               IN_TIMER_WERT            := #IN_TIMER_WERT,
               OUT_TIMER_WERT           := #OUT_TIMER_WERT,
               OUT_TIMER_AUSGANG        := #OUT_TIMER_AUSGANG);
          NOP   0; 
     
    END_FUNCTION
    Code:
    FUNCTION FC 110 : VOID
    TITLE =Timer
    AUTHOR : KAI
    FAMILY : SPSFORUM
    NAME : 'TIMER'
    VERSION : 1.0
     
    VAR_INPUT
      IN_TIMER_EINGANG : BOOL ; 
      IN_TIMER_NUMMER : WORD ;  
      IN_TIMER_WERT : S5TIME ;  
    END_VAR
    VAR_OUTPUT
      OUT_TIMER_WERT : S5TIME ; 
      OUT_TIMER_AUSGANG : BOOL ;    
    END_VAR
    VAR_TEMP
      TEMP_TIMER_NUMMER : WORD ;    
    END_VAR
    BEGIN
    NETWORK
    TITLE =Timer
     
          L     #IN_TIMER_NUMMER; 
          T     #TEMP_TIMER_NUMMER; 
     
          U     #IN_TIMER_EINGANG; 
          L     #IN_TIMER_WERT; 
          SE    T [#TEMP_TIMER_NUMMER]; 
          LC    T [#TEMP_TIMER_NUMMER]; 
          T     #OUT_TIMER_WERT; 
          U     T [#TEMP_TIMER_NUMMER]; 
          =     #OUT_TIMER_AUSGANG;
     
    END_FUNCTION
    Gruß Kai
    Angehängte Grafiken Angehängte Grafiken
    Angehängte Dateien Angehängte Dateien

  11. Folgender Benutzer sagt Danke zu Kai für den nützlichen Beitrag:

    OHGN (13.02.2008)

  12. #9
    Registriert seit
    30.03.2005
    Beiträge
    2.096
    Danke
    0
    Erhielt 673 Danke für 541 Beiträge

    Standard

    Der Programmcode wird noch etwas einfacher, wenn man in der Funktion FC100 für die Nummer des TIMERS eine IN-Variable vom Datentyp INT an die Funktion FC110 übergibt. In der Funktion FC110 wird dann der TIMER mit der übergebenen Nummer indirekt aufgerufen.

    Code:
    ORGANIZATION_BLOCK OB 1
    TITLE =Hauptprogramm
    //18
    AUTHOR : KAI
    FAMILY : SPSFORUM
    NAME : 'TIMER'
    VERSION : 1.0
     
    VAR_TEMP
      OB1_EV_CLASS : BYTE ; //Bits 0-3 = 1 (Coming event), Bits 4-7 = 1 (Event class 1)
      OB1_SCAN_1 : BYTE ;   //1 (Cold restart scan 1 of OB 1), 3 (Scan 2-n of OB 1)
      OB1_PRIORITY : BYTE ; //Priority of OB Execution
      OB1_OB_NUMBR : BYTE ; //1 (Organization block 1, OB1)
      OB1_RESERVED_1 : BYTE ;   //Reserved for system
      OB1_RESERVED_2 : BYTE ;   //Reserved for system
      OB1_PREV_CYCLE : INT ; //Cycle time of previous OB1 scan (milliseconds)
      OB1_MIN_CYCLE : INT ; //Minimum cycle time of OB1 (milliseconds)
      OB1_MAX_CYCLE : INT ; //Maximum cycle time of OB1 (milliseconds)
      OB1_DATE_TIME : DATE_AND_TIME ;   //Date and time OB1 started
    END_VAR
    BEGIN
    NETWORK
    TITLE =Timer
     
          U     E     10.0; 
          =     L     20.0; 
          BLD   103; 
          CALL FC   100 (
               IN_TIMER_EINGANG         := L     20.0,
               IN_TIMER_NUMMER          := 100,
               IN_TIMER_WERT            := S5T#10S,
               OUT_TIMER_WERT           := MW   100,
               OUT_TIMER_AUSGANG        := A     10.0);
          NOP   0; 
     
    NETWORK
    TITLE =Timer
     
          U     E     10.1; 
          =     L     20.0; 
          BLD   103; 
          CALL FC   100 (
               IN_TIMER_EINGANG         := L     20.0,
               IN_TIMER_NUMMER          := 120,
               IN_TIMER_WERT            := S5T#10S,
               OUT_TIMER_WERT           := MW   120,
               OUT_TIMER_AUSGANG        := A     10.1);
          NOP   0; 
     
    END_ORGANIZATION_BLOCK
    Code:
    FUNCTION FC 100 : VOID
    TITLE =Timer
    //18
    AUTHOR : KAI
    FAMILY : SPSFORUM
    NAME : 'TIMER'
    VERSION : 1.0
     
    VAR_INPUT
      IN_TIMER_EINGANG : BOOL ; 
      IN_TIMER_NUMMER : INT ;   
      IN_TIMER_WERT : S5TIME ;  
    END_VAR
    VAR_OUTPUT
      OUT_TIMER_WERT : S5TIME ; 
      OUT_TIMER_AUSGANG : BOOL ;    
    END_VAR
    BEGIN
    NETWORK
    TITLE =Timer
     
          U     #IN_TIMER_EINGANG; 
          =     L      0.0; 
          BLD   103; 
          CALL FC   110 (
               IN_TIMER_EINGANG         := L      0.0,
               IN_TIMER_NUMMER          := #IN_TIMER_NUMMER,
               IN_TIMER_WERT            := #IN_TIMER_WERT,
               OUT_TIMER_WERT           := #OUT_TIMER_WERT,
               OUT_TIMER_AUSGANG        := #OUT_TIMER_AUSGANG);
          NOP   0; 
     
    END_FUNCTION
    Code:
    FUNCTION FC 110 : VOID
    TITLE =Timer
    AUTHOR : KAI
    FAMILY : SPSFORUM
    NAME : 'TIMER'
    VERSION : 1.0
     
    VAR_INPUT
      IN_TIMER_EINGANG : BOOL ; 
      IN_TIMER_NUMMER : INT ;   
      IN_TIMER_WERT : S5TIME ;  
    END_VAR
    VAR_OUTPUT
      OUT_TIMER_WERT : S5TIME ; 
      OUT_TIMER_AUSGANG : BOOL ;    
    END_VAR
    VAR_TEMP
      TEMP_TIMER_NUMMER : WORD ;    
    END_VAR
    BEGIN
    NETWORK
    TITLE =Timer
     
          L     #IN_TIMER_NUMMER; 
          T     #TEMP_TIMER_NUMMER;
     
          U     #IN_TIMER_EINGANG; 
          L     #IN_TIMER_WERT; 
          SE    T [#TEMP_TIMER_NUMMER]; 
          LC    T [#TEMP_TIMER_NUMMER]; 
          T     #OUT_TIMER_WERT; 
          U     T [#TEMP_TIMER_NUMMER]; 
          =     #OUT_TIMER_AUSGANG; 
     
    END_FUNCTION
    Gruß Kai
    Angehängte Dateien Angehängte Dateien

  13. #10
    Registriert seit
    03.12.2007
    Ort
    Landshut
    Beiträge
    25
    Danke
    12
    Erhielt 1 Danke für 1 Beitrag

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    @OHGN
    ich habe ja auch nur gesagt, dass ich das problem so verstehe, nicht, dass es (meinem momentanen wissensstand nach) funktioniert


    ich glaube, es wäre noch wichtig zu wissen, ob hier immer nur ein timer auf einmal läuft oder ob hier mehrere zeiten parallel laufen sollen.
    Geändert von PsYchO_LoGiC (14.02.2008 um 07:33 Uhr)

Ähnliche Themen

  1. Liste mit SFB und SFC Bausteinen
    Von mrdoc im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 14.05.2013, 07:11
  2. Variablendeklaration in den Bausteinen
    Von Simon_ im Forum CODESYS und IEC61131
    Antworten: 11
    Letzter Beitrag: 07.09.2010, 09:59
  3. Kommunikationsproblem mit T-Bausteinen
    Von sixt im Forum Simatic
    Antworten: 0
    Letzter Beitrag: 27.08.2009, 13:52
  4. Hilfe zu FB Bausteinen
    Von 78tiom im Forum Simatic
    Antworten: 17
    Letzter Beitrag: 19.05.2009, 20:24
  5. Fehler von SFC Bausteinen
    Von fubu16 im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 18.08.2005, 13:35

Lesezeichen

Berechtigungen

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