TIA Codetastatur 3x4 Matrix

Hallo mcfelli,

ich habe so einen Baustein noch nie geschrieben, aber schau mal bei
https://de.wikipedia.org/wiki/Tastatur
im Abschnitt Vom Tastendruck zum Scancode, dort ist eine animierte GIF Datei angefügt (Beispiel-Schema für ein 10-Tasten-Scannen mit drei Spalten und vier Zeilen.), die die Funktion der Abfrage gut erklärt.

Du brauchst also 3 Ausgänge und 4 Eingänge (oder umgekehrt).
Diese musst Du in 2 verschachtelten Schleifen setzen bzw. abfragen.

Code:
// nur so mal schnell ohne Test

for i=1 to 3
   Ausgang[i]:=1
   for j=1 to 4
       taste[i,j]:=Eingang[j]
   next j
next i

Grüße
Peter
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das wird nicht funktionieren, da die realen Ausgänge erst am Ende des Zyklus eingeschaltet werden und die zugehörigen Eingänge frühestens im nächsten Zyklus abgefragt werden können.
Eventuell muss sogar noch ein kleiner Timer zwischen Zeilesetzen und Spalteabfragen.


Ich würde es erst mal so probieren:
Code:
IF Zeile < 1 OR Zeile > ZeileMax  THEN

    // Initialisierung Zeile (Programmbeginn / Wert außerhalb Arraygrenzen)
    Zeile := 1;

ELSE

    // Abfrage Spalten
    FOR Spalte := 1 TO SpalteMax BY 1 DO
        Taste[Zeile, Spalte] := Eingang[Spalte];
    END_FOR;

    // Zeile eins weiterschalten für Abfrage im nächsten Zyklus
    Zeile := Zeile + 1;    // oder ab V14: "Zeile += 1;"
    IF Zeile > ZeileMax THEN
        Zeile := 1;
    END_IF;

END_IF;
 
Zuletzt bearbeitet:
ja hucki, Du hast recht.

Ich denke etwas mehr SPS mäßig und nicht hochsprachenmäßig - also die innere Schleife jeden Zyklus erhöhen und die äußere dann entsprechend langsamer, dann müsste es auch funktionieren.
 
Jau,
OSCAT hat das, nennt sich auch MATRIX !
Habe ich selber mal unter Twincat mit ner 4x4 Chinamatrix ausprobiert.
 
Hallo Leute,

ich bin grad selber in der Situation eine 4 x 3 Tastenfeldmatrix mit der S7-1200 zu verbinden und habe mir den unten zitierten Code schon nachvollzogen. Durch die for-Schleifen wird die Abfrage, wie in dem GIF auf Wikipedia realisiert. Ich komme aber einfach nicht drauf, was ich mit der Zuweisung Taste[Zeile, Spalte]:=Eingang[Spalte] anfangen soll. Was hat das Eingang[Spalte] für eine Funktion? Ich stehe total auf dem Schlauch, wie ich der SPS vermitteln kann, welche Taste jetzt genau gedrückt wurde.
Würde ich zum Beispiel die Zeilen dauerhaft an Spannung legen, hätte ich beim Spalten durchschalten ja gar keine Unterscheidung ob jetzt Taste 1,4 oder 7 gedrückt wurde....also muss ich es irgendwie hinbekommen, dass die Spannungsversorgung der Zeilen im richtigen Takt durchgeschaltet werden. Muss man dem Code noch was hinzufügen?
Also ich habe verstanden, dass die for-schleifen alle Zeilen Spaltenweise durchgehen, aber ich weiß im Moment nicht, wie ich das Hardwaretechnisch realisieren kann. So wie im angehängten Bild wird es ja wohl nicht klappen, da die Zeilenversorgung auch durchschalten muss, sonst kann doch gar nicht zwischen den Zeilen unterschieden werden oder? Ich hoffe ihr versteht, was mein Problem ist.

Über Denkanstöße bin ich immmer sehr dankbar!

Mit besten Grüßen

B-asti93

Das wird nicht funktionieren, da die realen Ausgänge erst am Ende des Zyklus eingeschaltet werden und die zugehörigen Eingänge frühestens im nächsten Zyklus abgefragt werden können.
Eventuell muss sogar noch ein kleiner Timer zwischen Zeilesetzen und Spalteabfragen.


Ich würde es erst mal so probieren:
Code:
IF Zeile < 1 OR Zeile > ZeileMax  THEN

    // Initialisierung Zeile (Programmbeginn / Wert außerhalb Arraygrenzen)
    Zeile := 1;

ELSE

    // Abfrage Spalten
    FOR Spalte := 1 TO SpalteMax BY 1 DO
        Taste[Zeile, Spalte] := Eingang[Spalte];
    END_FOR;

    // Zeile eins weiterschalten für Abfrage im nächsten Zyklus
    Zeile := Zeile + 1;    // oder ab V14: "Zeile += 1;"
    IF Zeile > ZeileMax THEN
        Zeile := 1;
    END_IF;

END_IF;
 

Anhänge

  • Verschaltung_Tastenfeld.png
    Verschaltung_Tastenfeld.png
    33,5 KB · Aufrufe: 13
Zuletzt bearbeitet:
Zurück
Oben