Format Date and Time einer KW zuordnen

skyvan

Level-1
Beiträge
52
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo an alle

ich habe in einem DB 1000 Realwerte gespeichert in einem 2ten DB 1000 Datensätze mit dem Zeitstempel wann die dazugehörigen Realwerte abgespeichert wurden. Jetzt komm ich zu meinem Problem ich möchte die KW auswählen können und die Daten plus Zeitstempel angezeigt bekommen die in der jeweiligen KW gespeichert wurden. Ich hoffe ihr hab eine Idee wie man es lösen kann.

Gruß und besten Dank Marco
 
Was genau ist dein Problem, die Berechnung der KW? dazu gibt es bei Wikipedia Artikel. Wenn ich recht erinnere, hat auch die Oscat-Library dazu etwas zu bieten.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Was genau ist dein Problem, die Berechnung der KW? dazu gibt es bei Wikipedia Artikel. Wenn ich recht erinnere, hat auch die Oscat-Library dazu etwas zu bieten.
Ich glaube er will die KW angeben und will dann das Anfangsdatum und Endedatum dieser KW erhalten.
Der Baustein in der Oscat-Bibliothek macht es genau andersherum
 
nein das ist nicht mein Problem, sondern eher ich möchte über ein OP Listenfeld (1-53) auswählen können was angezeigt wird. Das heisß ich muß erst alle Zeitwerte im DB nach dem passenden durchsuchen, markieren und dann anzeigen + Realwerte aus dem 1ten DB

Gruß MArco

Edit: Marlob hat es fast genau auf den Punkt gebracht, nur will ich alle Datenwerte aus dem 1ten DB die z.B. aus KW 3 sind angezeigt bekommen

unsere Messwerte erstrecken sich bis zu einem Jahr.
 
Zuletzt bearbeitet:
Ich würde dann vielleicht aus der angewählten KW das Anfangs- und das Enddatum errechnen und den DB nach den Werten durchsuchen. Die gefundenen Werte in einen "Anzeige-DB" kopieren (macht alles die SPS), dessen Variablen auf dem OP dargestellt werden.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
hi marlob

normalerweise probiere ich allein mein Zeug nur bin ich im Moment ein wenig unter Zeitdruck. HAst du evtl ein Link für mich oder besser noch einen Lösungsansatz.

Ich möchte keine komplette Lösung von Dir/Euch

Gruß und Danke Marco
 
Hallo,
ich hatte mir dafür mal eine SCL-Routine erstellt - vielleicht habe ich die hier sogar schon mal gepostet ...
Wenn du damit etwas anfangen kannst - der FC zerlegt dir ein Datum in seine Bestandteile :
Code:
FUNCTION FC431 : VOID            
Title   = 'UP Date nach TTMMJJ umwandeln'  
AUTHOR  : 'Larry'
VERSION : '1.1'     
 
VAR_INPUT 
   IN_Date : DATE ;                 // Datum für Umwandlung 
      w_Date AT IN_Date : WORD ; 
END_VAR
VAR_IN_OUT 
END_VAR
VAR_OUTPUT
   Jahr              : INT ;       // Jahr des Vorgabe-Date's
   Monat             : INT ;       // Monat des Vorgabe-Date's
   Tag               : INT ;       // Tag des Vorgabe-Date's
   Wochentag         : INT ;       // Wochentag des Vorgabe-Date's  [1=So - 7=Sa]
   Schaltjahr        : INT ;       // Schaltjahr des Vorgabe-Date's
   Jahrestag         : INT ;       // Tag im Jahr des Vorgabe-Date's
   Kalenderwoche     : INT ;       // Kalenderwoche des Vorgabe-Date's
END_VAR
VAR_TEMP
   c_Date : DINT ; 
   Anz_SJ : INT ; 
   Diff_J : INT ;
   JTag   : INT ;
END_VAR
 
BEGIN
   c_Date := 1 + WORD_TO_DINT(w_Date) ;
   Diff_J := DINT_TO_INT(c_Date / 366) ;
   Jahr := Diff_J + 1990 ;
   Schaltjahr := 0 ; IF (Jahr MOD 4) = 0 THEN Schaltjahr := 1 ; END_IF ;
   
   Anz_SJ := (Diff_J + 2) / 4 ;
   Jahrestag := Schaltjahr - Anz_SJ + DINT_TO_INT(c_Date - (INT_TO_DINT(Diff_J) * 365)) ;
   Wochentag := DINT_TO_INT(c_date MOD 7) + 1 ;
   Kalenderwoche := (Jahrestag + 7 + 3 - Wochentag) / 7 ;
  
   JTag := Jahrestag ;
   IF (JTag > 0) AND (JTag <= 31) THEN 
      Monat := 1 ; Tag := JTag ;
   END_IF ; 
   JTag := JTag - 31 ;
   IF (JTag > 0) AND (JTag <= (28 + Schaltjahr)) THEN 
      Monat := 2 ; Tag := JTag ;
   END_IF ; 
   JTag := JTag - 28 - Schaltjahr ;
   IF (JTag > 0) AND (JTag <= 31) THEN 
      Monat := 3 ; Tag := JTag ;
   END_IF ; 
   JTag := JTag - 31 ;
   IF (JTag > 0) AND (JTag <= 30) THEN 
      Monat := 4 ; Tag := JTag ;
   END_IF ; 
   JTag := JTag - 30 ;
   IF (JTag > 0) AND (JTag <= 31) THEN 
      Monat := 5 ; Tag := JTag ;
   END_IF ; 
   JTag := JTag - 31 ;
   IF (JTag > 0) AND (JTag <= 30) THEN 
      Monat := 6 ; Tag := JTag ;
   END_IF ; 
   JTag := JTag - 30 ;
   IF (JTag > 0) AND (JTag <= 31) THEN 
      Monat := 7 ; Tag := JTag ;
   END_IF ; 
   JTag := JTag - 31 ;
   IF (JTag > 0) AND (JTag <= 31) THEN 
      Monat := 8 ; Tag := JTag ;
   END_IF ; 
   JTag := JTag - 31 ;
   IF (JTag > 0) AND (JTag <= 30) THEN 
      Monat := 9 ; Tag := JTag ;
   END_IF ; 
   JTag := JTag - 30 ;
   IF (JTag > 0) AND (JTag <= 31) THEN 
      Monat := 10 ; Tag := JTag ;
   END_IF ; 
   JTag := JTag - 31 ;
   IF (JTag > 0) AND (JTag <= 30) THEN 
      Monat := 11 ; Tag := JTag ;
   END_IF ; 
   JTag := JTag - 30 ;
   IF (JTag > 0) AND (JTag <= 31) THEN 
      Monat := 12 ; Tag := JTag ;
   END_IF ; 
  
END_FUNCTION
Nachsatz:
Auf Anregung von Ingeborg, die da in dem Script noch einen Bug (!!!) entdeckt hat, habe ich das Ganze noch einmal überarbeitet.
Es arbeitet nun bis zum 31.12.2099 (nach menschlichem Ermessen) fehlerfrei. Danach nicht mehr, da Siemens ab 2099 mit dem DATE-Format einen Fehler macht.
 
Zuletzt bearbeitet:
@Larry Laffer

dank dir das hilf schon einmal weiter. Wenn ich fragen haben sollte meld ich mich noch einmal.

Danke und Gruß Marco
 
Zuviel Werbung?
-> Hier kostenlos registrieren
DB nach KW Durchsuchen

Hallo nochmal

so jetzt hab ich alles, nur ist jetzt das nächste Problem aufgetreten.
Mein DB sieht folgendermaßen aus (1 Datensatz)
DBW0 Kalenderwoche
DBD2 Rate-Wert
DBW6 Jahr
DBW8 Monat
DBW10 Tag

das ganze sind 500 Datensätze

jetzt muß ich wenn ich nur die Daten der KW 49 haben möchte den ganzen DB nach der passenden KW durchsuchen und den passenden Satz in einen anderen transferieren ( es können x Datensätze der selben KW auftauchen).

Vielen Dank für eure Unterstützung

Gruß Marco
 
@Larry Laffer

ja ich hab das jetzt hinbekommen das alles soweit passt (reihenfolge, bei trigger neues Datenfach usw.) ich hab aber das Problem das nicht alle Datensätze angezeigt werden können (macht kein sinn für mich da es sich um 500 Sätze handelt a 12Byte). Ich möchte nunmehr eine Auswahl treffen (Kalenderwoche) die mein DB durchsucht und zutreffende in ein Anzeige DB speichert (gesamten Block 12 Byte / x Blöcke) und genau da liegt jetzt mein Problem ich bekomme es einfach nicht hin. Ich verrenne mich immer ab der selben stelle den ersten gefundenen Datensatz speichert er ab und der wird mit dem nächsten wieder überscchrieben.

da ich nicht wirklich ein ansatz habe,
AUF #Wertespeicher // DB öffnen
L #Datenanfang
T #Suchwert
L 0
T #Loop
anf: NOP 0
L #Loop
L 1
+I
T #Loop
L #Suchwert
SLD 3
LAR1
L DBW [AR1,P#0.0]

L #Suchwert
L 12
+I
T #Suchwert


SPB end
SPA anf
end: NOP 0


please Help ;)

Gruß Marco
 
Zuletzt bearbeitet:
Hi Ralle

genau da ist ja mein Problem da ich die 12 Byte (wenn Übereinstimmung der KW) in den Anzeige DB schieben möchte (das können bis zu 30 Blöcke sein pro KW). Ich häng da mir fehlt irgendwie wie ich den Zeiger schreibe :-(

Gruß Marco
 
Also ...
du brauchst hier 2 Pointer :
einen auf die Quell-Einlese-Adresse und einen auf die nächste Ziel-Schreib-Adresse. Beide Pointer musst du natürlich, wenn du eine Übereinstimmung gefunden hast, um 12 erhöhen (wegen Datenblock-Breite = 12 Byte), aber sie zeigen ja auf vollkommen unterschiedliche Datenbereiche.

Ich würde so vorgehen :
Die Quell-Liste durchsuchen bis zur ersten Übereinstimmung, diese dann in den Lokal-Datenbereich des Bausteins übertragen und den Lese-Pointer erhöhen. Dann den Lokal-Datenbereich auf den Ziel-Pointer übertragen und den erhöhen. Und so weiter ...
Hilfreich ist es auf jeden Fall, die Anzahl der schon durchsuchten Datensätze und die der gefundenen Datensätze irgendwo mitzuschreiben.

Bekommst du die Routine dafür nun hin ?

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Larry Laffer

ich werd es mal probieren (wär cool wenn du morgen nochmal reinschaust).

von aussen werd ich wohl die max Anzahl der Blöcke vorgeben die sich in dem DB befinden können als loop.

Auf jedenfall bin ich dankbar für eure Unterstützung (brauch manchmal ein schupps in die richtige Richtung :rolleyes:).

Danke euch
 
Hm, 30*12 Byte, das würde ich nicht unbedingt auf den Lokalstack packen, sondern schon in einen 2. DB, in welchem die Ergebnisse landen. Oder hab ich dich falsch verstanden Larry?
 
Zurück
Oben