# Zufallszahl generieren



## jamalau (26 April 2007)

Hallo, möchte mit der S7 300 eine Zufallszahl im Bereich 0-30 generieren, wie kann ich sowas am besten realisieren ?

Habe mir schon das Programm von Lischi mal angesehen, dort wird ja im MD10, eine Zufallszahl generiert. Wenn ich mir aber das Programm in der Simulation per Einzelschritt anschaue, wird nur die Zahl bei jedem Schritt um 1 aufaddiert.

Mache ich da was falsch ?


----------



## volker (26 April 2007)

nein da wird nichts aufaddiert. lass das mal 'normal' laufen



> Zufallszahlen können durch folgende Formel erzeugt werden:
> V[n+1]=(A*V[n]+B) modulo M
> "Numerical Recipes", eine Sammlung numerischer Algorithmen, nannte als
> Beispielwerte:
> ...


für v[n] wird die systemzeit (sfc64) benutzt

lass doch mal das beispielprogramm laufen und schau dir den db dazu online an. dann siehst du wie oft die zahl erzeugt wurde.


----------



## crash (26 April 2007)

Du mußt einfach einen Zähler in jedem Zyklus hochzählen(+1).
wenn der Zähler >30 dann setzt du ihn wieder auf Null.
Wenn du in irgendeinem Zyklus den Zähler abfragst dann hat er einen zufälligen Wert zwischen 0 und 30.
Wenn du in jedem Zyklus eine Zufallszahl brauchst geht das mit dieser Lösung leider nicht.

EDIT: Volkers Lösung ist wohl besser


----------



## Werner54 (26 April 2007)

*Zufallszahl*

Hallo,

wie wäre es mit den Millisekunden der Bausteinaufrufzeit. Das ergibt einen beinahe zufälligen Wert zwischen 0 und 999. Anschließend durch z.B. 32,8 teilen und runden ergibt Werte zwischen 0 und 30.


----------



## Zottel (27 April 2007)

Die nach Volkers Methode generierten Pseudozufallszahlen weisen zweierelei Regelmäßigkeiten auf:
1. Bei einem gleichen Startwert wird immer wieder dieselbe Folge generiert
2. Die Folge wiederholt sich nach M Schritten
Falls du in deiner SPS hochauflösende Analogeingänge hast, kannst du das Rauschen nutzen um echte Zufallszahlen zu generieren:
- Analogwert laden, aber nicht öfter, als wirklich eine neue A/D-Wandlung stattfindet
- Die niederwertigsten 1 bis 3 Bits ausmaskieren, je nach Auflösung und Rauschanteil
- Diese Bits in ein Wort oder Doppelwort schieben
- Jedesmal, wenn das Wort oder Doppelwort ganz mit neuen Bits gefüllt ist, nach Real wandeln, durch den höchstmöglichen Wert eines Worts oder Doppelworts teilen und mit 30.0 malnehmen


----------



## hugo (27 April 2007)

in der oscat lib haben wir einen zufallszahlengenerator der auch das startproblem behebt und jedesmal mit einer neuen sequenz beginnt.
ausserdem haben wir den zufallszahlengenerator so umgebaut das er mit sehr wenig rechenleistung auskommt. der generator rdm ist als funktion geschrieben und bleibt nicht im speicher, liefert aber trotzdem immer neue zahlen.
zu finden auch im source code unter www.oscat.de


----------



## volker (27 April 2007)

Zottel schrieb:


> Die nach Volkers Methode generierten Pseudozufallszahlen weisen zweierelei Regelmäßigkeiten auf:
> 1. Bei einem gleichen Startwert wird immer wieder dieselbe Folge generiert
> 2. Die Folge wiederholt sich nach M Schritten


 
da gebe ich dir durchaus recht.
aber die frage ist, wie zufällig soll das denn nun wirklich sein?
bei der 400er ist die auflösung des sfc64 1ms, bei der 300er 10ms.
wenn ich den baustein nun zyklisch aufrufe und eine *konstante* zykluszeit annehme gibt es natürlich eine wiederkehrende folge. 
da die zykluszeit aber bei den meisten programmen nicht immer gleich ist erhöht sich die chance einer nicht wiederkehrenden folge ungemein.


----------



## Larry Laffer (27 April 2007)

Wenn man in einer Hochsprache die Function "Random" (oder wie immer sie jeweils heißt) einsetzt, kann einem genau das auch passieren ...


----------



## hugo (27 April 2007)

das ganze mit der gleichen sequenz beim starten kann man beheben indem man als seed für die jeweilige sequenz den timer des systems ausliest.
damit ist hinreichend sichergestellt das die sequenz immer eine neue ist.
allerdings ist abzuraten den timer für die generierung der zaheln selbst zu nutzen. die zykluszeiten können sehr genau immer gleich sein.


----------



## volker (27 April 2007)

hugo schrieb:


> die zykluszeiten können sehr genau immer gleich sein.


können theoretisch ja.
in den meisten programmen gibt es diverse programmteile die nur bei bestimmten vorraussetzungen bearbeitet werden. allein dadurch ändert sich der zeitpunkt des aufrufs.

aber die frage ist, brauche ich überhaupt in jedem zyklus eine neue zahl ?

ich brauche eine zufallszahl um z.b. alle 10-30 teile ein teil zum prüfen rauszulegen. da auch der produktionszyklus nicht auf die ms genau abläuft, reicht mir dieser zufall allemal.


----------



## hugo (28 April 2007)

in diesem fall solltest du dir nicht die mühe einer zufallszahl machen sondern wirklich nur die untersten bits des timers auswerten geht schnell und braucht keinen speicher


----------



## jamalau (2 Mai 2007)

So, jetzt habe ich aber in  den letzten Tagen, eine Menge Aussagen bekommen.
Mal sehen was ich damit anfangen kann !
@Volker
Danke fuer den Link, werde mich dort auch mal umsehen, ist sehr vielversprechend.

Besten dank alle fuer die Tip´s werde sicherlich daraus irgend etwas nutzen können.


----------

