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

Page 1 of 2 12 LastLast
Results 1 to 10 of 15

Thread: Tagesnummer berechnen?

  1. #1
    Join Date
    08.09.2004
    Posts
    18
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Default


    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
    Reply With Quote Reply With Quote Tagesnummer berechnen?  

  2. #2
    Join Date
    06.10.2003
    Posts
    4,669
    Danke
    666
    Erhielt 827 Danke für 649 Beiträge

    Default

    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. Folgender Benutzer sagt Danke zu Onkel Dagobert für den nützlichen Beitrag:

    NikolausL (20.10.2018)

  4. #3
    Join Date
    06.10.2003
    Posts
    4,669
    Danke
    666
    Erhielt 827 Danke für 649 Beiträge

    Default

    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
    Attached Files Attached Files

  5. #4
    Join Date
    06.10.2003
    Posts
    4,669
    Danke
    666
    Erhielt 827 Danke für 649 Beiträge

    Default

    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
    Reply With Quote Reply With Quote Die allgemeine und auch verständliche "Normalform"  

  6. #5
    Anonymous Gast

    Default

    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???

  7. #6
    Join Date
    25.10.2006
    Posts
    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

  8. #7
    Join Date
    18.09.2006
    Posts
    233
    Danke
    0
    Erhielt 2 Danke für 2 Beiträge

    Default

    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

  9. #8
    Join Date
    02.02.2006
    Location
    Hessen
    Posts
    428
    Danke
    16
    Erhielt 28 Danke für 22 Beiträge

    Default

    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!
    Reply With Quote Reply With Quote Schaltjahr berechnen  

  10. #9
    Join Date
    20.06.2003
    Location
    Sauerland.NRW.Deutschland
    Posts
    5,454
    Danke
    99
    Erhielt 925 Danke für 628 Beiträge

    Default

    das ist nicht ganz korrekt

    für sps anwendungen sollte das aber meist reichen

    Quote Originally Posted by 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 auf meiner HP
    zum Download im Internet (Backup nicht unbedingt aktuell)

  11. #10
    Join Date
    06.10.2003
    Posts
    4,669
    Danke
    666
    Erhielt 827 Danke für 649 Beiträge

    Default


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hall tsp_05,

    Quote Originally Posted by tsp_05 View Post
    ..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
    Der höchste Lohn für unsere Bemühungen ist nicht das, was wir dafür bekommen, sondern das, was wir dadurch werden.
    John Ruskin

Similar Threads

  1. Wärmedurchgang berechnen
    By stylophonics in forum Stammtisch
    Replies: 21
    Last Post: 19.07.2016, 15:12
  2. Drehmomentbegrenzung berechnen
    By Pico1184 in forum Simatic
    Replies: 19
    Last Post: 05.09.2011, 11:19
  3. 2^x berechnen
    By TimoK in forum Simatic
    Replies: 4
    Last Post: 23.02.2010, 09:31
  4. Checksumme berechnen?
    By mpexx in forum Simatic
    Replies: 6
    Last Post: 30.01.2008, 07:52
  5. Kalenderwoche berechnen
    By Simatics in forum Simatic
    Replies: 1
    Last Post: 06.05.2007, 21:59

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •