Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 15

Thema: Tagesnummer berechnen?

  1. #1
    Registriert seit
    08.09.2004
    Beiträge
    18
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    hi leute

    wie kann man unter s7 die genaue tagesnummer berechnen?z. B. 4. januar= 4 tag im jahr. gibt es das irgendwelche formel für. habe bis jetzt nichts vernünftiges gefunden. wer kann mir helfen?

    vielen dank schonmal
    Zitieren Zitieren Tagesnummer berechnen?  

  2. #2
    Registriert seit
    06.10.2003
    Beiträge
    3.410
    Danke
    449
    Erhielt 504 Danke für 407 Beiträge

    Standard

    Hallo Verona,

    darf's auch SCL sein? Alles ohne Gewähr.


    Code:
    (************************************************************************************************************************)
    FUNCTION "DATUM_TO_JAHRESTAG" : INT
    TITLE = 'Jahrestag aus Datum'
    (************************************************************************************************************************)
    KNOW_HOW_PROTECT
    VERSION : '1.0'
    AUTHOR  : Onkel Dagobert ;-)
    NAME    : DATE
    FAMILY  : Entenhausen
    (************************************************************************************************************************)
    
    VAR_INPUT
      TAG, MONAT                : INT;
      SCHALTJAHR                : BOOL;
    END_VAR
    
    VAR_TEMP
      a                         : INT;
    END_VAR
    
    BEGIN
    //______________________________________________________________________________
    //    Jahrestag aus Datum berechnen
    //¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
     a := 2;
     IF SCHALTJAHR THEN
       a := 1;
     END_IF;
     DATUM_TO_JAHRESTAG:=REAL_TO_INT(TRUNC(275*MONAT/9)-a*TRUNC((monat+9)/12)+tag-30);
    
    END_FUNCTION;

    Code:
    (************************************************************************************************************************)
    FUNCTION "SCHALTJAHR" : BOOL
    TITLE = 'Schaltjahr'
    // Funktion getestet
    (************************************************************************************************************************)
    KNOW_HOW_PROTECT
    VERSION : '1.0'
    AUTHOR  : Onkel Dagobert ;-)
    NAME    : DATE
    FAMILY  : Entenhausen
    (************************************************************************************************************************)
    
    VAR_INPUT
      JAHR                      : INT;      // vierstellige Jahreszahl
    END_VAR
    
    BEGIN
      SCHALTJAHR := false;
      IF (JAHR MOD 400 = 0) OR
         (JAHR MOD 4   = 0) AND
         &#40;JAHR MOD 100 <> 0&#41;THEN
         SCHALTJAHR &#58;= true;
    END_IF;
    
    END_FUNCTION;

    Code:
    &#40;************************************************************************************************************************&#41;
    FUNCTION "JAHRESZAHL_VIERSTELLIG" &#58; VOID
    TITLE = 'Datum mit vierstelliger Jahreszahl aus Systemdatum ermitteln'
    &#40;************************************************************************************************************************&#41;
    KNOW_HOW_PROTECT
    VERSION &#58; '1.0'
    AUTHOR  &#58; Onkel Dagobert ;-&#41;
    NAME    &#58; DATE
    FAMILY  &#58; Entenhausen
    &#40;************************************************************************************************************************&#41;
    
    VAR_OUTPUT
      TAG, MONAT, JAHR          &#58; INT;
    END_VAR
    
    VAR
      TEMP_DT                   &#58; DT;
      CDT AT TEMP_DT            &#58; ARRAY&#91;0..7&#93; OF BYTE;
      TEMP_INT                  &#58; INT;
    END_VAR
      
    //______________________________________________________________________________
    //    Datum mit vierstelliger Jahreszahl aus Systemdatum ermitteln
    //¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
    BEGIN
    TEMP_INT &#58;= READ_CLK&#40;CDT&#58;=TEMP_DT&#41;;
    TAG      &#58;= WORD_TO_INT&#40;BYTE_TO_WORD&#40;CDT&#91;2&#93;&#41;&#41;; 
    MONAT    &#58;= WORD_TO_INT&#40;BYTE_TO_WORD&#40;CDT&#91;1&#93;&#41;&#41;; 
    TEMP_INT &#58;= WORD_TO_INT&#40;BYTE_TO_WORD&#40;CDT&#91;0&#93;&#41;&#41;;
    IF TEMP_INT >= 90
       THEN JAHR &#58;= TEMP_INT + 1900;
       ELSE JAHR &#58;= TEMP_INT + 2000;
    END_IF;
    END_FUNCTION;


    Gruss, Onkel

  3. #3
    Registriert seit
    06.10.2003
    Beiträge
    3.410
    Danke
    449
    Erhielt 504 Danke für 407 Beiträge

    Standard

    Hallo,

    da o.g. Berechnung nicht nachvollziehbar ist, hier eine Testumgebung zum Simulieren. Es wird zunächst eine Zahl von 1 bis 365/366 erzeugt. Aus dieser wird mit einer FC das Datum (Tag, Monat) berechnet. Aus diesem Datum wird wiederum mit einer anderen FC der Tag des Jahres berechnet und mit dem ursprünglichen verglichen.

    ZUM DOWNLOAD MÜSST IHR EINGELOGGT SEIN!

    Funktion JAHRESTAG --> DATUM
    Code:
    &#40;************************************************************************************************************************&#41;
    FUNCTION "JAHRESTAG_TO_DATUM" &#58; VOID
    TITLE = 'Datum aus Tag des Jahres'
    &#40;************************************************************************************************************************&#41;
    KNOW_HOW_PROTECT
    VERSION &#58; '1.0'
    AUTHOR  &#58; Onkel_D
    NAME    &#58; DATE
    FAMILY  &#58; Entenh
    &#40;************************************************************************************************************************&#41;
    
    VAR_INPUT
      JAHRESTAG                 &#58; INT;
      SCHALTJAHR                &#58; BOOL;
    END_VAR
    
    VAR_OUTPUT
      TAG                       &#58; INT;
      MONAT                     &#58; INT;
    END_VAR
    
    VAR_TEMP
      mm, dd                    &#58; REAL;
      k                         &#58; INT;      // Korrekturwert Schaltjahr
    END_VAR
    
    BEGIN
    k &#58;= 2;
    IF SCHALTJAHR THEN
      k &#58;= 1;
    END_IF;
    mm &#58;= TRUNC&#40;&#40;9*&#40;k+JAHRESTAG&#41;&#41;/275.0+0.98&#41;;
    IF JAHRESTAG < 32 THEN
       mm &#58;= 1;
    END_IF;
    TAG   &#58;= REAL_TO_INT&#40;JAHRESTAG - TRUNC&#40;&#40;275*mm&#41;/9&#41; + k*TRUNC&#40;&#40;mm+9&#41;/12&#41;+30&#41;;
    MONAT &#58;= REAL_TO_INT&#40;mm&#41;;
    END_FUNCTION;

    Gruß, Onkel
    Angehängte Dateien Angehängte Dateien

  4. #4
    Registriert seit
    06.10.2003
    Beiträge
    3.410
    Danke
    449
    Erhielt 504 Danke für 407 Beiträge

    Standard

    Hallo,

    nicht dass ihr denkt, "der Onkel spinnt doch!" . Die allgemeine und auch verständliche "Normalform" sieht ungefähr so aus:

    Code:
    FUNCTION "JAHRESTAG" &#58; INT
    TITLE =
    AUTHOR &#58; Onkel_D
    FAMILY &#58; Entenh
    NAME &#58; 'DATE'
    VERSION &#58; 0.1
    
    
    VAR_INPUT
      TAG &#58; INT ;   
      MONAT &#58; INT ; 
      SCHALTJAHR &#58; BOOL ;   
    END_VAR
    VAR_TEMP
      TEMP_INT &#58; INT ;  
    END_VAR
    BEGIN
    NETWORK
    TITLE =
    
          SET   ; 
          SAVE  ; 
    
    //*** Tage voller Monate seit Jahresbeginn
          L     #MONAT; 
          DEC   1; // 0..11
          SPL   ERR; // >11
          SPA   JAN; 
          SPA   FEB; 
          SPA   MAE; 
          SPA   APR; 
          SPA   MAI; 
          SPA   JUN; 
          SPA   JUL; 
          SPA   AUG; 
          SPA   SEP; 
          SPA   OKT; 
          SPA   NOV; 
          SPA   DEZ; 
    
    //*** Verlassen mit Fehler
    ERR&#58;  L     0; 
          T     #RET_VAL; 
          CLR   ; 
          SAVE  ; 
          BEA   ; 
    
    //*** Tage der abgeschlossenen Monate
    //    &#40;Tage vom Vormonat&#41;
    JAN&#58;  L     0; 
          SPA   TAGE; 
    FEB&#58;  L     31; 
          SPA   TAGE; 
    MAE&#58;  L     59; // ohne Schaltjahr
          SPA   TAGE; 
    APR&#58;  L     90; 
          SPA   TAGE; 
    MAI&#58;  L     120; 
          SPA   TAGE; 
    JUN&#58;  L     151; 
          SPA   TAGE; 
    JUL&#58;  L     181; 
          SPA   TAGE; 
    AUG&#58;  L     212; 
          SPA   TAGE; 
    SEP&#58;  L     243; 
          SPA   TAGE; 
    OKT&#58;  L     273; 
          SPA   TAGE; 
    NOV&#58;  L     304; 
          SPA   TAGE; 
    DEZ&#58;  L     334; 
          SPA   TAGE; 
    
    //*** verstrichene Tage vom aktuellen Monat dazu
    TAGE&#58; L     #TAG; 
          +I    ; 
          T     #TEMP_INT; 
    
    //*** Korrektur, wenn SCHALTJAHR
          U     #SCHALTJAHR; 
          U&#40;    ; 
          L     #MONAT; 
          L     2; 
          >I    ; 
          &#41;     ; 
          L     #TEMP_INT; 
          SPBN  M001; 
          L     1; 
          +I    ; 
    
    //*** Ausgabe
    M001&#58; T     #RET_VAL; 
    END_FUNCTION

    Gruss, Onkel
    Zitieren Zitieren Die allgemeine und auch verständliche "Normalform"  

  5. #5
    Anonymous Gast

    Standard

    hallo

    hab leider ein problem weil ich nicht weiss wie es funktioniert die uhrzeit und das datum auszulesen. mann muss ja sfc1 im ob1 aufrufen. weiss dann aber nicht wie ich den scf1 parametriere und die uhrzeit und das datum weiterverareibten kann. wer kann mir helfen???

  6. #6
    Registriert seit
    25.10.2006
    Beiträge
    1
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Daumen hoch

    Hi Onkel,
    ich finde dein Programm zum Jahrestagberechnung interessant,
    aber wie teste ich es,
    kann ich auch die erste Version benutzen und testen ?
    mfg.
    tsp_05
    Zitieren Zitieren hilfe  

  7. #7
    Registriert seit
    18.09.2006
    Beiträge
    231
    Danke
    0
    Erhielt 2 Danke für 2 Beiträge

    Standard

    hier was in awl.
    die fc berechnet als out zwar die kw aber die tageszahl liegt in der fc als temp_var vor

    http://www.sps-forum.de/showthread.p...ight=tageszahl
    .
    mfg KALEL

    Wer über gewisse Dinge nicht den Verstand verliert, der hat keinen zu verlieren.
    Gottfried Ephraim Lessing

  8. #8
    Registriert seit
    02.02.2006
    Ort
    Hessen
    Beiträge
    429
    Danke
    16
    Erhielt 28 Danke für 22 Beiträge

    Standard

    Hallo,

    der Befehl MOD erzeugt für Schaltjahre z.B. im OB1 ein VKE:
    Code:
    L LB12    //Jahreszahl zweistellig (1990..2089)
    BTI        //BCD nach INT
    L 4        //jedes 4. Jahr
    MOD      //Divisionsrest ermitteln
    L 0        //wenn kein Rest,
    ==I        //dann ist Schaltjahr
    mfG Werner
    Hoch lebe die Suchfunktion!
    Zitieren Zitieren Schaltjahr berechnen  

  9. #9
    Registriert seit
    20.06.2003
    Ort
    Sauerland.NRW.Deutschland
    Beiträge
    4.850
    Danke
    78
    Erhielt 800 Danke für 543 Beiträge

    Standard

    das ist nicht ganz korrekt

    für sps anwendungen sollte das aber meist reichen

    Zitat Zitat von WIKIPEDIA
    • Ist die Jahreszahl durch 4 teilbar, aber nicht durch 100, dann ist es ein Schaltjahr mit 366 Tagen. Beispiele: 1980, 1972, 1720.
    • Ist die Jahreszahl durch 100 teilbar, aber nicht durch 400, dann ist das Jahr ein gewöhnliches Gemeinjahr und hat nur 365 Tage, z. B. in den Jahren 1700, 1800 und 1900 oder ferner 2100.
    • Ist die Jahreszahl durch 400 teilbar, ist das Jahr ein Schaltjahr. Die Jahre 1600 und 2000 waren – in Übereinstimmung mit der Julianischen Schaltregel – Schaltjahre zu 366 Tagen.
    oder mathematisch:
    if (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)) {// schaltjahr}
    .
    mfg Volker .......... .. alles wird gut ..

    =>Meine Homepage .. direkt zum Download

    Meine Definition von TIA: Total Inakzeptable Applikation

  10. #10
    Registriert seit
    06.10.2003
    Beiträge
    3.410
    Danke
    449
    Erhielt 504 Danke für 407 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hall tsp_05,

    Zitat Zitat von tsp_05 Beitrag anzeigen
    ..kann ich auch die erste Version benutzen und testen ?..
    Davon gehe ich erst einmal aus.

    Den "spionagesicheren" Code hatte ich damals irgendwo im Internet gefunden. Ich hatte ihn in SCL umgesetzt und ein wenig getestet. Ich denke, er hatte auch funktioniert, zumindest für den heute üblichen Bereich von 1990 bis 2089. Der Haken allerdings ist, dass es keine Herleitung für die Berechnung gibt. Der Algorithmus ist empirisch entstanden, d.h. es hat jemand solange probiert bis es irgendwie funktionierte. Falls einmal Probleme auftreten sollten, hat man keine Chance, den Fehler zu finden! So etwas ist bestenfalls für eine private Hofbeleuchtungssteuerung vertretbar, nicht für industrielle Anwendungen, Krankenhäuser oder öffentliche Gebäude, etc.

    Aufgrund von Rundungsfehlern in der Berechnung ist die Schreibweise in SCL von Bedeutung. Wenn du z.Bsp. die Berechnung aufteilst und Zwischenergebnisse bildest, wird es wahrscheinlich schon nicht mehr funktionieren.

    Das absolut 100%-ige Testen ist sehr aufwändig. Man müsste in so einem Fall jedes Einzelergebnis handisch überprüfen. Eine annährende Sicherheit kannst du erreichen, wenn du dieselbe Funktion mit verschiedenen Algorithmen berechnetst, und die Ergebnisse vergleichst.

    Verwende besser einen "transparenten" Code!


    Gruß, Onkel
    Es gibt viel mehr Leute, die freiwillig aufgeben, als solche, die echt scheitern.
    Henry Ford

Ähnliche Themen

  1. CRC berechnen
    Von H.Scorpio im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 20.01.2011, 18:05
  2. 2^x berechnen
    Von TimoK im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 23.02.2010, 09:31
  3. K-Zahl im Gas berechnen.
    Von Bender25 im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 07.06.2007, 13:56
  4. Kalenderwoche berechnen
    Von Simatics im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 06.05.2007, 21:59
  5. Spline berechnen
    Von neibeck im Forum Programmierstrategien
    Antworten: 8
    Letzter Beitrag: 25.04.2007, 20:23

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •