# Einfache Zufallsziffer  (Random) in SCL (Siemens S7)



## ssyn (5 Oktober 2022)

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;




```
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


----------



## Mecha2312 (5 Oktober 2022)

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


----------



## hucki (5 Oktober 2022)

Ansonsten sind weitere Zufallsfunktionen auch in den LGF verfügbar:


----------



## Tschoke (5 Oktober 2022)

Also ich benutze immer das






						Xorshift – Wikipedia
					






					de.wikipedia.org
				




Vorteil: Funktioniert nicht nur bei Siemens

Mit Skalierung auf einen bestimmten Bereich sieht es dann so aus:

```
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
```


----------



## Onkel Dagobert (5 Oktober 2022)

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?


----------



## Heinileini (5 Oktober 2022)

Onkel Dagobert schrieb:


> 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? 



Onkel Dagobert schrieb:


> 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?


----------



## Mecha2312 (5 Oktober 2022)

ich verstehe das xorshift ding nicht. 
Ist doch alles statisch?
Oder ich  verstehe die Implementierung von @Tschoke nicht.


----------



## Tschoke (5 Oktober 2022)

Onkel Dagobert schrieb:


> Kann mich mal jemand aufklären, wo immer diese Hokus-Pokus-Rechnungen herkommen? Steckt da echt etwas Wahres dahinter?


Hab die Quelle doch verlinkt



Mecha2312 schrieb:


> Ist doch alles statisch?


Durch das schieben und XOR verändert sich der Wert bei jedem Aufruf.
Der "alte" Wert ist dann der Startwert der Berechnung für den "neuen" Wert.


----------



## Heinileini (5 Oktober 2022)

Mecha2312 schrieb:


> 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.



Mecha2312 schrieb:


> 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.


----------



## circlehook (5 Oktober 2022)

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.


----------



## Mecha2312 (5 Oktober 2022)

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.


----------



## Heinileini (5 Oktober 2022)

circlehook schrieb:


> 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.


----------



## Onkel Dagobert (5 Oktober 2022)

Heinileini schrieb:


> ... 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?



Heinileini schrieb:


> 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.



Tschoke schrieb:


> 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?



circlehook schrieb:


> ... wofür habt Ihr schonmal Zufallszahlen in der SPS benötigt? ...


Bei mir war es nur Spielerei.


----------



## Tschoke (5 Oktober 2022)

Onkel Dagobert schrieb:


> 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.


----------



## Heinileini (5 Oktober 2022)

Onkel Dagobert schrieb:


> ..., 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.


----------



## Mrtain (9 Oktober 2022)

Ich habe das mal gebraucht, um eine kollisionsbetrachtung von zwei Verfahrwagen zu testen.


----------



## rostiger Nagel (9 Oktober 2022)

circlehook schrieb:


> 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.


Wir benötigten das mal um Furnierstreifen zu mischen,
damit unterschiedliche Verläufe im Parkett entstehen.


----------



## skorpion37 (13 November 2022)

circlehook schrieb:


> Ich würde es auch der von Systemzeit ableiten.


Ja, prinzipiell nicht schlecht. Aber was ist, wenn du direkt zwei Zufallszahlen brauchst? Dann ist die Zeit alles andere als zufällig.


----------



## sps_21 (13 November 2022)

circlehook schrieb:


> 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.



Zum Testen - und dann muss es ein guter Pseudozufall sein.  Pseudo, damit es reproduzierbar bleibt; logisch🤗


----------



## sps_21 (13 November 2022)

Onkel Dagobert schrieb:


> Na toll! Aber wie kommt dieser Algorithmus zu stande? Das kann doch unmöglich hergeleitet werden? Oder doch?



Ursprung ist die Experimentelle Mathematik - das Ergebnis wird dann bewiesen. Das es statistische Schwächen gibt ist bekannt, aber kaum jemand braucht tatsächlich kryptografische Sicherheit.


----------



## circlehook (14 November 2022)

skorpion37 schrieb:


> Ja, prinzipiell nicht schlecht. Aber was ist, wenn du direkt zwei Zufallszahlen brauchst? Dann ist die Zeit alles andere als zufällig.


Wenn ich zwei unterschiedliche Werte innerhalb eines Zyklus bräuchte, kann ich immer noch den Ausgangswert manipulieren.
Sprich mit Swap/Shift/Rotate vor der Weiterverarbeitung abändern.

Da für mich "Zufallszahlen" bisher nur Spielereien bzw. für Test/Inbetriebnahme benötigt wurden, hat es die Zeit für mich immer getan.


----------



## Pippen (15 November 2022)

Ich habe Zufallszahlen letztmals gebraucht, um ein temporäres Verzeichnis zu erstellen (allgemeiner Funktionsblock). Genauer, um den Namen für dieses temporäre Verzeichnis zu erzeugen.


----------



## Pippen (15 November 2022)

circlehook schrieb:


> Wenn ich zwei unterschiedliche Werte innerhalb eines Zyklus bräuchte, kann ich immer noch den Ausgangswert manipulieren.
> Sprich mit Swap/Shift/Rotate vor der Weiterverarbeitung abändern.
> 
> Da für mich "Zufallszahlen" bisher nur Spielereien bzw. für Test/Inbetriebnahme benötigt wurden, hat es die Zeit für mich immer getan.


Ich kenne mich bei Siemens ja nicht aus, aber ist es da nicht möglich während eines Zyklus eine einen Timer abzufragen, der während dem Zyklus weiterzählt? Oder wie kann man dann messen, wie lange die Abarbeitung bestimmter Codeteile dauert?


----------



## PN/DP (15 November 2022)

Und wie bringst Du dann "Zufall" rein, wenn zwischen der Ermittlung der zwei Zahlen immer gleich viel Zeit vergeht?


----------



## Pippen (15 November 2022)

PN/DP schrieb:


> Und wie bringst Du dann "Zufall" rein, wenn zwischen der Ermittlung der zwei Zahlen immer gleich viel Zeit vergeht?


Das spielt keine Rolle. Denn die absolute Zeit ist entscheidend (wenn sie als Startwert genommen wird), nicht die Differenz zwischen den beiden Zeiten.


----------

