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;