Einfache Zufallsziffer (Random) in SCL (Siemens S7)

ssyn

Level-2
Beiträge
230
Reaktionspunkte
23
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich suchte einfache Random und fand, meiner Meinung nach, ganz einfache Lösung dafür, möchte hier Lösung lassen, vielleicht braucht jemand es auch.

RetVal : Int ;
Start : Bool;
InfoZ : UDInt;
REST : UDInt;
timeJETZT : DTL;



Code:
IF #Start THEN
    #RetVal := RD_SYS_T(OUT => #timeJETZT);
    #InfoZ := #timeJETZT.NANOSECOND / 10000;
   #REST := (#InfoZ MOD 5) + 1;
   #Start := FALSE;
   
   
END_IF;

In InfoZ - kriege ich die Nummer von 0 bis 99999
Rest - Zufallsziffern von 1 bis 5
Ich habe es geprüft, es sieht wie ganz normale Random

randomSiemens.jpg
 
habe ich so auch schon häufiger gemacht, ist wohl für viele Anwendungen ausreichend.
Dafür sorgt die Firmware der S7-1x00 mit den ständigen Zykluszeitschwankungen durch Systemprozesse, Kommunikation und was weiß ich schon :)
 
Also ich benutze immer das


Vorteil: Funktioniert nicht nur bei Siemens

Mit Skalierung auf einen bestimmten Bereich sieht es dann so aus:
Code:
FUNCTION_BLOCK "Random"
   VAR_INPUT
      iMin : Real := 0.0;
      iMax : Real := 1.0;
   END_VAR

   VAR_OUTPUT
      oRnd : Real;
   END_VAR

   VAR
      vRnd : Word := 1234;
   END_VAR


BEGIN
    (*XorShift*)
    #vRnd := #vRnd XOR SHL(IN := #vRnd, N := 13);
    #vRnd := #vRnd XOR SHR(IN := #vRnd, N := 9);
    #vRnd := #vRnd XOR SHL(IN := #vRnd, N := 7);
    
    #oRnd := "ScaleReal"(iIn := INT_TO_REAL(#vRnd), iInMin := -32768.0, iInMax := 32767.0, iOutMin := #iMin, iOutMax := #iMax);
END_FUNCTION_BLOCK
 
Ich hab's auch schonmal mit der Systemzeit getestet und das Ergebnis geprüft. Gleichmäßige Verteilung, mehr Zufall geht nicht.

Kann mich mal jemand aufklären, wo immer diese Hokus-Pokus-Rechnungen herkommen? Steckt da echt etwas Wahres dahinter?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Kann mich mal jemand aufklären, wo immer diese Hokus-Pokus-Rechnungen herkommen? Steckt da echt etwas Wahres dahinter?
Ich könnte Dir die Quelle einer HokusPokusRechnung (REAL-Multiplikation mit 997 und Abschneiden der VorkommaStellen) nennen:
Handbuch des hp97-Tischrechners. Die "ZufallsZahlen"-Folge ist damit zwar reproduzierbar/vorhersehbar, hängt aber von der gewählten StartZahl ab und genügt für diverse Anwendungen tatsächlich.
Da steckt die Absicht dahinter, mit relativ wenig Aufwand eine brauchbare Verteilung der Ergebnisse zu produzieren.
Aber hilft Dir das weiter, Dagobert? ;)

Ich hab's auch schonmal mit der Systemzeit getestet und das Ergebnis geprüft. Gleichmäßige Verteilung, mehr Zufall geht nicht.
Aber wie hast Du aus der SystemZeit die "ZufallsZahl" berechnet? Z.B. nur die ms genommen und normiert?
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
ich verstehe das xorshift ding nicht.
Ich versuch's mal.
Die Zahl wird "wild durcheinander gewürfelt" durch drei verschiedene SchiebeOperationen.
Die (Zwischen-)Ergebnisse werden dabei wieder zusammengefasst durch XOR.
Warum XOR statt AND oder OR?
Bei AND nimmt die Anzahl der Einsen mit Sicherheit allenfalls ab und nie zu.
Bei OR nimmt die Anzahl der Nullen mit Sicherheit allenfalls ab und nie zu.
Die REAL-Zahl ist inpuncto "wild durcheinander würfeln" bestens geeignet, weil sie aus den drei Gruppen Vorzeichen, Mantisse und Exponent zusammengesetzt ist und durch die Schieberei die Bits von einem der Bereiche in einen anderen gelangen.

Ist doch alles statisch?
VAR
vRnd : Word := 1234;
END_VAR
vRnd sollte in der Tat statisch sein, aber nicht bei jedem Aufruf des FB wieder neu mit 1234 initialisiert werden.
 
Zuletzt bearbeitet:
Ich würde es auch der von Systemzeit ableiten.
Und dann ggf. mit Norm/Scale auf den gewünschten Wertebereich skalieren.

Nur aus Interesse, wofür habt Ihr schonmal Zufallszahlen in der SPS benötigt?
Bei mir gab es außer für eine Art Auftragsgenerator nie wirklich eine Anwendung dafür.
 
Danke @Heinileini :)

@circlehook: ich habe damit z.b. testweise ein workaround um Program_Alarm gebaut, um bei einem Meldeschwall die Zykluszeitbelastung gering zu halten.
Zeitstempel der Meldungen gespeichert und dann zufällig verteilt angetriggert.
Hat einigermaßen funktioniert.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nur aus Interesse, wofür habt Ihr schonmal Zufallszahlen in der SPS benötigt?
Habe ich nur 1-mal eingesetzt, um zwei MultiplikationsBausteine (so etwas gab's mal unter S5) mit diversen Zahlen-Paaren parallel zueinander multiplizieren zu lassen. Die Ergebnisse wurden vom PLC-Programm verglichen und bei ungleichen Ergebnissen die beiden involvierten Faktoren in einem RingPuffer protokolliert.

Anekdote:
Ein Kollege hatte bei einem Kunden festgestellt, dass der MultiplikationsBaustein "spinnen" soll und als Probe bzw. zur Verifizierung den anderen Baustein herangezogen.
In dem einen Baustein (aus der PLC des Kunden kopiert) habe ich durch Vergleich mit dem "SollZustand" schnell festgestellt, dass ein Sprungziel nicht mehr dem Original entsprach - die beiden Sprungweiten (die korrekte und die falsche) unterschieden sich in einem einzigen Bit.
Nach der Restaurierung des offensichtlich beschädigten Bausteins hatte ich dann noch den o.g. VergleichsLauf gestartet.
Es ergaben sich immer noch sporadische Unterschiede.
Die protokollierten Fälle wurden dann noch per TaschenRechner nachgerechnet.
Diesmal zeigte sich der andere Baustein, der als Referenz gedient hatte, als ÜbelTäter. Bei diesem habe ich aber nicht mehr versucht, die Ursache zu finden, denn er war leider umfangreicher (beanspruchte mehr SpeicherPlatz), als der funktionierende.
 
... Die "ZufallsZahlen"-Folge ist damit zwar reproduzierbar/vorhersehbar, hängt aber von der gewählten StartZahl ab und genügt für diverse Anwendungen tatsächlich...
Naja, es kann ja sein dass es hierfür irgend welche Anwendungen gibt, aber "reproduzierbare Zufallszahlen" ist irgend wie ein richtig dämlicher Begriff. Vielleicht sollte man den Begriff Zufallszahl erst einmal richtig definieren?

Aber wie hast Du aus der SystemZeit die "ZufallsZahl" berechnet? Z.B. nur die ms genommen und normiert?
Es war einmal vor sehr sehr langer Zeit. Ich glaube, ich hatte damals aus dem aktuellen Zeitstempel im Format LDT (DATE_AND_LTIME) mittels MOD einen Bereich gewonnen, der ein Vielfaches von dem Zielbereich war. Damit hatte ich erreicht, dass alle Werte aus dem Zielbereich die gleiche Chance hatten, "gezogen" zu werden. Aber nagelt mich nicht darauf fest. Ob ich den Code noch habe, bezweifle ich.

Hab die Quelle doch verlinkt
Na toll! Aber wie kommt dieser Algorithmus zu stande? Das kann doch unmöglich hergeleitet werden? Oder doch? Oder verlinken auch Andere nur noch die Quelle, und verlassen sich auf den unbekannten weisen Mann aus den Tiefen des www?

... wofür habt Ihr schonmal Zufallszahlen in der SPS benötigt? ...
Bei mir war es nur Spielerei.
 
Na toll! Aber wie kommt dieser Algorithmus zu stande? Das kann doch unmöglich hergeleitet werden? Oder doch? Oder verlinken auch Andere nur noch die Quelle, und verlassen sich auf den unbekannten weisen Mann aus den Tiefen des www?
Ok.
Also meiner Meinung nach ist in technischen/wissenschaftlichen Fragen Wikipedia eine gute Quelle.
Der xorshift Algorithmus ist dort erklärt und die Einzelnachweise sind verlinkt. Der Entwickler ist auch bekannt.
Man findet auch sonst im Internet einige wissenschaftliche Arbeiten und Tests dazu.

Ich gebe natürlich zu, dass die Theorie der gesamten Pseudozufallszahlgenerierung und auch Kryptographie meinen Horizont sprengt. Bin aber in dem Thema eigentlich auch nur Anwender und nicht Entwickler.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
..., aber "reproduzierbare Zufallszahlen" ist irgend wie ein richtig dämlicher Begriff. Vielleicht sollte man den Begriff Zufallszahl erst einmal richtig definieren?
Ich verkneife mir mal, den Begriff Zufallszahl erst einmal richtig zu definieren. Allein schon aus Verlegenheit, Dagobert.
Dass es sogenannte ZufallsZahlenGeneratoren gibt, muss ich Dir nicht erzählen.
Auch, dass viele darauf basieren, aus einer vorgegebenen StartZahl, eine ZahlenFolge zu generieren. Und, dass sie insofern reproduzierbar sind, als bei identischen StartZahlen identische ZahlenFolgen produziert werden. Oft ist aber das Produzieren der StartZahl bereits "zufallsbedingt" ausgeführt, so dass die Reproduzierbarkeit darunter leidet.
"Reproduzierbare ZufallsZahlenFolgen" ist sicherlich ein widersprüchlicher, paradoxer Begriff. Aber er erinnert zumindest daran, dass es sich nur um scheinbare Zufälle handelt.

Sei's drum. Die hochwohlgelobte Stochastik benötigt so etwas und gelobt, dass man nach ihren Verfahren häufig viel schneller zum Ergebnis
bestimmter Aufgaben gelangen kann. In der SPS-Technik sehe ich nicht wirklich ein AnwendungsFeld dafür. Ein AnwendungsBeispiel, das ich selbst mal benutzt habe, hatte ich in Beitrag #12 geliefert.
 
Zurück
Oben