Robot Cell Simulator – Command API
« VeRa - AI agent and voice control | Contents | Command API - reference »
Switching onCommandssim_optionsrobust_testUI commandsUI commands – reference »Editor APIClient scriptExample

The Robot Cell Simulator can be controlled by commands from outside – the same steps as in the window (load a simulation, run, report, work zones, check interlocks), without dialogs. Use it for nightly regression tests of a station, for comparing variants of programs by a script and for an AI agent that runs the studies.

Switching on

The API is off by default. It is switched on in the settings of the simulator (Settings > Configure..., tab AI Agent: Command API of the Robot Cell Simulator for the AI agent and scripts) or by the environment variable DRES_RCS_API=1 when DReS starts. The same tab shows the path of the client script (default template\RCS\AIAgent\rcs_api.ps1 in the installation directory). It starts when the window of the Robot Cell Simulator is opened (Plugins > Robot Cell Simulator); the console shows Command API of the Robot Cell Simulator listening on \\.\pipe\DReS_RCS_API. Only the user who started DReS can connect (local pipe, no network).

License: the command APIs of the editor and of the Robot Cell Simulator need the additional license API / CLI (control of DReS and the simulator by other programs, scripts and AI agents). Without it only reading commands work (e.g. status, run_data, view, robust_test with status / risks, ui_list, ui_shot, scene_shot, recent_files), the other commands answer with an error about the missing license, and the settings of the command APIs are locked. The voice control VeRa needs this license too.

Commands

One JSON object per line in both directions, e.g. {"cmd":"status"}. Every answer contains "ok": true / false and "error" when the command failed. While a command runs, message boxes are not shown – the default answer is used and the message is written to the console. Since 2026-10-25 this also applies to what comes later: a run, a robustness test or a simulation of both orders started (or stopped) through the API ends without windows (Simulation finished, Collision risk in the simulation, Request races, Request race found, the result of the simulation of both orders) – their text is in the console and in status.lastRunMessages (also in the answers of report / run_data); a simulation file loaded through the API (load, open, package_open) does not open the window Load simulation – Not restored (list in status.lastLoadMissing and the console), and errors of the opening (unknown format, a study that cannot be extracted) are only in the console. Only the pause at a collision risk (option Stop the simulation at a collision risk) still opens its window with Continue; continue with {"cmd":"sim_action","action":"resume"}. A missing license during a command or while DReS is closed is only a message in the console.

Client script and time limit: since 2026-10-25 rcs_api.ps1 (and the voice assistant VeRa) writes the command with a time limit and without waiting until the program has read it – when DReS is busy or not answering, the script ends with an error instead of waiting without end.

Closing DReS through a script: when DReS or the window of the simulator is closed while a file is loaded (load, open, package_open, extraction of a package, conversion of JT models, work zones), the closing waits until the load is finished (the console shows Loading / calculation is in progress - DReS is closed when it is finished); the extraction of a package and the work zones are cancelled, loads not started yet are skipped (status.lastLoadError: cancelled - the program is being closed).

Flag "anon": true (any command): the names are translated – R1, R2 …, <file N> and <name> in the command are replaced by the real robot names and file paths before the command runs, and in the answer the robot names, file paths and plant identifiers are replaced by these identifiers. Used by the AI Agent window in the anonymous mode and its MCP server (environment DRES_AI_ANON=1); e.g. {"cmd":"robot","robot":"R2","goto":"UP42/P5","anon":true}.

CommandParametersWhat it does
pingname of the plugin
statusloading (simulation file), preparing (programs parsed in the background), running, loop / loops, robots, speed, SPS, last errors (lastRunError, lastLoadMissing, robotNameWarnings), measuredCycles, uiPending (UI commands not executed yet) and modal (title of an open modal window); simTime (clock of the simulation, s), robustTest (a robustness test runs), waitTimes (number of the WARTE ZEIT commands in the robot programs, details with wait_times); during a run also elapsedSeconds (real time since the start of the run), simSeconds (simulation time of the run), effectiveSpeed (% = simulation time / real time, with the waiting for the Live 3D check), loopSeconds (real time of one loop, from the 2nd loop), remainingSeconds and estimatedEnd (until the end of all loops; missing in the 1st loop) and robotsProgress (robot, running, loop, loops); since 2026-10-25 ready (window of the simulator built and shown – commands sent earlier wait up to 60 s, then answer notReady), converting (JT models are converted now – changing commands answer an error until it ends) and modelConversion (result of the last load: converted, reused, failed, skipped, seconds, cancelled, noConverter, models [{jt, glb, state, seconds, triangles, error}]); fps (frames of the 3D view drawn per second – the view draws on request, so without changes of the scene there are few frames) and viewSyncMs (mean time of the GUI thread per frame for taking the changes of the scene into the view, ms); both -1 when the build does not measure them (variant with the JT reader); the same values are shown by the OSD statistics of the view (Settings: OSD). Since 2026-10-25 also glRenderer (graphics card of the 3D view: renderer / vendor / OpenGL version – the same text the console shows once as 3D view: graphics card ...) and paintFps (paintings of the widgets of the 3D view per second since the previous status; it works also in the variant with the JT reader, where fps is -1; in the variant without the JT reader (Qt3D view) fps is the value that counts). Since 2026-10-26 also the object memory (privateMB = committed private memory of the program, workingSetMB, peakWorkingSetMB, peakPagefileMB; see memory_trim). modelConversion starts again with every load, open and package_open: mode ("auto" | "ask" | "never" – the mode of this load); with "never" the JT models are listed with state "jt" (loaded directly); after a simulation package its models with state "package" and the number package. Also lastLoadError (error of the last load / open / package_open after its answer started, empty = none; also in the console) and extracting (a simulation package is extracted now, with a progress window). loading is true from the answer started until the file is loaded; since 2026-10-25 it is true during the whole opening of a file – also an opening from the menu / File > Wizard – until the message Opening finished; in this time changing commands answer the error A file is being loaded (as with load through the API). ready is unchanged (window of the simulator built). In modelConversion.models the state failed with error is also given for a JT file the converter cannot read and that is skipped without a new try. simTime stops at the end of a run (all robots finished or stop) and starts from 0 with the next run; since 2026-10-25 it also stands from the opening of the simulator until the first run (before it grew by about 1 s per second without any simulation). lastRunMessages (since 2026-10-25): the texts of the windows that a run started or stopped through the API does not open (Simulation finished, COLLISION RISK: ..., request races, result of the simulation of both orders); empty again with the next run started through the API
loadfile, newScene (true), convertloads a simulation file (.xml) or a simulation package (.rcsz) with everything it contains (like the default choice of Load simulation); asynchronous – wait until status is idle. Like open, missing paths of the study do not open the window Paths not set: the console shows the warning Paths not set: ... and the simulation is loaded anyway. convert (since 2026-10-25): "auto" | "ask" (in the API like "auto", no windows) | "never" – the JT tool models as converted glTF models; without it the setting JT models: use converted glTF models; result in status.modelConversion. Since 2026-10-25 the answer started, file comes at once (before: after the whole load, 12–34 s, the window did not respond); the file is loaded in the next cycle of the event loop. A missing file is an error at once; other errors of the load are in status.lastLoadError and the console. While the file is loaded, changing commands answer an error (A file is being loaded); reading commands and the ui_* commands work
openfile, systemRoot, robotArchives, convert, objectsopens a file like File > Open file, without dialogs: a Process Simulate study (.psz or StandaloneStudy*.xml), a JT model (.jt) or a session of the simulator (.rcsession). systemRoot (system root of the study: library, macros) and robotArchives (folder of the robot archives) are optional and are stored like the paths of File > Wizard (they stay for the next opening). Missing paths do not open the window Paths not set: the console shows the warning Paths not set: ... and the file is opened anyway. objects (since 2026-10-25): "all" (all objects of the study, like Select all in the window Available objects) or the path of a selection file .ini (saved with the button Save of this window, like its button Open); without it the remembered selection (Remember selected items; without that no object). Refused while a simulation runs. Answer at once: started, file, systemRoot, robotArchives (the paths used now), objects when given; the file is loaded in the background – wait with status until loading / preparing are false, the console then shows Opening finished after mm:ss. A study without its library (System Root not set) has no 3D models and no robots - then the robots are inserted from their archives at the study positions (as insert_study_robots, message in the console); wait until robots in status is the number of robots. Example: {"cmd":"open","file":"D:/studies/cell_A/StandaloneStudy.xml","systemRoot":"D:/studies/sysroot","robotArchives":"D:/studies/archives","convert":"auto","objects":"all"}. Also a simulation package .rcsz. convert as for load (components of the study and tools on the robots; in the variant without the JT reader also the robots and the components with a mechanism). An unknown file type is an error at once; a file that could not be opened: status.lastLoadError
insert_study_robotsfile, convertlike File > Insert robots at study positions without dialogs: inserts the robots of a Process Simulate study (file, .psz or StandaloneStudy*.xml) at their positions in the study into the current scene; answer inserted (number of robots) and report (text of the report: robots, archives, problems); errors: no scene yet (Create a scene first – open a cell first or File > New scene), the study cannot be read, no robots in the study, a simulation runs, e.g. {"cmd":"insert_study_robots","file":"D:/studies/cell_A/StandaloneStudy.xml"}; after the insert the base check runs automatically (result in the console)
base_checktolMm (default 2), tolDeg (default 0.2), study, last (true / false), console (default true), project, place, customer, team, station, comment, report (.pdf or .html), view (true / false), apply (default false), robots (default [] = all robots outside the tolerance, ["*"] = all), saveStudy (default <study>_calibrated.xml), overwrite (default false), reload (default true)like Tools > Check bases against the study... (description): compares the bases of the study (frames b1, b2 ... / Fanuc uf1, uf2 ... at ir_<robot>, nominal values) with the bases of the robot archives ($BASE_DATA[n] also #TCP / Fanuc UF[n], measured values). tolMm / tolDeg are saved like the fields of the window; study = another study than the one the robots were inserted from; last: true = only the last result without a new check; console: false = no lines in the console; the report fields are saved like the fields of the window; report saves the report (PDF or HTML by the extension), view with the 3D view (default: the check box of the window). Answer: study, tolMm, tolDeg, bases [{robot, base, kind (base / externalTcp / userFrame), dPosMm, dXyzMm [x, y, z] in the robot coordinates, dRotDeg, worldStudy, worldArchive [x, y, z], studyFrame, archiveFrame [x, y, z, a, b, c], ok}], groups (common bases of the station) [{studyWorld, robots [{robot, base}], spreadMm, between [robot, robot], ok}], deviations (number of bases outside the tolerance), time, robotsNotInScene, reportFile. The archive bases are taken relative to $WORLD of the robot (Global * ROBROOT(0)-1), as the program paths. Calculated robot positions: calibration [{robot, externalId, supported, reason (e.g. robot on a linear unit), basesUsed, basesRejected, shiftMm, shiftXyzMm [x, y, z] in the world, rotationDeg, oldWorld, newWorld, residualMm, residualDeg, needed (outside the tolerance), matrix}]. apply: true writes the calculated positions of robots like the button Apply to the selected robots: to saveStudy (default the copy <study>_calibrated.xml), overwrite: true = the study itself (backup copy .bak_<date>_<time>), reload: true = simulation saved next to the copy as <copy>_simulation.xml and loaded again; answer field apply {applied, study, backup, simulation, reloadError, stationFramesKept, skipped}. Station base frames attached to the robot stay in the world, the copy is for the Robot Cell Simulator, not for an import into Process Simulate. Errors: no study, the study has no base frames, the report cannot be written, a simulation runs, no calculated positions, no robot to correct. Examples: {"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 (default the study of the robot positions), tolMm (default 2), tolDeg (default 5), robots (default [] = all), anonymize (default false), axisCorner (coordinate system of the world on the map: auto | top-left | top-right | bottom-left | bottom-right | center | none, default as in the window = auto), maxItems (default 500), report (.pdf, .html or .csv), view (default true), last (default false)like Tools > Weld point report... (description), license RCS 140: spot weld points of the programs of the robots (SERVOZANGE / TECH EZ, SP, VW_USER EZSP; VW point numbers below 100 = service points, skipped) compared with the weld points of the study (PmWeldLocationOperation projectedLocation, PmWeldPoint sheet thickness) after a robust fit per robot / base / tool. tolMm, tolDeg, anonymize default to the values of the window (anonymize: robot names as R1, R2 ...); maxItems: largest number of rows in the answer (rowsTruncated: true when more); last: true = only the last result (without rows) or a report of it; report saves the report (by the extension), view with the 3D view. Answer: points, programs, robots, matched, withinTolerance, unnamed, studyWeldPoints, studyOperations, fits [{robot, base, tool, points, fitted, fitMode, used, shiftMm, rotationDeg, toolAxis, frameDiffers (rotation > 10 deg: program frame rotated against the study), noFit (no fit possible: frames differ, too few matching points)}], rows [{robot, program, order, point, line, name, base, tool, gun, weldProgram, pointNumber, inStudy, ok, dXyzRawMm, dRawMm, dMm, angleDeg, angleRawDeg, thickness, studyProgram, file, nameFromPointNumber (no name above the point, matched by the point number of the OLP commands of the study, unique numbers only), noFit (no deviation numbers)}] (dRawMm before, dMm after the fit), notInPrograms (weld points of the study not found in the programs), time, reportFile. Errors: no license, no robots in the scene, no spot weld points in the programs, no report yet (last). Example: {"cmd":"weld_report","tolMm":2,"tolDeg":5,"anonymize":true,"report":"D:/reports/weld_points.pdf"}
recent_files–reading, no license needed: {"ok":true,"simulations":[...],"studies":[...],"current":"<Simulation_File>"} – simulations: the last 15 loaded simulation files (also loaded through the API), newest first, only existing files (menu Simulation > Recent simulations); studies: the recent studies (File > Recent files); current: the simulation file loaded now. Load one of them with load – the AI agent takes a file the user names from here, it does not search the disk
setspeed, folge, up, loops, spsvalues of the Simulation tab (not while the simulation runs); up: N selects UP N instead of a Folge; answer (also without keys = only read): programType ("folge" | "up"), number, loops, sps – the current values of the tab (the AI agent reads the Folge of the station this way). sps is applied first, then folge / up / loops (since 2026-10-25; before, "sps":false together with loops restored the previous number of loops, e.g. 30 → 3)
fast_runprogram ("folge125" or "up42"), loopslike the Fast Run buttons, always without the SPS
runfolge or up, loops, speed, spsRun on all robots; up: N runs UP N instead of a Folge; with the SPS on the command answers the error Not started: ... (fields spsFolge = the Folgen of the SPS program, spsCycles; the answer also has sps true) when folge / loops differ from the SPS program (as before) or when the number in the Program field differs from the Folge of the SPS program – also without folge, e.g. after an earlier set; the error has the text of the question of the button Run on all robots (without Continue / Cancel); run again with the Folge of the SPS program or "sps":false; asynchronous. Missing work zones are calculated first. sps before loops / folge as in set. The end of the run opens no windows (since 2026-10-25) – texts in status.lastRunMessages, the risks in run_data (collisionCheck, areaConflicts)
stopstops all robots; the end of a run stopped through the API opens no windows, also when the run was started in the GUI (since 2026-10-25)
sim_optionswithout keys: read; keys: see belowoptions of the Simulation tab like in the GUI; locked while the simulation runs (error). Answer: all values and locked
sim_actionaction: "pause", "resume", "quitt", "check_interlock_map"Pause / Resume of the clock of the station, Continue (Quitt), Check interlock map (the table opens in a window, read it with the ui_* commands)
live_checkon, cell, capsule, range, warn, contact, stopNear, ignoreStartContacts, thread, parallel, grid, stepMs; export, format, anonymize, exportCsv, window, showLive 3D collision check (works from the next start); contact (0..50 mm, default 5) – closest points at most this far apart = collision (case key 3D|...), farther with a common cell or below warn (default 30 mm, 0 = off) = proximity (key 3Dnear|..., warning, no pause); answer: the values and closest – the closest approach of every pair: robot, where, part, partner, partnerWhere, partnerPart, distance, t, rangeMm, joints, partnerJoints – and stats of the last run (checks, checkMsP50 / P95, gapAvgS / gapMaxS, nearMoveMaxMm / nearMoveP95Mm, clockWaitS, recommendedStepMs, maxSpeedWithoutWait). Since 2026-10-30: stopNear (true / false) – pause also at a proximity below warn; in closest also contacts (checks with contact) and, for pairs in contact, overlap (largest overlap of the models, mm), overlapT, overlapWhere, overlapPartnerWhere; distance -1 = only common cells, not measured. Closest approaches: export (file) with format pdf / html / csv (default: from the extension) and anonymize (robots R1..Rn), exportCsv (file, CSV), window (true – open the window). stopNear pauses once per approach of a pair (again after the models moved apart by more than warn + one cell). ignoreStartContacts (true / false, default true) – pairs whose models overlap already at the first check (start position) are not a collision until they are apart; in closest such a pair has startContact true and startOverlap (mm); every pair has point [x, y, z] (middle of the closest points). show: {robot, partner, what: 3d | robot | partner} – like a double click in the window: 3d = both robots to the moment of the closest approach and the 3D view to the place (simulation paused or stopped), robot / partner = program in the editor at the point. overlap is an approximation from the grid of the check (extent of the common cells, accuracy one cell), not the depth of a solid. License Collision 3D: without it stopNear / ignoreStartContacts / export / window / show answer "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} or false); zoom (factor 0.01..100), target ([x, y, z] mm), signalLabelSize (30..300 %, 100 = default), collisionPlaceColor3D, collisionPlaceColorZone, collisionPlaceColorProximity ("#rrggbb"), orbit ([yawDeg, pitchDeg])also the context menu of the 3D view: point labels, show / hide the paths of the tab Programs, size of the coordinate system, the path of one Folge / UP for all robots (false = hide it); pointFrames like Show point frames (since 2026-10-25, off by default, kept in the settings): a coordinate frame (X red, Y green, Z blue, 100 mm) at every point of every shown program path in the orientation of the point, nothing without a shown path; the answer always contains pointFrames; programPaths like Show paths / Hide all paths: since 2026-10-25 true shows the path and the points of the program of every robot – during and after a run the program of the run (with the called UPs), without a run the program selected for the robot (before: only the program selected in the tree of the current robot); when all robots have the same program (e.g. Folge 81) the set is saved in the simulation file like allRobotsPath (Show Folge path for all robots); false = hide all paths (unchanged); standardView like Navigation > Standard View; switches of the menu View (and white background, Fit All / View All): names of the robots on the floor, labels over the robots, axes, perspective, recorded path, null point, grid, consoles and linear units, TCP of the tool in the simulation (simulationTcp: since 2026-10-25 only the TCP frame of the tool, from the axis values of the drawn model; the former frame of the program point / target is removed); collisionPlaces like View > Show the places of collisions (spheres in the scene: red = contact of the 3D models of the Live 3D check, yellow = proximity of the 3D models without contact, violet = collision risk from the work zones, label with the robots and the time; they stay until the next run, see Places of collisions); collisionPlaceLabels like View > Show the labels of the collision places (false = only the spheres, without the texts above them; kept in the settings, default true); collisionPlaceColor3D / collisionPlaceColorZone / collisionPlaceColorProximity like View > Colors of the collision places... (color of the spheres as "#rrggbb": 3D contact, default #ff0000; work zones, default #e000e0; 3D proximity, default #ffc000; the answer always contains all three colors); signalLabelSize like View > Signal label size... (size of the signal descriptions along the lines of the interlock / collision map, the answer contains signalLabelSize); without keys: read (also without the license API / CLI); zoom: > 1 closer, < 1 farther (like the mouse wheel), target: the center of the view in mm (like panning) – to frame a region of the cell; orbit [yawDeg, pitchDeg] (since 2026-10-26) rotates the camera around its target relative to the current view – yaw about the vertical scene axis Z, pitch about the horizontal camera axis – like a mouse drag with the rotate button (the answer contains the camera as usual; for the mouse drag itself see view_drag). Order of the camera keys in one command: first standardView, then fitAll / viewAll, then target and zoom (so {"standardView":"default","target":p,"zoom":6} keeps the target; before 2026-10-25 standardView came last and fitted the view to the whole scene). Answer: the state of every switch and always camera {"target":[x,y,z],"scale":s,"distance":d} after all changes of the command: target [mm] the center of the view, scale the height of the view at the target [mm], distance = scale / (2·tan 22.5°) the distance of the camera in the perspective (angle of view 45°; in the orthographic view without effect on the image), e.g. {"cmd":"view","target":[2500,-1200,800],"zoom":2}. The 3D view is also a control of the UI commands (type view3d, see below)
scene_shotfile (path of the PNG file)image of the 3D scene only (OpenGL, with the labels and decorations, like the scene image in the reports) as a PNG file; reading, no license needed (like ui_shot). Answer: {"ok":true,"file":"...","bytes":n}; error 3D view not ready or cannot write. Frame the region first with view (standardView, target, zoom)
view_dragfrom, to ([x, y], fraction 0..1 of the view window), steps (default 60, 2..5000), intervalMs (default 16), button ("left" = rotate | "middle" | "right"), ctrl, shiftinjects a mouse drag into the 3D view window (since 2026-10-26; only the variant without the JT reader), the same mouse events as from the user – for measuring the smoothness of rotating and panning. Answer: {"events":n,"pressMs":..,"moveMsAvg":..,"moveMsMax":..,"releaseMs":..,"wallMs":..} (time of handling of the mouse events in the program, in ms). Error: 3D view window not found, or from, to missing. GUI: the same drag with the mouse in the 3D view
memory_trimreturns the heap memory to the system (_heapmin, HeapCompact, trim of the working set); diagnostic command for memory tests (e.g. memory after a new scene). Answer: {before, after, heaps, heapWalk} – before / after are the same objects as memory in status; heapWalk lists per process heap busyMB, freeMB (free bytes inside the heap segments = fragmentation), committedRegionsMB, blocks, largestFreeMB and histogram (live blocks by size: <64 B, <256 B, <1 KB, <4 KB, <64 KB, <1 MB, ≥1 MB as [count, MB]). Reading
reportfile, html, pdf, xlsx, shot, ganttAll, ganttRange, rangeFrom, rangeTo, ganttPrAct, compareFile report of the times like Report...; always also the data of the run *.rcsrun.json; the API never opens the report in a browser
signal_timelinefrom, to, signals, select, add, remove, record, why + robot, showAt, export, anonymize, window, dataSignals timeline of the last station run (license Simulation). from / to [s] – time window (default the whole run); signals ["robot|E80", ...] – only these (default the selection; empty selection = all signals that changed); select – new selection, add / remove – change it (saved in the simulation file); record – record in every station run; why (time [s]) with robot – text why the robot waits there; showAt (time [s]) – robots in 3D at that time (simulation paused or stopped); export .csv / .pdf / .html (+ anonymize R1..Rn); window true – window; data false – only the summary. Answer: duration, recording, samples, robots [{robot, states [{t0, t1, state, where}]}], signals [{robot, signal, at_from, changes [[t, value], ...]}], available, selection, record, why. Without changes reading (also without the license API / CLI). All parameters with defaults: below.
cycle_reserveaction (status, analyze, test, cancel, clear), share, minOverride, minGain, use, export, anonymize, windowCycle time reserve (license 146 Motion optimization): analyze – motions after which the robot waits anyway in the last station run and the proposed override; test – the next station run drives the used motions with this override (programs unchanged), then the cycle time is compared (lastTest: takt, baseTakt, difference, ok, robots, unticked – proposals of robots that became slower than the takt, unticked automatically); cancel / clear; share / minOverride / minGain [%] – the fields of the window; use [{robot, point, use, override}] – change a proposal; export .pdf / .html / .csv. Answer: proposals [{robot, point, motion, waitAfter, waitKind (il / warte / fs / end), override, newMotion, energy, use}], baseTakt, baseCycles, energyIndicator, testPending, lastTest, controllers. status without changes is reading. All parameters with defaults: below.
report_openopen (true / false)option Open a saved report (HTML, PDF) in the default program (Plugin settings > Simulation, default on) for the times report, the Robustness test report and the collision risk report; off = the files are only saved – recommended when an AI agent or a script makes the reports. Without open: read (also without the license API / CLI); setting needs the license API / CLI. Answer: {"ok":true,"open":false}
model_converterpath (string, "" = automatic)option Model converter (JT to glTF) (Plugin settings > Simulation): path of modelconv.exe, an independent program (GNU GPL v3) that converts files in the JT™ data format into glTF 2.0. path "" = automatic (<program folder>/RuntimeTools/modelconv/modelconv.exe, set by itself when the installer installed the converter). Without path: read. Answer: {"ok":true,"path":"...","default":"...","found":true} – path empty = no converter, default = the automatic path, found = the converter file exists. The simulator uses it at the load (model_cache). Needs the license API / CLI. JT is a trademark of Siemens Industry Software Inc.
model_cacheconvert, mode, folder, estimate, file(since 2026-10-25) JT models as glTF: convert "auto" | "ask" | "never" (setting JT models: use converted glTF models), mode "nextToJt" | "folder" and folder ("" = %LOCALAPPDATA%/DrAmaT/RCS/Models; setting Save converted models); without them: read (also without the license API / CLI). estimate with file (simulation file, Process Simulate study .xml or a .jt file): the JT models that a load would convert – nothing is converted. Answer: convert, mode, folder, defaultFolder, secondsPerMB (seconds per MB of one modelconv process), secondsPerFile (overhead per file), parallel (processes at the same time) – both factors learn from the last conversions on this computer –, kinematicModels (true = robots and mechanisms also from glTF: variant without the JT reader), converter, lastConversion, fileType and estimate {toConvert, reused, megabytes, seconds, models, convertedModels, unreadable [{jt, error}], text}; for a Process Simulate study (.xml) next to estimate (tools on the robots) also estimateAll (same fields: all components of the study with a 3D model, as File > Open with all objects), e.g. {"cmd":"model_cache","estimate":true,"file":"D:/sim/sim_jt.xml"}
package_savefile, includeRobotData (true), includeSource (true), dryRun (false)(since 2026-10-25) like File > Save simulation package (*.rcsz)...: one self-contained ZIP file with the simulation, the SPS program, the loaded cell components and the tools of the robots as converted models (.glb) with their positions and the robot data needed for the simulation; the study file is never included (includeStudy is ignored). includeSource (default true) also stores the original model files as source only; false makes the package smaller. A package that would point to a file outside of it is refused with the list of the paths. dryRun: true writes nothing and returns estimatedSize {glb, source, robots, total} in MB (uncompressed). Answer: the manifest without the file list (robots with their files, models, notIncluded), file, bytes, megabytes, fileCount
package_openfile, convert(since 2026-10-25) like File > Open simulation package...: extracts the package (once per file, to %LOCALAPPDATA%/DrAmaT/RCS/Packages) and loads its simulation in a new scene like load; answer started, simulation (file in the package folder), folder; then wait with status. The answer comes at once; the package is extracted in a worker thread with the progress window Open simulation package (Cancel stops it; status.extracting is true, status.modal shows the window), then the simulation is loaded. Errors after the answer: status.lastLoadError
run_datafile (optional)the data of the run (as in *.rcsrun.json) in the answer; the run file also has the array waitTimes (the WARTE ZEIT commands, as in wait_times) for a later comparison; robots[].zeitPerCycle = the time of the active WARTE ZEIT commands per cycle of the robot in s (shown in its own colour in the Gantt chart); collisionCheck.conflicts[] has (since 2026-10-25) kind – zone (risk from the work zones), 3d (collision = contact of the 3D models), near (3D proximity without contact) – and for 3D cases distance (closest points, mm), cells and parts
wait_timesrobot (optional, part of the robot name)reading, no license needed (like status), also while the simulation runs: every WARTE ZEIT of the robot programs – waitTimes [{robot, program, point, command, seconds, condition, line}], count, secondsTotal, note; e.g. {"cmd":"wait_times","robot":"R03"}
zonesprograms (["folge81", ...]), mode ("cubes" | "triangles"), grid (mm, a value of the list: 50, 100, 150, 200, 300), radius (mm), withTool, withSubprograms (true / false), calculate (true), clear (false)Work Zones: checks these programs of all robots and calculates the zones; mode, grid, radius, withTool, withSubprograms like the fields of the group Calculation; calculate: false only sets the fields, clear: true removes the zones from the 3D view (button Clear). Answer: 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 (number of the UP)tab Auto-Docking: tool change at the docking points, the commands put down the tool (DS abdocken) and take the tool (DS andocken), max. distance of the tool from the flange, Detach all tools from all robots (without the question) / Attach default tools to all robots, run = Tool change on all robots with this UP; refused while a simulation runs; without keys: read
sps_programxml, file (.xml), newFromRobots (true), saveFile (.xml), open (true)SPS program of the station (tab SPS, SPS editor): sets it from XML or a file (file may also be a simulation file <RcsSimulation> – its element <Sps> is used; without it the error No SPS program in the file), newFromRobots like New from the robots of the cell (without the question), saveFile writes it, open opens the editor window like Edit SPS program... (while a simulation runs only to look at it: live states of the blocks, also the Interlock priority blocks); answer: xml, blocks, check (result of Check before the run), with open also opened and readOnly (true while a simulation runs)
race_ruleswindow (s, 0.1..5), message (true / false), lock (true / false), rules [{zone, first, second, mode ("window" | "order"), window (s, 0.1..30, default 2)}], clear (true)request races of interlock zones (two robots request the same zone within window seconds, default 1 s; Plugin settings > Simulation), message = window with the races at the end of a station simulation, lock = keep the order of the robots at a request race during the run (rule "auto" only in the run, setting Race_Lock_Order; the SPS program is not changed); rules = interlock priority like the SPS block Interlock priority (SPS) for the next simulations, also without the SPS (second empty = every partner, mode "window" = priority within a time window: the second robot waits at most window seconds from its own request, then goes and the order changes – only for requests at almost the same moment; "order" = order in every cycle: the second robot always after the first one, also when the first one is late because of other zones – use it for variant B); a rule for a zone replaces the SPS blocks of this zone (variant B, e.g. {"zone": 4, "first": "R06", "second": "R03", "mode": "order"}), clear removes them. Answer: window, message, lock, rules (API), spsRules (blocks of the SPS program), autoRules (rules from the races of the last run with whereFirst, whereSecond, difference), races [{zone, robotA, whereA, robotB, whereB, count, minDifference, maxDifference, lostA, lostB, waited}] of the last run, log (every use of a rule), proposals (the races of the last run, like race_study), pendingBlocks (number of Interlock priority blocks added for races that wait for the decision at save: keep or remove); without keys: read
race_studyaction ("status" | "add_blocks" | "start" | "stop" | "apply", default "status"), races ([indices], missing = all), cycles (1..20, default 3), choices (["A" | "B" | "none", ...])proposal at the end of a simulation with request races and the simulation of both orders (Request races: proposal and simulation of both orders); the simulation never changes the SPS program by itself. status (also without the license API / CLI): proposals [{race, zone, first, whereFirst, second, whereSecond, difference}] (the races of the last simulation with races - a run without races, e.g. Folge 125 to HOME, keeps them), active, run / runs (while active), result, pendingBlocks; add_blocks = button Add protection blocks: blocks with the order of the simulation for the given races, answer added [texts]; start = button Simulate both orders: for every race 2 runs with cycles cycles (A = order of the simulation, B = robots swapped), the SPS program is restored after every run (license Simulation, active SPS program); stop stops it (result of the finished runs); apply = button Add the chosen blocks: one choice per race of the result, answer added. Result: [{race, zone, first, whereFirst, second, whereSecond, difference, A {avg, min, max, cycles, waitTotal, collisionRisks, interrupted, done}, B {...}, recommended ("A" | "B" | "none")}]. Typical flow of an agent: run → wait for the end (status) → race_study status → start {cycles: 3} → wait until active is false → read result → 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}the windows State lamp... and Console messages... of the tab Simulation, also during a simulation; without keys: read
exportwhat ("times" | "motionTimes"), file (.csv)CSV like Export... of the tab Times and of the motion times of the tab Motion; the collision matrix and Check interlocks: collision_matrix and check_interlocks give the data as JSON
zones_viewshow, overlapOnly, pathColors (true / false), transparency (10..95 %)group Display of the Work Zones tab: show the work zones, only the shared areas, the program path in interlock colors, transparency; without keys: read (also without the license API / CLI)
motion_optionsplanner (true / false), override (%), ptpRamp (s), pathAcc (mm/s², 0 = from the robot archive), oriVel (°/s), approximation, showPath (true / false), defaults (true)tab Motion: real motion (motion planner), its parameters (program override, PTP acceleration time, path acceleration, orientation velocity, approximation of the corners), the real path in the 3D view; defaults = button Default values; refused while a simulation runs; without keys: read
check_interlocksfindings of Check interlocks as data (severity, code, robot, partner, point, message, suggestion; see What RCS checks) and comments: missing comments above points with a request / release (row, robot, point, interlock, release, comment from the template, note)
robotrobot (part of the name, e.g. "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 and pause of one robot also during the simulation of the station (like the SmartPad); run = the program of this robot only (like Run program of the tab Programs) from the point point (the robot moves there first); stop = stops only this robot; goto = the robot stands in this point of the program (the point is selected in the tab Programs), the program is not started – e.g. to check the tool in a weld point (only when the simulation is stopped; answer at); axes like the sliders of the tab Robot Axis (degrees, E1 in mm; only when the simulation is stopped; ms > 0 = smooth motion); answer: robot, running, paused, override, axes and tool {id, name, x, y, z, a, b, c} (the tool on the flange and its mounting position relative to the KUKA flange $FLANGE, like pos of tool_model; missing without a tool), toolKind ("cad" = CAD model of the real tool, "dummy" = dummy tool - an approximation, "none" = no tool) and toolText (the text of the column Tool (3D) of the times report, see Report), flange ([x, y, z] mm, the flange position of the robot in the scene, e.g. as target of view to zoom on the tool), base ([x, y, z] mm, the robot base – robot root or the carriage of the 7th axis – in the scene), archive (the archive folder of the robot) and archiveZip (the ZIP file it was extracted from, when there is one).
tcp = the TCP position like the group Cartesian (TCP) of the Cartesian jog with tool tool and base base (0 = world / robot root; tool and base data from $config.dat); answer tcp {x, y, z, a, b, c, s, t, tool, base} in that base and tcpScene ([x, y, z] mm, the same TCP in the scene). moveTcp = the robot moves its TCP to x, y, z (without a, b, c the current orientation stays) like the − / + buttons of the Cartesian jog: inverse kinematics with S and T of the current position; frame "base" (default) = x, y, z in the base base, "scene" = x, y, z in the scene (e.g. tcpScene or flange of another robot); only when the simulation is not running; error Position not reachable when the IK has no solution or the axes leave their limits; the answer contains tcp / tcpScene of the new position. rebuildPrograms = like Find all programs of the context menu of the robot (Model Browser): the program tree of the robot is built again from the archive, new and changed Folge / UP files are read (e.g. after writing a copy of a UP into the archive); answer programsRebuilt; not while the robot is moving.
E.g. {"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 (part of the name), file (.jt, .gltf, .glb, binary .stl, .stp, .step), pos {x, y, z (mm), a, b, c (°)}, fixture (true), ida tool model from a JT, glTF, STL or STEP file on the flange of a robot (like the robot menu Tool model (JT / STEP / STL / glTF)..., see Tool model from a JT, glTF, STL or STEP file; glTF / STL / STEP in the coordinate system of the JT model, glTF with the colors of the parts, id with the suffix _gltf / _glb / _stl / _stp / _step; a large STEP file can take minutes - use a long timeout): pos = origin of the model relative to the KUKA flange ($FLANGE, KUKA ABC; default 0 = the model is in the flange frame) like the mountLocation of the tool in a Process Simulate study - not the TCP ($TOOL_DATA); the model replaces the tool on the flange and a dummy tool is removed; fixture: true = an additional element on the flange (e.g. tool changer), the tool stays. The model is saved with the simulation (element Docked, attribute jtFile) and the session (attached[].file) and mounted again at the load. Without file and id: only a new position of the tool model already on the robot; id = new position of this model. Not while the simulation runs. Answer: id, robot, tool (true = tool, false = fixture). The same model (the same name, or a name that starts with the other name at an underscore) is never mounted twice on a robot: if it or the tool is already on the robot the command returns an error that names the mounted elements; replace: true replaces it. A robot with a 3D model of its tool has no dummy tool
tool_inforobotthe elements mounted on the robot: tool (id, name, slot, file, pos {x, y, z, a, b, c} relative to the KUKA flange in mm / °, visible, source = study | model | package | dummy, dummy) and fixtures[] (the same fields), toolText
tool_removerobot, id or name, all (true), fixtures (true, with all)removes an element from the robot: a model from a file disappears from the scene, an element of the study stays hidden. With all: true the tool and (fixtures, default true) all fixtures. A removed model is no longer part of the collision checks. Not while the simulation runs
tool_hide / tool_showrobot, idhides or shows a mounted element without removing it; saved with the simulation and the package. A hidden model stays in the collision checks (3D, zones, interlocks); only tool_remove takes it out
signalsrobot (part of the name or "all"), set ({"A76": 1, "E80": 0}), release (true or ["A76", ...]), always ({"M95": 1 | 0 | -1}), read (["E80", ...]), eval ("E80 & E76")signals E / A / F / M like the signal menu of the SmartPad and of the window Signals E / A of the robots: set = set by hand (stays until released), release = back to the simulation (true = all signals of the robot set by hand), always = fixed value in the signals file (only M / F; -1 removes it); answer: values {robot: {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)window Dummy tool of a robot: the given values are saved and the dummy tool is attached (a tool on the flange is detached); remove removes it, allRobots puts the same dummy tool on all robots (without the question); without values: the saved values
insert_interlocksmode ("stop" | "request"), stopText, requestText, releaseText, apply (false), rows ([0, 2, ...])Work Zones > Insert interlocks... without the window: the proposals for every entry into a shared area without interlock (answer rows: row, robot, partner, area, changes, note, ok); apply: true writes the checked rows (default the rows with ok) into the programs in the editor - check and save them, then calculate the work zones again; answer also inserted, changedFiles
savefile (.xml), cell, robots, jt, docked, dummy, sps (true / false), raceBlocks ("keep" | "remove", default "keep")Simulation > Save simulation... without the windows: the settings of the simulation always, the parts of the cell layout as given (default: what the scene contains); raceBlocks = what to do with the not confirmed Interlock priority blocks added for request races (on the user's choice or with race_study), when the SPS program is saved (remove removes them from the SPS program, like Save without the blocks, Simulation file). Answer: file, raceBlocks ("none" | "kept" | "removed"), raceBlocksCount
zone_stepsrobot, program ("folge81")for every point of the program (with the called UPs) from the work zones: robots met in a shared area (contact), motions without interlock (unprotected), interlocks active in the motion and after the point
collision_ignorekey (case of collisionCheck.conflicts), ignore (true / false) – or clear (true), all (true)collision risks that do not pause the simulation any more (Ignore in the window); clear empties the list (Ignore none), all ignores every case of the current simulation (Ignore all); answer: ignored keys
collision_casekey (any key of a case, e.g. from run_data or robust_test risks), action ("points" | "editor")the buttons of a row of the collision risk window: points = both robots to their points (only when the simulation is stopped or paused; in the pause they move smoothly and Continue moves them back; for a contact of the 3D models (Live 3D) both robots move to their axes at the first place of contact of the row (a 3D case keeps up to 4 places more than 400 mm apart, each with its own sphere, time and axes); a repeated call with the same key moves to the next place of the row (after the last one again the first; the key of one contact shows exactly this contact), the red sphere with the same time lies on the touching parts; for a work-zone case to the points of the programs, where the 3D models are checked once in this pose: touching = orange sphere and a console warning, otherwise the closest distance; this result comes about 0.2–6 s later in the console), editor = both programs in the editor at the points; the answer contains point ([x, y, z] mm, the place of the collision – the red sphere – in the scene, when the case has one), e.g. as target of view for a screenshot of the place, place / places (3D rows: the shown place and the number of places, like 2/6 on the button) and shown (the text of the blue line below the table: what the 3D view shows)
collision_reportfile (.pdf or .html), view (true / false, default true), test (true / false)saves the collision cases like the button Save as HTML / PDF of the window: during a robustness test (or test = true) all cases of the test, otherwise the cases of the last simulation; neighbouring points of one place as one case (plugin settings, Collision report)
robust_testaction, see belowRobustness test (Robustness test); every answer contains the status: active, paused, finished, step, totalCycles, collisionRisks, minutes, report, remainingMinutes and estimatedEnd (estimated remaining time and end of the test; missing when not known yet)
insert_commentsrows (numbers "row" of comments, empty = all), texts (own texts of these rows, optional)inserts the missing comments of the last check_interlocks into the programs in the editor without saving (inserted, log)
collision_matrixscope ("checked" = programs checked in Work Zones, default; "archive" = whole robot archives)collision matrix as data: robots with their interlocks (requests, releases, partners, requests without partner), robot pairs (interlocks, state, shared / red m3 when the zones are calculated) and the signal logic errors (robot, point, line, code, message) - no zone calculation needed
anon_studyfile (result; the key is written next to it as <file>.key.json), check, run (true = include Check interlocks / the last simulation), show (true = show the summary window like the button), texts (true = with the interlock comments and long texts), collisions (true = default; false = without the COLLISION findings in checkInterlocks and without simulation.collisionCheck – for a blind test of the AI; GUI: question when saving)anonymised study for an AI assistant: robots R#, programs F#/U#, points P#, program steps with interlock events and contacts, shared volumes, Check interlocks and simulation – without names, coordinates or program text; answer with the files, statistics and leaks (parts of real names found in the file, must be empty). Needs calculated work zones
ai_importtext (answer of the AI with {"changes": [...]}) or file or changes (array), key (key file, default: the last exported one), apply (true = apply the rows with status ok), rows (indices to apply), check3d (true = after applying: work zones from the triangles of the 3D models, answer check3d with ok and the entries without interlock) proposals of the AI agent translated to the robots and programs of the cell: rows with robot, program, point, action, changes in the program, note and status (ok / check / error); with apply: backup of the programs, changes saved, backupDir and log. Then run and ai_compare
ai_comparekey (optional)station cycle, cycle and waiting time of every robot before the changes of the AI and in the last simulation (cycleDelta), expected values of the AI
ai_keepkeep the applied changes of the AI as the new starting point (next round: new anon_study, new key)
ai_restoreoriginal programs from the backup (editor windows of these programs are closed without saving)
ai_chatmessage, newChat (true), stop (true), last (20), anonymous (true / false), warmUp (true / false)the AI Agent window (license API / CLI): message = a message like from the text field (while the agent works it waits in the queue; error without API key or license); message "/reload" loads the knowledge files of the agent again without a request to the model (like Refresh knowledge in the settings, the conversation stays; the reasoning blocks of earlier answers are removed from the history; the transcript gets an entry with the summary); message "/status", "/run folge=125 loops=1", "/view {json}" … = a direct command run at once without the model (also while the agent works; the answer is shown in the chat window, only an error goes into the transcript – from a script call the command directly; /ai_chat is rejected); newChat = New chat; stop = Stop; last = number of the last entries of the chat in the answer (0 = all); anonymous = the anonymous mode on / off (like /anonymous on | off and the check box in the settings; a change starts a new chat). When consentPending is true, the first message was held by the question send the real data? – answer with message "yes" (real data), "anon" (anonymous mode on) or "no" (nothing is sent). warmUp = the setting Load the AI knowledge on startup (warm-up in the background). Answer: busy (the agent works), anonymous (mode on), warmUp (the setting), connectionConfigured (a connection to the model is set: Claude Code found / API key / OpenAI key and address), consentPending (the question YES / ANON / NO waits), transcript [{who (user | agent | tool | error | question), text, time}]
agents_mdauto (true / false), update (true), get (true), section (auto | notes), notes ("text"), file ("path")the briefing file AGENTS.md of the station for the AI agent (see AGENTS.md). auto = the menu item Simulation > Update AGENTS.md automatically (setting RCS_Group/AgentsMd_Auto, default off; status shows agentsMdAuto); update = Update AGENTS.md now (works also with the option off and during a run – then a light update); get = read the file (needs no API license 248); section auto | notes = which block to return or write; notes = replaces the NOTES block (the block between RCS:NOTES BEGIN and RCS:NOTES END is never touched by an update); file = writes a copy of the text to this path (error when there is no AGENTS.md yet). The command supports the anonymous mode like the other commands. Answer: auto, file, exists, chars, updatedAt, text, copy

sim_options – options of the Simulation tab

Without keys the command reads the options. With keys it sets them like a click in the GUI (also stored in the settings). While the simulation runs the options are locked and setting them gives an error. The answer always contains all values and locked (true while the simulation runs).

KeyValueOption in the GUI
stopAtCollisionRisktrue / falseStop the simulation at a collision risk
autoResume0..600 (s)continue after N s (0 = wait for Continue) – after a pause at a collision risk the simulation goes on by itself; also during the run (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 (next to 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) – the robots do not wait for FB PSPS / FB ONL (test of the motions without partners); saved in the simulation file
freeRuntrue / falseFree run - ignore all conditions (SPS, interlocks, WARTE BIS, FB, collisions) – all robots run without waiting for anything (no SPS program, no interlocks, no common start, WARTE BIS and FB PSPS / FB ONL pass, no stop at a collision risk); saved in the simulation file
printAxestrue / falseShow the axis values of every point in the console
toolDockingtrue / falseTool change at the docking points (Auto-Docking)
toolDockingDistancenumber (mm)Max. distance of the tool from the flange (Auto-Docking)
showStatetrue / falseShow the program state above the robots
collisionMaptrue / falseShow collision map
collisionMapPosition0 floor, 1 above, 2 baseposition of the collision map
upCalls"none", "onlyEin", "all"UP calls: Do not execute / Only unconditional calls / All calls
syncWaitstext, e.g. "E23; E80 & E76"Stop at WARTE BIS:
redrawMs16, 50, 100, 250, 1000redraw the scene every ... ms (Live 3D options); can also be changed while the simulation runs
programRules[{kind, value, ms, prAct, mode, overlap}]table Program rules (replaces the whole table). 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 – actions

actionParametersWhat it does
loadfile or plan {...}; services, stops, sps, program (true / false, default true)loads a plan; the parts choose what is taken from the file (service programs, stops in points, SPS program, program); plan = the plan as a JSON object in the command (format of a plan file, e.g. from the AI agent) – it is written to a temporary file and loaded from there; answer: file (this temporary file)
savefile; services, stops, sps, programsaves the plan with these parts
optionsthe keys of a plan file (seed, speed, ignoreCollisions, stopOnCollision, only3d, allUps, repeat, baseline, baselineCycles, timeLimitMin, maxCycles, recoveryTolerance, report, startAt, generator {...}, missingTest {...} or false), autoSave (true / false)sets the options of the tab without a plan file - only the given keys change (generator and missingTest key by key); a plan source is needed: a loaded plan, generator or missingTest. Answer: plan (all options after the change)
find_servicesfills the table of the service programs from the Folge of the robots; answer: services
servicerobot, up, everyCycleadds or changes a row of the service programs; answer: services
stop_pointrobot, point ("UP42/P29" or "P12"), sec (20), everyCycle (1) – or clear (true), remove (row 0..n-1)adds a stop in a point, removes one row (remove, index as in the answer) or empties the table; answer: stops
start / resumestarts the test / continues a saved test
pause / continuepauses / continues the test
stopstops the test
statusactive, paused, finished, round, step, totalCycles, collisionRisks, baselineCycle, seed, stopReason, minutes, report, remainingMinutes and estimatedEnd (estimated remaining time and end of the test; missing when not known yet; after the time limit the rest of the current step, which always runs to its end); in the test of missing interlocks also missing (total, done, collisions); while the test runs also the current step: stepRunning, stepName, stepLoop / stepLoops (loop of the slowest robot / loops of the step), stepMinutes, timeLimitMinutes and timeLimitReached
risksfindings of the whole test so far: robot, where, partner, partnerWhere, count, firstAt, firstStep, kind (zone | 3d | near), distance, parts, png
reportprogress: "<folder>" (optional)writes the report; with progress the report of a saved test from its folder; answer: file

signal_timeline – parameters

Signals timeline of the last station run (license Simulation). The recording is made during every station run (Run on all robots) while record is on. All keys are optional; without record, select, add, remove, showAt, export and window the command only reads (also without the license API / CLI). A signal is named "robot|signal", e.g. "<robot>|E80", "<robot>|A41" or "<robot>|Zone5" (zone taken by the robot). robot, signals, select, add and remove use the real robot names (as in an answer without anonymize).

KeyValueDefaultWhat it doesOption in the GUI
fromnumber [s]0start of the time window (simulation time) for the answer and the export shown time window (wheel / drag)
tonumber [s]-1 (= end of the run)end of the time window; a value after the end of the run is the end of the runshown time window, Whole run
signals["robot|E80", ...]the selectiononly these signals in the answer and the export; empty selection = all signals that changed in the run–
select["robot|E80", ...]– (unchanged)new selection of the signals (replaces it, [] = empty); saved in the simulation filetree of the signals (tick), Clear selection
add["robot|E80", ...]–adds signals to the selectiontick in the tree
remove["robot|E80", ...]–removes signals from the selectionuntick in the tree
recordtrue / falsetrue (unchanged)record the states and the signals in every station run; saved in the simulation filerecord in every station run
whynumber [s]–text why robot waits at this time: state, point, the zone and the robot that holds it since which point, the WARTE BIS / FB PSPS condition, or the robots still working before the Folgenstart (answer why)click in the timeline, text below the chart
robotrobot name– (needed with why)robot for why; error why: "robot" missing–
showAtnumber [s]–all robots in the 3D view to their axes at this time (only when the simulation is paused or stopped); answer shownAtRobots to the cursor, 3D follows the cursor
exportfile .csv / .pdf / .html–saves the time window from..to: CSV (one line per change: time_s;robot;signal;value;where, states and signals, semicolon, UTF-8), PDF or HTML (chart and table of the signal changes, at most 5000 rows); answer exportSave...
anonymizetrue / falsefalserobot names R1..Rn (alphabetical order) in the answer and the exportrobot names as R1..Rn
windowtrue / falsefalseopens the window Signals timelinetab Times > Signals timeline...
datatrue / falsetruefalse = only the summary, without robots, signals and available–

Answer: duration [s] (length of the recording), recording (true while the station runs), samples, from, to, robots [{robot, states [{t0, t1, state, where}]}] – state: motion, process, waits for an interlock zone, WARTE BIS, Warte auf Folgenstart, waits at the end of the loop, waits (condition), not moving; where: program and point –, signals [{robot, signal, at_from (value at from, -1 = not set yet), changes [[t, value], ...]}], available (all recorded signals), selection, record, and when asked 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":"<robot>","data":false}'
template\RCS\AIAgent\rcs_api.ps1 '{"cmd":"signal_timeline","from":30,"to":75,"signals":["<robot>|E80","<robot>|Zone5"],"export":"C:\\temp\\timeline.csv","anonymize":true}'

cycle_reserve – parameters

Cycle time reserve (license 146 Motion optimization). Order of work: a station run (run, best 2 loops or more) → action analyze → action test → the same station run again (it is the control run) → status reads lastTest. When lastTest.ok is false, the proposals of the robots that became slower than the takt of the station are unticked automatically (list lastTest.unticked) – then action test and the run again. status without other keys only reads.

KeyValueDefaultWhat it doesOption in the GUI
actionstatus, analyze, test, cancel, clearstatusanalyze – proposals from the last station run (error when the simulation runs or no cycle was measured); test – the next station run is the control run with the ticked proposals (error without proposals or while the simulation runs); cancel – no control run; clear – deletes the proposals and the last test Analyse last run, Test run with these speeds, No test run
share10..100 [%]80part of the shortest waiting after the motion (over all cycles) that becomes a slower motionuse of the waiting
minOverride10..100 [%]30smallest proposed overrideoverride not below
minGain1..50 [%]5a motion is proposed only when it can be at least this much slower only from
use[{robot, point, use, override}]–changes proposals: use true / false (ticked for the control run), override 1..100 [%]; robot and point exactly as in proposals of an answer without anonymize (the real robot name, not R1..Rn) table: Use (tick), Override [%] (double click)
exportfile .pdf / .html / .csv–report of the proposals and of the last test; CSV: robot;point;motion_s;wait_after_s;wait_kind;override_pct;new_motion_s;energy_rel;use (semicolon, UTF-8); answer exportSave report...
anonymizetrue / falsefalserobot names R1..Rn (alphabetical order) in the answer and the reportrobot names as R1..Rn
windowtrue / falsefalseopens the window Cycle time reservetab Times > Cycle time reserve...

Answer: share, minOverride, minGain, baseTakt [s] (takt of the station in the analysed run, -1 = no analysis), baseCycles {robot: cycle [s]}, testPending (the next station run is the control run), proposals [{robot, point, motion [s], waitAfter [s], waitKind (il = interlock zone, warte = WARTE BIS, fs = Warte auf Folgenstart, end = end of the cycle), override [%], newMotion [s], energy ((override / 100)²), use}], energyIndicator (ticked motions against now, 1 = unchanged), lastTest {takt, baseTakt, difference, ok, robots [{robot, cycle, baseCycle}], unticked [{robot, point}] (only when not ok)}, controllers (text: for which controllers the proposals hold). ok = takt of the control run ≤ baseTakt + max(0.1 s, 0.5 %).

Example (anonymized station): analyze → baseTakt 74.20 s, 5 proposals; control run → "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":"<robot>","point":"<point from 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}'

Every option of the window (UI commands)

Besides the commands above, every control of the simulator is reachable – also in the dialogs, message boxes, settings and context menus – without screenshots: the answer contains the controls as data (type, label, path tab / group / dock, value, items, rows of tables and trees). The list of all menu actions and controls: Command API - reference. Each control gets a number (id) that stays the same while the control exists; a control can also be given by its label (+ window, path, type; first: true takes the first of several matching controls), a menu action by action (menu path). This is the target in the table below. Changes and clicks are executed right after the answer, so a dialog they open does not block the API: it appears in ui_windows (modal first) and status (modal, uiPending).

CommandParametersWhat it does
ui_windowsallopen windows of the simulator (dialogs, message boxes with their text, menus)
ui_listwindow, filter, hidden, labels, allcontrols of the windows; hidden = also on tabs not shown; labels = also texts (QLabel); all = also windows outside the simulator. The 3D view of the main window is in the list as a control of type view3d (objectName view3d, label 3D view); its id is the target of ui_context and ui_key
ui_actionswindow, hiddenmenu and toolbar actions with their path, e.g. Simulation > Load simulation...
ui_getid | label | actionone control with all details (tooltip, all list items)
ui_settarget, value, enter; dockHeight, dockWidth (px); scrollsets a check box, text, number, list item, slider or tab like the user; scroll (without value) scrolls a text field or list: "top", "bottom", a number 0..1 or "find:text" (first place of the text at the top - also in read-only fields like the chat of the AI agent); dockHeight / dockWidth with any control inside a docked panel (e.g. the Send button of the AI Agent window): sets the size of this panel like dragging its edge; answer e.g. {"dock":"AI Agent","dockHeight":665,"dockWidth":1682,"ok":true}; error when the control is not in a docked panel or the panel is floating
ui_clicktarget | actionbutton, menu action, item of an open context menu
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 reads or changes tables and trees (check programs in Work Zones, edit program rules, double click a finding)
ui_contexttarget, row, columnopens the context menu of a control or a row; with the id of the 3D view (control view3d) the context menu of the 3D view, the same as a right click in the view (Fit All, white background, places of collisions, size of the coordinate system, Hide / View Only / View All, paths, point labels, point frames, Display, object types) – the items then with ui_click
ui_close / ui_keywindow, accept / keys, textcloses a window, sends keys; with the id of the 3D view the keys of the view (Qt3D viewer): F Fit All, S fit the selection, 0 / Home default view, 1..6 standard views, arrows rotate by 15° (with Shift: pan), + / - and PgUp / PgDn zoom, Esc ends a forced operation or clears the selection; no key for the perspective (only the menu View or view perspective) and no W. Keys typed in the component tree do not move the view. Note: in the variant with the JT reader ui_key on view3d does not change the view (black box test 2026-10-25)
ui_fileanswer, answers, clearanswers for the next file dialogs (the dialog is not shown); empty = Cancel. Give them only right before the command that opens the file dialog (e.g. ui_click on a menu item). A command that takes the file or folder from its parameters (file, folder: package_save, report, export, save, load, ...) opens no file dialog; since 2026-10-25 the answers still waiting after such a command are discarded (answer uiFileDiscarded: number, warning in the console) – before, they stayed in the queue (pending) and answered a later, unrelated file dialog
ui_shottarget, file, parentimage of a window or control (only when a person should see it); parent: n levels up from the control (a group, or the whole content of a scrolled tab, also the part outside the visible area)
settings_get / settings_setfilter / key, value, remove; group (default RCS_Group)settings of the simulator (RCS_Group), e.g. the macros prepared in the background or the program rules
template\RCS\AIAgent\rcs_api.ps1 '{"cmd":"ui_click","action":"Settings > Configure..."}'
template\RCS\AIAgent\rcs_api.ps1 '{"cmd":"ui_set","label":"Macros prepared in the background","value":"20, 45, 46, 47, 50, 57"}'
template\RCS\AIAgent\rcs_api.ps1 '{"cmd":"ui_click","window":"settings","label":"OK"}'
template\RCS\AIAgent\rcs_api.ps1 '{"cmd":"ui_set","label":"Send","dockHeight":665}'
template\RCS\AIAgent\rcs_api.ps1 '{"cmd":"report_open","open":false}'
template\RCS\AIAgent\rcs_api.ps1 '{"cmd":"model_converter"}'
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 > Load simulation..."}'

Starting the simulator without a click (editor API)

When Settings > AI Agent > Command API of the editor is switched on (or with DRES_API=1) DReS itself listens on \\.\pipe\DReS_API (client AIAgent\dres_api.ps1): license tells whether the license check runs, whether the first reading of the key has finished (ready) and which licenses are available; with "details": true it also gives every license with its type and validity, the key and the knowledge packs of the AI agents (fields: Editor API, window: Help > License info); plugins lists the plugins of the menus; run_plugin {name, wait} opens a plugin as soon as the license key has been read (wait = seconds to wait for the license) and the editor is not busy – while the editor restores the session after the start or opens many files (Open all recent files), the plugin start is delayed and the answer has the field waitingFor (what the editor is doing); open {file, line} opens a file; status shows the active file, an open dialog and busy (true while the editor restores the session or opens files, then busyReason tells what it does; currentSession and, while a session is restored, session – see session) – before loading a station in the simulator check status until busy is false instead of waiting a fixed time (while the editor is busy, load of the simulator reports that the robot configurations are not read now; load the station again when the editor is ready); settings_get / settings_set read and change the settings of the editor and the plugins, e.g. RCS_Group/Automation_Api = true before run_plugin, so that the agent switches on the API of the simulator itself.

plugin_cmd {plugin, command, ...} calls an API command of a plugin of the editor; the other fields are the parameters of the command. Today: Robot Cell Simulator Lite with the commands lite_open, lite_archive, lite_calculate, lite_status, lite_matrix, lite_check, lite_report and lite_image (parameters and results: Robot Cell Simulator Lite - API). The plugin needs its own license (Lite: Robot Cell Simulator basic, 140) and the license API / CLI (248).

Settings > Configure > AI Agent, tab Command API (local path hidden)
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"] starts the editor with a new empty session (without a name or with the given name) instead of the last one and waits until it is ready – details: session.

Client script

template\RCS\AIAgent\rcs_api.ps1 (PowerShell) sends one command and prints the answer; -WaitIdle waits until the simulator is idle (no loading, no preparing, no 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/variant_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"}'

Example: variant of a station

Load the original station, run Folge 81 ten times with the SPS program of the station, save the report; load the changed copy of the programs, run it the same way and save a report with the comparison to the original (compareFile = the .rcsrun.json of the first report). The same sequence for several variants gives a table of cycle times without a single click. The speed of the simulation does not change the measured times (400 % gives the same cycle times as 100 %).

The data of the run (run_data) contain the cycle time of the station, the robot that sets it, the waiting for interlocks per robot and point (zoneWaits), how long each zone is held (zoneHolds) and who holds a zone since when in the first cycle (firstCycleWaits), wait chains (waitChains: the partner holding the zone waits itself for another zone or a condition) and requests of the same zone at nearly the same moment (requestRaces with minDt / maxDt, the time window raceWindow, the rules of the interlock priority raceRules and their use raceRuleLog, the rules from races raceAutoRules) – enough to find the bottleneck and the robot it waits for. After a run, check_interlocks also returns the codes CHAIN and RACE, and LONG as a warning when a partner waited for the zone.


« VeRa - AI agent and voice control | Contents | Command API - reference »