[gelöst]F_Trig wird in ST nicht ausgeführt

marsmännchen

Level-2
Beiträge
110
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,
ich will mich näher mit ST auseinandersetzen.
Eine einfache Frage wenn man Ahnung von ST hat:
Ich schreibe mit xUGS001_02_RO_LONG_F_TRIG.CLK:=Control_RollUG.xUgS001_02_RO_LONG;
den langen Tastendruck von Control_RollUG.xUgS001_02_RO_LONG in den CLK vom F_TRIG Baustein.
Wenn ich den Taster los lasse wird der Q vom F_TRIG aber nicht 1.
Das ganze aber so wie im Screenshot.
Ist das irgendein Problem mit Zykluszeit oder wegen der IF abfragen?
Ganz versteh ich das nicht.
MfGPatrickf_Trigg.JPG
 
Wenn ich den Taster los lasse wird der Q vom F_TRIG aber nicht 1.
...
Ganz versteh ich das nicht.
Woran würdest Du denn merken, wenn der Q doch 1 wird?
Wenn ich mich nicht verguckt habe, setzt Du dann 5 Bits auf TRUE und direkt anschliessend dieselben 5 Bits wieder auf FALSE.
Was soll denn hier wirklich passieren? Ganz verstehe ich das auch nicht ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also es geht so weiter das ich Q erstens auf einen CTU führe seit ich bemerkt hab das er nicht 1 wird,und zweitens soll er die 5 Triggerbits kurz auf true setzen.

Grundsätzlich soll das wenn man einen Taster drückt zuerst die Byte übertragen(....SetPos) und dann beim Auslassen des Tasters den Trigger absetzen.
 
Irgendwo (z.B. zwischen dem Beschreiben des .CLK und der Auswertung des .Q) musst Du den F_TRIG auch mal aufrufen: xUGS001_02_RO_LONG_F_TRIG();
oder noch besser
xUGS001_02_RO_LONG_F_TRIG(CLK:=Control_RollUG.xUgS001_02_RO_LONG);
Nur durch die Manipulation der Eingänge einer Instanz von außen ändern sich nicht die Ausgänge der Instanz.

Harald
 
Es ist ja schön, dass Du den CLK Eingang mit Leben füllst und den Ausgang Q abfragst, aber wo wird der F_TRIG denn mal ausgeführt?
Damit der Ausgang des F_TRIG schaltet muss er ja auch aufgerufen werden.

Aaargh, Harald, da hast Du mich um Sekunden geschlagen.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja, genau!! der Aufruf hat gefehlt!! So funktioniert das also.
Jetzt habe ich nur die ganzen ...TriggerPos:=FALSE entfernen müssen damit sie auf TRUE gesetzt werden.
Dadurch sind sie jetzt dauernd TRUE. An welcher Stelle oder wie setze ich die wieder auf False?
Weder in der IF schleife, noch außerhalb kann ich sie lassen da es sonst nie TRUE wird. Oder werden die eh TRUE? Nur einen Zyklus? und der ist vielleicht zu kurz?
 
Anstatt dem IF-Konstrukt zum TRUE-Setzen und noch etwas weiteres zum FALSE-Setzen weise einfach den .Q an die Variablen zu, dann werden sie für genau einen Zyklus TRUE:
Code:
xUGRollWZRTrigPos := xUGS001_02_RO_LONG_F_TRIG.Q;
...

Übrigens: ein IF-Konstrukt ist keine Schleife...

Harald
 
Da zumindest meine Glaskugel mal wieder in Reparatur ist muss ich raten. Ich weiß nicht, was die Variablen bewirken sollen, aber sie heißen alle Trigger und Trigger sind meist nur einen Zyklus aktiv, ob das in Deinem Fall jetzt auch so ist und reicht weiß ich nicht. Sollte dem so sein könntest Du alle mit Q des F_TRIG verknüpfen, dann wären Sie bei fallender Flanke für einen Zyklus TRUE. Reicht das nicht, einfach eine TP hinzufügen mit einer ausreichend langen Impulszeit und zum Start den Q des F_TRIG nutzen, aber auch hier an den Aufruf denken.
Wenn Du die If-Anweisung (Ist übrigens keine Schleife, das sind For oder While) behalten willst, kannst Du einen Else-Zweig einfügen und da die Variablen wieder auf FALSE setzen.
 
Zuletzt bearbeitet:
Perfekt, danke!
So hab ich es gemacht, und so funktioniert es auch ohne IF Anweisung.

xUGS001_02_RO_LONG_F_TRIG(CLK:=Control_RollUG.xUgS001_02_RO_LONG);
xUGRollWZRTrigPos:=xUGS001_02_RO_LONG_F_TRIG.Q;
xUGRollWZLTrigPos:=xUGS001_02_RO_LONG_F_TRIG.Q;
xUGRollWaschTrigPos:=xUGS001_02_RO_LONG_F_TRIG.Q;
xUGRollFranzTrigPos:=xUGS001_02_RO_LONG_F_TRIG.Q;
xUGRollTerrTrigPos:=xUGS001_02_RO_LONG_F_TRIG.Q;

IF Control_RollUG.xUgS001_02_RO_LONG THEN
byUGRollWZRSetPos:=byPosClosed;
byUGRollWZLSetPos:=byPosWZLCAT;
byUGRollWaschSetPos:=byPosClosed;
byUGRollFranzSetPos:=byPosClosed;
byUGRollTerrSetPos:=byPosClosed;


END_IF
Vielen Dank für das learning!
 
Zurück
Oben