# Sequenzielle Abarbeitung von Funktionen in TIA



## Löwenzahn (20 Juli 2022)

Hallo,

ich bin mit der SPS-Programmierung leider noch nicht ganz so fit und komme an einer Stelle gerade leider nicht mehr weiter.

Zur Sache:
Ich habe mir mehrere Funktionen in TIA erstellt (Ablauf zum Spannen und Ablauf zum Öffnen)
Nun möchte ich diese beiden Funktionen (jeweils mit verschiedenen übergabewerten) nacheinander abarbeiten lassen. 
Ist das mit FUP irgendwie möglich, dass ich Funktionen hintereinander schalten kann, damit eben ein sequentieller Ablauf entsteht.

In C++ würde ich die Funktionen einfach untereinander schreiben, aber ich komme gerade mit FUP einfach nicht weiter

Danke im Voraus.


----------



## Blockmove (20 Juli 2022)

Löwenzahn schrieb:


> In C++ würde ich die Funktionen einfach untereinander schreiben, aber ich komme gerade mit FUP einfach nicht weiter



Tja als C++ Programmierer hat man's schwer bei einer SPS.
Du bist gewohnt, dass eine Funktion erst verlassen wird, wenn sie beendet ist.
Zudem bleibt das Programm bei einem "IF" an der Stelle stehen und wartet.
Und genau das ist bei einer SPS grundlegend anders.

Zeig mal am besten deinen Code und dann kann man dir besser helfen


----------



## LargoD (20 Juli 2022)

Löwenzahn schrieb:


> ...In C++ würde ich die Funktionen einfach untereinander schreiben, aber ich komme gerade mit FUP einfach nicht weiter...


Dann würde Dein C++ Programm aber nichts anderes tun als auf eine Bedingung zu warten und alles andere würde nicht bearbeitet.

Dein Problem ist nicht FUP, sondern die Funktionsweise einer SPS.
Du musst Dein Programm so gestalten, dass es in einer großen Schleife aufgerufen werden kann (das macht das Betriebssystem der SPS)
Um Aktionen nacheinander auszuführen brauchst Du eine Schrittkette.
Um Schrittketten zu realiseren, gibt es verschiedene Möglichkeiten.
Die Suchfunktion ist Dein Freund.
Gruß
Erich


----------



## Löwenzahn (20 Juli 2022)

Danke für die Antworten,
ich habe mein Code jetzt leider nicht hier, aber im Grunde bestehen die Funktionen aus:

Grundstellung -->Spannen(mit Paremeter1)-->Öffnen-->Spannen( mit Parameter2)...

Und die Funktionen "Spannen" und "Öffnen" habe ich in der Tat als Schrittkette programmiert.
Den Ansatz mit der Schrittkette kann ich in dem Ablauf schon realisieren, aber da ist dann mein Problem, wie ich sagen kann, dass in den nächsten Schritt gesprungen werden kann, da ich ja keine Rückmeldung habe, wenn die Funktion abgearbeitet ist.


----------



## Heinileini (20 Juli 2022)

Löwenzahn schrieb:


> In C++ würde ich die Funktionen einfach untereinander schreiben, aber ich komme gerade mit FUP einfach nicht weiter





Löwenzahn schrieb:


> ... aber da ist dann mein Problem, wie ich sagen kann, dass in den nächsten Schritt gesprungen werden kann, da ich ja keine Rückmeldung habe, wenn die Funktion abgearbeitet ist.


 Du hast keine Rückmeldung, wenn/wann die Funktion abgearbeitet ist, aber Dein C++-Programm würde wissen, wann der richtige ZeitPunkt gekommen ist? Das will mir nicht so recht einleuchten. 
Ist dass C++-Programm denn sooo langsam, dass es zumindest nie zu früh zum nächsten "Schritt" übergehen würde?


----------



## LargoD (21 Juli 2022)

Löwenzahn schrieb:


> Den Ansatz mit der Schrittkette kann ich in dem Ablauf schon realisieren, aber da ist dann mein Problem, wie ich sagen kann, dass in den nächsten Schritt gesprungen werden kann, da ich ja keine Rückmeldung habe, wenn die Funktion abgearbeitet ist.


Dann musst Du in jeder Schrittkette einen Schritt "Fertig" einführen, auf den die jeweils andere Schrittkette warten muss, bevor sie aktiv wird.
Wie Du diese Information zwischen den beiden Funktionen austauschst bleibt Dir überlassen. (z. B. Funktionsparameter, Rückgabewert, Globale Variablen)
Gruß
Erich


----------



## Löwenzahn (21 Juli 2022)

Danke so habe ich es jetzt auch gemacht.


----------



## Thomas_v2.1 (21 Juli 2022)

Für einen C-Programmierer sollte das für die Arbeitsweise einer S7 hilfreich sein:

```
void OB1()
{
  // Dein Programm welches du im OB1 schreibst
}

int main()
{
  for(;;) {
    OB1();
  }
  return 0;
}
```


----------



## PN/DP (22 Juli 2022)

Damit der C-Programmierer deutlich sieht, daß er sich nicht beliebig lange im OB1 aufhalten darf, sollte das ergänzt werden:

```
void OB1()
{
  // Dein Programm welches du im OB1 schreibst
}

int main()
{
  for(;;) {
    read_inputs();
    retrigger_watchdog();
    OB1();
    write_outputs();
  }
  return 0;
}
```


----------

