# S7 OB1 - FB/DB Aufruf



## Marco Polo (21 April 2009)

Hallo,

Ich bin ein Student und habe seit kurzem mit SPS zu tun. Dazu kleine Frage über FB-Aufruf. Einfach zum Verständnis habe ich mir kleinen Zyklus genommen(s.Zyklus - kleines PetriNetz)
Das Programm liegt im OB1

```
UN    M      0.0
      S     M      0.0
      S     M      1.0

      U     M      1.0
      UN    M      1.1
      R     M      1.0
      S     M      1.1

      U     M      1.1
      UN    M      1.2
      L     S5T#2S
      SE    T      1

      U     M      1.1
      UN    M      1.2

      U     T      1
      R     M      1.1
      S     M      1.2

      U     M      1.2
      UN    M      1.3
      UN    M      1.4

      R     M      1.2
      S     M      1.3
      S     M      1.4

      O     M      1.3
      SPBN  x1
      CALL  FB    10 , DB10
       Zeitgl:=T3
       M01   :=M1.4
       M03   :=M1.5

x1:   NOP   0

      U     M      1.3
      U     M      1.5
      UN    M      1.6

      SPBN  x2
      R     M      1.3
      R     M      1.5
      S     M      1.6
x2:   NOP   0

      U     M      1.6
      UN    M      1.0
      L     S5T#2S
      SE    T      4

      U     M      1.6
      UN    M      1.0

      U     T      4
      R     M      1.6
      S     M      1.0
```
und der FB10 macht nichts anderes als Zeitverzögerung:

```
U     #M01
      UN    #M02
      R     #M01
      S     #M02

      U     #M02
      UN    #M03
      L     S5T#2S
      SE    T      3

      U     #M02
      UN    #M03
      U     T      3
      R     #M02
      S     #M03
```
4 Variablen: 2 IN_OUT, 1 STAT und 1 IN(TIMER). Beim ersten Durchlauf wird ganz normal FB aufgerufen(Stelle 1.3 für 2 sek besetzt), aber beim 2-en,3-en, ... schafft das Programm nicht in FB rein, da die eigentlich als IN_OUT definierte M03 behält den TRUE-Wert und somit setzt die Stelle M1.5 wieder auf "1", d.h. 
Könnten Sie mir ein Paar Tips geben, woran es liegt und wie ich es machen kann? Man könnte natürlich beim Starten adressiert Bits löschen, aber wahrscheinlich gibt's eine geschicktere Lösung 

Danke
Gruß, Marco.


----------



## Larry Laffer (21 April 2009)

Hallo marco,
ein FB "merkt" sich seine Ergebnisse in dem dazugehörigen DB. Wird er mal bearbeitet und mal nicht, so bleiben die jeweils letzten Ergebnisse erhalten. Das gilt übrigens auch für jede andere Form der bedingten Programm-Bearbeitung. 
Prinzipiell solltest du versuchen (mein Philosophie) auf bedingte Programmbearbeitung zu verzichten - wo möglich und sinnvoll.

Gruß
LL


----------



## dtsclipper (21 April 2009)

Servus Marco Polo,

Der Timer T3 kann nur beim ersten Durchlauf funktionieren.

Die SIEMENS Timer benötigen eine positive Flanke am Start-Eingang.

Durch die Sprungbedingung bleibt das High-Signal intern erhalten wenn M1.3
"low" wird.

Ich würde den FB auflösen und den Timer ins Masterprogramm implementieren.

dtsclipper


----------



## Marco Polo (21 April 2009)

Hallo Larry,

dass der FB/DB sich die letzten Ergebnisse speichert, ist mir jetzt klar. Mein Gedanke war aber, so einen Markenfluss zu realisieren. Offensichtlich wird das Programm in der Form nicht laufen, aber kann man nicht dem FB/DB zawngsläufig die letzten Werte entnehmen? Oder wie könnte ich das machen, damit der FB nicht nur einmal aufgerufen wird?


----------



## Larry Laffer (21 April 2009)

... du überspringst den FB nicht in Anhängigkeit des Merkers (M1.3 ?) sondern du übergibst den Merker als "Enable"-Parameter mit an den FB ...


----------



## Marco Polo (21 April 2009)

dtsclipper schrieb:


> Servus Marco Polo,
> 
> Der Timer T3 kann nur beim ersten Durchlauf funktionieren.
> 
> ...



Aha, verstanden. Aber wie programmiere ich den Timer, in dem Fall in OB1. Der Timer muss im FB laufen, zwar mehrere.
ungefähr so?

```
U   DB10.DBX4.0
UN DB10.DBX2.1
L   S5T#2S
SE T3
```
und dann den T3 im FB benutzten? Wenn es komisch aussieht, können Sie  lachen - ist gesund. Ich bin ja noch "very NOOB" in SPS und  muss noch viel lernen.

Habe gerade den Timer wie oben im OB1 implementiert und es läuft. Was sagen Sie zu diese Methode? Ist das jetzt ungeschickte Lösung und gibt's was cleveres oder kann man in der Form benutzten?


----------



## dtsclipper (21 April 2009)

Wenn Du mehrere Timer im FB brauchst dann gehe am besten vor wie von Larry beschrieben, den Sprung eliminieren und als IN-Parameter übergeben.

Aber sei vorsichtig, wenn Du mit absoluten Timern in FBs arbeitest, solltest Du den FB nur einmal aufrufen, sonst kommst Du dir selber ins Gehege...

Antwort: Nee, daran ist nichts komisch.
Der Timer kann ja eh' nur einmal eingesetzt werden, von daher ist es irgendwo egal wo er programmiert ist, nicht wahr?

dtsclipper


----------



## Larry Laffer (21 April 2009)

Hallo Marco,
vor Allem, wenn du es als Übungsstück betrachtest, solltest du nicht von deinem geplanten Weg abweichen, sondern versuchen, ihn zu realisieren.
In deinem Fall geht es (so wie ich das sehe) darum, eine Sub-Funktion zu Erstellen ...

Der von dir ursprünglich erstellte FB würde funktionieren, wenn der Timer den Wechsel an der Ansteuerung mitbekommt. Deshalb hatte ich dir geraten, solche Bausteine (am Besten generell) nicht bedingt zu bearbeiten.

Ein weiterer Ansatz wäre (gerade bei Verwendung von FB's nicht mit den S7-Timern sondern mit den IEC-Timern (SFB3 - 5) zu arbeiten. Vielleicht siehst du dir hierzu mal die Hilfe an ...

Gruß
LL


----------



## Marco Polo (21 April 2009)

Langsam komme ich weiter. Die Sprünge müsste man vermeiden, wo es möglich ist, so mein Prof & Larry  , aber... Hier ist nur ein Beispiel zum Verständnis und Sprung hier ist nicht so notwendig. Was ich gerade mache, ist ja viel kompliziertes Programm und da brauche ich auf jeden Fall Sprünge. Dazu kommen auch verschiedene Eingänge als Schaltbedingungen, mit denen ich mir diesen Timer-Schlamassel ersparen könnte, was ich aber nicht mache. _Lange Reda, kurzer Sinn. _Jetzt kann ich meinen Kram weiter machen, aber noch eine Frage   Muss der Timer  immer als Eingang-Paramter definiert werden? Ich meine, wenn ich den Timer bzw. die Timer doch im FB 
implementiere, muss ich wohl oder übel Timer als IN belegen? Im Buch habe keinen Hinweis darauf gefunden


----------



## Larry Laffer (21 April 2009)

dazu siehe bitte auch meinen letzten Beitrag ...

Timer gehören wie auch Eingänge, Ausgänge, Merker, Zähler etc. zu den Global-Parametern. Das heißt : Timer 3 bleibt immer und in jedem Baustein Timer 3. Verwendest du ihn in mehreren Bausteinen (setzend) so gilt letztlich die letzte Zuweisung und die Funktion ist sehr wahrscheinlich gar nicht mehr gegeben ...

Willst du das umgehen, so könntest du auf die schon erwähnten IEC-Timer ausweichen (die kannst du in den FB integrieren). Gleiches gilt (z.B. auch) für Merker. Hier kannst genausogut den STAT-Bereich dafür hernehmen und alles, was du nur in deinem FB baruchst auch dort deklarieren.

Gruß
LL


----------



## Marco Polo (21 April 2009)

2 Larry: mit den Spüngen(SPxx) beschäftige ich mich gerade, da ich damit noch viel zu tun haben werde. Danke für den Hinweis auf IEC-Timer, ich weiß zwar nicht, was sie sind, aber neugirig bin ich schon_. _Ein gutes Buch hätte ich jetzt gebraucht. Von SIEMENS habe ich schon Manuals auf der Festplatte. Gibt's was praktisches im Internet oder Buchhandel?



Larry Laffer schrieb:


> dazu siehe bitte auch meinen letzten Beitrag ...
> 
> Timer gehören wie auch Eingänge, Ausgänge, Merker, Zähler etc. zu den Global-Parametern. Das heißt : Timer 3 bleibt immer und in jedem Baustein Timer 3. Verwendest du ihn in mehreren Bausteinen (setzend) so gilt letztlich die letzte Zuweisung und die Funktion ist sehr wahrscheinlich gar nicht mehr gegeben ...
> 
> ...



Gesehen, verstanden, gespeichert. Jetzt kommt die Freude auf  , denn es ist mir jetzt klar, womit ich mich heute Abend amüsieren werde.


----------



## Larry Laffer (21 April 2009)

zu den genannten IEC-Timern (SFB 3 , 4 , 5) gibt es in der Step7-Hilfe schon viel brauchbares zu lesen. Des weitern würde hier auch die Forums-Suche mit gleichem Stichwort einiges Interessantes zu Tage fördern ...

Darüber hinaus kannst du dann ja auch gerne noch fragen - hierbei halte ich es allerdings für sinnig, nicht allgemein sondern besser spezifisch zu fragen ...


----------



## Marco Polo (21 April 2009)

Danke Larry Laffer, danke dtsclipper. Ihr habt(denke, ist nicht schlimm, wenn ich ihrze  ) mir schon sehr gut geholfen. Jetzt muss ich selber was machen. Nochmal besten Dank.

Gruß Marco.

_ P.S. Für Moderator: das Thema ist nicht erschöpft._


----------



## dtsclipper (21 April 2009)

Gern geschehen, jederzeit wieder!

dtsclipper


----------

