Uhrzeit synchronisieren -- Konvertierungsfehler

MatthiasH24

Level-1
Beiträge
132
Reaktionspunkte
6
Zuviel Werbung?
-> Hier kostenlos registrieren
hi also probiere heute schon die ganze zeit die Uhrzeit zwischen Siemens CPU 315 und einem MP277 zu synchronisieren.

mit der Suche hier und bei Siemens bin ich auch schon weiter gekommen.
Also falls mir jemand diese Anleitung

http://support.automation.siemens.c...objaction=csview&extranet=standard&viewreg=WW]
raten will die kenn ich schon. Habe da das file A3 eingebunden und es geht auch soweit nur wenn ich auf Systemuhr stellen klicke kommt zuerst Variable DateTime Konvertierungsfehler und danach fehlerzustand beendet.

Also es geht ja soweit nur ist das keine Lösung die ich dem kunden anbieten kann mit einer Fehlermeldung

Hat jeman eine Idee woran das liegen kann.

danke schonmal
 
Zuviel Werbung?
-> Hier kostenlos registrieren
ich will diese fehlermeldung weg haben.

bevor ich es in ddas richtige projekt eingebunden habe ging es auch ohne die Meldung habe aber schon zig nmal alles durchgeschaut und finde keine fehler in dem jetztigen Projekt

Bzw habe jetzt grad mit meinem kolleg gesprochen wenn es eine einfache Lösung geben würde die das Panle mit der Cpu zeit synchronisiert würde das auch reichen
 
...
Das Zauberwort heißt hier "Steuerungsauftrag".
Ich möchte auch wetten, dass dazu hier im Forum schon was zu finden ist.
Jedenfalls legt man einen Datenbereich fest, in dem zwischen Bediengerät und SPS Daten ausgetauscht werden. Die entsprechende Auftragsnummer legt fest, was getan wird. In deinem Fall ginge auf jedem Fall Datum von SPS nach Panel und Uhrzeit von SPS nach Panel und natürlich auch beides umgekehrt.

Bemüh' aber auf jeden Fall auch mal die Foren-Suche.

Gruß
LL
 
So habe es jetzt über die erste Möglichkeit gemacht ( bei deim obigen link nachzulesen) die systemzeit wird auch aktualisiert jetzt würde ich nur noch gerne mit dem baustein SetCLk die systemzeit der Cpu setzten können.

hat jemand eine Idee wie ich das am einfachsten lösen kann?
 
ja das bsp an sich ist nicht schlecht aber ich kann es so leider nicht verwenden da es 2 bereichszeiger benötigt und ich nur einen verwenden kann/darf der andere ist schon für was anderes verbraucht.

Das ist das problem
 
... du brauchst nur einen Bereichszeiger ... und zwar den für das Auftragsfach. Diese Auftragsfach kannst du dann für den Datanaustausch verwenden :
Z.B. "Setze Datum in Bediengerät"
und wenn du noch einen Auftrag hast, dann wartest du, bis der 1. Auftrag abgearbeitet wurde und dann machst du z.B. "Setze Uhrzeit im Bediengerät" ... usw.

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi

so also ich habe das Problem jetzt andersweitig gelöst bzw ist es noch net ganz gelöst dazu gibts einen anderen beitrag.

habe mir ein programm geschrieben das die Systemzeit ausliest und die Systemzeit stellen kann.
 
Ich wollte ihn noch schreiben :)

habe mir aber überlegt das ich ihn doch hier anhängen werde.

Also mein problem habe mit der Hilfe von Siemens ein kleines Programm geschrieben:

Code:
    FP..
      CALL  "SET_CLK"
       PDT    :=#Datum_Uhrzeit
       RET_VAL:=MW20
      U     "Stellen"
      SPB   a
      BEA   
a:    LAR1  P##Datum_Uhrzeit
      L     #Jahr
      T     B [AR1,P#0.0]
      L     #Monat
      T     B [AR1,P#1.0]
      L     #tag
      T     B [AR1,P#2.0]
      L     #Stunde
      T     B [AR1,P#3.0]
      L     #Minute
      T     B [AR1,P#4.0]
      L     #Sekunde
      T     B [AR1,P#5.0]
      L     #Wochentag
      T     B [AR1,P#7.0]

      BE

das Fp wird noch programmiert.
Die Eingabefelder sind auf eine WinCC seite getrennt von einander und in einem datenbaustein abgelegt. mit der größe von jeweils 1byte.

Das Problem ist jetzt nur das wenn ich die varaiblen über VAT beobachte sehe ich das er die werte übernimmt nur die zeit wird nicht getstellt.

Dazu habe ich 2 Vermutungen entweder das Programm stimmt nicht (wahrscheinlich :)) oder kann es sein das dass mit dem SFC0 nur bei na richtigen angeschlossenen CPU geht im mom mache ich es nur über Baugruppen simulieren.

Ne Idee?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das Datenformat "Date and Time" ist BCD-Codiert, deshalb musst Du deine Eingaben vom Panel noch entsprechend wandeln.
Den Wochentag brrauchst Du übrigens zum Uhrzeitstellen nicht berücksichtigen, den ermittelt die Steuerung mit Hilfe des integrierten Kalenders selbsttätig.
Code:
a:    LAR1  P##Datum_Uhrzeit
      L     #Jahr
      [COLOR=red]ITB[/COLOR]
      T     B [AR1,P#0.0]
      L     #Monat
      ITB
      T     B [AR1,P#1.0]
      L     #tag
      ITB
      T     B [AR1,P#2.0]
      L     #Stunde
      ITB
      T     B [AR1,P#3.0]
      L     #Minute
      ITB
      T     B [AR1,P#4.0]
      L     #Sekunde
      ITB
      T     B [AR1,P#5.0]
 
ja gut also im moment habe ich die Eingabe Felder bei WinCc als hexa deklariert da brauche ich es ja nicht umwandlen. Es geht aber trotzdem net wirklich.

Auf der Wincc seite benutze ich 2 Felder zur Ausgabe
1.feld Ausgabe - Uhrzeit anzeigen - systemzeit anzeigen
2.feld ausgabe - datum anzeigen - systemzeit anzeigen

kann es sein das ich den SFC1 noch explizit beschrieben muss? Im mom sieht das nur so aus Code im Ob1

Code:
      CALL  FC     1
       Jahr     :="Uhrzeit".Jahr
       Monat    :="Uhrzeit".Monat
       tag      :="Uhrzeit".Tag
       Stunde   :="Uhrzeit".Stunde
       Minute   :="Uhrzeit".Minuten
       Sekunde  :="Uhrzeit".Sekunde
       Wochentag:="Uhrzeit".Wochentag
      CALL  "READ_CLK"
       RET_VAL:=#t_RetVal
       CDT    :="Areapointer_Date_Time".DATE_TIME_OP.DATE_TIME
      NOP   0
 
      BEA

CDT ist symbolisch programmiert und liegt im DB1
 
Zuletzt bearbeitet:
Hallo Matthias,
ich versuche es nochmal :
Wenn du von der CPU aus die Uhrzeit (oder das Datum) im Bediengerät stellen willst, so geht das nur über einen Steuerungsauftrag. Diesen legst du in der Projektierung der Visu fest. Er bezieht sich auf einen 8 Byte (4 Worte) großen Puffer in der SPS.

Dieser Puffer ist dann so aufgebaut :
Byte 0 : Reserviert
Byte 1 : Jobnummer
Byte 2 - 5 : Daten

Wenn du dass Datum zum Bediengerät schreiben willst so ist die Zuordnung wie folgt :
Byte 1 : 15
Byte 5 : Tag
Byte 6 : Monat
Byte 7 : Jahr

Wenn du die Uhrzeit zum Bediengerät schreiben willst so ist die Zuordnung wie folgt :
Byte 1 : 14
Byte 3 : Stunde
Byte 4 : Minute
Byte 5 : Sekunde

Du kannst immer nur einen Auftrag absetzen.
Das ein Auftrag abgesetzt ist und abgearbeitet wurde kannst du dabnn erkennen, dass das Bediengerät die Jobnummer wieder auf 0 gesetzt hat ...

Vielleicht kommst du so etwas weiter.
Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hier mal eine fix und fertige Funktion von mir.
Allerdings sind die Uhrzeitvorgaben hier als 16-Bit Integer vorgesehen.
Es funktioniert aber so wie es ist.:D
Code:
FUNCTION "set_sys_clk" : VOID
TITLE =set_sys_clk
//Baustein zum stellen der AG-Uhr nach der Systemzeit des Visualisierungs-PC
AUTHOR : ne
FAMILY : clock
VERSION : 1.1
 
VAR_INPUT
  jahr : INT ; 
  monat : INT ; 
  tag : INT ; 
  stunden : INT ; 
  minuten : INT ; 
  sekunden : INT ; 
END_VAR
VAR_IN_OUT
  set : BOOL ; 
END_VAR
VAR_TEMP
  zeit_v : DATE_AND_TIME ; //Zeitvorgabe
  zeit_s : DATE_AND_TIME ; //Systemzeit SPS
  rt_vl : INT ; 
  jahrxx : INT ; //Jahr 2-stellig
  AR1_sik : DWORD ; 
  AR2_sik : DWORD ; 
END_VAR
BEGIN
NETWORK
TITLE =Wenn #set 0 Baustein nicht bearbeiten
      UN    #set; 
      BEB   ; 
NETWORK
TITLE =Jahresangabe auf 2-stellig umrechnen
//Baustein funktioniert nur bis 2099
      O(    ; 
      L     #jahr; 
      L     2099; 
      >I    ; 
      )     ; 
      O(    ; 
      L     #jahr; 
      L     1900; 
      <I    ; 
      )     ; 
      U(    ; 
      L     #jahr; 
      L     99; 
      >I    ; 
      )     ; 
      BEB   ; 
//zweistellige Jahresangabe am Eingang
      L     #jahr; 
      L     100; 
      <I    ; 
      SPBN  sp01; 
      L     #jahr; 
      T     #jahrxx; 
      SPA   sp04; 
//vierstellige Jahresangabe im 20. Jahrhundert 
sp01: U(    ; 
      L     #jahr; 
      L     1900; 
      >=I   ; 
      )     ; 
      U(    ; 
      L     #jahr; 
      L     1999; 
      <=I   ; 
      )     ; 
      SPBN  sp02; 
      L     #jahr; 
      L     1900; 
      -I    ; 
      T     #jahrxx; 
      SPA   sp04; 
//vierstellige Jahresangabe im 21. Jahrhundert 
sp02: U(    ; 
      L     #jahr; 
      L     2000; 
      >=I   ; 
      )     ; 
      U(    ; 
      L     #jahr; 
      L     2099; 
      <=I   ; 
      )     ; 
      SPBN  sp04; 
      L     #jahr; 
      L     2000; 
      -I    ; 
      T     #jahrxx; 
sp04: NOP   0; 
 
NETWORK
TITLE =Date_And_Time- Variable beschreiben
 
      TAR1  ; 
      T     #AR1_sik; 
      LAR1  P##zeit_v; 
      L     #jahrxx; 
      ITB   ; 
      T     B [AR1,P#0.0]; 
      L     #monat; 
      ITB   ; 
      T     B [AR1,P#1.0]; 
      L     #tag; 
      ITB   ; 
      T     B [AR1,P#2.0]; 
      L     #stunden; 
      ITB   ; 
      T     B [AR1,P#3.0]; 
      L     #minuten; 
      ITB   ; 
      T     B [AR1,P#4.0]; 
      L     #sekunden; 
      ITB   ; 
      T     B [AR1,P#5.0]; 
      L     B#16#0; 
      T     B [AR1,P#6.0]; 
      T     B [AR1,P#7.0]; 
 
NETWORK
TITLE =Systemuhr stellen
      CALL "SET_CLK" (
           PDT                      := #zeit_v,
           RET_VAL                  := #rt_vl);
NETWORK
TITLE =Systemuhr lesen
      CALL "READ_CLK" (
           RET_VAL                  := #rt_vl,
           CDT                      := #zeit_s);
 
NETWORK
TITLE =Neue Zeit prüfen und #set zurücksetzen 
//Es werden nur Tag, Stunde, Minute und Sekunde geprüft
      TAR2  ; 
      T     #AR2_sik; 
      LAR2  P##zeit_s; 
      L     D [AR1,P#2.0]; 
      L     D [AR2,P#2.0]; 
      ==D   ; 
      R     #set; 
 
NETWORK
TITLE =Adressregister zurücksichern
      L     #AR1_sik; 
      LAR1  ; 
      L     #AR2_sik; 
      LAR2  ; 
 
END_FUNCTION
 
hey

ja das mit den Jobaufträgen ansich ist mir eigentlich soweit klar. Die sync mit dem panel geht ja auch. Ich will jetzt nur aktiv die Systemzeit der Cpu schreiben können. Dreht sich ganz einfach darum das die Kunde die Maschinen am Wochenende ausschalten will und dann Montags bei Beginn die Uhrzeit stellen soll/will. die CPu uhrzeit ist gepuffert klar aber es soll trotzdem die Möglichkeit geben die CPu neu stellen zu können.
 
... dann machst du das Ganze eben umgekehrt.
Hier läuft dann allerdíngs alles in der CPU. Im MP machst du die Eingaben, die in der SPS irgendwo im DB landen. Die übergebenen Werte mußt du nun in das Format Date_Time umwandeln und dann mit dem SFC1 die Systemuhr neu setzen. Das Ganze würde ich von einem Bit abhängig machen, dass du in der Visu setzt und in der CPU auswertest ...

Dafür brauchst du dann keinen Steuerungsauftrag ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja so will ich es ja nur leider geht es mit dem programm was ich euch gezigt habe net.

Frage zu read CLK im mom ist das wie folgt aufgebaut

Aufruf:

Code:
 CALL  "READ_CLK"
       RET_VAL:=#t_RetVal
       CDT    :="Areapointer_Date_Time".DATE_TIME_SPS.DATE_TIME
      NOP   0

Datenbaustein:

Code:
 STRUCT  
   DATE_TIME_SPS : STRUCT  
    DATE_TIME : DATE_AND_TIME ; 
    reserve : ARRAY  [0 .. 3 ] OF BYTE ; 
   END_STRUCT ; 
  END_STRUCT ; 
BEGIN
   DATE_TIME_SPS.DATE_TIME := DT#90-1-1-0:0:0.000; 
   DATE_TIME_SPS.reserve[0] := B#16#0; 
   DATE_TIME_SPS.reserve[1] := B#16#0; 
   DATE_TIME_SPS.reserve[2] := B#16#0; 
   DATE_TIME_SPS.reserve[3] := B#16#0; 
END_DATA_BLOCK

@OHGN

Danke für dein Programm aber sei mir nicht böse das werde ich nur als letzte möglichkeit verwenden anversich ist es ja so wie meins. Denn nur was ich selber gemahct habe habe ich auch verstanden. Brauche nur ein paar Tips.
 
Zuletzt bearbeitet:
Read_Clk ist korrekt aufgebaut ... aber den brauchst du doch dann nun nicht ... Der liest die CPU-Zeit in den Speicher ...

Du willst doch von der Visu die SPS-Zeit setzen. Das wäre dann Set_Clk (SFC1).
 
Ja und SET CLk ist so aufgebaut wie ich weiter oben gepostet habe. ich stecke jetzt grad mal ne echte sps an mal schauen was die dann macht.
 
Zurück
Oben