Funktion nur einmal täglich ausführen

Android_Garden

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

ich wurde gerne für meine wago-sps eine Funktion einbauen die mir die tagesaktuellen Sonnenaufgangs/untergangszeiten berechnet. Zur Berechnung habe ich einen Baustein aus der OSCAT-Basic library. Wie kann ich jetzt in codesys (hab bislang mit FUP und ein kleines bisschen mit ST gebastelt).

Gruß
 
Hallo zusammen,

ich wurde gerne für meine wago-sps eine Funktion einbauen die mir die tagesaktuellen Sonnenaufgangs/untergangszeiten berechnet. Zur Berechnung habe ich einen Baustein aus der OSCAT-Basic library. Wie kann ich jetzt in codesys (hab bislang mit FUP und ein kleines bisschen mit ST gebastelt).

Gruß

Welche Version der oscat.lib?
Welche SPS hast du denn?

Was ist jetzt die eigentliche Frage?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
Ich habe eine wago 750-8202, wie oben bereits beschrieben setzte ich die oscat.lib basic v3.33 ein. Mit meiner wago realisiere ich gerade eine Hausautomation z.B. eine Rollo-Steuerung. Ich will das bei Sonnenuntergang die rollos runter fahren sollen dazu muss ich aber die Uhrzeit des Sonnenuntergangs berechnen lassen. In der doku von oscat heißt es nun bei dem Baustein zur Berechnung der Zeiten das dies nur einmal am Tag ausgeführt werden soll um CPU Leistung zu sparen. Nun ist meine Frage: wie kann ich es realisieren damit die Sonnenuntergangszeit nur einmal täglich berechnet wird. Gerade ist mir der Gedanke gekommen das ich das per if-clause in der plc_prg umsetzte. Also z.b. if Uhrzeit 3:00 dann starte Programm. Ist das so möglich?
 
Klar geht das so, aber um es wirklich nur einmal auszuführen, muss noch eine Können Auswertung mit rein.
Auf der anderen Seite hast du eine sehr fixe CPU. Ob es sich da lohnt, das bisschen rechnerei zu sparen?

Gruß Otwin
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Muß dieses "nur einmal am Tag" zu einer bestimmten Uhrzeit stattfinden?
Ich würde mir merken, an welchem Tag (vom Datum) ich die Funktion zuletzt ausgeführt habe, etwa so:
Code:
heute := Tag(Uhrzeit)
WENN zuletzt_ausgeführt <> heute UND Uhrzeit >= geplante_Uhrzeit DANN
  zuletzt_ausgeführt := heute
  tue_was...
ENDE_WENN

Harald
 
Bei nur einmal am Tag sollten die Ergebnisse allerdings remanent sein, sonst hat man nach Programmänderungen für einen Tag keine Werte mehr.

Wie wäre es mit einem eigenen Task im zB. 10 Minuten Takt?

Otwin
 
Hmm einen task kann ich ja über die taskstplanung in der Steuerungskonfig einstellen und den dann alle, ich sag mal 6h, ausführen lassen. So oft ändert sich ja die Sonnenuntergangszeit nicht am Tag :D

Allerdings würde mich noch interessieren wie genau das mit der Flanken-Auswertung gemeint ist?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn du das Programm um 3:00 ausführst, dann wird es ja ausgeführt, solange es 3:00 ist. Also eine Minute lang.
Wenn du es aber wirklich nur einmal ausführen willst, dann musst du nach dem Vergleich der Uhrzeit noch eine Flankenauswertung basteln, damit es nur mit der steigenden (oder fallenden) Flanke ausgfürt wird. R-TRIG also.
Wenn deine Steuerung nur ein paar Rollos durch die Gegend fährt, würde ich mir wegen der CPU-Auslastung aber echt keine Gedanken machen, die langweilt sich ja sonst total :)

Die Lösung mit dem eigenen Task ist aber wohl das einfachste.

Die Zeit ändert sich freilich nicht so oft am Tag, aber mir ging es selber schon so, dass die CPU tagsüber mal in Stop geht beim Programmieren und dann hast du halt abends keine Sonnenuntergangszeit, wenn du die Funktion nur um 3:00 aufrufst.
Deswegen vieleicht nicht allzu geizig mit der CPU-Zeit sein :)

Gruß
Otwin
 
Hallo Android_Garden
Ich würde mich an PN seinen Code halten, nur die Uhrzeit rausnehmen.
Damit hast du keine Probleme mit der Remanenz von Variablen. Beim Starten der PLC ist "zuletzt_ausgeführt" = 0 und damit auf alle Fälle <> heute. Damit wird der Programmteil nach dem starten auf alle Fälle einmal ausgeführt. Ob das Programm um 0:00,01 Uhr oder um 3:00 Uhr ausgeführt wird, ist völlig egal, da der Sonnenstand sich nur auf das Datum bezieht und nicht auf die Uhrzeit der Berechnung.
Grüsse Holger

Code:
WENN zuletzt_ausgeführt <> heute DANN   
zuletzt_ausgeführt := heute   
tue_was... 
ENDE_WENN
 
wenn die rolle runter geht dan errechnen wenn das ding hoch muss, und wenn die aktion hoch ist dann errechnen wenn die sonne aufgeht.
die berechnung ist lange also machen wenn die zeit genug ist.
in haus kein problem.
in oscat gibt es auch funktinen dazu siehe date (if date is changwd then do check)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

also ich nehme dafür den Timer_2 FB aus der Oscat Building.
der ist so konfigurierbar... (wie lange, an welchem WochenTag und auch ob er im Urlaub das auch tun soll)

Grüße
 

Anhänge

  • Timer2_OscatBuilding.jpg
    Timer2_OscatBuilding.jpg
    12,7 KB · Aufrufe: 29
Ich habe es zum laufen gebracht und muss sagen es war dann eigentlich doch einfacher als gedacht :D
Ich habe einfache eine IF-Abfrage in die PLC_PRG eingebaut

hier mal der Code:
Code:
IF SunRiseSet_LasCalc <> DATUM THEN
    SunRiseSet_LasCalc:= DATUM;
    RunCount:=RunCount + 1;
    SunRiseSet;
END_IF;

Jetzt habe ich nur noch das Problem das die errechnete Sonnenuntergangszeit nicht von meinem Timer_2 aus der OSCAT-Lib übernommen wird.
Ich lasse die Zeit in eine Variable schreiben und dann lass ich diese Variable in den Timer_2 laufen. Aber zu der Uhrzeit tut sich beim Timer nichts.
 
Zurück
Oben