Siemens
Siemens

Digital Industries, Motion Control, Machine Tool Systems

Zufallszahl generieren (SINUMERIK)

Beitrag 14.08.2025, 05:44 Uhr
ES100
Level 1 = Community-Lehrling
*
Hallo,
für Tests, die ich auf unserer Maschine durchführen will, müsste ich im NC-Code Zufallszahlen generieren.
Laut Doku wäre das der Befehl "RANDOM":
https://www.manualslib.de/manual/46660/Siem...l.html?page=819

Wenn ich jetzt aber z.B. folgendes programmiere, kommt der Alarm "Satz 2 Name RANDOM ist nicht bekannt oder nicht definiert":

DEF REAL XYZ
XYZ=RANDOM(0,5)
M2

Kann mir jemand weiterhelfen? Was mache ich denn falsch?????
Es handelt sich um eine SINUMERIK 840D sl.
Danke!

Der Beitrag wurde von ES100 bearbeitet: 14.08.2025, 05:46 Uhr
   
Beitrag 14.08.2025, 06:37 Uhr
CNCFr
Level 7 = Community-Professor
*******
Wenn ich das richtig sehe, ist diese Funktion kein Teil der NC-Programmiersprache. Es scheint sie nur in der Software für die Gestaltung von Bedieneroberflächen "Run MyScreens (BE2)" zu geben.
   
Beitrag 14.08.2025, 06:49 Uhr
ES100
Level 1 = Community-Lehrling
*
Hallo CNCFr,
achso, dann hab ich das falsch verstanden...
Ist Ihnen eine andere Möglichkeit bekannt, eine Zufallszahl zu generieren?
Falls es tatsächlich keinen Befehl geben sollte (wonach es aktuell aussieht), würde ich vllt. einfach die Systemzeit in ms abfragen, und den Wert dann als Zufallswert nutzen...
Zum Zweck meines Tests würde das vermutlich "zufällig genug" sein.
Danke jedenfalls!
   
Beitrag 14.08.2025, 08:36 Uhr
ES100
Level 1 = Community-Lehrling
*
NACHTRAG

Ich habe das nun einfach wie folgt gelöst:

waitTimeS = $A_MSECOND / 1000 * maxWaitTimeS

Damit generiere ich mir also eine zufällige Wartezeit zw. 0 und "maxWaitTimeS".
Das sollte ganz gut funktionieren, da der Code in sehr unterschiedlichen Intervallen aufgerufen wird und die gemessene Systemzeit in ms daher stark variieren sollte.
   
Beitrag 14.08.2025, 09:19 Uhr
nico1991
Level 5 = Community-Ingenieur
*****
Ich weiß nicht, wie es auf der Siemens geht, aber bei Fanuc lese ich immer die aktuelle Uhrzeit aus und werte dann nur die letzte Stelle der Sekunde aus. Dann habe ich Zufallszahlen zwischen 0 und 9, also insgesamt 10 Zustände.

Darf ich fragen, wofür du die Zufallszahlen nutzt?
   
Beitrag 14.08.2025, 09:50 Uhr
CNCFr
Level 7 = Community-Professor
*******
Wenn die Zufallszahlen wie im Beispiel in der Anfrage ganze Zahlen von 0 bis 5 sein sollen (also 6 verschiedene Werte), würde ich das so machen:

XYZ = $A_MSECOND MOD 6

$A_MSECOND liefert eine Wert im Bereich von 0 bis 999 (Die Doku behauptet allerdings 0 bis 1000. Das halte ich für falsch. Nach 999 Millisekunden kommt nicht die 1000. sondern die 0. der folgenden Sekunde).
Dieser Wert wird durch 6 geteilt und der bei der Modulodivision verbleibende Rest (0...5) wird ausgegeben.
Statistisch gesehen kommen dann im Mittel bei 1000 Versuchen die Zahlen 0, 1, 2, 3 jeweils 167 mal vor und die Zahlen 4, 5 jeweils 166 mal.
   
Beitrag 14.08.2025, 13:41 Uhr
CNCFr
Level 7 = Community-Professor
*******
Noch eine Ergänzung:
Wenn man die "Zufallszahlen" von der Uhrzeit ableitet, kann man keine (gute) Zufälligkeit erwarten, wenn man die Zahlen in zu kurzen Abständen ausliest.
Man muss bedenken, dass ein Computer in einer Millisekunde größenordnungsmäßig eine MiIlion Operationen ausführt. Wenn man sich z.B. in einem NC-Programm am Anfang mal fünf Zufallszahlen besorgen will, indem man diese in fünf aufeinander folgenden Zeilen ausliest, darf man sich nicht wundern, wenn man dann mit hoher Wahrscheinlichkeit fünf gleiche Zahlen bekommt, denn die Abarbeitung dieser fünf Zeilen (und vieles mehr) läuft locker in einer Millisekunde ab.
   
Beitrag 14.08.2025, 14:02 Uhr
nico1991
Level 5 = Community-Ingenieur
*****
Ich brauchte bisher immer nur eine und die habe ich hinter dem manuellen Zyklus Start ausgelesen. Dann ist es wie beim Würfeln mit einem 10-seitigen Würfel smile.gif Bei mehreren Zufallszahlen hintereinander gebe ich dir vollkommen recht. Da ist die Uhrzeit nicht verlässlich.
   
Beitrag 20.11.2025, 08:51 Uhr
Janus-UR
Level 1 = Community-Lehrling
*
So rechne ich ein Zufallszahl zwischen -0.1 und 0.1:

DEF INT OMP_SPEED
DEF STRING[1] OMP_PREFIX
DEF STRING[20] OMP_RESULT
DEF REAL OMP_RANDOM

OMP_SPEED = $A_SECOND * 1000 + $A_MSECOND
IF (OMP_SPEED MOD 2 == 0)
OMP_PREFIX = ""
ELSE
OMP_PREFIX = "-"
ENDIF
OMP_RANDOM = NUMBER(OMP_PREFIX << ((OMP_SPEED MOD 1000) / 10000.0))
MSG("Zufallszahl: " << OMP_RANDOM)


--------------------

Uwe Roosz
JANUS Engineering AG
Product Lifecycle Management-Systemtechnik

http://www.janus.de

   
Beitrag 21.11.2025, 09:00 Uhr
CNCFr
Level 7 = Community-Professor
*******
Damit sind alle positiven Zahlen (vor der Division) gerade und alle negativen ungerade. Das sieht nicht gerade zufällig aus, auch wenn es je nach Anwendung evtl. nicht weiter stören wird. Die Abfrage nach gerade / ungerade ist auch eher umständlich.
Einfacher geht es indem du Zufallszahlen im Intervall von 0....0.2 erzeugst und dann 0.1 subtrahierst, also so:

OMP_RANDOM = (OMP_SPEED MOD 1000) / 5000.0 - 0.1

oder , was das gleiche ist:

OMP_RANDOM = (OMP_SPEED MOD 1000 - 500) / 5000.0

   
1 Besucher lesen dieses Thema (Gäste: 1)
0 Mitglieder: