Zufallszahl generieren

jamalau

Level-1
Beiträge
31
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
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 ?
 
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:
A=1664525
B=1013904223
M=2^32 da dies nicht darstellbar ist benutze ich hier den größtmöglichen wert
von 2147483647 (2^31 -1)
Der Wert Obergrenze kommt nur ca 50 % oft vor bezogen auf die Werteverteilung
der dazwischenliegenden Werte.
Der Wert Untergrenze kommt nur ca 50 % oft vor bezogen auf die Werteverteilung
der dazwischenliegenden Werte.
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.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
Zuletzt bearbeitet:
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.
 
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
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.
 
Wenn man in einer Hochsprache die Function "Random" (oder wie immer sie jeweils heißt) einsetzt, kann einem genau das auch passieren ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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.
 
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.
 
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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.
 
Zurück
Oben