Frage Flanken über zwei Tasks

Beiträge
432
Reaktionspunkte
18
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

Frage an die Spezialisten, die mich schon länger beschäftig.

Folgendes:
Der Ausgang .Q eines R_Trigs ist ja bekanntlich nur einen Zyklusdurchlauf aktiv.

Wenn ich jetzt 2 PLC_PRGs habe, beide in einem anderen Task (Zeiten und Prios mal nicht beachtet) , kann ich dann den Ausgang Q. vom R_trig von PLC.PRG1 im PLC.PRG2 erfolgreich verarbeiten?
Der Ausgang .Q zeigt auf eine Globale Variable und diese Variable wird im PLC.PRG2 eingelesen.

Wie verhalten sich Flanken von über mehrere Tasks, meiner Meinung nachist das Blödsinn...

Danke schon mal.
 
Stell Dir vor, Du hast Task 1 mit tzyk=3× Task2
In 1 wird der trig aufgerufen, in 2 der Q verarbeitet. Dann kann der Q in 2 3 Zyklen lang aktiv sein, was zu unschönen Effekten führen kann.
Im umgekehrten Fall noch unschöner, da er u.U garnicht ausgewrtet werden kann.

Besser separat Flanken erfassen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi danke erstmal.

Was meinst du mit besser separat verarbeiteen genau?
Ich verstehe deine Erklärung und habe genau das in Verdacht.
Ich hätte jetzt die beiden PLC.PRG in einen Task gepackt. Dann sollte das Problem behoben sein.

Das PRG welches den.Q verarbeitet ist eine kleine Modbus Joblist welche die Flankenbefehle sofort ohne Verzögerung abarbeitet.
Die Steuerungen sind 2 Wagos.

Der Taks wo die Flanke instanziert ist hat prio10 und 50ms intervall und der Task wo .Q ausgewertet wird hat prio 13 und 30ms intervall.
 
ansonsten bei trigger eine variable für die andere Task setzen und dann in der anderen task variable lesen und löschen.
 
Also mit dem Thema habe ich 20 Jahre Erfahrung, weil ich schon im TwinCAT2 fast immer alle 4 Taskscheiben genutzt habe. So ein .Q kannst du nur pro Task benutzen. Alles anderen wird irgendwann mal ein Zyklus nicht funktionieren! Selbst wenn der "Q" in einem langsamere Task läuft - sollte der langsamere meistens eine niedrigere Prio haben (wird von den schnelleren unterbrochen...), wäre es mir zu unsicher das man eine Flanke verpasst.
 
Was meinst du mit besser separat verarbeiteen genau?
In jeder Task einen r_trig instanzieren und nur in dieser Task verwenden.
Aber Du hast das Problem gelöst.

Mehrere Tasks muss man sich gut überlegen. Oft ist es nur eine unterschiedliche Zykluszeit, die man will. Das lässt sich gelegentlich auch lösen, indem man das mit der geringeren Aufrufhäufigkeit bedingt nur jeden x. Zyklus im Hauptprogramm aufruft.

Bei Problemen mit der Gesamtzykluszeit kann das manchmal durch wechselseitiges Nichtbearbeiten von unkritischen Programmteilen gelöst werden.
 
Zuletzt bearbeitet von einem Moderator:
@idtell.

Du meinst damit das handshake Prinzip oder?
Also statt dem .Q eine variable bei trigger von.Q in zweiten Task setzen, hier auch das Setzen abfragen und bei erfolgreichen Setzen bei Zyklusende des zweiten Tasks die Hilfsvariable im 1. TASK zurücksetzen.?
Ist aufwendig, da ich mehrere solcher Projekte bekommen habe und es ca. 20 Flanken teilweise auch Tastbefehle sind.
Ich gucke erstmal, das ich das alles in einen Task bringe. Mal schauen wie dann die Zykluszeit sich verhält. Es werden aber nur ein paar Register gelesen und geschrieben.
Ich glaube das ist die einfachste Lösung.

Dann sollte das alles erledigt sein, normal spricht da nix dagegen....
 
Zurück
Oben