Just for Fun! Kann man einen Würfel programmieren ?

spqr76

Level-2
Beiträge
128
Reaktionspunkte
4
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo ,
bei uns in der Firma werden während der Ausbildung zum Industrieelektroniker in verschiedenen Lehrgängen Platinen hergestellt, die zum Ende der Ausbildung ein ganzes Rack ergeben. Unter anderem ist auch ein elektronischer Würfel dabei. Bei diesem Würfel ist das Ergebnis allerdings von der Zeit abhängig wie lange man den Startknopf betätigt. Drückt man immer gleich lang, bekommt man immer das selbe Ergebnis. In der kaffeepause haben wir diskutiert ob es möglich ist einen Würfel in der S7 zu programmieren. Allerdings bin ich da zu keinem Ergebnis gekommen, und bin mir nicht sicher ob dies überhaupt möglich ist. Was meint ihr dazu ? Ist es möglich einen Baustein zu schreiben der Beispielsweise über einen Taktmerker gestartet wird und immer ein anderes Ergebnis liefert im Zahlenbereich zwischen 1-6.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Boxy ,
ich bin mir nicht sicher ob es möglich ist " Zufall " zu programmieren. Wenn ja wüsste ich nicht wie . Rein logisch gesehen würde ich sagen es geht nicht da der Taktmerker immer zum selben Zeitpunkt geschaltet wird. Das Programm eine gewisse Logik und Routinen hat.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also, "zufällig" sollte in einer SPS eigentlich gar nichts passieren können, auch wenn es manchmal so aussieht :ROFLMAO: . Aber man kann natürlich ein Ergebnis generieren, welches vom Bediener nur sehr schwer bzw. garnicht zu beeinflussen ist. Beispielsweise könnte man die Millisekunden der Ührzeit hernehmen, oder die Systemzeit (TIME_TCK), diese durch 6 dividieren, zu dem Rest der Division (MOD 6) +1 addieren und als Ergebnis ausgeben.
 
ich bin mir nicht sicher ob es möglich ist " Zufall " zu programmieren. Wenn ja wüsste ich nicht wie.
Das hast du Recht. Man kann keinen echten Zufall programmieren man kann aber etwas programmieren das sich fast zufälliug verhält (Pseudozufallszahlen).

Rand() oder Random() in vielen Programmiersprachen generiert solche Pseudozufallszahlen.

Eine Übersicht über die Algorithmen die dafür in Frage kommen findest du hier:
http://de.wikipedia.org/wiki/Zufallszahlengenerator#Softwaretechnische_Realisierungen

EDT: in der SPS ließe sich dieser hier sehr einfach imlementieren: [url]https://de.wikipedia.org/wiki/Multiply-with-carry

[/URL]
 
Zuletzt bearbeitet:
Also, "zufällig" sollte in einer SPS eigentlich gar nichts passieren können, auch wenn es manchmal so aussieht :ROFLMAO: . Aber man kann natürlich ein Ergebnis generieren, welches vom Bediener nur sehr schwer bzw. garnicht zu beeinflussen ist. Beispielsweise könnte man die Millisekunden der Ührzeit hernehmen, oder die Systemzeit (TIME_TCK), diese durch 6 dividieren, zu dem Rest der Division (MOD 6) +1 addieren und als Ergebnis ausgeben.

Das mit den ms halte ich übrigens für keinen besonders guten Ansatz. Durch den SPS Zyklus wirst du unweigerlich ein Muster reinbekommen.
 
Wirklich sehr einfach, und sowas von einleuchtend :ROFLMAO:. Lest mal den Diskussionsbeitrag zu dem Thema.
Der gute Mensch soll sich hüten vor den Mathematikern, hat mal einer gesagt. Recht hatte er.


Das mit den ms halte ich übrigens für keinen besonders guten Ansatz. Durch den SPS Zyklus wirst du unweigerlich ein Muster reinbekommen.
Dieser Gedanke ist natürlich richtig. Allerdings bezweifle ich dass tatsächlich ein erkennbares Muster entstehen wird. Einem Zähler, der über 23 Tage oder auch nur über einer Sekunde die Millisekunden zählt, stehen Operationen gegenüber, die in µs oder gar in ns zyklisch ausgeführt werden (OB1-Zyklus). Von dem Azubi, der sich seinen Daumen an einem Taster platt drückt mal ganz zu schweigen. Zugegeben, mathematisch ist es als "Zufallsgenerator" keinesfalls korrekt, aber in vielen Fällen sicherlich ausreichend.

Und die Azubis haben hiermit die Aufgabe, das mal mit der Systemzeit zu testen! Drückt dann wenigstens 1000 mal auf den Taster und zählt die Ergebnisse. Das Zählen könnt ihr natürlich auch der SPS überlassen. Es sollte eine gleichmäßige Verteilung erkennbar sein.
 
Wirklich sehr einfach, und sowas von einleuchtend :ROFLMAO:. Lest mal den Diskussionsbeitrag zu dem Thema.

Zugegeben ich habe mir die Seite nicht im Detail angeschaut sondern nur den Code gesehen und gedacht dass läßt sich sicher in der S7 implementieren
Code:
static uint32_t Q[1038];
static uint32_t c = 123;

uint32_t MWC1038() {
    static uint32_t i = 1037;
    uint64_t t;

    t = (611376378ULL * Q[i]) + c;
    c = t >> 32;

    if (--i != 0)
        return (Q[i] = t);

    i = 1037;
    return (Q[0] = t);
}

Aber selbst die "richtigere" Lösung dauf der englischen Wiki Seite sollte sich machen lassen. Und wenn dir das nicht gefällt dann kannst du dir einen anderen Algorithmus aus der Liste aussuchen. Auf jeden Fall würde ich auf bekannte Algorithmen zurück greifen. Dann lernen die Leute dass man lieber auf was Bewährtes zurückgreift anstatt sich selber was auszudenken.

Der gute Mensch soll sich hüten vor den Mathematikern, hat mal einer gesagt. Recht hatte er.

Ich denke dass viele Programmierer sich vor anderen (speziell "wissenschaftlichen") Fachgebieten hüten weil Sie glauben Sie können es eh selber besser. Meiner Meinung nach ist das schlechter Stil in der Arbeit. "Lieber gut geklaut als schlecht erfunden" wäre imho das bessere Motto

Dieser Gedanke ist natürlich richtig. Allerdings bezweifle ich dass tatsächlich ein erkennbares Muster entstehen wird. Einem Zähler, der über 23 Tage oder auch nur über einer Sekunde die Millisekunden zählt, stehen Operationen gegenüber, die in µs oder gar in ns zyklisch ausgeführt werden (OB1-Zyklus). Von dem Azubi, der sich seinen Daumen an einem Taster platt drückt mal ganz zu schweigen. Zugegeben, mathematisch ist es als "Zufallsgenerator" keinesfalls korrekt, aber in vielen Fällen sicherlich ausreichend.

Naja, ich weiß nicht genau was du meinst.
 
Zurück
Oben