Zufallszahl generieren (SINUMERIK)
14.08.2025, 05:44 Uhr
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
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
14.08.2025, 06:37 Uhr
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.
14.08.2025, 06:49 Uhr
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!
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!
14.08.2025, 08:36 Uhr
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.
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.
14.08.2025, 09:19 Uhr
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?
Darf ich fragen, wofür du die Zufallszahlen nutzt?
14.08.2025, 09:50 Uhr
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.
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.
14.08.2025, 13:41 Uhr
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.
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.
14.08.2025, 14:02 Uhr
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
Bei mehreren Zufallszahlen hintereinander gebe ich dir vollkommen recht. Da ist die Uhrzeit nicht verlässlich.
20.11.2025, 08:51 Uhr
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)
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
21.11.2025, 09:00 Uhr
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
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:




