veränderte Version von ACTUATOR_3P

Begonnen von Richardt, 13. September 2011, 01:57:52

Vorheriges Thema - Nächstes Thema

0 Mitglieder und 1 Gast betrachten dieses Thema.

Richardt

Hallo,

ich habe den ACTUATOR_3P an meine Bedürfnisse angepasst. So fährt der Aktor bei einem Neustart nicht auf und es gibt eine Totzeit zwischen den Richtungswechsel. Vielleicht kann den ja noch jemand gebrauchen. Zumal die aktuelle Version einen Fehler hat (Wie ich in einem anderen Beitrag schon geschrieben habe).

ACHTUNG: Der Funktionsbaustein ist aber noch nicht ausgiebig getestet! Werde das aber in den nächsten Tagen machen.


FUNCTION_BLOCK ACTUATOR_3P
VAR_INPUT
IN : BYTE := 0; (* Eingangssignal *)
MIN_DELTA : BYTE := 0; (* Mindestveränderung *)
END_POS_UP : BOOL := FALSE; (* Endlagenschalter Auf *)
END_POS_DOWN : BOOL := FALSE; (* Endlagenschalter Ab *)
END_VAR
VAR_INPUT RETAIN PERSISTENT
T_RUN : TIME := t#60s; (* Laufzeit von einer Endlage zur Anderen *)
T_LOCK : TIME := t#1s; (* Totzeit zwischen Richtungswechsel *)
END_VAR
VAR_OUTPUT
UP : BOOL := FALSE; (* Auffahren *)
DOWN : BOOL := FALSE; (* Zufahren *)
POS : BYTE := 0; (* berechnete Position *)
END_VAR
VAR
INIT : BOOL := TRUE;

(* Funktionsbausteine *)
RAMP : _RMP_NEXT;
INTERLOCK : INTERLOCK;
END_VAR

(* #######################################################################################################

Funktionsbaustein 3-Punkt-Aktor

fährt einen 3-Punkt Aktor (Auf/Ab/Halt) auf die über IN (Wertebereich 0...255) angegebene Position. Dazu muss die
Laufzeit zwischen den beiden Endlagen über T_RUN angegeben und die beiden Endlagenschalter angeschlossen
werden.

Über den Ausgang POS wird die aktuelle errechnete Position des Aktors ausgegeben. Jedesmal wenn der Aktor eine
Endlage erreicht wird die errechnete Position mit dem Istwert überschrieben. So wird auch wenn die Position 0 oder
255 angefahren werden soll, der Aktor so lange Verfahren bis er seine Endlage tatsächlich erreicht hat. Durch diese
Maßnahmen wird eine sehr genaue Positionierung des Aktors erreicht.

Zwischen den Richtungswechseln wird die Totzeit T_LOCK abgewartet. Damit der Aktor nicht auch bei kleinen Wertänderungen
verfahren wird, kann über MIN_DELTA die Mindestwertveränderung (Wertebereich 0...255) von IN gegenüber der aktuellen
Position angegeben werden. Die Endlagen werden aber immer angefahren.

Nach einem Neustart der SPS wird eine Referenzfahrt durchgeführt. Der Aktor wird solange zugefahren, bis er seine untere
Endlage erreicht hat. Anchließend wechselt er in den normalen Betriebsmodus und fährt auf den IN-Wert.

Der Baustein ist an den Funktionsbaustein ACTUATOR_3P Version 2.0 aus OSCAT_BUILDING Version 1.00 angelehnt.

####################################################################################################### *)

(* ------------------------- Werte an Funktionsbausteine übergeben ------------------------- *)
(* Anstiegs- und Abfallzeiten der Rampe einstellen *)
ramp.TF := T_RUN;
ramp.TR := T_RUN;

(* Umschaltpause *)
RAMP.TL := T_LOCK;
INTERLOCK.TL := REAL_TO_TIME( TIME_TO_REAL(T_LOCK) * 0.9 ); (* Damit Totzeit noch unter der der Rampe bleibt
und somit POS nicht verfälscht. *)

(* ------------------------- Referenzfahrt------------------------- *)
(* nach einem Neustart bekannten Punkt anfahren *)
IF INIT THEN
IN := 0;
IF END_POS_DOWN THEN
INIT := FALSE;
END_IF
END_IF

(* ------------------------- Endposition auswerten------------------------- *)
IF END_POS_DOWN THEN
POS := 0;
ELSIF END_POS_UP THEN
POS := 255;
END_IF;

(* ------------------------- Mindestveränderung ------------------------- *)
(* Aktor nur Verfahren wenn Mindestveränderung gewährleistet ist oder Endlage angefahren werden soll *)
IF ( (IN >= (POS - MIN_DELTA)) AND (IN <= (POS + MIN_DELTA))  AND (IN <> 0) AND (IN <> 255) ) THEN
IN := POS;
END_IF

(* ------------------------- Rampe aufrufen ------------------------- *)
RAMP.IN := IN;
ramp(OUT := POS);

(* ------------------------- Ausgänge setzen ------------------------- *)
IF IN = 0 AND NOT END_POS_DOWN THEN
(* zufahren bis zur Endlage *)
INTERLOCK.I1:= FALSE;
INTERLOCK.I2:= TRUE;
ELSIF IN = 255 AND NOT END_POS_UP THEN
(* auffahren bis zur Endlage *)
INTERLOCK.I1 := TRUE;
INTERLOCK.I2 := FALSE;
ELSE
INTERLOCK.I1:= ramp.UP;
INTERLOCK.I2:= ramp.DN;
END_IF

(* ------------------------- Totzeit und Verriegelung ------------------------- *)
(* wird nur beim Fahren auf eine Endlage benötigt, da sonst bereits eine Totzeit in Funktionsbaustein
der Rampe enthalten *)
INTERLOCK();
UP := INTERLOCK.Q1;
DOWN := INTERLOCK.Q2;