c314 Systemzeit über Panel einstellen

Einfache Uhrzeitsynchronisation, für mehrere Panels geeignet

Hallo Chefren,

Das im Beitrag #4 verlinkte Siemens-Beispiel ist Siemens-typisch umständlich und funktioniert auch
nur dann zuverlässig, wenn genau 1 OP an der SPS angeschlossen ist!

Der Bediener stellt über Datum/Uhrzeit-Eingabefelder die Uhr des OP und drückt danach eine
Schaltfläche "Uhrzeit zur SPS übertragen". Das setzt ein Bit in der SPS.
Die SPS fragt daraufhin per Steuerungsauftrag 40 "Sagt mir mal jemand, wie spät es ist".
Nun tragen ALLE OP, die einen Bereichszeiger für Steuerungsaufträge haben, ihre Uhrzeit in den
Bereichzeiger Datum/Uhrzeit ein. Welches OP dabei das schnellste ist, kann man als Zufall bezeichnen.


Hier nun meine simple Lösung, die mit beliebig vielen OP funktioniert.

Zunächst die Datum/Uhrzeit-Übergabevariablen:
Code:
//DB101 "OP->PLC", ab DBB0:
DateTimeSET         DATE_AND_TIME  DT#90-1-1-0:0:0.000  date and time for setting PLC-Clock

//DB102 "PLC->OP", ab DBB0:
AreaPointerDtPLC    STRUCT                              AreaPointer date/time PLC
DateTimePLC         DATE_AND_TIME  DT#90-1-1-0:0:0.000  current PLC-date and -time
Res_08              BYTE           B#16#0
Res_09              BYTE           B#16#0
Res_10              BYTE           B#16#0
Res_11              BYTE           B#16#0
                    END_STRUCT
Im OB1 die Uhrzeit der SPS zur Synchronisation der OP-Uhr(en) bereitstellen:
(= OP-Bereichszeiger "Datum/Uhrzeit Steuerung")
Code:
//OB1
//first cycle on stop->run
      L     #OB1_SCAN_1
      L     3                           //Scan 2-n of OB1
      <>I   
      =     "CYCLE1"                    //M0.2

//copy current date and time to OP-areapointer (without "reserved" ms-bits)
      LAR1  P##OB1_DATE_TIME
      L     D [AR1,P#0.0]
      T     DB102.DBD    0              //"PLC->OP".DateTimePLC Byte 0-3
      L     D [AR1,P#4.0]
      UD    DW#16#FFFF0007              //demask Milliseconds
      T     DB102.DBD    4              //"PLC->OP".DateTimePLC Byte 4-7

In WinCC flexible
Bereichszeiger für OP-Uhrzeitsynchronisation anlegen:
* Datum/Uhrzeit Steuerung | DB 102 DBW 0 | 6 Worte | zyklisch fortlaufend | 2 min

Variable für stellen der SPS-Uhr anlegen:
* DateTimeSET | Date and time | DB 101 DBB 0 | Auf Anforderung

In irgendein Bild 2 Datum-Uhrzeit-Felder für Eingabe/Ausgabe der OP-Systemzeit einfügen.
Hiermit kann ein Bediener die Uhr des OP verstellen (Datum und Uhrzeit getrennt).
Dann noch eine Schaltfläche "Set PLC clock".
Das Ereignis Klicken ruft das Script "Set_PLC_Clock" auf.
Code:
' Set_PLC_Clock()
' This script will send the current date/time of this OP
' to the PLC (the clock master).
' The PLC will set his clock, when a valid date/time-value received.
' the "="-statement automatically convert to S7-DATE_AND_TIME-format!

SmartTags("DateTimeSET") = Now

In der SPS im OB1 oder einem anderen Baustein ein Netzwerk "set PLC-clock from OP":
Code:
The OP-user can set the clock of this PLC by sending the date/time.
The special case "no date/time received" shoult not be: all Bytes zero
-> the OP-Runtime will generate a System-ErrorMsg "...conversion error"
Here we must use the S7-standard-"no date/time" = DT#90-1-1-0:0:0.000
This is also the start-value, when the DB101 is new uploaded in the PLC.

      U     "CYCLE1"
      SPB   ISCL                        //initialize receive-date/time!

      L     DW#16#90010100              //DT#90-1-1-0(:0:0.000)
      L     DB101.DBD    0              //"OP->PLC".DateTimeSET Byte 0-3
      ==D   
      SPB   ESCL                        //no date received
      L     0
      ==D   
      SPB   ISCL                        //date not valid!
      L     DB101.DBD    4              //"OP->PLC".DateTimeSET Byte 4-7
      ==D   
      SPB   ISCL                        //time not valid!
      L     B#16#2                      // :0:0.000 + Monday
      ==D   
      SPB   ESCL                        //no time received

//a date and time is received from OP, set the PLC-clock now
      CALL  "SET_CLK"                   //SFC0
       PDT    :="OP->PLC".DateTimeSET
       RET_VAL:="TempINT"

//initialize receive-date/time with DT#90-1-1-0:0:0.000
ISCL: L     DW#16#90010100              //DT#90-1-1-0(:0:0.000)
      T     DB101.DBD    0              //"OP->PLC".DateTimeSET Byte 0-3
      L     B#16#2                      // :0:0.000 + Monday
      T     DB101.DBD    4              //"OP->PLC".DateTimeSET Byte 4-7
ESCL: NOP   0

Der SPS-Code ist nur in AWL vernünftig programmierbar. Bitte nicht nach FUP fragen.

Übrigens:
Obwohl die OP-Variable "DateTimeSET" in keinem OP-Bild angezeigt wird und nur in dem Script
geschrieben wird, liest die WCCflex-Runtime (2007) die Variable beim Aufbauen des Bildes mit
der Schaltfläche "Set PLC clock" und nach dem Schreiben mit dem Script völlig unnötigerweise.
(wer das erleben will, der braucht nur die Variable im DB101 mit alles 0 beschreiben).
Nur-Schreiben-Variablen gibt es in WCCflex halt nicht.

Harald

Nachtrag:
Im Anhang nun OB1, DB101 und DB102 als Step7-Projekt.
 

Anhänge

  • TimeSync_WCCflex_simple.zip
    34,3 KB · Aufrufe: 315
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Ähmm der #4 sollte lediglich als denkhilfe und anstoss gelten. Das der nicht optimal ist. Ich hab das Ding auch modifiziert auf max 4 Panels ausgelegt. Je nach Angeschlossenem Panel erkennt mein Baustein dann wo er was wohin tun soll.

Wielleicht wäre auch Lektüre "Steuerungsauftrag" angebracht, da steht allerhand drin.

Greetz Wäder
 
@PN / DP:

Kann es sein, das dein Programmbeispiel fehlerhaft ist?
Wenn die Variable DateTimeSet im Script einmal "sauber" beschrieben wurde, wird SFC0 doch immer wieder mit der einmal gesetzten Zeit beschrieben. Die PLC Zeit bleibt also stehen !?!

Wenn ich da falsch liege, bitte ich um Korrektur.

Gruß
Daniel
 
Hallo Daniel,

in meinem Programmbeispiel im #5 kann ich keinen Fehler finden.
Der vorgestellte Programmcode wird von mir mehrfach in der Praxis verwendet und
hat sich bewährt.

Nur wenn in der Variable "DateTimeSET" ein Datum ungleich DT#90-1-1-0:0:0.000
steht, dann wird der SFC0 "SET_CLK" aufgerufen und sofort danach die Variable
wieder mit DT#90-1-1-0:0:0.000 beschrieben (siehe Marke ISCL).

Das WCCf-Skript Set_PLC_Clock() wird genau einmal aufgerufen.
Das Panel schreibt seine Uhrzeit in die Variable "DateTimeSET".
Die CPU stellt genau einmal seine Uhr und löscht das empfangene Datum wieder.

Gruß Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Harald,

o.k. habe den Wald vor lauter Bäumen nicht gesehen. :confused::confused::confused:

Code:
//a date and time is received from OP, set the PLC-clock now
      CALL  "SET_CLK"                   //SFC0
       PDT    :="OP->PLC".DateTimeSET
       RET_VAL:="TempINT"

//initialize receive-date/time with DT#90-1-1-0:0:0.000
ISCL: L     DW#16#90010100              //DT#90-1-1-0(:0:0.000)
      T     DB101.DBD    0              //"OP->PLC".DateTimeSET Byte 0-3
      L     B#16#2                      // :0:0.000 + Monday
      T     DB101.DBD    4              //"OP->PLC".DateTimeSET Byte 4-7
Nach dem schreiben der Systemzeit wird die im Panel beschriebene Zeit ja wieder initialisiert.

Danke für deine Erklärung!


Gruß
Daniel
 
Moin,

ich müsste mich hier einmal kurz einklinken.
Ich benutze dieses Uhrzeitsystem so, wie Harald es hier beschrieben hat, da es wirklich einfach und schlank ist.
Mein Problem ist, dass sich die Systemuhr an einem MP377 sehr merkwürdig verhält.
Sie läuft unruhig, sprich die Sekunden laufen mal 2 vor, dann spring er 1 zurück und wieder 3 vor usw.
Es ist kein System zu erkennne. ich habe mir 2 E/A Felder Systemuhr und Systemdatum angelegt und den Button SetPLCClock so wie beschrieben.
Zum beobachten der CPU Zeit noch einmal ein A-Feld der CPU Uhr und Datum.
Stelle ich nun die Systemzeit (oder Datum) des Panels, schreibt er sofort die Uhrzeit (oder Datum) kurzzeitig in die CPU (ohne betätigen des Button SetPLC, direkt nach Enter der Eingabe)
und springt dann wieder zurück. Die Systemzeit blinkt dann abwechselnd alte Uhrzeit neue Uhrzeit bis ich den Button SetPLCClock betätige,
ist das so richtig? Mich stört halt, das die Uhr so unruhig läuft, was kann ich dagegen tun?
 
Moin,

das von Dir beschriebene Verhalten ist nicht normal. Da scheinen einige Sachen falsch zu laufen.

Kurze Erklärung der Funktionsweise der Uhrzeitsynchronisation nach Beitrag #5:
Der OB1 kopiert in jedem Zyklus die aktuelle Uhrzeit der CPU-Uhr in den Bereichszeiger "Datum/Uhrzeit Steuerung" "PLC->OP".DateTimePLC (DB102.DBB0...). Alle 2 Minuten liest das Panel diese Uhrzeit und stellt seine Uhr danach. Es kann also nur alle 2 Minuten ein Sprung der Panel-Uhrzeit um maximal 1 Sekunde vorkommen. Es ist aber unwahrscheinlich, daß man diesen "Sprung" am MP377 sehen kann (es sei denn, die Panel-Uhr geht extrem ungenau: mehr als 1 Sekunde zu schnell oder zu langsam in 2 Minuten).

Uhr stellen:
Da die CPU-Uhr die Master-Uhr ist, muß diese Uhr gestellt werden. Direkt die CPU-Uhr stellen ist aber ziemlich aufwendig. Deshalb wird hier mit E/A-Feldern auf die Systemzeit des Panels zunächst die Panel-Uhr gestellt und danach mit dem Script "Set_PLC_Clock" die Panel-Uhrzeit einmalig in die CPU-Variable "OP->PLC".DateTimeSET (DB101.DBB0...) geschrieben. Das erkennt der zweite Code im OB1 "set PLC-clock from OP" und stellt die CPU-Uhr auf die empfangene Uhrzeit. Danach wird die Variable "OP->PLC".DateTimeSET (DB101.DBB0...) wieder auf DT#90-1-1-0:0:0.000 gesetzt.

Es kann (selten) vorkommen, daß in der Zeit zwischen dem Eingeben einer neuen Uhrzeit (Stellen der Panel-Uhr) und dem Klicken der SetPLCClock-Schaltfläche die Paneluhr wieder auf die CPU-Uhrzeit zurückspringt, wenn genau dazwischen die Uhrzeitsynchronisation mit der CPU-Uhr erfolgt.

Bei Dir scheint es so, daß das Script "Set_PLC_Clock" viel öfter als nur beim Klicken der SetPLCClock-Schaltfläche aufgerufen wird. Ist das eventuell so, daß es auch bei Änderung der Systemzeit oder bei Änderung der Variable DateTimeSET (DB101.DBB0...) aufgerufen wird? Das Script "Set_PLC_Clock" soll nur bei Klicken der Schaltfläche "Set PLC clock" aufgerufen werden, es darf keine weitere Verwendung geben (-> Querverweis).
Oder Deine Datum-Uhrzeit-E/A-Felder gehen nicht auf die Panel-Systemzeit sondern auf die SPS-Variable "OP->PLC".DateTimeSET.
Auch scheint es so, daß der Bereichszeiger "Datum/Uhrzeit Steuerung" "PLC->OP".DateTimePLC öfter als alle 2 Minuten gelesen wird.
Eventuell ist auch noch ein Fehler im SPS-Programmteil, wo die CPU-Uhr gestellt wird. Nochmal besonders die Sprünge zu ISCL und ESCL kontrollieren.

Entweder hast Du einen Fehler gemacht oder der WinCC flexible Compiler. Also nochmal genau die Einstellungen in WinCC flexible kontrollieren:
In WinCC flexible
Bereichszeiger für OP-Uhrzeitsynchronisation anlegen:
* Datum/Uhrzeit Steuerung | DB 102 DBW 0 | 6 Worte | zyklisch fortlaufend | 2 min

Variable für stellen der SPS-Uhr anlegen:
* DateTimeSET | Date and time | DB 101 DBB 0 | Auf Anforderung

In irgendein Bild 2 Datum-Uhrzeit-Felder für Eingabe/Ausgabe der OP-Systemzeit einfügen.
Hiermit kann ein Bediener die Uhr des OP verstellen (Datum und Uhrzeit getrennt).
Dann noch eine Schaltfläche "Set PLC clock".
Das Ereignis Klicken ruft das Script "Set_PLC_Clock" auf.

Ich würde zunächst in WinCC flexible die Bereichszeiger- und Variable-Einstellungen kontrollieren, alle E/A-Felder löschen und neu erstellen, die Schaltfläche "Set PLC clock" löschen und neu erstellen, die temporären Dateien löschen und alles neu generieren. Sollte das Phänomen bestehen bleiben, dann Fehler im SPS-Programm suchen.

Die Verbindung des MP377 zur CPU unterbrechen und das Kopieren der CPU-Uhrzeit im OB1 beobachten. Sind da schon Sprünge der CPU-Uhrzeit zu beobachten? Wenn ja, dann den Programmteil mit dem SET_CLK deaktivieren (überspringen). Sind die Uhrzeit-Sprünge dann weg, dann liegt der Fehler dort. Springt die CPU-Uhr immer noch, dann pfuscht da eventuell ein anderes Programmteil dazwischen.
Mit einer Variablentabelle (z.B. aus dem Step7-Projekt aus Beitrag #5) das Stellen der CPU-Uhr kontrollieren: in DB101.DBD0 und DB101.DBD4 ein gültiges DATE_AND_TIME eintragen (z.B. von DB102.DBD0 und DB102.DBD4 kopieren). Nach dem Stellen der CPU-Uhr muß in DB101.DBD0 und DB101.DBD4 wieder DW#16#90010100 und DW#16#00000002 drinstehen.

Dann noch die Uhr des MP377 beobachten, während das MP377 keine Verbindung zur CPU hat. Wenn die Panel-Uhr ohne Verbindung zur CPU springt, dann liegt der Fehler in WinCC flexible oder in der Uhr des MP377.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich würde zunächst in WinCC flexible die Bereichszeiger- und Variable-Einstellungen kontrollieren, alle E/A-Felder löschen und neu erstellen, die Schaltfläche "Set PLC clock" löschen und neu erstellen, die temporären Dateien löschen und alles neu generieren

Genau das war es, hab die Temp Dateien gelöscht und die E/A Felder neu erstellt.
Warum sollte es auch einfach sein :ROFLMAO:

Danke nochmal für deine Hilfe
 
hallo leute,
hier ist mein Lösungsvorschlag damit das datum und die uhrzeit überall gleich sind ( CPU-zeit und die systemzeit aller hmi geräte an dieser cpu ).
DT mittels sfc 1 auslesen und in einen db schreiben. diese variable vom dem db dann in allen hmi-projekten als bereichszeiger "datum und uhrzeit der SPS" anlegen. somit ist jede systemzeit der hmi-geräte die gleiche wie der sps. wenn jetzt die zeit nicht mehr stimmt braucht mann nur über ein hmi dateandtime der sps mittels sfc 0 einstellen und dann sind alle zeiten wieder die gleichen.
 
Zurück
Oben