CoDeSys Zeitsteuerung mittels Taskkonfiguration

Marco_ET12

Level-1
Beiträge
25
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Liebes Forum,

kurz zu meiner Person. Ich studiere Elektrotechnik und belege dieses Semester das Modul Steuerungstechnik. Da auch die Uni fest im Corona-Griff ist, laufen alle Module dieses Semester als "Homeoffice". Das ist doch perfekt für Programmiermodule.:-D

So jetzt aber zu meinem Problem:

Im Sinne eines Labortestats soll eine Kreuzschaltung für ein Treppenhaus mittels 3 Schaltern in der Sprache FUP realisiert werden.
Als Entwicklungsumgebung nutzen wir hierzu CoDeSys, da dies etwas entspannter in der Simulation ist als TIA.

Die Kreuzschaltung selbst habe ich schon programmiert und per Visualisierung getestet. Das funktioniert alles und war auch recht einfach. Das grundlegende Wissen ist also vorhanden.

Im nächsten Schritt soll ich nun einen zeitgesteuerten Task konfigurieren, der das Programm alle 50ms ausführt. Und genau da ist mein Problem. Ich habe schon alles versucht, komme jedoch nicht hinter die Funktionsweise/Einstelung der Task´s. Auch im Handbuch von Beckhoff komme ich nicht weiter. Leider bin ich aufgrund von Corona deshalb komplett auf mich selbst gestellt. Ich verstehe einfach nicht, wie ich diese Task einstellen muss, damit das funktioniert.

Vielleicht hat jemand von euch ja schon mit Taskkonfigurationen gearbeitet und kann mir dahingehend vielleicht etwas helfen. Wäre schön, wenn sich Leute finden würden, die das mit mir zusammen angehen.

Ich möchte auch keine fertigen Lösungen bzw. Codes, denn mir ist es sehr wichtig, das selbst zu lernen und auch zu verstehen. Dieses Forum wurde mir wärmstens von Professoren empfohlen.

Liebe Grüße und eine schöne, sonnige Woche.

Marco
 
Na ja, wenn Du in TC3 nicht gerade einen leeren SPS Knoten hinzugefügt hattest legt er neben einem Programm auch eine Task mit 10ms an, deren Eigenschaften musst Du nun einfach anpassen.

Von irgendwas mit Internetzugang gesendet.
 
Und genau da kommt mein Problem. Ich habe eine Mail Task die zyklisch abgeabeit wird. Ich habe dieZykluszeit dort auf 50 ms angepasst. Als POU habe ich dann mein PRG angehängt. Dem Task habe ich die PRIO 1 gegeben. Sobald ich aber auf Visualisierung klicke, läuft gar nichts von alleine. Irgendwie muss ich doch etwas machen, damit das Programm duchläuft.

Ich habe in der VISU 3 Schalter und eine Lampe eingesetzt. Wie muss ich den Task aber einstellen, dass bei Start die Lampe leuchtet und alle Schalter durchgeschaltet werden. Oder habe ich den Sinn der Task nicht verstanden? Ist das villt so gar nicht realisierbar?

Falls gefordert, kann ich gerne meinen FUP mal hier anhängen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also der "normale" Vorgang wäre, dass Du unter TC3 ein neues Projekt anlegst und dann unter dem SPS-Knoten eine SPS. Soweit Du als Vorlage nicht die leere SPS gewählt hast erzeugt TwinCAT einen Knoten mit einer Task und einem Programm das dieser Task zugeordnet ist und somit zyklisch ausgeführt wird.
Wie bist Du denn bei der Anlage des Projektes vorgegangen?

Das die Lampe beim Start der SPS leuchtet legst Du über die mit dieser Lampe verknüpften Variable fest. Wenn Du bei der Deklaration angibst, dass diese TRUE sein soll leuchtet beim Start auch die Lampe.

Was meinst Du mit alle Schalter durchgeschaltet werden?
 
Zuletzt bearbeitet:
Hi Oliver,

ich glaube ich verstehe nicht so ganz was du meinst. Ich benutze leider kein TwinCat. Wir programmieren generellnur mit Codesys 3.5. Eine SPS habe ichauch nicht. Sinn ist es, einfach über die CoDeSys Visualisierung das Programm zu testen. Deshalb verstehe ich nicht ganz, was du mit TwinCat meinst.

Mit durchschalten meinte ich, dass das Programm durchläuft und alle Zustände der Schalter ausführt. Ich verstehe nicht ganz die Aufgabenstellung. Das Programm soll alle 50ms durchlaufen.

Bei einer Kreuzschaltung denke ich, sollen alle Schalter nacheinander auf TRUE und FALSE gesetzt werden, damit man sieht, dass das Programm funktioniert. Oder verstehe ich den Sinn einer Task falsch? Ich verstehe einfach nicht wie man dies umsetzt. Wie sehe ich, ob die Task läuft. Ich habe die Task auf 50ms gesetzt. Aber starte ich das Programm läfd es auch nicht anders als ohne. Ich hoffe, du verstehst was ich meine.
 
Hi Marco,

Oliver arbeitet mit TwinCat 3, was auf CoDeSys 3.5 basiert. Es kann nur sein, dass die Oberfläche und manche Funktionen andert aufgebaut sind.

Ich denke am besten stellst du mal dein Programm hier rein, dann kann ich mir mal deine Taskkonfiguration anschauen. Aus der Ferne blind ist immer etwas schwierig.

Gruß

Mavorkit
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Sorry, ich hatte bei Deinem ersten Post etwas von Beckhoff gelesen und bin daher von TwinCAT ausgegangen.
Eine SPS hast Du eigentlich immer, denn auch Codesys installiert auf dem Entwicklungsrechner eine Runtime.
Ich kann gerade kein Codesys 3.5 installieren, aber auch da sollte nach Anlage eines Projektes schon alles (Task, Programm, usw.) angelegt worden sein. In dem Programm musst Du jetzt Variablen deklarieren und diese dann mit den Objekten Deiner Visu verknüpfen.
Die Aufgabe ist eine Kreuzschaltung zu realisieren mit der eine Lampe angesteuert wird. Du musst ein Programm schreiben das zwei Variablen vergleicht und je nach Ergebnis eine Variable setzt. In der Visu platzierst Du dann zwei Schalter die mit den zu vergleichenden Schaltern verknüpft werden und eine Lampe die mit der dritten Variable verknüpft wird. Das Programm muss, soweit nicht automatisch geschehen einer Task zugeiwesen werden, damit es ausgeführt wird und die Task so konfiguriert werden, dass sie zyklisch alle 50ms startet.
 
Zuletzt bearbeitet:
Main.JPG
Task.JPG
VISU.JPG

Soooooo,

@ Mavorkit: jetzt habe ich mal ein paar Shots aus CoDeSys gemacht. Realisiert habe ich das Ganze mit einem XOR-Gatter. Das geht ja am einfachsten.

@Oliver: Das macht nichts. Ich wusste auch nicht, dass TwinCat ähnlich CoDeSys ist.


So, der Maintask war auch schon automatisch auf zyklisch eingestellt. Das ergibt ja auch Sinn. Ich habe lediglich die Zykluszeit von 20ms auf meine 50ms angepasst. Als POU steht mein PRG drin.

So aber jetzt verstehe ich nicht wie ich weitermachen soll.

Das Programm soll ja mittels Taskkonfiguration alle 50ms selbstständig ausgeführt werden. Wo kann ich das live verfolgen?
Weil, wenn ich nun auf "einloggen" klicke und die Simulation starte, passiert gar nichts. Ich kann halt ganz normal die Schalter TRUE and FALSE setzen und dann geht eben die Lampe an oder nicht. Allerdings merke ich nichts von einer Automatik.

Ich kann mir 100%-ig vorstellen, dass mein Kopf was anderes denkt, als er soll:-D
 
So, der Maintask war auch schon automatisch auf zyklisch eingestellt. Das ergibt ja auch Sinn. Ich habe lediglich die Zykluszeit von 20ms auf meine 50ms angepasst. Als POU steht mein PRG drin.

So aber jetzt verstehe ich nicht wie ich weitermachen soll.

Das Programm soll ja mittels Taskkonfiguration alle 50ms selbstständig ausgeführt werden. Wo kann ich das live verfolgen?
Weil, wenn ich nun auf "einloggen" klicke und die Simulation starte, passiert gar nichts. Ich kann halt ganz normal die Schalter TRUE and FALSE setzen und dann geht eben die Lampe an oder nicht. Allerdings merke ich nichts von einer Automatik.

Ich kann mir 100%-ig vorstellen, dass mein Kopf was anderes denkt, als er soll:-D
Jetzt musst Du Dich mit Deiner SPS verbinden, das Ganze herunterladen und starten, Deine Visu öffnen, die Schalter betätigen, fertig. Deine SPS ist dabei Deine lokale Runtime.
Mach mal bitte einen kompletten Screenshot wenn Du Online bist.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja das habe ich gemacht, aber leider sehe ich nicht, wie die Task jetzt arbeitet.
Lege ich Schalter S1 um, leuchtet die Lampe. Ok. Aber das ging ohne Task ja auch. Wo genau kommt jetzt der Task ins Spiel. Ich habe schon die Werte verstellt, oder den Betrieb von Zyklisch auf freilaufend. Das Ergebnis ist immer gleich. Irgendwas stimmt doch da nicht:-D
 
Hier besteht ein grundsätzliches Verständnisproblem. Deine Task wird alle 50ms abgearbeitet. Möchtest du, dass sich Schalterstände abwechselnd pro Zyklus automatisch ändern, so musst du dies auch programmieren. :)
 
Zuletzt bearbeitet:
AUAAAAAAA,

Ok ich glaube, ich habe meinen Kopf mal wieder zurückgeholt. Ich glaube ich hatte einen falschen Ansatz.

Ich dachte, dass der Task dazu da ist, das Programm selbstständig ablaufen zu lassen. Dass ich quasi einen Taster drücke, und dann schaltet der Task alle Schalter automatisch durch, und ich sehe ob die Lampe blinkt oder nicht. also quasi so, als ob der Task für mich das Drücken der Tster übernimmt.

1.JPG

Hier kann ich nun sehen, wie mein Programm durchschnittlich mit 5Müsec abgearbeitet wird. . Ich glaube jetzt habe ich es verstanden. Und mit der Prio kann ich eben festlegen, wann ein Task bearbeiutet wird.

Stimmt das so?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja das habe ich gemacht, aber leider sehe ich nicht, wie die Task jetzt arbeitet.
Lege ich Schalter S1 um, leuchtet die Lampe. Ok. Aber das ging ohne Task ja auch. Wo genau kommt jetzt der Task ins Spiel. Ich habe schon die Werte verstellt, oder den Betrieb von Zyklisch auf freilaufend. Das Ergebnis ist immer gleich. Irgendwas stimmt doch da nicht:-D
Du solltest Dir erstmal eine Doku zur Funktionsweise einer SPS durchlesen.
Task heißt übersetzt Aufgabe und stellt vereinfacht ausgedrückt einen Container dar in den auszuführende Programme (Die Aufgabe/n) gelegt werden. Über die Konfiguration der Task wird nun festgelegt, wie die Programme ausgeführt werden sollen, einmalig oder wie in Deinem Fall Zyklisch, also immer wieder. Das die Task arbeitet siehst Du daran, dass Dein Programm etwas tut. Du betätigst einen Schalter und in Deinem Programm wird die Ausgangsvariable entsprechend gesetzt. Übrigens soweit Du nicht einen Schalter und die Lampe auf die selbe Variable gelegt hattest wäre ohne Task nichts passiert. Ach ja, bei drei Schaltern kannst Du kein XOR nehmen, allerdings ist das dann auch (meine ich) keine Wechselschaltung mehr.
Es stimmt übrigens alles. Nur weil Du keinen Unterschied siehst heißt das nicht, dass es nicht läuft. Eine zyklische Task wir regelmäßig ausgeführt und zwar immer nach der eingestellten Zeit. Eine freilaufende Task wird erneut ausgeführt sobald sie durchgelaufen ist ohne eine eventuelle Pause.
 
Der Unterschied ist theoretisch wenn du vorher 21ms Impulse erzeugt hast, wurden die vom Programm erfasst, das wäre jetzt nicht mehr der Fall.

Freilaufend heißt dein Programm wird nach dem Ausführen Theoretisch wieder direkt gestartet. Praktisch werden da noch andere Tätigkeiten wie die Lokalbusabfrage dazwischengeschoben. wenn das Programm z.B. 3ms läuft kann es sein, das der zweite Programmaufruf schon nach 5ms wieder angestoßen wird.

Zyklisch heißt, das Programm wird alle 50ms aufgerufen und abgearbeitet. Also bei 50ms, dann wieder bei 100ms .....

Bei deinem Programm jetzt macht das noch wenig Sinn, aber bei großen Programmen kannst du damit die Performance so einstellen, dass z.B. ein Regler sehr schnell ausgeführt wird, bei einer Lampenansteuerung wirst du den Unterschied von 20ms auf sagen wir mal 500ms gar nicht merken.

Wo eine Schnelle Zykluszeit noch Sinn macht, ist z.B. bei der Abfrage von Tastern. Wenn du hier den Zyklus auf 500ms stellst, wird dein Taster nicht mehr immer funktionieren.

Ich hoffe das hilft dir weiter.

Gruß

Mavorkit
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Programmiere einen "Zykluszähler": z.B. eine UINT- oder INT-Variable in jedem Zyklus inkrementieren (ADD 1) und beobachte den Wert der Variable. Der müsste sich dann je Sekunde um 20 erhöhen - so siehst Du daß die Task alle 50ms ausgeführt wird.

Zykluszähler Code in ST:
Code:
MyCounter := MyCounter + 1;

Harald
 
Danke euch, jetzt habe ich es verstanden. Ich stand wirklich auf dem Schlauch.

Eine Frage habe ich jedoch noch. Ich haabe ja in meinem Task eingegeben, dass er eine Zykluszeit von 50ms haben soll.

In dem letzten Bild was ich euch geschickt habe, sieht man ja die Überwachung. Mich wundert es, dass dort eine durchschnittliche Zykluszeit von 5microsekunden steht. Oder hat dieser Wert ncihts mit meiner ein gestellten Zeit zu tun?

Wo eine Schnelle Zykluszeit noch Sinn macht, ist z.B. bei der Abfrage von Tastern. Wenn du hier den Zyklus auf 500ms stellst, wird dein Taster nicht mehr immer funktionieren.
Hat das mit dem Prellen zu tun?
 
Deine Task wird alle 50ms abgearbeitet. Die Bearbeitung der Task dauert aber nur 5us. Umso umfangreicher dein Programm ist, umso länger wird die Bearbeitung der Task benötigen.
 
Zurück
Oben