-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 - Majaestix

#1
Hallo erdbeerschaeler,

da hast Du Dir aber 'was vorgenommen!
Wenn ich das richtig sehe, sind die XBLIND Bausteine im aplpha - Stadium hängen geblieben, weil niemand sie fortentwickeln wollte. Soweit ich das erkennen konnte, sind sie vollständig neu "erschaffen" worden und haben wenig (sehr wenig) mit den Vorghängerbausteinen gemeinsam. Um diese Bausteine zum stabilen Laufen zu bringen ist m. E. noch sehr viel Arbeit nötig, plus das Schreiben der bisher nicht vorhandenen Doku.
Für meinen Teil habe ich die vorhandenen, "klassischen" Bausteine so ergänzt/umgeschrieben, dass es jetzt bei mir super läuft. Dazu gibt es hier im Forum eine Menge Hinweise/Code, wie man 'was besser machen kann.

Gruss

Rainer
#2
Hallo mattsches,

danke!

Interessiert mich auch.
Deinen Code guck ich mir am WE mal an.

Gruss

Majaestix
#3
Hallo linsenpago,

was hälst Du von:
(x + 1) * -1

Gruss

Majaestix
#4
Hallo linsenpago,

kannst Du Deinen Wert vor Übergabe an die Visu nicht mit -1 multiplizieren?

Gruss

Majaestix
#5
Hallo Eloboy,

Zitatgeht dein BLIND_DARK_2 Baustein auch mit BLIND_CONTROL_S?

Sollte er, da alle Blind-Bausteine nur über die ESR Stati voneinander abhängen. Allerdings kann ich das nicht zu 100% bestätigen, da ich selber den BLIND_CONTROL_S nicht benutze. Der BLIND_CONTROL läuft bei mir seit ein paar Wochen gut.

ZitatKann das sein der der BLIND_CONTROL_S Baustein den Status 123 benötigt um zu fahren?

Keine Ahnung, wie oben gesagt, den BLIND_CONTROL_S habe ich (noch) nicht im Einsatz.

Ein Problem habe ich noch mit meinem BLIND_DARK_2, da er nur exakt einmal bei Sunrise und exakt einmal bei Sunset gertriggert wird, dass das Senden eines neuen Impulses immer 24 h Wartezeit bedingt.
Will sagen, gab es einen manuellen Eingriff, wird erst der nächste Trigger (Sunset/Sundown) ausgewertet.

Gruss

Majaestix
#6
Hallo Zusammen,

ich suche für codesys 2 einen Rechteckgenerator, bei dem ich die Anzahl der erzeugten Impulse vorgeben kann.
In der Lib habe ich irgendwie nichts passendes gefunden.
Hat da jemand einen Tip für mich?

Danke im voraus.

Gruss

Majaestix
#7
Hallo Alex,

der BLIND_INPUT hat u. a. folgende Input-Variablen:


S1 : BOOL (Eingang AUF)
S2 : BOOL (Eingang AB)
IN : BOOL (Gesteuerter Betrieb wenn TRUE)
PI : BYTE (Position wenn IN = TRUE)
AI : BYTE (Winkel  wenn IN = TRUE)


Die Variable IN ist hier Dein Freund. Übergibst Du der beim Aufruf ein FALSE, dann kannst Du via S1 und/oder S2 die Rolladen manuelll steuern. Ich habe mal irgendwann die Doku zum BLIND_INPUT umgeschrieben. Vielleicht hilft Dir die ja weiter. Ich hänge sie mal hier rein:
Zitat
BLIND_INPUT dient als Taster Interface zur Bedienung von Jalousien.

Der Baustein unterstützt 3 Modi,
- Handbetrieb,
- Automatikbetrieb und
- gesteuerter Betrieb.

Handbetrieb:
IN = FALSE
Es werden die Eingänge S1 und S2 benutzt um die Ausgänge QU und QD zu steuern.

MANUAL_TIMEOUT
Nach welcher Ruhezeit = Zeit ohne Signal auf S1 oder S2 wechselt der Baustein selbständig in den Automatikbetrieb. Wird dieser Wert nicht spezifiziert so wird der Interne Vorgabewert von 1 Stunde verwendet.

Automatikbetrieb:
IN = TRUE
Die Ausgänge QU und QD werden beide auf TRUE = Automatik gesetzt.
Solange  IN = TRUE ist, hat der Automatikmodus mit den Werten von AI und PI Priorität 1.
Die Eingänge PI und AI werden auf die Ausgänge PO und AO geschaltet.
Zur Übernahme der Werte kann IN kurz gepulst werden, der Baustein steuert dann diese Werte für die Zeit MAX_RUNTIME an und schaltet dann wieder in den Automatikmodus.

Die Eingänge POS und ANG sind die Rückführungseingänge für die aktuelle Position der Jalousie. Diese Werte werden von dem Modul BLIND_CONTROL bereitgestellt.

Mit der SETUP Variable CLICK_MODE wird "Ein Klick Betrieb" festgelegt. Ein kurzer Tastendruck startet die Richtung Auf für S1 und Ab für S2 und ein zweiter kurzer Tastendruck beendet die entsprechende Richtung oder kehrt die Richtung um. Diese Einstellung ist für Rollladen mit langer Laufzeit sinnvoll, oder um mit einem kurzen Tastendruck in eine Endstellung zu fahren.

Wird der Tastendruck länger als die Setup Zeit CLICK_TIME so wird für diesen Tastendruck der CLICK Modus verlassen und die Jalousie fährt solange wie die Taste gedrückt bleibt im Handbetrieb. Ist ein Tastendruck kürzer als CLICK_TIME so, fährt die Jalousie weiter bis ein weiterer Klick die Fahrt beendet oder eine Endstellung erreicht wird. Der Vorgabewert für CLICK_TIME ist 500 Millisekunden und die Vorgabe für CLICK_MODE ist TRUE.

SINGLE_SWITCH = TRUE
Der Eingang S2 wird ignoriert und die gesamte Steuerung erfolgt nur über den Eingang S1. S1 schaltet dann abwechselnd QU und QD so dass durch aufeinander folgendes Drücken des Tasters S1 zwischen Auf und Ab Bewegung gewechselt wird. Der interne Vorgabewert ist FALSE = 2 Taster Konfiguration.

Wenn beide Setup Variablen CLICK_MODE und SINGLE_SWITCH gleichzeitig TRUE sind wird ein Tastbetrieb mit nur einem Taster an S1 ermöglicht. Mit der über MAX_RUNTIME eingestellten Zeit wird die Laufzeit begrenzt die durch einen einfachen Click gestartet wird aber nicht mit einem weiteren Click beendet wird. Der Wert von MAX_RUNTIME  ist mit T#60s vorbelegt und sollte solange sein, dass die Jalousie sicher aus jeder beliebigen Stellung die Endstellung erreichen kann.

Zwei Ausgänge D1 und D2 können benutzt werden um einen Doppelklick auf S1 oder S2 auszuwerten, wenn D1_TOGGLE/D2_TOOGLE = TRUE schaltet ein Doppelklick den entsprechenden Ausgang ein und ein weitere Doppelklick  wieder aus, ist D1_TOGGLE/D2_TOOGLE = FALSE, so wird mit jedem Doppelklick ein Impuls am entsprechenden Ausgang erzeugt.

Nach einem manuellen Fahrbefehl bleibt der Baustein für die Zeit MANUAL_TIMEOUT im Modus „Manual Standby“ (STATUS = 131), die manuell angefahrene Position wird also für diese Zeit beibehalten und auch die Automatikfunktionen aller nachgeschalteten Bausteine werden unterdrückt.

Durch einen langen (länger als CLICK_TIME) Druck auf beide Taster, kann der „Manual Standby“-Modus vorzeitig beendet und in den Automatikmodus zurückgekehrt werden.

Master Mode:
Mit der Variable MASTER_MODE = TRUE kann der Master Mode eingeschaltet werden. Im Master Modus wird verhindert das Winkel ANG und Position POS an die Ausgänge AO und PO im Standby Mode 130 übertragen werden. Blind Bausteine die zwischen die Input- und Control- Module geschaltet sind können die Stellung der Jalousie verändern und nach Beenden der Veränderung verharrt die Jalousie in der neuen Stellung(MASTER_MODE = FALSE).
Wird jedoch die Variable MASTER_MODE = TRUE gesetzt so wird sichergestellt das nach beenden eines automatischen Eingriffs durch nachgeschaltete Module der Blind Input wieder selbständig die alte Position anfährt. Wenn MASTER_MODE = FALSE wird im Status 130 POS und ANG auf die Ausgänge PO und AO übertragen. Ist MASTER_MODE = TRUE beleibt im STATUS 130 an den Ausgängen PO und AO der letzte gültige Wert erhalten und die Eingänge POS und ANG werden nicht übertragen. Das Modul BLIND_INPUT behält also die letzte gültige BLIND_INPUT Position.
Der Ausgang STATUS ist ESR kompatibel und gibt Statusmeldungen über
Zustandsänderungen aus.

Die Verwendung weiterer BLIND Module  ist optional  und dient dazu den
Funktionsumfang zu erweitern.  BLIND_INPUT und BLIND_CONTROL erge-
ben bereits eine vollwertige Jalousiesteuerung.

Einfacher wäre es wahrscheinlich noch mit dem BLIND_SET, dem kannst Du ein ENABLE übergeben und wenn der an der richtigen Stelle steht, hat er eine höhere Prio als z. B. DARK oder SHADE. Er hat halt den Vorteil, dass Du ihm schon eine bestimmte Position voreinstellen kannst.
Will also sagen, solange Du von Deinem Fenster ein OFFEN bekommst, enabelst Du BLIND_SET und der fährt dann Deine Rollade auf eine bestimmte Position.

Gruss

Majaestix
#8
Hallo Klaus,

ich habe mir mal ganz frech Deinen BLIND_DARK Baustein gekapert und ihn etwas modifiziert. Dabei habe ich dann auch gleich noch den XBLIND_NIGHT Baustein von Hugo zur Vorlage genommen. Jetzt reagiert der BLIND_DARK_2 auf einen Helligkeitssensor, prüft, ob Nacht ist und lässt die Eingabe von Positions- und Winkelangaben für Tag und Nacht zu. Ausserdem schleift er jetzt den Status und die Positionen der anderen Blind-Bausteine durch, ordnet sich also sauber in die Kette ein.

Die Variablen sehen wie folgt aus:

FUNCTION_BLOCK BLIND_DARK_2
(* abgeleitet von BLIND_NIGHT aus der Oscat -Lib at http://www.oscat.de *)

VAR_INPUT
UP : BOOL; (* Eingang AUF *)
DN : BOOL; (* Eingang AB *)
S_IN : BYTE; (* ESR kompatibler Status Eingang *)
PI : BYTE; (* Jalousiestellung im Automatikbetrieb *)
AI : BYTE; (* Lamellenwinkel im Automatikbetrieb *)
DARK_ENABLE : BOOL; (* Baustein aktiv *)
DAY_LIGHT : WORD; (* Helligkeit *)
END_VAR

VAR_IN_OUT
CX : CALENDAR; (* Kalenderdaten *)
END_VAR

VAR_INPUT CONSTANT
TWILIGHT : WORD; (* Aktivierungsschwelle *)
DARK_POSITION : BYTE; (* Position für Nachtschaltung *)
DARK_ANGLE : BYTE; (* Winkel für Nachtschaltung *)
LIGHT_POSITION : BYTE; (* Position für Tagschaltung *)
LIGHT_ANGLE : BYTE; (* Winkel für Tagschaltung *)
SWITCH_DEBOUNCE_TIME : TIME := T#90s; (* Verzoegerungszeit Lichterkennung *)
TIMEOUT : TIME := T#2m; (* force time for actions *)
END_VAR

VAR_OUTPUT
QU : BOOL; (* Motor auf Signal *)
QD : BOOL; (* Motor ab Signal *)
STATUS : BYTE; (* ESR kompatibler Status Ausgang *)
PO : BYTE; (* Aktuelle Jalousiestellung *)
AO : BYTE; (* Aktueller Lamellenwinkel *)
END_VAR

VAR
LIGHT_DEBOUNCE : DEBOUNCE; (* Enprellen Sonnenaufgang *)
DARK_DEBOUNCE : DEBOUNCE; (* Enprellen Sonnenuntergang *)
DAY_FLAG : BOOL := FALSE; (* ist Tag *)
NIGHT_FLAG : BOOL := FALSE; (* ist Nacht *)
TIMER : TOF_1; (* wie lange bleibt Tag/Nachschaltung aktiv*)
END_VAR


Hier folgt der Code:

(* Lichschwankungen / Bewoelkung ausgleichen *)

(* auf Tag pruefen *)
LIGHT_DEBOUNCE (IN := DAY_LIGHT > TWILIGHT (* Tageslicht > Lichtschewlle *)
AND NOT CX.NIGHT, (* Tageszeit liegt zwischen Sonnenauf- und Sonnenuntergang *)
TD := SWITCH_DEBOUNCE_TIME,
PM := TRUE, (* feuert genau 1x pro Zustandsaenderung*)
Q => DAY_FLAG);

(* auf Nacht pruefen *)
DARK_DEBOUNCE (IN := DAY_LIGHT < TWILIGHT (* Tageslicht < Lichtschewlle *)
AND CX.NIGHT, (* Tageszeit liegt zwischen Sonnenauf- und Sonnenuntergang *)
TD := SWITCH_DEBOUNCE_TIME,
PM := TRUE, (* feuert genau 1x pro Zustandsaenderung*)
Q => NIGHT_FLAG);

IF UP
AND DN (* Automatik aktiv *)
AND DARK_ENABLE THEN

IF NIGHT_FLAG = TRUE THEN
status := 101; (* Status 101, manuelle Steuerung aktiv, Sonnenuntergang Position *)
END_IF;

IF DAY_FLAG = TRUE THEN
status := 102; (* Status 102, manuelle Steuerung aktiv, Sonnenaufgang Position *)
END_IF;

TIMER (IN := DAY_FLAG OR NIGHT_FLAG,
PT := TIMEOUT);

ELSE

TIMER (IN := FALSE);

END_IF;

CASE STATUS OF

0: (* power up init *)
STATUS := 100;

100: (* standby *)
;

101: (* sunset position *)
IF NIGHT_FLAG = TRUE THEN
po := DARK_POSITION;
ao := DARK_ANGLE;
END_IF;
IF NOT timer.Q THEN
STATUS := 100;
NIGHT_FLAG := FALSE;
END_IF;

102: (* sunrise position *)
IF DAY_FLAG THEN
po := LIGHT_POSITION;
ao := LIGHT_ANGLE;
END_IF;
IF NOT timer.Q THEN
STATUS := 100;
DAY_FLAG := FALSE;
END_IF;

END_CASE;

QU := UP;
QD := DN;


Den Baustein habe ich auch nochmal drangehängt.

Also, vielen Dank für Deine Vorlage.

Gruss

Majaestix


[gelöscht durch Administrator]
#9
Hallo Alex,

das hängt von der Reihenfolge Deiner Blind-Bausteine ab. Hast Du z. B.:
input -> shade -> dark -> set -> scene -> security -> control
dan könntest Du entweder die z. Zt. aktiven Bausteine alle disablen (im Aufruf) oder am Baustein blind_input  den Modus von automatik auf manuell umschalten.

Gruss

Majaestix
#10
Hallo peewit,

ob meine Idee wirklich gut ist, mögen andere entscheiden, deshalb hier mein Vorschlag:

Schreiben: Neue Werte immer ans Ende der Datei, ggf. mit einem Zeitstempel.
Lesen: Rückwärts parsen bis zum ersten = aktuellsten gesuchten Wert.
Reorg: Eigene Routine, löscht allemehrfach Sätze bis auf den letzten = aktuellsten und läuft separat.

Gruss

Majaestix
#11
Hallo Klaus,

danke für die Verbesserung!
Das Problem kann ich bestätigen.
Besonders fällt es auf, wenn SWITCH_I sowohl von einem Taster als auch von einer Visualisierung angesteuert wird.
BTW:
In den DIMM Bausteinen scheint der gleiche Code Verwendung zu finden, die reagieren ähnlich.

Gruss

Majaestix
#12
Modulentwicklung / Re:DATA-LOGGER
25. Oktober 2010, 09:43:07
Hallo peewit,

hier ein paar Ideen meinerseits:

- Adressierung des FTP per reiner URL, damit ich die Daten auch in die "Cloud" schicken kann.
- File Format CSV, wobei es schön wäre, wenn das Trennzeichen beim Aufruf definiert werden könnte
- ein Puffer, der die geloggten Daten lokal für eine definierte Zeit oder eine definierte Menge oder bis zur Verfügbarkeit der Verbindung zwischenspeichert und dann in einem Rutsch versendet

Das wär's erstmal.

Gruss

Majaestix
#13
Hallo peewit,

danke für die schnelle Antwort.

Zitatdas entspricht nicht der definition

Schade, das wäre es gewesen.

Nehme ich halt die zweite Variante, funktioniert ja auch.

Gruss


Majaestix
#14
Hallo Zusammen,

ich habe den Baustein SCHEDULER etwas umgeschrieben und auf meine Bedürfnisse angepasst:


FUNCTION_BLOCK SCHEDULER_3x

VAR CONSTANT
array_begin :       INT := 0;
array_end : INT := 9;
END_VAR

VAR_INPUT
E : ARRAY[array_begin..array_end] OF BOOL;
T : ARRAY[array_begin..array_end] OF TIME;
END_VAR

VAR_OUTPUT
Q : ARRAY[array_begin..array_end] OF BOOL;
END_VAR

VAR
init : BOOL;
u : ARRAY[array_begin..array_end] OF TIME;
tx : TIME;
c : INT;
i : INT;
END_VAR


(* ----- read system_time ----- *)

tx := DWORD_TO_TIME(T_PLC_MS());

IF NOT init THEN
init := TRUE;
FOR i := array_begin TO array_end DO
u[i] := tx - T[i];
END_FOR;
END_IF;

FOR i := array_begin TO array_end DO
Q[i] := FALSE;
END_FOR;

IF tx - u[c] >= T[c] THEN
Q[c] := E[c];
u[c] := tx;
END_IF;
c := c + 1;

IF c = array_end THEN
c := array_begin;
END_IF;


Jetzt passiert folgendes:
Rufe ich die Instanz wie folgt auf:


FUNCTION_BLOCK scheduler_3_test

VAR_INPUT
Enable : BOOL;
END_VAR

VAR
timer : SCHEDULER_3x;
test_flag_1 : BOOL;
test_flag_2 : BOOL;
test_flag_3 : BOOL;
END_VAR

IF enable THEN

timer (E[0] := ja,
T[0] := T#5s,
Q[0] => test_flag_1
E[1] := ja,
T[1] := T#10s,
Q[1] => test_flag_2,
E[2] := ja,
T[2] := T#15s,
                 Q[2] => test_flag_3);

IF timer.Q[0] THEN
test_flag_1 := TRUE;
END_IF;

IF timer.Q[1] THEN
test_flag_2 := TRUE;
END_IF;

IF timer.Q[2] THEN
test_flag_3 := TRUE;
END_IF;

IF timer.Q[3] THEN
test_flag_1 := FALSE;
test_flag_2 := FALSE;
test_flag_3 := FALSE;
END_IF;

END_IF;


bekomme ich einen Kompilerfehler, etwa: timer (E[0] geht nicht oder so ähnlich.

Adressiere ich die Instanz aber so:


FUNCTION_BLOCK scheduler_3_test

VAR_INPUT
Enable : BOOL;
END_VAR

VAR
timer : SCHEDULER_3x;
test_flag_1 : BOOL;
test_flag_2 : BOOL;
test_flag_3 : BOOL;
END_VAR

IF enable THEN

timer.E[0] := ja;
timer.T[0] := T#11s;

timer.E[1] := ja;
timer.T[1] := T#17s;

timer.E[2] := ja;
timer.T[2] := T#23s;

timer.E[3] := ja;
timer.T[3] := T#5s;

(* ----- Aufruf SCHEDULER_3x ohne Parameter ----- *)
timer();

IF timer.Q[0] THEN
test_flag_1 := TRUE;
END_IF;

IF timer.Q[1] THEN
test_flag_2 := TRUE;
END_IF;

IF timer.Q[2] THEN
test_flag_3 := TRUE;
END_IF;

IF timer.Q[3] THEN
test_flag_1 := FALSE;
test_flag_2 := FALSE;
test_flag_3 := FALSE;
END_IF;

END_IF;


läuft er super.

Kann mir jemand sagen, wie ich einen Aufruf mit der Übergabe von Array-Werten an VAR_INPUT gestalten muss?

Danke für Hilfe.

Majaestix
#15
Hallo Hugo,

danke für die Antworten!

Zitat von: hugo in 02. Juli 2010, 11:15:17
die web visu ist in der regel langsam im vergleich zu einer sps task.

Ich hatte zwar eine Zeitlang geglaubt, die Web-Visu wäre zu schnell, aber wahrscheinlich hast Du Recht...

Zitatdoppelklick macht über eine web visu wenig sinn.

Das denke ich inzwischen auch   >:(

Zitatallerdings kannst du ja andere buttons in der webvisu machen

Da hätte ich auch selber drauf kommen können, man denkt manchmal einfach zu kurz und ein Loch bohren und einen Schalter einbgauen braucht man schließlich auch nicht. So werde ich es machen ;D
Bleibt noch die Frage, wie ich dem Baustein DIMM_I bei enem einfachen Klick auf den neuen Visu-Taster erkläre, dass er einen Doppelklick erhalten hat  ???

Zitatbzw direkt den dimm_wert über die web visu steuern
Klar, dass würde über die Visu gehen.

Nochmals vielen Dank für Deine Tips.

Gruss

Majaestix