Moin Leute,
nach längerer Pause möchte ich mal wieder einen Baustein hier einstellen.
Es handelt sich um eine einfach gehaltene einkanalige Schaltuhr mit kleinster Schaltzeit 1min. Visufreundlich kann man mit nur 4 Byte die Schaltzeiten ( h:m ein + h:m aus) vorgeben. Durch ein Modusbit kan man den Ausgang von EIN-AUS auf Impuls Umstellen. Bedeutet, ist dei Einschaltzeit erreicht wird ein 1Zykl Impuls ausgegeben.
Man kann den FB leicht auf mehrere Schaltzeiten erweitern, oder ihn einfach instanzieren für mehrere Kanäle.
Bei interesse kann ich das auch noch hier einstellen.
FUNCTION_BLOCK HD1
(*
##############################################################
Programmbeschreibung:
Einfache Einkanalige Schaltuhr mit kleinster Schaltzeit 1min
Umschaltbarer Modus von ON-OFF Zeit auf Impulsausgang(1 Zykl)
Lib: standart
getestet: auf XV100 v3.5.11
##############################################################
Änderungsindex
Name:TL Version:0.1 Datum: 17.03.2017 Grund: neu
##############################################################
*)
VAR_INPUT
Uhrzeit: TOD; //aktuelle Uhrzeit
h1_on: BYTE; //Einschaltzeit Stunde
m1_on: BYTE; //Einschaltzeit Minute
h1_off: BYTE; //Ausschaltzeit Stunde
m1_off: BYTE; //Ausschaltzeit Minute
Mode: BOOL:=0; //0=on/off, 1=Impulsausgang
END_VAR
VAR_OUTPUT
Q1: BOOL;
END_VAR
VAR
Uhrzeit_s: DWORD; //akt Uhrzeit in Sekunden
Zeit_on: DWORD; //Einschaltzeit in Sekunden
Zeit_off: DWORD; //Ausschaltzeit in Sekunden
H1on: DWORD; // begrenzte Einschaltzeit Stunden
M1on: DWORD; // begrenzte Einschaltzeit Minuten
H1off: DWORD; // begrenzte Ausschaltzeit Stunden
M1off: DWORD; // begrenzte Ausschaltzeit Minuten
Einschalten: R_TRIG; //Einschaltflanke
Ausschalten: R_TRIG; //Ausschaltflanke
END_VAR
//Zeitwerte begrenzen und in Sekunden ausgeben
H1on :=(BYTE_TO_DWORD (LIMIT (0, h1_on, 23) )*3600);
M1on :=(BYTE_TO_DWORD (LIMIT (0, m1_on, 59) )*60);
H1off :=(BYTE_TO_DWORD (LIMIT (0, h1_off, 23) )*3600);
M1off :=(BYTE_TO_DWORD (LIMIT (0, m1_off, 59) )*60);
Zeit_on:=H1on + M1on;
Zeit_off:=H1off + M1off;
//Uhrzeit in Sekunden wandeln
Uhrzeit_s:= TOD_TO_DWORD(Uhrzeit) / 1000;
IF Mode THEN //Schaltimpuls ausgeben
Einschalten(CLK:= (Uhrzeit_s = Zeit_on), Q=> Q1 );
ELSE // EIN-AUS Schalten
Einschalten(CLK:= (Uhrzeit_s = Zeit_on), Q=> );
IF Einschalten.Q AND NOT Q1 THEN
Q1:= TRUE;
END_IF
Ausschalten(CLK:= (Uhrzeit_s = Zeit_off), Q=> );
IF Ausschalten.Q AND Q1 THEN
Q1:= FALSE;
END_IF
END_IF
Viel Spass noch!
Gruß Thomas