Step 7 SPS-Clock Convert 8 Bytes zu Date&Time Format

Screwkey

Level-1
Beiträge
12
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Abend ;),

mir steht ein DB zur Verfügung in dem ich 8 Bytes Status, Sek, Min, Stunde, Tag, Monat, Jahr, Wochentag aus einem DCF Signal generiert habe.
Aus diesen Bytes würde ich gerne ein Date&Time Format erstellen welches ich dann per WR_SYS_T im TIA oder Set-Clock im Step 7, in die SPS schreibe.

Ich bekomm einfach kein Date&Time Format zustande.

Merci schon mal für Hilfe

Gruß Flo
 
Am besten Du schaust Dir in der Step7-Hilfe das Format des Datentyps DATE_AND_TIME an, erstellst eine entsprechende Struktur in TEMP, kopierst die einzelnen Bytes als BCD da hinein und kopierst danach die Struktur mit BLKMOV auf eine DATE_AND_TIME-Variable.
In SCL kann man das ganze auch sehr schön mit einer AT-Sicht machen.

Eine gute Idee ist auch die Forumssuche mit den Suchworten "DATE_AND_TIME stunde minute" zu benutzen, da findest Du z.B. einen Baustein als Vorlage.
http://www.sps-forum.de/simatic/723...variable-aus-eingangswoertern.html#post502851

Normalerweise müßte man ja noch nach der von Dir verwendeten CPU fragen, weil das kann in TIA unterschiedliches Vorgehen erfordern... ich gehe einfach mal davon aus, daß Du eine S7-300 oder S7-400 hast...

Harald
 
Wieso sollte das Zusammenbasteln eines DATE_AND_TIME in einer STAT-Struktur nicht gehen? (davon abgesehen, daß es in TEMP sinnvoller ist)
An welchem Problem bist Du gescheitert?

Harald
 
Hi
Ok, hätte vll noch was dazu schreiben sollen. Ist ein wenig zu allgemein.
FB mit
IN: Anfangs DB; Anzahl der DB
OUT: DB Nummer mit beinhalteter ältesten Zeit

Code:
// Beispiel: Anzahl=5 Startsilo=DB1520
// 5 in Loopcounter schreiben
// 5(Loopcounter) + 1520(Startsilo) - 1 = 1524 --> DB1524 wird zuerst durchsucht
// --> Loop
// 5 + 1520 - 1 = DB1524
// ....
// 1 + 1520 - 1 = DB1520
// Unten: Wenn Loopcounter = 1 wird die Schleife nicht mehr durchlaufen.

      L     #Anzahl_Silo_DB_Nr
Loop: T     #Loopcounter
      L     #Start_Silo_DB_Nr
      +I    
      L     1
      -I    
      T     #Silo_Nr_Loop


// Überprüfung ob das Silo die richtige Materialnummer enthält
      AUF   DB [#Silo_Nr_Loop]
      L     #DBW_Ort_Materialnr
      SLD   3
      LAR1  
      L     DBW [AR1,P#0.0]
      L     #Vorgabe_Materialnummer
      ==I   
// Wenn das Silo nicht die Materialnummer enthält wird direkt zum Ende gesprungen
      SPBN  End1

      L     #Silo_Nr_Loop
      T     #Silo_1.SiloDB_Nr

      L     #DBW_Ort_Materialnr
      SLD   3
      LAR1  
      L     DBW [AR1,P#0.0]
      T     #Silo_1.Materialnummer

// Wenn das Silo die Materialnummer enthält, wird der Zeitstempel für Entleerbereit eingelesen
      L     #DBW_Ort_Entleerbereitdat
      SLD   3
      LAR1  

// Jahr
      L     DBB [AR1,P#2.0]
      ITB   
      T     LB    34                    // Silo_1.Entleerbereitdatum(Jahr) 

// Monat
      L     DBB [AR1,P#1.0]
      ITB   
      T     LB    35                    // Silo_1.Entleerbereitdatum(Monat) 
// Tag
      L     DBB [AR1,P#0.0]
      ITB   
      T     LB    36                    // Silo_1.Entleerbereitdatum(Tag) 
// Stunden
      L     DBB [AR1,P#3.0]
      ITB   
      T     LB    37                    // Silo_1.Entleerbereitdatum(Stunde) 
// Minuten
      L     DBB [AR1,P#4.0]
      ITB   
      T     LB    38                    // Silo_1.Entleerbereitdatum(Minute) 
// Sekunden
      L     DBB [AR1,P#5.0]
      ITB   
      T     LB    39                    // Silo_1.Entleerbereitdatum(Sekunde) 



      CALL  "GT_DT"
       DT1    :=#Silo_1.Entleerbereitdatum
       DT2    :=#Silo_2.Entleerbereitdatum
       RET_VAL:=#Aelter_1_oder_2

      U     #Aelter_1_oder_2
      SPBN  _001



// Silo_1 ist älter

      CALL  "BLKMOV"
       SRCBLK :=#Silo_1
       RET_VAL:=#SFC_Ret_Val_1
       DSTBLK :=#Silo_Ausgewaehlt

      SPA   _002


_001: NOP   0

// Silo_2 ist älter

      CALL  "BLKMOV"
       SRCBLK :=#Silo_2
       RET_VAL:=#SFC_Ret_Val_2
       DSTBLK :=#Silo_Ausgewaehlt

_002: NOP   0


      CALL  "BLKMOV"
       SRCBLK :=#Silo_Ausgewaehlt
       RET_VAL:=#SFC_Ret_Val_3
       DSTBLK :=#Silo_2

End1: NOP   0

      L     1
      L     #Loopcounter
      ==I   
      SPB   _003

      LOOP  Loop


_003: NOP   0

      L     #Silo_Ausgewaehlt.SiloDB_Nr
      T     #SiloDB

Wenn ich Struct: Silo_1, Silo_2 und Silo_Ausgewaehlt in STAT setze geht es nicht.

Warum?! Wahrscheinlich wegen dem LOOP und inhalb der Schleife neu geschrieben werden muss.

Zumindest geht es nun. Hat mich nun 1 1/2 Tage gekostet, bis ich hier auf die Lösung gekommen bin :)

mfg

kaiims
 
Zuletzt bearbeitet:
Zurück
Oben