-Menü

Beiträge anzeigen

Dieser Abschnitt erlaubt es Ihnen, alle Beiträge anzusehen, die von diesem Mitglied geschrieben wurden. Beachten Sie, dass Sie nur Beiträge sehen können, die in Teilen des Forums geschrieben wurden, auf die Sie aktuell Zugriff haben.

Beiträge anzeigen-Menü

Beiträge - D-Platoon

#1
Sorry, hab einige Tage nicht hier rein geschaut.
Aber mattsches hat die Lösung, welche ich auch benutzt hab.
Dann gibt es nur noch zwei Tage im Jahr, an denen die Berechnung um eine Stunde nicht stimmt. Und das sind dann die Tage der Zeitumstellung. Da um Mitternacht berechnet wird und die Zeitumstellung erst später erfolgt, wird dies nicht mehr berücksichtigt.
Das hab ich durch folgenden Code in Zeile 22..24 angepasst:
IF dtemp <> last_day OR XCAL.DST_ON <> bDSTOn THEN
last_day := dtemp;
bDSTOn := XCAL.DST_ON;
#2
Auch wenn das Thema schon fast 10 Jahre alt ist, habe ich soeben auch einen Bug entdeckt:
Es steht da in Zeile 32 folgendes
sun(latitude := XCAL.LATITUDE, longitude := xcal.LONGITUDE, utc := DT_TO_DATE(xcal.UTC), H := H);

Der Programmcode wird beim Tageswechsel ausgeführt. Da wir ja aber hier in Deutschland den neuen Tag früher beginnen als UTC, werden die Werte vom Vortag berechnet. Wir hinken also immer um einen Tag hinterher.

Ich hab das bei mir schon geändert. Wäre aber auf jeden Fall auch ein Thema für ein nächstes Release. Dabei die Frage: ist da in absehbarer Zeit was geplant?
#3
Hallo NightWatcher!

Du hast dir die Frage schon selbst beantwortet: Dies liegt zum Einen am Umkehrspiel des Motors/Getriebes und zum Anderen, dass es eben keine geregelten sondern gesteuerte Motoren sind. Will heißen, dass sie für AUF länger brauchen als für AB.

Klar könnte man das Softwaretechnisch lösen, aber das wäre ein extremer Aufwand. Ich hatte mir das mal bei einem (geschäftlichen) Projekt überlegt und es dann gelassen.
So extrem heilig sind mir die Positionen dann doch nicht - auf 2cm kommts mir nicht drauf an.
#4
Ich verstehe das Problem zwar auch nicht ganz, aber macht es nicht Sinn, wenn man verschiedene Positionen anfahren will, den Baustein Blind_Scene zu verwenden?
#6
oscat.lib fuer Step 7 / Re: SCL und ST
12. November 2012, 08:46:20
Hab ich jetzt zwar noch nie so gemacht, aber ich würde dazu tendieren, den ST-Code in *.awl abzuspeichern und dann in der S7 als externe Quelle einzulesen.
Alternativ eben per Copy/Paste.
#7
oscat.lib fuer Step 7 / Laufzeit ONTIME
12. November 2012, 08:43:43
Hallo Leute,

ich will den Baustein Ontime für Langzeittests verwenden. Darunter soll auch ein 1500h-Test (62,5 Tage) sein. Das erstreckt sich ja dann über die Zeitdauer von 49 Tagen, die der interne Timer der SPS erreichen kann.
Nun meine Frage: Kann Ontime damit sauber umgehen? Also werden die Betriebsstunden auch noch richtig berechnet, wenn der SPS-Timer wieder von vorne beginnt?

Es wurde zwar schonmal in http://www.oscat.de/community/index.php/topic,538.0.html angerissen, ich wollte aber nochmals sicher gehen!

Grüße,
Thomas
#8
Keiner der ne Antwort parat hat?
#9
Hallo,

in die selbe Kerbe muss ich auch schlagen. :(
Ich frage mich gerade auch welche Bibliothek ich nehmen muss.
Besitze einen Beckhoff CX9000 mit TwinCat 2.11.
Passt da die für CoDeSys3?
#10
Hi Peter!

That should be very easy to do with the Module "Click_Mode". On Single-Klick you send the signal only to one roll and with TP_Long you can start all the other rolls.
Of course you have to programm this for every direction.

Thomas
#11
Freut mich, dass meine Mühen anklang finden :)

Wenns weiter nix ist :D

Probier mal folgenden Abänderung des Bausteins:

Die Variablen:

FUNCTION_BLOCK ROL_AUTO_NACHT
VAR_INPUT
UP, DN : BOOL;
S_IN : BYTE;
PI : BYTE;
E_NIGHT : BOOL := TRUE;
E_DAY : BOOL := TRUE;
DTIN : DT;
Lokalzeit: DT;
SUNRISE, SUNSET : TOD;
deadline_night, deadline_day : TOD;
sunrise_offset : TIME := T#5ms;
sunset_offset : TIME := T#5ms;
e_deadline_night, e_deadline_day : BOOL;
POS_Vortag : BOOL;
END_VAR
VAR_INPUT CONSTANT
night_position : BYTE := 0;
day_position : BYTE := 255;
END_VAR
VAR_OUTPUT
QU, QD : BOOL;
STATUS : BYTE;
PO : BYTE;
END_VAR
VAR
night : BOOL;
day : BOOL;
last_night : DATE := D#2010-01-01;
last_day : DATE := D#2010-01-01;
END_VAR

(*
version 1.2 6 oct 2007
programmer hugo
tested by tobias

version 1.5 10 jun 2010
programmer d-platoon
tested by d-platoon

version 1.6 30 jun 2010
programmer d-platoon
tested by ---

*)


Und den Code:

IF NOT (up AND dn) AND night THEN
(* manual operation at night will cancel operation for one night *)
night := FALSE;
ELSIF NOT (up AND dn) AND day THEN
(* manual operation at day will cancel operation for one day*)
day := FALSE;
ELSIF (((DT_TO_TOD(dtin) > sunset + sunset_offset) AND e_night) OR ((DT_TO_TOD(Lokalzeit) > deadline_night) AND e_deadline_night)) AND (last_night < DT_TO_DATE(dtin)) AND NOT night THEN
(* enable night *)
night := TRUE;
day := FALSE;
last_night := DT_TO_DATE(dtin);
ELSIF (((DT_TO_TOD(dtin) > sunrise + sunrise_offset) AND e_day) OR ((DT_TO_TOD(Lokalzeit) > deadline_day) AND e_deadline_day)) AND (last_day < DT_TO_DATE(dtin)) AND (last_night < DT_TO_DATE(dtin)) THEN
(* disable night *)
night := FALSE;
day := TRUE;
last_day := DT_TO_DATE(dtin);
END_IF;

(* shade at night only in auto mode and enable = true *)
IF UP AND DN AND night THEN
status := 141;
po := night_position;

ELSIF UP AND DN AND day AND NOT POS_Vortag THEN
status := 142;
po := day_position;

ELSIF UP AND DN AND day AND POS_Vortag THEN
status := 143;
po := pi;

ELSE
QU := UP;
QD := DN;
po := pi;
status := s_in;
END_IF;


(* revision history
hm 29. sep 2007 rev 1.0
original version

hm 5. oct 2007 rev 1.1
added enable input

hm 6. oct 2007 rev 1.2
added pos and angle inputs and outputs
night position and angle can now be configured
any manual operation at night will cancel night operation

ts 10. jun 2010 rev 1.5
disabled angle inputs and outputs
deadlines added, dayposition added

ts 30. jun 2010 rev 1.6
POS_Vortag added

*)


Das ist aber ohne Gewähr! Ich hab das gerade kurz zusammengestupft und rein Gedanklich sollte es auch funktionieren. Probieren konnte ich es noch nicht. Teste es einfach mal und berichte mir dann.
Ach ja: Einschalten kannst du das per TRUE auf die Variable POS_Vortag.
Ansonsten kannst du ja mit der Setup-Variable day_position (voreingestellt auf 255, also ganz oben) eine beliebige Position vorgeben, auf die er bei Tagesanbruch fahren soll.

Gruß
Thomas
#12
Klar kann ich das! ;)

Da fällt mir wieder ein: Eigentlich wollte ich mal ne Doku zu meinen angepassten Bausteinen machen...  :o

Naja dann halt mal hier im Schnelldurchlauf:

Im Anhang hab ich dir den Baustein, wie er im CFC aussieht.

Bei Lokalzeit wird die Lokalzeit eingegeben. Diese werden nachher für die Deadlines gebraucht, die sich ja nicht nach der UTC, sondern nach der aktuellen Zeit richten soll.
Deadline_Night und Deadline_Day sind die Zeiten, zu denen die Rollos spätestens rauf bzw. runter fahren.
Bsp: Du gibst bei Deadline_Night 20:00 Uhr ein. Jetzt werden die Rollos bis zu dem Datum an der die errechnete Sonnenuntergangszeit früher ist entsprechend runtergefahren. Wenn im Sommer die Zeit später wird, dann sind sie spätestens um 20:00Uhr unten. Ist zum Beispiel sinnvoll bei Kinderzimmern, wo die Kids um acht ins Bett müssen ;) Gleiches gilt natürlich bei Deadline_Day!
E_Deadline_Day und E_Deadline_Night, ist einfach nur dazu da um die Funktion ein bzw. auszuschalten (E = enable).

Dann war mit dem Originalbaustein das Problem vorhanden, dass wenn der Rollo nach Zeit runtergegangen ist. Man ihn aber nochmals kurz manuell öffnen wollte (z.B. zum nochmals kurz lüften) und im Anschluss wieder schloss, dann ging er am nächsten Morgen nicht automatisch hoch, da er die letzte Position angefahren hatte, welche vom Eingang (z.B. BLIND_INPUT) gekommen ist. Nun fährt er automatisch die in der Setup_Variable angegebene Position an.

Ich glaube das wäre alles was ich geändert habe. Der Rest ist gleich, wie beim Originalbaustein.
Ach ja: Ich habe die Angle-Berechnung komplett rausgeschmissen, da ich hier bei mir nur Rollos habe. Wenn du diese brauchst müßtest du sie wieder einfügen. Notfalls kann ich dir dabei auch helfen...

Wenn noch Fragen sind, her damit!

Gruß
Thomas

[gelöscht durch Administrator]
#13
Ankündigungen / Announcements / Re:Referenzen
23. Juni 2010, 12:57:47
Ich habe die Oscat.lib zur Gebäudeautomation verwendet. Dort werden hauptsächlich Rollläden und Lichter gesteuert. Sie läuft auf einer Beckhoff CX9000.
Hat alles bisher bestens geklappt. Klasse ist auch das open source, so dass man die Bausteine eigenen Bedürfnissen anpassen kann, was ich auch schon des öfteren gemacht habe.
Im laufe der Zeit soll noch eine Heizungssteuerung realisiert werden.
#14
Hallo allerseits,

jetzt bin ich wieder daheim und kann euch hiermit den Code senden:

Erstmal die Variablen:
FUNCTION_BLOCK ROL_AUTO_NACHT
VAR_INPUT
UP, DN : BOOL;
S_IN : BYTE;
PI : BYTE;
E_NIGHT : BOOL := TRUE;
E_DAY : BOOL := TRUE;
DTIN : DT;
Lokalzeit: DT;
SUNRISE, SUNSET : TOD;
deadline_night, deadline_day : TOD;
sunrise_offset : TIME := T#5ms;
sunset_offset : TIME := T#5ms;
e_deadline_night, e_deadline_day : BOOL;
END_VAR
VAR_INPUT CONSTANT
night_position : BYTE := 0;
day_position : BYTE := 255;
END_VAR
VAR_OUTPUT
QU, QD : BOOL;
STATUS : BYTE;
PO : BYTE;
END_VAR
VAR
night : BOOL;
day : BOOL;
last_night : DATE := D#2010-01-01;
last_day : DATE := D#2010-01-01;
END_VAR


Und hier den Code:
IF NOT (up AND dn) AND night THEN
(* manual operation at night will cancel operation for one night *)
night := FALSE;
ELSIF NOT (up AND dn) AND day THEN
(* manual operation at day will cancel operation for one day*)
day := FALSE;
ELSIF (((DT_TO_TOD(dtin) > sunset + sunset_offset) AND e_night) OR ((DT_TO_TOD(Lokalzeit) > deadline_night) AND e_deadline_night)) AND (last_night < DT_TO_DATE(dtin)) AND NOT night THEN
(* enable night *)
night := TRUE;
day := FALSE;
last_night := DT_TO_DATE(dtin);
ELSIF (((DT_TO_TOD(dtin) > sunrise + sunrise_offset) AND e_day) OR ((DT_TO_TOD(Lokalzeit) > deadline_day) AND e_deadline_day)) AND (last_day < DT_TO_DATE(dtin)) AND (last_night < DT_TO_DATE(dtin)) THEN
(* disable night *)
night := FALSE;
day := TRUE;
last_day := DT_TO_DATE(dtin);
END_IF;

(* shade at night only in auto mode and enable = true *)
IF UP AND DN AND night THEN
status := 141;
po := night_position;

ELSIF UP AND DN AND day THEN
status := 142;
po := day_position;

ELSE
QU := UP;
QD := DN;
po := pi;
status := s_in;
END_IF;


Bei Fragen einfach an mich! ;)
#15
Nein, ich habe den Baustein einfach mit beiden Zeiten versorgt: UTC und Lokalzeit.
Hab den Code auch schon fertig und er funktioniert auch einwandfrei, aber da ich momentan in Südamerika bin, habe ich keine Möglichkeit den zu posten. Das hole ich nach, wenn ich wieder zu Hause am Programmierrechner bin.