Step 7 Wochenzeitschaltuhr mit Step 7

danny011079

Level-2
Beiträge
54
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich habe folgendes Problem.
Teile meiner Hausinstallation laufen über die S7-300 mit der CPU 314, so auch die Rolladensteuerung.Nun habe ich mich gefragt ob man eine Zeitschaltuhr als Programm oder Baustein einbauen könnte, so das
die Rolläden zu einer bestimmten Uhrzeit geschlossen werden und zu einer bestimmten Uhrzeit wieder öfffnen.
Ich hoffe ihr könnt mir helfen.
Vielen Dank schonmal im Vorraus.

Gruß
danny
 
Möglich ist das durchaus, willst du selber programmieren oder etwas fertiges verwenden?
Etwas fertiges gibt es von Siemens:
https://support.industry.siemens.com/cs/ww/de/view/21669756

Was aber für einen Anfänger vermutlich nicht ganz so einfach zu verwenden ist.

Wenn du selber programmieren und auch noch etwas dabei lernen willst, dann kannst du das auch selber programmieren. Dazu die Uhrzeit der CPU mit den entsprechenden SFC auslesen, daraus Wochentag, Stunde und Minute extrahieren. Dann kannst du einen Vergleicher machen auf deine eingestellte Zeit, und wenn der Zeitpunkt erreicht ist dann löst du eine Aktion aus / setzt ein Bit zum Starten usw.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Vielen Dank für die schnelle Antwort,
das selbst programmieren würde mich s hon eher interessieren
leider habe ich nicht die herausragende Erfahrung.
Könnte ich da vielleicht noch ein bisschen mehr Anleitungen bekommen
Gruß
danny
 
Da würde ich vorschlagen, dass du dir den aktuellen Wochentag sowie die Stunde und Minute (ggf. auch Sekunde) der Uhrzeit erst einmal in drei Integer-Variablen ablegst. Dann kannst du später deine Zeitschaltuhr relativ einfach mit ein paar Vergleichern auch in KOP/FUP aufbauen.

Um die Uhrzeit der CPU auszulesen benötigst du die Systemfunktion SFC1 READ_CLK. Diese SFC kannst du aus der Standard Library unter "System Function Blocks" in dein Programm ziehen.
Diese gibt dir eine Variable vom Typ DATE_AND_TIME zurück. In dieser sind wie der Name schon vermuten lässt, das Datum und die Uhrzeit kombiniert vorhanden. Da musst du dich um den Aufbau dieses Datentyps informieren und wie du an die Bestandteile kommst. In der Variable ist auch schon ein Wert für den aktuellen Wochentag vorhanden, du benötigst also keine eigene Kalenderfunktion welche dir aus dem Datum den Wochentag berechnet, das ist schon fertig vorhanden.
 
Danke für die Antwort
Ich stehe aber leider immer noch aufm Schlauch :)
Könntest du mir vielleicht ein Beispiel in FUP geben
Gruß
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das Zerlegen der DATE_AND_TIME Variable lässt sich leider nicht in FUP realisieren, bzw. wenn dann nur sehr umständlich.

Hier mal eine einfache Funktion welche die aktuelle CPU Zeit ausliest und als Integer-Werte am Ausgang zur Verfügung stellt.
Code:
FUNCTION "ZeitwerteLesen" : VOID
TITLE =Zeitwerte lesen
VERSION : 0.1


VAR_OUTPUT
  Jahr : INT ;	//SPS-Zeit Jahr (18 für 2018)
  Monat : INT ;	//SPS-Zeit Monat
  Tag : INT ;	//SPS-Zeit Tag
  Stunde : INT ;	//SPS-Zeit Stunde
  Minute : INT ;	//SPS-Zeit Minute
  Sekunde : INT ;	//SPS-Zeit Sekunde
  Wochentag : INT ;	//SPS-Zeit Wochentag (1=So, 2=Mo, 3=Di, ...)
END_VAR
VAR_TEMP
  zeit : DATE_AND_TIME ;	
  read_clk_Ret : INT ;	
END_VAR
BEGIN
NETWORK
TITLE =Uhrzeit SPS auslesen

      CALL "READ_CLK" (
           RET_VAL                  := #read_clk_Ret,
           CDT                      := #zeit);
      NOP   0; 
NETWORK
TITLE =Date-And-Time in Einzelelemente zerlegen

      LAR1  P##zeit; 

      L     LB [AR1,P#0.0]; 
      BTI   ; 
      T     #Jahr; 

      L     LB [AR1,P#1.0]; 
      BTI   ; 
      T     #Monat; 

      L     LB [AR1,P#2.0]; 
      BTI   ; 
      T     #Tag; 

      L     LB [AR1,P#3.0]; 
      BTI   ; 
      T     #Stunde; 

      L     LB [AR1,P#4.0]; 
      BTI   ; 
      T     #Minute; 

      L     LB [AR1,P#5.0]; 
      BTI   ; 
      T     #Sekunde; 

      L     LB [AR1,P#7.0]; 
      L     7; // Wochentag ausmaskieren
      UW    ; 
      BTI   ; 
      T     #Wochentag; 

      SET   ; 
      SAVE  ; 
END_FUNCTION

Die SPS Uhrzeit besitzt keine Sommer- und Winterzeitumstellung. Also du müsstest entweder deine Uhrzeit zweimal im Jahr stellen, oder entsprechende Funktionen zur Umrechnung verwenden. Da gibt es von Siemens auch was fertiges.
 
Eines darf man auch nicht vergessen:

Die CPU-Uhr bei den 300er SPS ist nicht gerade sehr genau. Ich habe da schon Abweichungen von 20 Minuten in nur ein paar Monaten gesehen. :shock:
 
Um den Code von mir oben zu verwenden, fügst du im Simatic Manager im Programmordner unter "Quellen" eine neue AWL-Quelle ein, öffnest diese und fügst den Code komplett ein.
Dann gehst du in die Symboltabelle, und legst ein Symbol für den Namen "ZeitwerteLesen" an, als Adresse muss es eine FC Nummer sein die du bisher noch nicht verwendet hast (z.B. FC100).

Und wenn du schon in der Symboltabelle bist, dann suchst du dir einen freien Merkerbereich, und legst dort entsprechende Symbole für "Jahr", "Monat" usw. an. Für "Jahr könnte das z.B. MW100 sein, für "Monat" MW102 usw. Als Datentyp stellst du für alle den Typ "INT" ein. Wenn du mit Datenbausteinen vertraut bis, dann kannst du auch alles in einem entsprechenden DB ablegen.

Dann öffnest du die AWL-Quelle mit meiner Funktion und übersetzt diese. Dann sollte der entsprechende FC in deinem Offline-Programmordner vorhanden sein.
Diesen FC rufst du in einer Stelle deines Programmes auf, und beschaltest die Ausgänge mit den Variablen aus dem Merkerbereich.

Jetzt kannst du im Programm z.B. eine Aktion zu einem bestimmten Zeitpunkt anstoßen, wenn du eine UND-Verknüpfung mit den entsprechenden Zeitvariablen machst.
Soll eine Aktion z.B. Montags um 10:25 ausgelöst werden, dann wäre das ein UND-Verknüpfung auf "Wochentag" == 2 UND "Stunde" == 10 UND "Minute" == 25". Diese Bedingung ist dann jeden Montag genau eine Minute lang wahr.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Vielen Dank für die Antwort,

habe das jetzt so gemacht wie du geschrieben hast
allerdings gab es nun Probleme nach dem übersetzen

"Variable READ CLK passt weder zu einer Deklaration noch ist READ CLK in der Symboltabelle"

und
"ungültige Operation für RET VAL "

kannst du mir da weiter helfen
 
Schreib mal in der AWL-Quelle anstelle von:
CALL "READ_CLK"
ein:
CALL SFC1

Oder du kannst auch in der Symboltabelle als Symbol für READ_CLK die Adresse SFC 1 eintragen.
 
Dankeschön ich werde es mal versuchen :)
Muss ich den SFC 1 dann auch im OB 1 aufrufen?
Und beim SFC1 da wo die,??? Sind welche Werte trage ich dort ein
 
Zuviel Werbung?
-> Hier kostenlos registrieren
In dem Programmcode des FC den ich oben gepostet habe, wird der SFC1 fertig aufgerufen. Wenn du diesen Baustein übersetzt hast dann musst also nur noch diesen FC den ich dir gepostet habe selber in deinem Programm aufrufen, die Ausgangsparameter wie ich dir geschrieben habe mit entsprechenden Variablen beschalten (Merkerworte oder Datenbausteinvariablen), und dann hast du im Programm die Uhrzeit zur Verfügung und kann diese auswerten.

Im Anhang ein Screenshot wie du diese Funktion in FUP aufrufen kannst (Symbole für Jahr usw. muss du selber in der Symboltabelle anlegen.
Und ein Vergleicher auf die Uhrzeit, M160.0 wäre dann eine Minute lang auf true.
 

Anhänge

  • Uhrzeit1.png
    Uhrzeit1.png
    11,9 KB · Aufrufe: 62
  • Uhrzeit2.png
    Uhrzeit2.png
    9,1 KB · Aufrufe: 59
M160.0 ist bei den im Screenshot sichtbaren Adressen natürlich eine ungünstige Adresse, weil sie im Bereich der Zeitdaten liegt. Hatte ich eben nur für den Screenshot schnell eingetippt, also darauf achten dass du keine Adressüberschneidungen hast.
 
So hab jetzt in der AWL Quelle alle Fehler bis auf einen Weg und zwar
In dem Bereich "Uhrzeit Sps auslesen"


Call "READ_CLK"
RET_VAL---= READ_CLOCK (hier soll der Fehler sein)

"Die Variable READ_CLK passt weder zu einer Deklaration noch ist READ_CLOCK in der Symvoltabelle"


Ich hoffe du kannst mir weiterhelfen
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also ich weiß nicht was du da gemacht hast, wenn du in der AWL-Quelle CALL SFC1 schreibst dann sollte es auf jeden Fall übersetzbar sein.

Also:
Code:
      CALL SFC1 (
           RET_VAL                  := #read_clk_Ret,
           CDT                      := #zeit);
      NOP   0;
Was hast du denn für eine Software, Step7 v5.5 / 5.6?
 
Hallo Thomas
die Übersetzung und das Programm laufen jetzt :)
Vielen Dank für deine Hilfe :)
Noch eine Frage
Warum wird der Wochentag Montag mit 2 bezeichnet es müsste doch normal 1 sein
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Weil beim Datentyp "DATE_AND_TIME" 1 = Sonntag festgelegt ist. siehe Step7-Hilfe zum Datentyp DATE_AND_TIME, schnell aufrufbar indem Du bei Deiner DATE_AND_TIME-Variable das "Date_And_Time" (in der Spalte Datentyp) markierst und F1 drückst.

Harald
 
Zurück
Oben