Step 7 Vergleicher für SIPLUS DCF 77 "Data_and_Time"

H99

Level-1
Beiträge
8
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Vergleicher für SIPLUS DCF 77 "Date_and_Time"

Hallo,

ich bin erst neu hier im Forum und stehe vor folgendem Problem:

Programmiersprache:
FUP

Software:
Step 7 V5.5
WinCC flexible

Hardware:
PS307 5A (307-1EA01-0AA0)
CPU 319F-3PN/DP (318-3FL01-0AB0)
DI-SM321-32xDC (321-1BL00-0AA0)
DO-SM322-32xDC (322-1BL00-0AA0)
Simatic Panel PC 15" (6AV7802-0BB10-1AA0)

Funktion:
Um eine Lichtsteuerung zu realisieren, möchte ich über den Panel PC die Werte für Urlaubstage, Feiertage, Arbeitsbeginn, Pausen etc. einstellen. Das DCF77 von Siplus senden mit Hilfe einer geschirmten Leitung über 2 Eingänge der DI32 die aktuelle Uhrzeit und das Datum. Die empfangenden "Telegramme" werden in einem von Siemens erstellten FB77 ausgewertet und über den Datentyp DT (Data_and_Time) in dem zugehörigen DB77 ausgegeben. Über ein Übergeordneten Grafcet sollen Feiertage, Wochenende etc. zur Deaktivierung des untergeordneten Grafcets für die Lichtsteuerung verwendet werden. Im untergeordneten Grafcet für die Lichtsteuerung, soll die aktuelle Uhrzeit (DCF77) mit der vorgegebenen Uhrzeit (Panel PC) verglichen und beispielsweise um 7:30Uhr das SR-Glied gesetzt und die Lampen (DO32) aktiviert werden. Und z.B. um 12Uhr zur Pause soll das SR-Glied zurückgesetzt werden, um das Licht (DO) auszuschalten. Über Drucktaster (DI32) kann das Licht jederzeit aktiviert und deaktiviert werden.

Problem:
- Das DATA-AND-TIME Format ist durch seine 64Bit-Größe in S7 nicht verarbeitbar (Wie kann man es an einem Vergleicher verarbeiten)
- Gibt es in Step 7 ein Vergleicher für DATA und TIME? (ggf. im DB77 die groöße DATA_and_TIME in eine DATA-Variable und TIME_of_DAY-Variable aufteilen?)
- Ware vielleicht ein CMP==D verwendbar wenn man in den S7-Einstellungen Änderungen vornimmt? (Vergleicher die Datentypen ignorieren)


Im Vorfeld vielen Dank für jegliche Vorschläge/Meinungen etc. :)
 
Zuletzt bearbeitet:
Du könntest die DATE_AND_TIME Variable in Einzelvariablen (Jahr, Monat, Tag, Stunde, Minute, Sekunde, Wochentag) vom Typ Integer zerlegen, dann kannst du mit den üblichen Integer-Vergleichern Zeitschaltuhren recht übersichtlich realisieren.
Die Einzelwerte liegen in einzelnen Bytes des DATE_AND_TIME jedoch BCD-codiert vor. D.h. wenn du auf ein Byte zugreifst musst du mit BTI von BCD nach Integer konvertieren.
Im letzten Byte des Wochentags sind noch die Millisekunden eingebaut, diese musst du noch ausmaskieren.

Der Aufbau des Datentyps ist in der Step7-Hilfe beschrieben.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Zum Vergleichen von DATE_AND_TIME gibt es fertige Funktionen.
- füge aus der "Standard Library / IEC Function Blocks" den FC9 EQ_DT in ein Netzwerk ein
- markiere den eingefügten "EQ_DT"
- drücke F1
- die Baustein-Beschreibung aus der Hilfe zu IEC-Standard-Funktionen erscheint
- gehe auf Inhalt > DATE_AND_TIME-Variablen vergleichen
- da gibt es die Beschreibung von 6 verschiedenen Vergleichs-FCs

In der Bibliothek gibt es auch Funktionen zum zerlegen von DATE_AND_TIME in Datum und Uhrzeit: FC6 DT_DATE und FC8 DT_TOD. DATE und TIME_OF_DAY kann man mit MOVE in INT- und DINT-Variablen kopieren und dann mit CMP vergleichen.

DATE_AND_TIME kann man auch ohne die fertigen FC vergleichen:
Du könntest in TEMP eine oder zwei Strukturen aus 2x DINT anlegen (oder aus 8 Bytes),
und mit SFC20 BLKMOV die DATE_AND_TIME-Variable(n) da drauf kopieren, oder mit MOVE Werte in die einzelnen DINT (im BCD-Format, z.B. DW#16#19022221 und DW#16#30590000 für 2019-02-22-21:30:59.0)
und dann mit 2x CMP==D oder CMP>=D die beiden Teil-DINT (je 32 Bit) vergleichen. FALSCH!
Besser: und dann mit CMP**D die Teil-DINTs (je 32 Bit) vergleichen.

Code:
DTS1 : Struct //64 Bit DATE_AND_TIME zu 2x 32 Bit DINT für CMP
  H32 : DInt
  L32 : DInt
DTS2 : Struct
  H32 : DInt
  L32 : DInt
DTS3 : Struct //für DATE_AND_TIME-Einzelkomponenten
  YY : Byte
  MO : Byte
  DD : Byte
  HH : Byte
  MM : Byte
  SS : Byte
  MS : Byte
  MS_WT : Byte
Code:
                +--------------+
                |   "BLKMOV"   |
           ...--|EN     RET_VAL|-#iResult
                |              |
                |        DSTBLK|-#DTS1
                |              |
 "DB77".DT_Var--|SRCBLK     ENO|-
                +--------------+

                +----------+
                |   MOVE   |
           ...--|EN     OUT|-#DTS2.H32  +----------+
                |          |            |   MOVE   |
DW#16#19022221--|IN     ENO|------------|EN     OUT|-#DTS2.L32
                +----------+            |          |
                        DW#16#30590000--|IN     ENO|-
                                        +----------+
Code:
[COLOR="#0000FF"]DT1 == DT2  =  DT1.H == DT2.H AND DT1.L == DT2.L[/COLOR]
                +----------+
                |  CMP==D  |
     #DTS1.H32--|IN1       |    +-------+
                |          |    |   &   |
     #DTS2.H32--|IN2       |----|       |
                +----------+    |       |
                                |       |
                +----------+    |       |
                |  CMP==D  |    |       |    #xResult
     #DTS1.L32--|IN1       |    |       |    +-------+
                |          |    |       |    |   =   |
     #DTS2.L32--|IN2       |----|       |----|       |
                +----------+    +-------+    +-------+
Code:
[COLOR="#0000FF"]DT1 >= DT2  =  (DT1.H > DT2.H) OR (DT1.H == DT2.H AND DT1.L >= DT2.L)[/COLOR] (gilt nur für Jahre 2000 .. 2079 !)
                +----------+
                |  CMP>D   |
     #DTS1.H32--|IN1       |                 +-------+
                |          |                 |  >=1  |
     #DTS2.H32--|IN2       |-----------------|       |
                +----------+                 |       |
                                             |       |
                +----------+                 |       |
                |  CMP==D  |                 |       |
     #DTS1.H32--|IN1       |    +-------+    |       |
                |          |    |   &   |    |       |
     #DTS2.H32--|IN2       |----|       |    |       |
                +----------+    |       |    |       |
                                |       |    |       |
                +----------+    |       |    |       |
                |  CMP>=D  |    |       |    |       |    #xResult
     #DTS1.L32--|IN1       |    |       |    |       |    +-------+
                |          |    |       |    |       |    |   =   |
     #DTS2.L32--|IN2       |----|       |----|       |----|       |
                +----------+    +-------+    +-------+    +-------+

Harald
 
Zuletzt bearbeitet:
Vielen Dank für Ihre Lösungsvorschläge.

Als Azubi (EAT) bringt mich das schon eine Menge weiter!

Ich hätte da eine Frage:
Kann ich nicht im Datenbaustein DB77 vom Siemens-FB77 (die Datentypen (DATA = Symbolname "Tag" / TIME_of_Day = Symbolname "Uhrzeit") anfordern und z.B. DB77.DW8.Uhrzeit mit der CMP==D mit der durch mein Tochpanel z.B. in ein DB1 geschriebene Startzeit DB1.DW10.Startzeit vergleichen???

So würde der DB77 mir schon die Variablen "DATA, sowie TIME-of-DAY liefern und ich brächte keine Funktionen benutzen. (Habe leider noch keine großen Erfahrungen, was mit einem DB möglich ist).

Da ich nicht weiß wie Störanfällig die Siplus-DCF77-Funkuhr mit einer geschirmten Profinet-Leitung (4Adern) im Gebäude mit einer geringer Leitungsanzahl ((1x (Energiezuführung) NYM-J 3x2,5mm² und 4x (Steuerleitungen) Ölflex 12G 1mm²)), wie ich beim Vergleich der Uhrzeiten in FUP die Millisekunden ausblenden kann. (wichtig beim Uhrzeitvergleich ist mir eigentlich nur h und min). Oder das bei einer Störung des Telegrammempfangs z.B. die CPU Zeit (diese kann ja durch FB77 gestellt werden, lauf Hersteller) weiterlaufen könnte.


MfG
 
und dann mit 2x CMP==D oder CMP>=D die beiden Teil-DINT (je 32 Bit) vergleichen.
Mit 2x CMP==D bin ich ja noch einverstanden, Harald, aber 2x CMP>=D?
Wenn CMD>=D = true beim HiWord UND CMD>=D = false beim LoWord, müsste das Ergebnis true sein und sinngemäss
wenn CMD<=D = true beim HiWord UND CMD<=D = false beim LoWord, müsste das Ergebnis true sein.

Trotzdem, eines schönes WE!

Heinileini

 
Zuviel Werbung?
-> Hier kostenlos registrieren

Mit 2x CMP==D bin ich ja noch einverstanden, Harald, aber 2x CMP>=D?
Hast recht Heinrich, das war nicht zuende gedacht. :oops:
Korrekt müsste sein:
DT1 >= DT2 = (H1 > H2) OR (H1 == H2 AND L1 >= L2)

(Klammern für bessere Lesbarkeit, aber nicht nötig)

Ich werde das mal oben im Beitrag #3 korrigieren.

Harald
 
Kann ich nicht im Datenbaustein DB77 vom Siemens-FB77 [...]
Liefert der FB77/DB77 denn die aktuelle Uhrzeit? (ich kenne Deinen DB77 nicht)
Kann es sein daß der FB77 nur von Zeit zu Zeit die Uhr der SPS mit der DCF77-Zeit synchronisiert?
In welcher Zeitzone läuft die Uhr Deiner SPS? UTC, CET, CET/CEST, ...?

Ich denke, der DB77 hilft Dir nicht, für die Zeitschaltuhr mußt Du die Uhrzeit Deiner SPS-Uhr abfragen mit der SFC1 "READ_CLK" oder einfach die Uhrzeit von #OB1_DATE_TIME nehmen.
Damit DATE_AND_TIME-Werte für Vergleiche besser händelbar werden, könntest Du die zerlegen in Datum und Uhrzeit, z.B. mit den bereits genannten FC6 DT_DATE und FC8 DT_TOD, oder selber was programmieren. Das geht in FUP allerdings nicht schön, das sollte man in AWL oder SCL programmieren. Hier mal eine AWL-Quelle für einen FC, der DATE_AND_TIME in BCD-codierte Teile zerlegt (den könntest Du am besten im OB1 mit IN:=#OB1_DATE_TIME aufrufen:
Code:
FUNCTION "DT_Split" : VOID
TITLE =DT_Split
//zerlegt DATE_AND_TIME in Datum und Uhrzeit im BCD-Format
AUTHOR : PN_DP
VERSION : 0.1

VAR_INPUT
  IN : DATE_AND_TIME ;	
END_VAR
VAR_OUTPUT
  BCD_Datum : DWORD ;   //YYYYMMDD: 16#19900101 .. 16#20891231
  BCD_Uhrzeit : DWORD ; //00HHMMSS: 16#00000000 .. 16#00235959
END_VAR
VAR_TEMP
  DBNo : WORD ;
END_VAR
BEGIN
NETWORK
TITLE =

      L     P##IN;           // Adresse des Übergabeparameters (Pointer auf DATE_AND_TIME)
      LAR1  ;

      L     W [AR1,P#0.0];   // Pointer: DB-Nummer
      T     #DBNo;

      L     D [AR1,P#2.0];   // Pointer: Offset
      LAR1  ;
      AUF   DB [#DBNo];
//<DBNO>.<AR1> zeigt auf den übergebenen DATE_AND_TIME

//jetzt den DATE_AND_TIME in Datum und Uhrzeit zerlegen:
      L     DW#16#19900000;  // "Grenzjahr" 1990..1999/2000..2089
      L     D [AR1,P#0.0];   // YYMMDDHH
      SRD   8;               // 00YYMMDD
      OD    DW#16#19000000;  // 19YYMMDD
      >D    ;                // "Grenzjahr" 1990 > IN_Jahr?
      SPBN  MTD;             // Jahr 90..99 --> 1990..1999
      L     DW#16#7000000;   // Jahr 00..89 --> 2000..2089
      +D    ;
MTD:  T     #BCD_Datum;      // YYYYMMDD: 16#19900101 .. 16#20891231

      L     D [AR1,P#3.0];   // HHMMSSms
      SRD   8;               // 00HHMMSS
      T     #BCD_Uhrzeit;    // 00HHMMSS: 16#00000000 .. 16#00235959

END_FUNCTION

Harald
 
Den FB77 und DB 77 habe ich direkt von Siemens: (Download: Funktionsbaustein S7-300/400.zip)
https://support.industry.siemens.co...für-siplus-dcf77-zeitempfänger?dti=0&lc=de-WW

Siplus DCF77 Kurzanleitung:
https://w3.siemens.com/mcms/topics/en/siplus/extreme/documents/siplus_dcf77_kurzbeschreibung.pdf

Laut SIEMENS liefert der fertige FB77 durch seine Verarbeitung am Ausgang S7_Datum_Zeit das aktuelle DATA_and_TIME-Format und schreibt es im dazugehörigen Instanz-DB77 (ebenfalls Downlaod).

Instanz-DB77:
DB77.DBW4 (Erstes DWord von S7-Datum_Zeit)
DB77.DBW8 (Zweites DWord von S7-DATA_Zeit)


FB 77 Eingänge: (BOOL) eigentlich nur DCF-Takt und DCF-Daten
(E1.0) DCF-Takt (Sekundendakt von der DCF77-Funkuhr)
(E1.1) DCF-Daten (Datensignal von der DCF77-Funkuhr)

(0/1) Nicht_stellen (0=CPU Zeit wird vom Baustein gestellt // 1= CPU Zeit wird vom Baustein nicht gestellt)

FB 77 Ausgänge: (BOOL) eigentlich nur Fehler und S7_Datum_Zeit
Zeitzonenbit_1 (1=MESZ // 0=MEZ)
Zeitzonenbit_2 (1=MEZ // 0=MESZ)
Umsch_Zeitzone (1=Beim nächsten Stundenwechsel findet ein Wechsel zwischen MEZ un MESZ statt (MEZ<->MESZ)
...
Fehler (1= wenn für 3 Minuten oder länger kein gültiges Telegramm empfangen wurde // 0= Zeit sicher empfangen 2 aueinanderfolgende Telegramme)
S7_Datum_Zeit (DATA_and_TIME!!!) (Zuletzt gültig empfangende Zeit im S7-Data_and_Time-Format 64Bit)
...


Kann ich DATA-and_TIME aus dem Instanz-DB77 auf ein globalen DB schreiben? Im globalen DB die Formate (DATA & TIME_of_DAY auswählen) und z.B. in einem FB1 (für mein Grafcet) die Formate mit dem CMP==D vergleichen (32 Bit ist ja DATA, sowie das TIME_of_DAY-Format). Das der Vergleicher damit arbeitet, kann man in Step7 in den CPU-Einstellungen anpassen wichtig ist ja nur für den CMP==D, das an dessen Vergleichs-Eingängen ein 32Bit-Format ist)


Zudem ist laut Siemens / älterer Forenbeiträge eine Zykluszeit des OB1 von <=100ms wichtig!
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Laut SIEMENS liefert der fertige FB77 durch seine Verarbeitung am Ausgang S7_Datum_Zeit das aktuelle DATA_and_TIME-Format
Das ist aber nicht die aktuelle Uhrzeit sondern die "Zuletzt gültig empfangene Zeit im S7-Date_and_Time-Format" (Seite 16) Das kann eine Zeit von vorgestern Nacht sein ...

Kann ich DATA-and_TIME aus dem Instanz-DB77 auf ein globalen DB schreiben?
Können kannst Du das (z.B. mit SFC20 BLKMOV), doch das nützt Dir nichts für das was Du damit tun willst, weil diese Zeit nicht die aktuelle Uhrzeit ist.
Wie ich schon schrieb "mußt Du die Uhrzeit Deiner SPS-Uhr abfragen mit der SFC1 "READ_CLK" oder einfach die Uhrzeit von #OB1_DATE_TIME nehmen."

Das der Vergleicher damit arbeitet, kann man in Step7 in den CPU-Einstellungen anpassen wichtig ist ja nur für den CMP==D, das an dessen Vergleichs-Eingängen ein 32Bit-Format ist
Das wird nicht in den CPU-Einstellungen sondern in "KOP/AWL/FUP-Editor > Einstellungen > KOP/FUP > [ ] Typüberprüfung von Operanden" eingestellt. Wenn man die Typüberprüfung deaktiviert, dann kann man beliebige 32-Bit-Datentypen an der CMP**D-Box angeben, z.B. eine BCD-Uhrzeit direkt mit DW#16#00184000 (für 18:40:00 Uhr) - verglichen wird aber trotzdem das 32-Bit-Bitmuster als ob es ein DINT wäre! (DW#16#91234567 ist kleiner als DW#16#71234567)

Zudem ist laut Siemens / älterer Forenbeiträge eine Zykluszeit des OB1 von <=100ms wichtig!
Wofür ist das jetzt wichtig?

PS: der Datentyp heißt nicht DATA_and_TIME sondern DATE_AND_TIME für "Datum (Date) und Uhrzeit (Time)"

Harald
 
Vielen Danke für deine Hinweise Harald, ich möchte auch das DCF77-Modul sinnvoll im Steuerungsprogramm einsetzten:)


Also muss ich mit dem SCF0 "SET_CLK" die aktuelle Uhrzeit setzen.
(Muss mit SFC0 die Zeit jede Sekunde gestellt werde? Oder einmalig über mein FB77 und die CPU-Zeit läuft dann einfach weiter?)


Anschließend die aktuelle Uhrzeit mit SFC1 "READ_CLK" abfragen und z.B. im FB 1 (Typenüberprüfung ohne Operanten) mit CMP==D Vergleicher die CPU-ZEIT mit der vom PANEL PC festgelegten Zeit überprüfen.


Das selbe nochmals für den Tag (CMP==D -> Feiertag ja/nein etc.) (Dafür kann ich doch die DATE-Variable vom DCF-77 benutzen um den Tag zu überprüfen?)


Ich wünsche allen weiterhin ein schönes Wochenende:)
 
ich möchte auch das DCF77-Modul sinnvoll im Steuerungsprogramm einsetzten:)

Also muss ich mit dem SCF0 "SET_CLK" die aktuelle Uhrzeit setzen.
(Muss mit SFC0 die Zeit jede Sekunde gestellt werde? Oder einmalig über mein FB77 und die CPU-Zeit läuft dann einfach weiter?)
Nein überhaupt nicht. Du sollst nicht die SPS-Uhr stellen. Die SPS-Uhr läuft ganz alleine und wird von Zeit zu Zeit vom FB77 automatisch mit der empfangenen Uhrzeit synchronisiert (wenn der FB-Input "Nicht_stellen" 0 ist).

Anschließend die aktuelle Uhrzeit mit SFC1 "READ_CLK" abfragen und z.B. im FB 1 (Typenüberprüfung ohne Operanten) mit CMP==D Vergleicher die CPU-ZEIT mit der vom PANEL PC festgelegten Zeit überprüfen.

Das selbe nochmals für den Tag (CMP==D -> Feiertag ja/nein etc.)
Wie erhältst Du die Schaltzeiten vom Panel PC? Als DATE_AND_TIME-Wert oder nur als TIME_OF_DAY oder Stunde und Minute in getrennten Variablen? Sind das immer wiederkehrende Termine? Je nachdem wie die Soll-Zeiten vorliegen und ob die automatisch jeden Tag oder nur an bestimmten Tagen oder Wochentagen ausgeführt werden sollen, musst Du ggf. den Schaltzeitpunkt erst noch zusammenbasteln oder zerlegen, und die aktuelle Uhrzeit ggf. auch erst noch zerlegen, und dann die Uhrzeit und ggf. den Wochentag oder das Datum als Einzelelemente vergleichen. Welche Bausteine Du für das bedarfsgerechte zerlegen und Vergleichen nutzen kannst hatte ich schon in Beitrag #3 genannt. Vielleicht ist auch der FC "DT_Split" aus #7 geeignet.

(Dafür kann ich doch die DATE-Variable vom DCF-77 benutzen um den Tag zu überprüfen?)
Was Dein FB77 tut und welche Werte aus dem FB77 kommen, das beachte überhaupt nicht. Das kannst Du für die Schaltzeiten nicht gebrauchen, der FB77 sorgt nur dafür, daß Deine laufende SPS-Uhr auch richtig geht.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke für deine Geduld mit mir, ich habe mit den SPS-Zeiten (DATE_and_TIME, TIME_of_DAY etc.) noch nie gearbeitet.
Auch habe ich bisher nur im TIA-Portal in FUP programmiert und muss mich erst in STEP7 V5.5 einarbeiten.

Aktuelles Fazit:
Der Siemens FB77 synchronisiert die SPS-Zeit (0=CPU_Zeit wird gestellt "INPUT_Nicht_stellen", diese läuft aber auch bei einer Telegrammstörung der DCF77-Funkuhr ganz alleine weiter.
Wäre auch eine Fehlerabfrage (Störung) am Eingang des FB77 über ein Merker_Fehler "BOOL 0/1" sinnvoll (siehe Bild) oder einfach 0=automatisches Stellen die bessere Variante?
F77_SPS_Uhr_stellen.jpg

Für die Vergleiche der aktuellen Werte (Datum/Uhrzeit) mit den Soll-Werten, muss ich mit dem SFC1 "READ_CLK" die aktuelle "SPS-Uhr" abfragen.
Je nachdem was ich Vergleiche CMP==D (32Bit) oder CDP==I (16Bit) mit der Einstellung "Typenüberprüfung ohne Operanten".

Das Zerlegen der Daten, wie von dir beschrieben, werde ich über verschiedene Standart-FC´s programmieren.
Ich habe auch schon mal was von Funktionen wie "Pointer und Schieber_nach-rechts" gehört, werde es aber wohl mit den FC´s machen.

Die Schaltzeiten sind immer wiederkehrend (7:30 etc. nur MO bis FR). Die Termine wie Wochenende, Abwesenheit oder Feiertage schreibe ich in einen (Globalen-DB2) und greife im FB1 (Grafcet) auf die Termine und Schaltzeiten zum Vergleich mit dem SCF1-Werten (Globalen-DB3) zu.

PS:
Ich befinde mich aktuell noch in der Planungsphase, die Beiträge hier im Forum haben mich bei der Planung erheblich weitergebracht. Deshalb nochmals vielen Danke für den fachspezifischen INPUT und die vielen Lösungsvorschläge!
 
Zurück
Oben