-> Hier kostenlos registrieren
Hallo,
ich versuche eine Rampe zu projektieren bei einer Anlage die hebt und senkt. Das Ziel ist wenn ich die Maschine bediene und eine der Tasten zum Heben oder Senken loslasse, dass die Maschine weiterhebt oder entsprechend senkt und sanft abbremst. Die Werte die ich in den zwei Arrays kriege machen keinen Sinn. Woran könnte der Fehler liegen?
-------------------------------------------------------------------------------------------
FUNCTION_BLOCK Taste_Loslassen_Kurve
VAR_INPUT
ENABLE: BOOL;
i_W1_Winkel: REAL;
i_W2_Winkel: REAL;
i_T_Heben: BOOL;
i_T_Senken: BOOL;
i_W_Max_Heben: REAL;
i_W_Min_Senken: REAL;
i_Zeit_bis_Stop: TIME;
i_Heben_Modus: BOOL;
i_Senken_Modus: BOOL;
i_Akt_V_Heben: REAL;
i_Akt_V_Senken: REAL;
END_VAR
VAR_OUTPUT
q_Berechnete_Geschwindigkeit: REAL;
q_Taste_Losgelassen_BewAnf_Heben: BOOL;
q_Taste_Losgelassen_BewAnf_Senken: BOOL;
END_VAR
VAR
R_TRIG_Heben_Taste_Losgelassen: R_TRIG;
R_TRIG_Senken_Taste_Losgelassen: R_TRIG;
Counter_Heben: INT;
Counter_Senken: INT;
TP_Heben: TP;
TP_Senken: TP;
Geschwindigkeiten: ARRAY[1..i_Kurve_Anzahl_Punkte] OF REAL;
Zeitpunkte: ARRAY[1..i_Kurve_Anzahl_Punkte] OF INT;
END_VAR
VAR_STAT
Momentaufnahme_V_Heben_Senken: REAL;
END_VAR
VAR_INPUT CONSTANT
i_Kurve_Anzahl_Punkte: INT;
END_VAR
-------------------------------------------------------------------------------------------
IF ENABLE THEN
(*-----------------------------------------Heben Taste Losgelassen------------------------------------------------------*)
IF NOT q_Taste_Losgelassen_BewAnf_Senken THEN
TP_Heben(IN := i_Heben_Modus AND NOT i_T_Heben, PT := i_Zeit_bis_Stop);
q_Taste_Losgelassen_BewAnf_Heben := TP_Heben.Q AND NOT (i_W1_Winkel > i_W_Max_Heben OR i_W2_Winkel > i_W_Max_Heben);
R_TRIG_Heben_Taste_Losgelassen(CLK := TP_Heben.Q);
IF R_TRIG_Heben_Taste_Losgelassen.Q THEN
Momentaufnahme_V_Heben_Senken := i_Akt_V_Heben;
END_IF
FOR Counter_Heben := 1 TO i_Kurve_Anzahl_Punkte BY 1 DO
Zeitpunkte[Counter_Heben] := Counter_Heben * TIME_TO_INT(TP_Heben.PT / i_Kurve_Anzahl_Punkte);
Geschwindigkeiten[Counter_Heben] := Momentaufnahme_V_Heben_Senken - Counter_Heben * (Momentaufnahme_V_Heben_Senken / i_Kurve_Anzahl_Punkte);
END_FOR
IF q_Taste_Losgelassen_BewAnf_Heben THEN
FOR Counter_Heben := i_Kurve_Anzahl_Punkte TO 1 BY -1 DO
IF TIME_TO_INT(TP_Heben.ET) >= Zeitpunkte[Counter_Heben] THEN
q_Berechnete_Geschwindigkeit := Geschwindigkeiten[Counter_Heben];
EXIT;
END_IF
END_FOR
END_IF
END_IF
(*-----------------------------------------Senken Taste Losgelassen-----------------------------------------------------*)
IF NOT q_Taste_Losgelassen_BewAnf_Heben THEN
TP_Senken(IN := i_Senken_Modus AND NOT i_T_Senken, PT := i_Zeit_bis_Stop);
q_Taste_Losgelassen_BewAnf_Senken := TP_Senken.Q AND NOT (i_W1_Winkel < i_W_Min_Senken AND i_W2_Winkel < i_W_Min_Senken);
R_TRIG_Senken_Taste_Losgelassen(CLK := TP_Senken.Q);
IF R_TRIG_Senken_Taste_Losgelassen.Q THEN
Momentaufnahme_V_Heben_Senken := i_Akt_V_Senken;
END_IF
FOR Counter_Senken := 1 TO i_Kurve_Anzahl_Punkte BY 1 DO
Zeitpunkte[Counter_Senken] := Counter_Senken * TIME_TO_INT(TP_Senken.PT / i_Kurve_Anzahl_Punkte);
Geschwindigkeiten[Counter_Senken] := Momentaufnahme_V_Heben_Senken - Counter_Senken * (Momentaufnahme_V_Heben_Senken / i_Kurve_Anzahl_Punkte);
END_FOR
IF q_Taste_Losgelassen_BewAnf_Senken THEN
FOR Counter_Senken := i_Kurve_Anzahl_Punkte TO 1 BY -1 DO
IF TIME_TO_INT(TP_Senken.ET) >= Zeitpunkte[Counter_Senken] THEN
q_Berechnete_Geschwindigkeit := Geschwindigkeiten[Counter_Senken];
EXIT;
END_IF
END_FOR
END_IF
END_IF
END_IF
ich versuche eine Rampe zu projektieren bei einer Anlage die hebt und senkt. Das Ziel ist wenn ich die Maschine bediene und eine der Tasten zum Heben oder Senken loslasse, dass die Maschine weiterhebt oder entsprechend senkt und sanft abbremst. Die Werte die ich in den zwei Arrays kriege machen keinen Sinn. Woran könnte der Fehler liegen?
-------------------------------------------------------------------------------------------
FUNCTION_BLOCK Taste_Loslassen_Kurve
VAR_INPUT
ENABLE: BOOL;
i_W1_Winkel: REAL;
i_W2_Winkel: REAL;
i_T_Heben: BOOL;
i_T_Senken: BOOL;
i_W_Max_Heben: REAL;
i_W_Min_Senken: REAL;
i_Zeit_bis_Stop: TIME;
i_Heben_Modus: BOOL;
i_Senken_Modus: BOOL;
i_Akt_V_Heben: REAL;
i_Akt_V_Senken: REAL;
END_VAR
VAR_OUTPUT
q_Berechnete_Geschwindigkeit: REAL;
q_Taste_Losgelassen_BewAnf_Heben: BOOL;
q_Taste_Losgelassen_BewAnf_Senken: BOOL;
END_VAR
VAR
R_TRIG_Heben_Taste_Losgelassen: R_TRIG;
R_TRIG_Senken_Taste_Losgelassen: R_TRIG;
Counter_Heben: INT;
Counter_Senken: INT;
TP_Heben: TP;
TP_Senken: TP;
Geschwindigkeiten: ARRAY[1..i_Kurve_Anzahl_Punkte] OF REAL;
Zeitpunkte: ARRAY[1..i_Kurve_Anzahl_Punkte] OF INT;
END_VAR
VAR_STAT
Momentaufnahme_V_Heben_Senken: REAL;
END_VAR
VAR_INPUT CONSTANT
i_Kurve_Anzahl_Punkte: INT;
END_VAR
-------------------------------------------------------------------------------------------
IF ENABLE THEN
(*-----------------------------------------Heben Taste Losgelassen------------------------------------------------------*)
IF NOT q_Taste_Losgelassen_BewAnf_Senken THEN
TP_Heben(IN := i_Heben_Modus AND NOT i_T_Heben, PT := i_Zeit_bis_Stop);
q_Taste_Losgelassen_BewAnf_Heben := TP_Heben.Q AND NOT (i_W1_Winkel > i_W_Max_Heben OR i_W2_Winkel > i_W_Max_Heben);
R_TRIG_Heben_Taste_Losgelassen(CLK := TP_Heben.Q);
IF R_TRIG_Heben_Taste_Losgelassen.Q THEN
Momentaufnahme_V_Heben_Senken := i_Akt_V_Heben;
END_IF
FOR Counter_Heben := 1 TO i_Kurve_Anzahl_Punkte BY 1 DO
Zeitpunkte[Counter_Heben] := Counter_Heben * TIME_TO_INT(TP_Heben.PT / i_Kurve_Anzahl_Punkte);
Geschwindigkeiten[Counter_Heben] := Momentaufnahme_V_Heben_Senken - Counter_Heben * (Momentaufnahme_V_Heben_Senken / i_Kurve_Anzahl_Punkte);
END_FOR
IF q_Taste_Losgelassen_BewAnf_Heben THEN
FOR Counter_Heben := i_Kurve_Anzahl_Punkte TO 1 BY -1 DO
IF TIME_TO_INT(TP_Heben.ET) >= Zeitpunkte[Counter_Heben] THEN
q_Berechnete_Geschwindigkeit := Geschwindigkeiten[Counter_Heben];
EXIT;
END_IF
END_FOR
END_IF
END_IF
(*-----------------------------------------Senken Taste Losgelassen-----------------------------------------------------*)
IF NOT q_Taste_Losgelassen_BewAnf_Heben THEN
TP_Senken(IN := i_Senken_Modus AND NOT i_T_Senken, PT := i_Zeit_bis_Stop);
q_Taste_Losgelassen_BewAnf_Senken := TP_Senken.Q AND NOT (i_W1_Winkel < i_W_Min_Senken AND i_W2_Winkel < i_W_Min_Senken);
R_TRIG_Senken_Taste_Losgelassen(CLK := TP_Senken.Q);
IF R_TRIG_Senken_Taste_Losgelassen.Q THEN
Momentaufnahme_V_Heben_Senken := i_Akt_V_Senken;
END_IF
FOR Counter_Senken := 1 TO i_Kurve_Anzahl_Punkte BY 1 DO
Zeitpunkte[Counter_Senken] := Counter_Senken * TIME_TO_INT(TP_Senken.PT / i_Kurve_Anzahl_Punkte);
Geschwindigkeiten[Counter_Senken] := Momentaufnahme_V_Heben_Senken - Counter_Senken * (Momentaufnahme_V_Heben_Senken / i_Kurve_Anzahl_Punkte);
END_FOR
IF q_Taste_Losgelassen_BewAnf_Senken THEN
FOR Counter_Senken := i_Kurve_Anzahl_Punkte TO 1 BY -1 DO
IF TIME_TO_INT(TP_Senken.ET) >= Zeitpunkte[Counter_Senken] THEN
q_Berechnete_Geschwindigkeit := Geschwindigkeiten[Counter_Senken];
EXIT;
END_IF
END_FOR
END_IF
END_IF
END_IF