# Taster auf einem Touchscreen programmieren, welchen man auch sperren kann



## lasse (3 Juli 2013)

*Numpad-Programmierung-codesys*

xxxxxxxxxx


----------



## lasse (3 Juli 2013)

xxxxxxxxxxxxxxxxxxx


----------



## KingHelmer (3 Juli 2013)

Musst dein Thema nicht 2 mal erstellen. Es wird schon beantwortet werden


----------



## KingHelmer (3 Juli 2013)

> und gebt keine unnötigen Kommentare ab



Das gehört in diesem Forum zum guten Ton 

Rück mal deinen Code für den Langen tastendruck raus, dann sehen wir was dort nicht funktioniert. 
Mit der Visu kann ich nicht helfen, ich benutze diese nicht/kaum.

Ach, und willst du den Lichtschalter ein- und ausschalten im Sinne von ein- und ausblenden oder willst du das Licht mit diesem Taster ein- und ausschalten?

Gruß Flo


----------



## rostiger Nagel (3 Juli 2013)

KingHelmer schrieb:


> Musst dein Thema nicht 2 mal erstellen. Es wird schon beantwortet werden



Beiträge wurden von der Spamabwehr nicht freigeschaltet, deshalb die doppelpost.
Der User kann nichts dafür. Ich habe die Themen mal zusammengeführt.


----------



## lasse (3 Juli 2013)

xxxxxxxxxx


----------



## Dr.MirakulixX (4 Juli 2013)

Beim langen Tastendruck... Soll bzw. Darf die Taste dann nochmal dein Licht schalten und dann gesperrt werden oder soll erst auf den langen Tastendruck geprüft wenn und wenn der FALSE ist soll geschaltet werden ? Ist deine Visu Taste ein Taster oder wird der Schalter getoggelt ?


----------



## lasse (4 Juli 2013)

xxxxxxxxxx


----------



## StructuredTrash (4 Juli 2013)

Zum ersten Teil Deines Programms: IF THEN ELSE ist die Stärke von ST, das heisst aber nicht, dass ein Programm umso besser wird, je mehr man davon einbaut. Warum nicht einfach

```
IF taster_flanke.Q
THEN
   schaltfkt:=not schaltfkt;
END_IF
```
Zum zweiten Teil: Du musst den Timer-FB auch aufrufen, das würde dann so aussehen:

```
timer(IN:=taster,
         PT:=t#3s);
taster_sperre:=timer.Q;
```
Ich bezweifle aber, dass die gewünschte Funktion so aussieht. Beschreib mal etwas genauer, wie die Tastensperre arbeiten soll.


----------



## lasse (4 Juli 2013)

xxxxxxxxxx


----------



## Dr.MirakulixX (4 Juli 2013)

Ich würde es dann so versuchen 

```
IF taster THEN
timer(IN:=Taster AND NOT timer.Q, PT:=t#3s);
END_IF
IF timer.Q THEN
 taster_sperre:=NOT taster_sperre;
END_IF
```
Dann hast du die selbe struktur wie oben vorgeschlagen


----------



## StructuredTrash (4 Juli 2013)

Die Sperre soll also genauso funktionieren wie die Schaltfunktion, nur eben nicht sofort beim Druck auf den Taster, sondern erst nach 3 Sekunden. Wie sowas geht, hast Du ja schon im ersten Teil Deines Programms geschrieben. Dann brauchst Du doch nur den Ausgang des Timer-FB's auf einen weiteren Trigger-FB geben und mit dessen Ausgang die Sperre umschalten.

Etwas zu spät gepostet. Die All in one-Lösung von Dr. MirakulixX ist natürlich eleganter. Aber auf jeden Fall den Einwand von KingHelmer beachten. Das

```
timer(IN:=taster and not timer.Q,
```
muss aber schon so bleiben, damit timer.Q nur für einen Programmzyklus TRUE wird.


----------



## KingHelmer (4 Juli 2013)

Lass das zweite if komplett weg und nimm "taster" als eingang des Timers.

Timer(
In:= taster
Pt:= t#:s
)

Taster_sperre := timer.q

Oder gibt es einen grund warum der timer bedingt aufgerufen wird?


Sent from my iPhone using Tapatalk


----------



## lasse (4 Juli 2013)

Das Problem bei Dr. MirakulixX Programmierung ist, dass wenn die Sperre einrastet man nur einmal kurz auf den taster drücken kann und die Sperre ist aufgehoben...

Außerdem geht die schaltfkt weiterhin auf TRUE was eigentlich nicht sein darf bei aktivierter tasten_sperre.

Außerdem toggelt die tasten_sperre ganze zeit zwischen TRUE und FALSE wenn ich einmal kurz den Taster betätige?!

Danke übrigens schonmal^^


----------



## StructuredTrash (4 Juli 2013)

Allein der Name "tasten_sperre" für Deine Variable bewirkt recht wenig, Du musst sie schon beim Umschalten der Schaltfunktion abfragen.

```
IF taster_flanke.Q and not tasten_sperre
THEN
   schaltfkt:=not schaltfkt;
END_IF
```
Um dem Problem beim Umschalten der Tastensperre beizukommen, poste bitte mal Deinen aktuellen Code.


----------



## lasse (4 Juli 2013)

```
taster_flanke(CLK:=taster);
IF((taster_flanke.Q)AND(schaltfkt=0))THEN
    schaltfkt:=1;
ELSE IF ((taster_flanke.Q)AND(schaltfkt=1))THEN
    schaltfkt:=0;
END_IF
END_IF
(*IF taster_flanke.Q
THEN
   schaltfkt:=NOT schaltfkt;
END_IF*)

IF taster THEN
timer(IN:=Taster AND NOT timer.Q, PT:=t#3s);
END_IF
IF timer.Q THEN
 taster_sperre:=NOT taster_sperre;
END_IF
```


```
PROGRAM PLC_PRG
VAR
    taster:BOOL;
    schaltfkt:BOOL;
    taster_flanke:F_TRIG;
    taster_sperre:BOOL;
    timer:TON;
END_VAR
```

mir ist außerdem aufgefallen, dass der taster_sperren befehl sich immer verändert nachdem er ein paar mal richtig läuft... nur dann schaltet er sich mit einem einzelnen kurzen taster druck wieder um...


----------



## StructuredTrash (4 Juli 2013)

Ohne es im Detail geprüft zu haben, denke ich, dass der bedingte Aufruf des Timers den Ärger macht. Dafür ist der TON eben nicht gedacht. Ein Weglassen der "IF taster THEN"-Bedingung vor dem Timer-Aufruf würde aber ein anderes Problem bringen. Wenn der Taster dann für längere Zeit gedrückt bleibt, würde die Sperre immer nach jeweils 3 Sekunden umgeschaltet.
Dann wohl doch besser mein erster Vorschlag mit dem zweiten Trigger-FB.

```
timer(IN:=taster,
        PT:=t#3s);
timer_trig(Clk:=timer.Q);  (* Weiterer R_TRIG für den Timer-Ausgang *)
IF timer_trig.Q
THEN
   tasten_sperre:=not tasten_sperre;
END_IF
```


----------



## lasse (4 Juli 2013)

Kannst du mal bitte meinen Code umschreiben, wie du es nun meinst, weil ich gerade leicht konfus bin. Wäre super und danke für die schnelle Antwort


----------



## StructuredTrash (4 Juli 2013)

Also gut, noch mal im Zusammenhang, aber ungetestet:

```
PROGRAM PLC_PRG
VAR
    taster:BOOL;
    schaltfkt:BOOL;
    taster_flanke:R_TRIG;   (* Hier war vorher ein F_TRIG, aber Du willst doch die steigende Flanke, oder? *)
    taster_sperre:BOOL;
    timer:TON;
    timer_trig:R_TRIG;
END_VAR

(* Code *)
taster_flanke(CLK:=taster);
IF taster_flanke.Q and not tasten_sperre
THEN
   schaltfkt:=NOT schaltfkt;
END_IF

timer(IN:=taster,
        PT:=t#3s);
timer_trig(Clk:=timer.Q);  (* Weiterer R_TRIG für den Timer-Ausgang *)
IF timer_trig.Q
THEN
   tasten_sperre:=not tasten_sperre;
END_IF
```


----------



## lasse (4 Juli 2013)

Vielen Vielen Dank 

und jetzt wo du gerade dabei bist ha(s)t du/jemand Ideen zu der 2. und 3. Möglichkeit?
Also ein Extramenü mit Abfrage ob man fortfahren will.

mfg lasse


----------



## Mensetta (4 Juli 2013)

ich denke für 2 und 3 musst du dich erstmal ein bisschen einlesen, stichwort:

Visualisierungs-Schnittstelle
Frame
Dialog


----------



## lasse (4 Juli 2013)

ich meine die visualisierung mit dem taster habe ich auch noch hinbekommen, aber wie kann ich zwei objekte miteinander so verknüpfen, dass ich auf diesen taster in dem einen menü drücke und ins andere komme?!


----------



## Mensetta (4 Juli 2013)

wie schon gesagt, die drei sachen sind in der codesys hilfe (F1) recht gut beschrieben und sind genau die, die du für dein Vorhaben benötigst


----------



## lasse (4 Juli 2013)

Da steige ich nicht so ganz durch... vor allem weil ich jetzt wieder diesen nervigen kommunikationsfehler#0 immer bekomme...


----------



## Mensetta (4 Juli 2013)

zu 2: wenn du Visualisierungen in deren Eigenschaften als Dialog definierst, kannst du diese durch einen Klick auf einen Button in einer anderen Visualisierung öffnen.

zu 3: siehe Bild


----------



## lasse (4 Juli 2013)

da mein programm etwas anders aussieht als deines, finde ich in den eigenschaften keinen definitionsbestimmung, sondern nur Nutzung als: Visualisierung,Visualisierung ohne Masterfolie, und Masterfolie.

Kann auch einfach sein, dass ich es übersehe, weil ich noch nie vorher das Programm benötigt habe...

Ich bekomme es irgendwie nur hin zwei Visualisierungen mit deinem taster zu starten bzw. zu betätigen...also man kann von beiden visus aus den taster drücken


----------



## lasse (5 Juli 2013)

Also Leute... die ersten beiden Möglichkeiten habe ich jetzt, nun fehlt nur noch die Version mit dem numpad.. da hätte ich auch nur eine Frage und zwar gibt es ja bereits ein numpad, welches man auswählen kann... nur was muss man alles einstellen, damit es einwandfrei läuft?

Wäre nett wenn einer sich für meine hoffentlich letzte Frage in diesem Forum, dazu bereit erklärt mir ein weiteres Mal zu helfen 

Bis dato danke


----------



## Larry Laffer (5 Juli 2013)

lasse schrieb:


> IF taster THEN
> timer.PT:=t#3s;
> timer.IN:=TRUE;
> IF timer.Q THEN
> ...



Hallo,
den Timer in einer IF-Abfrage aufzurufen ist Mist, er wird so ggf. gar nicht anlaufen.
Besser ist :
	
	



```
Timer.IN := Taster
```
 ... und der Aufruf dazu ausserhalb der Abfrage ... vielleicht funktioniert dann auch schon dein restlicher Code ...

Gruß
Larry


----------



## lasse (5 Juli 2013)

Das habe ich bereits alles programmiert...mittlerweile fehlt mir nur noch der numpadkäse..
Aber trotzdem danke


----------

