Tastenfeld 7 Pin

peacekeeper03

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

Habe die Aufgabe die Eingaben auf einem Tastenfeld auszugeben.
Die ersten 3 Pins ergeben die Spalte, die anderen 4 Pins die Reihe.
An den 3 Pins hängen geschaltene Ausgänge und an den 4 Pins die Eingänge dazu.

Wenn die Zahl 3 gedrückt wird sollte beim False des dritten Ausgangs auch der Eingang False werden.

Code:
IF DI_Reihe1 THEN
		DO_Spalte1:=FALSE;
		IF  NOT DI_Reihe1 AND NOT Merker2 AND NOT Merker3 THEN
			Spalte:=1;
			Merker1:=TRUE;
			Reihe:=1;
		END_IF;
		DO_Spalte2:=FALSE;
		IF  NOT DI_Reihe1 AND NOT Merker1 AND NOT Merker3 THEN
			Spalte:=2;
			Merker2:=TRUE;
			Reihe:=1;
		END_IF;
		DO_Spalte3:=FALSE;
		IF  NOT DI_Reihe1 AND NOT Merker1 AND NOT Merker2 THEN
			Spalte:=3;
			Merker3:=TRUE;
			Reihe:=1;			
		END_IF;
END_IF;

Für jede Reihe gibt es dieses Codesegment.
Gehe ich das ganze mit Breakpoints durch funktioniert es hervorragend.

Sobald ich die Breakpoints entferne wird der Code einfach übersprungen bzw. die If Anweisungen nicht ausgeführt.

Habe schon verschiedene Vatianten und Zykluszeiten versucht, bin aber am ende mit meinem Wissen.

Kann mir vielleicht jmd einen Tipp geben?
(Programmierkenntnisse auch Schulniveau)
 
Hallo,
ich verstehe dein Problem im Augenblick nicht so ganz.
Es würde helfen, wenn ich wüßte, was von den Variablen wo deklariert ist und was für einen Baustein du da hast. Am Besten wäre es, du postest den kompletten Code des Bausteins.

Wenn ich aber dies hier lese :
Code:
IF [B]DI_Reihe1[/B] THEN
		...
		IF  [B]NOT DI_Reihe1[/B] ...
... wann soll es denn gültig sein ? Wenn DI_Reihe1 = TRUE ist oder wenn es FALSE ist ?
Du hast hier auf jeden Fall einen Widerspruch programmiert ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Es soll waten bis eine Taste der Reihe 1 gedrückt wird. (Zahl 1, 2 oder 3)

IF DI_Reihe1 THEN...

Dann soll er die Ausgänge nacheinander abschalten bis die gedrückte Taste False wird.

IF NOT DI_Reihe1 ...

Somit will ich Tacken welche Spalte gedrückt wurde.
Bei der Ziffer 3 sollte die Bedingung "IF NOT DI_Reihe1 ..." erst beim False des dritten Ausgangs erfüllt sein.

Codesys springt ja nicht aus der If Anweisung wenn deren Bedingung nicht mehr erfüllt ist oder?
Wenn sie beim Star erfüllt war geht er die Anweisungen durch und somit ist es ja auch nur indirekt ein Widerspruch .

Anbei jetzt der gesammte code.
Es sind noch Bausteine für RS232 Init und Send entahlten, die aber schon soweit funktionieren.

Habe schon viel Versuche gemacht und schon zwei Tage mit den Problem verbracht. :confused:
F und R Trig auch RS (deklaration hab ich stehen lassen)

Verwendetes Tastenfeld
 

Anhänge

  • RS232 Display.rar
    144 KB · Aufrufe: 3
Zuletzt bearbeitet:
Hallo,
ich hatte es mir fast gedacht.
Das Programm wird zyklisch abgearbeitet - IMMER.
Es wird NICHT in einer Zeile gewartet (es sei denn du programmierst dir das, was aber die Zykluszeit-Überwachung auf den Plan bringen könnte).

Du müßtest dir also für deine Abprüfung eine Art Schrittkette erstellen, die erst den ersten Ausgang setzt, dann ein wenig wartet, dann die relevanten Eingänge überprüft und zuordnet usw.
Am Ende, also nach ettlichen Programmzyklen, hast du dann irgendwann das Ergebnis.
Bedenke bitte auch, dass sowohl deine Ausgänge, wie auch deine Eingänge Verzugszeiten haben.

Hast du verstanden, was ich meinte ?

Gruß
Larry
 
Ganz ehrlich? Nein.

Kann man die zykliche Abarbeitung einfach deaktivieren?
Task.jpg
Zeilenweise Abarbeitung wäre hier sicher kein Nachteil.

Beim programmieren der Schrittkette muss aber die Taste immer gedrückt bleiben solange das Ergebnis noch nicht bekannt ist.
Ist das nicht zu langsam für einen "kurzen" Tastendruck?

Hast du ein Beispiel für so eine Schrittkette?
i+1 bei jedem Zyklus?
Bei jedem Zyklus wird ein anderer Teil des Codes aktiv gesetzt?

Danke für deine Hilfe.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Kann man die zykliche Abarbeitung einfach deaktivieren?
Nein ...

Beim Programmieren der Schrittkette muss aber die Taste immer gedrückt bleiben solange das ergebnis noch nicht bekannt ist.
Ist das nicht zu langsam für einen "kurzen" Tastendruck?
Du hast doch bei der SPS eine Zykluszeit im 1-Millisekunden-Bereich ...

Hast du ein Beispiel für so eine Schrittkette?
Nein

i+1 bei jedem Zyklus?
Bei jedem Zyklus wird ein anderer Teil des Codes aktiv gesetzt?
Ja ... :)
 
Wieso geht nicht jede Reihe und jede Spalte auf einen Eingang?
(7 Eingänge)
Das ist eine klassische sequentielle Abfrage einer Kontakt-Matrix. Der Controller aktiviert genau eine Spalte und schaut dann, ob das Signal an einer Zeile wieder "rauskommt". Wenn ja, dann ist der Schnittpunkt dieser Spalte mit dieser Zeile verbunden - sprich: die Taste an dieser Position ist gedrückt. Es können auch mehrere Eingänge aktiviert werden, wenn in dieser Spalte mehrere Tasten gleichzeitig gedrückt sind.
Das Matrix-Multiplex-Verfahren spart ungemein Eingänge, mit 4 Ausgängen und 4 Eingängen läßt sich eine 16-Tasten-Matrix einlesen. Für eine Computer-Tastatur mit reichlich 100 Tasten braucht der Keyboard-Controller nur 8 Ausgänge und 16 Eingänge.

Nachtrag:
Noch mal deutlicher: die Controller-Ausgänge gehen auf die Matrix-Spalten und die Matrix-Zeilen gehen auf die Controller-Eingänge

Harald
 
Zuletzt bearbeitet:
Es sind zwar 7 Pins, die ich auch auf 7 Eingänge hängen könnte. Die Eingänge brauchen aber 24V um True zu werden.
Das Tastenfeld hat aber keinen Anschluss für eine 24V Zuleitung. (gemeinsamer Pin 8 fehlt)

Habe also den Umweg gewählt die 24V über geschaltene Ausgänge über die Tasten an die Eingänge zu ziehen.

Wird die Taste gedrückt ist der Eingang der Spalten True.
Dann weden die Ausgänge durchgeschalten bis der Eingang für die Spalten abfällt somit hat man dann die gedrückte Zahl.

Hier ist nur das Problem bei zu kurzem Tastendruck, wo dann die Falsche Spalte ausgewertet wird.
Denke aber bei einem 10€ Tastenfeld kann man damit leben.

Anbei jetzt das fertige Programm für den BX8000 mit Tastenfeld und Schrittmotoransteuerung.
Anzeige der Sollwerte erfolgt via RS232 über ein I2C Modem an ein 8 Stellen 7-Segment Display.
 

Anhänge

  • Linearanschlag.rar
    187,5 KB · Aufrufe: 3
Zurück
Oben