1 Taste mit 2 Funktionen

Peter12

Level-1
Beiträge
19
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo


bin relativ neu in der SPS, vor 10 Jahren mal bissl mit siemens steuerung gearbeitet.
Ich tue mich zurzeit mit twincat 2 auseinander setzten und ich bin jetzt an ein Punkt wo nicht weiter.
Und zwar wie oben schon geschrieben. Brauch ich ein Befehl das ich 1 taste mit 2 Funktionen bekomme.


Funktion:
Ich hab momentan ein Taster mit dem ich ein wert steigere. da ich aber keine lust habe die taste immer wieder zu drücken, möchte ich das es z.B. nach 1s gedrückthalten der taste das wert steigt, aber nur solange ich die taste gedrückt halte.


Wäre super von euch das ihr mir hilft. Danke


Ps. bitte den Befehl in Strukturiertem Text


Gruß
 
Moin Moin,

das wirst du dir selber Programmieren müssen. Ich habe das auch schon gemacht. Ich Werte einfach die Zeit (wie lange wird gedrückt) aus. Kurzes drücken <= z.B. 250ms ist ein Klick. (Wert +1) wird länger gedrückt. Wird ein Impulsgeber aktiviert der z.B. alle 50ms Wert + 1 ausführt.

Ich hoffe ich konnte dir helfen =)


Code:
VAR_INPUT
    bUP:            BOOL;
    bDwn:             BOOL;
    iMin:                INT := -100;
    iMax :             INT := 100;
END_VAR

VAR_IN_OUT
     iValue :             INT;
END_VAR

VAR
    tpTakt:             TP;
    tTakt:             TIME;
    tonSpeed:         TON;
    bUPs:            BOOL;
    bDwns:             BOOL;
    bV_tpTakt:        BOOL;
    SpeedHighTime:    TIME := t#2000ms;
    SpeedHigh:        TIME := t#50ms;
    SpeedLow:        TIME := t#250ms;
    Schrittweite:        INT := 1;
END_VAR

(* Ab hier PRG *)
(*______________________________________________________*)
(* Min- / Maxwerte an IN_OUT iValue uebergeben fuer alle Faelle *)
IF iValue < iMin THEN
     iValue :=  iMin;
ELSIF  iValue > iMax THEN
     iValue :=  iMax;
END_IF;    (* IF iValue < iMin THEN *)

(*______________________________________________________*)
(* Aufruf Timer - Speed High or Low - Taktgeber *)

tonSpeed ( in := bUP OR bDwn , pt := SpeedHighTime );    (* t#2000ms - wie Lange wurde die Taste betaetigt *)

IF tonSpeed.Q THEN    (* Taste wurde langer als TimeX gedrueckt also schneller Takt *)
    tTakt := SpeedHigh;
ELSE
    tTakt := SpeedLow;
END_IF;    (* IF tonSpeed.Q THEN *)

(*______________________________________________________*)
(* Ein Impuls wenn 1xgedrückt*)
IF (bUp OR bDwn) AND NOT tpTakt.Q THEN
    bV_tpTakt := TRUE;
ELSE
    bV_tpTakt := FALSE;
END_IF; (* IF (bUp OR bDwn) AND NOT tpTakt.Q THEN*)

(* Impuls mit der Zeitlänge von pt.= tTakt erzeugen*)
tpTakt ( in := bV_tpTakt , pt := tTakt );

IF bUp THEN
    bUps := TRUE;    (* Hochzaehlen *)
END_IF;    (* IF bUp THEN *)

IF bDwn THEN
    bDwns := TRUE;    (* Runterzaehlen *)
END_IF;    (* IF bDwn THEN *)

IF bUPs AND NOT tpTakt.Q AND ((iValue +  SchrittWeite) <=  iMax) THEN
    iValue     := iValue + SchrittWeite;
    bUps     := FALSE;
ELSIF bDwns AND NOT tpTakt.Q AND   ((iValue - SchrittWeite) >=  iMin)  THEN
    iValue     := iValue - SchrittWeite;
    bDwns     := FALSE;
ELSIF NOT tpTakt.Q THEN
    bDwns     := FALSE; bUps := FALSE;
END_IF;



MfG Hendrik
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke für die schnelle Antwort.

ist doch bischen mehr als ich gedacht habe.
Ich hab mal den code übernommen und meinte daten reingeschrieben.
Allerdings muss ich sagen momentan macht die streuerung immer noch + oder - 1 d.h. muss immer noch drücken.
Muss mich auch mit dem Code auseinader setzen bestimmt hab ich da was übersehen.

Danke nochmals
 
Zuviel Werbung?
-> Hier kostenlos registrieren
So jetzt läuft fast alles,
Habe bUPs und bDwns weg gelassen. Hatte gedacht das die doppelt drin sind, aber war net so hab das ´s überlesen :lol:

Vielen Dank Hendrik

Aber ein kleines Problem habe ich noch. Wenn ich die Steuerung neu starte, ist der Wert bei 100% (ist normal). Wenn ich dann den Wert verringern will, geht es nicht. Muss zuerst auf + drücken dann springt der Wert auf 1% erst dann geht alles wieder. Immer nach dem Neustart
 
Hast du die Min und Max Einstellungen richtig beachtet?

Ich hatte mal das problem das die VAR der Taste nicht mehr FALSE wurde. Habe dann Sicherheitshalber nach einem Seiten Wechsel die Variable auf FALSE gesetzt und bei einigen Aktionen usw.

Wenn das nichts gebracht hat musst du noch mal deinen CODE herzeigen =) Auch mit aufruf im PRG

MfG Hendrik
 
Also ich komm da nicht weiter, weist nicht wo der Fehler drin ist.
das beim neustart bekomme ich nicht weg und ich habe das erst heut morgen gemerkt das die Zeit (tonSpeed ( in := bUP OR bDwn , pt := SpeedHighTime ); (* t#2000ms - wie Lange wurde die Taste betaetigt *)) geht auch irgendwie nicht. der macht sofort die hoch zählung und wenn ich nur mal kurz die taste betätige überspringt er dann gleich 2-3 ausser ich stelle es auf 1s :)
Ich schmeiss mal mein code plus den alten mal rein hoff das ich nichts vergessen hab.
Sorry wusste nicht wie man so ein extra fenster erstellt.
Global Variables
(*Drehmoment in % für 4 verschiedene anzeigen*)
g_nTorqueLimit_1 : INT := 1000 ;
g_nTorqueLimit_2 : INT := 1000 ;
g_nTorqueLimit_3 : INT := 800 ;
g_nTorqueLimit_4 : INT := 800 ;
(*Max & Min. Wert in % & Schrittweite 1% & 5%*)
g_nTorqueMax :INT := 1000;
g_nTorqueMin : INT := 10;
g_nTorqueStep : INT := 10;
g_nTorqueStep50 : INT := 50;
(*Taster (X für alte version mit 5 Schrittweite*)
g_b1Plus : BOOL ; g_b2Plus : BOOL ;
g_b1Minus : BOOL ; g_b2Minus : BOOL ;
g_b1PlusX : BOOL ; g_b2PlusX : BOOL ;
g_b1MinusX : BOOL; g_b2MinusX : BOOL ;
g_b3Plus : BOOL ; g_b4Plus : BOOL ;
g_b3Minus : BOOL ; g_b4Minus : BOOL ;
g_b3PlusX : BOOL ; g_b4PlusX : BOOL ;
g_b3MinusX : BOOL ; g_b4MinusX : BOOL ;
Program Variables
PROGRAM PRG_Set_5
(*VAR_IN_OUT
Summ : INT;
END_VAR*)
VAR
Summ : INT ;
tpTakt: TP:
tTakt: TIME;
tonSpeed: TON;
bUPs: BOOL;
bDwns: BOOL;
bV_tpTakt: BOOL;
SpeedHighTime: TIME := t#5000ms;
SpeedHigh: TIME := t#1000ms;
SpeedLow: TIME := t#1000ms;
END_VAR
VAR_INPUT
bExecute :BOOL;
END_VAR Summ : INT ;
Program Neu
IF bExecute AND g_bActiveSettings = 5 THEN
IF Summ < g_nTorqueMin THEN
Summ := g_nTorqueMin;
ELSIF
Summ > g_nTorqueMax THEN
Summ := g_nTorqueMax;
END_IF;
tonSpeed ( IN := g_b1Plus OR g_b1Minus , PT := SpeedHighTime);
IF tonSpeed.Q THEN
tTakt := SpeedHigh ;
ELSE
tTakt := SpeedLow;
END_IF;
IF (g_b1Plus OR g_b1Minus) AND NOT tpTakt.Q THEN
bV_tpTakt := TRUE;
ELSE
bV_tpTakt := FALSE;
END_IF;
tpTakt ( IN := bV_tpTakt , PT := tTakt);
IF g_b1Plus THEN
bUPs := TRUE;
END_IF;
IF g_b1Minus THEN
bDwns := TRUE;
END_IF;
IF bUps AND NOT tptakt.Q AND ((Summ + g_nTorqueStep) <= g_nTorqueMax ) THEN
Summ := Summ + g_nTorqueStep;
g_nTorqueLimit_1 := Summ;
bUps := FALSE ;
ELSIF
bDwns AND NOT tpTakt.Q AND (( Summ - g_nTorqueStep) >= g_nTorqueMin ) THEN
Summ := Summ - g_nTorqueStep;
g_nTorqueLimit_1 := Summ;
bDwns := FALSE ;
ELSIF NOT tpTakt.Q THEN
bDwns := FALSE;
bUps := FALSE;
END_IF;
END_IF
Programm alt
(*Torque 1 A >B*)
IF g_b1Plus THEN
g_b1Plus := FALSE;
Summ := g_nTorqueLimit_1 + g_nTorqueStep ;
IF Summ <= g_nTorqueMax THEN
g_nTorqueLimit_1 := Summ ;
ELSE
g_nTorqueLimit_1 := g_nTorqueMax;
END_IF
END_IF
IF g_b1PlusX THEN
g_b1PlusX := FALSE;
Summ := g_nTorqueLimit_1 + g_nTorqueStep5 ;
IF Summ <= g_nTorqueMax THEN
g_nTorqueLimit_1 := Summ ;
ELSE
g_nTorqueLimit_1 := g_nTorqueMax;
END_IF
END_IF
Usw. für Minus und die anderen 3 Anzeigen
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin,

hast du das Problem lösem können? so auf anhieb fällt mir nur auf das deine VAR "Summ" undefiniert ist bei einem neustart. Ist das so gewollt?

MfG Hendrik
 
Moin,

habe leider immer noch das Problem. Wie meinst du das VAR "Summ" undefiniert ist beim neustart? In Programm Variables ist es doch als INT.
 
Ich tue mir auch denn kopf zerbrechen wieso tonSpeed.Q gleich auf TRUE ist wenn ich + oder - drücke. Der sollte doch erst auf TRUE wenn die Zeit (SpeedHighTime) abgelaufen ist?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi peter,

hast du den TON auch nicht versehentlich als TOF deklariert?
Ein TOF ist eine Abschaltverzögerung, diese wäre direkt TRUE wenn der Eingang TRUE ist.

Flo
 
Mhhmm, puh Schick mal bitte deinen Code so das man ihn besser lesen kann und kopieren kann zum ausprobieren. (mit dem # fügst du einen Code ein )
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
[COLOR=#333333][FONT=Verdana](*Global Variables*)[/FONT][/COLOR]

[COLOR=#333333][FONT=Verdana](*Drehmoment in % für 4 verschiedene anzeigen*)[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]g_nTorqueLimit_1 : INT := 1000 ; [/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]g_nTorqueLimit_2 : INT := 1000 ; [/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]g_nTorqueLimit_3 : INT := 800 ; [/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]g_nTorqueLimit_4 : INT := 800 ; [/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana](*Max & Min. Wert in % & Schrittweite 1% & 5%*)[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]g_nTorqueMax :INT := 1000;[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]g_nTorqueMin : INT := 10;[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]g_nTorqueStep : INT := 10;[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]g_nTorqueStep50 : INT := 50;[/FONT][/COLOR]

[COLOR=#333333][FONT=Verdana](*Taster (X für alte version mit 5 Schrittweite*)[/FONT][/COLOR]

[COLOR=#333333][FONT=Verdana]g_b1Plus : BOOL ; g_b2Plus : BOOL ;[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]g_b1Minus : BOOL ; g_b2Minus : BOOL ;[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]g_b1PlusX : BOOL ; g_b2PlusX : BOOL ;[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]g_b1MinusX : BOOL; g_b2MinusX : BOOL ; [/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]g_b3Plus : BOOL ; g_b4Plus : BOOL ;[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]g_b3Minus : BOOL ; g_b4Minus : BOOL ;[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]g_b3PlusX : BOOL ; g_b4PlusX : BOOL ;[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]g_b3MinusX : BOOL ; g_b4MinusX : BOOL ;[/FONT][/COLOR]


[COLOR=#333333][FONT=Verdana](*Program 5 Variables*)[/FONT][/COLOR]

[COLOR=#333333][FONT=Verdana]PROGRAM PRG_Set_5[/FONT][/COLOR]

[COLOR=#333333][FONT=Verdana](*VAR_IN_OUT[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]Summ : INT;[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]END_VAR*)[/FONT][/COLOR]

[COLOR=#333333][FONT=Verdana]VAR[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]Summ : INT ;[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]tpTakt: TP:[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]tTakt: TIME;[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]tonSpeed: TON;[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]bUPs: BOOL;[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]bDwns: BOOL;[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]bV_tpTakt: BOOL;[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]SpeedHighTime: TIME := t#5000ms;[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]SpeedHigh: TIME := t#1000ms;[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]SpeedLow: TIME := t#1000ms;[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]END_VAR[/FONT][/COLOR]

[COLOR=#333333][FONT=Verdana]VAR_INPUT[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]bExecute :BOOL;[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]END_VAR [/FONT][/COLOR]


[COLOR=#333333][FONT=Verdana](*Programm Neu*)[/FONT][/COLOR]

[COLOR=#333333][FONT=Verdana]IF bExecute AND g_bActiveSettings = 5 THEN[/FONT][/COLOR]

[COLOR=#333333][FONT=Verdana]IF Summ < g_nTorqueMin THEN[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]Summ := g_nTorqueMin;[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]ELSIF[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]Summ > g_nTorqueMax THEN[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]Summ := g_nTorqueMax;[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]END_IF;[/FONT][/COLOR]

[COLOR=#333333][FONT=Verdana]tonSpeed ( IN := g_b1Plus OR g_b1Minus , PT := SpeedHighTime);[/FONT][/COLOR]

[COLOR=#333333][FONT=Verdana]IF tonSpeed.Q THEN[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]tTakt := SpeedHigh ;[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]ELSE[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]tTakt := SpeedLow;[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]END_IF;[/FONT][/COLOR]

[COLOR=#333333][FONT=Verdana]IF (g_b1Plus OR g_b1Minus) AND NOT tpTakt.Q THEN[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]bV_tpTakt := TRUE;[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]ELSE[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]bV_tpTakt := FALSE;[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]END_IF;[/FONT][/COLOR]

[COLOR=#333333][FONT=Verdana]tpTakt ( IN := bV_tpTakt , PT := tTakt);[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]IF g_b1Plus THEN[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]bUPs := TRUE;[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]END_IF;[/FONT][/COLOR]

[COLOR=#333333][FONT=Verdana]IF g_b1Minus THEN[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]bDwns := TRUE;[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]END_IF;[/FONT][/COLOR]

[COLOR=#333333][FONT=Verdana]IF bUps AND NOT tptakt.Q AND ((Summ + g_nTorqueStep) <= g_nTorqueMax ) THEN[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]Summ := Summ + g_nTorqueStep;[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]g_nTorqueLimit_1 := Summ;[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]bUps := FALSE ;[/FONT][/COLOR]

[COLOR=#333333][FONT=Verdana]ELSIF bDwns AND NOT tpTakt.Q AND (( Summ - g_nTorqueStep) >= g_nTorqueMin ) THEN[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]Summ := Summ - g_nTorqueStep;[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]g_nTorqueLimit_1 := Summ;[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]bDwns := FALSE ;[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]ELSIF NOT tpTakt.Q THEN[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]bDwns := FALSE;[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]bUps := FALSE;[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]END_IF;[/FONT][/COLOR]

[COLOR=#333333][FONT=Verdana]END_IF[/FONT][/COLOR]

[COLOR=#333333][FONT=Verdana](*Proram alt*)[/FONT][/COLOR]

[COLOR=#333333][FONT=Verdana](*Torque 1 A >B*)[/FONT][/COLOR]

[COLOR=#333333][FONT=Verdana]IF g_b1Plus THEN[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]g_b1Plus := FALSE;[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]Summ := g_nTorqueLimit_1 + g_nTorqueStep ;[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]IF Summ <= g_nTorqueMax THEN[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]g_nTorqueLimit_1 := Summ ;[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]ELSE[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]g_nTorqueLimit_1 := g_nTorqueMax;[/FONT][/COLOR]

[COLOR=#333333][FONT=Verdana]END_IF[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]END_IF[/FONT][/COLOR]

[COLOR=#333333][FONT=Verdana]IF g_b1PlusX THEN[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]g_b1PlusX := FALSE;[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]Summ := g_nTorqueLimit_1 + g_nTorqueStep5 ;[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]IF Summ <= g_nTorqueMax THEN[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]g_nTorqueLimit_1 := Summ ;[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]ELSE[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]g_nTorqueLimit_1 := g_nTorqueMax;[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]END_IF[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]END_IF[/FONT][/COLOR]

[COLOR=#333333][FONT=Verdana](*Usw. für Minus und die anderen 3 Anzeigen*)[/FONT][/COLOR]
 
Zuletzt bearbeitet:
Moin,

Code:
[COLOR=#333333][FONT=Verdana]VAR[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]Summ : INT ;
...
END_VAR
IF Summ < g_nTorqueMin THEN[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]Summ := g_nTorqueMin;
....[/FONT][/COLOR]

Ist Summ (0) < nTorqueMin dann Summ := 10... Ist das zufällig für dich 1 %. Ich glaube das du dein Summ probleme macht
 
Zurück
Oben