emilio20
Level-1
- Beiträge
- 835
- Reaktionspunkte
- 20
-> Hier kostenlos registrieren
Hallo
habe ein kleines Problem. Ich wollte mir eine Zeitschaltuhr erstellen die ich für mehrers Funktionen einsetzen möchte.
Die Zeitschaltuhr solle für jeden Wochentag je nach verwendeter Funktion 1-10 Einschlatzeiten und Auschaltzeiten habe, die einen Puls ausgeben.
Mein Problem ist das ich die Größe des verwendete Arrays nicht Variabel machen kann.
Hier mein Programm
habe ein kleines Problem. Ich wollte mir eine Zeitschaltuhr erstellen die ich für mehrers Funktionen einsetzen möchte.
Die Zeitschaltuhr solle für jeden Wochentag je nach verwendeter Funktion 1-10 Einschlatzeiten und Auschaltzeiten habe, die einen Puls ausgeben.
Mein Problem ist das ich die Größe des verwendete Arrays nicht Variabel machen kann.
Hier mein Programm
Code:
FUNCTION_BLOCK FB234
VAR_TEMP
TEMP_INT : INT ;
DATUM_ZEIT_DT : DT;
SPS_TIME : TOD;
Wochentag : INT;
i:INT;
i2:INT;
SPS_TIME_I:DINT;
END_VAR
VAR_OUTPUT
PULS_EIN:BOOL;
PULS_AUS:BOOL;
END_VAR
VAR
//SCHALTUHR 1..7 = Wochentage von 1=SO, 2=MO usw , 1..10 SPEICHER PULS SCHALTUHR EIN
SCHALTUHR_EIN : ARRAY[1..7,1..10] OF TOD;
//SCHALTUHR 1..7 = Wochentage von 1=SO, 2=MO usw , 1..10 SPEICHER PULS SCHALTUHR AUS
SCHALTUHR_AUS : ARRAY[1..7,1..10] OF TOD;
END_VAR
//______________________________________________________
BEGIN
// Zeiten aus SPS Extrahieren
// Datum und Zeit aus SPS Lesen
TEMP_INT:=READ_CLK(CDT :=DATUM_ZEIT_DT);
// Zeit aus Datum und Zeit Extrahieren
SPS_TIME:=DT_TOD(IN :=DATUM_ZEIT_DT);
// ZEIT ind DINT umwandeln und durch 1000 Teile um sec zu erhalten
SPS_TIME_I:=TOD_TO_DINT (SPS_TIME)/1000 ;
// Wochentag aus SPS Zeit Extrahieren
Wochentag:=DT_DAY(IN :=DATUM_ZEIT_DT);
// Vergleich von SPS_TIME in sec mit allen EINSCHALTZEITEN des jeweiligen Wochentages. Wenn EINSCHALTZEIT mit SPS_TIME
// übereinstimmt wird FOR Schleife beendet und Ausgang PULS_EIN IST TRUE
FOR i := 1 TO 10 BY 1 DO
IF SPS_TIME_I = TOD_TO_DINT (SCHALTUHR_EIN[Wochentag,i])/1000 AND TOD_TO_DINT (SCHALTUHR_EIN[Wochentag,i])/1000>0 THEN
PULS_EIN:=TRUE;
EXIT;
ELSE
PULS_EIN:=FALSE;
END_IF;
;
END_FOR;
// Vergleich von SPS_TIME in sec mit allen AUSCHALTZEITEN des jeweiligen Wochentages. Wenn AUSCHALTZEIT mit SPS_TIME
// übereinstimmt wird FOR Schleife beendet und Ausgang PULS_AUS IST TRUE
FOR i2 := 1 TO 10 BY 1 DO
IF SPS_TIME_I = TOD_TO_DINT (SCHALTUHR_AUS[Wochentag,i2])/1000 AND TOD_TO_DINT (SCHALTUHR_AUS[Wochentag,i2])/1000>0 THEN
PULS_AUS:=TRUE;
EXIT;
ELSE
PULS_AUS:=FALSE;
END_IF;
;
END_FOR;
END_FUNCTION_BLOCK
//*********************************ENDE FB***************************************