Funktion für Frostperiode ?

dietere
2007-09-19
2007-09-20
  • dietere - 2007-09-19

    Hallo,

    ich habe 2 Variablen vom Typ DATE für "Beginn Frostperiode" und "Ende Frostperiode".

    Ich suche jetzt eine Funktion welche schaut ob das aktuelle Datum in diesem Bereich fällt. Habe in OSCAT nichts passendes gefunden. Oder schreibt man solche "einfache" Funktionen besser selber ?

    Grüsse,

    Dieter

     
  • J Schohaus - 2007-09-19

    Hallo Dieter

    Vergleich die werte doch miteinander

    z.B.

    IF IstDate >= StartDate AND IstDate < EndDate THEN

    ( Aktion ) ;

    END_IF

    mfG

    Jochen

     
  • hugo - 2007-09-19

    nun ich denke das problem ist das die funktion ja für ein beliebiges jahr funktionieren soll, also ein einfach vcergeich mit datumswerten eben nicht funktioniert oder??

     
  • hugo - 2007-09-19

    die funktion temp_ext in der oscat lib hat diesen periodenvergleich auch mit drin, macht aber vieles mehr. schau dir mal dort den source code an

     
  • hugo - 2007-09-19

    in der 2.0 wird hierfür eine funktion angeboten

    folgender source code

    FUNCTION period : BOOL

    VAR_INPUT

    d1 : DATE;
    
    dx : DATE;
    
    d2 : DATE;
    

    END_VAR

    VAR

    END_VAR

    period := (date_add(d1,0,0,0,year(dx)-year(d1)) <= dx) AND (date_add(d2,0,0,0,year(dx)-year(d2)) >= dx);

     
  • hugo - 2007-09-19

    sorry das war etwas zu schnell gescossen

    es muss natürlich noch berücksichtigt werden das die periode über den 1.1 verläuft.

    hier der code der funktioniert:

    FUNCTION period : BOOL

    VAR_INPUT

    d1 : DATE;
    
    dx : DATE;
    
    d2 : DATE;
    

    END_VAR

    VAR

    p1 : INT;
    
    px : INT;
    
    p2 : INT;
    

    END_VAR

    (*

    version 1.0 19 sep 2007

    programmer hugo

    tested by tobias

    PERIOD checks if a given date is between two dates (d1 and d2) d1 is the starting date and d2 the last date for the period.

    the years of the dates are ignored, so the function period cheks for a time period within a year independet of the year.

    *)

    p1 := day_of_year(D1);

    p2 := day_of_year(D2);

    px := day_of_year(DX);

    IF p2 >= p1 THEN

    period := px <= p2 AND px >= p1;
    

    ELSE

    period := px <= p2 OR px >= p1;
    

    END_IF;

    (* revision history

    hm 19. sep 2007

    original version
    

    *)

     
  • dietere - 2007-09-19

    ja super, danke hugo

    das hilft mir erstmal weiter, vor allem weil jahresunabhängig

    Ist diese Funktion auch in der neuen oscat.lib drin ?

    Grüsse,

    Dieter

     
  • hugo - 2007-09-19

    ja sie wird in der 2.0 drin sein, sie wird heute nacht online gestellt

     
  • dietere - 2007-09-19

    hallo hugo,

    wie sieht das bei einem schaltjahr aus ?

    d1 und d2 haben ja immer die gleiche Jahreszahl, z.B. 2007.

    dx wird aber irgendwann mal ein Schaltjahr, dann ist day_of_year dann doch ein Tag daneben, oder ?

    Grüsse,

    Dieter

     
  • hugo - 2007-09-19

    ja das isr richtig.

     
  • hugo - 2007-09-20

    hallo dieter leider hast du recht.

    in einem schaltjahr schaltet die funktion einen tag zu früh falls das datum nach dem 28. feb liegt.

    wir werden das in der nächsten release verbessern.

    es wird ein prüfung auf schaltjahr mit eingebaut.

     
  • dietere - 2007-09-20

    wow, ich bin fassungslos

    was ist das denn für ein Service - klasse

    ich bedanke mich

     
  • Oberchefe - 2007-09-20

    Schaltjahr:```

    Jahr:=STRING_TO_INT((MID(DT_TO_STRING(DatumUhrzeit), 4, 4)));
    Schaltjahraktiv:=NOT Jahr.1 AND NOT Jahr.0 ;

    ```

    Paßt von 1904 bis 2096, 2100 ist bekanntlich eine Ausnahme, falls Du damit rechnest daß das Teil bis dahin noch laufen muß kannst Du ja entsprechende Ausnahmen von Hand rein setzen (1700, 1800, 1900, 2100, 2200, 2300, 2500, 2600....)

     

Log in to post a comment.