Robot Cell Simulator – Befehls-API
« VeRa - KI-Agent und Sprachsteuerung | Inhalt | Befehls-API - Referenz »
EinschaltenBefehlesim_optionsrobust_testUI-BefehleUI-Befehle – Referenz »Editor-APIClient-SkriptBeispiel

Der Robot Cell Simulator kann von außen mit Befehlen gesteuert werden – dieselben Schritte wie im Fenster (Simulation laden, fahren, Bericht, Arbeitsbereiche, Verriegelungen prüfen), ohne Dialoge. Gedacht für nächtliche Regressionstests einer Station, den Vergleich von Programmvarianten per Skript und für einen KI-Agenten, der die Studien durchführt.

Einschalten

Die API ist standardmäßig aus. Sie wird in den Einstellungen des Simulators eingeschaltet (Einstellungen > Konfigurieren..., Registerkarte KI-Agent: Befehls-API des Robot Cell Simulator für den KI-Agenten und Skripte) oder mit der Umgebungsvariable DRES_RCS_API=1 beim Start von DReS. Dieselbe Registerkarte zeigt den Pfad des Client-Skripts (Standard template\RCS\AIAgent\rcs_api.ps1 im Installationsverzeichnis). Sie startet, wenn das Fenster des Robot Cell Simulator geöffnet wird (Plugins > Robot Cell Simulator); die Konsole zeigt Befehls-API des Robot Cell Simulator empfängt Befehle über \\.\pipe\DReS_RCS_API. Nur der Benutzer, der DReS gestartet hat, kann sich verbinden (lokale Pipe, kein Netzwerk).

Lizenz: die Befehls-APIs des Editors und des Robot Cell Simulator brauchen die Zusatzlizenz API / CLI (Steuerung von DReS und dem Simulator durch andere Programme, Skripte und KI-Agenten). Ohne sie gehen nur lesende Befehle (z. B. status, run_data, view, robust_test mit status / risks, ui_list, ui_shot, scene_shot, recent_files), die anderen Befehle antworten mit einem Fehler über die fehlende Lizenz, und die Einstellungen der Befehls-APIs sind gesperrt. Auch die Sprachsteuerung VeRa braucht diese Lizenz.

Befehle

Ein JSON-Objekt pro Zeile in beide Richtungen, z. B. {"cmd":"status"}. Jede Antwort enthält "ok": true / false und "error", wenn der Befehl fehlgeschlagen ist. Während ein Befehl läuft, werden keine Meldungsfenster gezeigt – es gilt die Standardantwort, die Meldung steht in der Konsole. Seit 2026-10-25 gilt das auch für das, was später kommt: ein Lauf, ein Robustheitstest oder eine Simulation beider Reihenfolgen, der über die API gestartet (oder angehalten) wurde, endet ohne Fenster (Simulation beendet, Kollisionsgefahr in der Simulation, Wettläufe der Anforderungen, Wettlauf gefunden, Simulation beider Reihenfolgen - Ergebnis) – ihr Text steht in der Konsole und in status.lastRunMessages (auch in den Antworten von report / run_data); eine über die API geladene Simulationsdatei (load, open, package_open) öffnet nicht das Fenster Simulation laden – Nicht wiederhergestellt (Liste in status.lastLoadMissing und in der Konsole), und Fehler beim Öffnen (unbekanntes Format, eine Studie, die sich nicht entpacken lässt) stehen nur in der Konsole. Nur die Pause bei Kollisionsgefahr (Option Simulation bei Kollisionsgefahr anhalten) öffnet weiter ihr Fenster mit Weiter; weiter mit {"cmd":"sim_action","action":"resume"}. Eine fehlende Lizenz während eines Befehls oder beim Schließen von DReS ist nur eine Meldung in der Konsole.

Client-Skript und Zeitlimit: seit 2026-10-25 schreibt rcs_api.ps1 (und der Sprachassistent VeRa) den Befehl mit Zeitlimit und ohne zu warten, bis das Programm ihn gelesen hat – ist DReS beschäftigt oder antwortet nicht, endet das Skript mit einem Fehler, statt endlos zu warten.

DReS per Skript schließen: wird DReS oder das Fenster des Simulators geschlossen, während eine Datei geladen wird (load, open, package_open, Entpacken eines Pakets, Konvertierung von JT-Modellen, Arbeitsbereiche), wartet das Schließen bis zum Ende des Ladens (die Konsole zeigt Laden / Berechnung läuft - DReS wird nach dem Ende geschlossen); das Entpacken eines Pakets und die Arbeitsbereiche werden abgebrochen, noch nicht begonnene Ladevorgänge übersprungen (status.lastLoadError: abgebrochen - das Programm wird geschlossen).

Flag "anon": true (jeder Befehl): die Namen werden übersetzt – R1, R2 …, <file N> und <name> im Befehl werden vor der Ausführung durch die echten Roboternamen und Dateipfade ersetzt, und in der Antwort werden Roboternamen, Dateipfade und Kennungen der Anlage durch diese Kennungen ersetzt. Genutzt vom Fenster KI-Agent im anonymen Modus und seinem MCP-Server (Umgebungsvariable DRES_AI_ANON=1); z. B. {"cmd":"robot","robot":"R2","goto":"UP42/P5","anon":true}.

BefehlParameterWas er macht
pingName des Plugins
statusloading (Simulationsdatei), preparing (Programme werden im Hintergrund geparst), running, loop / loops, Roboter, Geschwindigkeit, SPS, letzte Fehler (lastRunError, lastLoadMissing, robotNameWarnings), measuredCycles, uiPending (noch nicht ausgeführte UI-Befehle) und modal (Titel eines offenen modalen Fensters); simTime (Uhr der Simulation, s), robustTest (ein Robustheitstest läuft), waitTimes (Anzahl der WARTE ZEIT-Befehle in den Roboterprogrammen, Details mit wait_times); während eines Laufs auch elapsedSeconds (Echtzeit seit dem Start des Laufs), simSeconds (Simulationszeit des Laufs), effectiveSpeed (% = Simulationszeit / Echtzeit, mit dem Warten auf die Live-3D-Prüfung), loopSeconds (Echtzeit eines Durchlaufs, ab dem 2. Durchlauf), remainingSeconds und estimatedEnd (bis zum Ende aller Durchläufe; fehlen im 1. Durchlauf) und robotsProgress (robot, running, loop, loops); seit 2026-10-25 ready (Fenster des Simulators aufgebaut und angezeigt – früher gesendete Befehle warten bis zu 60 s, dann Antwort notReady), converting (JT-Modelle werden gerade umgewandelt – ändernde Befehle antworten bis zum Ende mit einem Fehler) und modelConversion (Ergebnis des letzten Ladens: converted, reused, failed, skipped, seconds, cancelled, noConverter, models [{jt, glb, state, seconds, triangles, error}]); fps (gezeichnete Bilder der 3D-Ansicht pro Sekunde – die Ansicht zeichnet auf Anforderung, ohne Änderungen der Szene also wenige Bilder) und viewSyncMs (mittlere Zeit des GUI-Threads pro Bild für die Übernahme der Szenenänderungen in die Ansicht, ms); beide -1, wenn der Build sie nicht misst (Variante mit dem JT-Leser); dieselben Werte zeigt das OSD der Ansichtsstatistik (Settings: OSD). Seit 2026-10-25 außerdem glRenderer (Grafikkarte der 3D-Ansicht: Renderer / Hersteller / OpenGL-Version – derselbe Text, den die Konsole einmal als 3D view: graphics card ... zeigt) und paintFps (Zeichnungen der Widgets der 3D-Ansicht pro Sekunde seit dem vorigen status; funktioniert auch in der Variante mit dem JT-Leser, in der fps -1 ist; in der Variante ohne JT-Leser (Qt3D-Ansicht) gilt fps). Seit 26.10.2026 außerdem das Objekt memory (privateMB = reservierter privater Speicher des Programms, workingSetMB, peakWorkingSetMB, peakPagefileMB; siehe memory_trim). modelConversion beginnt bei jedem load, open und package_open neu: mode ("auto" | "ask" | "never" – der Modus dieses Ladens); bei "never" stehen die JT-Modelle mit state "jt" (direkt geladen) in der Liste; nach einem Simulationspaket seine Modelle mit state "package" und die Anzahl package. Außerdem lastLoadError (Fehler des letzten load / open / package_open nach seiner Antwort started, leer = keiner; auch in der Konsole) und extracting (ein Simulationspaket wird gerade entpackt, mit Fortschrittsfenster). loading ist von der Antwort started bis zum Ende des Ladens true; seit 2026-10-25 ist es während des ganzen Öffnens einer Datei true – auch beim Öffnen aus dem Menü / Datei > Assistent – bis zur Meldung Opening finished; in dieser Zeit antworten ändernde Befehle mit dem Fehler A file is being loaded (wie bei load über die API). ready unverändert (Fenster des Simulators aufgebaut). In modelConversion.models steht der Zustand failed mit error auch für eine JT-Datei, die der Konverter nicht lesen kann und die ohne neuen Versuch übersprungen wird. simTime bleibt am Ende eines Laufs stehen (alle Roboter fertig oder stop) und beginnt beim nächsten Lauf bei 0; seit 2026-10-25 steht sie auch vom Öffnen des Simulators bis zum ersten Lauf (vorher lief sie ohne jede Simulation etwa 1 s pro Sekunde). lastRunMessages (seit 2026-10-25): die Texte der Fenster, die ein über die API gestarteter oder angehaltener Lauf nicht öffnet (Simulation beendet, KOLLISIONSGEFAHR: ..., Wettläufe der Anforderungen, Ergebnis der Simulation beider Reihenfolgen); leer mit dem nächsten über die API gestarteten Lauf
loadfile, newScene (true), convertlädt eine Simulationsdatei (.xml) oder ein Simulationspaket (.rcsz) mit allem, was sie enthält (wie die Standardauswahl von Simulation laden); asynchron – warten, bis status frei ist. Wie bei open öffnen fehlende Pfade der Studie das Fenster Paths not set nicht: die Konsole zeigt die Warnung Paths not set: ..., und die Simulation wird trotzdem geladen. convert (seit 2026-10-25): "auto" | "ask" (in der API wie "auto", ohne Fenster) | "never" – die JT-Werkzeugmodelle als umgewandelte glTF-Modelle; ohne den Parameter gilt die Einstellung JT-Modelle: umgewandelte glTF-Modelle verwenden; Ergebnis in status.modelConversion. Seit 2026-10-25 kommt die Antwort started, file sofort (vorher erst nach dem ganzen Laden, 12–34 s, das Fenster reagierte nicht); die Datei wird im nächsten Durchlauf der Ereignisschleife geladen. Eine fehlende Datei ist sofort ein Fehler; andere Fehler des Ladens stehen in status.lastLoadError und in der Konsole. Während des Ladens antworten ändernde Befehle mit einem Fehler (A file is being loaded); lesende Befehle und die ui_*-Befehle funktionieren
openfile, systemRoot, robotArchives, convert, objectsöffnet eine Datei wie Datei > Datei öffnen, ohne Dialoge: eine Process-Simulate-Studie (.psz oder StandaloneStudy*.xml), ein JT-Modell (.jt) oder eine Sitzung des Simulators (.rcsession). systemRoot (System-Root der Studie: Bibliothek, Makros) und robotArchives (Ordner der Roboterarchive) sind optional und werden wie die Pfade des Assistenten (Datei > Assistent) gespeichert (sie bleiben für das nächste Öffnen). Fehlende Pfade öffnen das Fenster Paths not set nicht: die Konsole zeigt die Warnung Paths not set: ..., und die Datei wird trotzdem geöffnet. objects (seit 2026-10-25): "all" (alle Objekte der Studie, wie Select all im Fenster Available objects) oder der Pfad einer Auswahldatei .ini (gespeichert mit der Schaltfläche Save dieses Fensters, wie seine Schaltfläche Open); ohne den Parameter die gespeicherte Auswahl (Remember selected items; ohne diese kein Objekt). Abgelehnt, während eine Simulation läuft. Antwort sofort: started, file, systemRoot, robotArchives (die jetzt verwendeten Pfade), objects, wenn angegeben; die Datei wird im Hintergrund geladen – mit status warten, bis loading / preparing false sind, die Konsole zeigt dann Opening finished after mm:ss. Eine Studie ohne ihre Bibliothek (System Root nicht gesetzt) hat keine 3D-Modelle und keine Roboter - dann werden die Roboter aus ihren Archiven an den Positionen der Studie eingefügt (wie insert_study_robots, Meldung in der Konsole); warten, bis robots in status der Anzahl der Roboter entspricht. Beispiel: {"cmd":"open","file":"D:/studies/cell_A/StandaloneStudy.xml","systemRoot":"D:/studies/sysroot","robotArchives":"D:/studies/archives","convert":"auto","objects":"all"}. Auch ein Simulationspaket .rcsz. convert wie bei load (Komponenten der Studie und Werkzeuge an den Robotern; in der Variante ohne JT-Leser auch die Roboter und die Komponenten mit Mechanismus). Ein unbekannter Dateityp ist sofort ein Fehler; eine Datei, die nicht geöffnet werden konnte: status.lastLoadError
insert_study_robotsfile, convertwie Datei > Roboter an Studienpositionen einfügen ohne Dialoge: fügt die Roboter einer Process-Simulate-Studie (file, .psz oder StandaloneStudy*.xml) an ihren Positionen der Studie in die aktuelle Szene ein; Antwort inserted (Anzahl der Roboter) und report (Text des Berichts: Roboter, Archive, Probleme); Fehler: noch keine Szene (Create a scene first – zuerst eine Zelle öffnen oder Datei > Neue Szene), die Studie ist nicht lesbar, keine Roboter in der Studie, eine Simulation läuft, z. B. {"cmd":"insert_study_robots","file":"D:/studies/cell_A/StandaloneStudy.xml"}; nach dem Einfügen läuft automatisch die Basenprüfung (Ergebnis in der Konsole)
base_checktolMm (Standard 2), tolDeg (Standard 0.2), study, last (true / false), console (Standard true), project, place, customer, team, station, comment, report (.pdf oder .html), view (true / false), apply (Standard false), robots (Standard [] = alle Roboter außerhalb der Toleranz, ["*"] = alle), saveStudy (Standard <Studie>_calibrated.xml), overwrite (Standard false), reload (Standard true)wie Extras > Basen gegen die Studie prüfen... (Beschreibung): vergleicht die Basen der Studie (Frames b1, b2 ... / Fanuc uf1, uf2 ... an ir_<Roboter>, Sollwerte) mit den Basen der Roboterarchive ($BASE_DATA[n] auch #TCP / Fanuc UF[n], gemessene Werte). tolMm / tolDeg werden wie die Felder des Fensters gespeichert; study = eine andere Studie als die, aus der die Roboter eingefügt wurden; last: true = nur das letzte Ergebnis ohne neue Prüfung; console: false = keine Zeilen in der Konsole; die Berichtsfelder werden wie die Felder des Fensters gespeichert; report speichert den Bericht (PDF oder HTML nach der Dateiendung), view mit der 3D-Ansicht (Standard: Kontrollkästchen des Fensters). Antwort: study, tolMm, tolDeg, bases [{robot, base, kind (base / externalTcp / userFrame), dPosMm, dXyzMm [x, y, z] im Roboterkoordinatensystem, dRotDeg, worldStudy, worldArchive [x, y, z], studyFrame, archiveFrame [x, y, z, a, b, c], ok}], groups (gemeinsame Basen der Station) [{studyWorld, robots [{robot, base}], spreadMm, between [Roboter, Roboter], ok}], deviations (Anzahl der Basen außerhalb der Toleranz), time, robotsNotInScene, reportFile. Die Archivbasen werden wie die Programmbahnen auf $WORLD des Roboters bezogen (Global * ROBROOT(0)-1). Berechnete Roboterpositionen: calibration [{robot, externalId, supported, reason (z. B. Roboter auf einer Linearachse), basesUsed, basesRejected, shiftMm, shiftXyzMm [x, y, z] in der Welt, rotationDeg, oldWorld, newWorld, residualMm, residualDeg, needed (außerhalb der Toleranz), matrix}]. apply: true schreibt die berechneten Positionen der robots wie die Schaltfläche Auf die gewählten Roboter anwenden: nach saveStudy (Standard die Kopie <Studie>_calibrated.xml), overwrite: true = die Studie selbst (Sicherungskopie .bak_<Datum>_<Uhrzeit>), reload: true = Simulation neben der Kopie als <Kopie>_simulation.xml gespeichert und neu geladen; Antwortfeld apply {applied, study, backup, simulation, reloadError, stationFramesKept, skipped}. Basis-Frames der Station, die am Roboter hängen, bleiben in der Welt; die Kopie ist für den Robot Cell Simulator, nicht für einen Import in Process Simulate. Fehler: keine Studie, die Studie hat keine Basis-Frames, der Bericht kann nicht geschrieben werden, eine Simulation läuft, keine berechneten Positionen, kein Roboter zu korrigieren. Beispiele: {"cmd":"base_check","tolMm":2,"tolDeg":0.2,"station":"ST 010","report":"D:/reports/base_check.pdf","view":true}, {"cmd":"base_check","apply":true,"robots":["*"],"reload":true}
weld_reportstudy (Standard die Studie der Roboterpositionen), tolMm (Standard 2), tolDeg (Standard 5), robots (Standard [] = alle), anonymize (Standard false), axisCorner (Koordinatensystem der Welt auf der Karte: auto | top-left | top-right | bottom-left | bottom-right | center | none, Standard wie im Fenster = auto), maxItems (Standard 500), report (.pdf, .html oder .csv), view (Standard true), last (Standard false)wie Extras > Schweißpunktbericht... (Beschreibung), Lizenz RCS 140: Punktschweißpunkte der Programme der Roboter (SERVOZANGE / TECH EZ, SP, VW_USER EZSP; VW-Punktnummern unter 100 = Servicepunkte, übersprungen) verglichen mit den Schweißpunkten der Studie (PmWeldLocationOperation projectedLocation, PmWeldPoint Blechdicke) nach einer robusten Anpassung je Roboter / Basis / Werkzeug. tolMm, tolDeg, anonymize haben als Standard die Werte des Fensters (anonymize: Roboternamen als R1, R2 ...); maxItems: höchste Anzahl der rows in der Antwort (rowsTruncated: true, wenn mehr); last: true = nur das letzte Ergebnis (ohne rows) oder ein Bericht daraus; report speichert den Bericht (nach der Dateiendung), view mit der 3D-Ansicht. Antwort: points, programs, robots, matched, withinTolerance, unnamed, studyWeldPoints, studyOperations, fits [{robot, base, tool, points, fitted, fitMode, used, shiftMm, rotationDeg, toolAxis, frameDiffers (Drehung > 10°: Programm-Frame gegenüber der Studie gedreht), noFit (keine Anpassung möglich: Frames verschieden, zu wenige passende Punkte)}], rows [{robot, program, order, point, line, name, base, tool, gun, weldProgram, pointNumber, inStudy, ok, dXyzRawMm, dRawMm, dMm, angleDeg, angleRawDeg, thickness, studyProgram, file, nameFromPointNumber (kein Name über dem Punkt, über die Punktnummer der OLP-Befehle der Studie zugeordnet, nur eindeutige Nummern), noFit (keine Abweichungswerte)}] (dRawMm vor, dMm nach der Anpassung), notInPrograms (Schweißpunkte der Studie, die in den Programmen nicht gefunden wurden), time, reportFile. Fehler: keine Lizenz, keine Roboter in der Szene, keine Punktschweißpunkte in den Programmen, noch kein Bericht (last). Beispiel: {"cmd":"weld_report","tolMm":2,"tolDeg":5,"anonymize":true,"report":"D:/reports/weld_points.pdf"}
recent_files–lesend, ohne Lizenz: {"ok":true,"simulations":[...],"studies":[...],"current":"<Simulation_File>"} – simulations: die letzten 15 geladenen Simulationsdateien (auch über die API geladen), die neueste zuerst, nur existierende Dateien (Menü Simulation > Zuletzt geladene Simulationen); studies: die zuletzt geöffneten Studien (Datei > Zuletzt geöffnete Dateien); current: die jetzt geladene Simulationsdatei. Laden mit load – der KI-Agent nimmt eine vom Benutzer genannte Datei von hier und durchsucht nicht die Festplatte
setspeed, folge, up, loops, spsWerte der Registerkarte Simulation (nicht während der Simulation); up: N wählt UP N statt einer Folge; Antwort (auch ohne Schlüssel = nur Lesen): programType ("folge" | "up"), number, loops, sps – die aktuellen Werte der Registerkarte (so liest der KI-Agent die Folge der Station). sps wird zuerst übernommen, dann folge / up / loops (seit 2026-10-25; vorher stellte "sps":false zusammen mit loops die vorige Anzahl Schleifen wieder her, z. B. 30 → 3)
fast_runprogram ("folge125" oder "up42"), loopswie die Fast-Run-Tasten, immer ohne SPS
runfolge oder up, loops, speed, spsRun on all robots; up: N fährt UP N statt einer Folge; bei eingeschalteter SPS antwortet der Befehl mit dem Fehler Nicht gestartet: ... (Felder spsFolge = die Folgen des SPS-Programms, spsCycles; die Antwort enthält auch sps true), wenn folge / loops vom SPS-Programm abweichen (wie bisher) oder wenn die Nummer im Feld Program von der Folge des SPS-Programms abweicht – auch ohne folge, z. B. nach einem früheren set; der Fehler hat den Text der Rückfrage der Taste Run on all robots (ohne Continue / Cancel); erneut mit der Folge des SPS-Programms oder "sps":false starten; asynchron. Fehlende Arbeitsbereiche werden zuerst berechnet. sps vor loops / folge wie bei set. Das Ende des Laufs öffnet keine Fenster (seit 2026-10-25) – Texte in status.lastRunMessages, die Risiken in run_data (collisionCheck, areaConflicts)
stophält alle Roboter an; das Ende eines über die API angehaltenen Laufs öffnet keine Fenster, auch wenn der Lauf in der GUI gestartet wurde (seit 2026-10-25)
sim_optionsohne Schlüssel: lesen; Schlüssel: siehe untenOptionen der Registerkarte Simulation wie in der Oberfläche; während der Simulation gesperrt (Fehler). Antwort: alle Werte und locked
sim_actionaction: "pause", "resume", "quitt", "check_interlock_map"Pause / Resume der Uhr der Station, Continue (Quitt), Check interlock map (die Tabelle öffnet sich in einem Fenster, lesen mit den ui_*-Befehlen)
live_checkon, cell, capsule, range, warn, contact, stopNear, ignoreStartContacts, thread, parallel, grid, stepMs; export, format, anonymize, exportCsv, window, showLive-3D-Kollisionsprüfung (wirkt ab dem nächsten Start); contact (0..50 mm, Standard 5) – nächste Punkte höchstens so weit auseinander = Kollision (Schlüssel des Falls 3D|...), weiter mit gemeinsamer Zelle oder unter warn (Standard 30 mm, 0 = aus) = Annäherung (Schlüssel 3Dnear|..., Warnung, keine Pause); Antwort: die Werte und closest – die größte Annäherung jedes Paars: robot, where, part, partner, partnerWhere, partnerPart, distance, t, rangeMm, joints, partnerJoints – und stats des letzten Laufs (checks, checkMsP50 / P95, gapAvgS / gapMaxS, nearMoveMaxMm / nearMoveP95Mm, clockWaitS, recommendedStepMs, maxSpeedWithoutWait). Seit 2026-10-30: stopNear (true / false) – auch bei Annäherung unter warn anhalten; in closest zusätzlich contacts (Prüfungen mit Kontakt) und, für Paare mit Kontakt, overlap (größte Überlappung der Modelle, mm), overlapT, overlapWhere, overlapPartnerWhere; distance -1 = nur gemeinsame Zellen, nicht gemessen. Geringste Abstände: export (Datei) mit format pdf / html / csv (Standard: aus der Endung) und anonymize (Roboter R1..Rn), exportCsv (Datei, CSV), window (true – Fenster öffnen). stopNear hält einmal pro Annäherung eines Paares an (wieder, wenn sich die Modelle um mehr als warn + eine Zelle entfernt haben). ignoreStartContacts (true / false, Standard true) – Paare, deren Modelle schon bei der ersten Prüfung überlappen (Startposition), sind keine Kollision, bis sie getrennt sind; in closest hat ein solches Paar startContact true und startOverlap (mm); jedes Paar hat point [x, y, z] (Mitte der nächsten Punkte). show: {robot, partner, what: 3d | robot | partner} – wie ein Doppelklick im Fenster: 3d = beide Roboter in den Moment des geringsten Abstands und die 3D-Ansicht auf die Stelle (Simulation pausiert oder gestoppt), robot / partner = Programm im Editor am Punkt. overlap ist eine Näherung aus dem Raster der Prüfung (Ausdehnung der gemeinsamen Zellen, Genauigkeit eine Zelle), nicht die Tiefe eines Volumenkörpers. Lizenz Collision 3D: ohne sie antworten stopNear / ignoreStartContacts / export / window / show mit "License '...' not found"
viewrobotNamesOnFloor, robotLabels, axes, perspective, recordedPath, nullPoint, grid, consolesAndLinearUnits, simulationTcp, collisionPlaces, collisionPlaceLabels, whiteBackground, pointLabels, pointFrames, programPaths (true / false); fitAll, viewAll (true); standardView ("default" | "top" | "bottom" | "left" | "right" | "front" | "back"), coordinateSystemSize (60..400 px), allRobotsPath ({kind: "folge" | "up", number, withSubprograms} oder false); zoom (Faktor 0.01..100), target ([x, y, z] mm), signalLabelSize (30..300 %, 100 = Standard), collisionPlaceColor3D, collisionPlaceColorZone, collisionPlaceColorProximity ("#rrggbb"), orbit ([yawDeg, pitchDeg])auch das Kontextmenü der 3D-Ansicht: Punktbeschriftungen, Bahnen der Registerkarte Programme anzeigen / ausblenden, Größe des Koordinatensystems, die Bahn einer Folge / eines UP für alle Roboter (false = ausblenden); pointFrames wie Show point frames (seit 2026-10-25, standardmäßig aus, in den Einstellungen gespeichert): ein Koordinatensystem (X rot, Y grün, Z blau, 100 mm) an jedem Punkt jeder angezeigten Programmbahn in der Orientierung des Punkts, ohne angezeigte Bahn nichts; die Antwort enthält immer pointFrames; programPaths wie Show paths / Hide all paths: seit 2026-10-25 zeigt true die Bahn und die Punkte des Programms jedes Roboters – während und nach einem Lauf das Programm des Laufs (mit den aufgerufenen UPs), ohne Lauf das für den Roboter gewählte Programm (vorher nur das im Baum des aktuellen Roboters markierte Programm); haben alle Roboter dasselbe Programm (z. B. Folge 81), wird die Auswahl in der Simulationsdatei wie allRobotsPath (Show Folge path for all robots) gespeichert; false = alle Bahnen ausblenden (unverändert); standardView wie Navigation > Normansicht; Schalter des Menüs Ansicht (und weißer Hintergrund, Fit All / View All): Namen der Roboter auf dem Boden, Beschriftungen über den Robotern, Achsen, Perspektive, aufgezeichnete Bahn, Nullpunkt, Gitter, Konsolen und Lineareinheiten, TCP des Werkzeugs in der Simulation (simulationTcp: seit 2026-10-25 nur das TCP-Koordinatensystem des Werkzeugs, aus den Achswerten des gezeichneten Modells; das frühere Koordinatensystem des Programmpunkts / Ziels entfällt); collisionPlaces wie Ansicht > Kollisionsstellen anzeigen (Kugeln in der Szene: rot = Berührung der 3D-Modelle der Live-3D-Prüfung, gelb = Annäherung der 3D-Modelle ohne Kontakt, violett = Kollisionsgefahr aus den Arbeitsbereichen, Beschriftung mit den Robotern und der Zeit; sie bleiben bis zum nächsten Lauf, siehe Kollisionsstellen); collisionPlaceLabels wie Ansicht > Beschriftung der Kollisionsorte anzeigen (false = nur die Kugeln, ohne die Texte darüber; wird in den Einstellungen gespeichert, Standard true); collisionPlaceColor3D / collisionPlaceColorZone / collisionPlaceColorProximity wie Ansicht > Farben der Kollisionsstellen... (Farbe der Kugeln als "#rrggbb": 3D-Berührung, Standard #ff0000; Arbeitsbereiche, Standard #e000e0; 3D-Annäherung, Standard #ffc000; die Antwort enthält immer alle drei Farben); signalLabelSize wie View > Signal label size... (Größe der Signalbeschreibungen entlang der Linien der Verriegelungs- / Kollisionskarte, die Antwort enthält signalLabelSize); ohne Schlüssel: lesen (auch ohne Lizenz API / CLI); zoom: > 1 näher, < 1 weiter weg (wie das Mausrad), target: die Mitte der Ansicht in mm (wie Verschieben der Ansicht) – um einen Bereich der Zelle ins Bild zu nehmen; orbit [yawDeg, pitchDeg] (seit 26.10.2026) dreht die Kamera relativ zur aktuellen Ansicht um ihr Ziel – Yaw um die vertikale Szenenachse Z, Pitch um die horizontale Kameraachse – wie ein Ziehen mit der Maus und der Drehtaste (die Antwort enthält wie üblich die Kamera; das Mausziehen selbst siehe view_drag). Reihenfolge der Kameraschlüssel in einem Befehl: zuerst standardView, dann fitAll / viewAll, dann target und zoom (so bleibt bei {"standardView":"default","target":p,"zoom":6} das Ziel erhalten; vor dem 25.10.2026 kam standardView zuletzt und passte die Ansicht an die ganze Szene an). Antwort: der Zustand jedes Schalters und immer camera {"target":[x,y,z],"scale":s,"distance":d} nach allen Änderungen des Befehls: target [mm] die Mitte der Ansicht, scale die Höhe der Ansicht im Ziel [mm], distance = scale / (2·tan 22,5°) der Abstand der Kamera in der Perspektive (Sichtwinkel 45°; in der orthografischen Ansicht ohne Einfluss auf das Bild), z. B. {"cmd":"view","target":[2500,-1200,800],"zoom":2}. Die 3D-Ansicht ist auch ein Element der UI-Befehle (Typ view3d, siehe unten)
scene_shotfile (Pfad der PNG-Datei)Bild nur der 3D-Szene (OpenGL, mit den Beschriftungen und Dekorationen, wie das Szenenbild in den Berichten) als PNG-Datei; lesend, keine Lizenz nötig (wie ui_shot). Antwort: {"ok":true,"file":"...","bytes":n}; Fehler 3D-Ansicht nicht bereit oder kann nicht geschrieben werden. Den Bereich vorher mit view (standardView, target, zoom) einstellen
view_dragfrom, to ([x, y], Bruchteil 0..1 des Ansichtsfensters), steps (Standard 60, 2..5000), intervalMs (Standard 16), button ("left" = drehen | "middle" | "right"), ctrl, shiftsetzt ein Mausziehen in das Fenster der 3D-Ansicht ein (seit 26.10.2026; nur die Variante ohne den JT-Leser), dieselben Mausereignisse wie vom Benutzer – zum Messen der Flüssigkeit von Drehen und Verschieben. Antwort: {"events":n,"pressMs":..,"moveMsAvg":..,"moveMsMax":..,"releaseMs":..,"wallMs":..} (Zeit der Verarbeitung der Mausereignisse im Programm, in ms). Fehler: 3D-Ansichtsfenster nicht gefunden oder from, to fehlt. GUI: dasselbe Ziehen mit der Maus in der 3D-Ansicht
memory_trimgibt den Heap-Speicher an das System zurück (_heapmin, HeapCompact, Beschneiden des Working Sets); Diagnosebefehl für Speichertests (z. B. Speicher nach einer neuen Szene). Antwort: {before, after, heaps, heapWalk} – before / after sind dieselben Objekte wie memory in status; heapWalk listet je Prozess-Heap busyMB, freeMB (freie Bytes innerhalb der Heap-Segmente = Fragmentierung), committedRegionsMB, blocks, largestFreeMB und histogram (lebende Blöcke nach Größe: <64 B, <256 B, <1 KB, <4 KB, <64 KB, <1 MB, ≥1 MB als [Anzahl, MB]). Lesend
reportfile, html, pdf, xlsx, shot, ganttAll, ganttRange, rangeFrom, rangeTo, ganttPrAct, compareFile Zeitbericht wie Bericht...; immer auch die Daten des Laufs *.rcsrun.json; die API öffnet den Bericht nie in einem Browser
signal_timelinefrom, to, signals, select, add, remove, record, why + robot, showAt, export, anonymize, window, dataSignal-Zeitachse des letzten Stationslaufs (Lizenz Simulation). from / to [s] – Zeitfenster (Standard: ganzer Lauf); signals ["Roboter|E80", ...] – nur diese (Standard: die Auswahl; leere Auswahl = alle Signale, die sich geändert haben); select – neue Auswahl, add / remove – ändern (in der Simulationsdatei gespeichert); record – in jedem Stationslauf aufzeichnen; why (Zeit [s]) mit robot – Text, warum der Roboter dort wartet; showAt (Zeit [s]) – Roboter in 3D zu dieser Zeit (Simulation pausiert oder gestoppt); export .csv / .pdf / .html (+ anonymize R1..Rn); window true – Fenster; data false – nur die Zusammenfassung. Antwort: duration, recording, samples, robots [{robot, states [{t0, t1, state, where}]}], signals [{robot, signal, at_from, changes [[t, Wert], ...]}], available, selection, record, why. Ohne Änderungen ein Lesebefehl (auch ohne die Lizenz API / CLI). Alle Parameter mit Standardwerten: unten.
cycle_reserveaction (status, analyze, test, cancel, clear), share, minOverride, minGain, use, export, anonymize, windowTaktzeitreserve (Lizenz 146 Bewegungsoptimierung): analyze – Bewegungen, nach denen der Roboter im letzten Stationslauf ohnehin wartet, und der vorgeschlagene Override; test – der nächste Stationslauf fährt die genutzten Bewegungen mit diesem Override (Programme unverändert), danach Vergleich der Taktzeit (lastTest: takt, baseTakt, difference, ok, robots, unticked – automatisch abgewählte Vorschläge der Roboter, die langsamer als der Takt wurden); cancel / clear; share / minOverride / minGain [%] – die Felder des Fensters; use [{robot, point, use, override}] – Vorschlag ändern; export .pdf / .html / .csv. Antwort: proposals [{robot, point, motion, waitAfter, waitKind (il / warte / fs / end), override, newMotion, energy, use}], baseTakt, baseCycles, energyIndicator, testPending, lastTest, controllers. status ohne Änderungen ist ein Lesebefehl. Alle Parameter mit Standardwerten: unten.
report_openopen (true / false)Option Gespeicherten Bericht (HTML, PDF) im Standardprogramm öffnen (Plugin-Einstellungen > Simulation, Standard: ein) für den Zeitenbericht, den Bericht des Robustheitstests und den Bericht der Kollisionsrisiken; aus = die Dateien werden nur gespeichert – empfohlen, wenn ein KI-Agent oder ein Skript die Berichte erstellt. Ohne open: lesen (auch ohne die Lizenz API / CLI); Setzen benötigt die Lizenz API / CLI. Antwort: {"ok":true,"open":false}
model_converterpath (Text, "" = automatisch)Option Modellkonverter (JT nach glTF) (Plugin-Einstellungen > Simulation): Pfad von modelconv.exe, einem eigenständigen Programm (GNU GPL v3), das Dateien im JT™-Datenformat in glTF 2.0 umwandelt. path "" = automatisch (<Programmordner>/RuntimeTools/modelconv/modelconv.exe, setzt sich von selbst, wenn das Installationsprogramm den Konverter installiert hat). Ohne path: lesen. Antwort: {"ok":true,"path":"...","default":"...","found":true} – path leer = kein Konverter, default = der automatische Pfad, found = die Datei des Konverters ist vorhanden. Der Simulator verwendet ihn beim Laden (model_cache). Benötigt die Lizenz API / CLI. JT ist eine Marke der Siemens Industry Software Inc.
model_cacheconvert, mode, folder, estimate, file(seit 2026-10-25) JT-Modelle als glTF: convert "auto" | "ask" | "never" (Einstellung JT-Modelle: umgewandelte glTF-Modelle verwenden), mode "nextToJt" | "folder" und folder ("" = %LOCALAPPDATA%/DrAmaT/RCS/Models; Einstellung Umgewandelte Modelle speichern); ohne sie: lesen (auch ohne Lizenz API / CLI). estimate mit file (Simulationsdatei, Process-Simulate-Studie .xml oder .jt-Datei): die JT-Modelle, die ein Laden umwandeln würde – es wird nichts umgewandelt. Antwort: convert, mode, folder, defaultFolder, secondsPerMB (Sekunden pro MB eines modelconv-Prozesses), secondsPerFile (Aufwand pro Datei), parallel (Prozesse gleichzeitig) – beide Faktoren lernen aus den letzten Umwandlungen auf diesem Rechner –, kinematicModels (true = Roboter und Mechanismen auch aus glTF: Variante ohne JT-Leser), converter, lastConversion, fileType und estimate {toConvert, reused, megabytes, seconds, models, convertedModels, unreadable [{jt, error}], text}; für eine Process-Simulate-Studie (.xml) neben estimate (Werkzeuge an den Robotern) auch estimateAll (dieselben Felder: alle Komponenten der Studie mit 3D-Modell, wie Datei > Öffnen mit allen Objekten), z. B. {"cmd":"model_cache","estimate":true,"file":"D:/sim/sim_jt.xml"}
package_savefile, includeRobotData (true), includeSource (true), dryRun (false)(seit 2026-10-25) wie File > Simulationspaket speichern (*.rcsz)...: eine eigenständige ZIP-Datei mit der Simulation, dem SPS-Programm, den geladenen Zellenkomponenten und den Werkzeugen der Roboter als umgewandelte Modelle (.glb) mit ihren Positionen und den für die Simulation nötigen Roboterdaten; die Studiendatei wird nie aufgenommen (includeStudy wird ignoriert). includeSource (Standard true) speichert zusätzlich die Original-Modelldateien nur als Quelle; false macht das Paket kleiner. Ein Paket, das auf eine Datei außerhalb verweisen würde, wird mit der Liste der Pfade abgelehnt. dryRun: true schreibt nichts und liefert estimatedSize {glb, source, robots, total} in MB (unkomprimiert). Antwort: das Manifest ohne Dateiliste (robots mit ihren Dateien, models, notIncluded), file, bytes, megabytes, fileCount
package_openfile, convert(seit 2026-10-25) wie File > Simulationspaket öffnen...: entpackt das Paket (einmal je Datei, nach %LOCALAPPDATA%/DrAmaT/RCS/Packages) und lädt seine Simulation wie load in eine neue Szene; Antwort started, simulation (Datei im Paketordner), folder; danach mit status warten. Die Antwort kommt sofort; das Paket wird in einem Arbeitsthread mit dem Fortschrittsfenster Simulationspaket öffnen entpackt (Abbrechen stoppt es; status.extracting ist true, status.modal zeigt das Fenster), danach wird die Simulation geladen. Fehler nach der Antwort: status.lastLoadError
run_datafile (optional)die Daten des Laufs (wie in *.rcsrun.json) in der Antwort; die Laufdatei enthält auch das Array waitTimes (die WARTE ZEIT-Befehle, wie bei wait_times) für einen späteren Vergleich; robots[].zeitPerCycle = die Zeit der aktiven WARTE ZEIT-Befehle je Zyklus des Roboters in s (im Gantt-Diagramm in eigener Farbe); collisionCheck.conflicts[] hat (seit 2026-10-25) kind – zone (Gefahr aus den Arbeitsbereichen), 3d (Kollision = Kontakt der 3D-Modelle), near (3D-Annäherung ohne Kontakt) – und bei 3D-Fällen distance (nächste Punkte, mm), cells und parts
wait_timesrobot (optional, Teil des Roboternamens)nur lesend, ohne Lizenz (wie status), auch während der Simulation: jedes WARTE ZEIT der Roboterprogramme – waitTimes [{robot, program, point, command, seconds, condition, line}], count, secondsTotal, note; z. B. {"cmd":"wait_times","robot":"R03"}
zonesprograms (["folge81", ...]), mode ("cubes" | "triangles"), grid (mm, ein Wert der Liste: 50, 100, 150, 200, 300), radius (mm), withTool, withSubprograms (true / false), calculate (true), clear (false)Arbeitsbereiche: markiert diese Programme aller Roboter und berechnet die Bereiche; mode, grid, radius, withTool, withSubprograms wie die Felder der Gruppe Berechnung; calculate: false setzt nur die Felder, clear: true entfernt die Bereiche aus der 3D-Ansicht (Schaltfläche Leeren). Antwort: robots, mode, grid, radius, withTool, withSubprograms
dockingenabled (true / false), distance (mm), put / take {name ("MAKRO" | "UP" | "A" | ...), number, condition ("EIN" | "TRUE" | ...)}, detachAll, attachDefaults (true), run (Nummer des UP)Registerkarte Auto-Docking: Werkzeugwechsel an den Dockpunkten, die Befehle Werkzeug ablegen (DS abdocken) und Werkzeug aufnehmen (DS andocken), max. Abstand des Werkzeugs vom Flansch, Alle Werkzeuge von allen Robotern lösen (ohne Frage) / Standardwerkzeuge an alle Roboter anbauen, run = Werkzeugwechsel auf allen Robotern mit diesem UP; während einer Simulation abgelehnt; ohne Schlüssel: lesen
sps_programxml, file (.xml), newFromRobots (true), saveFile (.xml), open (true)SPS-Programm der Station (Registerkarte SPS, SPS-Editor): setzt es aus XML oder einer Datei (file darf auch eine Simulationsdatei <RcsSimulation> sein – ihr Element <Sps> wird verwendet; ohne es der Fehler Kein SPS-Programm in der Datei), newFromRobots wie Neu aus den Robotern der Zelle (ohne Frage), saveFile schreibt es, open öffnet das Editorfenster wie Edit SPS program... (während einer Simulation nur zum Ansehen: Zustände der Bausteine live, auch die Bausteine Interlock priority); Antwort: xml, blocks, check (Ergebnis von Prüfung vor dem Lauf), mit open auch opened und readOnly (true während einer Simulation)
race_ruleswindow (s, 0.1..5), message (true / false), lock (true / false), rules [{zone, first, second, mode ("window" | "order"), window (s, 0,1..30, Standard 2)}], clear (true)Wettläufe um Verriegelungsbereiche (zwei Roboter fordern denselben Bereich innerhalb von window Sekunden an, Standard 1 s; Plugin-Einstellungen > Simulation), message = Fenster mit den Wettläufen am Ende einer Stationssimulation, lock = Reihenfolge der Roboter bei einem Wettlauf während des Laufs beibehalten (Regel "auto" nur im Lauf, Einstellung Race_Lock_Order; das SPS-Programm wird nicht geändert); rules = Vorrang wie der SPS-Baustein Interlock priority (SPS) für die nächsten Simulationen, auch ohne SPS (second leer = jeder Partner, mode "window" = Vorrang in einem Zeitfenster: der zweite Roboter wartet höchstens window Sekunden ab seiner eigenen Anforderung, dann fährt er und die Reihenfolge ändert sich – nur für fast gleichzeitige Anforderungen; "order" = Reihenfolge in jedem Zyklus: der zweite Roboter immer nach dem ersten, auch wenn der erste wegen anderer Bereiche verspätet ist – für Variante B); eine Regel für einen Bereich ersetzt die SPS-Bausteine dieses Bereichs (Variante B, z. B. {"zone": 4, "first": "R06", "second": "R03", "mode": "order"}), clear entfernt sie. Antwort: window, message, lock, rules (API), spsRules (Bausteine des SPS-Programms), autoRules (Regeln aus den Wettläufen des letzten Laufs mit whereFirst, whereSecond, difference), races [{zone, robotA, whereA, robotB, whereB, count, minDifference, maxDifference, lostA, lostB, waited}] des letzten Laufs, log (jede Anwendung einer Regel), proposals (die Wettläufe des letzten Laufs, wie race_study), pendingBlocks (Zahl der für Wettläufe eingefügten Bausteine Interlock priority, die auf die Entscheidung bei save warten: behalten oder entfernen); ohne Schlüssel: lesen
race_studyaction ("status" | "add_blocks" | "start" | "stop" | "apply", Standard "status"), races ([Indizes], fehlt = alle), cycles (1..20, Standard 3), choices (["A" | "B" | "none", ...])Vorschlag am Ende einer Simulation mit Wettläufen und Simulation beider Reihenfolgen (Wettläufe: Vorschlag und Simulation beider Reihenfolgen); die Simulation ändert das SPS-Programm nie von selbst. status (auch ohne Lizenz API / CLI): proposals [{race, zone, first, whereFirst, second, whereSecond, difference}] (die Wettläufe der letzten Simulation mit Wettläufen - ein Lauf ohne Wettlauf, z. B. Folge 125 nach HOME, behält sie), active, run / runs (während active), result, pendingBlocks; add_blocks = Schaltfläche Schutzbausteine hinzufügen: Bausteine mit der Reihenfolge der Simulation für die angegebenen Wettläufe, Antwort added [Texte]; start = Schaltfläche Beide Reihenfolgen simulieren: für jeden Wettlauf 2 Läufe mit cycles Zyklen (A = Reihenfolge der Simulation, B = Roboter getauscht), das SPS-Programm wird nach jedem Lauf wiederhergestellt (Lizenz Simulation, aktives SPS-Programm); stop stoppt sie (Ergebnis der fertigen Läufe); apply = Schaltfläche Gewählte Bausteine hinzufügen: eine Wahl pro Wettlauf des Ergebnisses, Antwort added. Ergebnis: [{race, zone, first, whereFirst, second, whereSecond, difference, A {avg, min, max, cycles, waitTotal, collisionRisks, interrupted, done}, B {...}, recommended ("A" | "B" | "none")}]. Typischer Ablauf eines Agenten: run → auf das Ende warten (status) → race_study status → start {cycles: 3} → warten, bis active false ist → result lesen → apply {choices: [...]} → save {raceBlocks: "keep"}
sim_displaylamps {motion, process, warte, interlock, folgenstart, loopEnd: "green" | "orange" | "red" | "blue" | "off"}, console {loops, up, dwell, warte, folgenstart, interlock, io, motion, sps, timers (true / false), debug, flushMs, maxLines, remindSec}die Fenster Statusleuchte... und Konsolenmeldungen... der Registerkarte Simulation, auch während einer Simulation; ohne Schlüssel: lesen
exportwhat ("times" | "motionTimes"), file (.csv)CSV wie Exportieren... der Registerkarte Zeiten und der Bewegungszeiten der Registerkarte Motion; Kollisionsmatrix und Verriegelungen prüfen: collision_matrix und check_interlocks liefern die Daten als JSON
zones_viewshow, overlapOnly, pathColors (true / false), transparency (10..95 %)Gruppe Anzeige der Registerkarte Work Zones: Arbeitsbereiche anzeigen, nur gemeinsame Bereiche, Programmbahn in den Farben der Verriegelungen, Transparenz; ohne Schlüssel: lesen (auch ohne Lizenz API / CLI)
motion_optionsplanner (true / false), override (%), ptpRamp (s), pathAcc (mm/s², 0 = aus dem Roboterarchiv), oriVel (°/s), approximation, showPath (true / false), defaults (true)Registerkarte Motion: reale Bewegung (Bewegungsplaner), seine Parameter (Programm-Override, PTP-Beschleunigungszeit, Bahnbeschleunigung, Orientierungsgeschwindigkeit, Überschleifen), die reale Bahn in der 3D-Ansicht; defaults = Schaltfläche Standardwerte; während einer Simulation abgelehnt; ohne Schlüssel: lesen
check_interlocksErgebnisse von Verriegelungen prüfen als Daten (Schwere, Code, Roboter, Partner, Punkt, Meldung, Vorschlag; siehe Was RCS prüft) und comments: fehlende Kommentare über Punkten mit Anforderung / Freigabe (row, Roboter, Punkt, Verriegelung, Freigabe, Kommentar aus der Vorlage, Hinweis)
robotrobot (Namensteil, z. B. "R06"), override (1..100), pause (true / false), axes ([A1..A6, E1]), ms, run ("UP42" | "folge81"), point (1), stop (true), goto ("UP43/P8" | "folge81/P12"), tcp {tool, base}, moveTcp {x, y, z, [a, b, c], tool, base, frame ("base" | "scene")}, rebuildPrograms (true)Override und Pause eines Roboters auch während der Simulation der Station (wie im SmartPad); run = nur das Programm dieses Roboters (wie Programm starten der Registerkarte Programme) ab dem Punkt point (der Roboter fährt zuerst dorthin); stop = hält nur diesen Roboter an; goto = der Roboter steht in diesem Punkt des Programms (der Punkt wird in der Registerkarte Programme markiert), das Programm wird nicht gestartet – z. B. zur Prüfung des Werkzeugs in einem Schweißpunkt (nur bei angehaltener Simulation; Antwort at); axes wie die Schieberegler der Registerkarte Roboterachsen (Grad, E1 in mm; nur bei angehaltener Simulation; ms > 0 = sanfte Bewegung); Antwort: robot, running, paused, override, axes und tool {id, name, x, y, z, a, b, c} (das Werkzeug am Flansch und seine Anbauposition relativ zum KUKA-Flansch $FLANGE, wie pos von tool_model; fehlt ohne Werkzeug), toolKind ("cad" = CAD-Modell des realen Werkzeugs, "dummy" = Dummy-Werkzeug - eine Näherung, "none" = kein Werkzeug) und toolText (der Text der Spalte Werkzeug (3D) des Zeitberichts, siehe Bericht), flange ([x, y, z] mm, die Position des Flansches des Roboters in der Szene, z. B. als target von view für den Zoom auf das Werkzeug), base ([x, y, z] mm, der Roboterfuß – Roboter-Root oder der Wagen der 7. Achse – in der Szene), archive (der Archivordner des Roboters) und archiveZip (die ZIP-Datei, aus der er entpackt wurde, falls vorhanden).
tcp = die TCP-Position wie die Gruppe Cartesian (TCP) des kartesischen Verfahrens mit Werkzeug tool und Basis base (0 = Welt / Roboter-Root; Werkzeug- und Basisdaten aus $config.dat); Antwort tcp {x, y, z, a, b, c, s, t, tool, base} in dieser Basis und tcpScene ([x, y, z] mm, derselbe TCP in der Szene). moveTcp = der Roboter fährt seinen TCP nach x, y, z (ohne a, b, c bleibt die aktuelle Orientierung) wie die Schaltflächen − / + des kartesischen Verfahrens: inverse Kinematik mit S und T der aktuellen Position; frame "base" (Standard) = x, y, z in der Basis base, "scene" = x, y, z in der Szene (z. B. tcpScene oder flange eines anderen Roboters); nur wenn die Simulation nicht läuft; Fehler Position not reachable, wenn die IK keine Lösung hat oder die Achsen die Position nicht erreichen; die Antwort enthält tcp / tcpScene der neuen Position. rebuildPrograms = wie Alle Programme suchen im Kontextmenü des Roboters (Model Browser): der Programmbaum des Roboters wird neu aus dem Archiv aufgebaut, neue und geänderte Folge- / UP-Dateien werden gelesen (z. B. nach dem Schreiben einer Kopie eines UP in das Archiv); Antwort programsRebuilt; nicht während der Roboter fährt.
Z. B. {"cmd":"robot","robot":"R6","tcp":{"tool":1,"base":1}}, {"cmd":"robot","robot":"R5","moveTcp":{"x":2450.5,"y":-310.0,"z":1620.0,"tool":2,"frame":"scene"}}, {"cmd":"robot","robot":"R5","rebuildPrograms":true}
tool_modelrobot (Namensteil), file (.jt, .gltf, .glb, binäres .stl, .stp, .step), pos {x, y, z (mm), a, b, c (°)}, fixture (true), idein Werkzeugmodell aus einer JT-, glTF-, STL- oder STEP-Datei am Flansch eines Roboters (wie das Robotermenü Werkzeugmodell (JT / STEP / STL / glTF)..., siehe Werkzeugmodell aus einer JT-, glTF-, STL- oder STEP-Datei; glTF / STL / STEP im Koordinatensystem des JT-Modells, glTF mit den Farben der Teile, ID mit dem Zusatz _gltf / _glb / _stl / _stp / _step; eine große STEP-Datei kann Minuten dauern - langes Timeout verwenden): pos = Ursprung des Modells relativ zum KUKA-Flansch ($FLANGE, KUKA ABC; Standard 0 = das Modell liegt im Flanschkoordinatensystem) wie die mountLocation des Werkzeugs in einer Process-Simulate-Studie – nicht der TCP ($TOOL_DATA); das Modell ersetzt das Werkzeug am Flansch, ein Dummy-Werkzeug wird entfernt; fixture: true = ein zusätzliches Element am Flansch (z. B. Werkzeugwechsler), das Werkzeug bleibt. Das Modell wird mit der Simulation (Element Docked, Attribut jtFile) und der Sitzung (attached[].file) gespeichert und beim Laden erneut angebaut. Ohne file und id: nur eine neue Position des schon angebauten Werkzeugmodells; id = neue Position dieses Modells. Nicht während der Simulation. Antwort: id, robot, tool (true = Werkzeug, false = zusätzliches Teil). Dasselbe Modell (derselbe Name oder ein Name, der mit dem anderen Namen an einem Unterstrich beginnt) wird nie zweimal an einem Roboter angebaut: ist es oder das Werkzeug schon am Roboter, liefert der Befehl einen Fehler mit den angebauten Elementen; replace: true ersetzt es. Ein Roboter mit 3D-Modell seines Werkzeugs hat kein Dummy-Werkzeug
tool_inforobotdie am Roboter angebauten Elemente: tool (id, name, slot, file, pos {x, y, z, a, b, c} relativ zum KUKA-Flansch in mm / °, visible, source = study | model | package | dummy, dummy) und fixtures[] (dieselben Felder), toolText
tool_removerobot, id oder name, all (true), fixtures (true, mit all)entfernt ein Element vom Roboter: ein Modell aus einer Datei verschwindet aus der Szene, ein Element der Studie bleibt ausgeblendet. Mit all: true das Werkzeug und (fixtures, Standard true) alle zusätzlichen Teile. Ein entferntes Modell ist nicht mehr Teil der Kollisionsprüfungen. Nicht während der Simulation
tool_hide / tool_showrobot, idblendet ein angebautes Element aus oder ein, ohne es zu entfernen; wird mit der Simulation und dem Paket gespeichert. Ein ausgeblendetes Modell bleibt in den Kollisionsprüfungen (3D, Zonen, Blockaden); nur tool_remove nimmt es heraus
signalsrobot (Namensteil oder "all"), set ({"A76": 1, "E80": 0}), release (true oder ["A76", ...]), always ({"M95": 1 | 0 | -1}), read (["E80", ...]), eval ("E80 & E76")Signale E / A / F / M wie das Signalmenü des SmartPads und des Fensters Signale E / A der Roboter: set = von Hand setzen (bleibt bis zur Freigabe), release = zurück an die Simulation (true = alle von Hand gesetzten Signale des Roboters), always = fester Wert in der Signaldatei (nur M / F; -1 entfernt ihn); Antwort: values {Roboter: {Signal: {value, forced}}}, eval
dummy_toolrobot, shape ("sphere" | "box"), r, dx, dy, dz, x, y, z (mm), a, b, c (°), position ("flange" | "tcp"), remove (true), allRobots (true), attach (true)Fenster Dummy-Werkzeug eines Roboters: die angegebenen Werte werden gespeichert und das Dummy-Werkzeug angebaut (ein Werkzeug am Flansch wird gelöst); remove entfernt es, allRobots setzt dasselbe Dummy-Werkzeug auf alle Roboter (ohne Frage); ohne Werte: die gespeicherten Werte
insert_interlocksmode ("stop" | "request"), stopText, requestText, releaseText, apply (false), rows ([0, 2, ...])Arbeitsbereiche > Verriegelungen einfügen... ohne Fenster: die Vorschläge für jede Einfahrt in einen gemeinsamen Bereich ohne Verriegelung (Antwort rows: row, robot, partner, area, changes, note, ok); apply: true schreibt die markierten Zeilen (Standard: die Zeilen mit ok) in die Programme im Editor - prüfen und speichern, danach die Arbeitsbereiche neu berechnen; Antwort auch inserted, changedFiles
savefile (.xml), cell, robots, jt, docked, dummy, sps (true / false), raceBlocks ("keep" | "remove", Standard "keep")Simulation > Simulation speichern... ohne Fenster: die Einstellungen der Simulation immer, die Teile des Zellenlayouts wie angegeben (Standard: was die Szene enthält); raceBlocks = was mit den noch nicht bestätigten Bausteinen Interlock priority geschieht, die für Wettläufe eingefügt wurden (auf Wahl des Benutzers oder mit race_study), wenn das SPS-Programm gespeichert wird (remove entfernt sie aus dem SPS-Programm, wie Save without the blocks, Simulationsdatei). Antwort: file, raceBlocks ("none" | "kept" | "removed"), raceBlocksCount
zone_stepsrobot, program ("folge81")für jeden Punkt des Programms (mit den aufgerufenen UPs) aus den Arbeitsbereichen: Roboter im gemeinsamen Bereich (contact), Bewegungen ohne Verriegelung (unprotected), aktive Verriegelungen in der Bewegung und nach dem Punkt
collision_ignorekey (Fall aus collisionCheck.conflicts), ignore (true / false) – oder clear (true), all (true)Kollisionsgefahren, bei denen die Simulation nicht mehr anhält (Ignorieren im Fenster); clear leert die Liste (Keine ignorieren), all ignoriert alle Fälle der aktuellen Simulation (Alle ignorieren); Antwort: ignorierte Schlüssel
collision_casekey (beliebiger Schlüssel eines Falls, z. B. aus run_data oder robust_test risks), action ("points" | "editor")die Schaltflächen einer Zeile des Fensters der Kollisionsgefahren: points = beide Roboter in ihre Punkte (nur bei angehaltener oder pausierter Simulation; in der Pause fahren sie sanft und Weiter fährt sie zurück; bei einem Kontakt der 3D-Modelle (Live 3D) fahren beide Roboter in ihre Achsen an der ersten Kontaktstelle der Zeile (ein 3D-Fall behält bis zu 4 Stellen, die mehr als 400 mm auseinander liegen, jede mit eigener Kugel, Zeit und Achsen); ein wiederholter Aufruf mit demselben Schlüssel fährt zur nächsten Stelle der Zeile (nach dem letzten wieder zum ersten; der Schlüssel eines einzelnen Kontakts zeigt genau diesen Kontakt), die rote Kugel mit derselben Zeit liegt auf den sich berührenden Teilen; bei einem Fall der Arbeitsräume in die Punkte der Programme, wo die 3D-Modelle in dieser Stellung einmal geprüft werden: Berührung = orange Kugel und Warnung in der Konsole, sonst der kleinste Abstand; dieses Ergebnis kommt etwa 0,2–6 s später in der Konsole), editor = beide Programme im Editor an den Punkten; die Antwort enthält point ([x, y, z] mm, die Stelle der Kollision – die rote Kugel – in der Szene, falls der Fall eine hat), z. B. als target von view für ein Bildschirmfoto der Stelle, place / places (3D-Zeilen: die gezeigte Stelle und die Anzahl der Stellen, wie 2/6 auf dem Knopf) und shown (der Text der blauen Zeile unter der Tabelle: was die 3D-Ansicht zeigt)
collision_reportfile (.pdf oder .html), view (true / false, Standard true), test (true / false)speichert die Kollisionsfälle wie die Schaltfläche Als HTML / PDF speichern des Fensters: während eines Robustheitstests (oder test = true) alle Fälle des Tests, sonst die Fälle der letzten Simulation; benachbarte Punkte einer Stelle als ein Fall (Einstellungen des Plugins, Kollisionsbericht)
robust_testaction, siehe untenRobustheitstest (Robustheitstest); jede Antwort enthält den Status: active, paused, finished, step, totalCycles, collisionRisks, minutes, report, remainingMinutes und estimatedEnd (geschätzte Restzeit und Ende des Tests; fehlen, solange unbekannt)
insert_commentsrows (Nummern "row" aus comments, leer = alle), texts (eigene Texte dieser Zeilen, optional)fügt die fehlenden Kommentare des letzten check_interlocks ohne Speichern in die Programme im Editor ein (inserted, log)
collision_matrixscope ("checked" = in Arbeitsbereiche markierte Programme, Standard; "archive" = ganze Roboterarchive)Kollisionsmatrix als Daten: Roboter mit ihren Verriegelungen (Anforderungen, Freigaben, Partner, Anforderungen ohne Partner), Roboterpaare (Verriegelungen, Zustand, gemeinsame / rote m3, wenn die Bereiche berechnet sind) und die Fehler der Signallogik (Roboter, Punkt, Zeile, Code, Meldung) - ohne Berechnung der Arbeitsbereiche
anon_studyfile (Ergebnis; der Schlüssel wird daneben als <Datei>.key.json gespeichert), check, run (true = Verriegelungen prüfen / letzte Simulation einschließen), show (true = Zusammenfassung wie die Schaltfläche anzeigen), texts (true = mit Verriegelungskommentaren und Langtexten), collisions (true = Standard; false = ohne die Befunde COLLISION in checkInterlocks und ohne simulation.collisionCheck – für einen Blindtest der KI; Oberfläche: Frage beim Speichern)anonymisierte Studie für einen KI-Assistenten: Roboter R#, Programme F#/U#, Punkte P#, Programmschritte mit Verriegelungsereignissen und Berührungen, gemeinsame Volumen, Verriegelungen prüfen und Simulation – ohne Namen, Koordinaten und Programmtext; Antwort mit den Dateien, Statistik und leaks (gefundene Teile echter Namen, muss leer sein). Arbeitsbereiche müssen berechnet sein
ai_importtext (Antwort der KI mit {"changes": [...]}) oder file oder changes (Array), key (Schlüsseldatei, Standard: die zuletzt exportierte), apply (true = Zeilen mit Status ok übernehmen), rows (Indizes der zu übernehmenden Zeilen), check3d (true = nach dem Übernehmen Arbeitsbereiche aus den Dreiecken der 3D-Modelle, Antwort check3d mit ok und den entries ohne Verriegelung)Vorschläge des KI-Agenten übersetzt auf die Roboter und Programme der Zelle: Zeilen mit Roboter, Programm, Punkt, Aktion, Änderungen im Programm, Hinweis und Status (ok / check / error); mit apply: Sicherung der Programme, Änderungen gespeichert, backupDir und log. Danach run und ai_compare
ai_comparekey (optional)Stationstakt, Takt und Wartezeit jedes Roboters vor den Änderungen der KI und in der letzten Simulation (cycleDelta), Erwartung der KI
ai_keepübernommene Änderungen der KI als neuen Ausgangszustand behalten (nächste Runde: neue anon_study, neuer Schlüssel)
ai_restoreOriginalprogramme aus der Sicherung (Editorfenster dieser Programme werden ohne Speichern geschlossen)
ai_chatmessage, newChat (true), stop (true), last (20), anonymous (true / false), warmUp (true / false)das Fenster KI-Agent (Lizenz API / CLI): message = eine Nachricht wie aus dem Textfeld (während der Agent arbeitet, wartet sie in der Warteschlange; Fehler ohne API-Schlüssel oder Lizenz); message "/reload" lädt die Wissensdateien des Agenten neu, ohne Anfrage an das Modell (wie Wissen neu laden in den Einstellungen, das Gespräch bleibt; die Denkblöcke früherer Antworten werden aus dem Verlauf entfernt; das transcript erhält einen Eintrag mit der Zusammenfassung); message "/status", "/run folge=125 loops=1", "/view {json}" … = ein direkter Befehl, sofort ohne Modell ausgeführt (auch während der Agent arbeitet; die Antwort erscheint im Fenster des Chats, nur ein Fehler kommt in das transcript – aus einem Skript den Befehl direkt aufrufen; /ai_chat wird abgewiesen); newChat = Neuer Chat; stop = Stopp; last = Anzahl der letzten Einträge des Chats in der Antwort (0 = alle); anonymous = der anonyme Modus an / aus (wie /anonymous on | off und das Kontrollkästchen in den Einstellungen; eine Änderung beginnt einen neuen Chat). Ist consentPending true, wurde die erste Nachricht von der Frage echte Daten senden? zurückgehalten – antworten mit message "yes" (echte Daten), "anon" (anonymer Modus an) oder "no" (nichts wird gesendet). warmUp = die Einstellung Wissen der KI beim Start laden (Aufwärmen im Hintergrund). Antwort: busy (der Agent arbeitet), anonymous (Modus an), warmUp (die Einstellung), connectionConfigured (eine Verbindung zum Modell ist eingestellt: Claude Code gefunden / API-Schlüssel / OpenAI-Schlüssel und Adresse), consentPending (die Frage YES / ANON / NO wartet), transcript [{who (user | agent | tool | error | question), text, time}]
agents_mdauto (true / false), update (true), get (true), section (auto | notes), notes ("Text"), file ("Pfad")die Briefing-Datei AGENTS.md der Station für den KI-Agenten (siehe AGENTS.md). auto = der Menüpunkt Simulation > AGENTS.md automatisch aktualisieren (Einstellung RCS_Group/AgentsMd_Auto, Standard aus; status zeigt agentsMdAuto); update = AGENTS.md jetzt aktualisieren (funktioniert auch bei ausgeschalteter Option und während eines Laufs – dann eine leichte Aktualisierung); get = die Datei lesen (braucht keine API-Lizenz 248); section auto | notes = welcher Block zurückgegeben oder geschrieben wird; notes = ersetzt den NOTES-Block (der Block zwischen RCS:NOTES BEGIN und RCS:NOTES END wird von einer Aktualisierung nie angerührt); file = schreibt eine Kopie des Textes in diesen Pfad (Fehler, wenn es noch keine AGENTS.md gibt). Der Befehl unterstützt den anonymen Modus wie die anderen Befehle. Antwort: auto, file, exists, chars, updatedAt, text, copy

sim_options – Optionen der Registerkarte Simulation

Ohne Schlüssel liest der Befehl die Optionen. Mit Schlüsseln setzt er sie wie ein Klick in der Oberfläche (auch in den Einstellungen gespeichert). Während der Simulation sind die Optionen gesperrt, das Setzen gibt einen Fehler. Die Antwort enthält immer alle Werte und locked (true, während die Simulation läuft).

SchlüsselWertOption in der Oberfläche
stopAtCollisionRisktrue / falseStop the simulation at a collision risk
autoResume0..600 (s)weiter nach N s (0 = auf Weiter warten) – nach einer Pause bei Kollisionsgefahr läuft die Simulation von selbst weiter; auch während des Ablaufs (2026-10-31)
loopSynctrue / falseStart all together at 'Warte auf Folgenstart'
interlockstrue / falseRespect interlock signals (A8n / Makro20 / A4n)
autoQuitttrue / falseQuitt if all robots wait
stopOnBreakpointstrue / falseStop on breakpoints
syncOncePerCycletrue / falseonce per cycle (neben Stop at WARTE BIS:)
stopWaitFalsetrue / falseStop at 'WARTE BIS AUS' and wait for Continue
stopEveryWaittrue / falseStop at every 'WARTE BIS' and wait for Continue
ignoreMotionConditionstrue / falseIgnore motion conditions (FB PSPS / FB ONL) – die Roboter warten nicht auf FB PSPS / FB ONL (Test der Bewegungen ohne Partner); wird in der Simulationsdatei gespeichert
freeRuntrue / falseFree run - ignore all conditions (SPS, interlocks, WARTE BIS, FB, collisions) – alle Roboter fahren, ohne auf etwas zu warten (kein SPS-Programm, keine Verriegelungen, kein gemeinsamer Start, WARTE BIS und FB PSPS / FB ONL gehen durch, kein Stopp bei Kollisionsgefahr); wird in der Simulationsdatei gespeichert
printAxestrue / falseShow the axis values of every point in the console
toolDockingtrue / falseTool change at the docking points (Auto-Docking)
toolDockingDistanceZahl (mm)Max. distance of the tool from the flange (Auto-Docking)
showStatetrue / falseShow the program state above the robots
collisionMaptrue / falseShow collision map
collisionMapPosition0 Boden, 1 oben, 2 FußLage der Kollisionskarte
upCalls"none", "onlyEin", "all"UP calls: Do not execute / Only unconditional calls / All calls
syncWaitsText, z. B. "E23; E80 & E76"Stop at WARTE BIS:
redrawMs16, 50, 100, 250, 1000Szene alle ... ms zeichnen (Optionen Live 3D); auch während der Simulation änderbar
programRules[{kind, value, ms, prAct, mode, overlap}]Tabelle Program rules (ersetzt die ganze Tabelle). kind: excludeUp, waitAtCommand, excludeMakro, excludeFbPsps, customCommand; mode: solo, before, after, reload
template\RCS\AIAgent\rcs_api.ps1 '{"cmd":"sim_options"}'
template\RCS\AIAgent\rcs_api.ps1 '{"cmd":"sim_options","stopAtCollisionRisk":false,"upCalls":"all","syncWaits":"E23; E80 & E76"}'
template\RCS\AIAgent\rcs_api.ps1 '{"cmd":"sim_options","programRules":[{"kind":"waitAtCommand","value":"SERVOZANGE","ms":1200,"prAct":true,"mode":"after","overlap":400}]}'
template\RCS\AIAgent\rcs_api.ps1 '{"cmd":"live_check","on":true,"cell":30,"capsule":60,"range":200,"warn":30,"contact":5,"thread":true,"parallel":true,"grid":true,"stepMs":20}'

robust_test – Aktionen

actionParameterWas sie macht
loadfile oder plan {...}; services, stops, sps, program (true / false, Standard true)lädt einen Plan; die Teile wählen, was aus der Datei übernommen wird (Serviceprogramme, Halte in Punkten, SPS-Programm, Programm); plan = der Plan als JSON-Objekt im Befehl (Format einer Plandatei, z. B. vom KI-Agenten) – er wird in eine temporäre Datei geschrieben und von dort geladen; Antwort: file (diese temporäre Datei)
savefile; services, stops, sps, programspeichert den Plan mit diesen Teilen
optionsdie Schlüssel einer Plandatei (seed, speed, ignoreCollisions, stopOnCollision, only3d, allUps, repeat, baseline, baselineCycles, timeLimitMin, maxCycles, recoveryTolerance, report, startAt, generator {...}, missingTest {...} oder false), autoSave (true / false)setzt die Optionen der Registerkarte ohne Plandatei - nur die angegebenen Schlüssel ändern sich (generator und missingTest Schlüssel für Schlüssel); eine Quelle der Schritte ist nötig: geladener Plan, generator oder missingTest. Antwort: plan (alle Optionen nach der Änderung)
find_servicesfüllt die Tabelle der Serviceprogramme aus der Folge der Roboter; Antwort: services
servicerobot, up, everyCyclefügt eine Zeile der Serviceprogramme hinzu oder ändert sie; Antwort: services
stop_pointrobot, point ("UP42/P29" oder "P12"), sec (20), everyCycle (1) – oder clear (true), remove (Zeile 0..n-1)fügt einen Halt in einem Punkt hinzu, entfernt eine Zeile (remove, Index wie in der Antwort) oder leert die Tabelle; Antwort: stops
start / resumestartet den Test / setzt einen gespeicherten Test fort
pause / continuehält den Test an / setzt ihn fort
stopbeendet den Test
statusactive, paused, finished, round, step, totalCycles, collisionRisks, baselineCycle, seed, stopReason, minutes, report, remainingMinutes und estimatedEnd (geschätzte Restzeit und Ende des Tests; fehlen, solange unbekannt; nach dem Zeitlimit der Rest des aktuellen Schritts, der immer zu Ende läuft); beim Test fehlender Verriegelungen auch missing (total, done, collisions); während des Tests auch der aktuelle Schritt: stepRunning, stepName, stepLoop / stepLoops (Durchlauf des langsamsten Roboters / Durchläufe des Schritts), stepMinutes, timeLimitMinutes und timeLimitReached
risksfindings des ganzen Tests bis jetzt: robot, where, partner, partnerWhere, count, firstAt, firstStep, kind (zone | 3d | near), distance, parts, png
reportprogress: "<Ordner>" (optional)schreibt den Bericht; mit progress den Bericht eines gespeicherten Tests aus seinem Ordner; Antwort: file

signal_timeline – Parameter

Signal-Zeitachse des letzten Stationslaufs (Lizenz Simulation). Die Aufzeichnung entsteht bei jedem Stationslauf (Auf allen Robotern ausführen), solange record ein ist. Alle Schlüssel sind optional; ohne record, select, add, remove, showAt, export und window liest der Befehl nur (auch ohne die Lizenz API / CLI). Ein Signal heißt "Roboter|Signal", z. B. "<Roboter>|E80", "<Roboter>|A41" oder "<Roboter>|Zone5" (vom Roboter belegter Bereich). robot, signals, select, add und remove verwenden die echten Roboternamen (wie in einer Antwort ohne anonymize).

SchlüsselWertStandardWas er machtOption in der Oberfläche
fromZahl [s]0Beginn des Zeitfensters (Simulationszeit) für Antwort und Export gezeigtes Zeitfenster (Mausrad / Ziehen)
toZahl [s]-1 (= Ende des Laufs)Ende des Zeitfensters; ein Wert nach dem Ende des Laufs ist das Ende des Laufsgezeigtes Zeitfenster, Ganzer Lauf
signals["Roboter|E80", ...]die Auswahlnur diese Signale in Antwort und Export; leere Auswahl = alle Signale, die sich im Lauf geändert haben–
select["Roboter|E80", ...]– (unverändert)neue Auswahl der Signale (ersetzt sie, [] = leer); in der Simulationsdatei gespeichertBaum der Signale (ankreuzen), Auswahl löschen
add["Roboter|E80", ...]–fügt Signale zur Auswahl hinzuim Baum ankreuzen
remove["Roboter|E80", ...]–entfernt Signale aus der Auswahlim Baum abwählen
recordtrue / falsetrue (unverändert)Zustände und Signale in jedem Stationslauf aufzeichnen; in der Simulationsdatei gespeichertin jedem Stationslauf aufzeichnen
whyZahl [s]–Text, warum robot zu dieser Zeit wartet: Zustand, Punkt, der Bereich und der Roboter, der ihn seit welchem Punkt belegt, die Bedingung WARTE BIS / FB PSPS oder die Roboter, die vor dem Folgenstart noch arbeiten (Antwort why)Klick in die Zeitachse, Text unter dem Diagramm
robotRobotername– (nötig mit why)Roboter für why; Fehler why: "robot" missing–
showAtZahl [s]–alle Roboter in der 3D-Ansicht in ihre Achsen zu dieser Zeit (nur bei pausierter oder gestoppter Simulation); Antwort shownAtRoboter zum Cursor, 3D folgt dem Cursor
exportDatei .csv / .pdf / .html–speichert das Zeitfenster from..to: CSV (eine Zeile pro Änderung: time_s;robot;signal;value;where, Zustände und Signale, Semikolon, UTF-8), PDF oder HTML (Diagramm und Tabelle der Signaländerungen, höchstens 5000 Zeilen); Antwort export Speichern...
anonymizetrue / falsefalseRoboternamen R1..Rn (alphabetische Reihenfolge) in Antwort und ExportRoboternamen als R1..Rn
windowtrue / falsefalseöffnet das Fenster Signal-ZeitachseRegisterkarte Zeiten > Signal-Zeitachse...
datatrue / falsetruefalse = nur die Zusammenfassung, ohne robots, signals und available–

Antwort: duration [s] (Länge der Aufzeichnung), recording (true, solange die Station läuft), samples, from, to, robots [{robot, states [{t0, t1, state, where}]}] – state (englischer Text): motion, process, waits for an interlock zone, WARTE BIS, Warte auf Folgenstart, waits at the end of the loop, waits (condition), not moving; where: Programm und Punkt –, signals [{robot, signal, at_from (Wert bei from, -1 = noch nicht gesetzt), changes [[t, Wert], ...]}], available (alle aufgezeichneten Signale), selection, record und auf Anfrage why, shownAt, export.

template\RCS\AIAgent\rcs_api.ps1 '{"cmd":"signal_timeline","data":false}'
template\RCS\AIAgent\rcs_api.ps1 '{"cmd":"signal_timeline","why":41.5,"robot":"<Roboter>","data":false}'
template\RCS\AIAgent\rcs_api.ps1 '{"cmd":"signal_timeline","from":30,"to":75,"signals":["<Roboter>|E80","<Roboter>|Zone5"],"export":"C:\\temp\\timeline.csv","anonymize":true}'

cycle_reserve – Parameter

Taktzeitreserve (Lizenz 146 Bewegungsoptimierung). Ablauf: ein Stationslauf (run, am besten 2 Schleifen oder mehr) → action analyze → action test → derselbe Stationslauf noch einmal (er ist der Kontrolllauf) → status liest lastTest. Ist lastTest.ok false, werden die Vorschläge der Roboter, die langsamer als der Takt der Station wurden, automatisch abgewählt (Liste lastTest.unticked) – dann action test und der Lauf erneut. status ohne weitere Schlüssel liest nur.

SchlüsselWertStandardWas er machtOption in der Oberfläche
actionstatus, analyze, test, cancel, clearstatusanalyze – Vorschläge aus dem letzten Stationslauf (Fehler, wenn die Simulation läuft oder kein Takt gemessen wurde); test – der nächste Stationslauf ist der Kontrolllauf mit den angekreuzten Vorschlägen (Fehler ohne Vorschläge oder bei laufender Simulation); cancel – kein Kontrolllauf; clear – löscht die Vorschläge und den letzten Test Letzten Lauf analysieren, Kontrolllauf mit diesen Geschwindigkeiten, Kein Kontrolllauf
share10..100 [%]80Teil der kürzesten Wartezeit nach der Bewegung (über alle Takte), der zur langsameren Bewegung wirdNutzung der Wartezeit
minOverride10..100 [%]30kleinster vorgeschlagener OverrideOverride nicht unter
minGain1..50 [%]5eine Bewegung wird nur vorgeschlagen, wenn sie mindestens so viel langsamer sein kannerst ab
use[{robot, point, use, override}]–ändert Vorschläge: use true / false (angekreuzt für den Kontrolllauf), override 1..100 [%]; robot und point genau wie in proposals einer Antwort ohne anonymize (echter Robotername, nicht R1..Rn) Tabelle: Nutzen (ankreuzen), Override [%] (Doppelklick)
exportDatei .pdf / .html / .csv–Bericht der Vorschläge und des letzten Tests; CSV: robot;point;motion_s;wait_after_s;wait_kind;override_pct;new_motion_s;energy_rel;use (Semikolon, UTF-8); Antwort exportBericht speichern...
anonymizetrue / falsefalseRoboternamen R1..Rn (alphabetische Reihenfolge) in Antwort und BerichtRoboternamen als R1..Rn
windowtrue / falsefalseöffnet das Fenster TaktzeitreserveRegisterkarte Zeiten > Taktzeitreserve...

Antwort: share, minOverride, minGain, baseTakt [s] (Takt der Station im analysierten Lauf, -1 = keine Analyse), baseCycles {Roboter: Takt [s]}, testPending (der nächste Stationslauf ist der Kontrolllauf), proposals [{robot, point, motion [s], waitAfter [s], waitKind (il = Verriegelungsbereich, warte = WARTE BIS, fs = Warte auf Folgenstart, end = Ende des Takts), override [%], newMotion [s], energy ((Override / 100)²), use}], energyIndicator (angekreuzte Bewegungen gegenüber jetzt, 1 = unverändert), lastTest {takt, baseTakt, difference, ok, robots [{robot, cycle, baseCycle}], unticked [{robot, point}] (nur wenn nicht ok)}, controllers (Text: für welche Steuerungen die Vorschläge gelten). ok = Takt des Kontrolllaufs ≤ baseTakt + max(0,1 s, 0,5 %).

Beispiel (anonymisierte Station): analyze → baseTakt 74,20 s, 5 Vorschläge; Kontrolllauf → "lastTest":{"takt":74.20,"baseTakt":74.20,"difference":0,"ok":true,...}.

template\RCS\AIAgent\rcs_api.ps1 '{"cmd":"cycle_reserve","action":"analyze","share":80,"minOverride":30,"minGain":5}'
template\RCS\AIAgent\rcs_api.ps1 '{"cmd":"cycle_reserve","use":[{"robot":"<Roboter>","point":"<Punkt aus proposals>","use":false}]}'
template\RCS\AIAgent\rcs_api.ps1 '{"cmd":"cycle_reserve","action":"test"}'
template\RCS\AIAgent\rcs_api.ps1 '{"cmd":"cycle_reserve","export":"C:\\temp\\cycle_reserve.pdf","anonymize":true}'

Jede Option des Fensters (UI-Befehle)

Neben den Befehlen oben ist jedes Bedienelement des Simulators erreichbar – auch in Dialogen, Meldungsfenstern, Einstellungen und Kontextmenüs – ohne Bildschirmfotos: die Antwort enthält die Elemente als Daten (Typ, Beschriftung, Pfad Registerkarte / Gruppe / Dock, Wert, Einträge, Zeilen von Tabellen und Bäumen). Die Liste aller Menüaktionen und Bedienelemente: Befehls-API - Referenz. Jedes Element hat eine Nummer (id), die gleich bleibt, solange es existiert; es kann auch über seine Beschriftung (+ window, path, type; first: true nimmt das erste von mehreren passenden Elementen), eine Menüaktion über action (Menüpfad). Das ist target in der Tabelle unten. Änderungen und Klicks werden direkt nach der Antwort ausgeführt, ein dadurch geöffneter Dialog blockiert die API nicht: er erscheint in ui_windows (modale zuerst) und status (modal, uiPending).

BefehlParameterWas er macht
ui_windowsalloffene Fenster des Simulators (Dialoge, Meldungsfenster mit Text, Menüs)
ui_listwindow, filter, hidden, labels, allBedienelemente der Fenster; hidden = auch auf nicht gezeigten Registerkarten; labels = auch Texte (QLabel); all = auch Fenster außerhalb des Simulators. Die 3D-Ansicht des Hauptfensters steht in der Liste als Element vom Typ view3d (objectName view3d, Beschriftung 3D view); ihre id ist das Ziel von ui_context und ui_key
ui_actionswindow, hiddenMenü- und Symbolleistenaktionen mit Pfad, z. B. Simulation > Simulation laden...
ui_getid | label | actionein Element mit allen Details (Tooltip, alle Listeneinträge)
ui_settarget, value, enter; dockHeight, dockWidth (px); scrollsetzt Kontrollkästchen, Text, Zahl, Listeneintrag, Schieberegler oder Registerkarte wie der Benutzer; scroll (ohne value) scrollt ein Textfeld oder eine Liste: "top", "bottom", eine Zahl 0..1 oder "find:Text" (erste Stelle des Textes oben – auch in schreibgeschützten Feldern wie dem Chat des KI-Agenten); dockHeight / dockWidth mit einem beliebigen Element in einem angedockten Fenster (z. B. die Schaltfläche Senden des KI-Agenten): setzt die Größe dieses Fensters wie das Ziehen am Rand; Antwort z. B. {"dock":"AI Agent","dockHeight":665,"dockWidth":1682,"ok":true}; Fehler, wenn das Element nicht in einem angedockten Fenster liegt oder das Fenster frei schwebt
ui_clicktarget | actionTaste, Menüaktion, Eintrag eines offenen Kontextmenüs
ui_view / ui_view_settarget, row ("0/2/1"), column; ui_view: maxRows (500), depth (32), expandedOnly; ui_view_set: check, value, select, add, expand, collapse, click, doubleClick, activate liest oder ändert Tabellen und Bäume (Programme in Arbeitsbereiche markieren, Programmregeln bearbeiten, Doppelklick auf ein Ergebnis)
ui_contexttarget, row, columnöffnet das Kontextmenü eines Elements oder einer Zeile; mit der id der 3D-Ansicht (Element view3d) das Kontextmenü der 3D-Ansicht, wie ein Rechtsklick in der Ansicht (Fit All, weißer Hintergrund, Kollisionsstellen, Größe des Koordinatensystems, Hide / View Only / View All, Bahnen, Punktbeschriftungen, Koordinatensysteme der Punkte, Display, Objekttypen) – die Einträge dann mit ui_click
ui_close / ui_keywindow, accept / keys, textschließt ein Fenster, sendet Tasten; mit der id der 3D-Ansicht die Tasten der Ansicht (Qt3D-Viewer): F Fit All, S Auswahl einpassen, 0 / Pos1 (Home) Standardansicht, 1..6 Normansichten, Pfeiltasten drehen um 15° (mit Umschalt: verschieben), + / - und Bild↑ / Bild↓ (PgUp / PgDn) Zoom, Esc beendet eine erzwungene Operation oder hebt die Auswahl auf; keine Taste für die Perspektive (nur Menü View oder view perspective) und kein W. Im Komponentenbaum eingegebene Tasten bewegen die Ansicht nicht. Hinweis: in der Variante mit dem JT-Leser ändert ui_key auf view3d die Ansicht nicht (Black-Box-Test 2026-10-25)
ui_fileanswer, answers, clearAntworten für die nächsten Dateidialoge (der Dialog wird nicht gezeigt); leer = Abbrechen. Nur direkt vor dem Befehl geben, der den Dateidialog öffnet (z. B. ui_click auf einen Menüpunkt). Ein Befehl, der Datei oder Ordner aus seinen Parametern nimmt (file, folder: package_save, report, export, save, load, ...), öffnet keinen Dateidialog; seit 2026-10-25 werden die nach einem solchen Befehl noch wartenden Antworten verworfen (Antwort uiFileDiscarded: Anzahl, Warnung in der Konsole) – vorher blieben sie in der Warteschlange (pending) und beantworteten einen späteren, fremden Dateidialog
ui_shottarget, file, parentBild eines Fensters oder Elements (nur wenn ein Mensch es sehen soll); parent: n Ebenen über dem Element (eine Gruppe oder der ganze Inhalt eines gescrollten Reiters, auch der Teil außerhalb des sichtbaren Bereichs)
settings_get / settings_setfilter / key, value, remove; group (Standard RCS_Group)Einstellungen des Simulators (RCS_Group), z. B. die im Hintergrund vorbereiteten Makros oder die Programmregeln
template\RCS\AIAgent\rcs_api.ps1 '{"cmd":"ui_click","action":"Einstellungen > Konfigurieren..."}'
template\RCS\AIAgent\rcs_api.ps1 '{"cmd":"ui_set","label":"Im Hintergrund vorbereitete Makros","value":"20, 45, 46, 47, 50, 57"}'
template\RCS\AIAgent\rcs_api.ps1 '{"cmd":"ui_click","window":"Einstellungen","label":"OK"}'
template\RCS\AIAgent\rcs_api.ps1 '{"cmd":"ui_file","answer":"C:/cells/station_folge81.xml"}'
template\RCS\AIAgent\rcs_api.ps1 '{"cmd":"ui_click","action":"Simulation > Simulation laden..."}'

Simulator ohne Klick starten (Editor-API)

Wenn Settings > AI Agent > Command API of the editor (Einstellungen des Editors) eingeschaltet ist (oder mit DRES_API=1), empfängt DReS selbst Befehle über \\.\pipe\DReS_API (Client AIAgent\dres_api.ps1): license zeigt, ob die Lizenzprüfung läuft, ob das erste Lesen des Schlüssels abgeschlossen ist (ready) und welche Lizenzen verfügbar sind; mit "details": true außerdem jede Lizenz mit Typ und Gültigkeit, den Schlüssel und die Wissenspakete der KI-Agenten (Felder: Editor-API, Fenster: Help > License info); plugins listet die Plugins der Menüs; run_plugin {name, wait} öffnet ein Plugin, sobald der Lizenzschlüssel gelesen ist (wait = Sekunden Warten auf die Lizenz) und der Editor nicht beschäftigt ist – solange der Editor nach dem Start die Sitzung wiederherstellt oder viele Dateien öffnet (Open all der zuletzt geöffneten Dateien), wird der Start des Plugins verschoben und die Antwort enthält das Feld waitingFor (was der Editor gerade tut); open {file, line} öffnet eine Datei; status zeigt die aktive Datei, einen offenen Dialog und busy (true, solange der Editor die Sitzung wiederherstellt oder Dateien öffnet; dann sagt busyReason, was er tut; currentSession und, während eine Sitzung wiederhergestellt wird, session – siehe session) – vor dem Laden einer Station im Simulator status abfragen, bis busy false ist, statt eine feste Zeit zu warten (solange der Editor beschäftigt ist, meldet load des Simulators, dass die Roboterkonfigurationen jetzt nicht gelesen werden; die Station dann erneut laden, wenn der Editor bereit ist); settings_get / settings_set lesen und ändern die Einstellungen des Editors und der Plugins, z. B. RCS_Group/Automation_Api = true vor run_plugin, damit der Agent die API des Simulators selbst einschaltet.

plugin_cmd {plugin, command, ...} ruft einen API-Befehl eines Plugins des Editors auf; die übrigen Felder sind die Parameter des Befehls. Heute: Robot Cell Simulator Lite mit den Befehlen lite_open, lite_archive, lite_calculate, lite_status, lite_matrix, lite_check, lite_report und lite_image (Parameter und Ergebnisse: Robot Cell Simulator Lite - API). Das Plugin benötigt seine eigene Lizenz (Lite: Robot Cell Simulator basic, 140) und die Lizenz API / CLI (248).

Settings > Configure > AI Agent, Registerkarte Command API (lokaler Pfad verdeckt)
AIAgent\dres_api.ps1 '{"cmd":"license"}'
AIAgent\dres_api.ps1 '{"cmd":"license","details":true}'
AIAgent\dres_api.ps1 '{"cmd":"settings_set","key":"RCS_Group/Automation_Api","value":true}'
AIAgent\dres_api.ps1 '{"cmd":"run_plugin","name":"Robot Cell Simulator"}'
AIAgent\dres_api.ps1 '{"cmd":"plugin_cmd","plugin":"Robot Cell Simulator Lite","command":"lite_status"}'
AIAgent\dres_api.ps1 -StartNewSession -SessionName "Station 010"

-StartNewSession [-SessionName "Name"] startet den Editor mit einer neuen leeren Sitzung (ohne Namen oder mit dem angegebenen Namen) statt der letzten und wartet, bis er bereit ist – Details: session.

Der KI-Agent VeRa (Sprachsteuerung, MCP-Server für Claude Code) nutzt diese APIs: VeRa - KI-Agent und Sprachsteuerung.

Client-Skript

template\RCS\AIAgent\rcs_api.ps1 (PowerShell) sendet einen Befehl und gibt die Antwort aus; -WaitIdle wartet, bis der Simulator frei ist (kein Laden, keine Vorbereitung, keine Simulation).

template\RCS\AIAgent\rcs_api.ps1 '{"cmd":"status"}'
template\RCS\AIAgent\rcs_api.ps1 '{"cmd":"load","file":"C:/cells/station_folge81.xml","newScene":true}' -WaitIdle
template\RCS\AIAgent\rcs_api.ps1 '{"cmd":"fast_run","program":"folge125"}' -WaitIdle
template\RCS\AIAgent\rcs_api.ps1 '{"cmd":"run","folge":81,"loops":10,"speed":400,"sps":true}' -WaitIdle -TimeoutSec 900
template\RCS\AIAgent\rcs_api.ps1 '{"cmd":"run","up":42,"loops":1,"sps":false}' -WaitIdle
template\RCS\AIAgent\rcs_api.ps1 '{"cmd":"sim_action","action":"pause"}'
template\RCS\AIAgent\rcs_api.ps1 '{"cmd":"report","file":"C:/reports/variante_c.html","pdf":true,"compareFile":"C:/reports/original.rcsrun.json"}'
template\RCS\AIAgent\rcs_api.ps1 '{"cmd":"zones","programs":["folge81"]}'
template\RCS\AIAgent\rcs_api.ps1 '{"cmd":"check_interlocks"}'

Beispiel: Variante einer Station

Originalstation laden, Folge 81 zehnmal mit dem SPS-Programm der Station fahren, Bericht speichern; die geänderte Kopie der Programme laden, gleich fahren und einen Bericht mit Vergleich zum Original speichern (compareFile = die .rcsrun.json des ersten Berichts). Dieselbe Folge für mehrere Varianten ergibt eine Tabelle der Taktzeiten ohne einen einzigen Klick. Die Simulationsgeschwindigkeit ändert die gemessenen Zeiten nicht (400 % ergibt dieselben Taktzeiten wie 100 %).

Die Daten des Laufs (run_data) enthalten die Taktzeit der Station, den Roboter, der sie bestimmt, das Warten auf Verriegelungen je Roboter und Punkt (zoneWaits), wie lange jeder Bereich gehalten wird (zoneHolds) und wer im ersten Zyklus seit wann einen Bereich hält (firstCycleWaits), Warteketten (waitChains: der Partner, der den Bereich hält, wartet selbst auf einen anderen Bereich oder eine Bedingung) und fast gleichzeitige Anforderungen desselben Bereichs (requestRaces mit minDt / maxDt, Zeitfenster raceWindow, Vorrangregeln raceRules und ihre Anwendung raceRuleLog, Regeln aus Wettläufen raceAutoRules) – genug, um den Engpass und den Roboter, auf den er wartet, zu finden. Nach einem Lauf liefert check_interlocks auch die Codes CHAIN und RACE sowie LONG als Warnung, wenn ein Partner auf den Bereich gewartet hat.


« VeRa - KI-Agent und Sprachsteuerung | Inhalt | Befehls-API - Referenz »