# Codesys 2.3 Tasks



## Beck (22 September 2016)

Hallo,
ich versuche die Taskkonfiguration in Codesys zu verstehen.

Ich habe zwei tasks: den Haupttask PLC_PRG und einen Loggingtask.
Ersterer soll so schnell und oft wiederholt werden wie möglich, daher habe ich hier "freilaufend" gewählt:


Das Logging hingegen soll nur einmal pro Minute aufgerufen werden:



Innerhalb der Loggingroutine schreibe ich in eine SQL-Datenbank. Bei Datenabfrage habe ich mich gewundert, warum alle 1 bis 2 Sekunden ein Eintrag zu verzeichnen ist.
Ich stellte dann fest, dass Logging viel häufiger aufgerufen wird als PLC_PRG:


Wer hat dafür - ohne weiteren Quellcode -  eine Erklärung?


----------



## KingHelmer (23 September 2016)

Hi Beck,

was mir zunächst auffällt ist, dass du 2H (120 Minuten) als Zykluszeit eingetragen hast für deinen Loggin Task.
Zu deinem Problem: Ich könnte mir vorstellen, dass 120 minuten als Zykluszeit einfach ignoriert werden, müsste man mal in der Doku nachlesen.

Wieso geht du nicht her und machst den Task ereignisgesteuert und definierst einfach eine Variable, die einmal pro Minute ein True bekommt?
Wäre meines Erachtens einfacher und eleganter.

Grüße, 
Flo


----------



## holgermaik (23 September 2016)

Hi Beck

Die maximale zyklische Aufrufzeit ist Zielsystemabhängig. Bei Wago 750-880 ist sie 30 Minuten.



> Ersterer soll so schnell und oft wiederholt werden wie möglich, daher habe ich hier "freilaufend" gewählt:


Die ist ein Irrtum. Freilaufend hat die niedrigste Priorität und wird von jedem anderen Task unterbrochen. Die Eingabe einer Priorität wird dabei ignoriert.
Holger


----------



## mnuesser (21 September 2017)

Heb nochmal aus der Versenkung...

Spricht denn irgendwas dagegen einen freilaufenden Task zu machen?
Würde dann doch eher einem "OB1" aus der Siemenswelt entsprechen oder?

Aktuell habe ich zwei Tasks laufen, einen für das Modbus-Datenhandling,
und einen der mir meine Reststeuerung abhandelt.

Beide sind Fix, der PLC_PRG läuft im 10ms Raster, wobei ich mal gerne wissen würde,
wie lange der TASK läuft... ich habe die Vermutung dass ich ab und an an die Grenze stosse,
und der Task selber länger wie 10ms läuft. Ab und an reagieren nämlich die KNX-Taster erst beim zweiten
mal Tasten. Dann könnte ich diesen Task in freilaufend ändern und gut is.


----------



## holgermaik (21 September 2017)

Hallo Markus
Mache ich auch so. Zeitkritische Sachen in seperaten Task mit fester Zeit und den Rest freilaufen.
Zur Zykluszeit und der Überwachung ist hier Noch einmal: 750-880 (881) Zykluszeitüberwachung  alles beschrieben.
Holger

Nachtrag: Wenn dein Modbustask wesentlich schneller läuft und deine Signale nur 1 oder 2 Zyklen anstehen könntest sie sie eventuell nicht mitbekommen.


----------



## Chräshe (21 September 2017)

Der Freilaufende Task war bei WAGO mit Web-Visu problematisch, weil die SPS zwar schell war, für die Bearbeitung der VISU im Hintergrund aber das Zeitfenster zu klein wurde. 

Warum muss die Home-Automation zwingend mit 10ms laufen?
Bei 20ms sollte man auch noch nicht beobachten können, dass das Licht eine Halbwelle später an geht. 

Ein extra Task, kann eine Lösung sein, wenn ein kleiner Programmteil viel schneller reagieren muss, als der Rest. Dabei gibt es aber einiges zu beachten wie z.B. die Daten-Konsistenz.
Unproblematischer ist, wenn man ohne auskommt.


----------



## StructuredTrash (21 September 2017)

mnuesser schrieb:


> Spricht denn irgendwas dagegen einen freilaufenden Task zu machen?
> Würde dann doch eher einem "OB1" aus der Siemenswelt entsprechen oder?


Da sind Frage und Antwort sehr nahe beieinander, oder?


----------



## mnuesser (21 September 2017)

grade mal auf freilaufend konfiguriert, und nen 250ms watchdog gemacht... zack ausgelöst... watchdog ausgemacht, da seh ich regelmässig ne zykluszeit von 1700ms... kann das was mit den netzwerkvariablen zu tuen haben, die ich vor kurzem zum testen eingefügt habe? das ist erst so träge seid dem die drin sind...

Nachtrag:
Jab die Netzwerkvariablen gelöscht, schon ist die Zykluszeit bei 5-12ms...
Ich denke ich hatte das senden bei Wertänderung aktiviert, und mein Watchdog ist nen dint, welcher pro zyklus +1 wird, also ne wertänderung, und dann senden möchte...
Denke da ist ein Zykliches Senden alle 100ms vollkommen ausreichend...


----------



## mnuesser (21 September 2017)

Ok, das war es...
Hab jetzt die Netzwerkvariablen wieder neu eingefügt,
Zyklisches senden auf t#100ms gesetzt, läuft jetzt passend 

Frage: Muss der Modbus-Task bei 5ms liegen? kommt mir was schnell vor...
Hab da jetzt nur Ausgänge dran hängen... Ist ne Ethernet-ET von Wago...


----------

