Schaltuhr mit S7316 2DP

Hallo,

ich würde es einfach so lösen.

Code:
FUNCTION FC 2 : VOID
TITLE =
VERSION : 0.1


VAR_TEMP
  CPU_Time : DATE_AND_TIME ;	//Gelesene CPU Uhr
  error : INT ;	
END_VAR
BEGIN
NETWORK
TITLE =
//0 Jahr    BYTE Jahr
//1 Monat   BYTE Monat
//2 Tag     BYTE Tag
//3 Stunde  BYTE Stunde
//4 Minute  BYTE Minute
//5 Sekunde BYTE Sekunde
//6 MS1     BYTE Die zwei höherwertigen Stellen von ms
//7 MS2_WT  BYTE Niederwertigste Stelle von ms | Wochentag =1 So.
//
      CALL SFC    1 (// Lesen des System-Datums und Uhrzeit
           RET_VAL                  := #error,
           CDT                      := #CPU_Time);

      L     #error; // Fehler beim lesen der Zeit ? 
      L     0; // Ist der Inhalt von #error ="0"
      <>I   ; // dann ist alles OK.
      BEB   ; 

      L     LB     3; // Stunden
      BTI   ; // BCD in INT wandeln
      L     8; // 8 Uhr ein
      >=I   ; 
      U(    ; 
      TAK   ; // Tausche Inhalt von AKKU 1 mit AKKU 2
      L     22; // 22 Uhr aus
      <I    ; 
      )     ; 
      =     M    100.0; // Merker ist =1 von 8-22 Uhr

END_FUNCTION

MfG
Daniel
 
Hallo,

danke hat so Funktioniert.

Wie bekomme ich jetzt noch Minuten z.B. (8:30 ein 21:45 aus) hinzu.

Gruß Buffi4712
 
Hallo,

nichts einfacher als das.

Code:
FUNCTION FC 2 : VOID
TITLE = 
VERSION : 0.1


VAR_TEMP
  CPU_Time : DATE_AND_TIME ;	//Gelesene CPU Uhr
  error : INT ;	
  Ein_Stunde : BYTE ;	
  Ein_Minute : BYTE ;	
  Aus_Stunde : BYTE ;	
  Aus_Minute : BYTE ;	
END_VAR
BEGIN
NETWORK
TITLE = 
//0 Jahr    BYTE Jahr
//1 Monat   BYTE Monat
//2 Tag     BYTE Tag
//3 Stunde  BYTE Stunde
//4 Minute  BYTE Minute
//5 Sekunde BYTE Sekunde
//6 MS1     BYTE Die zwei höherwertigen Stellen von ms
//7 MS2_WT  BYTE Niederwertigste Stelle von ms | Wochentag =1 So.
//
      L     B#16#8; // Ein Stunde / 8
      T     #Ein_Stunde; // in Temp. eintragen

      L     B#16#30; // Ein Minute / 30
      T     #Ein_Minute; // in Temp. eintragen

      L     B#16#21; // Aus Stunde / 21
      T     #Aus_Stunde; // in Temp. eintragen

      L     B#16#45; // Aus Minute / 45
      T     #Aus_Minute; // in Temp. eintragen

      CALL SFC    1 (// Lesen des System-Datums und Uhrzeit
           RET_VAL                  := #error,
           CDT                      := #CPU_Time);

      L     #error; // Fehler beim lesen der Zeit ? 
      L     0; // Ist der Inhalt von #error ="0"
      <>I   ; // dann ist alles OK.
      BEB   ; 

      L     LW     3; // Stunde:Minute
      L     LW    12; // Ausschaltzeit Stunde:Minute
      <I    ; 
      U(    ; 
      TAK   ; // Tausche Inhalt von AKKU 1 mit AKKU 2
      L     LW    10; // Einschaltzeit Stunde:Minute
      >=I   ; 
      )     ; 
      SPB   set; // =1, Sprung zu "set"
//- rückseten -------------------------------------------------------
      SET   ; // Merker
      R     M    100.0; // rücksetzen
      SPA   nix; 
//- Aktiv setzen ----------------------------------------------------
set:  SET   ; 
      S     M    100.0; // Merker ist =1 von 8:30-22:45 Uhr
nix:  NOP   0; 

END_FUNCTION

MfG
Daniel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

funktioniert natürlich auch so,

Code:
      L     LW     3; // Stunde:Minute
      L     LW    12; // Ausschaltzeit Stunde:Minute
      <I    ;
      U(    ;
      TAK   ; // Tausche Inhalt von AKKU 1 mit AKKU 2
      L     LW    10; // Einschaltzeit Stunde:Minute
      >=I   ;
      )     ;
      =     M    100.0; // Merker ist =1 von 8:30-22:45 Uhr

MfG
Daniel
 
Hi,

das kannst auch einfacher haben:

Deine CPU hat nen Uhrzeitalarm. (Hardwarekonfig... CPU... Uhrzeitalarm)
Da kannst du die Aufrufoptionen zum OB10 einstellen.

Im OB10 setzt du einfach ein Bit, und setzt es nach der Bearbeitung im normalen Programm zurück.

Damit kannst dann auch deinen anderen Timer starten...

MfG

Micha
 
Hallo,

das Problem am OB10 ist dass man keine
Endzeit angeben kann in der das Bit
zurück gesetzt wird.

Es sind auch nicht mehrere Schaltzeiten möglich,
wenn dan nur mit gößerem Aufwand.

MfG
Daniel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
hi,

warum? Einfach Bit setzen, und damit z.B. nen Impuls starten und sofort rücksetzen. Ich glaub einfacher gehts nimmer....

Größere CPUs haben mehrere Uhrzeitalarme...

Schönes WE

Micha
 
Hallo Micha,

das ist mir schon klar das man im OB10 das Bit nicht rücksetzen kann.

Aber wenn die Zeiten von einem OP o. sonstigen Visualisierung eingegeben
werden sollen, muss ja dann erst wieder Mathematik betrieben werden um
z.B. einen Zeitwert für einen Timer (S5 Timer, SFB4 "TON", SFB5 "TOF", ...)
zu errechen (Ausschaltzeit).

MfG
Daniel
 
Zurück
Oben