# Zufallszahlen mit SCL generieren ???



## bayerguard (26 November 2008)

Hall zusammen,

wie kann man mit SCL eine Zufallszahl (Output) generieren, bei Angabe einer best. Ober- und Untergrenze (jweils als Input)??

Da ich in jedem Zyklus eine neue Zufallszahl generieren will, sollte die Systemzeit SFC 64 enthalten sein.

kann mir jemand helfen??

greets
bayerguard


----------



## Ralle (26 November 2008)

Lies mal hier: http://www.sps-forum.de/showthread.php?t=13321&highlight=Zufallszahl

Volkers Formel in SCL einzugeben, sollte kein Problem sein.


----------



## bayerguard (26 November 2008)

ja sollte es ,

aber ich beschäftige mich erst 4 Tage mit SCL, deswegen bräucht ich da so ein paar Hinweise wie das mit SCL zu realisieren ist.

den Thread hatte ich schon gesehen, aber trotzdem danke.

greets


----------



## Ralle (26 November 2008)

Dann schau mal hier: http://www.sps-forum.de/showpost.php?p=76692&postcount=3

Das gibts auch für Step7 in SCL!
Den Inhalt der Funktion kannst du dir mal ansehen.


----------



## Steve81 (26 November 2008)

Vielleicht solltest du zu Beginn einfach mal einen Baustein schreiben, der dir mit einer ganz einfachen Formel einen Wert berechnet. Von mir aus einfach mal die Addition von 2 Zahlen. Damit lernst du den Umgang mit SCL erst einmal ein bisschen kennen. Wen das dann funktioniert kannst du dich langsam an deine eigentliche Aufgabe herantasten. Bei Fragen den Code posten und dir wird bestimmt geholfen. 

Hast du erfahrungen mit anderen Programmiersprachen wie C oder Pascal?


----------



## bayerguard (26 November 2008)

Hallo,

ich habe recht wenig Erfahrung mit programmieren im Allgemeinen, nur das was man in der Schule so angeschnitten und an der Uni so nebenbei gemacht hat.

Ich hab da mal was zusammen geschustert.

FUNCTION Zufall : DINT
VAR_INPUT
    Obergrenze :   INT; 
    Untergrenze:  INT;
END_VAR
VAR_TEMP
    TimeTck :   TIME; 
END_VAR
BEGIN
TimeTck := TIME_TCK();
Zufall := ABS(DINT_TO_INT(TIME_TO_DINT(TimeTck))) MOD (Obergrenze - Untergrenze);
END_FUNCTION

Ich glaube, dass meine Funktion die beiden Grenzen nicht als Zufallszahl mit generiert, wie könnte man das ändern?
Also dass die beiden Grenzen mit angezeigt werden.

greets


----------



## gravieren (26 November 2008)

Wo ist den der Hinweis auf die OSCAT.  


Zufallsgenerator MIT Quellcode für SCL  vorhanden.


www.oscat.de


----------



## Ralle (26 November 2008)

gravieren schrieb:


> Wo ist den der Hinweis auf die OSCAT.
> 
> 
> Zufallsgenerator MIT Quellcode für SCL  vorhanden.
> ...



Hier : http://www.sps-forum.de/showpost.php?p=169183&postcount=4


----------



## bayerguard (27 November 2008)

Hallo,

danke nochmal für den Hinweis,
aber ich wollte es eben selbst programmieren und nix fertiges nehmen!

Ich glaub, dass in meinem code noch ein paar schwächen sind, kann mir jemand helfen?

greets


----------



## Larry Laffer (27 November 2008)

Hallo,
hast du denn schon einmal getestet, was passiert ?

Ich würde an dem Code noch folgendes ändern :
	
	



```
Zufall := DINT_TO_INT(TIME_TO_DINT(TimeTck)) MOD (Obergrenze - Untergrenze) [COLOR=red]+ Untergrenze[/COLOR] ;
```
auf den ABS kjannst du m.E. verzichten ...
Du solltest außerdem sicherstellen, das  Obergrenze immer größer als Untergrenze ist und das (Obergrenze - Untergrenze) nicht negativ wird ...

Gruß
LL


----------



## bayerguard (27 November 2008)

Hallo;

Wie kann ich sicherstellen, dass meine angegebenen Grenzen auch als Zufallszahlen in der Ausgabe auftauchen?

Komm da grad nicht weiter, denn wenn ich eine Zufallszahl zwischen 1 und 3 generieren will, dann gibt er mir die 1 aus.

greets


----------



## Larry Laffer (27 November 2008)

bayerguard schrieb:


> Wie kann ich sicherstellen, dass meine angegebenen Grenzen auch als Zufallszahlen in der Ausgabe auftauchen?


 
Dafür sorgt der MOD-Befehl (Modulo).
Bei einer kleinen Bereichs-Vorgabe ist die Möglichkeit für immer gleiche "Zufallszahlen" hintereinander ziemlich hoch ...


----------



## bayerguard (27 November 2008)

Hallo,

danke für den Hinweis!

Wie müsste ich meinen Code tunen, um eine REAL-Zufallszahl zwischen 0 und 1 zu bekommen??

greets


----------



## Larry Laffer (27 November 2008)

Das ginge dann z.B. so :

```
FUNCTION Zufall : REAL
 
Zufall := DINT_TO_REAL ((TIME_TO_DINT(TimeTck) MOD 10000) / 10000.0) ;
```


----------



## Ralle (27 November 2008)

Ich hab gestern auch ein wenig mit deiner Funktion experimentiert.
Hier mal ein Stück Code, mit dem du testen kannst, wie die Verteilung deiner Zufallszahlen aussieht.



```
CALL  "Zufall"
       Obergrenze :=10
       Untergrenze:=5
       RET_VAL    :=MD10

      L     MD    10
      L     5
      <>D   
      SPB   NEX6
      L     MD   100
      L     1
      +D    
      T     MD   100
      SPA   END

NEX6: L     MD    10
      L     6
      <>D   
      SPB   NEX7
      L     MD   104
      L     1
      +D    
      T     MD   104
      SPA   END

NEX7: L     MD    10
      L     7
      <>D   
      SPB   NEX8
      L     MD   108
      L     1
      +D    
      T     MD   108
      SPA   END

NEX8: L     MD    10
      L     8
      <>D   
      SPB   NEX9
      L     MD   112
      L     1
      +D    
      T     MD   112
      SPA   END

NEX9: L     MD    10
      L     9
      <>D   
      SPB   NE10
      L     MD   116
      L     1
      +D    
      T     MD   116
      SPA   END

NE10: L     MD    10
      L     10
      <>D   
      SPB   NE11
      L     MD   120
      L     1
      +D    
      T     MD   120
      SPA   END

//Falsche Zahl
NE11: L     MD   124
      L     1
      +D    
      T     MD   124

END:  NOP   0
```


----------



## bayerguard (27 November 2008)

Larry Laffer schrieb:


> Das ginge dann z.B. so :
> 
> ```
> FUNCTION Zufall : REAL
> ...



Danke,

das funktioniert, wenn man die letzte Klammer vorzieht:

Zufall := DINT_TO_REAL ((TIME_TO_DINT(TimeTck) MOD 10000)) / 10000.0;

greets


----------



## Rene´ (22 Dezember 2011)

Würde dieser Zufallszahlengenerator auch ohne den Befehl ABS funktionieren? Weil in meiner Library ist der nicht enthalten und wird somit als Fehler angezeigt.... :/

Gruß 
rene´


----------



## Thomas_v2.1 (22 Dezember 2011)

Rene´ schrieb:


> Würde dieser Zufallszahlengenerator auch ohne den Befehl ABS funktionieren? Weil in meiner Library ist der nicht enthalten und wird somit als Fehler angezeigt.... :/


Läuft auch ohne, und ein äquivalent zu ABS() sollte doch in jeder Sprache hinzubekommen sein.
Außerdem ist dieses Modulo Beispiel nichtmal als Pseudozufall zu bezeichnen.

Mal gucken was Wolfram sagt:
http://www.wolframalpha.com/input/?i=x+=+i+mod+5+where+i+from+0+to+100&a=i_Variable
sieht nicht gerade zufällig aus. Für ein Würfelspielchen dürfte es aber reichen...


----------



## Ralle (24 Dezember 2011)

Thomas_v2.1 schrieb:


> Läuft auch ohne, und ein äquivalent zu ABS() sollte doch in jeder Sprache hinzubekommen sein.
> Außerdem ist dieses Modulo Beispiel nichtmal als Pseudozufall zu bezeichnen.
> 
> Mal gucken was Wolfram sagt:
> ...



Da hast du prinzipiell Recht, aber auf einer S7 mit einigem Programm wird das ganze vielleicht doch ein wenig zufälliger, weil die Zykluszeit ein wenig schwanken wird. Ich bezieh mich da auf Larrys Code.


----------

