# Uhrzeit synchronisieren -- Konvertierungsfehler



## MatthiasH24 (24 Oktober 2008)

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


----------



## Larry Laffer (24 Oktober 2008)

was hast du denn jetzt vor und was geht nicht ? Wobei brauchst du Hilfe ...?


----------



## MatthiasH24 (24 Oktober 2008)

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


----------



## Larry Laffer (24 Oktober 2008)

...
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


----------



## MatthiasH24 (24 Oktober 2008)

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?


----------



## Larry Laffer (24 Oktober 2008)

... 
noch einmal zu dem geposteten Link zur Anleitung ...
Die ist doch schon Klasse ...
Was hast du jetzt also wie gemacht ?


----------



## MatthiasH24 (24 Oktober 2008)

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


----------



## Larry Laffer (24 Oktober 2008)

... 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


----------



## MatthiasH24 (27 Oktober 2008)

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.


----------



## Larry Laffer (27 Oktober 2008)

...
und  für einen neuen Thread ...

Wo hängst du denn nun und was geht nicht ...?


----------



## MatthiasH24 (27 Oktober 2008)

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:


```
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?


----------



## OHGN (27 Oktober 2008)

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.

```
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]
```


----------



## MatthiasH24 (27 Oktober 2008)

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


```
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


----------



## Larry Laffer (27 Oktober 2008)

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


----------



## OHGN (27 Oktober 2008)

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.

```
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
```


----------



## MatthiasH24 (27 Oktober 2008)

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.


----------



## Larry Laffer (27 Oktober 2008)

... 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 ...


----------



## MatthiasH24 (27 Oktober 2008)

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:


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


```
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.


----------



## Larry Laffer (27 Oktober 2008)

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).


----------



## MatthiasH24 (27 Oktober 2008)

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.


----------



## OHGN (27 Oktober 2008)

MatthiasH24 schrieb:


> 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.


Keine Ursache....
Ich hatte das ja auch nur als Beispiel gepostet, damit Du es Dir ansehen kannst und dabei verstehst wie das generell funktioniert.

PS. Wenn Du Deinen Programmteil irgendwann mal fertig hast bin ich mir sicher, dass sich das ganze nicht wesentlich von meinem Beispiel unterscheiden wird, der Lösungsweg ist doch ziemlich eng durch das System vorgegeben.


----------



## MatthiasH24 (27 Oktober 2008)

So ich bin noch am probieren mit der SPS wenn sich was neues ergibt melde ich mich wieder

Update die tatsächliche SPS geht in stop wenn ich das stellen starten will. bei Diagnosepuffer meldet sie:


Baugruppenträger:              0
Steckplatz:                    2
Ereignis 1 von 100:  Ereignis-ID 16# 4562
STOP durch Programmierfehler (OB nicht geladen oder nicht möglich, bzw. kein FRB vorhanden ) 
Unterbrechungstelle im Anwenderprogramm: Zyklisches Programm (OB 1) 
Prioritätsklasse:    1
FC-Nummer:     1
Bausteinadresse:     18 
Bisheriger Betriebszustand: RUN
Angeforderter Betriebszustand: STOP (intern)
interner Fehler, kommendes Ereignis
14:07:42.520  16.09.2008

Ereignis 2 von 100:  Ereignis-ID 16# 2525
Bereichsfehler beim Schreiben 
Falsche Bereichskennung:   86
Angeforderter OB: Programmierfehler-OB (OB 121)
OB nicht vorhanden oder gesperrt oder nicht startbar im aktuellen Betriebszustand
interner Fehler, kommendes Ereignis
14:07:42.520  16.09.2008

und wenn ich auf bausteinöffnen gehe dann 


```
U     "Stellen"
      SPB   a
      BEA   
a:    LAR1  P##Datum_Uhrzeit
      L     #Jahr
// 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     #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]
//      L     #Wochentag
//    ITB   
//  T     B [AR1,P#7.0]
      CALL  "SET_CLK"
       PDT    :=#Datum_Uhrzeit
       RET_VAL:=MW20

      BE
```
 
dann steht der Cursor bei Anweisung 6 im netzwerk1


----------



## OHGN (27 Oktober 2008)

Wo steht denn Deine Variable "#Datum_Uhrzeit" genau?
.


----------



## Larry Laffer (27 Oktober 2008)

... und hast du bei der Wandlung von jahr berücksichtigt, dass du nicht "2008" wandeln kannst/darfst sondern nur "08"?  - also die Jahrhunderte abziehen ...


----------



## MatthiasH24 (27 Oktober 2008)

Die variable datum uhrzeit steht im temp des dazugehörigen bausteins. Im eingabe feld des jahres steht nur 08 drin also genauer 0008


----------



## Larry Laffer (27 Oktober 2008)

... warum hast du die Wandlungsbefehle (ITB) weg-geREMt ?


----------



## MatthiasH24 (27 Oktober 2008)

ich habe zum testen die felder bei wincc wieder als hexa deklariert weil ich zuerst dachte der fehler liegt eventuell an der wandlung.


----------



## Larry Laffer (27 Oktober 2008)

... im Date_Time müssen die Werte aber wieder als BCD-"String"  drinstehen - sonst kann der SFC1 damit nicht viel anfangen !


----------



## OHGN (27 Oktober 2008)

Also bei mir funktioniert der Code von MatthiasH24 so wie er oben gepostet wurde, auch mit den Hexzahlen als Vorgabe.
Kann da keinen Fehler feststellen, es geht auch nichts in "Stopp"


----------



## MatthiasH24 (27 Oktober 2008)

Also die CPu geht aufjedenfall in Stop wegem dem Transferieren habe das mit dem jahr jetzt mal ausgeblendet und nur ist es beim Monta stehen geblieben.

Also soll ich jetzt das eingabe feld in Wincc  als dezimal deklarieren. die Größe der jeweiligen speicher also jahr monat usw ist ja 1byte groß und dann mittels ITb wandeln!?


----------



## MatthiasH24 (27 Oktober 2008)

OHGN schrieb:


> Also bei mir funktioniert der Code von MatthiasH24 so wie er oben gepostet wurde, auch mit den Hexzahlen als Vorgabe.
> Kann da keinen Fehler feststellen, es geht auch nichts in "Stopp"


 
das einzige was mir dazu einfällt ist... ich denke ja auch die ganze zeit das dass vom code hergehen muss. meine CPU Ist eine CPU315 2DP 315-2AF02-0AB0

nochmal die fehlerliste.

```
Diagnosepuffer der Baugruppe CPU 315-2 DP
Bestell-Nr./ Bezeichn.         Komponente                     Ausgabestand                  
6ES7 315-2AF02-0AB0            - - -                          3                             
Baugruppenträger:              0
Steckplatz:                    2
Ereignis 1 von 100:  Ereignis-ID 16# 4562
STOP durch Programmierfehler (OB nicht geladen oder nicht möglich, bzw. kein FRB vorhanden ) 
Unterbrechungstelle im Anwenderprogramm: Zyklisches Programm (OB 1) 
Prioritätsklasse:    1
FC-Nummer:     1
Bausteinadresse:     18 
Bisheriger Betriebszustand: RUN
Angeforderter Betriebszustand: STOP (intern)
interner Fehler, kommendes Ereignis
15:09:42.160  16.09.2008

Ereignis 2 von 100:  Ereignis-ID 16# 2525
Bereichsfehler beim Schreiben 
Falsche Bereichskennung:   86
Angeforderter OB: Programmierfehler-OB (OB 121)
OB nicht vorhanden oder gesperrt oder nicht startbar im aktuellen Betriebszustand
interner Fehler, kommendes Ereignis
15:09:42.159  16.09.2008

Ereignis 3 von 100:  Ereignis-ID 16# 4302
Betriebszustandsübergang von ANLAUF nach RUN 
Anlaufinformation:
- Uhr für Zeitstempel bei letztem NETZ-EIN nicht gepuffert
- Einprozessorbetrieb
Aktuelle/letzte durchgeführte Anlaufart:
- Neustart (Warmstart) durch MPI-Bedienung; letzter NETZ-EIN gepuffert
Zulässigkeit bestimmter Anlaufarten:
- manueller Neustart (Warmstart) zulässig
- automatischer Neustart (Warmstart) zulässig
Letzte gültige Bedienung oder Einstellung der automatischen Anlaufart bei NETZ-EIN:
- Neustart (Warmstart) durch MPI-Bedienung; letzter NETZ-EIN gepuffert 
Bisheriger Betriebszustand: ANLAUF (Neustart/Warmstart) 
Angeforderter Betriebszustand: RUN
kommendes Ereignis
15:06:11.554  16.09.2008
```
 
 kann euch auch wenn ihr wollt mein komplettes Projekt schicken. hat im mom noch keine vertrauliche daten.


----------



## Larry Laffer (27 Oktober 2008)

Hast du den DB auch mit AUF aufgerufen ?
Mehr fällt mir im Augenblick dazu nicht mehr ein ...


----------



## MatthiasH24 (27 Oktober 2008)

nein habe ich nicht wo soll ich das machen?


----------



## OHGN (27 Oktober 2008)

MatthiasH24 schrieb:


> nein habe ich nicht wo soll ich das machen?


Larry geht davon aus dass Deine Variablen #jahr; #monat; etc. in einem DB stehen. Diesen müsste man vorher aufschlagen. 
Von was für einem Typ sind diese Variablen denn, In's an einer FC?


----------



## MatthiasH24 (27 Oktober 2008)

ja das habe ich ja alles schon geschrieben die #jahr usw stehen in einem datenbaustein drin und sind wie laut siemens hilfe 1byte groß. Was hast denn du gemacht das es bei dir geht?

Also ich bin langsam echt am verzweifeln das ist ja eigentlich so ein billiegs programm und es will net laufen. kann ich eigentlich IBT auch bei nur 1 byte großen variablen verwenden?


----------



## OHGN (27 Oktober 2008)

MatthiasH24 schrieb:


> ja das habe ich ja alles schon geschrieben die #jahr usw stehen in einem datenbaustein drin und sind wie laut siemens hilfe 1byte groß. Was hast denn du gemacht das es bei dir geht?


Die Variable kannst Du doch mit #jahr garnicht so aufrufen wenn sie in einem Datenbaustein steht... (IDB mal ausgenommen).
Ich habe zum Testen Deines Codes der Einfachheit halber Deine Variablen durch Merkerbytes ersetzt, ansonsten aber nichts verändert.
So wie hier habe ich das ganze in die CPU geladen und es funktioniert:

```
U     M      0.0                  //stellen
      SPB   a
      BEA   
a:    LAR1  P##Datum_Uhrzeit
      L     MB    10                    //Jahr
// ITB   
      T     B [AR1,P#0.0]
      L     MB    11                    //Monat
// ITB   
      T     B [AR1,P#1.0]
      L     MB    12                    //Tag
//ITB   
      T     B [AR1,P#2.0]
      L     MB    13                    //Stunde
//ITB   
      T     B [AR1,P#3.0]
      L     MB    14                    //Minute
//ITB   
      T     B [AR1,P#4.0]
      L     MB    15                    //Sekunde
//ITB   
      T     B [AR1,P#5.0]
//      L     #Wochentag
//    ITB   
//  T     B [AR1,P#7.0]
      CALL  "SET_CLK"
       PDT    :=#Datum_Uhrzeit
       RET_VAL:=MW20
      BE
```


----------



## MatthiasH24 (27 Oktober 2008)

Ich übergebe die variablen doch im OB1 wie hier 

Übergabe:


```
CALL  FC     1
       Jahr     :="Uhrzeit".Jahr
       Monat    :="Uhrzeit".Monat
       tag      :="Uhrzeit".Tag
       Stunde   :="Uhrzeit".Stunde
       Minute   :="Uhrzeit".Minuten
       Sekunde  :="Uhrzeit".Sekunde
       Wochentag:="Uhrzeit".Wochentag
```


----------



## OHGN (27 Oktober 2008)

Also doch IN's (stoßseufz)
Aber ehrlich, da muss ich jetzt passen! Ich habe keine Idee mehr warum das bei Dir nicht funktioniert...:-(

Edit:
Zum testen könntest Du allerdings mal probieren auf Deine Variable #Datum_Uhrzeit absolut zuzugreifen, das ist zwar nicht gern gesehen, aber wenn's der Fehlerfindung dient...


```
U     "Stellen"
      SPB   a
      BEA   
a:    L     #Jahr
      T     LB     0                    //Vorrausgesetzt #Datum_Uhrzeit liegt auf Lokaldatenadresse 0
      L     #Monat
      T     LB     1
      L     #tag
      T     LB     2
      L     #Stunde
      T     LB     3
      L     #Minute
      T     LB     4
      L     #Sekunde
      T     LB     5
      CALL  "SET_CLK"
       PDT    :=#Datum_Uhrzeit
       RET_VAL:=MW20
      BE
```


----------



## MatthiasH24 (27 Oktober 2008)

Hi

so jetzt darf ich euch endlich mitteilen das es geht. Ich weiß nicht ob es das problem war aber im Simatic Manager -> Zielsystem -> Diagnose/Einstellungen -> uhrzeit stellen -> war ein haken gesetzt bei Uhrzeit von PG/PC übernehmen das habe ich raus gemacht und es ging.

Hier mal mein Code für die, die es auch gebrauchen können.:

Aufjedenfall ein großes Dankeschön an euch beide für eure Hilfe

Funnktionsbaustein:

```
CALL  "READ_CLK"
       RET_VAL:=MW22
       CDT    :="Areapointer_Date_Time".DATE_TIME_SPS.DATE_TIME
 
      FP    "Stellen"
      SPB   a
      BEA   
a:    LAR1  P##Datum_uhrzeit
      L     "Uhrzeit".Jahr
      ITB   
      T     B [AR1,P#0.0]
      L     "Uhrzeit".Monat
      ITB   
      T     B [AR1,P#1.0]
      L     "Uhrzeit".Tag
      ITB   
      T     B [AR1,P#2.0]
      L     "Uhrzeit".Stunde
      ITB   
      T     B [AR1,P#3.0]
      L     "Uhrzeit".Minuten
      ITB   
      T     B [AR1,P#4.0]
      L     "Uhrzeit".Sekunde
      ITB   
      T     B [AR1,P#5.0]
 
      CALL  "SET_CLK"
       PDT    :=#Datum_uhrzeit
       RET_VAL:=MW20
 
      BE
```
 
Im OB1 steht nur

```
Call FB3,db7
```
 
Dazu habe ich noch mit einen DB einen bereichszeiger erstellt.

DB:


```
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 (27 Oktober 2008)

Schön dass es jetzt funktioniert.
Was mich persönlich aber stören würde ist die mangelnde Kapselung Deines Bausteins. Und warum muss das bei Dir unbedingt ein FB sein? 
Eine FC erfüllt das IMHO genauso gut!

Jetzt, nachdem Du ja selber auf eine funktionierende Lösung gekommen bist solltest Du Dir ja vielleicht doch mal die Variante von mir näher anschauen....
http://www.sps-foren.de/showpost.php?p=163065&postcount=15


----------



## MatthiasH24 (28 Oktober 2008)

Hey

ja also ich bin so wie es jetzt ist zufrieden. ist wird jetzt eh noch ein bissel umgebaut und in das projekt eingefügt. Aber dein Code werde ich mir auf jedenfall merken.

Ja es sollte ein FB sein weil sie hier bei mir in der firma FC nicht so gern benutzen


----------

