Robot Cell Simulator – Robustheitstest

Eine Simulation mit 100 % zeigt eine Reihenfolge der Roboter – die, die an der Anlage meistens vorkommt. Eine Bewegung ohne Verriegelung in einem mit einem anderen Roboter gemeinsamen Bereich ist dann oft nur wegen dieser Reihenfolge sicher. An der Anlage ändert sich die Reihenfolge: ein Roboter bleibt mit einem Fehler am Schweißpunkt stehen, ein Bauteilsensor kommt nicht, ein Roboter fährt alle n Takte zum Kappenfräsen, ein Roboter fährt langsamer. Der Reiter Robustness test (nach Simulation) führt eine Reihe von Simulationen der Station mit solchen Änderungen aus – aus einem Plan oder einem Zufallsgenerator, eine Stunde lang oder über Nacht – und schreibt in einen Bericht: Kollisionsgefahren, Berührungen der 3D-Modelle, Verklemmungen, Wartketten und ob die Station zur Taktzeit zurückkehrt.

Ein Test kann unterbrochen und später an derselben Stelle fortgesetzt werden. Nach jedem Schritt wird der Stand des Tests im Berichtsordner gespeichert (rcs_robust_progress.json): Plan und Optionen, fertige Schritte, Taktzeiten, Kollisionsgefahren mit ihren Bildern, Startwert der Zufallswerte und – im Verzögerungstest – jede Bewegung mit der bisher erreichten Verzögerung. Den Test anhalten (oder das Programm schließen) und jederzeit mit Gespeicherten Test fortsetzen... weiterführen (API robust_test {"action": "resume"}); nur der Schritt, der beim Anhalten lief, beginnt wieder von vorne. Lange Tests können so über mehrere Nächte laufen. Details

Inhalt: 1. Vor dem Test · Wie die Roboter fahren · 2. Der Reiter und seine Optionen · Arbeitsbereiche oder 3D-Berührungen · 3. Plandatei · 4. Test ausführen · 5. Ergebnisse lesen · 6. Bericht · 7. Befehls-API

1. Vor dem Test

  1. Station laden und das Programm des Reiters Simulation wählen (z. B. Folge 81). Der Test verwendet das Programm, das SPS-Programm und die Optionen des Reiters Simulation.
  2. SPS-Programm (Reiter SPS): die Roboter werden wie an der Anlage gestartet (Folgenstart, Warten auf die Station). Ein mit seinem SPS-Teil gespeicherter Plan bringt das SPS-Programm beim Laden zurück.
  3. Arbeitsbereiche (Reiter Arbeitsbereiche) der Programme der Folge: ohne sie sieht der Test die gemeinsamen Bereiche nicht – Langsam in den Bereichen und der Verzögerungstest wirken nicht, und es wird keine Kollisionsgefahr aus den Bereichen gefunden. Würfel sind schnell, Dreiecke der 3D-Modelle folgen der echten Form der Roboter (weniger Fälle am Rand eines Bereichs).
  4. Optional Live-3D-Kollisionsprüfung auf dem Reiter Simulation: die 3D-Modelle der Roboter und Werkzeuge werden während des ganzen Tests geprüft (langsamer, am besten mit der Geschwindigkeit 100 %). Sie wirkt ab dem Start jeder Simulation – während des ganzen Tests eingeschaltet lassen.

Wie die Roboter im Test fahren

2. Der Reiter und seine Optionen

Plan – woher die Schritte kommen. Ein Schritt ist eine Simulation der Station mit einer Anzahl von Takten und seinen Einstellungen.

FeldWirkung
Plandatei (JSON / XML), ..., Ladendie Schritte der Datei (Liste darunter); beim Laden fragt das Programm, welche Teile geladen werden (Serviceprogramme, Halte, SPS-Programm, Programm des Reiters Simulation)
Beispielplan...schreibt einen Plan mit allen Optionen und lädt ihn
Plan speichern...speichert den Plan mit allen Einstellungen des Reiters; fragt, welche Teile gespeichert werden (auch das SPS-Programm)
ZufallsgeneratorSchritte ohne Datei, einer nach dem anderen bis zum Ende des Tests:
  Takte pro Schritt (min, max)zufällige Anzahl Takte jedes Schritts
  Override (min, max)zufälliger Override der Roboter in jedem Takt – nur ihre Bewegungen sind langsamer, Prozesszeiten (Schweißen, WARTE BIS) bleiben, die Stationsuhr läuft weiter
  RoboterRoboter mit dem zufälligen Override (leer = alle), z. B. R04, R06
  Startversatz 0..jeder Roboter wartet nach Folgenstart eine zufällige Zeit – eine andere Reihenfolge der Roboter in den gemeinsamen Bereichen
  Halt in einem zufälligen Punkt pro Takt / DauerWahrscheinlichkeit pro Takt, dass ein Roboter in einem zufälligen Punkt seines Programms für eine zufällige Zeit (min, max) stehen bleibt; nie in HOME, höchstens ein Halt pro Takt der Station
  Startwertderselbe Startwert wiederholt denselben Test; zufällig = neuer Startwert (im Bericht)
  Langsam in den Bereichen ... mit x %, in allen gemeinsamen Bereichen (gelb und rot) / nur in den roten Bereichenin jedem Schritt fährt ein Roboter (der Reihe nach) mit x % nur bei den Bewegungen in mit anderen Robotern gemeinsame Bereiche, der Rest seines Programms und die anderen Roboter mit 100 % (der zufällige Override wird nicht verwendet). Gelb (mit Verriegelung): der langsame Roboter hält die Verriegelung länger – der Partner muss warten (Wartketten, Blockieren). Rot (ohne Verriegelung): der Partner fährt ein, während der langsame Roboter noch dort ist – eine Kollisionsgefahr, wenn nur die Reihenfolge der Roboter die Bewegung schützt. Das SmartPad des Roboters zeigt jetzt x % (gemeinsamer Bereich).

Serviceprogramme – Serviceprogramme suchen listet die UP-Aufrufe der Folge jedes Roboters (UPn = Bedingung, UPn = EIN mit Flags, REPEAT UPn; bedingte Aufrufe und REPEAT sind markiert – typische Serviceprogramme wie Kappenfräsen). Alle N Takte: das UP läuft nur in jedem N-ten Takt der Station (1 = jeder Takt wie im Programm, 0 = nie). Der Basislauf läuft ohne sie.

Halte in Punkten – Hinzufügen einer Zeile: Roboter, Programm (Folge oder UP), Punktnummer wie im Programm, Haltezeit, alle N Takte. Der Roboter bleibt direkt nach dem Erreichen des Punkts stehen – wie ein Fehler am Schweißpunkt oder ein Bauteilsensor, der nicht kommt. Gilt in allen Schritten, nicht im Basislauf.

Optionen

FeldWirkung
Kollisionswarnungen ignorierendie Simulation hält bei einer Kollisionsgefahr nicht an, alles geht in den Bericht (Test ohne Aufsicht); die 3D-Ansicht wird beim ersten Fund als Bild gespeichert
Test bei der ersten Kollisionsgefahr beendender Test endet beim ersten Fall
Nur Berührungen der 3D-Modelledie Live-3D-Kollisionsprüfung wird beim Start eingeschaltet; nur echte Berührungen und Annäherungen der 3D-Modelle gehen in den Bericht, die Gefahren aus den Arbeitsbereichen werden übersprungen – kein vollständiger Test, siehe Arbeitsbereiche oder 3D-Berührungen
Alle UP-Aufrufejedes UP der Folge in jedem Takt, die Regeln Exclude UP während des Tests ignoriert (Einstellungen des Reiters Simulation bleiben)
Von vorne wiederholender Plan erneut, bis zum Stopp oder einem Limit
Zuerst Basislauf ... Taktezuerst alle Roboter 100 % ohne Störungen – Referenztaktzeit für die Rückkehr zur Synchronisation; hier gefundene Fälle treten auch ohne Störung auf
Zeitlimit, Max. TakteEnde des Tests (kein Limit = bis zum Stopp)
Toleranz Rückkehrein Takt ist wieder synchron, wenn der Stationstakt höchstens Basislauf + diese Toleranz ist
GeschwindigkeitSimulationsgeschwindigkeit während des Tests (400 % = am schnellsten; die Zeiten sind Simulationszeiten). Die Live-3D-Prüfung mit festem Schritt (Standard 20 ms, Live-3D-Kollisionsprüfung) gibt bei jeder Geschwindigkeit dasselbe Ergebnis – 400 % macht den Test nur kürzer; das Protokoll zeigt für jeden Lauf die größte Bewegung eines Modells zwischen zwei Prüfungen nahe am Partner.
Bericht automatisch speichern inOrdner des Berichts und der Fortschrittsdatei
Start umStart zu einer Uhrzeit, z. B. in der Nacht
Verzögerungstest (MISSING) ... der Partner wartet [s]statt der Schritte: nach dem Basislauf hält für jede Bewegung ohne Verriegelung in einen mit einem Partner gemeinsamen Bereich der Partner in seinem Punkt des gemeinsamen Bereichs (dem nächsten zur Bewegung) nacheinander die angegebenen Zeiten, bis eine Kollisionsgefahr auftritt. Ergebnis pro Bewegung: die kürzeste Verzögerung mit Kollision – bis dahin schützt die Reihenfolge der Roboter sie – oder keine bis x s. Langer Test (über Nacht).
  Wer wartetder Partner wartet in seinem Punkt des gemeinsamen Bereichs – der Partner ist noch im Bereich, wenn der Roboter kommt; der Roboter wartet vor der Bewegung (fährt später ein) – der Roboter hält im Punkt vor der Bewegung ohne Verriegelung, der Partner kann schon im Bereich sein; beides, nacheinander.
  Verfeinerung [s]nach der ersten Verzögerung mit Kollision: Halbierung zwischen der letzten Verzögerung ohne Kollision und dieser, bis der Unterschied höchstens dieser Wert ist – die kürzeste Verzögerung genauer (mehr Simulationen); keine Verfeinerung = nur die Verzögerungen der Liste

Arbeitsbereiche oder 3D-Berührungen – was findet welche Prüfung?

Der Test prüft zwei verschiedene Dinge. Keine der beiden Prüfungen enthält die andere – ein vollständiger Test nutzt beide (Option Nur Berührungen der 3D-Modelle aus).

SituationArbeitsbereiche (MISSING)3D-Berührungen
keine Verriegelung, keine Berührung in diesem Lauf (sicher nur durch die Reihenfolge der Roboter)✔–
keine Verriegelung, Berührung in diesem Lauf✔✔
beide Roboter mit Verriegelung, die Modelle berühren sich trotzdem–✔
außerhalb der gemeinsamen Bereiche (Näherung eines Werkzeugs oder der Bereiche)–✔

Beispiel aus einem Test einer Station mit fünf Robotern: 57 Fälle, davon 26 Berührungen der 3D-Modelle – die übrigen 31 waren Bewegungen ohne Verriegelung ohne Berührung in diesen Läufen. Mit Nur Berührungen der 3D-Modelle würden diese 31 Fälle im Bericht fehlen. Die Spalte Ursache des Berichts und des Fensters zeigt, welche der Situationen ein Fall ist.

Wann nur die 3D-Berührungen? Wenn die Bewegungen ohne Verriegelung bekannt sind (z. B. aus Check interlocks) und nur die gesucht werden, die wirklich in einer Berührung enden. Der Verzögerungstest (MISSING) geht einen Schritt weiter: er verschiebt den Zeitablauf der Roboter gezielt und zeigt für jede Bewegung ohne Verriegelung, ab welcher Verzögerung die Roboter kollidieren.

Der Reiter Robustheitstest während eines Tests: Plan mit drei Schritten, Optionen, Verzögerungstest (MISSING) mit Wer wartet und Verfeinerung, die geschätzte Restzeit und das Ende neben den Schaltflächen

3. Plandatei (JSON oder XML)

Die Roboter werden mit einem Teil ihres Namens angegeben (R04, 0001R04). Jeder Schlüssel ist optional.

{
  "seed": 3, "repeat": false, "ignoreCollisions": true, "stopOnCollision": false,
  "baseline": true, "baselineCycles": 1,
  "speed": 100, "timeLimitMin": 0, "maxCycles": 0, "recoveryTolerance": 5,
  "report": "D:/tests/psz",
  "startAt": "2026-10-16T22:00:00",
  "steps": [
    { "name": "R06 5 % in den gemeinsamen Bereichen", "cycles": 1,
      "zoneSlow": { "override": 5, "robots": ["R06"], "areas": "shared" } },
    { "name": "R06 haelt 30 s in UP42/P49", "cycles": 1,
      "holdAt": [ { "robot": "R06", "point": "UP42/P49", "sec": 30, "everyCycle": 1 } ] },
    { "name": "R04 50 %", "cycles": 2, "override": { "R04": 50 } },
    { "name": "Zufall", "cycles": 4, "random": { "override": [20, 100], "robots": ["R01", "R04"] },
      "startJitter": 3, "pause": { "prob": 0.2, "sec": [2, 8], "robots": ["R03"] } }
  ],
  "services": [ { "robot": "R06", "up": 101, "everyCycle": 10 } ],
  "stops":    [ { "robot": "R06", "point": "UP42/P29", "sec": 20, "everyCycle": 5 } ]
}

Dasselbe in XML:

<RobustTest seed="3" baseline="true" baselineCycles="1" speed="100" report="D:/tests/psz">
  <Step name="R06 langsam" cycles="1"><ZoneSlow override="5" robots="R06" areas="shared"/></Step>
  <Step name="R06 haelt" cycles="1"><HoldAt robot="R06" point="UP42/P49" sec="30" everyCycle="1"/></Step>
  <Step name="R04 50 %" cycles="2"><Override robot="R04" percent="50"/></Step>
  <Step name="Zufall" cycles="4"><Random min="20" max="100" robots="R01,R04"/>
    <StartJitter sec="3"/><Pause prob="0.2" min="2" max="8" robots="R03"/></Step>
  <ServiceUp robot="R06" up="101" everyCycle="10"/>
  <Stop robot="R06" point="UP42/P29" sec="20" everyCycle="5"/>
</RobustTest>
SchlüsselBedeutung
seedStartwert der Zufallswerte; 0 = neuer Startwert (im Bericht)
repeatPlan erneut von vorne bis zum Stopp oder einem Limit
ignoreCollisionstrue: kein Halt bei einer Kollisionsgefahr, alles in den Bericht
stopOnCollisionder Test endet bei der ersten Kollisionsgefahr
baseline, baselineCycleszuerst Basislauf 100 % ohne Störungen
speedSimulationsgeschwindigkeit während des Tests (1..400 %)
timeLimitMin, maxCyclesEnde des Tests (0 = kein Limit)
recoveryTolerancewieder synchron: Stationstakt höchstens Basislauf + diese Toleranz [%]
reportOrdner des Berichts und der Fortschrittsdatei
startAtStartzeit (ISO-Datum und -Uhrzeit)
steps[].name, cyclesName in der Liste und im Bericht, Takte des Schritts
steps[].overrideRoboter → Override [%] während des ganzen Schritts; die anderen Roboter 100 %
steps[].randomOverride [min, max] in jedem Takt, für alle Roboter oder robots
steps[].startJitterStartversatz 0..x s nach Folgenstart
steps[].pauseHalt in einem zufälligen Punkt: prob (0..1 pro Takt und Roboter), sec [min, max], robots (leer = alle); nie in HOME, höchstens einer pro Takt
steps[].zoneSlowoverride [%] der robots nur bei den Bewegungen in gemeinsame Bereiche; areas: "shared" (gelb und rot, Standard) oder "red" (nur ohne Verriegelung)
steps[].holdAtHalte in Punkten während des Schritts: robot, point ("UP42/P49" in einem UP, "P12" in der Folge), sec, everyCycle
servicesServiceprogramme: robot, up (Nummer), everyCycle (1 = wie im Programm, 0 = nie)
stopsHalte in Punkten in allen Schritten (wie holdAt)
missingTestVerzögerungstest statt der Schritte: delays [s] nacheinander, cycles pro Versuch, who: "partner" (Standard), "robot" oder "both", refine [s] (0 = keine Halbierung)
only3dnur Berührungen und Annäherungen der 3D-Modelle in den Bericht (Live 3D eingeschaltet)
allUpsjedes UP der Folge in jedem Takt, Exclude UP während des Tests ignoriert
steps[].raceOrderVorrang während des Schritts (Variante B eines Wettlaufs): [{"zone": 4, "first": "R06", "second": "R03", "mode": "order"}] – wie der SPS-Baustein Interlock priority; second leer = jeder Partner, mode "order" = Reihenfolge in jedem Zyklus (für Variante B: der Roboter first ist immer zuerst, auch wenn er wegen anderer Bereiche verspätet ist), "window" mit "window": 2 = Vorrang in einem Zeitfenster (der zweite Roboter wartet höchstens das Fenster ab seiner eigenen Anforderung, dann ändert sich die Reihenfolge – nur für fast gleichzeitige Anforderungen); eine Regel für einen Bereich ersetzt während des Schritts die SPS-Bausteine dieses Bereichs; nicht im Basislauf. Das Ergebnis des Schritts hat requestRaces, raceOrder, raceRules (alle Regeln des Schritts: SPS, Plan, API, auto), raceRuleLog und raceAutoRules (Reihenfolge beim Wettlauf beibehalten, Interlock priority: die im Basislauf eingefügten Bausteine halten die Reihenfolge in den nächsten Schritten). Ergebnisse der Variante B an einer realen Station: siehe Wettläufe und Variante B
generatorstatt der Schritte: zufällige Schritte mit cyclesMin, cyclesMax und den Schlüsseln eines Schritts (random, startJitter, pause, zoneSlow); mit zoneSlow ist ein Roboter nach dem anderen langsam, die anderen 100 %

4. Test ausführen

Kollisionsgefahren...: die bisher gefundenen Fälle - Roboter ohne Verriegelung und sein Punkt, Partner und sein Punkt, ob der Partner eine Verriegelung hält, erstes Mal und Anzahl (Station mit anonymen Roboternamen)

Das Protokoll unter den Schaltflächen und die Konsole zeigen jeden Schritt: Overrides, Störungen, Taktzeiten, Kollisionsgefahren.

Neben den Schaltflächen: Rest: x min – Ende etwa hh:mm – mittlere Zeit der fertigen Schritte (oder Takte im laufenden Schritt) mal die restlichen Schritte; im Verzögerungstest die restlichen Versuche der Bewegungen; mit einem Zeitlimit höchstens bis zum Limit. Vor dem Ende des ersten Schritts: wird nach dem ersten Schritt geschätzt; ein Plan ohne Ende (Wiederholen, Zufallsgenerator ohne Limit): unbekannt. Dasselbe in der Statuszeile des Plugins und in der API (remainingMinutes, estimatedEnd).

Test unterbrechen und fortsetzen

  1. Stopp (oder DReS schließen, oder der Rechner geht aus) – der Bericht der bis dahin fertigen Takte wird geschrieben.
  2. Später: dieselbe Station laden, denselben Berichtsordner auf dem Reiter lassen (Feld Bericht automatisch speichern in) und Gespeicherten Test fortsetzen... drücken (API: robust_test {"action": "resume"}).
  3. Der Test nimmt Plan und Optionen aus der Fortschrittsdatei (nicht vom Reiter), macht mit dem nächsten Schritt weiter und zählt Zeit, Takte und Kollisionsgefahren weiter. Die Zufallswerte laufen mit demselben Startwert weiter.
  4. Verzögerungstest (MISSING): die Liste der Bewegungen ohne Verriegelung, die erreichte Verzögerung jeder Bewegung und die Halbierung werden gespeichert – der Test macht bei derselben Bewegung mit derselben Verzögerung weiter, statt mit der ersten zu beginnen.

Gespeichert wird nach jedem Schritt – ein in der Mitte unterbrochener Schritt wird wiederholt. Das geschätzte Ende in der Statuszeile rechnet ab dem fortgesetzten Stand.

5. Ergebnisse lesen

Welche Testart an einer realen Station welche Kollisionen findet (fester Plan, Zufallsgenerator, Plan eines KI-Agenten, Verzögerungstest): Vergleich der Testarten.

ArtBedeutung
Kollisionsgefahr (Arbeitsbereiche)ein Roboter fährt ohne Verriegelung zu einem Punkt in einem mit einem Partner gemeinsamen Bereich, und der Partner ist zur selben Zeit in diesem Bereich. Der Bereich ist das Volumen der ganzen Bewegung (Arm und Werkzeug) – eine Gefahr: hier schützt nur die Reihenfolge der Roboter die Bewegung. Es ist keine Berührung der Modelle.
Kollision (3D-Modelle), Punkt mit 3DLive-3D-Kollisionsprüfung: die Oberflächen der 3D-Modelle zweier Roboter teilen zur selben Zeit eine Zelle – die Modelle berühren sich wirklich (Genauigkeit etwa die Zellengröße). Mit einem Dummy-Werkzeug (Kugel und Körper vom Flansch zum TCP) ist das Werkzeug eine Näherung.
Annäherung, 3D x mmLive 3D: keine Berührung, aber näher als der Sicherheitsabstand (Warnung unter).

6. Bericht

HTML, PDF und JSON mit dem Datum im Namen (rcs_robust_yyyyMMdd_HHmm) im Berichtsordner. Der gespeicherte Bericht öffnet sich im Standardprogramm nur, wenn die Option Gespeicherten Bericht (HTML, PDF) im Standardprogramm öffnen eingeschaltet ist (Plugin-Einstellungen > Simulation, Standard: ein; API report_open) – ausschalten, wenn ein KI-Agent oder ein Skript den Test fährt. Inhalt:

Ein Fall des Berichts: links die Ansicht der Simulation, rechts die Ansicht von oben mit dem Ort der Kollision im roten Kreis (Namen der Roboter für die Dokumentation ausgeblendet)

Der Abschnitt Wettläufe und Interlock priority des Berichts zeigt für jeden Schritt die Wettläufe (Bereich, beide Roboter mit den Punkten, wie oft, kleinster Zeitabstand, Gewinner), die Regeln des Schritts (SPS-Bausteine Interlock priority, raceOrder, API, auto – beim Wettlauf beibehaltene Reihenfolge) und jede Anwendung einer Regel; eine rote Zeile bedeutet, dass ein Roboter später als das Fenster war und sich die Reihenfolge der Roboter in diesem Schritt geändert hat (nicht zufällig, sondern durch die Störung). Über der Tabelle: Anzahl der Wettläufe, der beim Wettlauf hinzugefügten Regeln und der Reihenfolgeänderungen. Ergebnisse: siehe Wettläufe und Variante B.

Der Zeitenbericht eines einzelnen Laufs (Times > Report) enthält dieselben Angaben in zwei Abschnitten, Anforderungen im selben Moment (Wettläufe) und Interlock priority in diesem Lauf:

Wettläufe und Interlock priority im Zeitenbericht: Bereich 1, 0001R05 gewinnt mit 0,490 s Vorsprung, 0001R03 wartet 8,4 s; der SPS-Baustein hält diese Reihenfolge (Fenster 1,0 s)

7. Befehls-API

{"cmd": "robust_test", "action": "load", "file": "..."} (Teile: services, stops, sps, program – true / false), "save", "find_services", "start", "pause", "continue", "stop", "resume" (gespeicherten Test fortsetzen), "status" (active, finished, Schritt, Takte, Kollisionsgefahren, Minuten, Bericht), "risks" (Fälle mit Roboter, Punkt, Partner, Anzahl, erste Zeit und Schritt), "report" (auch "progress": "<Ordner>" – Bericht eines gespeicherten Tests). Live 3D: {"cmd": "live_check", "on": true, "cell": 20, "capsule": 60, "range": 200, "warn": 50} – die Antwort enthält die nächste Annäherung jedes Paares (closest). Arbeitsbereiche: {"cmd": "zones", "programs": ["folge81"], "mode": "triangles"}. Der Test ist zu Ende, wenn status.active false ist. Siehe Befehls-API.

Top