Die Kalenderwoche aus einer CPU318 auslesen

uwemiess

Level-1
Beiträge
49
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
hallo leute,
weiß jemand wie man die kalenderwoche aus einer cpu 318 ausgelesen werden kann? habe dies über einen eigenen fc versucht und festtellen müßen das dies nicht so einfach ist. wäre für jeden tipp und lösungsansatz dankbar.
mfg uwe
 
Habe da zwar schon lange nicht mehr dranrumgespielt aber ein Lösungsansatz war, sofern die Uhr einmal richtig justiert wird, die Wochentage (letztes Byte der Tod-Befehle) hochzuzählen. Immer wieder Montags beginnt die neue KW ...
Die richtige Voreinstellung des Wochentages ist wichtig, denn sonst gibts keinen 'Montag' in der CPU !

Oder es ging auch alle Tage durch 7 geteilt zu zählen ... (Modulo)

Als 'Absolutwert' ohne Zähler errechnet sich die KW in der Ganzzahldivision des ausgelesenen (((Monat -1) * 30,5) + Datum) / 7); die '30,5' kann man dabei etwas angleichen - je nachdem ob Schaltjahr oder nicht ... Da wie gesagt die Kalenderwoche fast immer Montags beginnt brauchts dabei nur einmal je Woche (Montag morgen) eingelesen zu werden. Das spart Zykluszeit.
In der Step7 Onlinehilfe ist zu SFC01 (Read_Clock) ein AWL Beispiel zur Übergabe der #Parameter abgebildet. Das funktioniert schon unverändert fast dafür.

mfG
tobias
 
onkel schrieb:
Grundlegend wichtig ist zunächst erst einmal die Definition der ersten Kalenderwoche.
Siehe (...)

Stimmt. Stelle eben fest das seinerzeit nie berücksichtigt zu haben. Begann den Versuch Anfang 2005 - und rechnete es per Taschenkalender hoch. KW1/2005 begann genau am ersten Montag (03.01), was ich dann mit ca. " INC(0_am_ersten_Montag_neues_Jahr)" für 'alle Ewigkeit' übernahm..

Ist ja spannend, auf 'ne Norm darüber kam ich nicht. Versuchte es wegen des Abgleiches einiger Abrechnungszeiträume die kein Datum sondern ...bis einschl. KW30 enthielten da in die Nähe zu kommen. Das passte dann, zufällig genau!
Gruss
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Komisch wie die Zufälle sich häufen!

Vor einer Woche ist dieselbe Frage in einem anderen Forum aufgetaucht und da hat RolfB eine sehr interessante Lösung gezeigt. Du kannst sie here downloaden.

Zip-datei einfach unzippen und dann mit Simatic Manager öffnen.
 
Hallo,
ich glaube schon, das die Norm ISO 8601 auch für
Deutschland zutrifft. siehe:
ISO 8601 - Realisierung
--------------------------------------------------------------------------------
Der international Standard ist ISO 8601:1988, er ersetzt ISO 2014, ISO 2015, ISO 2711, ISO 3307 und ISO 4031.

Andere Normungsinstitutionen haben den Standard übernommen:

European Norm: EN 28601:1992
USA Standard: ANSI X3.30-1985(R1991)
USA Standard: NIST FIPS 4-1
Japan: JIS X 0301-1992
Canada: CSA Z234.5:1989
Australia: AS 3802:1997
South Africa: ARP 010:1989
Mindestens folgende europäische Länder haben diese Norm realisiert (Stand 1998-10-22):
Belgien, Dänemark, Deutschland, Finnland, Frankreich, Griechenland, Großbritanien, Irland, Island, Italien, Luxemburg, Niederlande, Norwegen, Österreich, Polen, Portugal, Schweden, Schweiz, Spanien, Tschechische Republik.

Kalenderberechnung ist schon ziemlich tricky, aber bei
der Berechnung der KW kann man so Sachen wie Schaltjahre
etc. außer Acht lassen, weil man sich nur auf das betreffende Jahr
bezieht.

Ups. ich sehe gerade, dass RMA auf einen Beitrag von mir aus einem
anderen Forum hinweist.
Den habe ich eben ein wenig überarbeitet und hänge den mal hier an.

Das könnte ein Lösungsansatz sein. Für die Gültigkeit des Datums
bzw. eine Überprüfung müßte man noch ergänzen.

mfg.

Rolf
 

Anhänge

  • kalwo.zip
    195,7 KB · Aufrufe: 173
hier mal noch eine etwas andere lösung

1 mal editiert.
habe den code nochmal etwas gekürzt.

Code:
FUNCTION FC 22 : VOID
TITLE =
// KW  
AUTHOR : Lischnew
FAMILY : Datum
NAME : KW
VERSION : 1.1


VAR_INPUT
  datum_in : DATE ; //Eingangsdatum
END_VAR
VAR_OUTPUT
  kw : INT ;    //Kalenderwoche
END_VAR
VAR_TEMP
  datum_in_dt : DATE_AND_TIME ; //Eingangsdatum
  datum_in_dt_1_1 : DATE_AND_TIME ; //Datum 1.1.xxxx
  datum_in_d_1_1 : DATE ;   //Datum 1.1.xxxx
  wochentag_4_1 : INT ; //Wochentag des 4.1
  erster_tag_kw1 : DATE ;   //Datum des 1. Tages der 1. KW
  tage_1_1_to_1kw1 : INT ;  //Differenz vom 1.1 bis 1. Tag der 1. KW
  tageszahl : INT ; //Tagnummer des Eingangsdatum
END_VAR
BEGIN
NETWORK
TITLE = 

      CALL FC     3 (//eingangsdatum wandeln in dt 
           IN1                      := #datum_in,
           IN2                      := TOD#0:0:0.0,
           RET_VAL                  := #datum_in_dt);

      CALL FC     3 (//vorbelegen eines 1.1.xxxx dt 
           IN1                      := D#2000-1-1,
           IN2                      := TOD#0:0:0.0,
           RET_VAL                  := #datum_in_dt_1_1);//1.1 

      L     LB     0; 
      T     LB     8; // jahr in #datum_in_dt_1_1 auf gewünschtes setzen 

      CALL FC     6 (//dt -> d 
           IN                       := #datum_in_dt_1_1,
           RET_VAL                  := #datum_in_d_1_1);//1.1 des gewünschten jahres 


      CALL FC     7 (
           IN                       := #datum_in_dt_1_1,
           RET_VAL                  := #wochentag_4_1);//wt vom 1.1 

//wochentag anpassen 
      L     #wochentag_4_1; 
      L     3; 
      +I    ; //wt vom 4.1
      L     1; 
      -I    ; 
      T     #wochentag_4_1; 
      L     7; 
      <=I   ; 
      SPB   wt1; 
      L     #wochentag_4_1; 
      L     7; 
      -I    ; 
      T     #wochentag_4_1; 
wt1:  NOP   0; 


//ermitteln welcher tag der erste tag der ersten kw ist 
      L     #datum_in_d_1_1; // 1.1
      L     3; 
      +I    ; // 4.1
      L     #wochentag_4_1; 
      -I    ; 
      L     1; 
      +I    ; 
      T     #erster_tag_kw1; 

//ermitteln der differenz zwischen 1.1 und erste tag der ersten kw 
      L     #erster_tag_kw1; 
      L     #datum_in_d_1_1; 
      -I    ; 
      L     1; 
      +I    ; 
      T     #tage_1_1_to_1kw1; 

//ermitteln der wievielte tag es ist 
      L     #datum_in; 
      L     #datum_in_d_1_1; 
      -I    ; 
      L     1; 
      +I    ; 
      T     #tageszahl; 

//kw ermitteln 
      L     #tageszahl; 
      L     #tage_1_1_to_1kw1; 
      -I    ; 
      L     7; 
      +I    ; 
      L     7; 
      /I    ; 
      T     #kw; 
      L     0; 
      <>I   ; 
      SPB   kwOK; 
      L     53; 
      T     #kw; 
kwOK: NOP   0; 
END_FUNCTION
 
Zurück
Oben