Abschaltuhr!!!

dr.schnaggels

Level-1
Beiträge
5
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen!
Ich habe folgendes Problem:
Ich baue einen Prüfstand, der irgendwann mal völlig autonom laufen soll.
Es ist so angedacht, dass es die Möglichkeit geben soll die Uhrzeit zu der der Prüfstand abschalten soll über ein TP277 einzugeben. Ich hab jetzt schon das forum durchforstet und auch viele interessante Beiträge gefunden, da ich allerdings so gut wie keine Erfahrung mit dem Programieren habe hat mir das nichts gebracht. Vielleicht kann mir jemand mit einer AWL in Zusammenhang mit dem DB helfen.
Als CPU habe ich eine 314c PTP.

Danke schon mal
 
Zuviel Werbung?
-> Hier kostenlos registrieren
naja:

lese mit der SFC1 "read systemclock" die Systemzeit aus und mit FC? "DT to TOD" die aktuelle Zeit aus dem ergebnis von sfc1, und schreibst sie in ein double. Das double muss undefiniert sein!!!

am panel eine variable mit anzeigeformat "uhrzeit" und dem format "time of day"

dann kannst du DINT vergleichen und ein zeitfenster erstellen.

ich weiss ist nix schön, funzt aber tadellos.

wenns´d willst schick ich dir am montag was, vorher hab ich nix, da wochenende.

viel erfolg
 
jetzt werden viele denken:

1. wie sieht dein ansatz aus?
2. wo ist deine eigeninitiative?
quote]

Guten Morgen!!!

Mein Ansatz war denk ich etwas zu naiv, wenn ich mir die Unten aufgeführten Beispiele anschaue.
Meine Idee war:
Einen DB mit einem Block Cpu zeit (Date and Time)
einen Block Eingabe zeit ( Date and Time)
Die Cpu zeit wollte ich dann über den SFC 1 auslesen (ich scheitere schon daran)
Die Abschaltzeit wollte ich einfach über ein Eingabefeld in den DB eintragen (das funktioniert auch)
Dann wollte ich die beiden DB-Blöcke mit einander vergleichen und als Ergebniss einen Merker setzen.

Wenn ich mir da die Beispiel anschaue verstehe ich mal echt gar nichts mehr. Ist das echt so komplitziert???

Danke
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo!

Mit meinem begrenzten Wissen:

mit dem Vergleichen scheitert es, du kannst als längstens DINT also 8 byte vergleichen, die Ausgaben der sfc1 im Format "date and time" sind aber 2 x double lang, das musst du zerlegen damit du es vergleichen kannst, und danach wieder zusammen bauen = Mühsam.
Drum mach ich es so wie ich es eben mache (wie oben beschrieben).

Ich schreibe aus der sfc1 (read system clock) in einen db (Bild 1 und 2)
Mit der fc8 (dt to tod - Bild 3) zerlege ich das dt in ein in der Symblik NICHT definiertes (drum kein DB) Merkerdouble.
Bild 4: Wenn du es als DINT definierst, kann fc8 nicht reinschreiben, wenn du es als DWORD definierst, kannst du es nicht mit DINT vergleichen, mit REAL geht sowie so nix! ---- wenn du es als TOD definierst, kannst du es ebenfalls nicht vergleichen!) = alles Mist.:confused:
drum: undefiniert, und vergleichen!
Die Zahlenwerte "Einschltzeit" und "Ausschatzeit" in meinem DB kommen vom Touchpanel (wie oben beschrieben (Darstellung Uhrzeit usw...)

die musst du auslesen, damit du eine Anfangs und Endzeit bekommst.
bei mir heisst das 5:45 und 14:10.

Also viel Erfolg!
 

Anhänge

  • db_zeit.jpg
    db_zeit.jpg
    115,7 KB · Aufrufe: 61
  • sfc1.png
    sfc1.png
    2,8 KB · Aufrufe: 70
  • dttotod.png
    dttotod.png
    3,2 KB · Aufrufe: 67
  • vgl.png
    vgl.png
    16,3 KB · Aufrufe: 73
Zuletzt bearbeitet:
OK das mit dem Uhr auslesen funktioniert,denke ich mal.
Vielen Dank mal für die bisherige Hilfe!!!!!!

Eine Frage habe ich aber noch:

der FC8 (dt to tod) nehme ich mal an wird ein parametrierbarer Baustein sein!?!
Kannst du mir sagen wie die Funktion im inneren aussieht ? Wir grübeln da gerade zu zweit darüber und kommen nicht darauf.

Danke
 
... der genannte Baustein ist kein Hexenwerk - den kann man auch einfach selbst erstellen.
Das Datenformat DT beinhaltet in BCD-Werten das Datum und die Uhrzeit des Systems. Den genauen Aufbau kannst du in der Step7-Hilfe nachsehen.
Die Funktion des Bausteins ist so, dass die entsprechenden Stellen ausgelesen und in INT-Werte umgewandelt werden und dann entsprechend ihrer Wertigkeit zu dem TOD zusammen-multipliziert werden (TOD ist die Zeít in Millisekunden, die seit 0:00 Uhr vergangen ist).

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo!

Anbei der Code des FC8 von Siemens

Code:
      TAR1  #d_ar1_ret                  // AR1-Register retten    
      SET   
      SAVE                              // BIE := 1
      L     P##IN                       //DT zeiger (db_nr)
      LAR1  
      L     W [AR1,P#0.0]               //db_nr laden
      T     #w_db_nr
      AUF   DB [#w_db_nr]
      L     D [AR1,P#2.0]               //DT offset im db
      LAR1  
// Überprüfung des Akkus auf eine gültige BCD-Zahl
// ist notwendig weil CPU bei ungültigem BTI in Stopp geht
      L     D [AR1,P#3.0]
      T     #l_z_sp
      UD    DW#16#66666666              // sind die Bits 1 oder 2 der Tetrade gesetzt?
      PUSH  
      SPZ   next                        // wenn Bit 1 und 2 nicht gesetzt dann kein Fehler möglich
      SLD   1                           // es kann als Ergebnis des Bit 1 und/oder 2 gesetzt sein
      L     #l_z_sp
      UD                                // Ergebnismaske links schieben um herauszufinden ob das Bit 
      UD    DW#16#88888888              // zusätzlich gesetzt ist
      SPN   fehl                        // wenn ja, dann Fehler
      TAK                               // Maske aus Verundung 66666666 zurückholen 
      UD    DW#16#44444444
      SLD   1                           // Ergebnismaske schieben um herauszufinden ob Bit 3 gesetzt ist
      L     #l_z_sp
      UD                                // ist das Bit 3 auch gesetzt
      SPN   fehl                        // wenn ja, dann Fehler
next: L     B [AR1,P#7.0]               // letztes Nibble prüfen
      SRW   4
      L     9
      >I    
      SPB   fehl
      L     B [AR1,P#3.0]               //stunden
      BTI                               //*******
      L     L#3600000
      *D    
      T     #l_z_sp
      L     B [AR1,P#4.0]               //minuten 
      BTI                               //*******
      L     L#60000
      *D    
      L     #l_z_sp
      +D    
      T     #l_z_sp
      L     B [AR1,P#5.0]               //sekunden
      BTI                               //********
      L     L#1000
      *D    
      L     #l_z_sp
      +D    
      T     #l_z_sp
      L     W [AR1,P#6.0]               //millisekunden
      SRW   4                           //*************
      BTI   
      L     #l_z_sp
      +D    
      T     #RET_VAL
      SPA   ende
fehl: CLR                               // wenn keine BCD-Zahl dann BIE :=0
      SAVE  
ende: LAR1  #d_ar1_ret                  // AR1-Register laden
      BE

Wer damit was anfangen kann und will:confused::rolleyes:.
 
Hallo Kollegen,
Das passt hier zum Thema.
Ich möchte gerne über ein DB eine Einschaltzeit vorgeben:
Jahr = Byte
Monat= Byte
......
Meine HMI kann kein Siemens-Format DATE AND TIME

Diese möchte ich einem DATE AND TIME (DT) Format zuweisen und anschliesend mit der aktuellen Uhrezeit in der SPS vergleichen.

irgendwie klappt es nicht : Folgende Fehlermeldung erhalte ich von der CPU: siehe Anhang

FB2:
STAT: Einschaltzeit_Temp = Date_And_Time

LAR1 P##Einschaltzeit_Temp
TAR2
+AR1 // AKKU1 zur lokalen Adresse addieren

L #Einschaltzeit.Jahr
ITB
T DBB [AR1,P#0.0]
L #Einschaltzeit.Monat
ITB
T DBB [AR1,P#1.0]
L #Einschaltzeit.Tag
ITB
T DBB [AR1,P#2.0]
L #Einschaltzeit.Stunde
ITB
T DBB [AR1,P#3.0]
L #Einschaltzeit.Minute
ITB
T DBB [AR1,P#4.0]
L #Einschaltzeit.Sekunde
ITB
T DBB [AR1,P#5.0]
L #Einschaltzeit.Byte6
ITB
T DBB [AR1,P#6.0]
L #Einschaltzeit.Byte7
ITB
T DBB [AR1,P#7.0]

Vieln Dank für die Tipps im Voraus.
 

Anhänge

  • CPU_Fehler.JPG
    CPU_Fehler.JPG
    61,6 KB · Aufrufe: 20
@Immer_1:
nach meiner Meinung liegt der ausgewiesene Fehler ausserhalb des von dir geposteten Bereichs ...
Was kommt in deinem FB denn noch so ...?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
 LAR1 P##Einschaltzeit_Temp
TAR2 
+AR1 // AKKU1 zur lokalen Adresse addieren

um das mal festzuhalten, was du da machst - vielleicht ist das ja beabsichtigt ...

du lädst die adresse von einschaltzeit_temp in das adressregister 1, holst dir den wert vom adressregister 2 und addierst diesen als versatz auf AR1 ... welchen wert hat AR2?
 
Hallo
TAR2 // Adresse des Multiinstanz-DB in AKKU1 laden
//quasi mein Offset zu lokalen Adresse

ich habs auch ohne probiert, klappt trotzdem nicht.
 
Hallo
Der Hinweis hat mich auf eine Idee gebracht.

T DIB [AR1,P#0.0]

Ich hätte DIB statt DBB nehmen müssen. Der Fehler taucht nicht mehr auf.

Vielen Dank
 
Zurück
Oben