-> Hier kostenlos registrieren
Hallo
bin Anfänger in SCL. Habe jetzt mal 2 kurze Bausteine programmiert.
Könnt ihr die mal anschauen? Und mir nur mal kurz sagen, was man verbessern könnte oder was ich falsch gemacht habe
wills ja richtig lernen.
Funktionieren tuen sie. aber das sollte ja nicht nur das hauptziel sein. Dass der Baustein irgendwie funktioniert. egal wie er ausschaut oder wie schlecht programmiert
bitte um eueren rat.
Danke
bin Anfänger in SCL. Habe jetzt mal 2 kurze Bausteine programmiert.
Könnt ihr die mal anschauen? Und mir nur mal kurz sagen, was man verbessern könnte oder was ich falsch gemacht habe
wills ja richtig lernen.
Code:
FUNCTION_BLOCK FB40
TITLE = 'Betriebsstundenzähler'
VERSION : '1.0'
AUTHOR : Wotke
NAME : BSZ
FAMILY : family
// Bausteinparameter
VAR_INPUT
// Eingangsparameter
// Freigabe = Der Betriebsstundenzähler wird freigegeben und beginnt zu zählen
// Reset = Die Betriebsstunden werden auf 0 zurückgesetzt
// Ausgabe = Auswahl in welcher Einheit die Zeit ausgegeben werden soll
// 1 = Stunden
// 2 = Minuten
// 3 = Sekunden
Freigabe:BOOL;
Reset:BOOL;
Ausgabe:INT;
END_VAR
VAR_IN_OUT
// Durchgangsparameter
END_VAR
VAR_OUTPUT
// Ausgangsparameter
// Je nach dem welche Ausgabe parametriert wurde (1,2 oder 3)
// wird entweder Stunden, Minuten oder Sekunden ausgegeben
Betriebsstunden:REAL;
END_VAR
VAR_TEMP
// temporäre Variablen
END_VAR
VAR
// statische Variablen
Takt:BOOL;
Sekunde:REAL;
Timer1:SFB4;
E1,E2,E4:REAL;
E3:DINT;
END_VAR
LABEL
MARKE1;
MARKE2;
END_LABEL
BEGIN
// Anweisungsteil
// Betriebsstunden zurücksetzen bei MARKE2
// Freigabe BSZ. Wenn Freigabe=0 dann springe zu
// MARKE1 (Bausteinende)
IF Reset THEN GOTO MARKE2;
ELSIF NOT Freigabe THEN GOTO MARKE1;
END_IF;
//Timer für Takt zum Sekundenzählen
Timer1 (IN:=NOT Takt, PT:=T#1s);
Takt:=Timer1.Q;
// Wenn Takt=0 springe zu MARKE1 (Bausteinende)
// Wenn Takt=1 zähle eine Sekunde hoch
IF NOT Takt THEN GOTO MARKE1;
ELSIF Takt THEN Sekunde:=Sekunde+1;
END_IF;
// Je nach parametrierung des Ausgangs "Ausgabe"
// wird in das jeweilige Format umgerechet
IF Ausgabe=1 THEN E1:=((Sekunde/60)/60);
ELSIF Ausgabe=2 THEN E1:=(Sekunde/60);
ELSIF Ausgabe=3 THEN E1:=Sekunde;
END_IF;
// Begrenzung der Betriebsstunden Ausgabe
// auf 2 Nachkommastellen
E2:= (E1*100.0);
E3:= REAL_TO_DINT (E2);
E4:= DINT_TO_REAL (E3);
Betriebsstunden:= (E4/100.0);
GOTO MARKE1;
// MARKE2 = Zurücksetzen Betriebsstundenzähler
MARKE2:
Sekunde:=0;
Betriebsstunden:=0;
MARKE1: ;
;
END_FUNCTION_BLOCK
Code:
FUNCTION_BLOCK FB50
// Ausgang wird geschalten, wenn:
// TIME_OF_DAY gleich oder zwischen Ein- und Ausschaltzeit ist
// und DAY_CHECK ein positives Ergebnis liefert.
TITLE = 'Wochenschaltuhr'
VERSION : '1.0'
AUTHOR : Wotke
NAME : Schaltuhr
FAMILY : Zeiten
// Bausteinparameter
VAR_INPUT
// Eingangsparameter
Einschaltzeit:TOD;
Ausschaltzeit:TOD;
Sonntag:BOOL:=0;
Montag:BOOL:=0;
Dienstag:BOOL:=0;
Mittwoch:BOOL:=0;
Donnerstag:BOOL:=0;
Freitag:BOOL:=0;
Samstag:BOOL:=0;
END_VAR
VAR_IN_OUT
// Durchgangsparameter
END_VAR
VAR_OUTPUT
// Ausgangsparameter
Ausgang:BOOL;
END_VAR
VAR_TEMP
// temporäre Variablen
END_VAR
VAR
// statische Variablen
SPS_DT:DATE_AND_TIME;
SPS_TOD:TOD;
SPS_DAY:INT;
RetVal:INT;
DAY_CHECK:BOOL;
END_VAR
BEGIN
// Anweisungsteil
// Datum und Uhrzeit holen
RetVal := SFC1(CDT:= SPS_DT);
// DATE aus DATE_AND_TIME holen
SPS_DAY:= FC7 (IN:= SPS_DT);
// DAY_TIME aus DATE_AND_TIME holen
SPS_TOD:= FC8 (IN:= SPS_DT);
// Vergleicht aktuelles Datum mit Eingangsbeschaltung
// Wenn Eingangsbeschaltung mit aktuellem Datum übereinstimmt
// wird DAY_CHECK = TRUE
IF Sonntag AND SPS_DAY=1 THEN DAY_CHECK:=1;
ELSIF Montag AND SPS_DAY=2 THEN DAY_CHECK:=1;
ELSIF Dienstag AND SPS_DAY=3 THEN DAY_CHECK:=1;
ELSIF Mittwoch AND SPS_DAY=4 THEN DAY_CHECK:=1;
ELSIF Donnerstag AND SPS_DAY=5 THEN DAY_CHECK:=1;
ELSIF Freitag AND SPS_DAY=6 THEN DAY_CHECK:=1;
ELSIF Samstag AND SPS_DAY=7 THEN DAY_CHECK:=1;
ELSE DAY_CHECK:=0;
END_IF;
// Vergleicht Einschaltzeit mit aktueller Tageszeit (TIME_OF_DAY) und frägt DAY_CHECK ab.
// Bei positivem VKE Ausgang = TRUE.
// Bei Ausschaltzeit fällt DAY_CHECK weg (bei Tageswechsel soll die Anlage weiterlaufen).
// Ist Ausschaltzeit kleiner oder gleich TIME_OF_DAY Ausgang = FALSE.
IF (Einschaltzeit <= SPS_TOD) AND DAY_CHECK THEN Ausgang:=1;
ELSIF (Ausschaltzeit <= SPS_TOD) AND Ausgang THEN Ausgang:=0;
END_IF;
;
END_FUNCTION_BLOCK
Funktionieren tuen sie. aber das sollte ja nicht nur das hauptziel sein. Dass der Baustein irgendwie funktioniert. egal wie er ausschaut oder wie schlecht programmiert
bitte um eueren rat.
Danke