Tasks abwechselnd aufrufen

jauer

Level-1
Beiträge
10
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich bin noch recht neu in der CODESYS-Programmierung und möchte nun ein Prüfprogramm für meine Steuerungshardware und die angeschlossenen Feldbusse schreiben. Dabei habe ich die IOs des Feldbus-Slaves miteinander verbunden, sodass die Ausgangsbits auch in der selben Reihenfolge am Eingang anliegen.

Allerdings habe ich jetzt ein Problem...Und zwar:

Ich möchte in einem Task ein bestimmtes Bitmuster über den Feldbus aussenden und dann in einem anderen Task das ankommende Bitmuster überprüfen. Dabei möchte ich dies abwechselnd tun (Ablauf: 1. Task Bitmuster Senden, 2. ankommendes Bitmuster abgleichen, 3. Bitmuster senden, ....).
Ich weiß aber nicht, wie ich die Tasks abwechselnd aufrufe, sodass beim Aufrufen des Einen Tasks der andere Task nicht ausgeführt wird.

Kann mir hier jemand weiterhelfen? Über Antworten wäre ich sehr dankbar.

Ich nutze CODESYS 3.5.17.20
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke für die schnelle Antwort @Heinileini. So weit war ich zum Glück schon.

Mein Problem liegt darin, die Tasks aufzurufen. Gibt es hierzu vordefinierte Funktionen oder Befehle?
Und wo würdest du den oben genannten Code reinschreiben? In einen dritten Task?
 
Warum bitte schreibst Du von Tasks? Warum müssen das verschiedene Tasks sein und nicht zwei Funktionen / Funktionsblöcke in einem Programm?

Falls Du zwei Tasks benötigst: Innerhalb eines Programms anlegen und bTask1 als globale Variable anlegen, dann kannst Du von beiden Tasks drauf zugreifen.

Am Anfang jeden Tasks machst Du ein Return, wenn Du nicht dran bist. Und am Ende invertierst Du bTask1 jeweils.
 
Ich habe das Problem, dass ich beim Aufrufen von Funktionsblöcken mit den Funktionen "Datenstrom erzeugen" und "Datenstrom überprüfen", das Problem habe, dass die Werte nicht immer übereinstimmen und mir bei der Überprüfung somit ein Bitfehler ausgegeben wird.

Ich habe es darauf zurückgeführt, dass die Aktualisierung der neuen Werte auf dem Bus erst bei Beendigung des Tasks erfolgt, weshalb ich zwei Tasks benötige, die abwechselnd laufen, um für jeden Prozess immer die aktuellen Werte vom Bus zu erhalten.
 
Entweder Statusbits oder eine Totzeit von X Zyklen zwischen den beiden Aufrufen.

Ist ja klar: Daten müssen zum Slave geschrieben werden, der muß die verarbeiten und schalten, dann müssen die Signale detektiert und wieder zurückgeschickt werden. Da würde ich wenigstens mal von 1-3 Zyklen ausgehen, die vergehen, bis die Signale sauber eingelesen werden können. Je nach Zyklus- und Busgeschwindigkeit.
 
Statusbits gibt es bei meinem Slave leider keine, die ich abfragen könnte.
Gibt es eine Funktion/Anweisung mit der ich eine bestimmte Anzahl an Zyklen abwarten könnte bis ich die Daten wieder einlese (Zum Beispiel über eine IF-Bedingung, etc.)?
 
Ich habe es implementiert und es läuft, ohne mir einen Übertragungsfehler zu generieren 🤞. Jetzt noch ein paar Kleinigkeiten ausbessern, dann sollte es funktionieren.
Vielen Dank :)
 
Zurück
Oben