Wie kann man das Programm vereinfachen?

Heibo

Level-1
Beiträge
16
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo, ich habe schon längere Zeit nichts mehr programmiert und würde mich gerne wieder einarbeiten. Ich habe mir die alten unterlagen aus meiner Schulzeit genommen und habe folgende Aufgabe.


In Ihrem Heimatort soll die Weltmeisterschaft der Würfelspieler ausgetragen werden. Deshalb werden Sie gebeten, kurzfristig eine Großanzeige zu entwickeln.

Aus der Sicht der Zuschauer soll folgender Ablauf stattfinden:
Nachdem ein Wettkämpfer seinen Würfel geworfen hat, zeigt er eine bestimmte Augenzahl an. Damit die Zuschauer den Wettkampf gut verfolgen können, wird diese Augenzahl auf einer Großanzeige originalgetreu angezeigt. Dazu wird durch einen Schiedsrichter die Augenzahl über drei Schalter eingestellt. Die Schalter haben die Wertigkeiten 1, 2 und 4. Angezeigt wird jeweils das allgemein bekannte Würfelbil.

Die Aufgabe besteht darin, die komplette Steuerung der "Würfelanzeige" zu in einer voll parametrierbaren FC1 zu entwickeln, damit viele Mitspieler problemlos berücksichtigt werden können.



Es soll eine Anzeige programmiert werden. Es gibt die Leuchten a,b,c,d,e,f,g und die Schalter S1 S2 S4. Aufgabe ist es die leuchten je nach Schalterstellung leuchten zu lassen.

|||S4 S2 S1 a b c d e f g
1||1 1 1|||| 0 0 0 1 0 0 0
2||1 1 0|||| 1 0 0 0 0 0 1
3||1 0 1|||| 0 0 1 1 1 0 0
4||1 0 0|||| 1 0 1 0 1 0 1
5||0 1 1|||| 1 0 1 1 1 0 1
6||0 1 0|||| 1 1 1 0 1 1 1

Wie würdet ihr hier vorgehen? Was mir schon mal aufgefallen ist, ist dass a und g, b und f, c und e gleich sind. Also kann man gfe einfach mit in die Netzwerke von dem jeweiligen Partner stecken.

Die Belegung der Schalter ist von mir festgelegt und die Anzeige ist ein Würfel der anstatt Augen, Lampen hat

o---o
o-o-o
o---o
 
Zuletzt bearbeitet:
Die Schalter haben die Wertigkeiten 1, 2 und 4. Angezeigt wird jeweils das allgemein bekannte Würfelbild.
...
Es gibt die Leuchten a,b,c,d,e,f,g und die Schalter S1 S2 S4. Aufgabe ist es die leuchten je nach Schalterstellung leuchten zu lassen.

Code:
[FONT=courier new]|||S4  S2  S1    a b c d e f g
1||1   1   1|||| 0 0 0 1 0 0 0
2||1   1   0|||| 1 0 0 0 0 0 1      
3||1   0   1|||| 0 0 1 1 1 0 0 
4||1   0   0|||| 1 0 1 0 1 0 1
5||0   1   1|||| 1 0 1 1 1 0 1
6||0   1   0|||| 1 1 1 0 1 1 1
[/FONT]
.

Irgendwie finde ich die Wahrheitstabelle komisch. passt irgendwie nicht zum Dual->7-Segment, was ich vermutet hätte. Passt irgendwie nicht zur Aufgabenstellung.

Falls die wirklich so aussieht, musst Du die stur runterprogrammieren.

Gruß.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Irgendwie finde ich die Wahrheitstabelle komisch. passt irgendwie nicht zum Dual->7-Segment, was ich vermutet hätte. Passt irgendwie nicht zur Aufgabenstellung.

Falls die wirklich so aussieht, musst Du die stur runterprogrammieren.

Gruß.

Das sind 7 Lampen die wie ein Würfel angeordnet sind. Sie Zeigen also die Augen des Würfels.
 
Das schon eine schöne Zuordnungstabelle vorhanden ist, würde ich in AWL eine Sprungliste verwenden oder in ST eine Case-Anweisung.
Man kann das natürlich auch schön mit UND/Oder-Verknüpfungen und mit einer Vereinfachung der Logiktabelle nach boolschen Logikregeln machen (das wollen die Aufgabensteller vielleicht sogar), aber das macht es eigentlich nicht unbedingt einfacher und besser lesbar.

@ducati
Kommt ja immer darauf an, welche Lampe wo sitz und welche Schalterstellung welchen Wert repräsentiert, paßt schon denke ich, es muß ja nicht mathematisch mit dem dualen System gemacht sein.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das ist ja auch keine 7-Segment-Anzeige sondern vermutlich ein "Würfel" mit 6 Punkten (6 Leuchten). EDIT: 7 Punkte/Leuchten
Irgendein Elektriker oder Lehrer hat die Schalter halt so angeschlossen, vielleicht masseschaltend oder damit es schwerer wird...

In welcher Programmiersprache für welche SPS soll denn die Lösung dieser Hausaufgabe sein?
Man könnte z.B. so vorgehen:

Code:
//temporäre BOOL-Variablen #E1, #E2, #E3, #E4, #E5, #E6

//6 Schalterstellungen zu 6 BOOL entschlüsseln
#E1 := S4 AND S2 AND S1 ;
#E2 := S4 AND S2 AND NOT(S1) ;
...
#E6 := NOT(S4) AND S2 AND NOT(S1) ;

//angeben bei welchen Schalterstellungen die Ausgänge leuchten sollen
a := #E2 OR #E4 OR #E5 OR #E6 ;
b := ...
...
e := c ;
f := b ;
g := a ;

Harald
 
Zuletzt bearbeitet:
Die Schalter haben die Wertigkeiten 1, 2 und 4.

Code:
[FONT=courier new]|||S4  S2  S1    a b c d e f g
1||1   1   1|||| 0 0 0 1 0 0 0
2||1   1   0|||| 1 0 0 0 0 0 1      
3||1   0   1|||| 0 0 1 1 1 0 0 
4||1   0   0|||| 1 0 1 0 1 0 1
5||0   1   1|||| 1 0 1 1 1 0 1
6||0   1   0|||| 1 1 1 0 1 1 1
[/FONT]

Hmm, für mich passt die Aussage nicht zusammen...

Oder hab ich nen Knoten im Kopf?

Gruß.
 
jo, naja nehmen wir's so hin :) Negiert ist klar, aber die erste Zeile wäre dann 0. passt halt nicht zu der Aussage mit der Wertigkeit 1,2,4 ...

Gruß.

Also wenn S1 S2 S4 eingeschaltet sind dann soll das eine Würfel mit einem Auge darstellen. S1 low und S2,S4 high ist dass ein Zwei auf dem Würfel usw.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Mann, der TE soll KURZFRISTIG eine Großanzeige für die Weltmeisterschaften der Würfelspieler entwickeln und hat jetzt keinen anderen Schalter... ;)

Geht es bei dieser Hausaufgabe denn nicht eigentlich mehr ums Erkennen und Anwenden des Auswerte-Prinzips der Schalttabelle als um eine korrekte Codierung des Drehschalters?

Wenn er sein Programm so aufbaut wie von mir in #6 vorgeschlagen, dann kann er mit wenig Aufwand das Programm an sonstwelche Codierungen anpassen.

Ich mache mal seine Tabelle etwas übersichtlicher:
Code:
E |S4 S2 S1 | a b c d e f g
--+---------+--------------
1 | 1  1  1 | 0 0 0 1 0 0 0
2 | 1  1  0 | 1 0 0 0 0 0 1 
3 | 1  0  1 | 0 0 1 1 1 0 0 
4 | 1  0  0 | 1 0 1 0 1 0 1
5 | 0  1  1 | 1 0 1 1 1 0 1
6 | 0  1  0 | 1 1 1 0 1 1 1


 -------
| a---e |
| b-d-f |
| c---g |
 -------

Übrigens steht immer noch die Frage: für welche SPS in welcher Programmiersprache wird die Lösung gewünscht?
Ich empfehle KOP oder FUP für diese Aufgabe.

Harald
 
In FUP aber ich habe die Tabelle selber gemacht. Aber jetzt wo ihr das mit der Wertigkeit angesprochen habt glaube ich, dass ich das Falsch gemacht habe.

Hier mal meine Tabelle

E |S4 S2 S1 | a b c d e f g
--+---------+--------------
1 | 0 0 1 | 0 0 0 1 0 0 0
2 | 0 1 0 | 1 0 0 0 0 0 1
3 | 0 1 1 | 0 0 1 1 1 0 0
4 | 1 0 0 | 1 0 1 0 1 0 1
5 | 1 0 1 | 1 0 1 1 1 0 1
6 | 1 1 0 | 1 1 1 0 1 1 1

Ich denke so ist es besser. Ich habe nicht daran gedacht, dass die Schalter eine Wertigkeit haben.
 
Geht es bei dieser Hausaufgabe denn nicht eigentlich mehr ums Erkennen und Anwenden des Auswerte-Prinzips der Schalttabelle als um eine korrekte Codierung des Drehschalters?

Also wenn ich damals in Steuerungstechnik aus der Aufgabenstellung die falsche Wahrheitstabelle entwickelt hätte, hätte ich garantiert keine 1 mehr gekrigt :)

Und heute besteht mindestens die Hälfte meiner Arbeit darin, aus teilweise unvollständigen und widersprüchlichen Angaben, herauszufinden, was das Programm überhaupt sinnvollerweise machen soll. :)

Also von daher ist das schon praxisbezogen, auf der Wahrheitstabelle rumzuhacken :)

Gruß.

PS: und sinnvollerweise macht man dass, bevor man anfängt zu programmieren :cool:
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Also von daher ist das schon praxisbezogen, auf der Wahrheitstabelle rumzuhacken :)

Gruß.

PS: und sinnvollerweise macht man dass, bevor man anfängt zu programmieren :cool:
OK, ich hatte zuerst angenommen, die Wahrheitstabelle wäre in der Aufgabenstellung vorgegeben.
Jetzt sehe ich, daß der TE die selber erstellt - dann natürlich sollte man schon drauf achten, daß sie "logisch" aufgebaut ist:
- alle 3 Schalter aus (=0) --> alles dunkel
- S1, S2, S4 nach Wertigkeit geschaltet 1..6 --> Würfelbilder 1..6
- alle 3 Schalter ein (=7) --> Lampentest, alle 7 Lampen ein


Zuerst einmal solltest Du für die 3 die gleichen Ecken benutzen, wie für die zwei, dann lässt sich schon viel vereinfachen.
Ich komm grad nicht drauf, bei welchem Programmalgorithmus man "viel" vereinfachen könnte wenn die 2 die gleichen Ecken benutzt wie die 3 (spart Karnaugh tatsächlich so viel?), doch ich finde es für die Großanzeige sogar sehr vorteilhaft, wenn die 2 deutlich anders aussieht als die 3 (dann könnte man sogar noch Zahlen unterscheiden, wenn 1 (Eck-)Lampe kaputt wäre).


Das gibt 13 Zeilen AWL.
Da bin ich aber neugierig, wie Du auf 13 Zeilen kommst - das geht doch bestimmt nicht mehr symbolisch, irgendeine tricky Abkürzung ist da bestimmt drinnen, oder? Gib doch mal einen Tip in welche Richtung ...

Wenn unsymbolische Tricks erlaubt sind, dann brauche ich nur 7 oder 10 AWL-Operationen für den Encoder und da ist es egal wie die 2 aussieht.
Code:
      L     #IN                         //Eingangsbyte: 0=dunkel / 1..6=Würfel / 7=Lampentest
      UW    W#16#7                      //IN auf 0..7 begrenzen / Bits ausblenden
      SLD   3                           //0..7 --> P#0.0 .. P#7.0
      LAR1  
      AUF   "DB123"                     //DB mit der Encodier-Tabelle ab DBB0
      L     DBB [AR1,P#0.0]             //(P#0.0: ggf den Tabellenanfang anpassen)
      T     #OUT                        //Ausgangsbyte: .0=a .1=b .. .6=g

Oder ohne vorbereitete Encodertabelle:
Code:
//Encoder-Tabelle in TEMP erstellen
      L     DW#16#0008411C              //Lampenmuster 0..3
      T     LD     0
      L     DW#16#555D777F              //Lampenmuster 4..7
      T     LD     4

//Bitmuster Tabelle[#IN] auslesen
      L     #IN                         //Eingangsbyte: 0=dunkel / 1..6=Würfel / 7=Lampentest
      UW    W#16#7                      //IN auf 0..7 begrenzen / Bits ausblenden
      SLD   3                           //0..7 --> P#0.0 .. P#7.0
      LAR1  
      L     LB [AR1,P#0.0]              // entpricht L Tabelle[#IN]
      T     #OUT                        //.0=a .1=b .. .6=g

Da der TE aber gerne FUP möchte, sollte man das Programm nur mit sauberen symbolischen Bitverknüpfungen ausführen, ggf. läßt die Wahrheitstabelle noch einiges minimieren.
Ohne Nachdenken würde ich wie in #6 gezeigt zuerst zeilenweise die Schalter S1/S2/S4 zu 6 (oder 7) Zwischenwerten (E1..E6) decodieren und dann spaltenweise die Ausgangs-Ver"oder"ung machen. Macht ca. 13 oder 14 Netzwerke oder 3 weniger, wenn man die Zuweisungen für a+g, b+f und c+e jeweils in einem Netzwerk zusammenfasst.

Harald
 
Zuerst einmal solltest Du für die 3 die gleichen Ecken benutzen, wie für die zwei, dann lässt sich schon viel vereinfachen.
Ich komm grad nicht drauf, bei welchem Programmalgorithmus man "viel" vereinfachen könnte wenn die 2 die gleichen Ecken benutzt wie die 3 (spart Karnaugh tatsächlich so viel?), ...
Gerade für FUP/KOP würde das die Sache sehr vereinfachen:

Das Auge in der Mitte (d) leuchtet immer, wenn die Wertigkeit 1 betätigt ist.
Die Augen Links Unten (c) und Rechts Oben (e) leuchten, wenn die Wertigkeiten 2 oder 4 betätigt sind.
Die Augen Links Oben (a) und Rechts Unten (g) leuchten, wenn die Wertigkeit 4 betätigt ist.
Die Augen Links Mitte (b) und Rechts Mitte (f) leuchten, wenn die Wertigkeiten 2 und 4 betätigt sind.

Macht doch 4 schöne FUP- bzw. KOP-Netzwerke.
:D

PS:
Das gibt 13 Zeilen AWL.
Da bin ich aber neugierig, wie Du auf 13 Zeilen kommst - das geht doch bestimmt nicht mehr symbolisch, irgendeine tricky Abkürzung ist da bestimmt drinnen, oder? Gib doch mal einen Tip in welche Richtung ...
Nein, alles blitzsaubere UND- bzw. ODER- sowie die Zuweisungszeilen in 4 Netzwerken. Nichts anderes. Nicht mal Klammern oder NOPs für's FUP/KOP sind nötig.
:D .....[Ende PS]


Bei Unterscheidung der Anzeige-Richtung zw. 2 und 3 wird's bei reiner Logik dann etwas mehr.
PPS: Werden dann 4 UND-/ODER-Zeilen mehr. Aber immer noch absolut wartungsfreundlich!.....[[Ende PPS]


Aber letzendlich hängt es auch davon ab, was überhaupt mit der Aufgabe trainiert werden soll:
- Das Erkennen von Logiken
- Das Benutzen von Vergleichern und Übertragen von Bytewerten
- In AWL das Benutzen von Sprunglisten
?
 
Zuletzt bearbeitet:
Zurück
Oben