1..24 umcodieren in Kombination von 4 Ziffern

Zuviel Werbung?
-> Hier kostenlos registrieren
Was ist denn konkret die Aufgabe?
Ich hab sowas ähnliches abundzu mit Pumpenfolgen. Also in welcher Reihenfolge sollen 4 Pumpen lastabhängig nacheinander eingeschaltet werden?
Ich ignoriere dann einfach die ganzen nicht zwingend notwendigen Varianten. Bei mir gibts dann nur:
1234
2341
3412
4123

Manchmal ist weniger mehr...
 
Die Aufgabe ist, der Bediener soll ein 4-Stelligen Zahl wählen.
Die einzelne Ziffern können nur 1-2-3-4 betragen.
Jeden Wert kann nur einmal auftreten (kein 1-2-3-3 o.Ä).
In die SPS soll dann von das Zahl die einzelne Ziffern in separaten Variabeln geben.

Recht einfach. Es kann also alle Kombinationen vorkommen.
Ich wette es hat zu tun mit ein Pumpenreihenfolge, oder Siloreihenfolge o.Ä.

Das Problem ist nur, dass es durch ein Text-Liste in WinCC V7 gelöst ist, und in WinCC V7 ist das Index immer eine Reihenfolge ab 1, den man nicht beeinflussen kann.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also, es ist eine realen Augabe, kein Weihnachtsrätzel ?
So, wie ich Harald verstanden habe, hat er einen realen Hintergrund für die Aufgabe.
Aber unabhängig davon oder dennoch ist es eine schöne Knobelei.
Das Wort Rätsel in dem Begriff WeihnachtsRätsel, na ja, kann man drüber streiten, ob das gerechtfertigt ist. Sudoku & Co werden ja auch als Rätsel bezeichnet.
Aber ich denke dass die Drop-Down liste kein gute Lösung für die Bediener ist. Schon bei 24 Kombination ist die Dropdown etwas (zu) tief.
Mit 5 Zifferen und 120 Kombinationen macht es kein Sinn mehr.
Denke ich auch.
Besser die Aufgabe in ein anderen Weise lösen.
Erinnert Ihr die Thumbwheel (Daumenrad ?).
Ja, ich erinnere mich sehr gut. Aber ein Stapel aus ThumbWheels macht die Eingabe auch nicht wirklich einfach. Man kann nicht entsprechend einer Eingabe einer Ziffer an einer Stelle dafür sorgen, dass diese Ziffer dann an den übrigen Stellen nicht mehr anwählbar ist.
Und die Eingabe der 6 Ziffern (bei einer 4-stelligen Zahl) oder der 5 Ziffern (bei einer 5-stelligen Zahl), die generell nicht zur Auswahl stehen, kann man auch nicht für die Eingabe sperren.
Schön übersichtlich ist nur, dass man die 4 oder 5 Ziffern nebeneinander sieht. Aber dafür braucht man keine ThumbWheels. Das leistet ein einfaches Eingabefeld auch.

Falls man unbedingt DropDownMenus für die Eingabe benutzen will, könnte man für jede einzelne Stelle der Zahl ein eigenes DropDownMenu spendieren.

Das Problem ist nur, dass es durch ein Text-Liste in WinCC V7 gelöst ist, und in WinCC V7 ist das Index immer eine Reihenfolge ab 1, den man nicht beeinflussen kann.
Na ja, ein grosses Problem ist das aber nicht. Spätestens wenn man mit Modulo rechnet, wünscht man sich zwar, dass die Zählung mit 0 beginnen möge, aber ggfs vorher eine 1 zu subtrahieren und danach wieder eine 1 zu addieren, das überfordert keinen Computer (nur uns Programmierer, wegen der zunehmenden Unübersichtlichkeit ;) ).

PS:
Ich habe jetzt LösungsWege gefunden, die umgekehrte UmwandlungsRichtung "n-stellige Zahl --> zugehörigen Index" zu berechnen für n = 4 und n = 5. Melde mich wieder ...

PPS:
Früher hatte ich mal den Eindruck, dass alle Programmierer den Beginn mit Index 0 bervorzugen, nur IBM war in dieser Beziehung anders gepolt und begann grundsätzlich mit dem Index 1. Und das war dann eben ein DeFaktoStandard. ;)
 
Zuletzt bearbeitet:
.. Na ja, ein grosses Problem ist das aber nicht...
Was Jesper wahrscheinlich meint ist, dass in anderen Systemen wie WinCCflexible oder TIA-Portal in den Textlisten die "Textnummern" frei gewählt werden können (#11). Man wäre dort also nicht an die starre Definition "1, 2, 3, .. x", wie offensichtlich in WinCC üblich, gebunden. Das würde das Problem auf der Steuerungsseite gänzlich aufheben.
 
Was Jesper wahrscheinlich meint ist, dass in anderen Systemen wie WinCCflexible oder TIA-Portal in den Textlisten die "Textnummern" frei gewählt werden können (#11). Man wäre dort also nicht an die starre Definition "1, 2, 3, .. x", wie offensichtlich in WinCC üblich, gebunden. Das würde das Problem auf der Steuerungsseite gänzlich aufheben.
Hmmm. Also ein Array zur Verfügung haben, bei dem der Index für jeden Eintrag frei wählbar ist und dieser Index nicht fortlaufend durchnumeriert sein muss?
Vorstellbar, aber dadurch wird das Problem nur ins BetriebsSystem verschoben und der AnwendungsProgrammierer muss sich keinen Kopf machen.
Aber damit haben wir noch keinen bzw. nur einen Lösungsweg, wie das BetriebsSystem das auf die Reihe kriegt: eine Tabelle (notfalls HashCode mit allen Umwegen und Nachteilen). Aber dieser Lösungsweg war von Harald ausgeschlossen worden. :unsure:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja, das ist für die Vorgabe einer Aggregate-Reihenfolge.
Die Auswahl mit nur einer symbolischen Liste hat den Vorteil, daß nicht aufwändig geprüft und verhindert werden muß, daß keine Ziffer mehrmals vorkommt, weil der Bediener das gar nicht eingeben kann. Bei 4 Aggregaten und 24 Möglichkeiten ist das noch gut bedienbar und schnell realisiert. Bei 5+ Aggregaten und 120+ Möglichkeiten wäre eine vollständige Liste aber tatsächlich zu lang. Da würde man sich besser auf nur ein paar Varianten beschränken, wie ducati in #21 erwähnte.

Wie gesagt, habe ich die Aufgabe der Decodierung/Umcodierung schon erledigt, und zwar in AWL mit SPL, weil ich keinen Algorithmus kenne und auch keinen auf die Schnelle finden konnte, der die Umcodierung durch eine Berechnung lösen kann. Jetzt kommt aber das Programmierer-Hobby ;) und meint, das müsste doch auch anders gehen, kann man nicht eine Formel oder einen Bit Hack dafür finden? Die Lookup-Tabelle habe ich ausgeschlossen, weil ich diese Lösung kenne und weil sonst womöglich nur diese Lösung vorgeschlagen würde. Es soll aber ausdrücklich eine Lösung abseits der Standard Lösungen gefunden werden. Das ist doch zumindest eine schöne Knobel-Aufgabe, oder vielleicht gibt es tatsächlich schon einen Algorithmus?

Schönen Sonntagnachmittag
Harald
 
.. Also ein Array zur Verfügung haben, bei dem der Index für jeden Eintrag frei wählbar ist und dieser Index nicht fortlaufend durchnumeriert sein muss? ..
Nein kein ARRAY, sondern eine Textliste ist gemeint. In WinCCflexible oder in TIA würde das selbstverständlich gehen, in WinCC offenbar nicht.
Aber du hast schon recht, danach ist nicht gesucht. Alles gut, Heinileini.

Harald, ich habe es mit drei verschachtelten FOR-Schleifen versucht, Modul [1..(N-1)!], Zeile, Spalte. Es wird mir aber zu kompliziert. Im richtigen Leben würde ich nach überschaubaren Lösungen suchen. Ich bin aber mal gespannt, was Heinileini daraus macht.
 
ich denke dass die Drop-Down liste kein gute Lösung für die Bediener ist. Schon bei 24 Kombination ist die Dropdown etwas (zu) tief.
Mit 5 Zifferen und 120 Kombinationen macht es kein Sinn mehr.
Auswählen aus symbolischen Listen mit 100..200 Einträgen ist heutzutage durchaus als zumutbar eingestuft und wird z.B. zur Auswahl von Geburtsjahr oder aus einer Länderliste A... bis Z... häufig gemacht. Dann sind das aber meistens "Wisch"-Listen auf Touch-Bildschirmen, wo man "mit Schwung" drüberwischt und die Liste scrollt alleine 50 Einträge weiter. Das geht aber nicht mit WinCC 7.5, da reagiert das Auswahlfeld noch nicht mal auf das Eintippen der ersten Ziffer bzw. Anfangsbuchstabe.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wie gesagt, habe ich die Aufgabe der Decodierung/Umcodierung schon erledigt, und zwar in AWL mit SPL, weil ich keinen Algorithmus kenne und auch keinen auf die Schnelle finden konnte, der die Umcodierung durch eine Berechnung lösen kann.

Die Lookup-Tabelle habe ich ausgeschlossen, ...
Die SPL-Variante ist ja die Methode "Lookup-Tabelle" und die bietet sich für die Berechnung in der "umgekehrten Richtung" schon gar nicht an.

Sooo, hier also meine VBA-Varianten für die Berechnung in der "umgekehrten Richtung" (Zahl --> Index):
Code:
Function IdxNummi4(X1)
xNum$ = Trim$(X1)
xLen& = Len(xNum$)
xOk& = xLen& = 4 And Len(Replace(Replace(Replace(Replace(xNum$, "1", ""), "2", ""), "3", ""), "4", "")) = 0
If Not xOk& Then IdxNummi4 = 0: Exit Function ' Falls Zahl nicht korrekt: Abbruch mit RückgabeWert = 0
For ix& = 1 To xLen&
    xSt4$ = xSt4$ + Chr$(ix& + 48)
Next ix&
xSt3$ = Replace$(xSt4$, Mid$(xNum$, 1, 1), "")
xSt2$ = Replace$(xSt3$, Mid$(xNum$, 2, 1), "")
xPt3& = 6 * (Mid$(xNum$, 1, 1) - 1)
xPt2& = Int((InStr(Right$(xSt3$, 2) & " " & Left$(xSt3$, 1) & Right$(xSt3$, 1) & " " & Left$(xSt3$, 2), xSt2$) - 1) / 3) * 2
xPt1& = Sgn(Mid$(xNum$, 3, 2) - xSt2$)
IdxNummi4 = xPt3& + xPt2& + xPt1& + 1
End Function

' - - - - + - - - - + - - - - + - - - - + - - - - + - - - - + - - - - + - - - - + - - - - +

Function IdxNummi5(X1)
xNum$ = Trim$(X1)
xLen& = Len(xNum$)
xOk& = xLen& = 5 And Len(Replace(Replace(Replace(Replace(Replace(xNum$, "1", ""), "2", ""), "3", ""), "4", ""), "5", "")) = 0
If Not xOk& Then IdxNummi5 = 0: Exit Function ' Falls Zahl nicht korrekt: Abbruch mit RückgabeWert = 0
For ix& = 1 To xLen&
    xSt5$ = xSt5$ + Chr$(ix& + 48)
Next ix&
xSt4$ = Replace$(xSt5$, Mid$(xNum$, 1, 1), "")
xSt3$ = Replace$(xSt4$, Mid$(xNum$, 2, 1), "")
xSt2$ = Replace$(xSt3$, Mid$(xNum$, 3, 1), "")
xPt4& = 24 * (Mid$(xNum$, 1, 1) - 1)
xPt3& = Int((InStr(Replace$(xSt4$, Mid$(xSt4$, 1, 1), "") & " " & Replace$(xSt4$, Mid$(xSt4$, 2, 1), "") & " " & Replace$(xSt4$, Mid$(xSt4$, 3, 1), "") & " " & Replace$(xSt4$, Mid$(xSt4$, 4, 1), ""), xSt3$) - 1) / 4) * 6
xPt2& = Int((InStr(Right$(xSt3$, 2) & " " & Left$(xSt3$, 1) & Right$(xSt3$, 1) & " " & Left$(xSt3$, 2), xSt2$) - 1) / 3) * 2
xPt1& = Sgn(Mid$(xNum$, 4, 2) - xSt2$)
IdxNummi5 = xPt4& + xPt3& + xPt2& + xPt1& + 1
End Function
Das mutet zwar mehr nach "TextVerarbeitung" an als nach Algorithmus, aber ... na ja, what shall's.

Edit (2022-03-07; 14:40):
Die "SchrottZeile"
Code:
Replace$(xSt4$, Mid$(xSt4$, 3, 1), "") & " " & Replace$(xSt4$, Mid$(xSt4$, 4, 1), "")
aus IdxNummi4 entfernt.
Habe keine Ahnung, warum die durch copy/paste dazu gezaubert wurde.
 
Zuletzt bearbeitet:
Nein kein ARRAY, sondern eine Textliste ist gemeint.
Das ist aber schon fast ein Streit um die Formulierung, Dagobert.
Sogar eine TextListe kann man als Variante eines Arrays betrachten. Man gibt den Zeilen der Liste eine fortlaufende Numerierung und schon sind diese beiden Welten vereint.
Ich bin aber mal gespannt, was Heinileini daraus macht.
Dein banges Warten kannst Du eigentlich beenden, Dagobert.
Das Ergebnis hatte ich doch gestern in #16 gepostet. Zugegeben, nicht in KOP oder FUP oder SCL, aber immerhin in VBA.
Da ich ausgiebig von impliziten DatentypKonversionen Gebrauch gemacht habe (wie auch im meinem Beitrag #19 von vorhin), habe ich den Quark noch nicht in SCL umformuliert, aus Zeitmangel und reiner Bequemlichkeit. ;)

Und nein, ich bin nicht faul, sondern lediglich im EnergieSparModus! :ROFLMAO:
 
Die SPL-Variante ist ja die Methode "Lookup-Tabelle"
Die SPL-Variante arbeitet zwar auch mit vorberechneten Werten, mit Lookup-Tabelle meine ich aber eine vorbereitete Tabelle (Array) und das Programm entnimmt direkt das durch den Index 1..14 adressierte Element: Code := Tabelle[Index];

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die SPL-Variante arbeitet zwar auch mit vorberechneten Werten, mit Lookup-Tabelle meine ich aber eine vorbereitete Tabelle (Array) und das Programm entnimmt direkt das durch den Index 1..14 adressierte Element: Code := Tabelle[Index];
Ja, so gesehen und genau genommen, ähnelt die SPL-Variante eigentlich eher einer CASE-Selektion, mit der man das Vorhandensein einer Tabelle/Liste vorgaukelt bzw. ersetzt.
 
Aber ein Stapel aus ThumbWheels macht die Eingabe auch nicht wirklich einfach. Man kann nicht entsprechend einer Eingabe einer Ziffer an einer Stelle dafür sorgen, dass diese Ziffer dann an den übrigen Stellen nicht mehr anwählbar ist.
Und die Eingabe der 6 Ziffern (bei einer 4-stelligen Zahl) oder der 5 Ziffern (bei einer 5-stelligen Zahl), die generell nicht zur Auswahl stehen, kann man auch nicht für die Eingabe sperren.
Ich wurde das Thumbwheel mit eine Übernahme Button kombinieren. Und die Button sollte nur bedienbar sein wenn eine erlaubte Kombination gewählt ist.
Genau wie bei ein realen Thumbwheel.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Noch ein Vorschlag:
Anstatt das Thumbwheel, vier Buttons 1-2-3-4 und zwei Buttons Reset und Aktivieren.
Die Reihenfolge die sie betätigt werden bestimmen die Zahlenreihe.

Edit: Die Buttons können Farbanimation haben. Wenn ein Aggregat schon gewählt ist, wird der dazuhörige Button ausgegraut.

Aggregat_wahl_1234.png
 
Zuletzt bearbeitet:
Das ist aber schon fast ein Streit um die Formulierung, Dagobert.
Sogar eine TextListe kann man als Variante eines Arrays betrachten. Man gibt den Zeilen der Liste eine fortlaufende Numerierung und schon sind diese beiden Welten vereint...
Heinileini, ich versuche dir die ganze Zeit zu erklären, dass in WinCCflexible und im TIA-Portal bei Textlisten KEINE fortlaufende Numerierung notwendig ist.

... Das Ergebnis hatte ich doch gestern in #16 gepostet ...
Wenn ich 2 und 2 zusammen zähle, erhalte ich auch ein Ergebnis. Aber ist das die gesuchte Lösung?
 
Heinileini, ich versuche dir die ganze Zeit zu erklären, dass in WinCCflexible und im TIA-Portal bei Textlisten KEINE fortlaufende Numerierung notwendig ist.
Das habe ich doch verstanden, Dagobert.
Wenn ich das gerne möchte, kann ich doch den Zeilen (Einträgen) einer Liste nach eigenem Gutdünken eine eigene laufende Nr hinzufügen und die Liste unter Verwendung dieser Numerierung als Index in ein Array eintragen. Wo ist das Problem?
Wenn ich 2 und 2 zusammen zähle, erhalte ich auch ein Ergebnis. Aber ist das die gesuchte Lösung?
Woher soll ich das Wissen? Hast Du mir schon verraten, wofür Du eine Lösung suchst und ich habe es nur übersehen?
In welcher Form hättest Du denn gern die Lösung zu der von Harald gestellten Aufgabe?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
.. In welcher Form hättest Du denn gern die Lösung zu der von Harald gestellten Aufgabe?
Ich stelle mir einen richtigen Algorithmus vor, der flexibel in der Stellenzahl ist, der mehr rechnet als schiebt und ersetzt.

.. als Index in ein Array eintragen. Wo ist das Problem? ...
Das war ja nun von vorn herein ausgeschlossen.
 
Ich stelle mir einen richtigen Algorithmus vor,
1. der flexibel in der Stellenzahl ist,
2. der mehr rechnet als schiebt und ersetzt.
Zu 1.: Wird angestrebt, ist aber nicht realisiert.
Zur Zeit strebe ich ferner an, mit Kombinationen aus beliebigen Zeichen zu arbeiten, also die Beschränkung auf n fortlaufend aufeinanderfolgenden Ziffern, beginnend mit 1, aufzuheben (davon ist in Beitrag #16 noch nichts zu sehen).

Zu 2.: mehr Arithmetik? Allen Ernstes?
In meinem Beitrag #16 benutze ich:
- Addition,
- Subtraktion,
- Multiplikation,
- Division,
- Modulo
Ich könnte auch mit Fakultäten arbeiten, habe aber stattdessen erstmal Konstanten verwendet, um die Formeln nicht noch umfangreicher und noch unübersichtlicher werden zu lassen (2! = 2; 3! = 6; 4! = 24; 5! = 120).
Ferner benutze ich Vergleiche u.a. zur Realisierung von
- Limit unter zuHilfeNahme der Funktionen
- Min und
- Max.

Was stört Dich an "Schieben und Ersetzen"?
Kombinatorik hat durchaus mit Rotieren/Schieben und Tauschen/Ersetzen zu tun.
Ich glaube, Dagobert, es sind eher die in der Aufgabestellung lauernden BegleitUmstände, die nicht nach Deinem Geschmack sind, als mein bescheidener LösungsAnsatz für
1. die Aufgabenstellung mit 4 Ziffern und
2. meine "Zugabe", sinngemäss dasgleiche mit 5 Ziffern.

Das war ja nun von vorn herein ausgeschlossen.
Der Index war nicht ausgeschlossen. Im Gegenteil, aus dem Index soll laut Aufgabenstellung das Ergebnis berechnet werden.
Zwar wird das Wort Index in der Aufgabenstellung nicht benutzt, aber es wird einem quasi auf die Zunge gelegt, wo Du es Dir zergehen lassen darfst.
Bei der Lösung soll keine Tabelle benutzt werden, ABER zur Klarstellung der Aufgabe hat Harald eine Tabelle angedeutet, naheliegenderweise.

Übrigens, mein Beitrag #16 arbeitet ohne jegliches Array, benutzt aber Strings, in denen listigerweise Ziffern aufgelistet sind.
Selbstverständlich kann man aber den Inhalt eines Strings als ein Array von Zeichen deuten ... wenn man unbedingt will.

Hast Du denn schon mal an einer Lösung der Aufgabe herumgeknobelt? Oder wartest Du lieber weiter darauf, dass hier die PatentLösung nach Deinem Geschmack vom Himmel fällt?
 
Oh je, bin ich mal wieder ins Fettnäpfchen getreten? Entschuldige!

Hast Du denn schon mal an einer Lösung der Aufgabe herumgeknobelt? Oder wartest Du lieber weiter darauf, dass hier die PatentLösung nach Deinem Geschmack vom Himmel fällt?
Ja, ich hatte am Wochenende ein wenig daran herumgeknobelt. Allerdings musste ich mir recht bald eingestehen, dass ich nicht auf eine Lösung "nach meinem Geschmack" kommen werde. Da ich so etwas mit Sicherheit auch völlig anders lösen würde, vor allem auch bedienungsfreundlicher, interessiert mich eine Patentlösung nicht wirklich. Rein programmtechnisch bin ich natürlich schon an Lösungen interessiert, denen man etwas abgewinnen kann.
 
Zurück
Oben