# Zeitlicher Ablauf in ST



## Basstarono (18 Juli 2008)

Hallo,

ich programmiere gerade ein wenig in ST und da habe ich 3 Funktion nacheinander hingeschrieben.

Funktion1();
Funktion2();
Funktion3();

Meine Frage ist werden die Funktionen so aufgerufen wie ich sie programmiert habe (erst Funktion1 dann Funktion2 usw.) oder ist es doch komplizierter?

Es könnte ja auch sein, dass Funktion2 schon aufgerufen wird während Funktion 1 noch bearbeitet wird.

Ich freue mich auf eure Antworten.

Gruß basstarono


----------



## Cerberus (18 Juli 2008)

Hallo,

Ich bin mir nicht sicher, aber ich meine, dass die Funktion2 schon aufgerufen wird während die Funktion1 noch abgearbeitet wird.

Mein Vorschlag wäre es, dass du am Ende von Funktion1 einfach ein Bit (boolsche Variable) setzt, und erst wenn dieses gesetzt ist, du es zurücksetzt und die Funktion2 aufrufst.

Gruß Cerberus


----------



## trinitaucher (18 Juli 2008)

Ich bin bisher immer davon ausgegangen, es würde stur von oben nach unten abgearbeitet werden.
Sonst wären Ergebnisse wie diese...

var1 := funktion1();
var2 := funktion2(var1);

... ja nicht so recht vorhersehbar.

Oder Konvertierungsoptionen:

real1 := INT_TO_REAL(int1);

Das Ergebnis würde doch sonst verfälscht werden und Abarbeitungsvorschriften nicht eingehalten.


----------



## hugo (18 Juli 2008)

In st werden die anweisungen stur der reihe nach abgearbeitet
ausser natürlich bei if then else, schleifen while und repeat....

sonst wäre ein sinnvolles programmieren erst gar nicht möglich
unsere komplette lib oscat.lib ist in st geschrieben und würde bei nicht serieller abarbeitung definitiv nicht funktionieren


----------



## Cerberus (18 Juli 2008)

Ok, dann habe ich mich getäuscht und lasse mich von euch gerne eines Besseren belehren.

Man lernt eben nie aus!


----------



## Neals (18 Juli 2008)

Ich würd auch sagen das die Funktionen synchron hintereinander abgearbeitet werden. Wir haben hier ja kein Multithreading System welches Asynchron arbeiten kann.


----------



## MarkusP (20 Juli 2008)

*Meine Erfahrung*



Basstarono schrieb:


> Hallo,
> 
> ich programmiere gerade ein wenig in ST und da habe ich 3 Funktion nacheinander hingeschrieben.
> 
> ...




Also wie ein Funktionsaufruf sieht das für mich nicht aus...
Sollten das FB oder Programmaufrufe sein, so werden diese zwar sicher nacheinander aufgerufen, für die Programmausführung kann aber schon von Bedeutung sein, dass es viele FB's und natürlich auch PB's gibt, die eben nicht nach einem Programmzyklus fertig sind. Diese gibt es z.B. haufenweise in den Bibliotheken bei TwinCAT. Sollte es Abhängigkeiten zwischen den Aufrufen geben, muss dies unbedingt beachtet werden. Dies war wahrscheinlich das, was Cerberus meinte.

Liebe Grüße


----------



## Werner29 (21 Juli 2008)

Egal ob Funktionen, Instanzen oder Programme:
Der Code wird in der Regel stur nacheinander abgearbeitet. Sollte tatsächlich einmal eine Funktion aufgerufen werden die Asynchron einen Prozess startet, (was man mit TwinCat auch machen kann) dann muss das schon explizit zu der Funktion dokumentiert sein, und dann muss man das natürlich im Code berücksichtigen (also beispielsweise Schreiben einer Datei). Für selbstgeschriebenes und die üblichen Bibliotheksfunktionen gilt die sequentielle, synchrone Abarbeitung.


----------



## M_o_t (21 Juli 2008)

Hallo.

am einfachsten mit Breakpoint im Einzelschritt durcharbeiten lassen. Dann sieht man so richtig wie was nacheinander abläuft. Und das ist nach meiner Erfahrung stur nach der Reihe.

Gruß
Silke


----------



## Basstarono (23 Juli 2008)

*Rekursive Funktion*

Ich wollte das genau wissen, da ich eine rekursive Funktion programmieren möchte. Deshalb wollte ich mir über den Ablauf ganz sicher sein.



> Also wie ein Funktionsaufruf sieht das für mich nicht aus...


Ich denke, der Name sagt alles.

Danke für eure Hilfe.


----------



## Werner29 (23 Juli 2008)

Ja, moment mal.
Rekursion ist ja schon mal überhaupt nicht erlaubt. Zeitlicher Ablauf hin oder her. Die IEC verbietet explizit rekursive Funktionsaufrufe. Über den Sinn dessen kann man streiten, aber umgehen lässt es sich nicht.

Bernhard


----------



## Basstarono (25 Juli 2008)

*nicht möglich?*

Also du bist dir sicher, dass rekursive Funktionen in TwinCat nicht möglich sind @ Werner29?

Gruß Basstarono


----------



## chrisgoossens (25 Juli 2008)

*Unity Pro*

Bei Unity Pro (SPS IEC1131 software van Schneider Electric) und ich denke auch bei zb S7 macht man unterschied zwischen funktionen und funktionsbausteine. Eine funktion hat keine interne variabelen und ist in prinzip direkt ganz fertig (beispiel a = b + c). Aber wann man ein FunktionsBaustein aufruft, kann es sein das diese funktionsbaustein langer dauert. Beste beispiel ist eine zeitverzoegerung TON. Diese baustein benutzt eine interne variabele die jeden programmzyklus die zeitwert inkrementiert und speichert. 
So in das beispiel, wann es um funktionen geht, ist die berechnung der erste funktion ganz fertig wann mann die zweite funcktion anfangt. Aber
wann es un FB's geht, kan mann nur sagen das ins programm die FB aufrufreihenfolge feststeht...


----------



## Werner29 (28 Juli 2008)

Basstarono schrieb:


> Also du bist dir sicher, dass rekursive Funktionen in TwinCat nicht möglich sind @ Werner29?


Ja, ich bin mir eigentlich schon sicher. In CoDeSys ist es definitiv ein Fehler, mir wäre nicht bewusst, das Twincat das anders handhabt. Aber probier es halt einfach aus.

Bernhard


----------



## drfunfrock (4 August 2008)

chrisgoossens schrieb:


> Eine funktion hat keine interne variabelen und



CodeDeSys und Abkömlinge erlauben lokale Variablen in Funktionen, die dann aber nicht rekusiv sein dürfen. Abgesehen davon, ist rekursive Programmierung in einer Echtzeitumgebung ziemlich gefährlich. Deswegen finde ich das Verbot in der Norm als sinnvoll.


----------



## Werner29 (4 August 2008)

Programmieren in einer Echtzeitumgebung ist an sich gefährlich. Vor allem wenn man anfängt Ausgänge zu setzen.
Im Ernst: natürlich kann man sich Probleme einhandeln, aber die kann man sich auch mit einer WHILE oder einer FOR-Schleife einhandeln. Ich plädiere für den mündigen Programmierer, der viele Möglichkeiten geboten bekommt, auch die potenziell gefährlichen, und der sich dann selbst einschränkt, wo er es für richtig hält.
Aber wie gesagt, darüber kann man sich streiten.

Bernhard


----------



## Basstarono (7 August 2008)

*rekursive Programmierung in Twincat*

Hi,

Rekursive Funktionen sind auch in Twincat nicht möglich.

Hat einer ne Idee wie man eine Baumstruktur durchlaufen kann ohne rekursive Funktion?

Gruß Basstarono


----------



## drfunfrock (7 August 2008)

Kann man nicht 2 funktional identische Funktionen nehmen, die sich gegenseitig aufrufen und so dem Verbot der Rekursivität ausweichen?


----------



## Werner29 (8 August 2008)

So schlau ist das System leider schon, dass es Rekursionen auch über mehrere Aufrufebenen überprüft.
Vielleicht funktioniert es, sich eine Iterationsfunktion zu schreiben, die zu einem gegebenen Baum-Knoten den "nächsten" (ersten Kindknoten, nächstes Geschwister) liefert. 
So dass man am Ende mit einer WHILE-Schleife durch den Baum iterieren kann.
Kommt natürlich drauf an, wieviel Information im Baum steckt, ob man von einem Kind zum Vater kommt und so weiter.
Auf alle Fälle bricht man sich für diese Fälle einen ab, und mit Rekursion wäre es viel einfacher und übersichtlicher.

Falls es irgendjemand interessiert: ab Version 3 ist in CoDeSys das Rekursionsverbot gelockert. Man darf dann in einer Methode dieselbe Methode eines anderen Objekts aufrufen. Ansonsten hätte man an der Objektorientierung wenig Freude. Der Nachteil ist natürlich, dass man statisch den Stackverbrauch nicht mehr ermitteln kann, und es zur Laufzeit zu Stackoverflow-Exceptions kommen kann. Und die sind sehr unangenehm.

Bernhard


----------



## kiestumpe (8 August 2008)

Wozu brauchst du denn den Baum?


----------



## Basstarono (19 August 2008)

Ich brauche einen Baum um die Struktur meiner Anlage zu durchlaufen.

Gruß


----------



## drfunfrock (19 August 2008)

Dann ist der Baum statisch und man kann ein Array mit allen Information der  Prozesse der Anlage in der richtigen Reihenfolge anlegen. Das geht sogar mit Pointer und Verkettung der Prozesse, was ich schon mit Twincat vor 4 Jahren machte.


----------



## Basstarono (19 August 2008)

Das Problem ist, dass der Baum bidirektional ist.

An jedem Knoten kann man zu 3 weiteren Positionen. Das Problem liegt darin, dass man Wege nicht doppelt gehen darf. Das wäre meiner Meinung nach mit einer rekursiven Funktion leichter gewesen.

Gruß Basstarono


----------



## drfunfrock (19 August 2008)

Ich weiss schon was sie meinen, nur es bleibt beim Array. Wir haben hier auch so eine Anlage, die mal 1, mal 2 Spuren hat. Da ich aber nur vorwärtsgehen kann, habe ich das per "Pointer" (Arrayindex) gelöst. Das geht übrigens ohne Probleme. Sie haben eben 3 Pointer in Vorwärtsrichtung. Ursprünglich hatte ich sogar eine Warteschlangenverwaltung für jede Station, die aber gegen RFID ausgetauscht wurde. Ich würde jede Station als eigenen Automaten implementieren mit einer Kommunikation zur Transportverwaltung. Suchen sie mal nach Montrac und meinem Usernamen. Ich habe da einiges berichtet.


----------

