SCL Neuling / Lösung für Übung

spark2001

Level-2
Beiträge
6
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
SCL Neuling / Lösung für Übung

Hallo zusammen,
kurze Info über mich.
Ich bin 42 Jahre alt, habe Elektriker Produktionstechnik gelernt und abreite seit ca. 16 Jahren in der IH.
Unsere Programmierumfänge halten sich in Grenzen. Da wir aber seit 2023 die erste TIA Anlage besitzen, mit teils SCL, wollte ich
mich hier ein wenig einlesen bzw. fortbilden.

Daher versuche ich gerade alte Übungen in SCL umzuschreiben.

"Funktion: Mit dem Eingangsparameter Einrichten wird sowohl die Betriebsart Einrichten als auch die Anzeige Einrichten aktiv. Wird nun Automatik gewählt, ist keine Betriebsart aktiv. Die Anzeige Automatik Start und Automatik blinkt mit 1 Hz. Nachdem die Taste Automatik Start für 3 Sekunden gedrückt wird, wechselt der Baustein in die Betriebsart Automatik und die Anzeige Automatik leuchtet. Um diese Funktionalität abzubilden müssen Sie weitere Statische Variablen verwenden. Verwenden Sie keine Merker! "

Hier meine Lösung:
// Betriebsart Einrichten
#BA_Einr := #Einr AND NOT #Auto;
#A_Einr := #BA_Einr;
// Betriebsart Automatik
REGION
#IEC_Timer_0_Instance(IN := #Auto AND #Auto_Start,
PT := t#3s);
IF #IEC_Timer_0_Instance.Q THEN
#stat_BA_Auto := true;
END_IF;

IF #Auto AND "Clock_1Hz" AND NOT #stat_BA_Auto THEN
#A_Auto := true;
#A_Auto_start := true;
ELSE
#A_Auto := FALSE;
#A_Auto_start := FALSE;
END_IF;
IF #stat_BA_Auto AND #Auto THEN
#A_Auto := true;
#A_Auto_start := FALSE;
ELSIF NOT #Auto THEN
#A_Auto := FALSE;
#A_Auto_start := FALSE;
#stat_BA_Auto := FALSE;
END_IF;

#A_Auto := "Clock_1Hz" AND #Auto AND NOT #stat_BA_Auto;
END_REGION;

Meine Frage wäre nun ob es nicht eine elegantere bzw. kompaktere Lösung für den Automatikbetrieb gibt.

mfg

spark2001
 
Also ich würde 3 Sachen ändern.
1. Timer benennen. Wenn du später mal ein Projekt mit 15 Timern hast und die einfach nur die Nummern 0-15 haben verlierst du den Überblick welche wohin gehört.

2.
IF #Auto AND NOT #stat_BA_Auto THEN
#A_Auto := "Clock_1HZ";
#A_Auto_start := "Clock_1HZ";
END_IF;

3. Nach meinem Verständnis von der Aufgabe wird die letzte Zeile nicht benötigt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich komme bei den ganzen Variablenbezeichnungen nicht mit. Wofür es vier Variablen für den Automatikbetrieb benötigt verstehe ich nicht.
Man darf Variablen gerne einen ersichtlichen Namen geben ohne dass man das ganze Programm durchsuchen muss um zu verstehen wo der Unterschied zwischen
Apache-Konfiguration:
Auto, A_Auto, BA_Auto und stat_BA_Auto
ist.
 
vereinfache mal Deinen Code. Einige If Abfragen sind unnötig
Code:
// Betriebsart Einrichten
#A_Einr := #BA_Einr := #Einr AND NOT #Auto;
// Timer
#IEC_Timer_0_Instance(IN := #Auto AND #Auto_Start,
PT := t#3s);
#stat_BA_Auto := #IEC_Timer_0_Instance.Q 


#A_Auto :=#A_Auto_start := #Auto AND "Clock_1Hz" AND NOT #stat_BA_Auto

Ansonsten muss ich DCDCDC recht geben
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo, danke mal für die Antworten.
@Arlos zu Punkt
1. werde ich berücksichtigen.
2. super, sieht besser aus.
3. ja da hast du recht, wieso ich die noch drin habe weiß ich auch gerade nicht mehr. Wird wohl ein Überbleibsel sein, da am Anfang alles ein wenig anders aussah.
@DCDCDC
Die Variablen sind von der Übung vorgegeben. Dachte der Text reicht. Beim nächsten Mal kopiere ich die ganze Übung.
Auto = Anwahl Automatik
A_Auto = Anzeige Automatik
BA_Auto = Betriebart Automatik
Stat_BA_Auto= statische Variable
@kiar
Das war ja auch meine Frage, ob es nicht auch einfacher geht.
Jetzt ist aber erst mal Wochenende. Werde nächste Woche eure Tipps gleich umsetzen bzw. ausprobieren.
Danke und schönes WE
 
Also grundsätzlich sollte man mit den IF THEN ELSE Orgien vorsichtig sein, sonst blickt da irgendwann kein Mensch mehr durch...

Sowas ist Käse:
Code:
IF A=true AND C=true THEN
B:=true;
ELSE
B:=false;
END_IF;

Besser:
Code:
B:=A AND C;

SCL verleitet halt zu diesen IF THEN ELSE Orgien...

Ich versuche an der Stelle meine Denkweise umzudrehen.
Also nicht überlegen, was passieren soll, wenn irgendwelche Eingangsgrössen ihren Wert verändern. Sondern überlegen, wann bestimmte Ausgangsgrössen true sein sollen...
Vom Ende denken, würde Frau Merkel sagen.

IF THEN ELSE braucht man eigentlich nur für "setze/rücksetze" oder "Sprünge". Und mit beidem sollte man wie früher eher sparsam umgehen...

Zum Üben für die Lehrlinge würd ich vielleicht für die ersten Tage IF THEN ELSE verbieten!
 
Zuletzt bearbeitet:
"Funktion: Mit dem Eingangsparameter Einrichten wird sowohl die Betriebsart Einrichten als auch die Anzeige Einrichten aktiv. Wird nun Automatik gewählt, ist keine Betriebsart aktiv. Die Anzeige Automatik Start und Automatik blinkt mit 1 Hz. Nachdem die Taste Automatik Start für 3 Sekunden gedrückt wird, wechselt der Baustein in die Betriebsart Automatik und die Anzeige Automatik leuchtet. Um diese Funktionalität abzubilden müssen Sie weitere Statische Variablen verwenden. Verwenden Sie keine Merker! "

Hier meine Lösung:
Code:
// Betriebsart Einrichten
#BA_Einr := #Einr AND NOT #Auto;
#A_Einr := #BA_Einr;
// Betriebsart Automatik
REGION
    #IEC_Timer_0_Instance(IN := #Auto AND #Auto_Start,
                          PT := t#3s);
    IF #IEC_Timer_0_Instance.Q THEN
        #stat_BA_Auto := true;
    END_IF;
 
    IF #Auto AND "Clock_1Hz" AND NOT #stat_BA_Auto THEN
        #A_Auto := true;
        #A_Auto_start := true;
    ELSE
        #A_Auto := FALSE;
        #A_Auto_start := FALSE;
    END_IF;
    IF #stat_BA_Auto AND #Auto THEN
        #A_Auto := true;
        #A_Auto_start := FALSE;
    ELSIF NOT #Auto THEN
        #A_Auto := FALSE;
        #A_Auto_start := FALSE;
        #stat_BA_Auto := FALSE;
    END_IF;
 
    #A_Auto := "Clock_1Hz" AND #Auto AND NOT #stat_BA_Auto;
END_REGION;


ohne es jetzt getestet zu haben, würd ichs vielleicht so machen:
Code:
// Betriebsart Einrichten
#BA_Einr := #Einr AND NOT #Auto;

// Anzeige Einrichten
#A_Einr := #BA_Einr;

// Betriebsart Automatik
#IEC_Timer_Einverz_Start_Taster(IN := #Auto_Start,PT := t#3s); // Einschaltverzögerung 3sek

IF NOT #Auto OR #Einr THEN
      #stat_BA_Auto := false; // Betriebsart Auto rücksetzen
ELSIF #AUTO AND NOT #Einr AND #IEC_Timer_Einverz_Start_Taster.Q AND NOT #Einverz_Start_Taster_OLD
      #stat_BA_Auto := true; // Betriebsart Auto setzen
END_IF;

#Einverz_Start_Taster_OLD := #IEC_Timer_Einverz_Start_Taster.Q; // Flankenerkennung wegen des Streichholzes

#BA_Auto := stat_BA_Auto;

// Anzeige Automatik
#A_Auto := #stat_BA_Auto OR (#Auto AND NOT #Einr AND "Clock_1Hz");

// Anzeige Auto_Start
#A_Auto_start := #Auto AND NOT #Einr AND NOT #stat_BA_Auto AND "Clock_1Hz";

// #Einr sowie #Auto sind Eingänge von nem Knebelschalter
// #BA_Einr #BA_Auto #A_Einr #A_Auto #A_Auto_start sind Ausgänge
// #stat_BA_Auto #Einverz_Start_Taster_OLD statische Variable im Instanz-DB

PS: nach dem ELSIF fehlt das THEN...
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Ok,
nochmals danke für die Lösungsvorschläge.
wenn ich auf die IF ELSE... verzichten kann ist das recht.
habe nur beim Erstrellen keine andere Möglichkeit gefunden 2 Ausgänge mit einer Anweisung zu beshreiben, daher mein Griff zu IF.
Aber wenn ich es richtig verstehe müsste der Code ja genau das machen.
#A_Einr := #BA_Einr := #Einr AND NOT #Auto; von kiar
Gibt es eine Buchempfehlung für SCL ? habe zwar das "SPS-Programmierung mit SCL im TIA-Portal", daher die IF ELSE Orgie.
Aber mir Fehlen hier gerade die einfachen Anweisungen (z.b. wie im Zitiat) , Übungen bzw. Beispiele.
 
habe nur beim Erstrellen keine andere Möglichkeit gefunden 2 Ausgänge mit einer Anweisung zu beshreiben, daher mein Griff zu IF.
muss man ja auch nicht machen...
M.M. ist es eh besser, die verschiedenen Ausgänge getrennt zu betrachten. Zumindest unter nem separaten Kommentar oder in nem separaten Netzwerk. Spätestens wenn der zweite Ausgang bei der IBN dann doch nicht das selbe macht wie der erste, geht das gebastel los. Also am besten von Anfang an die Dinge trennen. DA kommt von ganz alleine noch Code dazu...
Gibt es eine Buchempfehlung für SCL ? habe zwar das "SPS-Programmierung mit SCL im TIA-Portal", daher die IF ELSE Orgie.
Aber mir Fehlen hier gerade die einfachen Anweisungen (z.b. wie im Zitiat) , Übungen bzw. Beispiele.
gute Frage :unsure:

Siemens SCE, find ich aber nicht so toll, gerade in Bezug auf boolscher Logik:


 
@ducati

hi, habe deine Code getestet, (y), nur ein THEN hat gefehlt.
nur die Anzeige Auto und Autostart habe ich nach @kiar Variante geschrieben.

#A_Auto := #A_Auto_start := #Auto AND "Clock_1Hz" OR (#Auto AND #stat_BA_Auto);

gruss und danke für die hilfe

 
Zuviel Werbung?
-> Hier kostenlos registrieren
@ducati

hi, habe deine Code getestet, (y), nur ein THEN hat gefehlt.
nur die Anzeige Auto und Autostart habe ich nach @kiar Variante geschrieben.

#A_Auto := #A_Auto_start := #Auto AND "Clock_1Hz" OR (#Auto AND #stat_BA_Auto);

gruss und danke für die hilfe

Bin der Meinung, die Lampe A_auto_start sollte wieder ausgehen, wenn die Anlage läuft...

Ja, das THEN hat noch gefehlt...
 
stimmt,
habe es mittlerweile überarbeitet und noch ne kürzere variante hin bekommen.
nur den Kommentar müsstest mir erklären "Flankenerkennung wegen des Streichholzes"
 
habe es mittlerweile überarbeitet und noch ne kürzere variante hin bekommen.
Es geht nicht um "kurzen" Code, sondern um Nachvollziehbarkeit in 10 Jahren! Ausserdem leicht erweiterungsfähig sowie wartungsfreundlich...
Zeig dochmal Dein Programm.
nur den Kommentar müsstest mir erklären "Flankenerkennung wegen des Streichholzes"
in die Taster klemmt gerne mal jemand einfach nen Streichholz, um sich 5m Fussweg und 3sek drücken zu sparen. Deshalb programmiert man für Eintaster bzw. Quittiertaster in der Regel ne Flankenerkennung. Sonst macht Dein 3sek Timer keinen Sinn, wenn der durch nen zwischengeklemmtes Streichholz einfach überbrückt werden kann...
 
Zuletzt bearbeitet:
@ducati:
Flankenerkennung wg. Streichholz😁 Den muss ich mir merken. Leider auch schon so gesehen.
Äh.. nochmal für Laien wie mich. Auswertung fallende Flanke oder?
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Also wenn der Knopf auch noch 3s lang gedrückt werden soll, dann ist sicherlich eine steigende Flanke vor den 3s sinnvoll, dann hat der Bediener nach 3s eine Rückmeldung, dass das drücken erfolgreich war. Bei fallender Flanke müsste der Bediener die 3s mitzählen, um nicht zu früh loszulassen.
 
Zurück
Oben