Programmoptimierung mit Arrays

AlexWillburger

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

ich habe für ein Spiel ein kleines SPS Programm geschrieben. Dabei gibt es vier Spielerplätze und acht verschiedene Felder, die sich auf einer Drehplatte befinden. Über drei Sensoren, die sich am ersten Spielerplatz befinden, wird erfasst, welches Feld sich vor welchem Spieler befindet. An jedem Spielerplatz befinden sich zwölf LEDs. Diese werden abhängig vom Feld und von einer Zufallszahlt zwischen -1-6 angesteuert. Es werden immer 4 LEDs pro Spielerplatz gleichzeitig angesteuert, also insgesamt werden 16 LEDs gleichzeitig angesteuert. Da ich noch recht neu in Sachen SPS bin habe ich für jede LED einzeln alle Zustände, die diese schalten sollen verknüpft. Ein solche Zuweisung wäre z.B.

Zufallszahl =1 & Feld 1 aktiv (als Merker "W1_LT1") ODER Zufallszahl 5 & Feld 1 aktiv ("W5_LT1") UND Feld 1 bei Spieler 1 ("P1_LT1").

Für die erste LED habe ich nun 8 verschiedene Zuweisung in dieser Form, die mit einem ODER Verknüpft sind. Meine Netzwerke sind also riesengroß und furchtbar unübersichtlich. Ich würde das ganz nun gerne etwas optimieren und für andere leserlicher gestalten. Dabei wurde mir der Tipp gegeben ich soll mich mal zu Multidimensionalen Arrays informieren. Leider bin ich dadurch nicht wirklich schlauer geworden. Ich hab mir das so überlegt: Ich könnte alle LEDs in ein Array packen. Also jeweils 12 LEDs ins untergeordnete und das ganze dann viermal für die jeweiligen Spielerplätze.
Allerdings habe ich keine Ahnung wie mir das weiterhelfen soll, wenn es um die einzelnen Zustände geht, die eine LED leuchten lassen.
Kann mir jemand ein paar allgemeine Tipps zum Umgang mit Arrays geben, oder hat jemand eine Idee wie ich mein Programm mit Hilfe von Arrays optimieren kann? Ich hänge noch einen Screenshot an, ich hoffe man kann meine Erklärung hier halbwegs nachvollziehen. Bei der UND Verknüpfung auf dem Screenshot ´mit "M_LED1.1" & "X1" handelt es sich um ein Lauflicht, das kann man zunächst mal ignorieren. Mir geht es darum, dass ich jeden Zustand einzeln im Programm definieren muss, sondern dass ich quasi einen Baustein habe, der dann mit verschiedenen Parametern gefüttert wird. Kann man mir da halbwegs folgen. In etwa so wurde mir das erklärt, dass man das so machen kann, ich hab es allerdings nicht so ganz verstanden.
 

Anhänge

  • sps.PNG
    sps.PNG
    15,5 KB · Aufrufe: 59
Ein solche Zuweisung wäre z.B.
Zufallszahl =1 & Feld 1 aktiv (als Merker "W1_LT1") ODER Zufallszahl 5 & Feld 1 aktiv ("W5_LT1") UND Feld 1 bei Spieler 1 ("P1_LT1").
Dieses eine Beispiel genügt meiner Glaskugel nicht, um zu entschlüsseln, was Du meinst.
Anscheinend zeigst Du uns, wie Du die Zufallszahl bildest (ist das dann überhaupt eine "Zufallszahl"?).
Gibt es die Zufallszahl nur 1-mal - oder pro Platz 1-mal - oder pro Spieler 1-mal - oder pro Platz und Spieler 1-mal?
Du wolltest doch erfahren, wie Du die 16 LEDs aus irgendwas dekodieren und ansteuern kannst.
Oder habe ich das (auch) falsch verstanden?
Mit Arrays kann man schon einiges machen, aber ob das für diese Aufgabe Sinn macht, kann ich noch nicht erkennen.
Vermutlich ist es angemessener, die nötigen Verknüpfungen nur zu vereinfachen. Aber dazu müssten wir etwas mehr darüber erfahren, nach welchen Regeln das geschehen soll.

Gruss, Heinileini
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das hab ich schon befürchtet, dass man aus der Erklärung nicht besonders schlau wird :D. Also die Zufallszahl soll einen Würfel simulieren, diese wird mit der Systemzeit generiert und dann in einem Merker gespeichert. Der Merker "W1_LT1" soll aussagen, dass die Zufallszahl in diesem Fall eine 1 ist und dass das Feld 1 vor einem der vier Spieler liegt. Die zufallszahl gibt es nur einmal und für jedes Ergebnis gibt es dann einen Merker. Das W ist also das Würfelergebnis und das LT steht für "Legetafel" Meine Einschaltbedingung für eine LED hängt also zum einen von der Zufallszahl ab und zum anderen vom jeweiligen Feld. Der zweite Merker sagt dann quasi aus, welches Feld bei welchem Spieler ist und dient dazu das auch die LED am richtigen Spielerplatz leuchtet. Es gibt also fest definierte Zustände, wann eine LED leuchten soll und genau so hab ich das in meinem Programm zugewiesen. Das Spiel ist dem Spiel Ubongo nachempfunden. Das Ziel ist es eine Figur (Felder) mit vier Klötzchen auszulegen. Und für jedes Klötzchen gibt es quasi eine LED, die Signalisieren soll, welche Klötzchen verwendet werden sollen. Leider tu ich mir grade selbst etwas schwer das ganze hier ordentlich zu erklären.
 
Hallo,

der Ansatz mit den den Zwölf einzelnen Plätzen für die LEDs ist schon einmal richtig. Nur mußt Du sie nicht den Spielerplätzen zuordnen sondern dem Würfel und den Legetafeln.

Array[LT][W][LED]

Du weißt dann ja an welchem Spielerplatz welche LT liegt und welchen Würfel W Du hast. Dann brauchst Du nur noch die LED zuordnen.

Hoffe das hilft schon mal. Die komplette Lösung will ich Dir noch nicht geben.


Gruß
 
Ich weiß nicht ob ich dir so wirklich folgen kann. Im Endeffekt ordne ich ja in meinem jetzigen Code die Würfel und die Legetafeln zu. Daraus entstehen ja dann die riesigen Oder Verknüpfungen. Das ist eben das, was ich noch nicht verstehe, ich muss ja auch im Array die einzelnen Zustände definieren und würde dann meinen Code ja nicht wirklich übersichtlicher machen sondern es würde aufs Gleiche rauskommen wie durch die vereinzelten Zuweisungen. Oder bin ich grade komplett auf dem Holzweg?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,


komme erst jetzt dazu zu Antworten.


Die Arrays bzw. das Array sind wie eine Tabelle in der Du die Belegung nachschlägst. Du mußt sie nur einmal zu Beginn mit Deinen riesigen Oder Verknüpfungen füllen. Wahrscheinlich brauchst Du die Verknüpfungen auch gar nicht erst erstellen, da Du sicher schon eine Vorgabe hast nach denen Du die Verknüpfungen erstellst und die Du dafür nutzen kannst.


Sie werden also, wenn wirklich benötigt, nur ein Mal ausgewertet und nicht bei jedem neuen Spiel.


Hier mal ein Beispiel mit 4 Legetafeln (LT) und 2 von sechs Symbolen. Die Spalten a-f sollen die Symbole bzw. LEDs darstellen. Ein x bedeutet, daß Symbol wird verwendet.

Tabellen.PNG


Jede Legetafel entspricht schon einem 2 dimensionalem Array. Die kombinierst Du zu einem 3 dimensionalem: Array[LT][W][LED]


Jetzt hat Spieler 1 die Legetafel 3 und es wurde die 4 gewürfelt. Also siehst Du jetzt nach bei Legetafel 3 in der Zeile für den Würfel 4 und siehst, daß LED c und d leuchten, während die anderen aus sind.


S1_LED_a := Array[LT3][W4][a]
S1_LED_b := Array[LT3][W4]
S1_LED_c := Array[LT3][W4][c]
S1_LED_d := Array[LT3][W4][d]
S1_LED_e := Array[LT3][W4][e]
S1_LED_f := Array[LT3][W4][f]


Hoffe das ist einigermaßen verständlich.

Du mußt nur zu Anfang einmal das Array mit den entsprechenden Daten initialisieren.

Gruß
 
Danke für die Antwort :)

in der Zwischenzeit war der Programmierer, der mir den Tipp gegeben hat nochmal da und hat mir das Ganze nochmal genauer erklärt und es funktioniert nun auch. Ich hab es dann auch ungefähr so gelöst, wie du es beschrieben hast.
Mein nächstes Ziel ist es nun das Lauflicht auf SCL umzuschreiben. Momentan hab ich dafür 4 einzelne FCs für jeden Spieler. Ich hab auch schon einen Ansatz, leider konnte ich den bis jetzt noch kein bisschen Sinnvoll umsetzen. Drum frag ich jetzt mal ob das so überhaupt machbar ist, wie ich mir das Vorstelle.
Ich würde gerne in einer FOR Schleife die Bits eines Arrays mit zwölf Felder nach und nach auf 1 setzen. Ich hab also ein Array mit zwölf Feldern. Nun würde ich gerne mit einem Taktmerker mit jedem Takt das nächste Bit setzen. So dass beim ersten Schleifen durchlauf das Bit Array[0] gesetzt wird, dann wird der Index um 1 erhöht und anschließend Array[1] gesetzt usw.
Bis jetzt haben allerdings entweder alle LEDs gleichzeitig geleuchtet oder gar keins.
Kann mir vielleicht jemand sagen, ob es so machbar ist und evtl eine Erklärung geben wie ich das dann als Code umsetzen kann ?
 
Bei SPS kann man nicht in Schleifen auf irgendwas warten (es gibt Ausnahmen) - da würde die SPS sicherheitshalber wegen Zykluszeitüberschreitung in STOP gehen. Deine FOR-Schleife wird also nichts.
Das ganze SPS-Programm liegt bereits in einer Schleife und wird zyklisch wieder und wieder und wieder ... ausgeführt. Du brauchst Dir nur von einem Durchlauf (Zyklus) zum nächsten merken, welches Array-Feld gesetzt wurde (den Index merken) und bei einem der nächsten Programmdurchläufe und Flanke des Taktmerkers den gemerkten Index erhöhen und das zugehörige Array-Feld setzen.

Harald
 
Zurück
Oben