Datum S7

1schilcher

Level-1
Beiträge
137
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute, habe ein mittleres Problem. Habe in einem MW das aktuelle Datum. Wie schaffe ich es das ich für jeden Monat einen eigenen Merker setze. zB. Jänner - M0.0 , Februar - M0.1 usw. Bitte helft mir - wenn geht anhand eines Beispiels. DANKE
 
Ohne jetzt zu wissen, wie du das Datum in einen MW hast,

mit einem Vergelicher!

L Monat
L 1
==I
= Januar
...
 
Habe das Datum mit dem Sfc1 in den FC6 generiert. Wenn ich auf Variable beobachten gehe und als Format der Darstellung "DATUM" eingebe steht dort wunderschön das heutige Datum. Hoffe das hilft dir weiter.
 
1schilcher schrieb:
Habe das Datum mit dem Sfc1 in den FC6 generiert. Wenn ich auf Variable beobachten gehe und als Format der Darstellung "DATUM" eingebe steht dort wunderschön das heutige Datum. Hoffe das hilft dir weiter.
Schön, dann steht in der Variablen der Tag seit 1.1.1990. Dies ist für eine Umwandlung in Bits allerdings relativ ungünstig. Am besten direkt nach dem SFC1-Aufruf das Byte 1 verwenden (siehe Aufbau DT). Dort steht dann direkt der Monat im BCD-Format. Dieser Wert kann dann fast direkt weiterverwendet werden.
Code:
      L Monat         // = Byte 1 von SFC 1-Aufruf
      BTI             // In Dezimalzahl wandeln
      SPL   Hmpf      // Für Monate > 12
      SPA   Hmpf      // Monat 0 gibt es nicht
      SPA   Jan
      SPA   Feb
      SPA   Mar
      SPA   Apr
      SPA   Mai
      SPA   Jun
      SPA   Jul
      SPA   Aug
      SPA   Sep
      SPA   Okt
      SPA   Nov
      SPA   Dez

Hmpf: L     0
      SPA   OK
Jan:  L     W#16#100
      SPA   OK
Feb:  L     W#16#200
      SPA   OK
Mar:  L     W#16#400
      SPA   OK
Apr:  L     W#16#800
      SPA   OK
Mai:  L     W#16#1000
      SPA   OK
Jun:  L     W#16#2000
      SPA   OK
Jul:  L     W#16#4000
      SPA   OK
Aug:  L     W#16#8000
      SPA   OK
Sep:  L     W#16#1
      SPA   OK
Okt:  L     W#16#2
      SPA   OK
Nov:  L     W#16#4
      SPA   OK
Dez:  L     W#16#8
      SPA   OK

OK:   T     MW   104
Jetzt ist M 104.0 gesetzt für Januar, M 104.7 für August, M 105.0 für September usw.
Die Konstanten (Januar W#16#100) wegen High-Low-Orientierung der Bytes auf der S7.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Und noch eine Variante:
Code:
      L Monat         // = Byte 1 von SFC 1-Aufruf
      BTI             // In Dezimalzahl wandeln
      DEC   1         // Anzahl für Rotierungen
      L     DW#16#1000100   // Wegen High-Low-Anordnung und ...
      RLD             // ... weil Rotieren nur 32-bitweise geht
      T     MW   104  // Das selbe Ergebnis wie vorher
Dies ist jetzt die kompaktere aber schwieriger zu verstehende Variante (eines PC-Programmierers ;) ).
 
Hallo Rainer, zu früh gefreut. Komme mit deiner Hilfe noch nicht ganz klar. Ich habe alles so gemacht wie du es mir bei deinem ersten Beispiel erklärt hast. Nur was meinst du mit "L Monat // = Byte 1 von SFC 1-Aufruf"
Bei meinem Programm steht jetzt im MW2 das Startdatum also 1990-01-01
In meinem MW4 steht das aktuelle Datum also 2006-04-17. Was meinst du jetzt mit dem Byte 1 - wie kann ich das laden - bin noch ein kleiner Anfänger. Bitte hilf mir nochmal. PS: mir fehlt eigentlich nur der Wert für den jeweiligen Monat.
 
Kein Problem. Als Beispiel einfach einen FC anlegen. In dem FC eine Temp-Variable "Datum" von Type DATE_AND_TIME sowie eine Temp-Variable "RetVal" vom Type INT anlegen. Die Anfangsadresse von "Datum" wird in der Schnittstelle angezeigt. Dies ist in meinem Beispiel 0.0, dann funktioniert folgender Code:
Code:
      CALL  "READ_CLK"
       RET_VAL:=#RetVal
       CDT    :=#Datum
      L     LB     1   // Den Monat in BCD laden (Adresse Datum + 1, ggf. anpassen)
// Ab jetzt funktionieren die beiden Beipiele von heute morgen, z.B.
      BTI             // In Dezimalzahl wandeln
      DEC   1         // Anzahl für Rotierungen
      L     DW#16#1000100   // Wegen High-Low-Anordnung und ...
      RLD             // ... weil Rotieren nur 32-bitweise geht
      T     MW   104  // Das selbe Ergebnis wie vorher
Hier jetzt nur noch das Merkerwort anpassen, dann müsste alles funktionieren.
 
Rainer Hönle schrieb:
Und noch eine Variante:
Code:
      L Monat         // = Byte 1 von SFC 1-Aufruf
      BTI             // In Dezimalzahl wandeln
      DEC   1         // Anzahl für Rotierungen
      L     DW#16#1000100   // Wegen High-Low-Anordnung und ...
      RLD             // ... weil Rotieren nur 32-bitweise geht
      T     MW   104  // Das selbe Ergebnis wie vorher
Dies ist jetzt die kompaktere aber schwieriger zu verstehende Variante (eines PC-Programmierers ;) ).

Kann man das in die andere Richtung auch machen?
(wenn zB. für den Wert 5 das Bit x.5 gesetzt ist und ich will den Wert 5 zB. Binär darstellen)

Mfg Godi
 
Zuviel Werbung?
-> Hier kostenlos registrieren
An dieser Stelle würde ich den einfachen Vergleich verwenden. Im folgenden Beispiel wird das erste gesetzte Bit in MB 0 gefunden (ist eigentlich sichergestellt, dass nur ein Bit gesetzt ist?):
Code:
      U M 0.0
      SPB NULL
      U M 0.1
      SPB EINS
      U M 0.2
      SPB ZWEI
      ...
NULL: L 0
      SPA OK
EINS: L 1
      SPA OK
ZWEI: L 2
      SPA OK
      ...
OK: // In Akku1 steht nun die Bitnummer zwischen 0 und 7
Alternativ mit nur einem Sprungbefehl:
Code:
      L 0
      U M 0.0
      SPB OK
      INC 1
      U M 0.1
      SPB OK
      INC 1
      U M 0.2
      SPB OK
      ...
OK: // In Akku1 steht nun die Bitnummer zwischen 0 und 7

Es gibt schon eine direkte Lösung. Diese ist allerdings für die SPS nicht einfach zu bearbeiten wie die ersten beiden Lösungen. Und je nach SPS dauert diese Lösung auch wesentlich länger, spart dafür aber Codegröße.
Hintergrund der Operation:
Y = 2 ^ X
Wobei Y die Zahl mit einem gesetzten Bit ist und X die Bitnummer. Daraus ergibt sich:
ln( Y ) = X * ln( 2 )
X = ln( Y ) / ln( 2 )
Code:
      L MB 0
      DTR
      LN
      L 2.0
      LN
      /R
      RND  // In Akku1 steht nun die Bitnummer zwischen 0 und 7
Soviel zum Thema Mathematik am Morgen bringt Kummer und Sorgen.
 
Schönen Dank für die super Lösungen!
Die letzte ist nicht schlecht :cool:

Das nur ein Bit gesetzt ist muss ich noch sicherstellen.
Momentan wird damit eine 7Segmentanzeige angesteuert die einfach 0 anzeigt wenn 2Bits gesetzt sind. Da jetzt ein OP7 eingebaut wird will ich das auch über das OP7 lösen.

Mfg Godi
 
Zurück
Oben