TIA Flanken in ST/SCL

LaLo

Level-1
Beiträge
7
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Tag,

ich versuche mir seit ein paar Tagen im SCL programmieren und schreibe gerade ein Programm aus KOP in SCL um jedoch habe ich das mit den Flanken in SCL nicht so richtig durchblickt.

Es gibt ja nur die R_Trig wohinter auch wieder ein DB hängt, welche Flanke oder was verwende ich in SCL für das ich in KOP z.B. die -(P)- verwendet habe?
Ich hoffe ich konnte mein problem richtig übermitteln.

gruß LaLo
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Oder du schreibst die Flanke von Hand zu Fuß ;-):D:D:D:D


IN: #IN (Eingang/Signal)
STAT: #FM (Stat. Variable)
TEMP: #IM (Pos. Flanke)

#IM := #IN AND NOT #FM;

IF #IM AND NOT #IN THEN
#FM := TRUE;
ELSE
#FM := FALSE;
END_IF
 
Zuletzt bearbeitet:
Wenn ich es richtig verstanden habe, möchtest du eine positive Flanke von einem Signal in SCL auswerten.

Hierfür musst du nur nach folgendem Strickmuster vorgehen:

„Signal_FlankeP“ := „Signal“ AND NOT „Signal_FP“;
„Signal_FP“ := „Signal“;

Dabei ist „Signal_FlankeP“ deine eigentliche Flanke von deinem „Signal“. „Signal_FP“ ist nur ein Hilfsmerker.

Wenn du „Signal_FP“ & „Signal_FlankeP“ als Merker in der Symboltabelle deklarierst brauchst du keinen DB.

Wenn du die beiden Flankenmerker jedoch in der Deklaration eines FB‘s machen möchtest musst du darauf achten, das mindestens der Hilfsmerker (Signal_FP) im statischen Bereich deklariert ist und die eigentliche Flanke (Signal_FlankeP) erst nach dem beschreiben im Programm abgefragt wird. Besser ist es beide (Signal_FP & Signal_FlankeP) als statische Variablen zu deklarieren.


Gruß Ben


Gesendet von iPhone mit Tapatalk
 
Flankenauswertung KOP --> ST/SCL

schreibe gerade ein Programm aus KOP in SCL um jedoch habe ich das mit den Flanken in SCL nicht so richtig durchblickt.
So erklärt es der Siemens Support: Wie können Sie in STEP 7 (TIA Portal) mit SCL eine Flankenauswertung realisieren?

Wenn ich hier die Forumssuche mit den Stichworten "flanke scl" benutze, dann finde ich dieses Thema (gerade mal 2 Wochen alt) über wie macht man die händische beide-Flanken-Auswertung richtig: Flankenauswertung in SCL

Das Grundprinzip:
Code:
Signal_P_Flanke := Signal_jetzt AND NOT Signal_vorher;
Signal_N_Flanke := NOT Signal_jetzt AND Signal_vorher;
Signal_vorher := Signal_jetzt;  [COLOR="#008000"]//Zustand merken für nächsten Zyklus[/COLOR]


Es gibt ja nur die R_Trig wohinter auch wieder ein DB hängt, welche Flanke oder was verwende ich in SCL für das ich in KOP z.B. die -(P)- verwendet habe?
Der "Flankenmerker" (Tag_M) muß eine Variable sein, die sich bis in den nächsten Programmzyklus (Programmdurchlauf) den aktuellen Zustand merken kann (deswegen heißt der so), das muß kein "Merker" sein und muß auch nicht in einem DB sein. Es gehen z.B. Static-Variablen (in einer FB-Instanz) oder globale Merker (%M0.0) oder Ausgänge (%A0.0) oder Bits in globalen DB (DB1.DBX0.0, MyDB.MyBit1). Variablen aus TEMP gehen nicht - weil die sich nichts merken können.
Code:
[COLOR="#008000"]Step7 "classic" KOP[/COLOR]

  Signal      Tag_M       Tag_Out
---| |---------(P)----------( )


[COLOR="#008000"]Das Gleiche im "alles neu macht TIA"[/COLOR]
            +--------+
  Signal    | P_TRIG |    Tag_Out
---| |------|CLK    Q|------( )--
            +--------+
               Tag_M


[COLOR="#008000"]Das Gleiche in TIA für "effiziente" Programmierer (nur 5 Minuten Zeit für Alles ;-)
(siehe mal die super umständliche, irreführende und lustige TIA-Erklärung für das --(P)-- )[/COLOR]

  Signal                  Tag_Out
---| |----------------------(P)--
                           Tag_M


[COLOR="#008000"]Das Gleiche in ST/SCL:[/COLOR]
Tag_Out := Signal AND NOT Tag_M;
Tag_M := Signal;

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Oder du schreibst die Flanke von Hand zu Fuß ;-):D:D:D:D

IN: #IN (Eingang/Signal)
STAT: #FM (Stat. Variable)
TEMP: #IM (Pos. Flanke)

#IM := #IN AND NOT #FM;

IF #IM AND NOT #IN THEN
#FM := TRUE;
ELSE
#FM := FALSE;
END_IF
Eigentlich wollte ich jetzt nicht schon wieder in die ausgewetzte FlankenMerkerKerbe hauen, aber . . .
Eigentlich wollte ich jetzt nicht schon wieder darauf hinweisen, dass man eine IF-ELSE-Konstruktion, die abhängig von einer logischen Verknüpfung lediglich eine BoolVariable befruchtet, auch als simple WertZuweisung hätte schreiben können (hier: #FM := #IM AND NOT #IN; ), aber . . .

TomTomTurnAround und guck mal, wie Du den FlankenMerker zauberst:
Die Bedingung der If-Abfrage kann nur True werden, wenn #IM True ist.
Die Bedingung der If-Abfrage kann nur True werden, wenn #IN False ist.
Eine Zeile davor steht aber, dass #IM nie True ist, wenn #IN False ist.
#FM wird mit viel Aufwand auf False festgenagelt.
Sorry, FlankenErkennung "von Hand zu Fuss" nach Deiner Methode kann ich nicht befürworten - sonst immer gerne.

Gruss, Heinileini
 
Danke für die vielen Antworten ich werds heute gleich ausprobieren.

gruß

/edit

hat funktioniert vielen dank an alle nochmal!
 
Zuletzt bearbeitet:
Ach, was ist mir den da passiert...:confused:

Danke Heinileini für den Hinweis.... So kann es natürlich nicht gehen.

Richtig wäre:

IN: #IN (Eingang/Signal)
STAT: #FM (Stat. Variable)
TEMP: #IM (Pos. Flanke)

#IM := #IN AND NOT #FM;

IF #IM THEN
#FM := TRUE;
ELSEIF
NOT #IN THEN
#FM := FALSE;
END_IF
 
Richtig wäre:

IN: #IN (Eingang/Signal)
STAT: #FM (Stat. Variable)
TEMP: #IM (Pos. Flanke)

#IM := #IN AND NOT #FM;

IF #IM THEN
#FM := TRUE;
ELSEIF
NOT #IN THEN
#FM := FALSE;
END_IF
Jetzt wird es noch umständlicher und konfuser... ist der Datenspeicher Deiner SPS so langsam oder kostbar daß nur bei Wert-Änderungen geschrieben werden darf? ;)
(warum wird bei #IN = FALSE immer FALSE in #FM geschrieben und bei #IN = TRUE nur ein einziges mal das TRUE in #FM geschrieben? Da könnte man noch eine Flankenauswertung einbauen damit auch das FALSE nur bei Änderung des #IN geschrieben wird ;) )

Schreib doch einfach so, den Code überblickt man sofort:
Code:
[B]#IM := #IN[/B] AND NOT #FM;

#FM := #IN;

PS: Hast Du schon mal gehört, daß bei Maschinensteuerungen die SPS-Programmzyklen immer möglichst gleich lang sein sollen? Mit durchgängigem Gebrauch von solchem IF-THEN-Geschwurbel produziert man unkalkulierbar schwankende Zykluszeiten.

PPS: hucki war schneller :)

Harald
 
Richtig wäre:
IF #IM THEN
#FM := TRUE;
ELSEIF
NOT #IN THEN
#FM := FALSE;
END_IF
Ja, funktioniert so, aber unnötig umständlich ist es immer noch. Und es ist der SpezialFall nur für die Erkennung positiver Flanken.

#FM := #IN; anstelle der If-Else-Konstruktion reicht völlig aus und gilt gleichermassen, wenn man positive, negative oder alle Flanken erkennen möchte:
Code:
#ImpulsBeiPosFlanke := #IN AND NOT #FM;  // diese Zeile kann entfallen, falls Impuls an positiver Flanke nicht benötigt
#ImpulsBeiNegFlanke := NOT #IN AND #FM;  // diese Zeile kann entfallen, falls Impuls an negativer Flanke nicht benötigt
#ImpulsBeiJederFlanke := #IN XOR #FM;  // diese Zeile kann entfallen, falls Impuls an jeder Flanke nicht benötigt
#FM := #IN;
Das Schema ist sooo einfach, dass sogar Siemens in Haralds Link aus #5 sagt:
"Im Gegensatz zu anderen Programmiersprachen existieren in SCL (Structured Control Language) keine speziell für die Flankenauswertung von Signalen verwendbaren Anweisungen.
Aus diesem Grund wird bei SCL mit einer Hilfsvariablen gearbeitet. Damit ist eine schnelle Bearbeitung der Befehle gegeben und das Programm bleibt übersichtlich."
so dass ich immer Mühe habe, zu verstehen, warum man geglaubt hat, für andere Sprachen (KOP, FUP, AWL, …) spezielle, vorgefertigte Lösungen anbieten zu müssen.
Wie man u.a. hier im Forum immer wieder sieht, verführen diese speziellen Lösungen leider dazu, dass viele nicht wirklich verstehen, wie einfach das Prinzip ist und worauf es ankommt.

PS:
Mit der SiemensFormulierung "Aus diesem Grund wird bei SCL mit einer Hilfsvariablen gearbeitet." bin ich übrigens nicht einverstanden, weil sie suggeriert, dass die "speziellen Lösungen" die Hilfsvariable nicht benötigen. Dem ist nicht so. Alle FlankenErkennungen von Bits benötigen einen eigenen "FlankenMerker" (der nicht unbedingt ein Merker im Sinne von S5, S7, … sein muss), der nicht auch anderweitig benutzt werden darf und im folgenden Zyklus unverändert zur Verfügung stehen muss.
 
Zuletzt bearbeitet:
Zurück
Oben