FB als PRG mit eigenem Task

forellengarten

Level-1
Beiträge
217
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Twincat2, Beckhoff CX9010.

Hallo,
ich komme irgendwie mit folgendem Problem nicht weiter: ich habe ein Programm (MAIN) mit vielen FB's etc. Einer dieser FB setzt ein paar global deklarierte Variablen, die im Systemmanager als Digitalaus.- und Eingang gesetzt/gelesen werden.

Nun ist erwünscht, daß dieser eine FB mit einer kürzeren Taskzykluszeit als MAIN arbeitet. Daher habe ich versucht, diesen FB in ein PRG umzuändern und ihm einen eigenen Task zuzuordnen. Zu Testzwecken anfangs die gleiche Taskzykluszeit wie das (MAIN)-Programm. Das seltsame ist, dass dieses neu entstandene PRG so nicht mehr funktioniert. D.h. es macht den Eindruck, als würde es von niemanden aufgerufen, da keine Variablen gesetzt/rückgesetzt werden bzw. sich die angeschlossene Hardware einfach undefinierbar verhält (ich verstehe die Basics und kann Tasks einfügen und mit dem Taskmanager umgehen).

An der Taskzykluszeit liegt es ziemlich sicher nicht (viele Versuche gemacht). Die FB-Software ist auch lediglich in ein PRG umgewandelt damit als Task ausführbar. Eines kommt mir jedoch seltsam vor: Im Systemmanager liegen die Variablen (logischerweise) noch immer unter MAIN.DigitalXYZ. Doch eigentlich werden die Variablen ja von meinem neuen PRG gesetzt und sollten daher unter PRG_DAS_FRUEHER_EIN_FB_WAR.variableXYZ stehen. Ich vermute dass hier der Fehler liegt. Weiß aber nicht wie ich ihn da korrigieren kann.

In einem weiteren Anlauf habe ich die globalen Variablen in das PRG_DAS_FRUEHER_EIN_FB_WAR reingepackt und nur lokal deklariert, und im Systemmanager neu Verknüpft. Das PRG_DAS_FRUEHER_EIN_FB_WAR wird als eigener Task ausgeführt. Und wieder - das Programm läuft nicht. Jetzt bin ich mit meinem Latein am Ende. Bin ich Online auf der Steuerung und aktiviere "Ablaufkontrolle", so ist keine Zeile in meinem Programm grün markiert.

Wo liegt hier nur der Hund begraben.
 
1. Du musst die EA Variablen im Systemmananger deinem neuen Task zuordnen.
Das machst du unter dem Punkt SPS Konfiguration. Dort markierst du die Variablen für den 2ten Task. Mit einem Rechtsklick kannst du dann im Menü unter "Move to" oder auf dt. sicher "Verschieben zu" den anderen Task auswählen. Die markierten Variablen sind dann diesem Task zugeordnet.

2. Die Ablaufkontrolle funktioniert immer nur für einen Task, genau wie Breakpoints (glaube ich). In der Task Konfiguration hast du ja schon den ja schon den Programmaufruf für den zweiten Task festgelegt. Mit einem Rechtsklick auf den Task kannst du ihn zum "Debug Task" machen. Dann funktioniert auch die Ablaufkontrolle wieder (aber dafür nicht mehr im ersten Task).
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke MasterOhh, *vde*
denke das wird die Lösung. Ich kann die Variablen tatsächlich verschieben. Aber funktionieren tut trotzdem genauso wenig wie zuvor. Nach dem Verschieben der Variablen in den neuen Task wird automatisch ein Kommentar in die Kommentarzeile eingefügt: Variable des IEC61131 Projekts "LURF". Aufgefrischt mit Task "MAIN". Doch genau das ist es was ich nicht haben will.
 
Zuletzt bearbeitet:
Hmmm ich sitze selber gerade an einem Projekt bei dem ich mehrere Tasks nutze. Bei mir hat das keine großen Probleme gemacht. Ich werd morgen auf Arbeit mal schaun ob man da noch was beachten muss.
 
Laufen die beiden Tasks denn überhaupt, d. h., tut sich was bei internen Variablen?
Wenn die neue Task eine kürzere Zykluszeit haben soll, braucht sie auch eine höhere Priorität als MAIN. Daran gedacht?
 
Okay, falls sonst noch jemand damit mal kämpfen sollte (hier meine Erfahrung):
- Zykluszeiten sind unabhängig von Task-Priorität. Ein schneller Task darf auch eine geringere Priorität haben als ein langsamer.
- ansonsten so wie von MasterOhh beschrieben. Bei mir jedoch erst erfolgreich nachdem Bootprojekt erstellt wurde und SPS neu gestartet (Zufall?). Ein reines "alles bereinigen" etc, "alles übersetzen" hat mehrmals nicht zum Ziel geführt.
 
Jo das mit der Taskpriorität hatte mich auch gewundert, da es bei mir auch immer Funktioniert wenn der schnelle Task eine niedrigere Priorität hatte.
Wenn ich die Aussagen im Infosys richtig deute, hat die Taskpriorität damit zu tuen welcher Task beim Start der SPS zuerst ausgeführt wird.

Schön das es jetzt bei dir Löpt!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo ihr,

mag sein, dass es scheinbar funktioniert, wenn die schnelle Task eine niedrigere Priorität hat.
Nur ist es so, dass die schnelle Task von der langsamen mit höherer Priorität immer wieder unterbrochen wird!
Höchst wahrscheinlich, ist das angestrebte Ziel dann nicht erreicht. :rolleyes:

Gruß
Chräshe
 
- Zykluszeiten sind unabhängig von Task-Priorität. Ein schneller Task darf auch eine geringere Priorität haben als ein langsamer.
Nein! Wie Cräshe schreibt, funktioniert es nur scheinbar. In einem Echtzeit-Multitaskingsystem läuft von allen Tasks, die Rechenzeit anfordern, immer die mit der höchsten Priorität. Wenn die schnelle Task eine niedrigere Priorität hat, kann sie die langsame Task nicht unterbrechen und hat "Aussetzer". Nicht auffallen tut das nur, wenn die von beiden Tasks zusammen benötigte Rechenzeit kürzer als die Zykluszeit der schnellen Task ist.
 
Hattest schonmal Probleme deswegen? Ich habe zusätzliche (schnellere) Tasks bisher immer nur für Kommunikations-Aufgaben und den ein oder anderen Reglerbaustein gebraucht und da nie auf die Prioritäten geachtet. Selbst in der Anleitung für die RS232 Kommunikation von Beckhoff gehen die mit keinem Wort auf die Prioritäten ein (Ok das muss bei den Beckhoff-Dokus im allg. nichts heißen ;) )

Ne Idee wie ich herausfinden kann ob mein schneller Task tatsächlich vom langsamen unterbrochen wird?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
nach etwas Recherche im Infosys scheint das tatsächlich so zu sein:
[h=4]Priorität[/h]Priorität der jeweiligen Task im TwinCAT System. Außerdem wird in dieser Spalte die Taskart durch unterschiedliche Icons differenziert. Siehe hierzu auch die Erläuterungen zur Spalte Task. Je kleiner die hier angegebene Zahl ist, desto höher ist die Priorität der Task innerhalb des TwinCAT Systems

Mist. Ich hätte gern einen schnellen Task, der soll aber den langsamen nicht überschneiden, da dieser eigentlich wichtiger ist....
 
Ne Idee wie ich herausfinden kann ob mein schneller Task tatsächlich vom langsamen unterbrochen wird?
Dazu kannst Du das SYSTEMTASKINFOARR befragen. Wenn bei der schnellen Task "cycleTimeExceeded" manchmal TRUE wird, obwohl "lastExecTime" nie grösser als die eingestelte "cycleTime" wird, wird die Task nicht jedesmal in ihrem Zeitraster aufgerufen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nach meiner Logik kann ein schneller, unwichtiger Task (niedrige Priorität) einen Task mit hoher Priorität nicht unterbrechen. Bin aber schon bekehrt :TOOL: und habe verstanden dass es eben anders funktioniert. Schneller Task = hohe Priorität. Langsamer Task geringe Priorität.
 
Zurück
Oben