# Problemlösung bei SEL Baustein



## nexer (27 Juni 2015)

Hallo Zusammen !

Ich habe hier ein paar kleine SEL Bausteine zusammengesetzt und brauche Eure Hilfe, denn die Schaltung reagiert nicht mehr so wie sie soll.

Ziel ist es, dass der obere SEL Baustein, beim Eingangssignals des AND Bausteins den Wert AOUT1 an rAOut0 weitergibt.

Nachdem der Timer1 dann abgelaufen ist, soll er auf AIN1 zurückschalten. 


DANN fängt ein ähnliches Spiel mit dem unteren Baustein an. Sobald Timer1 aus, bekommt SEL unten signal und soll AOUT2 durchgeben an rAOut0.


Mein Problem ist hier folgendes :

Trotz das der obere SEL Baustein ein TRUE Signal vom AND Baustein bekommt, gibt er das Signal von AOUT1 nicht weiter.

Der Sel unten, obwohl gleiche Aubauweise, reagiert aber genau so...



hat jemand eine Idee warum.... ich sehe den Wald vor lauter Bäumen nicht....


Danke schonmal für die Hilfe !!


MFg.

Nexer


----------



## LargoD (27 Juni 2015)

Das  erste  Resultat wird im unteren Zweig überschrieben, und zwar immer, worüber wunderst Du Dich da?
Statt Null solltest Du im unteren Zweig das Resultat des oberen Zweigs benutzen. 
Gruß
Erich


----------



## nexer (27 Juni 2015)

Das ist ja Sinn der Schaltung, mein Problem ist, das die Ausgabe des Ersten Zweigs gar nicht ausgegeben wird.

Bspw. hat AOUT1 den Wert 10 und AOUT2 den wert 9.

So wird im oberen Zweig dauerhaft AIN1 angezeigt, egal ob der AND Eingang TRUE oder FALSE ist.

Im unteren Zweig, soll dies durch die Timerbausteine überschrieben werden.

DER SEL Bauststein reagiert auch so wie er soll.

Auch hatte ich statt AIN1 auch schon wie unten den Wert 0 stehen, reagiert aber identisch.....


Klar, wo mein Problem liegt ?


----------



## LargoD (27 Juni 2015)

nexer schrieb:


> Klar, wo mein Problem liegt ?


Ja, Du hast noch nicht verstanden, dass eine SPS *immer alle *Verknüpfungen zyklisch bearbeitet.
Probier mal meinen Tip von oben.


----------



## nexer (27 Juni 2015)

Ja, dafür sind ja im unteren teil die timerbausteine, sodass, auch wenn alle schaltungen zyklisch nacheinander bzw. paralell bearbeitet werden, immer nur eine ausgabe steht. demnach bekommt der untere sel erst seine "freigabe" nachdem die zeit abgelaufen ist, die identisch ist mit der abschaltzeit des oberen sel´s....


Oder habe ich da grade einen Denkfehler drin......


----------



## LargoD (27 Juni 2015)

Das obere Resultat wird für eine sehr kurze Zeit ausgegeben (Mikrosekunde oder weniger) und dann das Resultat des untern Zweigs. Das ist nicht das, was Du willst, aber das, was Du programmiert hast.
Null ist auch ein Wert.


----------



## nexer (27 Juni 2015)

Hättest du denn eine Idee wie ich die Schaltung anderweitig realisieren kann ?


----------



## Dr.MirakulixX (27 Juni 2015)

Sollen die immer für die selbe Zeit verwendet werden ? Erstell dir einen Impuls Timer von bspw TON=10s TOFF=10s und setzte den vor dein AND. Einmal Impulstimer und einmal NOT Impulstimer. Das wäre jetzt denke ich der einfachste Weg. Wenn ich dich richtig verstanden habe.


----------



## nexer (27 Juni 2015)

Also das soll genutzt werden um jeden Tag zur gleichen Zeit einen bestimmten Wert morgens vom 0-10v Ausgabe und nach ca. 13 Std. das gleiche Rückwärts, also vom 10-0V. 

Vielleicht kannst du mir die Schaltung die du meinst kurs ein Bild von machen, ich habe erst vor ein paar Tagen mit dem Schaltungsbau angefangen, mir ist das nicht sooo 100%ig klar....

Danke Dir


----------



## Dr.MirakulixX (27 Juni 2015)

Wenn ich heute Nachmittag an den Rechner komme Machenschaften das gerne. Soll das immer zur selben Zeit passieren ? Also bspw 0..10V von 8.00-20.00uhr und von 20.00-08-00Uhr 10..0V ?


----------



## nexer (27 Juni 2015)

Es soll der Wert von 8-9 Uhr 0-10V und dann von 20-21 Uhr 10-0V., in etwa 0,5v Schritten, ggf. kleiner.


Ja das wäre Super, die Relaysschaltung die schon funktioniert muss demnach nur nachgerüstet werden.

Ich hänge meine komplette Schaltung an, sodass du ggf. die Signale davon verarbeiten kannst. Die Uhrzeit wird so auch schon genutzt.

Zur Zeit funktioniert die Schaltung so, dass zu bestimmten Zeiten die 4 Relays angesprochen werden. Das klappt auch super. Darüber werden Lampen angesprochen. Und die Ausgabe oben, ist für einen Dimmer gedacht, der sofort einen Wert ausgeben soll, sobald die Schaltung Strom bekommt.

Ich hoffe ich hab das verständlich erklärt. 

Danke dir schonmal


----------



## silverfreaky (27 Juni 2015)

ich habe ja hier den Code reinkopiert vom OB1.Wenn du von dem FIFO projekt das ich reingestellt habe den Code vom OB1 nimmst und alle
benötigten Bausteine hast du jeden Tag die Uhrzeit in Jahr,Monat,Tag,Stunden,Minuten Sekunde.
Und zwar im Integer Format.Du hast also absolute Uhrzeiten.Besser gehts nicht.
Mit Sommer/Winterumschaltung.

Das heisst im Programm kannst du dann imm er wenn du das Register mit einer Flanke abfragst(bsp.weise Stunden) deinen Programmcode einmal ausführen


----------



## nexer (27 Juni 2015)

Ja die Uhrzeiten habe ich ja schon komplett funktionstüchtig integriert.

Ich brauche dazu nur eine Schaltung die mir zu einer festgesetzten Zeit ( Wenn möglich sogar über die Webvisu änderbar ) festgesetzte Spannungen ausgibt.


----------



## Dr.MirakulixX (27 Juni 2015)

Habe gerade mal angefangen das nach zu Bauen. Aber gerade nicht die Oscat installiert. Für mich die Relay0 - Relay 3 sind Zeitschaltuhren, oder ?


----------



## nexer (27 Juni 2015)

Das sind Relaybausteine die die Spannung schalten. Die Schaltung davor Schaltet zu bestimmten Zeiten das Relay an und aus, anhand des Bildes zu sehen, beim Obersten Timer, Startzeitt580 um 8:40, Dauert580 13 Std.

Das funktioniert auch perfekt.


----------



## Dr.MirakulixX (27 Juni 2015)

Was wäre denn mit einem Baustein 4 und 5 ? Startzeit wie du möchtest. Dauer eine Stunde. Den auf den Eingang des ersten SEL. Der zweite Baustein mit Startzeit wie dir beliebt und Dauer bspw wieder 1h auf den Eingang des SEL2 ? Wäre das ein Ansatz ?


----------



## silverfreaky (27 Juni 2015)

Also wenn ich dich richtig verstehe brauchst du die absolute Uhrzeit.Alst Startereignis.
Dann einen Impulserzeugung wie Mirakulix beschreiben hat.Alle Stunde.Und dann zählst du mit der Flanke von dem Wert runter den du zur absoluten
Uhrzeit geladen hast.Insgesamt 2 Zähler.Den Taktbaustein(2 Timer).Bei Siemens kannst du den Takt von der CPU ableiten.Indem du eine merbyte parametrierst.
In der Oscat Bibliothek gibts die Bausteine in S7 Format.


----------



## nexer (27 Juni 2015)

> Also wenn ich dich richtig verstehe brauchst du die absolute Uhrzeit.Alst Startereignis.



ja, er muss, sobald das RELAY0 schaltet, SOFORT einen Wert ausgeben. Dieser muss dann Werte zwischen 0 und 10v ausgeben. Da die Umwandlung ein DAC übernimmt, reicht demnach die ausgabe von 0-10 bzw. 10-0.



> Dann einen Impulserzeugung wie Mirakulix beschreiben hat.Alle Stunde.Und dann zählst du mit der Flanke von dem Wert runter den du zur absoluten
> Uhrzeit geladen hast.Insgesamt 2 Zähler.Den Taktbaustein(2 Timer).Bei Siemens kannst du den Takt von der CPU ableiten.Indem du eine merbyte parametrierst.
> In der Oscat Bibliothek gibts die Bausteine in S7 Format.



Leider muss ich hier zugeben, dass mir deine Beschreibung doch ein wenig zu hoch ist, für meine Grundkenntnis Digitaltechnik.....

Die Uhrzeit kann man ja ggf. aus dem Parameter Calendar.LDT entnehmen, da dort ja schon die genaue Uhrzeit ausgegeben wird. Diese wird auch per Batterie gepuffert.


----------



## Dr.MirakulixX (27 Juni 2015)

Hierbei wechselt der Ausgabewert von SEL nun alle 5s von SEL1 auf SEL2, meinst du das so ?
Das AND oben ist Natürlich Überflüssig..


----------



## nexer (27 Juni 2015)

Es ist wichtig, dass wir hier nicht vom wert 10 UND 0 sprechen, sondern von 0, 0,5 , 1, 1,5 , 2 , 2,5 , ........ 

Je nach Konfigurierarbeit, wäre mir die Ausgabe von 0, 0,1 , 0,2 , 0,3 , 0,4 , ......     auch sehr lieb.

In diesem Fall hätte jede Zeitspanne einen wert etwa 30 Sekunden. 

Sodass dann alle 30 Sekunden ein neuer Wert ausgegeben werden muss. Sobald dann alle 100 Werte ausgegeben worden sind, darf kein Wert mehr ausgegeben werden.


Das gleiche muss im Rückwärtigen Wege auch passieren.


----------



## Dr.MirakulixX (27 Juni 2015)

Ist zwar jetzt in ST aber damit knnst du einfach deinen Ausgabewert Generieren. Zeit der Erhöhnung und Faktor bestimmst du einfach selber...


----------



## nexer (27 Juni 2015)

Nun ja ST ist jetzt so gar nicht mein Fall. Wie kann ich das denn in FUP aufbauen ?


----------



## Dr.MirakulixX (27 Juni 2015)

Probier das mal bitte aus ob das deinen Vorstellungen entspricht. Du kannst die Zeiten ändern und die Max/Min Werte Festlegen. ZZt. ist es so das bei EIN:=TRUE der Wert bist MAXv(10) alle 2s hochgezählt wird. Bei Ein_Down wird alle 2s der Wert kleiner bis MINv(0).

Einfach ein ST Program aufmachen und Simulieren, wenn das passt kann ich mich mal an der Umsetzten machen, nutze idr nur ST 



```
VAR
    TP1, TP2:TP;
    EIN, EIN_Down: BOOL;
    Value:REAL;
    Faktor:REAL:=0.5;
    TRIG, TRIG2:R_TRIG;
    Maxwert:REAL:=10;
    Minwert:REAL:=0;
    MINv, MAXv:BOOL;
END_VAR
```


```
TP1(IN:=EIN AND NOT MAXv AND NOT TP1.Q , PT:=t#2s );
TRIG(CLK:=TP1.Q);
IF TRIG.Q THEN Value:=Value+Faktor;
    ELSE Value:=Value;
END_IF;

TP2(IN:=EIN_Down AND NOT MINv AND NOT TP2.Q , PT:=t#2s );
TRIG2(CLK:=TP2.Q);
IF TRIG2.Q THEN Value:=Value-Faktor;
    ELSE Value:=Value;
END_IF;
IF Value>=Maxwert THEN maxv := TRUE;
    ELSE maxv:=FALSE;
END_IF
IF Value<=Minwert THEN minv:=TRUE;
    ELSE minv:=FALSE;
END_IF;
```


----------



## nexer (27 Juni 2015)

So, also wie gesagt, hab da noch nicht so viel Erfahrung. Hab jetzt das ST Programm aufgemacht und den Inhalt so reinkopiert.

Wenn ich das nun auf die Steuerung schiebe, sehe ich zwar div. Werte..... weis aber nicht wirklich was ich da machen muss,bzw. worauf ich zu achten habe....

Sry, aber du müsstest mir mal sagen worauf ich achten muss, denn ändern tut sich nichts......


----------



## Dr.MirakulixX (27 Juni 2015)

Du kannst das auch einfach erstmal Simulieren statt auf die Steuerung zu schieben...
Es gibt Zwei eingänge die "Wichtig" sind. Wenn der Eingang EIN True ist wird Hochgezählt, wenn der Eingang Ein_down True ist wird runter gezählt.
Um das zu testen Log dich ein uns starte das Programm. 
Nun solltest du auf der Linken Seite einige Variabeln sehen. Unteranderem auch EIN und etwas weiter unten EIN_Down. Mach mal einen Doppelklick auf das schwarze FALSE. Nun steht dahinter in Cyan oder welche Farbe das sein soll <:=TRUE> Wenn du jetzt F7 drückst, wird der Wert geforcert (als quasi erzwungen) nun sollte der Wert alle 2 Sekunden um 0.5 steigen.
Das hört auf wenn der Maxv erreicht wird (10) oder du die Variable EIN nochmal Foreced auf FALSE;

Bei fragen nur zu


----------



## nexer (27 Juni 2015)

Super, danke dir dass du dir so viel Zeit nimmst. Das ändern der Variable hatte ich gesehen, nur das F7 fehlte mir.

Ja die Schaltung macht bei mir genau das gleiche wie bei dir ;-D

jeweils um 0,5 alle 2 Sek hoch. Wenn ich den ausgegebenen Wert dann noch einem Port zuweisen kann, was ja an sich kein Problem sein sollte, ist das so wie ich mir das vorstelle bzw. kann dann mit meinen Werten ergänzt werden.

Da ich mal gehört habe, dass Codesys auch übersetzen kann, aber nicht weis wie ^^, würde ich dich bitten, dies nun mal versuchen zu übersetzen.


----------



## Dr.MirakulixX (27 Juni 2015)

Jetzt versteh ich gerade nicht was du übersetzt haben möchtest.


----------



## nexer (27 Juni 2015)

> Einfach ein ST Program aufmachen und Simulieren, wenn das passt kann ich mich mal an der Umsetzten machen, nutze idr nur ST



Das meinte ich, oder hab ich das Falsch verstanden.

Ich dachte jetzt du würdest dies noch nach FUP übersetzen, sodass ich ein übersichtliches Bausteinsystem hab....

Oder so sagst mir, wie ich in FUP den ausgebenden Wert der Zeit nutzen kann.


----------



## Dr.MirakulixX (27 Juni 2015)

Bin gerade noch was Bussy. Versuche mich gleich ins Konvertieren für dich [emoji16]


----------



## nexer (27 Juni 2015)

Viiiiiieeeeeelen Dank ;-) 

Du bist der Beste !


----------



## Dr.MirakulixX (27 Juni 2015)

Habe das erstmal für die so Umgesetzt das du ST und FUP gleichzeitig nutzen kannst.
Ich habe mal den Wert auf den SEL Baustein gelegt. Aber den SEL brauchst du ja nicht mehr !
Zu beachten ist das du das ST Program (bei mir Plc2) in PLC_PRG aufrufen mußt ! Sonst passiert nix (roter Pfeil unten)
Der Blauepfeil zeigt die als BSP wie du im FUP den Wert des ST Prog´s verwenden kannst 
	
	



```
Plc2.Value
```
 umgekehrt kannst du natürlich auch im ST die Variablen EIN ersetzten in dem du 
	
	



```
PLC_PRG.xRelay0
```
 (als BSP) verwendest.


----------



## nexer (27 Juni 2015)

Ähm... wenn du sagst ich brauch den SEL Baustein nicht mehr, warum benutzen wir den dann ?

Wenn die Umlegung nicht notwendig ist, dann sag mir nur, wie ich den Wert aus der ST Liste auslesen und in meine FUP einlesen kann.


----------



## Dr.MirakulixX (27 Juni 2015)

Da wo du ihn brauchst verwendest du (in meinem Fall) Plc2.Value als Eingang. 
Ich denke mal du brauchst ihn nicht mehr. Ich habe ihn nur noch von eben im Programm. 
Du hast ja deinen Wert den du weiter Verarbeiten kannst. Hoch bzw Runterzählen macht der ja auch


----------



## nexer (27 Juni 2015)

Ok, die verbindung funktioniert.

Wie gebe ich ihm denn das Signal dass er anfangen soll hochzuzählen.

Beim hochzählen könnte man ja das TRUE signal des RELAY0 nehmen, beim runterzählen müsste man eine feste Zeit wählen, wie bpsw. 11 Std. oder so oder was gäbe es da sonst ?


----------



## Dr.MirakulixX (27 Juni 2015)

Wenn du in meinem Baustein den Eingang EIN entfernst und dort PLC_PRG.xRelay0 einfügst sollte es schon laufen. Zum Runterzählen würde ich einen weiteren Baustein Relay4 einfügen und den entsprechend konfigurieren. Dann kannst du bei allen deine Startzeit festlegen.


----------



## nexer (27 Juni 2015)

das PLC_PRG, ist das der Name, wo der xrelay0 liegt oder wieso dieser name ?

sobald ich den nämlich korrigiere, erhalte ich fehler


----------



## Dr.MirakulixX (27 Juni 2015)

PLC_PRG müsste bei dir Links in der Baumstruktur bei Bausteine stehen. Darin sollten deine FUP Sachen wie die Relay Bausteine sein oder nicht ?
Sonst schick mal ein Screenshot.


----------



## nexer (27 Juni 2015)

So siehts bei mir aus, habe einige PRG´s und alle dementsprechend benannt.

Dein Programm läuft in Timeranalog.
In Timeclock läuft das POU Programm wo es hier schon screenshots gibt.
In SystemTimePrg läuft das Programm der Qscat Timerbausteine.


----------



## Dr.MirakulixX (27 Juni 2015)

Noch eine Idee.. vieleicht einfacher... 
Erstell einen neuen Baustein. Hier wählst du FUNKTIONBLOCK ! und ST. Nenn ihn wie du magst. In meinem Besipiel SEL_ersatz.
Nun fügst du folgendes Ein :

```
FUNCTION_BLOCK Sel_ersatz
VAR_INPUT
    EIN, EIN_Down: BOOL;
    Faktor:REAL;
    Maxwert:REAL;
    Minwert:REAL;
    Impulszeit:WORD;
END_VAR
VAR_OUTPUT
    Value:REAL;
END_VAR
VAR
    TP1, TP2: TP;
    TRIG, TRIG2:R_TRIG;
    MINv, MAXv:BOOL;
    ImpulsZeit_used:TIME;
END_VAR
```
UND

```
ImpulsZeit_used:=WORD_TO_TIME(Impulszeit*1000);
TP1(IN:=EIN AND NOT MAXv AND NOT TP1.Q , PT:=ImpulsZeit_used );
TRIG(CLK:=TP1.Q);
IF TRIG.Q THEN Value:=Value+Faktor;
    ELSE Value:=Value;
END_IF;

TP2(IN:=EIN_Down AND NOT MINv AND NOT TP2.Q , PT:=ImpulsZeit_used );
TRIG2(CLK:=TP2.Q);
IF TRIG2.Q THEN Value:=Value-Faktor;
    ELSE Value:=Value;
END_IF;
IF Value>=Maxwert THEN maxv := TRUE;
    ELSE maxv:=FALSE;
END_IF
IF Value<=Minwert THEN minv:=TRUE;
    ELSE minv:=FALSE;
END_IF;
```
Jetzt öffne dein FUP und füge einen Baustein ein. Dort wählst du Definierte Funktionsblöcke und den Baustein (in meinem Beispeil SEL_ersatzt(FB)).
Jetzt hast du einen Baustein den du nach belieben beschalten kannst ! 
Neu ist der Eingang Impulszeit, dort kannst du die Zeit eingeben die du zwischen den Schritten haben möchtest, in Sekunden !


----------



## nexer (27 Juni 2015)

Ja guck mal, genau an so etwas habe ich gedacht.

Er funktioniert fast so wie es soll ;-)

Ich habe den xRELAY0 mal auf einen Schalter gelegt, sobald dieser gedrückt wird, zählt er bis 10 hoch und bleibt stehen....

Schalte ich das Relay aus, sollte er eigentlich wieder zurückspringen und beim nächsten Anschalten wieder von vorne beginnen.
Das macht er hier jetzt nicht....


----------



## Dr.MirakulixX (27 Juni 2015)

Wohin zurückspringen ? Auf null ? Ich habe es so verstanden er soll zu der Zeit X den Wert hochfahren und zu Y (EIN_Down) runter fahren. Heißt das du möchtest immer bei 0 starten und bei 10(Bsp) stoppen. Bei der anderen fahrt bei 10 starten und bei Null stoppen ?


----------



## nexer (27 Juni 2015)

Dass er oben bleibt ist ja in Ordnung, er soll aber wieder von vorne anfangen, sobald das relay aus und wieder an geht.

Hat den hintergrund, dass damit lampen gedimmt werden sollen, diese soll morgens langsam hochlaufen und abends langsam runter. und am nächsten morgen natürlich wieder langsam hoch ;-)


----------



## Dr.MirakulixX (27 Juni 2015)

Okay. Also das für den Fall das sie abends nicht runter gelaufen sind ? Wenn du sie runterfahren lässt wird der Wert ja kleiner. Sonst hättest du ja am Tag hochfahren. Jetzt kommt eine neuer Impuls (woher ist erstmal egal) und der Zirkus beginnt von vorne. Aber wenn du das wünscht ist das machbar.


----------



## nexer (27 Juni 2015)

Ja wichtig ist ja grundlegend ab "Morgens" Baustein, dass dieser, sobald Relay auf FALSE steht, wieder auf den Anfangswert, also Minwert zurückspringt. 

Über den Abends Baustein machen wir uns danach Gedanken, denn dieser muss ja auch eine Zeitschaltung zum Start haben, da dort ja nur vor dem Ende des Relays dieser Wert ausgegeben werden muss.


----------



## Dr.MirakulixX (27 Juni 2015)

Möglichkeit 1, ein Reset Eingang ?

```
FUNCTION_BLOCK Sel_ersatz
VAR_INPUT
    EIN, EIN_Down: BOOL;
    Faktor:REAL;
    Maxwert:REAL;
    Minwert:REAL;
    Impulszeit:WORD;
    Reset:BOOL;
END_VAR
VAR_OUTPUT
    Value:REAL;
END_VAR
VAR
    TP1, TP2: TP;
    TRIG, TRIG2:R_TRIG;
    MINv, MAXv:BOOL;
    ImpulsZeit_used:TIME;
END_VAR
```
und

```
ImpulsZeit_used:=WORD_TO_TIME(Impulszeit*1000);
TP1(IN:=EIN AND NOT MAXv AND NOT TP1.Q , PT:=ImpulsZeit_used );
TRIG(CLK:=TP1.Q);
IF TRIG.Q THEN Value:=Value+Faktor;
    ELSE Value:=Value;
END_IF;
IF Reset AND Ein = TRUE THEN Value:=Minwert;
    ELSE Value:=Value;
        END_IF;
IF Reset AND Ein_down = TRUE THEN Value:=Maxwert;
    ELSE Value:=Value;
        END_IF
TP2(IN:=EIN_Down AND NOT MINv AND NOT TP2.Q , PT:=ImpulsZeit_used );
TRIG2(CLK:=TP2.Q);
IF TRIG2.Q THEN Value:=Value-Faktor;
    ELSE Value:=Value;
END_IF;
IF Value>=Maxwert THEN maxv := TRUE;
    ELSE maxv:=FALSE;
END_IF
IF Value<=Minwert THEN minv:=TRUE;
    ELSE minv:=FALSE;
END_IF;
```
Hierbei wird der Wert entweder auf Maxv (EIN und RESET = TRUE) oder auf MINv (EIN-Down und RESET = TRUE) gesetzt

oder aber das er bei jedem Start bei MINv startet (EIN) bzw MAXv (Ein_Down)

```
FUNCTION_BLOCK Sel_ersatz
VAR_INPUT
    EIN, EIN_Down: BOOL;
    Faktor:REAL;
    Maxwert:REAL;
    Minwert:REAL;
    Impulszeit:WORD;
END_VAR
VAR_OUTPUT
    Value:REAL;
END_VAR
VAR
    TP1, TP2: TP;
    TRIG, TRIG2:R_TRIG;
    MINv, MAXv:BOOL;
    ImpulsZeit_used:TIME;
    TRIG_Min, TRIG_Max:R_TRIG;
END_VAR
```

UND


```
TRIG_Min(CLK:=EIN);
TRIG_Max(CLK:=EIN_Down);
IF TRIG_Min.Q THEN Value:=Minwert;
    ELSE Value:=Value;
        END_IF;
IF TRIG_Max.Q THEN Value:=Maxwert;
    ELSE Value:=Value;
        END_IF;
ImpulsZeit_used:=WORD_TO_TIME(Impulszeit*1000);
TP1(IN:=EIN AND NOT MAXv AND NOT TP1.Q , PT:=ImpulsZeit_used );
TRIG(CLK:=TP1.Q);
IF TRIG.Q THEN Value:=Value+Faktor;
    ELSE Value:=Value;
END_IF;
TP2(IN:=EIN_Down AND NOT MINv AND NOT TP2.Q , PT:=ImpulsZeit_used );
TRIG2(CLK:=TP2.Q);
IF TRIG2.Q THEN Value:=Value-Faktor;
    ELSE Value:=Value;
END_IF;
IF Value>=Maxwert THEN maxv := TRUE;
    ELSE maxv:=FALSE;
END_IF
IF Value<=Minwert THEN minv:=TRUE;
    ELSE minv:=FALSE;
END_IF;
```


----------



## nexer (27 Juni 2015)

Jetzt hab ich den Überblick verloren ^^......


Woher kriegt der denn den Resetbefehl ?


----------



## Dr.MirakulixX (27 Juni 2015)

Das sind zwei verscheide Ansätze. Oben bekommt dein Baustein einen zusätzlichen Eingang Reset. Beim unteren macht startet er immer beim kleinsten bzw höchsten Wert. Je nachdem was dir mehr zusagt.


----------



## nexer (27 Juni 2015)

Ja er soll nicht nachdem er fertg ist einfach auf 0 Springen, dann ist ja alles wieder quasi aus.

dann ist Variante eins mit reset ok, aber wie spreche ich den an..... ggf. mit relay0 negieren ?


----------



## Dr.MirakulixX (27 Juni 2015)

Bei Version zwei beginnt der jedesmal bei Null bzw 10 (Bsp) wenn der Eingang EIN bzw Ein_Down true wird. Er zählt bis Max. Und erst beim nächsten Start wieder. Den Reset kann man besser über einen Impuls der auch vom Relay kommt. Aber das ist dann dasselbe wie Version 2


----------



## nexer (27 Juni 2015)

Ich bekomme, nachdem ich Version 1 kopiert habe, folgende Fehlermeldung : 



                ------ Übersetzungslauf gestartet: Applikation: Device.Application -------
                Code typisieren ...
[WARNUNG]       iodrvgpio, 1.0.0.0 (3s - smart software solutions gmbh): init [GPIO](Zeile 1 (Dekl)): C0351:  Das Attribut libdoc_include ist unbekannt und wird vom Compiler ignoriert.
[WARNUNG]       iodrvgpio, 1.0.0.0 (3s - smart software solutions gmbh): Fb_exit [GPIO](Zeile 1 (Dekl)): C0351:  Das Attribut libdoc_include ist unbekannt und wird vom Compiler ignoriert.
[FEHLER]        Terrarienschaltung: Timeclock [Device: SPS-Logik: Application: SystemTimePrg](Element 1): C0080:  Funktionsblock 'AnalogOut' muss für den Zugriff instanziert werden
[INFORMATION]   Terrarienschaltung: AnalogOut [Device: SPS-Logik: Application]: C0181:  Verwandte Position
[FEHLER]        Terrarienschaltung: Timeclock [Device: SPS-Logik: Application: SystemTimePrg]: C0080:  Funktionsblock 'AnalogOut' muss für den Zugriff instanziert werden
[INFORMATION]   Terrarienschaltung: AnalogOut [Device: SPS-Logik: Application]: C0181:  Verwandte Position
[FEHLER]        Terrarienschaltung: Timeclock [Device: SPS-Logik: Application: SystemTimePrg](Element 1): C0080:  Funktionsblock 'AnalogOut' muss für den Zugriff instanziert werden
[INFORMATION]   Terrarienschaltung: AnalogOut [Device: SPS-Logik: Application]: C0181:  Verwandte Position
                Kompilierung abgeschlossen -- 3 Fehler, 2 Warnungen


----------



## Dr.MirakulixX (27 Juni 2015)

Versuch mal die Version zwei. Also den Code 3 in den Baustein [FB] VAR kopieren und den Code 4 in den Programmteil. Alles andere aus dem Baustein löschen.


----------



## nexer (27 Juni 2015)

Super, mit Version 2 läuft es so wie es soll.

Wenn relay aus geht, keine reaktion, geht relay auf true, dann reset der Value.

Perfekt !!


Nun bliebe die ähnliche Funktion vor dem Ausschalten...


----------



## nexer (27 Juni 2015)

Ach und auch wenn das jetzt vll schon zuspät ist, gibt es eine Möglichkeit, die als Eingang von mir gegebenen Werte (Impuls, usw...) In der Webvisu zu ändern ?


----------



## Dr.MirakulixX (27 Juni 2015)

Klar. Habe ich so vorgesehen. Wenn du in der Webvisu die Felder einfügst kannst du alle Werte dort eingeben.


----------



## nexer (27 Juni 2015)

Ok, das klingt einfacher als ich es gedacht hab.

Könntest du mir sagen wie ? Das habe ich so nämlich nicht gefunden.... Und wenn ich das änder, wie lange dauert das, bis die Anwendung das kapiert ?

Oder muss ich das Programm dann neustarten oder so ?


----------



## Dr.MirakulixX (27 Juni 2015)

Ich gehe davon aus das du Codesys 3 verwendest. Ich kenne mich leider nur mit v2.xx aus. Dort gehst du in der Visu hin und "zeichnest" oder ein Feld. Als Text gibst du bspw "Min Wert : %s" ein. Dann sollte es dort einen Punkt Variablen geben. Dort wählst du bei Anzeige die Variable aus die du dem Baustein als MinWert gegeben hast (lass du es per Variable machen möchtest). Zuletzt noch im Bereich Eingabe unten auswählen das du dort einen NUM Wert eingeben kannst und das sollte es sein.


----------



## nexer (27 Juni 2015)

So, das Feld existiert, die Variable wird ausgegeben und wenn ich draufklicke, kann ich diese ändern. Doch wenn ich dies mit Enter bestätige, bleibt er auf dem Ursprungswert....


----------



## nexer (27 Juni 2015)

Hier mal die Eingenschaften des Textfeldes..



Bei dem Ausschaltbaustein, wie kann ich da am Besten die Zeitwahl vornehmen ? Also wann dieser das TRUE Signal erhält


----------



## Dr.MirakulixX (27 Juni 2015)

Hilft das weiter... ?


----------



## nexer (27 Juni 2015)

Mh... Leider sind die Parameter bei 3.0 doch etwas anders.... Ich hab es jetzt zwar soweit, dass er die Dateneingabe anbietet, übernimmt, kurzzeitig anzeigt und dann wieder mit der Fest eingegebenen überschreibt.....


Naja das ist auch erstmal zweitrangig....

Wichtiger wäre mir der ausschaltbaustein


----------



## Dr.MirakulixX (27 Juni 2015)

Beschreibst du den Eingang vom Baustein oder hast du ne Var an dessen Eingang gepackt ? 
Fürs Ausschalten wiederhole ich nochmal meinen Vorschlag von vorhin. Bau dir noch einen Baustein wie den fürs Hochfahren und nutze den


----------



## nexer (27 Juni 2015)

Also mir ist nicht klar, was ich in deinem Baustein ändern muss, damit dieser runter zählt....

Würdest du mir helfen, welche Info dort verändert werden muss ?


----------



## Dr.MirakulixX (27 Juni 2015)

Hochzählen den Eingang EIN auf True. Runterzählen den Eingang EIN_down auf True. Es darf nur einer der beiden auf True sein. 
Also Ein -> Hochzählen Ein_Down -> Runter


----------



## nexer (27 Juni 2015)

Oh, ich hab an allem rumgefummelt, aber das habe ich nicht probiert ;-)


Super, das funktioniert. 

Jetzt hab ich ein Problem mit der Ausgabe, aber da kannst du mir nicht helfen.....

Jetzt wäre noch super, wenn wir das mit der Webvisu hinbekommen....


----------



## Dr.MirakulixX (27 Juni 2015)

Zeig mal bitte wie du "meinen Baustein" beschaltet hast.


----------



## nexer (28 Juni 2015)

Schau mal, so sehen die Bausteine aus und das Fenster für des Textbausteins in der Webvisu.


Also nicht, dass du das falsch verstehst, dein Baustein macht genau das was er soll, nur die Ausgabe funktioniert bei mir nicht... Also die Ausgabe des Hardwareanschlusses. 

Der DAC gibt den angegebenen Wert aus, nur die Dimmung lässt sich davon nicht wirklich beeindrucken.


Vielleicht kannst du Anhand des Screenshots erkennen, welchen Parameter ich in 3.0 ändern muss, damit der Wert tatsächlich veränderbar ist....


----------



## Dr.MirakulixX (28 Juni 2015)

Du willst doch zb den Faktor über die VISU ändern. Aber du kannst nicht dem Baustein einen Wert zuteilen wenn du am Eingang eine Feste Vorgabe machst. Lösch mal den FAKTOR Wert 0.1 (oder den welchen du ändern möchtest) und schreib statt der 0.1 eine VAR dort rein BSPw FaktorWert. Diese solle als REAL deklariert sein. Nun änderst du diesen Wert in deiner VISU.
siehe hierzu mein Bild, mit dem BSP Maxi (roter Pfeil)


----------



## nexer (28 Juni 2015)

Ja das habe ich probiert, der Wert springt aber immer auf den Ursprungswert zurück.
Zusätzlich habe ich ja jetzt keinen Standart, sodass das Programm immer von 0.0 ausgeht anstatt in meinem Beispiel von 0.1


----------



## Dr.MirakulixX (28 Juni 2015)

In deiner Grafik beschreibst du aber den Baustein direkt (faktor) nicht die Variable... wenn ich das richtig seh


----------



## nexer (28 Juni 2015)

ja das stimmt, ich hab des dann aber mal mit der variable ausprobiert, außer, dass sich der Wert durch die "leere" variable ändert, reagiert er aber gleich


----------



## Dr.MirakulixX (28 Juni 2015)

Schau mal das Bild an ob du das so gemacht hast, habe leider gerade hier kein Codesys3, in der Firma hätte ich eCockbit... aber das bekommen wir auch so hin.
Hast du das wie auf dem Bild an beiden stellen geändert ? Kannst du mir mal zeigen was für Einstellungen sich hinter den Blauen Pfeilen verbergen ?


----------



## nexer (28 Juni 2015)

Ahh, mir ist aufgefallen, dass ich den "Anschluss" Faktor gewählt habe, nicht die Variable selbst.... das war mein Fehler..... 

Jetzt nimmt er auch die Änderung.... AAABER ;-) Wie gebe ich Ihm denn einen Standartwert vor ? Also in diesem Falle das 0.1 ?


----------



## Dr.MirakulixX (28 Juni 2015)

Versuch mal in der Var Config 

```
Faktorwert : Real:=0.1;
```
So sollte das gehen...


----------



## nexer (28 Juni 2015)

Jawohl, super !!

Dann hätte ich noch eine ähnliche sache, ich habe ja hier noch timerbausteine die Ihre Werte über Variablen TIME und TOD erhalten.

Wie kann ich diese per webvisu ändern ?

Denn dann erhalte ich als Ausgabe ja den Wert TOD#8:00 oder T#12H. Kann man das auch so anzeigen lassen, sodass nur die Zeiten angezeigt werden ?


----------



## Dr.MirakulixX (28 Juni 2015)

Ich denke wir reden hier nicht nur von Anzeigen, sondern auch von ändern, Oder ? Sprich du möchtest gerne statt TOD#8:00 08:00 oder 8:00 angezeigt bekommen und wenn du drauf klickst dann z.B. einfach 8:45 Eingeben und der Übernimmt das dann ?


----------



## nexer (28 Juni 2015)

ja volkommen richtig.

Dass ich alles live über die webvisu ändern kann


----------



## Dr.MirakulixX (28 Juni 2015)

Sowas habe ich mal Realisiert. 
Möglichkeit 1) Du lebst damit das vorne TOD# steht und änderst den Wert, ist zwar nicht schön, sollte aber durchau funktionieren.
Ich habe damals versucht über TOD_TO_STRING, TOD_TO_WORD etc etwas schöneres zu bekommen, aber leider fehlanzeige.
Dann bin ich den "harten Weg" gegangen. TOD > in String > Aus dem String TOD#12:00 das TOD# entfernt > ein Eingabefeld verwendet um den neuen Sting einzugeben (Bsp 13:17) und das wieder in TOD gewandelt.. ist ein wenig schreib arbeit aber sieht in der Visu besser aus


----------



## nexer (28 Juni 2015)

Dann würde ich sagen, das überlasse ich dir, ob du dir die arbeit machen möchtest, mir dies zu erklären ;-)


----------



## Dr.MirakulixX (28 Juni 2015)

Ich versuche es mal für deine TOD
Du machst dir wieder einen neuen Funktionsblock
T1 ist deine TOD, help1 die Variable für deine VISU

```
FUNCTION_BLOCK Zeitanpassung
VAR_IN_OUT
    T1                                                        : TOD;
    help1                                                    : STRING;
END_VAR
VAR_OUTPUT
END_VAR
VAR
    Tst                                                        : STRING;
    T3                                                        : TOD;
    Fi1    , Fi2                                                : INT;
    help2,help3                                            : STRING;
    TON1                                                    : TON;
END_VAR
```

hier das Prog

```
tst:=TOD_TO_STRING(T1);                    (*Hier wird die TOD zum String verarbeitet*)
fi1:=LEN(tst);                                    (*Sicherheitshalber wird die größe des Strings herausgefunden*)
fi2:=LEN(help1);
IF fi2<3 THEN help1:=help3;                    (*Beim neustrten ist der wäre der Wert 10s leer...*)
    ELSE help1:=help1;
        END_IF;
help3:=MID(tst, fi1-7, 5);                        (*String "help3" wird angepasst auf 12:00 (BSP), also TOD# weg fi1-7 = Anzahl der neuen Stellen, 5=Ab welcher Stelle*)
TON1(IN:=NOT TON1.Q , PT:=t#10s);        (*Timerbaustein, Impuls alle 10s*)
IF ton1.Q THEN help1:=help3;                (*alle 10s wird der Wert von TOD wieder in den String geschrieben*)
    ELSE help1:=help1;
        END_IF;
help2:=CONCAT('TOD#', help1);                (*Es wird wieder ein TOD passender String erzeugt*)
t3:=STRING_TO_TOD(help2);
IF t1 <> t3 THEN t1:=t3;                        (*Vergleicher, wenn neue TOD ungleich der alten TOD dann wird die neue TOD geschrieben *)
    ELSE t1:=t1;
        END_IF;
```


----------



## nexer (28 Juni 2015)

Suuuper, das klappt ja wunderbar....

Inwiefern muss ich den Baustein verändern, wenn ich das gleiche mit TIME Werten machen möchte ?


----------



## Dr.MirakulixX (28 Juni 2015)

Schaue mir das nachher mal an. Aus dem Kopf schwer. Aber wird denke ich erst später Nachmittag.


----------



## nexer (28 Juni 2015)

Ja immer mit der Ruhe. Mach wenn du Zeit hast, du hast mir ja schon mehr als genug geholfen


----------



## Dr.MirakulixX (28 Juni 2015)

Bei Time kommt das kleine Problem hinzu das wir ja von ms bis h alles dabei hätten. Brauchst du einen bestimmten Bereich ? Also min oder h oder alles ?


----------



## nexer (28 Juni 2015)

Also es müssen bspw. 45min oder auch 2 stunden und 45min eingestellt werden können.


----------



## Dr.MirakulixX (28 Juni 2015)

So.. könnte funktionieren..

```
FUNCTION_BLOCK AnpassungTime
VAR_IN_OUT
    TimeIN                                            : TIME;
    ZeitStr                                                : STRING;
END_VAR
VAR_OUTPUT
END_VAR
VAR
     Timehelp                                            : TIME;
    TimeWord                                            : DWORD;
    TimeStr                                            : STRING;
    hrs, mins, rest                                        : DWORD;
    Timer1                                                : TON;
    minstr, hstr                                        : STRING;
    help1                                                : DWORD;
    newh, newmin                                    : INT;
END_VAR
```


```
Timer1(IN:=NOT Timer1.Q , PT:=t#10s);                                (*Timerbaustein, Impuls alle 10s*)
IF Timer1.Q THEN TimeWord:=TIME_TO_DWORD(TimeIN);
    Zeitstr:=CONCAT(hstr,':');                                            (*Aus hstr und minstr wird 02:34*)
    Zeitstr:=CONCAT(Zeitstr, minstr);
    ELSE TimeWord:=TimeWord;
        END_IF;
TimeWord:=TIME_TO_DWORD(TimeIN);                            (*Word zum Weiterverarbeiten*)
hrs:=TimeWord/3600000;                                            (*anzahl der Std.*)
rest:=TimeWord-(hrs*3600000);                                        (*Rest*)
mins:=rest/60000;                                                    (*anzahl der min*)
minstr:=DWORD_TO_STRING(mins);                                (*Umwandlung in min String *)
hstr:=DWORD_TO_STRING(hrs);                                    (*Umwandlung in h String*)
IF LEN(hstr)=1 THEN hstr:=CONCAT('0',hstr);                        (*Für die Visu 1 wird zu 01*)
    ELSE hstr:=hstr;
        END_IF;
IF LEN(minstr)=1 THEN minstr:=CONCAT('0', minstr);                (*Für die Visu 1 wird zu 01*)
    ELSE minstr:=minstr;
        END_IF;
newh:=STRING_TO_INT(MID(zeitstr, 2,1));                            (*Aus dem Zeitstr...*)
newmin:=STRING_TO_INT(MID(zeitstr,2,4));
help1:=(newh*3600000)+(newmin*60000);
timehelp:=DWORD_TO_TIME(help1);
IF timein<>timehelp THEN TimeIN:=timehelp;
    ELSE timeIN:=TimeIN;
        END_IF;
```


----------



## nexer (29 Juni 2015)

Wäre es ggf. möglich, dass ich dort die Endzeit eingebe, und der Baustein automatisch die dauer errechnet ?

Das wäre natürlich das non plus ultra


----------



## Dr.MirakulixX (29 Juni 2015)

Meinst du jetzt einen Eingang Startzeit, einen Endzeit und der sagt dir zB Start 12:00 Ende 13:15 entspricht 75min ? oder wie meinst du das ?


----------



## nexer (29 Juni 2015)

Pass auf, 

momentan ist es ja so, dass Ich die Startzeit per TOD Wert angebe, also bspw. TOD:=TOD#8:40 und die Dauer per TIME Wert TIME:=T#13H.

Ich möchte aber in der Webvisu eine ANzeige erhalten, sodass ich den TOD Wert als 8:40 angezeigt bekomme und auch diesen ändern kann, und den TIME Wert als 21:40 angezeigt bekomme und diesen ändern kann. Wenn ich diesen änder, soll der konvertiert werden.

Es geht zwar auch so jetzt, das wäre aber das schönste


----------



## nexer (2 Juli 2015)

Hey, hast du mittlerweile die Zeit gefunden, den Baustein umzuschreiben oder wann hättest du die Zeit dazu ?


----------



## Dr.MirakulixX (2 Juli 2015)

Bin leider erst nächste Woche wieder zuhause. Bin derzeit unterwegs. Gucke es mir dann an.


----------



## nexer (2 Juli 2015)

Ja ist nicht schlimm, dann weis ich aber bescheid !


----------



## nexer (4 Juli 2015)

Vielleicht kannst du mir zwischenzeitlich mobil helfen. Mir ist aufgefallen, dass durch die beiden Hinauf- und Hibablauf Bausteine in einem Zyklus 2x der gleiche Ausgang angesprochen wird.... Demnach blockiert natürlich der eine Ausgang den anderen...... Welchen baustein muss ich dazwischensetzen, damit eben nur eine Variable durchgesetzt wird....


----------



## Dr.MirakulixX (4 Juli 2015)

Kannst du das genauer Erklären ?


----------



## nexer (4 Juli 2015)

Hier mal Ein Foto.

Die beiden eingekreisten Ausgänge werden parallel angesprochen und überlagern sich. 

Demnach muss da doch ein Baustein davor , der dafür sorgt, dass nur ein Signal an den Ausgang ausgegeben wird...


Und genau den brauche ich, sonst bekomme ich Fehler bei der Spannungsausgabe


----------



## Dr.MirakulixX (4 Juli 2015)

Da wäre der SEL Baustein der richtige.


----------



## nexer (4 Juli 2015)

Und wie entscheide ich an dieser Stelle welches Signal er nehmen soll ?

Er soll ja morgens Signal 1 nehmen und abends Signal 2.... Mit schließt nicht unbedingt wie ich das bewerkstelligen könnte....


----------



## Mobi (5 Juli 2015)

Na mit einem SEL. Füg den einfach ein. Die Verschaltung ist ziemlich einfach und selbsterklärend.


----------



## Dr.MirakulixX (5 Juli 2015)

Den SEL kannst du mit einem Ausgang deines Relays ansteuern.


----------



## nexer (7 Juli 2015)

So, ich habe das nun mit dem SEL Baustein gelöst..... AAAber...

Trotz des Timerbausteins der die gleichen Infos hat wie die anderen Timerbausteine, gibt dieser ein TRUE Signal aus, obwohl Zeit es eigentlich nicht ausgeben soll.

ich habe dir das projekt einmal hochgeladen, kannst du mal schauen ob du den fehler siehst ?

Also der Baustein Analogchanger reagiert falsch......

ich seh den wald vor lauter bäumen nicht mehr....


----------



## Dr.MirakulixX (7 Juli 2015)

Muss dich noch ein paar Tage vertrösten. Aber schaue es mir gerne an.


----------



## nexer (7 Juli 2015)

Ja ist nicht schlimm, schön dass du es dir überhaupt anschaust.

Danke Dir !


----------



## Mobi (8 Juli 2015)

Schön, wären auch mal Screenshots. Nicht jeder kann den Anhang öffnen


----------



## nexer (8 Juli 2015)

Du kannst dir das Tool ja runterladen, ist kostenlos ;-)

aber anbei der Screenshot.

Dort kann man erkennen, dass der Timer "Analogchanger" eine Startzeit von 8:40 hat und eine Dauer von 2h. Da zur Screenshotzeit aber 19:30 waren, sollte der Ausgang FALSE sein, er ist aber TRUE.....


----------



## Mobi (8 Juli 2015)

Muss man bei TOD nicht führende Nullen mitschreiben? Also TOD#08:40:00.


----------



## nexer (8 Juli 2015)

Scheinbar nicht, denn die vorderen Timer funktionieren einwandfrei


----------



## Dr.MirakulixX (23 Juli 2015)

Wie schaut's hier aus ? Bist du weiter gekommen ?


----------



## nexer (23 Juli 2015)

Sporadisch funktioniert der eine Baustein immer noch nicht. hab dann den timer gewechselt jetzt geht es.

ich hab aber noch eine andere sache. 

Ich habe einen Baustein, der den Analogen Wert ausgibt. Diese Ausgabe soll aber an 2 verschiedene ausgänge gleichzeitig ausgegeben werden. wie kann ich das realisieren ?


----------



## Mobi (23 Juli 2015)

Eine Verzweigung???


----------



## nexer (23 Juli 2015)

Wie du es nennen willst weis ich nicht, fakt ist ich habe einen Ausgabewert und muss diesen parallel an 2 Anschlüsse ausgeben. Mir ist halt nur nicht klar wie ich das in codesys realisieren kann.


----------



## Mobi (23 Juli 2015)

Dann verbinde ihn einfach mit den 2 Ausgängen.
Oder wenn es in ST ist, weise es den beiden zu.


----------



## nexer (23 Juli 2015)

das probelm daran ist aber, sobald ich den einen ausgang verbunden habe und den zweiten verbinden möchte, wird die erste verbindung gelöscht.


----------



## Mobi (23 Juli 2015)

Zeig mal einen Screenshot.


----------



## nexer (23 Juli 2015)

Ich hab es jetzt noch einmal probiert, komischerweise werden die Daten nun richtig ausgegeben.......

Langsam verwundert mich das ein wenig.... gleiches hatte ich mit dem baustein, komplett gleicher baustein, 4x funktioniert er, beim 5. male reagiert er nicht wie er soll........

Naja hauptsache die ausgabe läuft.....


----------



## nexer (7 August 2015)

Ich hätte zu der Schaltung noch eine Frage.

Und zwar möchte ich zufällig im laufe des tages bestimmte werte an die analoge (0-10v) schnittstelle ausgeben.

wie kann ich dies realisieren, sodass die software innerhalb eines von mir vorgegebenen bereiches mal dimmt für eine vorgegeben zeit ?

Danke schonmal


----------

