Step 7 SCL CASE-Anweisung mit Flankenauwertung

STEP7_NEWBEE

Level-2
Beiträge
141
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo an Alle,

Ich habe vor kurzem mit SCL begonnen und bin gerade bei einem grundlegenden Problem hängen geblieben:


CASE "SCHRITTMERKER" OF

2: stat_Edge2:= "Achse_B".d.RD_PZD_Nsoll.MeldW.SpindelPos_erreicht AND NOT Merker_Flanke_2;

IF(stat_Edge2=TRUE) THEN

OFFSETWINKEL:=45;
SCHRITTMERKER_SPINDELPOS:=3;
END_IF;
;

3:
TEST:=TRUE;
;

END_CASE;

Das Verhalten, welches ich mir erwartet hätte ist, dass die IF-Bedingung bei einer steigenden Flanke von "SpindelPos_erreicht" erfüllt ist, der Offsetwinkel=45 ist und im Schrittmerker:= 3 steht. Beim nächsten Durchlauf somit in den Schritt "3" (INT) (TEST:=TRUE setzen) gesprungen wird.

Das Verhalten welches ich beobachte ist, dass sobald die positive Flanke gekommen ist, das Programm in den Schrittmerker zwar 3 einträgt ( Schrittmerker =3) jedoch anschließend in diesem Schritt hängen bleibt? - der Schritt "3" (TEST:=TRUE setzen) dadurch nicht aufgerufen wird.

kann mir jemand sagen, wo ich hier aufpassen muss? bzw. welchen Fehler ich gemacht habe?


eine andere Frage hätte ich noch bezüglich eurer Programmstruktur:

Wie strukturiert ihr eure SCL Programme, dass diese besser lesbar werden ? gibt es in SCL auch solche Dinge wie "Netzwerke" / Bereichsüberschriften usw.
vl. hat hier jemand einen Tip....;)

LG
 
Zuletzt bearbeitet:
Hallo DeltaMike,

ohh sry, dass war ein Tippfehler von mir:

Also ich schreibe in Case 2 direkt in die Case Variable "SCHRITTMERKER_SPINDELPOS" ;)

CASE "SCHRITTMERKER_SPINDELPOS" OF

2: stat_Edge2:= "Achse_B".d.RD_PZD_Nsoll.MeldW.SpindelPos_erreicht AND NOT Merker_Flanke_2;

IF(stat_Edge2=TRUE) THEN

OFFSETWINKEL:=45;
SCHRITTMERKER_SPINDELPOS:=3;
END_IF;
;

3:
TEST:=TRUE;
;

END_CASE;
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
in Schritt 2 bleibt die Kette leider hängen...

Die Variable Test war einmal ein Bit in einem Datenbaustein,
dann ein Merker, dann hab ich versucht in ein Merker Wort einen Wert einzutragen...
alles ohne Erfolg...

und wenn ich online gehe, bleibt das Programm in Schritt 2
 
Zuletzt bearbeitet:
Eine Flankenauswertung ist im Schritt 2 gar nicht notwendig, da dieser Schritt bei Erfüllung der Bedingung ohnehin zum nächsten Schritt weiter schaltet. Der Flankenmerker würde an dieser Stelle auch nicht nachgeführt werden.

Also einfach:
Code:
2:[INDENT][COLOR=#333333]IF [/COLOR][COLOR=#333333]"Achse_B".d.RD_PZD_Nsoll.MeldW.SpindelPos_erreicht[/COLOR][COLOR=#333333] THEN[/COLOR][/INDENT]
[INDENT=2][COLOR=#333333]OFFSETWINKEL:=45;[/COLOR]
[COLOR=#333333]SCHRITTMERKER_SPINDELPOS:=3;[/COLOR][/INDENT]
[INDENT][COLOR=#333333]END_IF;

[/COLOR][/INDENT]


in Schritt 2 bleibt die Kette leider hängen...

Die Variable Test war einmal ein Bit in einem Datenbaustein,
dann ein Merker, dann hab ich versucht in ein Merker Wort einen Wert einzutragen...
alles ohne Erfolg...
Ihr arbeitet gemeinsam an dem Thema?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Onkel Dagobert,

ja wir arbeiten gemeinsam daran.. ;)

Wollten über das Zustandsbit eine Flanke in SCL auswerten, nicht das dieser
Schritt übersprungen wird, weil eventuell noch ein alter Status von "SpindelPos_erreicht"
anliegt...
 
danke für den Tip!..

ist es hier gar nicht möglich, dies über ein abfragen der Flanke zu erreichen?
bzw könntest du deinen Satz von oben, vl etwas näher ausführen..

"Der Flankenmerker würde an dieser Stelle auch nicht nachgeführt werden." .. da hat sich bei uns
anscheinend eine kleine Wissenslücke eingeschlichen..

lg
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
stat_Edge2:= "Achse_B".d.RD_PZD_Nsoll.MeldW.SpindelPos_erreicht AND NOT Merker_Flanke_2;
IF(stat_Edge2=TRUE) THEN[INDENT]OFFSETWINKEL:=45;
SCHRITTMERKER_SPINDELPOS:=3;[/INDENT]
END_IF;

[COLOR=#ff0000]Merker_Flanke_2 := "Achse_B".d.RD_PZD_Nsoll.MeldW.SpindelPos_erreicht;
[/COLOR]

Also, zumindest kann eine Flankenauswertung an dieser Stelle zu Kopfschmerzen führen. Damit eine Flankauswertung überhaupt funktioniert, muss der Flankenmerker nachgeführt werden, siehe markierte Zeile. Diese hatte bei dir übrigens gänzlich gefehlt, fällt mir gerade auf.

Normalerweise wird der Impuls "stat_Edge2" im Folge-Zyklus nachdem er true wurde, wieder false. Ein Impuls sollte auch immer nur für einen Programm-Zyklus high sein. Das geschieht über die Nachführung der Flankenmerkers. Da der Schritt 2 im nächsten Zyklus bereits nicht mehr bearbeitet wird, bleiben "stat_Edge2" und auch der Flankenmerker unverändert. Sie werden erst wieder bearbeitet, wenn die Schrittkette erneut in den Schritt 2 kommt. Der Flankenmerker hat dann aber nicht den Zustand vom vorherigen Programm-Zyklus, sondern den von dem letzten Durchlauf der Schrittkette. In deinem Fall wäre der Flankenmerker zu diesem Zeitpunkt zunächst immer true, was zumindest nicht im Sinne des Erfinders ist. Im harmlosesten Fall, "SpindelPos" ist bei Eintritt in Schritt 2 false, sind dann mindestens zwei Zyklen notwendig, damit ein Impuls entstehen kann. Im WorstCase ist "SpindelPos" bei Eintritt in Schritt 2 bereits true, wodurch kein Impuls gebildet werden kann, da der Flankenmerker noch aus dem letzten Durchlauf true ist. Ok, mit einem zusätzlichen Schritt, wie von mir vorgeschlagen, wäre das Verhalten letzten Endes auch nicht anders, aber weniger verwirrend.

Wenn unbedingt mit einer Impulsbildung mit Flankenmerker gearbeitet werden muss, dann würde ich die Impulsbildung außerhalb der case-Anweistung platzieren und im Schritt nur den Impuls abfragen. Das wäre dann wieder eine sauberer Lösung.
 
Zurück
Oben