Zeitlicher Ablauf in ST

Basstarono

Level-1
Beiträge
12
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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.
 
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
 
Ok, dann habe ich mich getäuscht und lasse mich von euch gerne eines Besseren belehren.

Man lernt eben nie aus!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich würd auch sagen das die Funktionen synchron hintereinander abgearbeitet werden. Wir haben hier ja kein Multithreading System welches Asynchron arbeiten kann.
 
Meine Erfahrung

Hallo,

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

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


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
 
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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
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.
 
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
 
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...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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.
 
Zuletzt bearbeitet:
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
 
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
 
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
 
Zurück
Oben