Format Date and Time einer KW zuordnen

Zuviel Werbung?
-> Hier kostenlos registrieren
@Ralle:
hast du ...
Ich wollte nur das eine jeweils gefundene auf den L-Stack packen, damit er beim Kopieren nicht dir Register verwurschteln muss.
Also :
gefundener_Eintrag -> Lokal -> Ziel-Speicher
weiter mit Schleife ...

Gruß
LL
 
hallo

ich komm hier jetzt nicht mehr weiter. Habt ihr ein Tip wie 12Byte zu übertragen sind am Stück. Ich muß mir eingestehen das es alles eine Ewigkeit her ist.

Code:
    UN    #Start
      SPB   ende
      CLR   
      =     #HM_Clear
      L     0
      T     #index
loop: NOP   0
      SLD   3
      LAR1  
      AUF   #Wertespeicher
      L     DBW [AR1,P#0.0]
      L     #Suchwert                   // Bsp 50 für KW 50
      ==I   
      SPB   weit
// lade 12Byte aus wertspeicher
// transferiere in Lokal
 
weit: L     12
      L     #index
      +I    
      T     #index                      //index erhöhen
// lade lokale 12 Byte
// transferiere 12 Byte in Anzeige
// addiere 12byte zum Pointer Anzeige DB
      L     #index
      L     11988                       //letztes dbw
      >=I   
      SPB   exit
      TAK                               //neuen index zurückholen
      SPA   loop
end:  NOP   0
      L     #index                      //gefunden in dbw x
      T     #index
ende: NOP   0

Gruß Marco
 
Zuviel Werbung?
-> Hier kostenlos registrieren
12 Byte kann man mit 3 DBD übertragen, da brauchst du nicht einmal eine Schleife! Eine Möglichkeit wäre auch der Baustein Blockmove, aber das ist hier nicht unbedingt nötig.

Du lädst die erste Adresse (Start) der 12 Byte in das AR1

Dann kannst du mittels

L DBD[AR1, P#0.0]
T ...
L DBD[AR1, P#4.0]
T ...
L DBD[AR1, P#8.0]
T ...

die 12 Byte abgreifen.

Umgekehrt geht das natürlich dann genauso, also von lokal laden und über AR1 und die Offsets (P#0.0, P#4.0. P#8.0) die Daten transferrieren. Alternativ ginge natürlich auch 12x 1 Byte mit jeweils Offset um 1.0 erhöhen , aber das ist vom Code her länger.
 
gut wenn ich es aber variabel benötige würde sich doch eine Schleife in der Schleife anbieten oder? in der Schleife würde ich dann jeweils um 1 hoch zählen

Gruß Marco
 
klar ... aber das macht es von der Erstellung her nicht eben leichter.
Wie wäre es denn, diese Aufgabe mittels SCL zu programmieren ? Das wäre dann deutlich einfacher zu handeln und auch wesentlich flexibler in der Handhabung ...

Gruß
LL
 
:confused: ich werde es dir nicht machen, aber wenn du grundsätzlich mit SCL klarkommst, dann kann ich dir schon dabei helfen, das auf dem Wege zu erstellen ... Reicht das auch ?
 
danke dir für das Angebot. Nur wie schon geschrieben, gehen meine Kenntnisse SCL betreffend eher gegen 5% und das reicht einfach nicht um (denke ich zumindest) um das zu realisieren. Ich hab zwar Berger´s KompendiumStep 7 in AWL und SCL hier aber so irre Beispiele sind dan nicht drin. Hab halt null Plan wie ich da anfangen soll.

So wie sich das anhört ist ja SCL wesentlich flexibler als AWL und Co. Sind Schulungen für SCL zu empfehlen oder ist das rausgeschmissenes Geld. HAb mal angefangen was ich benötige, wenn du mir beim Aufbau nochmal helfen könnest?

Code:
FUNCTION FC1 : VOID            
Title   = 'DB durchsuchen und gefundene Werte verschieben'  
AUTHOR  : 'Marco'
VERSION : '1.0'     
 
VAR_INPUT 
   Start_suchen:  BOOL;              // löst das suchen aus
   suche_KW :     INT ;              // Kalenderwoche 
   Quell_DB :     INT ;              // in dem DB wird gesucht
   Ziel_DB:       INT;               // in den DB wird geschrieben
   länge_Block :  INT;               // wird in Byte angegeben
   Anzahl_Blöcke: INT;               // Anzahl der zu durchsuchenden Blöcke
 
END_VAR
 
VAR_OUTPUT
Kalenderwoche: INT;                 // Kalenderwoche
FTT_Rate:      REAL;                // FTT Rate 
Tag:           INT;                 // Tag
Monat:         INT;                 // Monat
Jahr:          INT;                 // Jahr
END_VAR
 
VAR_TEMP
   Temp_1 : INT ; 
   Temp_2 : INT ;
 
END_VAR
 
//     Anweisungsteil
BEGIN
   END_IF ;

Gruß Marco
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Also denn ...
Code:
bei VAR_INPUT ändern :
   Quell_DB :     BLOCK_DB ;              // in dem DB wird gesucht
   Ziel_DB:       BLOCK_DB ;               // in den DB wird geschrieben
   
bei VAR_OUTPUT ergänzen :
   Anzahl_gefunden : int ;
 
bei VAR_IN_OUT ergänzen :
   Suche_beendet  : bool ; 
   
bei VAR_TEMP ergänzen :
   i , j , qptr , zptr , qw : INT ;
 
dann im Code-Teil :
 
if Start_suchen and not Suche_beendet  then 
 
Anzahl_gefunden := 0 ;
for i:= 1 to Anzahl_Bloecke by 1 do
   qptr := (i-1) * laenge_Block +1 ;
   qw := word_to_int(Quell_DB.DW[qptr]) ;
   if (qw = suche_KW) then 
      Anzahl_gefunden := Anzahl_gefunden + 1 ;
      zptr := (Anzahl_gefunden -1) * laenge_Block ;
      for j:= 1 to laenge_Block by 1 do
         Ziel_DB.DB[zptr+j-1] := Quell_DB.DB[qptr+j-1] ;
      end_for ;
   end_if ;
end_for ;
 
end_if ;
Suche_beendet  := Start_suchen ;
... das habe ich jetzt mal so Quick`n`dirty dahingeschrieben ...
Teste das mal und bau vielleicht auch mal ein bißchen daran rum ...

Gruß
LL
 
ja da seh ich wieder das ich immernoch lerne und das nach etlichen Jahren. Ich danke dir auf jeden Fall schon einmal werde es am WE mal testen.

Bin für Beispiele (die müssen nix mit dem Thema zu tun haben) offen so kann ich mir die Struktur näher bringen.

Danke

Gruß Marco
 
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.

In welchem Datenformat wird der Zeitstempel gespeichert?

Wird der Zeitstempel im Datenformat DATE oder DATE_AND_TIME gespeichert?

Gruß Kai
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Kai

das sind schon alles aufgelöste Werte die Reihenfolge sieht so aus

Kalenderwoche: Int DBW0
Rate: Real DBD2
Jahr: Int DBW6
Monat: Int DBW8
Tag: Int DBW10

da ich beim abspeichern der Blöcke eine Zykluszeitüberschreitung hatte habe ich die Blöcke auf 500 begrenzt.

und wenn ich die KW suche z.B. 49 sollen alle Werte aus dem DB mit KW 49 in den Anzeige DB kopiert werden max. 30 Blöcke

Gruß Marco
 
Hallo zusammen

@Larry
wenn ich das richtig sehe wird i nach dem laden 0 und wird dann mit Anzahl_Bloecke multipliziert.

hab ich das richtig verstanden?
qptr = Quellpointer
zptr = Zielpointer
qw = Kalenderwoche
i = Offset Pointer
J = Offset Pointer

Gruß Marco
 
Hallo Marco,
in etwa stimmt es ...

Mit dem Setzen des Bit "Suche_starten" initialisiere ich das Notwendige. Eine neue Suche soll ja ggf. neue Ergebnisse bringen ...

In der i-Schleife durchsuche ich den von dir vorgegebenen Datenbereich nach Übereinstimmung. Das Such-DW ist dann "(i-1) * laenge_Block +1" also für den ersten Datensatz := (1-1)*12 +1 := 1 - für den 2.Datensatz := (2-1)*12 +1 := 13 - usw.
Habe ich eine Übereinstimmung (erstes Wort stimmt mit deiner Vorgabe überein, so schreibe ich die Daten in den angegebenen Ziel-Bereich "(Anzahl_gefunden -1) * laenge_Block " als z.B. (1-1) * 12 := 0 oder (2-1)*12 := 12 usw.

Das Ganze läßt sich natürlich noch optimieren ...
Funktioniert es ... oder nicht ?

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

Ja funktioniert musste nur eine kleine Änderung machen da qw den Wert aus DW1 gelesen hat und somit einen Teil meines Real Wertes interpretierte.
Kann man die Werte die nicht übereinstimmen löschen bei suche Starten (Anzeige DB initialisieren)?
Vielen Dank an dieser Stelle.

Hab bei Siemens mal geschaut wegen SCL Kurs was hälst du davon?

Code:
FUNCTION FC2 : VOID            
Title   = 'DB durchsuchen'  
AUTHOR  : 'LL '
VERSION : '1.0'     
 
VAR_INPUT
   Start_suchen:   BOOL ;              // löst das suchen aus
   suche_KW:       INT ;               // Kalenderwoche 
   Quell_DB:       BLOCK_DB ;          // in dem DB wird gesucht
   Ziel_DB:        BLOCK_DB ;          // in den DB wird geschrieben
   laenge_Block:   INT ;               // wird in Byte angegeben
   Anzahl_Bloecke: INT;               // Anzahl der zu durchsuchenden Blöcke
   END_VAR
 
VAR_OUTPUT
            
Anzahl_gefunden: INT ;             // Anzahl gefundener Blöcke  
END_VAR
   VAR_IN_OUT
   Suche_beendet  : BOOL ; 
   End_var
 
   VAR_TEMP
   Bedingung_erfuellt : BOOL ; 
   i :     INT ;
   j :     INT ; 
   qptr :  INT ; 
   zptr :  INT ; 
   qw :    INT ;
 
END_VAR
 
//     Anweisungsteil
BEGIN
if Start_suchen and not Suche_beendet  then 
qw := 0; 
Anzahl_gefunden := 0 ;
for i:= 1 to Anzahl_Bloecke by 1 do
   qptr := (i-1) * laenge_Block [COLOR=red]+1[/COLOR] ;                              // löschen?
   qw := word_to_int(Quell_DB.DW[qptr]) ;
   if (qw = suche_KW) then 
      Anzahl_gefunden := Anzahl_gefunden + 1 ;
      zptr := (Anzahl_gefunden -1) * laenge_Block ;
      for j:= 1 to laenge_Block by 1 do
         Ziel_DB.DB[zptr+j-1] := Quell_DB.DB[qptr+j-1] ;
      end_for ;
   end_if ;
end_for ;
 
end_if ;
Suche_beendet  := Start_suchen ;
end_function

Gruß und nochmals vielen Dank Marco
 
Zuletzt bearbeitet:
Hallo Marco,
Kann man die Werte die nicht übereinstimmen löschen bei suche Starten (Anzeige DB initialisieren)?
Na klar ... da gibt es z.B. einen SFC Fill (21). Den könntest du im SCL-Script starten und ihm sagen, dass er den Ziel-DB zunächst löschen soll. Oder du machst dafür eine eigene Schleife, in der du die überzähligen Werte auf "0" setzt ...

Hab bei Siemens mal geschaut wegen SCL Kurs was hälst du davon?
Das mußt du wissen. Wenn du schon Programmiersprachen-Kenntnisse hast, dann kannst es es mit einn paar Fragen hier und da auch so schaffen ... wenn nicht, dann ist das sicher sinnvoll.

Gruß
LL
 
Hi Larry

ich arbeite seit einigen Jahren mit Step7 und früher noch Step5 aber hochsprachen hab ich noch nicht gemacht und das wenige ist ewig her.

ja an Fill hab ich auch schon gedacht.

Gruß Marco
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Erweiterung

Hallo an alle

ich hab von User Larry Lafer folgenden Code erhalten den ich ein klein wenig abgeändert habe. Was ich noch benötige ist (jetzt) nicht nur die KW sondern auch das Jahr. Ich hoffe ihr könnt mir weiter helfen. Ich weiß es nicht genau aber ich glaube die von mir markierte Zeile müsste noch geändert bzw erweitert werden.

Code:
FUNCTION FC3 : VOID            
Title   = 'DB durchsuchen'  
AUTHOR  : 'Test'
VERSION : '1.0'     
 
VAR_INPUT
   Start_suchen:   BOOL ;              // löst das suchen aus
   suche_KW:       INT ;               // Kalenderwoche
   suche_Jahr      INT ;               // Jahr
   Quell_DB:       BLOCK_DB ;          // in dem DB wird gesucht
   Ziel_DB:        BLOCK_DB ;          // in den DB wird geschrieben
   laenge_Block:   INT ;               // wird in Byte angegeben
   Anzahl_Bloecke: INT;                // Anzahl der zu durchsuchenden Blöcke
   END_VAR
 
   VAR_OUTPUT
   Anzahl_gefunden: INT ;             // Anzahl gefundener Blöcke  
   END_VAR
   VAR_IN_OUT
   Suche_beendet  : BOOL ; 
   END_VAR
 
   VAR_TEMP
   Bedingung_erfuellt : BOOL ; 
   i :     INT ;
   j :     INT ; 
   qptr :  INT ; // Quelle Pointer week
   zptr :  INT ; // Ziel Pointer 
   qw :    INT ; // Quelle Week
   qj :    INT ; // Quelle Year
  
   END_VAR
 
//     Anweisungsteil
BEGIN
if Start_suchen and not Suche_beendet  then 
qw := 0;
qj := 0; 
Anzahl_gefunden := 0 ;
for i:= 1 to Anzahl_Bloecke by 1 do
   qptr := (i-1) * laenge_Block  ;
   [COLOR=red]qw := word_to_int(Quell_DB.DW[qptr]) ;
[/COLOR]   IF (qw = suche_KW) AND (qj = suche_Jahr)THEN 
      Anzahl_gefunden := Anzahl_gefunden + 1 ;
      zptr := (Anzahl_gefunden -1) * laenge_Block ;
      for j:= 1 to laenge_Block by 1 do
         Ziel_DB.DB[zptr+j-1] := Quell_DB.DB[qptr+j-1] ;
      end_for ;
   end_if ;
end_for ;
 
end_if ;
Suche_beendet  := Start_suchen ;
end_function

Gruß Marco
 
Hallo Marco,
nicht geändert ... du mußt für qt natürlich auch noch den Wert aus deiner DB-Matrix laden. Alles andere sieht erstmal OK aus ...

also z.B. :
qt := word_to_int(Quell_DB.DW[qptr +2]) ;


Gruß
LL
 
Zurück
Oben