TIA Flankenauswertung in SCL

TaHan

Level-2
Beiträge
118
Reaktionspunkte
11
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Forum,

ich habe das folgende Problem:
Ich möchte in SCL eine negative Flankenauswertung programmieren, um einen Motor ausschalten zu können, leider funktioniert diese nicht :

Code:
#FN_Start := NOT #"Start" AND #Merker_Impulse;
#Merker_Impulse := #"Start";

"Rücksetztverzögerung_Motor_Stopp".TON(IN:=#"Motor_Start",
                                            PT:=t#1500ms,
                                        Q=>#Merker_Timer);

IF #Merker_Timer AND #"FN_Start" = TRUE THEN
    #"Motor_Start" := FALSE;
END_IF;

mit dem F_TRIG Funktionsbaustein funktioniert die Flankenauswertung.

laut https://support.industry.siemens.co...flankenauswertung-realisieren-?dti=0&lc=de-AT sollte mein Code funktionieren (zumindest was die Flankenauswertung angeht).

Habe ich mich evtl. doch irgendwo vertan?
Ich bedanke mich im Voraus für jede Hilfe

Beste Grüße
 
Hallo Forum,

ich habe das folgende Problem:
Ich möchte in SCL eine negative Flankenauswertung programmieren, um einen Motor ausschalten zu können, leider funktioniert diese nicht :

Code:
#FN_Start := NOT #"Start" AND #Merker_Impulse;
#Merker_Impulse := #"Start";

"Rücksetztverzögerung_Motor_Stopp".TON(IN:=#"Motor_Start",
                                            PT:=t#1500ms,
                                        Q=>#Merker_Timer);

IF #Merker_Timer AND #"FN_Start" = TRUE THEN
    #"Motor_Start" := FALSE;
END_IF;

mit dem F_TRIG Funktionsbaustein funktioniert die Flankenauswertung.

laut https://support.industry.siemens.co...flankenauswertung-realisieren-?dti=0&lc=de-AT sollte mein Code funktionieren (zumindest was die Flankenauswertung angeht).

Habe ich mich evtl. doch irgendwo vertan?
Ich bedanke mich im Voraus für jede Hilfe

Beste Grüße

Ich kann mich täuschen aber wenn dein "Motor_Start" nich TRUE wird kann dein "Merker_Timer" auch nie True werden .
 
Ich kann mich täuschen aber wenn dein "Motor_Start" nich TRUE wird kann dein "Merker_Timer" auch nie True werden .
Hab vergessen zu erwähnen, dass es sich nur um einen Ausschnitt aus dem Programm-Code handelt. "Motor_Start" ist durch eine positive Flanke gesetzt worden, aber wie ich oben beschrieben habe, funktioniert bei mir das Rücksetzen des Motors durch eine negative Flanke nicht, es sei denn ich verwende einen F_TRIG Funktionbaustein.

Aber der Vollständigkeitshalber ist hier zusätzlich das Setzen des Motors:

Code:
#FP_Start := #"Start" AND NOT #Merker_Impulse;
    #Merker_Impulse := #"Start";

IF #FP_Start = TRUE THEN
        #"Motor_Start" := TRUE;
    END_IF;
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du verwendest 2X Merker_Impulse


Code:
#FP_Start := #"Start" AND NOT #Merker_Impulse;
 [COLOR=#ff0000]#Merker_Impulse := #"Start";[/COLOR]

IF #FP_Start = TRUE THEN
        #"Motor_Start" := TRUE;
END_IF;

#FN_Start := NOT #"Start" AND #Merker_Impulse;
#Merker_Impulse := #"Start";

"Rücksetztverzögerung_Motor_Stopp".TON(IN:=#"Motor_Start",
                                            PT:=t#1500ms,
                                        Q=>#Merker_Timer);

IF #Merker_Timer AND #"FN_Start" = TRUE THEN
    #"Motor_Start" := FALSE;
END_IF;

Laß mal die rote Zeile weg oder verwende für die negative Flanke eine andere Stat-Var.
 
Du verwendest 2X Merker_Impulse


Code:
#FP_Start := #"Start" AND NOT #Merker_Impulse;
 [COLOR=#ff0000]#Merker_Impulse := #"Start";[/COLOR]

IF #FP_Start = TRUE THEN
        #"Motor_Start" := TRUE;
END_IF;

#FN_Start := NOT #"Start" AND #Merker_Impulse;
#Merker_Impulse := #"Start";

"Rücksetztverzögerung_Motor_Stopp".TON(IN:=#"Motor_Start",
                                            PT:=t#1500ms,
                                        Q=>#Merker_Timer);

IF #Merker_Timer AND #"FN_Start" = TRUE THEN
    #"Motor_Start" := FALSE;
END_IF;

Laß mal die rote Zeile weg oder verwende für die negative Flanke eine andere Stat-Var.

Danke, hat funktioniert. Darauf muss man erst mal als SCL-Neuling kommen :idea:
 
Na ja bei KOP oder FUP darf man die Hilfsmerker für Flanken etc. auch nur exclusiv verwenden.
Warum sollte das bei SCL anders sein?

Gruß

Jens
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Na ja bei KOP oder FUP darf man die Hilfsmerker für Flanken etc. auch nur exclusiv verwenden.
Warum sollte das bei SCL anders sein?

Gruß

Jens

Das ist ja eine Hilfskonstruktion für Flanken und kein "echter" Flankenmerker, kann er schon so machen, da der selbe Input auf den Hilfsmerker geht.
Übersichtlicher und verständlicher ist es, jeweils eine eigene Variable zu nutzen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die Flankenerkennung zusammenfassen wollte ich auch schon vorschlagen, allerdings sieht es nach der Flankengeschichte auch noch ziemlich verschwurbelt aus:
Code:
#FP_Start := #"Start" AND NOT #Merker_Impulse;
#FN_Start := NOT #"Start" AND #Merker_Impulse;
#Merker_Impulse := #"Start";

IF #FP_Start = TRUE THEN
    #"Motor_Start" := TRUE;
END_IF;

"Rücksetztverzögerung_Motor_Stopp".TON(IN:=#"Motor_Start",
                                            PT:=t#1500ms,
                                        Q=>#Merker_Timer);

IF #Merker_Timer AND #FN_Start = TRUE THEN
    #"Motor_Start" := FALSE;
END_IF;

Besser:
Code:
#FP_Start := #"Start" AND NOT #Merker_Impulse;
#FN_Start := NOT #"Start" AND #Merker_Impulse;
#Merker_Impulse := #"Start";

"Rücksetztverzögerung_Motor_Stopp".TON(IN:=#"Motor_Start",
                                            PT:=t#1500ms,
                                        Q=>#Merker_Timer);

#"Motor_Start" := (#"Motor_Start" OR #FP_Start) AND NOT(#FN_Start AND #Merker_Timer);

Oder mit nur der einen nötigen Flanke:
Code:
#FN_Start := NOT #"Start" AND #Merker_Impulse;
#Merker_Impulse := #"Start";

"Rücksetztverzögerung_Motor_Stopp".TON(IN:=#"Motor_Start", PT:=t#1500ms);

#"Motor_Start" := (#"Motor_Start" OR #"Start") AND NOT(#FN_Start AND "Rücksetztverzögerung_Motor_Stopp".TON.Q);

Wenn man Probleme mit einfachem logischem Denken hat dann sollte man logische Verknüpfungen lieber nicht in SCL machen sondern in FUP/KOP.

Harald
 
Wenn man Probleme mit einfachem logischem Denken hat dann sollte man logische Verknüpfungen lieber nicht in SCL machen sondern in FUP/KOP.

Ich habe vor knapp 6 Monaten angefangen in FUP/AWL (sehr einfache Programme) zu programmieren, vorher hatte ich damit nichts zu tun gehabt und SCL habe ich erst gestern zum ersten mal angefasst. Daher fehlt mir einfach noch die nötige Erfahrung/Wissen um einen besseren Weg zu finden. Ich war gestern einfach nur froh, dass es funktioniert hat. Aber im Laufe der Zeit kriege ich mehr Übung/ Erfahrung und dann sieht die Welt gleich besser aus.
Ich bedanke mich für die Vereinfachung.

Ich verstehe nur noch nicht genau, wieso man statt einem SR-FF eine logische Verknüpfung nimmt.

#"Motor_Start" := (#"Motor_Start" OR #"Start") AND NOT(#FN_Start AND "Rücksetztverzögerung_Motor_Stopp".TON.Q);
 
Ich verstehe nur noch nicht genau, wieso man statt einem SR-FF eine logische Verknüpfung nimmt.
Das nennt sich "Selbsthaltung", und so würde man es machen wenn man die Schaltung aus einzelnen elektrischen Komponenten aufbaut und auf den Materialpreis achten muß. SR-FF ist eigentlich eine "unnatürliche" und teure Lösung.
Doch heutzutage wird kaum noch effizient und einfach gedacht, jeder kann Lösungen realisieren egal wie umständlich - notfalls werden schnellere SPS mit mehr Speicher verlangt. Das führt dann dazu, daß man für simple Motorstarter mehr Rechenpower braucht als die Computertechnik mit der man vor 50 Jahren zum Mond und zurück geflogen ist.

Für jede Arbeit soll man das am besten geeignete Werkzeug verwenden. Für logische Verknüpfungen ist SCL allerdings die am schlechtesten geeignete Programmiersprache. Und weil SCL eine Hochsprache ist die fast jeder lesen kann, meinen auch viele daß man ohne große Vorbereitung ohne vorher durchdenken einfach losprogrammieren kann. Das führt dann oft zu IF-Orgien (mit trotzdem häufig unvollständiger Logik) - gerne auch mit woanders (außerhalb des Sichtfeldes) realisierter Zusatz-Logik, die das vorhergehende Ergebnis komplett verwirft. Besonders die Denkweise mit SR-FF verführt zu solcherart zerstückelter Programmlogik.

PS: Ergebnisse von boolschen Ausdrücken muß man nicht noch extra auf wahr/falsch vergleichen, der Ausdruck selber liefert schon ein boolsches (ja/nein) Ergebnis. (man sagt auch umgangssprachlich nicht "Wenn die_Sonne_scheint = wahr Dann ...").
"IF #FP_Start = TRUE THEN" ---> "IF #FP_Start THEN"

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Heute braucht ist man nicht unbedingt gezwungen zwischen SCL und KOP/FUP zu wählen.
In TIA kann man in ein KOP oder FUP Baustein SCL Netzwerke einfügen.
Kann ich nur empfehlen.

Ein Motorstarter wurde ich in KOP programmieren.
Besonders den online Sicht von logische Verknüpfungen ist in KOP (und FUP) besser als in SCL.
 
@Harald
Danke für die Klarstellung.

PS: Ergebnisse von boolschen Ausdrücken muß man nicht noch extra auf wahr/falsch vergleichen, der Ausdruck selber liefert schon ein boolsches (ja/nein) Ergebnis. (man sagt auch umgangssprachlich nicht "Wenn die_Sonne_scheint = wahr Dann ...").
"IF #FP_Start = TRUE THEN" ---> "IF #FP_Start THEN"

Das hätte ich vorher auch nicht gewusst. Ich habe es aus einem sehr alten Forum-Beitrag rauskopiert, zumindest die "IF"-Anweisung. Im Nachhinein wird mir das auch klar.

Heute braucht ist man nicht unbedingt gezwungen zwischen SCL und KOP/FUP zu wählen.
In TIA kann man in ein KOP oder FUP Baustein SCL Netzwerke einfügen.
Kann ich nur empfehlen.

Ein Motorstarter wurde ich in KOP programmieren.
Besonders den online Sicht von logische Verknüpfungen ist in KOP (und FUP) besser als in SCL.

Da ich ja noch nie SCL, bis auf gestern, angefasst habe, wollte ich einfach nur wissen wie man so etwas in SCL bewerkstelligen kann.
 
Mal unabhängig davon, ob in SCL, KOP, FUP, AWL, ob mit zu-Fuss-FlankenErkennung, "richtiger" FlankenErkennung mit Magie oder ohne Magie ...

Wenn ich mir vorstelle, das EingangsSignal (von dem die positive "und oder oder" negative Flanke ausgewertet bzw. ignoriert werden soll) von einem TastenDruck abgeleitet wird, dann habe ich folgendes Verhalten:
- Motor läuft nicht, kurzer TastenDruck <= 1,5 s startet Motor und Motor bleibt an,
- Motor läuft, kurzer TastenDruck <= 1,5 s verändert nichts, der Motor läuft weiter,
- Motor läuft nicht, langer TastenDruck > 1,5 s startet Motor und stoppt ihn beim Loslassen der Taste,
- Motor läuft, langer TasteDruck > 1,5 s bewirkt erst beim Loslassen das Stoppen des Motors.
Diese Bedienung, um einen Motor ein- bzw. auszuschalten, finde ich irgendwie "tuitiv" (inintuitiv -> doppelte Negation -> tuitiv ;o)

Wenn ich z.B. eine (lange) MaschinenAchse im JOG per TastenDruck verfahren müsste, hätte ich lieber folgendes Verhalten:
- kurze Betätigung <= 0,7 s toggelt mit der negativen Flanke den Motor (schaltet stehenden Motor ein bzw. schaltet laufenden Motor aus),
- lange Betätigung > 0,7 s startet 0,7 s nach positiver Flanke den Motor und stoppt ihn mit negativer Flanke und rücksetzt das ToggleBit.
Sonst würde ich befürchten, dass ein Bediener beim Versuch den Motor "mal eben" zu stoppen, schier verzweifelt ...

Code:
ImpulsNegF := NOT Taste AND FlankenMerker;
FlankenMerker := Taste;
ToggleBit := (ToggleBit OR TON.Q) XOR ImpulsNegF;
TON(IN:=Taste, PT:=700ms);
Motor := TON.Q OR ToggleBit;
ImpulsNegF darf temporär sein, FlankenMerker und ToggleBit müssen "LangzeitGedächtnis" haben.
Ungetestet und mit ohne Gewähr.
Die ursprüngliche Zeit von 1500 ms erscheint mir zu lang - habe sie deshalb auf willkürliche 700 ms reduziert.
 
Zurück
Oben