Step 7 Flanke in SCL

spirit

Level-1
Beiträge
961
Reaktionspunkte
23
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,

ich benötige in einer Schrittkette einen Flankenwechsel einer LS.


Kann ich das so realisieren:

Am Anfang (ganz oben) der SK programmiere ich

#M_Wechsel := #LS AND NOT #FM;
#FM := #LS;


und dann kommt die SK mit mehreren Schritten. In Schritt 6 verfährt ein Zylinder und löst besagten Flankenwechsel aus. In Schritt 7 programmiere ich

IF #Bedingung1 AND #Bedingung2 AND #M_Wechsel THEN
--#Kette := 8;
ELSE
--#Kette := 13;
END_IF;




Frage:

Muss der Flankenwechsel direkt im Schritt 7 programmiert sein, oder geht es auch, wenn er wie oben dargestellt, am Anfang der SK programmiert ist?

Denkbar ist ja, dass dann in Schritt 8 #M_Wechsel wieder rückgesetzt wird …


Lieben Dank!
 
Zuletzt bearbeitet:
M_Wechsel hat gefälligst nirgends zurückgesetzt zu werden ausser da
Code:
[COLOR=#ff0000]#M_Wechsel[/COLOR][COLOR=#333333] := #LS AND NOT #FM;
[/COLOR][COLOR=#333333]#FM := #LS;[/COLOR]

LS ist dein zu prüfendes Signal. M_Wechsel ist dann deine Flanke welche GENAU einen ganzen zyklus ansteht, nämlich ab der Zeile nach #M_Wechsel bis das Programm genau wieder da ist. Wenn du es natürlich mutwillig irgendwo zusätzlich zurücksetzt ist es nicht mehr einen ganzen Zyklus lange anstehend.

M_wechsel fasst du im Programm also nirgendwo sonst schreibend an. Allenfalls setzt du damit einen Merker denn du irgendwo wieder zurücksetzen kannst.

mfG René
 
Zuviel Werbung?
-> Hier kostenlos registrieren
M_Wechsel hat gefälligst nirgends zurückgesetzt zu werden ausser da
Code:
[COLOR=#ff0000]#M_Wechsel[/COLOR][COLOR=#333333] := #LS AND NOT #FM;
[/COLOR][COLOR=#333333]#FM := #LS;[/COLOR]

Vielen Dank vollmi!

Das heißt auswerten kann ich die Flanke schon weiter unten (irgendwo) im Programm, aber rückgesetzt muss sie auch wieder da werden, wo sie generiert wurde.

Anders gesagt, ich muss dieses Auswertsignal #M_Wechsel ja eigentlich gar nicht rücksetzen, da es nach einem Zyklus eh nicht mehr ansteht, richtig? :confused:
 
Zuletzt bearbeitet:
Jetzt habe ich noch irgendwie einen Gedankenwurm bei dieser Sache ...

Wenn ich also (wie eingangs beschrieben) den Flankenwechsel ganz oben im SCL-Compiler programmiere und dieser Flankenwechsel erst weiter unten in der
eigentlichen Schrittkette (Schritt 6) durch Fahren eines Zylinders zustande kommt, dann kann doch im nachfolgenden Schritt 7 dieser Flankenwechsel (#M_Wechsel) noch gar nicht erkannt werden, oder?

D.h., müsste dann hier nicht immer in den Schritt 13 gesprungen werden?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Der Flankenpuls kommt natürlich erst wenn das zu überwachende Bit verarbeitet wird.

Also flankenerkennung. Bei risingEdge kommt der Puls und ist sofort in allen nachfolgenden Netzwerken gültig und dann in allen Netzwerken bis wieder zur Flankenerkennung auf TRUE.

Hier springt er also sofort in 8 weil M_Wechsel im ersten Zyklus wo IN TRUE ist ebenfalls TRUE wird.

Die Peripherie wird natürlich immer am anfang eines jeden Zyklus aktualisiert, es kommt also nicht mittendrin zwischen Flankendetektion und Auswertung der Flanke eine Zustandsänderung vor. Vorausgesetzt die Detektion ist vor der Auswertung. Und vorausgesetzt man macht keine zusätzliche Peripherieaktualisierung im Zyklus.

mfG René
 
Der Flankenpuls kommt natürlich erst wenn das zu überwachende Bit verarbeitet wird.

Also flankenerkennung. Bei risingEdge kommt der Puls und ist sofort in allen nachfolgenden Netzwerken gültig und dann in allen Netzwerken bis wieder zur Flankenerkennung auf TRUE.

mfG René

Danke für deine Erklärung Renè, aber ich verstehe es noch immer nicht. Sorry.

Die Flankenerkennung erfolgt doch ganz oben im Compiler, wenn #M_Wechsel TRUE wird. Aber zum Flankenwechsel kommt es doch erst weiter unten in einem Schritt der
Kette. Und im nachfolgenden Schritt 8 wird auf den Flankenwechsel #M_Wechsel abgefragt, der aber doch erst im nächsten Zyklus (ganz oben) entsteht ...
 
Das ist so. Aber von dem was der Zylinder auslöst kriegst du eh erst was im nächsten Zyklus was mit.
Zylinder wird in Schrit 6 angewiesen anzufahren. Wirklich anfahren tut er aber erst wenn der Zyklus beendet wurde und das Prozessabbild geschrieben wird. Jetzt fährt der Zylinder Aber das Programm beginnt ja wieder in Netzwerk1 -> 2 -> 3 etc. Und vermutlich geht das programm durch die ganzen Netzwerke jetzt einige 1000 mal bevor überhaupt der Zylinder sich nennenswert bewegt hat. Dann löst er den Schalter aus für z.B. die Endlage. Das kriegst du garantiert erst mit wenn der Zyklus wieder von Vorne beginnt. dann wird auch die Flanke ausgelöst und die wirst du dann verarbeiten und drauf reagieren.

Es passier auf keinen Fall dass du in einem Netzwerk einen Befehl für die Peripherie gibst und ein paar Netzwerke später kriegst du eine reale Rückmeldung einer physikalischen Aktion im selben Zyklus. Das passiert nicht und wenn doch dann ist das ganz übler Pfusch mit Waitstates und ausserzyklischen Peripheriegepushe.

mfG René
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das Verknüpfen des #M_Wechsel im Schritt 7 macht eigentlich wenig Sinn, weil Dein Schritt 7 wartet nicht auf den Flankenwechsel sondern verzweigt sofort in 8 oder 13. Wie ist denn Deine SK in den Schritt 7 gekommen?

Vorsicht! Verknüpfen von Signalflanken und weiteren Bedingungen im selben Schritt bringen die SK zum Festhängen in dem Schritt, wenn die Signalflanke schon kommen kann, bevor die anderen Bedingungen vollständig erfüllt sind. Wenn der Signalwechsel schon vorher kommt oder das Signal gar schon anliegt (die LS schon belegt ist) bevor der Schritt aktiv wird, dann geht die Flanke-Information verloren und muß deshalb zwischengespeichert werden oder die SK braucht einen extra Schritt nur zum Warten auf die Flanke (sequentiell oder parallel-Schritt).

Harald
 
Zylinder wird in Schrit 6 angewiesen anzufahren. Wirklich anfahren tut er aber erst wenn der Zyklus beendet wurde und das Prozessabbild geschrieben wird. Jetzt fährt der Zylinder Aber das Programm beginnt ja wieder in Netzwerk1 -> 2 -> 3 etc. Und vermutlich geht das programm durch die ganzen Netzwerke jetzt einige 1000 mal bevor überhaupt der Zylinder sich nennenswert bewegt hat.
mfG René

Ja klar, stimmt. Der Zylinder fährt nicht sofort los wenn der Schritt 6 durchlaufen wird, sondern erst, wenn das Prozessabbild geschrieben wurde.

ABER: Was passiert dann eigentlich in Schritt 7, also im nachfolgenden Schritt?

Nachdem Schritt 6 vom Programm durchlaufen wurde, "schaut" die Steuerung doch auch in den nachfolgenden Schritt 7 und findet eine nicht erfüllte Bedingung (weil ja #M_Wechsel noch FALSE ist) vor. Wird diese Information nicht sofort ausgewertet? :confused:


Das Verknüpfen des #M_Wechsel im Schritt 7 macht eigentlich wenig Sinn, weil Dein Schritt 7 wartet nicht auf den Flankenwechsel sondern verzweigt sofort in 8 oder 13. Wie ist denn Deine SK in den Schritt 7 gekommen?

Harald

Naja, das meinte ich ja! Der Schritt 7 findet eine nicht erfüllte Bedingung vor und entscheidet sofort und wartet eben nicht, bis in Schritt 7 endlich die Flankenauswertung "angekommen" ist ...

In Schritt 6 erfolgt der Fahrbefehl des Zylinders. Und wenn der INI für die AS TRUE wird, dann erfolgt der Weitersprung in den Schritt 7.


Das Ziel wäre Folgendes:

Zylinder bekommt in Schritt 6 den Fahrbefehl. Dabei wird (im positiven Fall) ein Flankenwechsel ausgelöst.

Wenn der Zylinder keinen Flankenwechsel an der LS ausgelöst hat, dann soll es zu einer Störung, bzw. Meldung kommen.


Bin ich da mit meinem Ansatz auf dem Holzweg? :confused:
 
Zuletzt bearbeitet:
Nunja wenn Bedingung_1 und 2 erfüllt sein müssen wenn der flankenpuls kommt um Kette 8 zu wählen. Dann ist das IF grundsätzlich mal richtig.
PN/DP hat natürlich recht dass sofort im nächsten Zyklus wieder Kette 13 angewählt wird. Die Frage ist. Reagierst du auf den ein Zyklus anstehenden Kette 8 und führst dann etwas aus oder brichst du sofort wieder ab wenn Kette 13 wieder angewählt wurde.

Das kommt halt ganz drauf an was man machen will.

Du könntest auf das Else verzichten und stattdessenw wieder einen Elsif draus machen und weitere Bedingungen an Kette13 knüpfen. z.B. einen Puls der die Endlage bestätigt und eine weitere Kette anfährt.

Sowas ginge z.B.
Code:
IF ZylinderZu AND M_wechsel THEN
    Kette := 8; // Zylinder auffahren
ELSIF ZylinderOffen AND M_wechsel THEN
    Kette := 9; // Zylinder zufahren
ELSIF ZylinderStoppenManuell THEN
    Kette := 12; // Zylinder stoppen
END_IF;

So kannst du mit dem Puls z.B. den Zylinder immer in die Gegenrichtung fahren lassen und zwar nur wenn er aus dem Endanschlag fahren muss.

Weiter Unten kannst du z.B. den Zylinder Stoppen wenn er die Endanschläge erreicht.

Code:
IF Kette = 8 AND ZylinderOffen THEN    
    Kette := 12; // Zylinder stoppen
END_IF;

Jetzt kannst du noch die Zeit des anstehenden Fahrbefehls auswerten an einem TON und einen Alarm auslösen wenn er zu lange ansteht.

mfG René
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nunja wenn Bedingung_1 und 2 erfüllt sein müssen wenn der flankenpuls kommt um Kette 8 zu wählen. Dann ist das IF grundsätzlich mal richtig.
PN/DP hat natürlich recht dass sofort im nächsten Zyklus wieder Kette 13 angewählt wird. Die Frage ist. Reagierst du auf den ein Zyklus anstehenden Kette 8 und führst dann etwas aus oder brichst du sofort wieder ab wenn Kette 13 wieder angewählt wurde.


mfG René

Danke vollmi,

bin hier jetzt echt überfordert ...

Wie schon geschrieben soll in Schritt 6 ein Fahrbefehl eines Zylinders ausgelöst werden. Dieser löst (im positiven) Fall während des Fahrens einen Wechsel an einer LS aus.

In den Schritt 7 wird gesprungen, wenn der INI für die AS des Zylinders erreicht wurde - und meine Idee war nun, in Schritt 7 (neben weiteren Bedingungen) ebenfalls zu prüfen, ob der Zylinder einen Flankenwechsel ausgelöst hat.

Wenn ja, dann soll in den Schritt 8 gesprungen werden und wenn nicht, dann muss die gesamte Anlage stehen bleiben und eine Meldung ausgegeben werden. Also Sprung in Schritt 0 & Meldung.

Wie könnte ich das dann in Schritt 7 besser realisieren, als ich es in meinem Eröffnungsthread vorgenommen habe?

Vielen Dank für eine bessere Idee ... ;-)
 
Vorsicht! Verknüpfen von Signalflanken und weiteren Bedingungen im selben Schritt bringen die SK zum Festhängen in dem Schritt, wenn die Signalflanke schon kommen kann, bevor die anderen Bedingungen vollständig erfüllt sind.
Harald

Aber da könnte es doch helfen, wenn ich #M_Wechsel setze und wenn in den Schritt 7 gesprungen wurde, wieder rücksetze. Somit wird das Signal der Flanke gespeichert, bis die restlichen zwei Bedingungen erfüllt sind ... Ist so ein Vorgehen ungewöhnlich?
 
Weil ich halt mit den Abkürzungen nicht so zu rande komme aber jetzt mal ohne funktionsprüfung. Das könnte man etwa so angehen.

Code:
#M_Wechsel := #LS AND NOT #FM;
#FM := #LS; // Flankenwechsel wird immer detektiert. Ob jemand drauf reagieren soll muss der Schritt entscheiden.


CASE #Schritt OF
    0:
        #init := 1;
        #fahren := false;
        // Scheisse fehler Passiert irgendwas machen
    6:
        #fahren := NOT #INI_für_AS_Erreicht; // Was immer das bedeutet
        IF #M_Wechsel THEN
            #Flanke_Beim_Fahren := true; // Flanke wird also in Schritt 6 gespeichert
        END_IF;
        IF #INI_für_AS_Erreicht THEN
            #Schritt := 7;
        END_IF;
    7:
        IF #Flanke_Beim_Fahren THEN
            // ich hab ne Flanke detektiert tu irgendwas
            // Flanke wird also nur in Schritt 7 verarbeitet
            #Schritt := 8;
            #Flanke_Beim_Fahren := false; // Da Flanke erkannt und irgendwas getan Flankenspeicher zurücksetzen
        ELSE
            #Schritt := 0;
            // irgendwas hat die LS nicht in Schritt 6 ausgelöst
            // Ini für AS wurde aber erreicht
        END_IF;
    8:
        // Flanke detektiert und in Schritt 8 Versetzt
END_CASE;


#Schrittueberwach(IN:=#Schritt = 6,
                  PT:=t#10s);
IF #Schrittueberwach.Q THEN // #Schritt 6 hat zu lange gebraucht. INI für AS wurde nicht erreicht
    #Schritt := 0;
END_IF;
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
CASE #Schritt OF

...
    
    7:
        IF #Flanke_Beim_Fahren THEN
            // ich hab ne Flanke detektiert tu irgendwas
            // Flanke wird also nur in Schritt 7 verarbeitet
            #Schritt := 8;
            #Flanke_Beim_Fahren := false; // Da Flanke erkannt und irgendwas getan Flankenspeicher zurücksetzen
        ELSE
            #Schritt := 0;
            // irgendwas hat die LS nicht in Schritt 6 ausgelöst
            // Ini für AS wurde aber erreicht
        END_IF;
    8:
        // Flanke detektiert und in Schritt 8 Versetzt
END_CASE;

Lieben Dank für deine Bemühungen mit mir, René!

Sollte man in deinem Beispiel in dem ELSE-Zweig nicht auch

#Flanke_Beim_Fahren := false;

programmieren - also wieder rücksetzen?
 
Lieben Dank für deine Bemühungen mit mir, René!

Sollte man in deinem Beispiel in dem ELSE-Zweig nicht auch

#Flanke_Beim_Fahren := false;

programmieren - also wieder rücksetzen?

Wozu? Der Else zweig wird nur ausgeführt wenn Flanke_Beim_Fahren eh nicht da ist. Wozu was zurücksetzen das nicht gesetzt ist?

mfG René
 
Wozu? Der Else zweig wird nur ausgeführt wenn Flanke_Beim_Fahren eh nicht da ist. Wozu was zurücksetzen das nicht gesetzt ist?

mfG René

Ja stimmt, wie dumm von mir! :p


... versuche das jetzt mal in meinem Programm umzusetzen.


Eines noch: Meine Überlegung aus Beitrag #13 schon das Signal #M_Wechsel zu speichern ist eher eine schlechte Option, oder?


Lieben Dank!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du mußt Dich entscheiden, ob #M_Wechsel einen Zyklus lang anzeigt, daß eine steigende Flanke der Lichtschranke stattgefunden hat (wie die Zuweisung und der Name suggeriert), oder ob Du schon vorher #M_Wechsel rücksetzt und die Programmteile nach dem Rücksetzen die Flanke nie mitkriegen werden. Späteres Rücksetzen eines vorher woanders per = zugewiesenen Signals ist aber ein sehr schlechter Stil. Da leite besser aus dem #M_Wechsel eine zweite Variable ab, mit der Du dann den Flankenwechsel kürzer oder länger als einen Zyklus lang anzeigen/speichern kannst.

Harald
 
Zurück
Oben