Uhrzeit vom Fremdsystem übernehmen

Pinguino

Level-1
Beiträge
182
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen
ich bekomme in mein Datenbaustein DB130 über den Ethernet die Zeit vom Leitsystem (Wago I/O). Das heisst ich habe DB130.DB0 bis DB130.DB5 wo das Datum und Uhrzeit eingetragen wird. Das SFC0 ist für das Setzen der CPU-Uhr. Wie muss ich jetzt das ausprogrammieren? Aber ich weiss noch nicht ob ich Byte überkomme, sehr wahrscheinlich bekomme ich Integerwerte für Jahr, Monat, Tag, Std. , Min, Sek.. Was muss ich tun, damit ich den DB130.DBW0 (Jahr) im Bereichszeiger angeben kann und den SFC0 benutzen kann? (Bereichszeiger P#DB131.DBX0.0 Byte 8 Struct: DATE_TIME für SFC0)

Danke für Hilfe!
 
Hallo,

hier ein kleines Beispiel. Wenn du in der Simatic-Hilfe nach Datentyp Date_and_Time suchst, findest du den genauen Aufbau.

Code:
      L     Jahr
      ITB   
      T     LB     0

      L     Monat
      ITB   
      T     LB     1

      L     Tag
      ITB   
      T     LB     1

      L     Stunde
      ITB   
      T     LB     3

      L     Minute
      ITB   
      T     LB     4

      L     Sekunde
      ITB   
      T     LB     5

      CALL  SFC    0
       PDT    :=#Uhrzeit      // Date_and_time tmp ab L0.0
       RET_VAL:=#val
 
Zuviel Werbung?
-> Hier kostenlos registrieren
ich bekomme in mein Datenbaustein DB130 über den Ethernet die Zeit vom Leitsystem (Wago I/O). Das heisst ich habe DB130.DB0 bis DB130.DB5 wo das Datum und Uhrzeit eingetragen wird. Das SFC0 ist für das Setzen der CPU-Uhr. Wie muss ich jetzt das ausprogrammieren? Aber ich weiss noch nicht ob ich Byte überkomme, sehr wahrscheinlich bekomme ich Integerwerte für Jahr, Monat, Tag, Std. , Min, Sek.. Was muss ich tun, damit ich den DB130.DBW0 (Jahr) im Bereichszeiger angeben kann und den SFC0 benutzen kann? (Bereichszeiger P#DB131.DBX0.0 Byte 8 Struct: DATE_TIME für SFC0)

Hier ist ein kurzes Programmbeispiel von mir. Ich bin davon ausgegangen, dass die Werte für Jahr, Monat, Tag, Stunde, Minute und Sekunden vom Leitsystem (WAGO) als INT-Werte kommen.

Code:
FUNCTION FC 100 : VOID
TITLE =SPS-Uhr stellen
//16
AUTHOR : KAI
FAMILY : SPSFORUM
NAME : WAGO
VERSION : 1.0
 
VAR_INPUT
  WAGO_UHR : POINTER ; 
  SPS_UHR_STELLEN : BOOL ; 
END_VAR
VAR_TEMP
  DB_REGISTER : WORD ; 
  AR1_REGISTER : DWORD ; 
  AR2_REGISTER : DWORD ; 
  DB_NUMMER : WORD ; 
  SPS_UHR : DATE_AND_TIME ; 
  RETVAL : INT ; 
END_VAR
BEGIN
NETWORK
TITLE =DB-Register und AR-Register sichern
 
      L     DBNO; // DB-Register
      T     #DB_REGISTER; 
 
      TAR1  #AR1_REGISTER; // AR1-Register
 
      TAR2  #AR2_REGISTER; // AR2-Register
 
NETWORK
TITLE =WAGO-Uhr nach SPS-Uhr kopieren
 
      L     P##WAGO_UHR; // WAGO POINTER
      LAR1  ; 
 
      L     W [AR1,P#0.0]; // WAGO DB-Nummer
      T     #DB_NUMMER; 
 
      AUF   DB [#DB_NUMMER]; 
 
      L     D [AR1,P#2.0]; // WAGO Bereichszeiger
      LAR1  ; 
 
 
      L     P##SPS_UHR; // SPS POINTER
      LAR2  ; 
 
 
      L     B [AR1,P#0.0]; // WAGO Jahr
      ITB   ; 
      T     B [AR2,P#0.0]; // SPS Jahr
 
      L     B [AR1,P#1.0]; // WAGO Monat
      ITB   ; 
      T     B [AR2,P#1.0]; // SPS Monat
 
      L     B [AR1,P#2.0]; // WAGO Tag
      ITB   ; 
      T     B [AR2,P#2.0]; // SPS Tag
 
      L     B [AR1,P#3.0]; // WAGO Stunde
      ITB   ; 
      T     B [AR2,P#3.0]; // SPS Stunde
 
      L     B [AR1,P#4.0]; // WAGO Minute
      ITB   ; 
      T     B [AR2,P#4.0]; // SPS Minute
 
      L     B [AR1,P#5.0]; // WAGO Sekunde
      ITB   ; 
      T     B [AR2,P#5.0]; // SPS Sekunde
 
NETWORK
TITLE =SPS-Uhr stellen
 
      U     #SPS_UHR_STELLEN; 
      SPBNB _001; 
      CALL SFC    0 (
           PDT                      := #SPS_UHR,
           RET_VAL                  := #RETVAL);
_001: NOP   0; 
 
NETWORK
TITLE =DB-Register und AR-Register wiederherstellen
 
      AUF   DB [#DB_REGISTER]; // DB-Register
 
      LAR1  #AR1_REGISTER; // AR1-Register
 
      LAR2  #AR2_REGISTER; // AR2-Register
 
END_FUNCTION

Gruß Kai
 

Anhänge

  • OB1.pdf
    7,7 KB · Aufrufe: 33
  • FC100.pdf
    7,5 KB · Aufrufe: 24
  • DB200.pdf
    4,8 KB · Aufrufe: 20
  • DB220.pdf
    5 KB · Aufrufe: 18
  • Wago.zip
    34,1 KB · Aufrufe: 28
Und hier sind ein paar Bilder aus der Simulation mit PLCSIM.

Gruß Kai
 

Anhänge

  • VAT_1.jpg
    VAT_1.jpg
    247,1 KB · Aufrufe: 49
  • VAT_2.jpg
    VAT_2.jpg
    247,7 KB · Aufrufe: 28
  • VAT_3.jpg
    VAT_3.jpg
    247,7 KB · Aufrufe: 26
Ich habe noch eine Frage betreffend diesen Code:

L Jahr
ITB
T LB 0

Ist Jahr ein Integer wert, z.B. DB200.DW2?
 
Ich habe jetzt den DB vom Fremdsystem definiert:

DB150.DBW0 => Jahr
DB150.DBW2 => Monat
DB150.DBW4 => Tag
DB150.DBW6 => Stunden
DB150.DBW8 => Minuten
DB150.DBW8 => Sekunden

DB151 für Uhrzeit synchronisation :

L DB150.DBW0 => Jahr
ITB
T DB151.DBB0 => Jahr in BCD

L DB150.DBW2 => Monat
ITB
T DB151.DBB1 => Monat in BCD
...
...
usw.

und dann mit dem SFC0 (DB151) Uhrzeit CPU setzen.


Funktioniert das??

Merci für Hilfe
 
Du mußt hier berücksichtigen, dass das Jahr auch nur von 0..99 zählt und zwar von 1990 an - 2008 wäre also 18 ...
Der SFC0 erwartet hier auch nur 1 Byte, dass entsprechend beschaltet ist ...

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du mußt hier berücksichtigen, dass das Jahr auch nur von 0..99 zählt und zwar von 1990 an - 2008 wäre also 18 ...

Das ist so nicht ganz richtig.

Wenn die SPS-Uhr auf das Jahr 2008 gestellt werden soll, muss folgendes gelten:

DB150.DBW0 = INT 08 => DB151.DBB0 = BCD 08

Gruß Kai
 
Das ist so nicht ganz richtig.

Wenn die SPS-Uhr auf das Jahr 2008 gestellt werden soll, muss folgendes gelten:

DB150.DBW0 = INT 08 => DB151.DBB0 = BCD 08

Gruß Kai


Das heisst im DB150.DBW0 ist der INT Wert von 08 bis 89 oder den DB150.DBB1 ist den INT Wert 08 bis 89 wo dann mit
Befehl ITB den DB151.DBB0 = BCD 08 abgelegt wird.

Welchen von den zwei Varianten ist richtig (xxx.DBW0 oder xxx.DBB1)?
 
Zuletzt bearbeitet:
Ich habe es noch nicht ausprobiert.

Geht die Variante nicht wenn z.B.

L DB150.DBW0 => Jahr ist von 00 bis 89
ITB
T DB151.DBB0 => Jahr in BCD 00 89

gemacht wird?
 
@Kai:
Hast du das schon ausprobiert ...? Ich bin mir bei meiner Aussage sicher ...

Aus der Siemens-Hilfe

Der Datentyp Date_And_Time wird im BCD-Format gespeichert:

Bytes Inhalt Bereich
0 Jahr 90 ... 89, d.h. die Jahre 1990 bis 2089
1 Monat 01 ... 12
2 Tag 1 ... 31
3 Stunde 0 ... 23
4 Minute 0 ... 59
5 Sekunde 0 ... 59
6 2 MSD von ms 00 ... 99
7 (4 MSB) LSD von ms 0 ... 9
7 (4 LSB) Wochentag 1 ... 7 (1 = Sonntag)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe es noch nicht ausprobiert.

Geht die Variante nicht wenn z.B.

L DB150.DBW0 => Jahr ist von 00 bis 89
ITB
T DB151.DBB0 => Jahr in BCD 00 89

gemacht wird?

geht so

L DB150.DBW0 => Jahr ist von 90 - 89
ITB
T DB151.DBB0 => Jahr in BCD 90 - 89
 
Ich habe es noch nicht ausprobiert.

Geht die Variante nicht wenn z.B.

L DB150.DBW0 => Jahr ist von 00 bis 89
ITB
T DB151.DBB0 => Jahr in BCD 00 89

gemacht wird?

Ich mache es bei mir so :
Code:
L Jahr_INT
L 1990
-I
ITB
T DB1.DBB0   // oder so

ach ja, und bei mir ist es dann nicht 2018 in der CPU ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich mache es bei mir so :
Code:
L Jahr_INT
L 1990
-I
ITB
T DB1.DBB0   // oder so
ach ja, und bei mir ist es dann nicht 2018 in der CPU ...

Dann steht in deinem Jahr für 2008 eine 18, das heißt aber bei Siemens 2018.

@Larry

Hier mach ich das Umgekehrte, Zeit holen und als Char für einen Laser zum Schreiben vorbereiten:

Code:
      CALL  "READ_CLK"
       RET_VAL:=#RetVal
       CDT    :=#Zeit

      CALL  "DT_DATE"
       IN     :=#Zeit
       RET_VAL:=#Datum

//Jahr in Stringword wandeln
      L     0
      T     #Charvars.Jahr

      L     P##Zeit
      LAR1  

      L     B [AR1,P#0.0]               //Jahr
      T     #HM_Char2

      BTI   
      T     #Jahr_Int                   //für Plausibilitätskontrolle

      L     #HM_Char2
      SRW   4
      L     W#16#30
      +I    
      SLW   8
      T     #HM_Char1

      L     #HM_Char2
      SLW   12
      SRW   12
      L     W#16#30
      +I    
      T     #HM_Char2

      L     #Charvars.Jahr
      L     #HM_Char1
      OW    
      L     #HM_Char2
      OW    
      T     #Charvars.Jahr
Das funzt definitiv.
 
Zuletzt bearbeitet:
Bytes Inhalt Bereich
0 Jahr 90 ... 89, d.h. die Jahre 1990 bis 2089

@Ralle:
Das ist jetzt nicht aus der Hüfte geschossen gewesen ... Bei mir laufen etliche Automaten auf diese Weise mi der Server-Zeit. Abgesehen davon besagt der Auszug aus der Hilfe, die du zitiert hast auch nichts anderes ...

@Kai:
dein Beipiel arbeitet ja schon mit einem zweistelligen Wert für die Jahres Zahl. Dabei bleibt "08" natürlich "08". Was sagt denn deine CPU-Zeit dazu (Zielsystem - Diagnose - Uhrzeit stellen) ?

Gruß
LL
 
Zuletzt bearbeitet:
@Ralle:
Das ist jetzt nicht aus der Hüfte geschossen gewesen ... Bei mir laufen etliche Automaten auf diese Weise mi der Server-Zeit. Abgesehen davon besagt der Auszug aus der Hilfe, die du zitiert hast auch nichts anderes ...

@Kai:
dein Beipiel arbeitet ja schon mit einem zweistelligen Wert für die Jahres Zahl. Dabei bleibt "08" natürlich "08". Was sagt denn deine CPU-Zeit dazu (Zielsystem - Diagnose - Uhrzeit stellen) ?

Gruß
LL

Sieh noch mal mein eingefügtes Beispiel eins weiter oben. Wenn ich die Zeit hole aus der CPU und du Recht hast, würde mein Laser "18" lasern statt "08", das macht er definitiv nicht!
 
Zurück
Oben