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.