Hallo Nils,
eine zeitliche Verzögerung beim hoch und runterzählen (ca.1s) nicht vergessen, sonst geht es ein wenig schnell.
gruß
Markus
Hallo
Wie könnte ich die Zeit in der ich von 1 auf 10 V regle beeinflussen???
Und wie wichtig ist wohl die e-Funktion ???
Sollte man das überhaupt so machen ???
FUNCTION_BLOCK Dimmer
VAR_INPUT
Soll_min: INT; (* 3276 = 1 V *)
Soll_max: INT; (* 32767 = 10 V *)
Istwert: INT;
An_von_Uhr: BOOL;
END_VAR
VAR_OUTPUT
Steuerspannung: INT;
END_VAR
VAR
END_VAR
IF An_von_Uhr AND Istwert < 3276 THEN
Istwert:= 3276;
END_IF
IF An_von_Uhr AND Istwert < Soll_max THEN
Istwert:= Istwert +1;
END_IF
IF An_von_Uhr = FALSE AND Istwert > Soll_min THEN
Istwert:= Istwert - 1;
END_IF
Steuerspannung:= Istwert;
Last edited by Der Nils; 18.12.2008 at 20:25.
Gruß
vom Nils
------------------------------------------------
Wer Rechtschreibfehler findet,darf Sie behalten !
Hallo Nils,
eine zeitliche Verzögerung beim hoch und runterzählen (ca.1s) nicht vergessen, sonst geht es ein wenig schnell.
gruß
Markus
Hi
Wenn 32767 -> 10 Volt und 3276 -> 1 Volt
hab ich nen Regelbereich von 29491.
Im Sekundentakt dauert das schon zulange....?
Wie könnte man den die Zeit einbinden (ST-Befehl)???
Gruß
vom Nils
------------------------------------------------
Wer Rechtschreibfehler findet,darf Sie behalten !
Hallo Nils
Klar! Bei einem Delta (Unterschied, des Regelbereich vor und nach einem Durchlauf deines FB) von nur 1, du kannst, das Delta locker höher setzen.Im Sekundentakt dauert das schon zulange....?
Angenommen der Impuls ist 1Sekunde
Bei deinem Regelbereich von 29491 enspricht dies ungefähr 8 Stunden, bis dein Dimmer den SollWert_Max erreicht hat.
Jetzt ist rechen angesagt...
Willst du z.B. in einer Stunde hochdimmen, dann sie dein Delta etwa so aus:
1 Stunde = 60 Min = 3600 Sekunden
Delta = 29491 / 3600 => also ca. 8
In Oscat gibts glaubs eine Timer....Wie könnte man den die Zeit einbinden (ST-Befehl)???
Gruss
Roman
Hallo Nils
Bei mir würde dein FB, etwa so aussehen....
Deklaration
Code:FUNCTION_BLOCK Dimmer VAR_INPUT Soll_min : INT := 3276; (* 3276 = 1 V *) Soll_max : INT;:= 32767; (* 32767 = 10 V *) Istwert : INT; Dimmzeit : INT; (*Zeit die der Dimmer braucht / in Minuten*) An_von_Uhr : BOOL; END_VAR VAR_OUTPUT Steuerspannung : INT; END_VAR VAR Delta : INT := 0; (*Um so viel wird jede Sekunde die Regelgrösse erhöht*) Impuls : BOOL; Flanke : R_TRIG; (*Detektor für eine ansteigende Flanke, in standard.lib von TwinCat*) Impulsglied : TP; (*Impulsgeber, in standard.lib von TwinCat*) BoolImpuls : BOOL; (*Für den Impuls*) END_VARBei mir dreht das so....Code:(*Berechnung des Delta*) Delta := ((Soll_max - Soll_min) / (Dimmzeit * 60)); (* " * 60 * weil wird das Delta pro Sekunde wissen wollen*) (*Impuls erzeugen*) IF NOT Impulsglied.Q THEN BoolImpuls := NOT BoolImpuls; Impulsglied( IN := FALSE ); END_IF Impulsglied( IN := TRUE, PT := T#500ms ); (*PT ist die Hälfte des eigentlichen Impuls*) Flanke( CLK := BoolImpuls, Q => Impuls); (*Erst jetzt haben wir, mit Impuls, einen richtigen Impuls*) IF Impuls THEN (*Der Impuls kommt*) IF An_von_Uhr THEN (*An_von_Uhr ist True*) IF Istwert < Soll_min THEN (*Der Istwert ist kleiner als er solte, dann*) Steuerspannung := Soll_min; (*Steuerspannung gleich dem SollWert_Min*) ELSIF (Istwert + Delta) < Soll_max THEN (*Ist der (Istwert + Delta => Überlaufschutz) kleiner als der Maxwert, dann*) Steuerspannung := Istwert + Delta; (*Steuerspannung gleich dem (Istwert + Delta)*) ELSE (*sonst*) Steuerspannung := Soll_max; (*Steuerspannung gleich dem SolWert_Max*) END_IF ELSE (*An_von_Uhr ist FALSE*) IF (Istwert - Delta) > Soll_min THEN (*Der (Istwert - Delta => Unterlaufschutz) ist grösser als der Maxwert, dann*) Steuerspannung:= Istwert - Delta; (*Steuerspannung gleich dem (Istwert - Delta)*) ELSE (*sonst*) Steuerspannung:= Soll_min; (*Steuerspannung gleich dem SollWert_Min*) END_IF END_IF END_IF
Habe beim Test die Dimmerzeit auf 2 (Minuten) gesetzt.
Gruess
Roman
HI
@BRRO87
hab das Prg.mal getestet is SUPER
aber ich hatte das selbe Problem wi mit meinen diversen Prog's ....wenn ich in größeren Sritten erhöhe bleib er beim Max oder Min nicht stehen sonndern fängt wieder von forne an.
die Berechnung des delta's ---echt super da bin ich noch Meilen weit weg.
Gruß
vom Nils
------------------------------------------------
Wer Rechtschreibfehler findet,darf Sie behalten !
Hallo Nils
Freut mich, das bei dir läuft...
Zu deinem Problem:
Hast du den FB komplett übernommen.. so wie ich in oben gepostet habe?(Muss ich wissen um dein Problem nachzuvollziehen!)
Eigentlich solte dies abgefangen werden....unteranderm hier...
Das Problem das du hier bringst, ist meist das gleich, und zwar man vergisst das der Datentyp eine Obergrenze hat. Und bei Überschreitung dieswer Grenze fängt er wieder von vorne an.Code:IF Istwert < Soll_min THEN (*Der Istwert ist kleiner als er solte, dann*) Steuerspannung := Soll_min; (*Steuerspannung gleich dem SollWert_Min*) ELSIF (Istwert + Delta) < Soll_max THEN (*Ist der (Istwert + Delta => Überlaufschutz) kleiner als der Maxwert, dann*) Steuerspannung := Istwert + Delta; (*Steuerspannung gleich dem (Istwert + Delta)*) ELSE (*sonst*) Steuerspannung := Soll_max; (*Steuerspannung gleich dem SolWert_Max*)
Der Int definiert sich ja folgend... (ist aus der TwinCathilfe)
Typ Untergrenze Obergrenze Speicherplatz
INT -32768 32767 16 Bit
Angenommen unser Wert ist im Mom "32760" und wir erhöhen diesen Wert um "10", dann überschreiten wird ja die Obergrenze um "3", und unser Ergebnis ist nun "-32766"
Daher musst du dies abfangen, ich mache diese oben so...
In der IF abfrage addierre ich dem zu erhöhenden Wert schon mit dem Delta un frage dan ab, ob dies schon höher als die Obergrenze ist (bei deinem FB, sind ja Obergrenze und Max, des Outputs, dasselbe!) Wenn ja dan wird die IF- anweisung nicht mehr ausgeführt, weill dies ja zum Überlaufen führen würde!
Denke mal, das wird dein Fehler in allen Fb's beheben.Code:ELSIF (Istwert + Delta) < Soll_max THEN Steuerspannung := Istwert + Delta; ELSE
Zur Sicherheit kannst du ja mal noch einen anderen FB posten....oder auch Exportieren und mir Mailen....... (würde wahrscheinlich am einfachsten gehen!)
Hoffe konnte dir weiter helfen
Gruess
Roman
Last edited by Brro87; 22.12.2008 at 14:48.
Hi
hab endlich Zeit gehabt den Fehler zu suchen
der Wert ist immer über die 32767 hinaus gelaufen... dann -32XXX also auch kleiner hab das dann so gemacht
ELSIF (Steuerspannung + Delta) < Soll_max AND
(Steuerspannung + Delta) > Soll_min THEN
Steuerspannung := Steuerspannung + Delta;
ELSE
Steuerspannung := Soll_max;
Jetz läuft das vom Feinsten !!
Ach noch was ....Wie baut man son ,,CODE,, Fenster ein ???
Gruß
vom Nils
------------------------------------------------
Wer Rechtschreibfehler findet,darf Sie behalten !
Ganz einfach, mit
dem vorvorletzten ICON #
bzw. dem Schlüsselwort "[kode]" und "[/kode]". Statt k nimmst Du c, kann ich aber nicht machen, da sonst das Code-Fenster kommt.
LG
Hallo
Ich hab noch ne Frage zum Ablauf...
Wenn der Wert auf 3276 runter ist soll die Lampe ganz abschalten.
Ich hab festgestellt das die ,,Dimmzeit,, nicht als nachlauf reicht.
bzw Er etwas länger braucht um runter zu tackten als die eingestellte Zeit.
Ich hab dann nicht mal 60 sondern mal 70 gerechnet.
Is aber nich so elegant...
Code:FUNCTION_BLOCK Dimmer2 VAR_INPUT Soll_min : INT; (* 3276 = 1 V *) Soll_max : INT; (* 32767 = 10 V *) Dimmzeit : INT; (*Zeit die der Dimmer braucht / in Minuten*) An_von_Uhr : BOOL; END_VAR VAR_OUTPUT Steuerspannung : INT; Lampe :BOOL; END_VAR VAR Delta : INT ; (*Um so viel wird jede Sekunde die Regelgrösse erhöht*) Impuls : BOOL; Flanke : R_TRIG; (*Detektor für eine ansteigende Flanke, in standard.lib von TwinCat*) Impulsglied : TP; (*Impulsgeber, in standard.lib von TwinCat*) BoolImpuls : BOOL; (*Für den Impuls*) Nachlauf :TOF; (*Nachlauf zum abschalten der Lampe*) N_Zeit: TIME; (*errechnete Nachlaufzeit*) END_VARDanke an alle die bis jetzt mitgeholfen .....Code:(*Berechnung des Delta*) Delta := ((Soll_max - Soll_min) / (Dimmzeit * 60)); (* " * 60 * weil wird das Delta pro Sekunde wissen wollen*) (*Impuls erzeugen*) IF NOT Impulsglied.Q THEN BoolImpuls := NOT BoolImpuls; Impulsglied( IN := FALSE ); END_IF Impulsglied( IN := TRUE, PT := T#500ms ); (*PT ist die Hälfte des eigentlichen Impuls*) Flanke( CLK := BoolImpuls, Q => Impuls); (*Erst jetzt haben wir, mit Impuls, einen richtigen Impuls*) N_Zeit := INT_TO_TIME( Dimmzeit * 1000 ); Nachlauf ( IN := An_von_Uhr , PT :=N_Zeit*70); Lampe:= Nachlauf.Q; IF Impuls THEN (*Der Impuls kommt*) IF An_von_Uhr THEN (*An_von_Uhr ist True*) IF Steuerspannung < Soll_min THEN (*Der Istwert ist kleiner als er solte, dann*) Steuerspannung := Soll_min; (*Steuerspannung gleich dem SollWert_Min*) ELSIF (Steuerspannung + Delta) < Soll_max AND (*Ist der (Istwert + Delta => Überlaufschutz) kleiner als der Maxwert, dann*) (Steuerspannung + Delta) > Soll_min THEN Steuerspannung := Steuerspannung + Delta; (*Steuerspannung gleich dem (Istwert + Delta)*) ELSE (*sonst*) Steuerspannung := Soll_max; (*Steuerspannung gleich dem SolWert_Max*) END_IF ELSE (*An_von_Uhr ist FALSE*) IF (Steuerspannung - Delta) > Soll_min THEN (*Der (Istwert - Delta => Unterlaufschutz) ist grösser als der Maxwert, dann*) Steuerspannung:=Steuerspannung - Delta; (*Steuerspannung gleich dem (Istwert - Delta)*) ELSE (*sonst*) Steuerspannung:= Soll_min; (*Steuerspannung gleich dem SollWert_Min*) END_IF END_IF END_IF![]()
Gruß
vom Nils
------------------------------------------------
Wer Rechtschreibfehler findet,darf Sie behalten !
Bookmarks